diff --git a/AdminPanel-Vue/dist/assets/css/DynamicToolsManager-_CapYPVW.css b/AdminPanel-Vue/dist/assets/css/DynamicToolsManager-_CapYPVW.css deleted file mode 100644 index 79ac6e17f..000000000 --- a/AdminPanel-Vue/dist/assets/css/DynamicToolsManager-_CapYPVW.css +++ /dev/null @@ -1 +0,0 @@ -.dynamic-tools-page[data-v-ed9c5ad5]{gap:var(--space-4);flex-direction:column;display:flex}.dynamic-tools-header[data-v-ed9c5ad5],.card-header[data-v-ed9c5ad5],.records-header[data-v-ed9c5ad5]{justify-content:space-between;align-items:flex-start;gap:var(--space-3);display:flex}.dynamic-tools-header h2[data-v-ed9c5ad5],.card-header h3[data-v-ed9c5ad5]{margin:0}.header-actions[data-v-ed9c5ad5]{gap:var(--space-2);flex-wrap:wrap;align-items:center;display:flex}.summary-grid[data-v-ed9c5ad5]{gap:var(--space-3);grid-template-columns:repeat(4,minmax(0,1fr));display:grid}.summary-item[data-v-ed9c5ad5],.card[data-v-ed9c5ad5]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--card-bg)}.summary-item[data-v-ed9c5ad5]{padding:var(--space-4)}.summary-label[data-v-ed9c5ad5]{margin-bottom:var(--space-2);color:var(--secondary-text);font-size:var(--font-size-helper);display:block}.summary-item strong[data-v-ed9c5ad5]{font-size:1.6rem}.panel-grid[data-v-ed9c5ad5]{gap:var(--space-4);grid-template-columns:minmax(0,1.15fr) minmax(320px,.85fr);display:grid}.config-card[data-v-ed9c5ad5],.operations-card[data-v-ed9c5ad5],.records-card[data-v-ed9c5ad5]{padding:var(--space-5)}.form-grid[data-v-ed9c5ad5]{gap:var(--space-3);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.field[data-v-ed9c5ad5]{gap:var(--space-2);margin-top:var(--space-4);flex-direction:column;display:flex}.field span[data-v-ed9c5ad5],.switch-row>span[data-v-ed9c5ad5]{color:var(--primary-text);font-weight:600}.field input[data-v-ed9c5ad5],.field textarea[data-v-ed9c5ad5],.records-filter[data-v-ed9c5ad5]{width:100%;padding:var(--space-2) var(--space-3);border:1px solid var(--border-color);border-radius:var(--radius-sm);background:var(--input-bg);color:var(--primary-text)}.field input[data-v-ed9c5ad5]:disabled{cursor:not-allowed;opacity:.55}.field textarea[data-v-ed9c5ad5]{resize:vertical;font-family:Consolas,Monaco,monospace}.field-hint[data-v-ed9c5ad5],.muted[data-v-ed9c5ad5]{color:var(--secondary-text);font-size:var(--font-size-helper)}.switch-row[data-v-ed9c5ad5]{justify-content:space-between;align-items:center;gap:var(--space-3);margin-top:var(--space-4);display:flex}.alias-field[data-v-ed9c5ad5]{margin-top:var(--space-4)}.warning-box[data-v-ed9c5ad5]{align-items:center;gap:var(--space-2);padding:var(--space-3) var(--space-4);border:1px solid var(--warning-color);border-radius:var(--radius-md);color:var(--warning-color);background:color-mix(in srgb, var(--warning-color) 14%, transparent);display:flex}.records-table-wrap[data-v-ed9c5ad5]{margin-top:var(--space-4);overflow-x:auto}.records-table[data-v-ed9c5ad5]{border-collapse:collapse;width:100%;min-width:980px}.records-table th[data-v-ed9c5ad5],.records-table td[data-v-ed9c5ad5]{padding:var(--space-3);border-bottom:1px solid var(--border-color);text-align:left;vertical-align:top}.records-table th[data-v-ed9c5ad5]{color:var(--secondary-text);font-size:var(--font-size-helper);font-weight:600}.records-table td small[data-v-ed9c5ad5]{margin-top:var(--space-1);color:var(--secondary-text);display:block}.brief-cell[data-v-ed9c5ad5]{max-width:360px;color:var(--secondary-text)}.badge[data-v-ed9c5ad5],.tag[data-v-ed9c5ad5],.status-pill[data-v-ed9c5ad5]{border-radius:var(--radius-sm);font-size:var(--font-size-helper);align-items:center;padding:2px 8px;line-height:1.6;display:inline-flex}.badge[data-v-ed9c5ad5]{color:var(--secondary-text);background:var(--input-bg)}.tag[data-v-ed9c5ad5]{color:var(--primary-text);background:var(--hover-bg)}.tag-list[data-v-ed9c5ad5],.status-stack[data-v-ed9c5ad5],.row-actions[data-v-ed9c5ad5]{gap:var(--space-2);flex-wrap:wrap;display:flex}.status-pill--ok[data-v-ed9c5ad5]{color:var(--success-color);background:color-mix(in srgb, var(--success-color) 12%, transparent)}.status-pill--muted[data-v-ed9c5ad5]{color:var(--secondary-text);background:var(--input-bg)}.status-pill--warning[data-v-ed9c5ad5]{color:var(--warning-color);background:color-mix(in srgb, var(--warning-color) 12%, transparent)}.status-pill--danger[data-v-ed9c5ad5]{color:var(--danger-color);background:color-mix(in srgb, var(--danger-color) 12%, transparent)}.status-pill--info[data-v-ed9c5ad5]{color:var(--highlight-text);background:color-mix(in srgb, var(--highlight-text) 12%, transparent)}.floating-status[data-v-ed9c5ad5]{right:var(--space-5);bottom:var(--space-5);z-index:1000;position:fixed}@media (width<=960px){.summary-grid[data-v-ed9c5ad5],.panel-grid[data-v-ed9c5ad5],.form-grid[data-v-ed9c5ad5]{grid-template-columns:1fr}.dynamic-tools-header[data-v-ed9c5ad5],.card-header[data-v-ed9c5ad5],.records-header[data-v-ed9c5ad5]{flex-direction:column}} diff --git a/AdminPanel-Vue/dist/assets/css/DynamicToolsManager-bmlUkVu7.css b/AdminPanel-Vue/dist/assets/css/DynamicToolsManager-bmlUkVu7.css new file mode 100644 index 000000000..a67f983ae --- /dev/null +++ b/AdminPanel-Vue/dist/assets/css/DynamicToolsManager-bmlUkVu7.css @@ -0,0 +1 @@ +.dynamic-tools-page[data-v-5267cc91]{gap:var(--space-4);flex-direction:column;display:flex}.dynamic-tools-header[data-v-5267cc91],.card-header[data-v-5267cc91],.records-header[data-v-5267cc91]{justify-content:space-between;align-items:flex-start;gap:var(--space-3);display:flex}.dynamic-tools-header h2[data-v-5267cc91],.card-header h3[data-v-5267cc91]{margin:0}.header-actions[data-v-5267cc91]{gap:var(--space-2);flex-wrap:wrap;align-items:center;display:flex}.summary-grid[data-v-5267cc91]{gap:var(--space-3);grid-template-columns:repeat(4,minmax(0,1fr));display:grid}.summary-item[data-v-5267cc91],.card[data-v-5267cc91]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--card-bg)}.summary-item[data-v-5267cc91]{padding:var(--space-4)}.summary-label[data-v-5267cc91]{margin-bottom:var(--space-2);color:var(--secondary-text);font-size:var(--font-size-helper);display:block}.summary-item strong[data-v-5267cc91]{font-size:1.6rem}.panel-grid[data-v-5267cc91]{gap:var(--space-4);grid-template-columns:minmax(0,1.15fr) minmax(320px,.85fr);display:grid}.config-card[data-v-5267cc91],.operations-card[data-v-5267cc91],.records-card[data-v-5267cc91]{padding:var(--space-5)}.form-grid[data-v-5267cc91]{gap:var(--space-3);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.field[data-v-5267cc91]{gap:var(--space-2);margin-top:var(--space-4);flex-direction:column;display:flex}.field span[data-v-5267cc91],.switch-row>span[data-v-5267cc91]{color:var(--primary-text);font-weight:600}.field input[data-v-5267cc91],.field textarea[data-v-5267cc91],.records-filter[data-v-5267cc91]{width:100%;padding:var(--space-2) var(--space-3);border:1px solid var(--border-color);border-radius:var(--radius-sm);background:var(--input-bg);color:var(--primary-text)}.field input[data-v-5267cc91]:disabled{cursor:not-allowed;opacity:.55}.field textarea[data-v-5267cc91]{resize:vertical;font-family:Consolas,Monaco,monospace}.field-hint[data-v-5267cc91],.muted[data-v-5267cc91]{color:var(--secondary-text);font-size:var(--font-size-helper)}.switch-row[data-v-5267cc91]{justify-content:space-between;align-items:center;gap:var(--space-3);margin-top:var(--space-4);display:flex}.alias-field[data-v-5267cc91]{margin-top:var(--space-4)}.warning-box[data-v-5267cc91]{align-items:center;gap:var(--space-2);padding:var(--space-3) var(--space-4);border:1px solid var(--warning-color);border-radius:var(--radius-md);color:var(--warning-color);background:color-mix(in srgb, var(--warning-color) 14%, transparent);display:flex}.records-table-wrap[data-v-5267cc91]{margin-top:var(--space-4);overflow-x:auto}.records-table[data-v-5267cc91]{border-collapse:collapse;width:100%;min-width:980px}.records-table th[data-v-5267cc91],.records-table td[data-v-5267cc91]{padding:var(--space-3);border-bottom:1px solid var(--border-color);text-align:left;vertical-align:top}.records-table th[data-v-5267cc91]{color:var(--secondary-text);font-size:var(--font-size-helper);font-weight:600}.records-table td small[data-v-5267cc91]{margin-top:var(--space-1);color:var(--secondary-text);display:block}.brief-cell[data-v-5267cc91]{max-width:360px;color:var(--secondary-text)}.badge[data-v-5267cc91],.tag[data-v-5267cc91],.status-pill[data-v-5267cc91]{border-radius:var(--radius-sm);font-size:var(--font-size-helper);align-items:center;padding:2px 8px;line-height:1.6;display:inline-flex}.badge[data-v-5267cc91]{color:var(--secondary-text);background:var(--input-bg)}.tag[data-v-5267cc91]{color:var(--primary-text);background:var(--hover-bg)}.tag-list[data-v-5267cc91],.status-stack[data-v-5267cc91],.row-actions[data-v-5267cc91]{gap:var(--space-2);flex-wrap:wrap;display:flex}.status-pill--ok[data-v-5267cc91]{color:var(--success-color);background:color-mix(in srgb, var(--success-color) 12%, transparent)}.status-pill--muted[data-v-5267cc91]{color:var(--secondary-text);background:var(--input-bg)}.status-pill--warning[data-v-5267cc91]{color:var(--warning-color);background:color-mix(in srgb, var(--warning-color) 12%, transparent)}.status-pill--danger[data-v-5267cc91]{color:var(--danger-color);background:color-mix(in srgb, var(--danger-color) 12%, transparent)}.status-pill--info[data-v-5267cc91]{color:var(--highlight-text);background:color-mix(in srgb, var(--highlight-text) 12%, transparent)}.floating-status[data-v-5267cc91]{right:var(--space-5);bottom:var(--space-5);z-index:1000;position:fixed}@media (width<=960px){.summary-grid[data-v-5267cc91],.panel-grid[data-v-5267cc91],.form-grid[data-v-5267cc91]{grid-template-columns:1fr}.dynamic-tools-header[data-v-5267cc91],.card-header[data-v-5267cc91],.records-header[data-v-5267cc91]{flex-direction:column}} diff --git a/AdminPanel-Vue/dist/assets/css/SarPromptEditor-C2ZOTWQD.css b/AdminPanel-Vue/dist/assets/css/SarPromptEditor-C2ZOTWQD.css deleted file mode 100644 index e0627fc41..000000000 --- a/AdminPanel-Vue/dist/assets/css/SarPromptEditor-C2ZOTWQD.css +++ /dev/null @@ -1 +0,0 @@ -.sarprompt-page[data-v-4d1d97e2]{flex-direction:column;gap:16px;display:flex}.page-header[data-v-4d1d97e2]{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.header-actions[data-v-4d1d97e2]{gap:var(--space-3);display:flex}.sarprompt-list[data-v-4d1d97e2]{gap:var(--space-4);flex-direction:column;display:flex}.sarprompt-card[data-v-4d1d97e2]{border:1px solid var(--border-color);transition:border-color .2s}.sarprompt-card[data-v-4d1d97e2]:hover{border-color:var(--highlight-text)}.rule-head[data-v-4d1d97e2]{margin-bottom:var(--space-3);align-items:center;gap:10px;display:flex}.rule-title[data-v-4d1d97e2]{background:var(--input-bg);border:1px solid var(--border-color);border-radius:var(--radius-sm);color:var(--primary-text);padding:6px 10px;font-weight:600}.flex-grow[data-v-4d1d97e2]{flex-grow:1}.rule-body[data-v-4d1d97e2]{gap:var(--space-3);grid-template-columns:1fr;display:grid}.form-group[data-v-4d1d97e2]{flex-direction:column;gap:6px;display:flex}.form-group label[data-v-4d1d97e2]{color:var(--secondary-text);font-size:var(--font-size-body)}input[data-v-4d1d97e2],textarea[data-v-4d1d97e2]{border:1px solid var(--border-color);background:var(--input-bg);color:var(--primary-text);border-radius:var(--radius-sm);padding:10px}textarea[data-v-4d1d97e2]{resize:vertical}.editor-actions[data-v-4d1d97e2]{justify-content:flex-end;margin-top:16px;display:flex}.empty-tip[data-v-4d1d97e2]{color:var(--secondary-text);text-align:center;padding:40px}code[data-v-4d1d97e2]{background:var(--secondary-bg);color:var(--highlight-text);border-radius:4px;padding:2px 4px} diff --git a/AdminPanel-Vue/dist/assets/css/SarPromptEditor-CCC5Xs9a.css b/AdminPanel-Vue/dist/assets/css/SarPromptEditor-CCC5Xs9a.css new file mode 100644 index 000000000..20dd186c1 --- /dev/null +++ b/AdminPanel-Vue/dist/assets/css/SarPromptEditor-CCC5Xs9a.css @@ -0,0 +1 @@ +.sarprompt-page[data-v-e3ed89fa]{flex-direction:column;gap:16px;display:flex}.page-header[data-v-e3ed89fa]{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.header-actions[data-v-e3ed89fa]{gap:var(--space-3);display:flex}.sarprompt-list[data-v-e3ed89fa]{gap:var(--space-4);flex-direction:column;display:flex}.sarprompt-card[data-v-e3ed89fa]{border:1px solid var(--border-color);transition:border-color .2s}.sarprompt-card[data-v-e3ed89fa]:hover{border-color:var(--highlight-text)}.rule-head[data-v-e3ed89fa]{margin-bottom:var(--space-3);align-items:center;gap:10px;display:flex}.rule-title[data-v-e3ed89fa]{background:var(--input-bg);border:1px solid var(--border-color);border-radius:var(--radius-sm);color:var(--primary-text);padding:6px 10px;font-weight:600}.flex-grow[data-v-e3ed89fa]{flex-grow:1}.rule-body[data-v-e3ed89fa]{gap:var(--space-3);grid-template-columns:1fr;display:grid}.form-group[data-v-e3ed89fa]{flex-direction:column;gap:6px;display:flex}.form-group label[data-v-e3ed89fa]{color:var(--secondary-text);font-size:var(--font-size-body)}input[data-v-e3ed89fa],textarea[data-v-e3ed89fa]{border:1px solid var(--border-color);background:var(--input-bg);color:var(--primary-text);border-radius:var(--radius-sm);padding:10px}textarea[data-v-e3ed89fa]{resize:vertical}.editor-actions[data-v-e3ed89fa]{justify-content:flex-end;margin-top:16px;display:flex}.empty-tip[data-v-e3ed89fa]{color:var(--secondary-text);text-align:center;padding:40px}code[data-v-e3ed89fa]{background:var(--secondary-bg);color:var(--highlight-text);border-radius:4px;padding:2px 4px} diff --git a/AdminPanel-Vue/dist/assets/css/VcptavernEditor-5MCsg1Ga.css b/AdminPanel-Vue/dist/assets/css/VcptavernEditor-5MCsg1Ga.css new file mode 100644 index 000000000..9cd9f15b6 --- /dev/null +++ b/AdminPanel-Vue/dist/assets/css/VcptavernEditor-5MCsg1Ga.css @@ -0,0 +1 @@ +.vcp-tavern-page[data-v-98bcb6cd]{flex-direction:column;gap:16px;display:flex}.page-header[data-v-98bcb6cd]{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.header-actions[data-v-98bcb6cd]{gap:var(--space-3);display:flex}.preset-toolbar[data-v-98bcb6cd]{grid-template-columns:minmax(110px,auto) minmax(240px,1fr) auto auto auto;align-items:center;gap:10px;display:grid}.preset-toolbar label[data-v-98bcb6cd]{color:var(--secondary-text)}.preset-toolbar select[data-v-98bcb6cd]{width:100%}.editor[data-v-98bcb6cd]{gap:var(--space-4);flex-direction:column;display:flex}.meta-grid[data-v-98bcb6cd]{gap:var(--space-3);grid-template-columns:repeat(2,minmax(220px,1fr));display:grid}.form-group[data-v-98bcb6cd]{flex-direction:column;gap:6px;display:flex}.form-group.full-width[data-v-98bcb6cd]{grid-column:1/-1}.form-group label[data-v-98bcb6cd]{color:var(--secondary-text);font-size:var(--font-size-body)}input[data-v-98bcb6cd],select[data-v-98bcb6cd],textarea[data-v-98bcb6cd]{border:1px solid var(--border-color);background:var(--input-bg);color:var(--primary-text);border-radius:var(--radius-sm);padding:10px}textarea[data-v-98bcb6cd]{resize:vertical}input[data-v-98bcb6cd]:focus-visible,select[data-v-98bcb6cd]:focus-visible,textarea[data-v-98bcb6cd]:focus-visible,button[data-v-98bcb6cd]:focus-visible{outline:2px solid var(--highlight-text);outline-offset:2px}.rules-header[data-v-98bcb6cd]{justify-content:space-between;align-items:center;display:flex}.rules-header h3[data-v-98bcb6cd]{margin:0}.rules-list[data-v-98bcb6cd]{gap:var(--space-3);flex-direction:column;display:flex}.rule-card[data-v-98bcb6cd]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--secondary-bg);gap:var(--space-3);will-change:transform;flex-direction:column;padding:14px;transition:opacity .18s,filter .18s,border-color .2s,box-shadow .2s;display:flex;position:relative}.rule-card[data-v-98bcb6cd]:hover{border-color:var(--highlight-text);box-shadow:var(--shadow-md)}.rule-card--dragging[data-v-98bcb6cd]{opacity:.16;filter:saturate(.88)}.rule-card--drop-before[data-v-98bcb6cd]:before,.rule-card--drop-after[data-v-98bcb6cd]:after{content:"";z-index:2;background:var(--highlight-text);border-radius:999px;height:2px;position:absolute;left:12px;right:12px}.rule-card--drop-before[data-v-98bcb6cd]:before{top:-6px}.rule-card--drop-after[data-v-98bcb6cd]:after{bottom:-6px}.rule-head[data-v-98bcb6cd]{grid-template-columns:auto 1fr auto auto;align-items:center;gap:10px;display:grid}.drag-handle[data-v-98bcb6cd]{border:1px solid var(--border-color);background:var(--input-bg);color:var(--secondary-text);border-radius:var(--radius-sm);cursor:grab;width:44px;height:44px;font-size:var(--font-size-body);user-select:none;touch-action:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.drag-handle[data-v-98bcb6cd]:active{cursor:grabbing}.rule-title[data-v-98bcb6cd]{font-weight:600}.enabled-switch[data-v-98bcb6cd]{align-items:center;gap:var(--space-2);color:var(--secondary-text);display:inline-flex}.rule-body[data-v-98bcb6cd]{gap:var(--space-3);grid-template-columns:repeat(auto-fit,minmax(180px,1fr));display:grid}.editor-actions[data-v-98bcb6cd]{justify-content:flex-end;display:flex}.empty-tip[data-v-98bcb6cd],.empty-rules[data-v-98bcb6cd]{color:var(--secondary-text)}.rule-drag-ghost[data-v-98bcb6cd]{z-index:60;pointer-events:none;will-change:left, top, transform;position:fixed}.rule-drag-ghost-shell[data-v-98bcb6cd]{border:1px solid color-mix(in srgb, var(--highlight-text) 35%, var(--border-color));border-radius:var(--radius-md);background:var(--secondary-bg);min-height:100%;box-shadow:var(--shadow-lg);flex-direction:column;justify-content:center;padding:16px;display:flex}.rule-drag-ghost-title[data-v-98bcb6cd]{font-size:var(--font-size-body);color:var(--primary-text);font-weight:700;line-height:1.3}.rule-drag-ghost-meta[data-v-98bcb6cd]{color:var(--secondary-text);font-size:var(--font-size-helper);text-transform:capitalize;margin-top:6px;line-height:1.45}.drag-sort-move[data-v-98bcb6cd]{transition:transform .22s cubic-bezier(.22,1,.36,1)}.drag-sort-enter-active[data-v-98bcb6cd],.drag-sort-leave-active[data-v-98bcb6cd]{transition:opacity .18s,transform .18s}.drag-sort-enter-from[data-v-98bcb6cd],.drag-sort-leave-to[data-v-98bcb6cd]{opacity:0;transform:translateY(6px)}@media (width<=980px){.preset-toolbar[data-v-98bcb6cd]{grid-template-columns:1fr 1fr}.preset-toolbar label[data-v-98bcb6cd]{grid-column:1/-1}.meta-grid[data-v-98bcb6cd]{grid-template-columns:1fr}.rule-head[data-v-98bcb6cd]{grid-template-columns:auto 1fr}.enabled-switch[data-v-98bcb6cd],.rule-head .btn-danger[data-v-98bcb6cd]{grid-column:1/-1}} diff --git a/AdminPanel-Vue/dist/assets/css/VcptavernEditor-owhvFUwg.css b/AdminPanel-Vue/dist/assets/css/VcptavernEditor-owhvFUwg.css deleted file mode 100644 index 501a7149f..000000000 --- a/AdminPanel-Vue/dist/assets/css/VcptavernEditor-owhvFUwg.css +++ /dev/null @@ -1 +0,0 @@ -.vcp-tavern-page[data-v-b35274ed]{flex-direction:column;gap:16px;display:flex}.page-header[data-v-b35274ed]{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.header-actions[data-v-b35274ed]{gap:var(--space-3);display:flex}.preset-toolbar[data-v-b35274ed]{grid-template-columns:minmax(110px,auto) minmax(240px,1fr) auto auto auto;align-items:center;gap:10px;display:grid}.preset-toolbar label[data-v-b35274ed]{color:var(--secondary-text)}.preset-toolbar select[data-v-b35274ed]{width:100%}.editor[data-v-b35274ed]{gap:var(--space-4);flex-direction:column;display:flex}.meta-grid[data-v-b35274ed]{gap:var(--space-3);grid-template-columns:repeat(2,minmax(220px,1fr));display:grid}.form-group[data-v-b35274ed]{flex-direction:column;gap:6px;display:flex}.form-group.full-width[data-v-b35274ed]{grid-column:1/-1}.form-group label[data-v-b35274ed]{color:var(--secondary-text);font-size:var(--font-size-body)}input[data-v-b35274ed],select[data-v-b35274ed],textarea[data-v-b35274ed]{border:1px solid var(--border-color);background:var(--input-bg);color:var(--primary-text);border-radius:var(--radius-sm);padding:10px}textarea[data-v-b35274ed]{resize:vertical}input[data-v-b35274ed]:focus-visible,select[data-v-b35274ed]:focus-visible,textarea[data-v-b35274ed]:focus-visible,button[data-v-b35274ed]:focus-visible{outline:2px solid var(--highlight-text);outline-offset:2px}.rules-header[data-v-b35274ed]{justify-content:space-between;align-items:center;display:flex}.rules-header h3[data-v-b35274ed]{margin:0}.rules-list[data-v-b35274ed]{gap:var(--space-3);flex-direction:column;display:flex}.rule-card[data-v-b35274ed]{border:1px solid var(--border-color);border-radius:var(--radius-md);background:var(--secondary-bg);gap:var(--space-3);will-change:transform;flex-direction:column;padding:14px;transition:opacity .18s,filter .18s,border-color .2s,box-shadow .2s;display:flex;position:relative}.rule-card[data-v-b35274ed]:hover{border-color:var(--highlight-text);box-shadow:var(--shadow-md)}.rule-card--dragging[data-v-b35274ed]{opacity:.16;filter:saturate(.88)}.rule-card--drop-before[data-v-b35274ed]:before,.rule-card--drop-after[data-v-b35274ed]:after{content:"";z-index:2;background:var(--highlight-text);border-radius:999px;height:2px;position:absolute;left:12px;right:12px}.rule-card--drop-before[data-v-b35274ed]:before{top:-6px}.rule-card--drop-after[data-v-b35274ed]:after{bottom:-6px}.rule-head[data-v-b35274ed]{grid-template-columns:auto 1fr auto auto;align-items:center;gap:10px;display:grid}.drag-handle[data-v-b35274ed]{border:1px solid var(--border-color);background:var(--input-bg);color:var(--secondary-text);border-radius:var(--radius-sm);cursor:grab;width:44px;height:44px;font-size:var(--font-size-body);user-select:none;touch-action:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.drag-handle[data-v-b35274ed]:active{cursor:grabbing}.rule-title[data-v-b35274ed]{font-weight:600}.enabled-switch[data-v-b35274ed]{align-items:center;gap:var(--space-2);color:var(--secondary-text);display:inline-flex}.rule-body[data-v-b35274ed]{gap:var(--space-3);grid-template-columns:repeat(auto-fit,minmax(180px,1fr));display:grid}.editor-actions[data-v-b35274ed]{justify-content:flex-end;display:flex}.empty-tip[data-v-b35274ed],.empty-rules[data-v-b35274ed]{color:var(--secondary-text)}.rule-drag-ghost[data-v-b35274ed]{z-index:60;pointer-events:none;will-change:left, top, transform;position:fixed}.rule-drag-ghost-shell[data-v-b35274ed]{border:1px solid color-mix(in srgb, var(--highlight-text) 35%, var(--border-color));border-radius:var(--radius-md);background:var(--secondary-bg);min-height:100%;box-shadow:var(--shadow-lg);flex-direction:column;justify-content:center;padding:16px;display:flex}.rule-drag-ghost-title[data-v-b35274ed]{font-size:var(--font-size-body);color:var(--primary-text);font-weight:700;line-height:1.3}.rule-drag-ghost-meta[data-v-b35274ed]{color:var(--secondary-text);font-size:var(--font-size-helper);text-transform:capitalize;margin-top:6px;line-height:1.45}.drag-sort-move[data-v-b35274ed]{transition:transform .22s cubic-bezier(.22,1,.36,1)}.drag-sort-enter-active[data-v-b35274ed],.drag-sort-leave-active[data-v-b35274ed]{transition:opacity .18s,transform .18s}.drag-sort-enter-from[data-v-b35274ed],.drag-sort-leave-to[data-v-b35274ed]{opacity:0;transform:translateY(6px)}@media (width<=980px){.preset-toolbar[data-v-b35274ed]{grid-template-columns:1fr 1fr}.preset-toolbar label[data-v-b35274ed]{grid-column:1/-1}.meta-grid[data-v-b35274ed]{grid-template-columns:1fr}.rule-head[data-v-b35274ed]{grid-template-columns:auto 1fr}.enabled-switch[data-v-b35274ed],.rule-head .btn-danger[data-v-b35274ed]{grid-column:1/-1}} diff --git a/AdminPanel-Vue/dist/assets/js/AgentAssistantConfig-CfMTF1yt.js b/AdminPanel-Vue/dist/assets/js/AgentAssistantConfig-BzMHmiof.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/AgentAssistantConfig-CfMTF1yt.js rename to AdminPanel-Vue/dist/assets/js/AgentAssistantConfig-BzMHmiof.js index 42a03dc9f..31728ea01 100644 --- a/AdminPanel-Vue/dist/assets/js/AgentAssistantConfig-CfMTF1yt.js +++ b/AdminPanel-Vue/dist/assets/js/AgentAssistantConfig-BzMHmiof.js @@ -1 +1 @@ -import{Dt as k,N as U,O as L,Q as x,U as y,a as I,at as m,d as V,f as S,h as b,j as E,l as n,n as D,q as G,v as B,wt as X}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as A,s as Y}from"./dashboard-card-news-BnyB_dHU.js";import{D as j,E as C,G as O,P as F}from"./dashboard-card-calendar-CA3-tSpi.js";var w=F("AgentAssistantConfig"),H=0;function h(t={}){return H+=1,{localId:`agent-config-${H}`,name:t.name??"",baseName:t.baseName??"",model:t.model??"",personality:t.personality??"",systemPrompt:t.systemPrompt??"",maxOutputTokens:t.maxOutputTokens??8e3,temperature:t.temperature??.7}}function p(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function R(t){let a=t;for(let r=0;r<5&&!(!p(a)||!("data"in a)||!("success"in a||"message"in a||"code"in a||Object.keys(a).length===1));r+=1)a=a.data;return a}function f(t,a,r=""){for(const s of a){const l=t[s];if(typeof l=="string")return l}return r}function P(t,a,r){for(const s of a){const l=t[s],u=typeof l=="number"?l:typeof l=="string"?Number(l):NaN;if(!Number.isNaN(u))return u}return r}function K(t){const a=p(t)?t:{};return h({name:f(a,["chineseName","name","displayName","assistantName"]),baseName:f(a,["baseName","base","agentBaseName"]),model:f(a,["modelId","model","modelName","model_id"]),personality:f(a,["description","personality","desc"]),systemPrompt:f(a,["systemPrompt","system_prompt","prompt"]),maxOutputTokens:P(a,["maxOutputTokens","max_tokens","maxToken","max_output_tokens"],8e3),temperature:P(a,["temperature","temp"],.7)})}function W(t){try{const a=JSON.parse(t);return Array.isArray(a)?a:[]}catch{return[]}}function $(t){const a=Number(t.get("AGENT_ASSISTANT_MAX_HISTORY_ROUNDS")||t.get("MAX_HISTORY_ROUNDS")||t.get("maxHistoryRounds")||7),r=Number(t.get("AGENT_ASSISTANT_CONTEXT_TTL_HOURS")||t.get("CONTEXT_TTL_HOURS")||t.get("contextTtlHours")||24),s=t.get("AGENT_ALL_SYSTEM_PROMPT")||t.get("GLOBAL_SYSTEM_PROMPT")||t.get("globalSystemPrompt")||"",l=W(t.get("AGENTS")||t.get("AGENT_ASSISTANTS")||t.get("agents")||"[]");if(l.length>0)return{maxHistoryRounds:a,contextTtlHours:r,globalSystemPrompt:s,agents:l};const u=new Set;for(const g of t.keys()){const d=g.match(/^AGENT_([A-Z0-9_]+)_MODEL_ID$/i);d&&d[1]&&u.add(d[1].toUpperCase())}return{maxHistoryRounds:a,contextTtlHours:r,globalSystemPrompt:s,agents:Array.from(u).map(g=>{const d=t.get(`AGENT_${g}_MODEL_ID`)||"",v=t.get(`AGENT_${g}_CHINESE_NAME`)||"";if(!d||!v)return null;const N=Number(t.get(`AGENT_${g}_MAX_OUTPUT_TOKENS`)||8e3),_=Number(t.get(`AGENT_${g}_TEMPERATURE`)||.7);return{baseName:g,chineseName:v,modelId:d,description:t.get(`AGENT_${g}_DESCRIPTION`)||"",systemPrompt:t.get(`AGENT_${g}_SYSTEM_PROMPT`)||"",maxOutputTokens:Number.isNaN(N)?8e3:N,temperature:Number.isNaN(_)?.7:_}}).filter(g=>!!g)}}function M(t){const a=new Map,r=t.split(/\r?\n/);for(const s of r){const l=s.trim();if(!l||l.startsWith("#"))continue;const u=l.indexOf("=");if(u<=0)continue;const g=l.slice(0,u).trim();let d=l.slice(u+1).trim();(d.startsWith('"')&&d.endsWith('"')||d.startsWith("'")&&d.endsWith("'"))&&(d=d.slice(1,-1)),a.set(g,d)}return $(a)}function z(t){if(typeof t=="string")return M(t);if(!p(t))return{};if(typeof t.content=="string")return M(t.content);const a=p(t.config)?t.config:t,r=a.agents??a.assistants??a.agentList??a.agentConfigs;if(!Array.isArray(r)&&Object.keys(a).some(s=>s.startsWith("AGENT_"))){const s=new Map;for(const[l,u]of Object.entries(a))u!=null&&s.set(l,String(u));return $(s)}return{maxHistoryRounds:P(a,["maxHistoryRounds","max_history_rounds","maxHistory","MAX_HISTORY_ROUNDS","AGENT_ASSISTANT_MAX_HISTORY_ROUNDS"],7),contextTtlHours:P(a,["contextTtlHours","context_ttl_hours","contextTtl","CONTEXT_TTL_HOURS","AGENT_ASSISTANT_CONTEXT_TTL_HOURS"],24),globalSystemPrompt:f(a,["globalSystemPrompt","global_system_prompt","GLOBAL_SYSTEM_PROMPT","AGENT_ALL_SYSTEM_PROMPT"]),agents:Array.isArray(r)?r.map(s=>({chineseName:f(p(s)?s:{},["chineseName","name","displayName","assistantName"]),baseName:f(p(s)?s:{},["baseName","base","agentBaseName"]),modelId:f(p(s)?s:{},["modelId","model","modelName","model_id"]),description:f(p(s)?s:{},["description","personality","desc"]),systemPrompt:f(p(s)?s:{},["systemPrompt","system_prompt","prompt"]),maxOutputTokens:P(p(s)?s:{},["maxOutputTokens","max_tokens","maxToken","max_output_tokens"],8e3),temperature:P(p(s)?s:{},["temperature","temp"],.7)})):[]}}function J(t){const a=R(t);if(Array.isArray(a))return a.map(r=>typeof r=="string"?r:p(r)?f(r,["name","agentName","label"]):"").filter(Boolean);if(p(a)){const r=p(a.map)?a.map:a;return Object.keys(r)}return[]}async function q(){try{const t=R(await j.getPlugins({showLoader:!1,loadingKey:"agent-assistant.plugins.load"}));if(!Array.isArray(t))return null;const a=t.find(s=>p(s)?f(s,["name"])==="AgentAssistant"?!0:p(s.manifest)?f(s.manifest,["name"])==="AgentAssistant":!1:!1);if(!p(a))return null;const r=f(a,["configEnvContent","content"])||(p(a.manifest)?f(a.manifest,["configEnvContent","content"]):"");return r?M(r):null}catch(t){const a=t instanceof Error?t.message:String(t);return w.warn("Failed to load AgentAssistant config from /admin_api/plugins:",a),null}}function Q(){const t=x({maxHistory:7,contextTtl:24,globalSystemPrompt:""}),a=x([]),r=x([]),s=x(""),l=x(""),u=x("info");async function g(){try{const i=R(await C.getAgentConfig({},{showLoader:!1,loadingKey:"agent-assistant.config.load"}));let e=z(i);if(p(i)&&!Array.isArray(i.agents)&&("systemPromptTemplate"in i||"defaultMemoryPrompt"in i||Object.keys(i).length===0)){const o=await q();o&&(e=o)}t.value={maxHistory:Number(e.maxHistoryRounds)||7,contextTtl:Number(e.contextTtlHours)||24,globalSystemPrompt:e.globalSystemPrompt||""},a.value=Array.isArray(e.agents)?e.agents.map(o=>K(o)):[],r.value=J(await C.getAgentMap({},{showLoader:!1,loadingKey:"agent-assistant.agent-map.load"}))}catch(i){const e=i instanceof Error?i.message:String(i);w.error("Failed to load config:",e),O(`加载配置失败:${e}`,"error")}}function d(){if(!s.value)return;const i=s.value;a.value.push(h({name:i,baseName:i,model:"",personality:`基于已注册 Agent "${i}" 创建的助手,请补充模型 ID 和更详细的说明。`,systemPrompt:`{{${i}}}`,maxOutputTokens:8e3,temperature:.7})),s.value="",O(`已为 "${i}" 创建一个新的 Agent 助手卡片。`,"success")}function v(){a.value.push(h({name:"新 Agent",baseName:"",model:"",personality:"",systemPrompt:"",maxOutputTokens:8e3,temperature:.7}))}function N(i){confirm("确定要删除这个 Agent 助手配置吗?")&&a.value.splice(i,1)}async function _(){try{for(const e of a.value)if(!(!e.name.trim()&&!e.model.trim())){if(!e.name.trim()){O("有助手未填写名称,请补充后再保存。","error");return}if(!e.model.trim()){O(`助手 "${e.name}" 未填写模型 ID,请补充后再保存。`,"error");return}}const i={maxHistoryRounds:t.value.maxHistory,contextTtlHours:t.value.contextTtl,globalSystemPrompt:t.value.globalSystemPrompt,agents:a.value.filter(e=>e.name.trim()||e.model.trim()).map(e=>({baseName:e.baseName,chineseName:e.name,modelId:e.model,description:e.personality,systemPrompt:e.systemPrompt,maxOutputTokens:e.maxOutputTokens||8e3,temperature:e.temperature||.7}))};await C.saveAgentConfig(i,{loadingKey:"agent-assistant.config.save"}),l.value="AgentAssistant 配置已保存!",u.value="success",O("AgentAssistant 配置已保存!","success")}catch(i){const e=i instanceof Error?i.message:String(i);l.value=`保存失败:${e}`,u.value="error",O(`保存失败:${e}`,"error")}}return L(()=>{g()}),{globalConfig:t,agents:a,availableAgents:r,selectedExistingAgent:s,statusMessage:l,statusType:u,loadConfig:g,addFromExisting:d,addCustomAgent:v,removeAgent:N,saveConfig:_}}var Z={class:"config-section active-section"},ee={class:"aa-config-container"},te={class:"aa-global-settings card"},ae={class:"aa-global-grid"},ne={class:"aa-global-item"},se={class:"aa-global-item"},oe={class:"aa-global-item-full"},re={class:"aa-agents-header"},le={class:"aa-agents-actions"},ie={class:"aa-existing-helper"},me=["value"],ue=["disabled"],de={id:"aa-agent-cards-container",class:"aa-agent-cards-container"},pe={class:"aa-agent-card-header"},ge={class:"aa-agent-name-row"},fe=["onUpdate:modelValue","name"],ce={class:"aa-agent-subtitle"},ye=["onClick"],Ae={class:"aa-agent-card-body"},ve={class:"aa-row"},_e={class:"aa-field-group"},Te=["onUpdate:modelValue","name"],be={class:"aa-field-group"},Ne=["onUpdate:modelValue","name"],xe={class:"aa-field-group aa-field-group-full"},Se=["onUpdate:modelValue","name"],Ee={class:"aa-row aa-advanced-params"},Oe={class:"aa-field-group"},Pe=["onUpdate:modelValue","name"],ke={class:"aa-field-group"},Ce=["onUpdate:modelValue","name"],he={class:"aa-footer-actions"},Me=B({__name:"AgentAssistantConfig",setup(t){const{globalConfig:a,agents:r,availableAgents:s,selectedExistingAgent:l,statusMessage:u,statusType:g,addFromExisting:d,addCustomAgent:v,removeAgent:N,saveConfig:_}=Q();return(i,e)=>(E(),S("section",Z,[e[26]||(e[26]=n("p",{class:"description"},[b(" 这里用于配置 "),n("strong",null,"AgentAssistant"),b(" 插件。你可以: "),n("br"),b("1)从已注册的 Agent 一键创建助手; "),n("br"),b("2)添加完全自定义的助手; "),n("br"),b("3)为每个助手设置模型、性格说明和系统提示词。 "),n("br"),b("所有修改会自动写入 "),n("code",null,"Plugin/AgentAssistant/config.env"),b(" 中,无需手动编辑文本。 ")],-1)),n("div",ee,[n("div",te,[e[13]||(e[13]=n("h3",null,"全局会话设置",-1)),n("div",ae,[n("div",ne,[e[7]||(e[7]=n("label",{for:"aa-max-history"},"每个 Agent 记住的历史轮数",-1)),y(n("input",{type:"number",id:"aa-max-history","onUpdate:modelValue":e[0]||(e[0]=o=>m(a).maxHistory=o),min:"1",max:"50",step:"1",placeholder:"例如:7"},null,512),[[A,m(a).maxHistory,void 0,{number:!0}]]),e[8]||(e[8]=n("p",{class:"aa-hint"}," 数值越大,Agent 能记住的上下文越多,但每次调用消耗的 Token 也会增加。 ",-1))]),n("div",se,[e[9]||(e[9]=n("label",{for:"aa-context-ttl"},"上下文保留时间(小时)",-1)),y(n("input",{type:"number",id:"aa-context-ttl","onUpdate:modelValue":e[1]||(e[1]=o=>m(a).contextTtl=o),min:"1",max:"168",step:"1",placeholder:"例如:24"},null,512),[[A,m(a).contextTtl,void 0,{number:!0}]]),e[10]||(e[10]=n("p",{class:"aa-hint"}," 超过这个时间没有对话时,系统会自动清理旧会话,防止记忆无限增长。 ",-1))])]),n("div",oe,[e[11]||(e[11]=n("label",{for:"aa-global-system-prompt"}," 所有助手共享的补充系统提示词(可选) ",-1)),y(n("textarea",{id:"aa-global-system-prompt","onUpdate:modelValue":e[2]||(e[2]=o=>m(a).globalSystemPrompt=o),rows:"3",placeholder:"例如:统一要求所有助手说话更温柔、避免输出敏感内容、统一使用某种语言等。"},null,512),[[A,m(a).globalSystemPrompt]]),e[12]||(e[12]=n("p",{class:"aa-hint"}," 这里的内容会自动追加到每个助手的系统提示词后面,可用于统一规定整体风格和安全边界。 ",-1))])]),n("div",re,[e[16]||(e[16]=n("h3",null,"已配置的 Agent 助手",-1)),n("div",le,[n("div",ie,[e[15]||(e[15]=n("label",{for:"aa-existing-agent-select"},"从已注册 Agent 创建:",-1)),y(n("select",{id:"aa-existing-agent-select","onUpdate:modelValue":e[3]||(e[3]=o=>G(l)?l.value=o:null)},[e[14]||(e[14]=n("option",{value:""},"选择一个已注册 Agent…",-1)),(E(!0),S(I,null,U(m(s),o=>(E(),S("option",{key:o,value:o},k(o),9,me))),128))],512),[[Y,m(l)]]),n("button",{onClick:e[4]||(e[4]=(...o)=>m(d)&&m(d)(...o)),class:"btn-primary",disabled:!m(l)}," 添加 ",8,ue)]),n("button",{onClick:e[5]||(e[5]=(...o)=>m(v)&&m(v)(...o)),class:"btn-secondary"}," 添加自定义 Agent ")])]),n("div",de,[(E(!0),S(I,null,U(m(r),(o,T)=>(E(),S("div",{key:o.localId,class:"aa-agent-card card"},[n("div",pe,[n("div",ge,[y(n("input",{type:"text","onUpdate:modelValue":c=>o.name=c,name:`agent-name-${T}`,autocomplete:"off",class:"aa-agent-name-input",placeholder:"助手名称(例如:小娜、ResearchBot)"},null,8,fe),[[A,o.name]]),n("span",ce,' 在工具调用中使用:agent_name="'+k(o.name)+'" ',1),n("button",{onClick:c=>m(N)(T),class:"btn-danger btn-sm"}," 删除 ",8,ye)])]),n("div",Ae,[n("div",ve,[n("div",_e,[e[17]||(e[17]=n("label",null,"模型 ID",-1)),y(n("input",{type:"text","onUpdate:modelValue":c=>o.model=c,name:`agent-model-${T}`,autocomplete:"off",placeholder:"例如:gemini-2.5-flash-preview-05-20"},null,8,Te),[[A,o.model]]),e[18]||(e[18]=n("p",{class:"aa-hint"},"必须填写一个后端已配置的模型 ID。",-1))]),n("div",be,[e[19]||(e[19]=n("label",null,"角色说明",-1)),y(n("textarea",{"onUpdate:modelValue":c=>o.personality=c,name:`agent-personality-${T}`,autocomplete:"off",rows:"2",placeholder:"例如:擅长检索与汇总多来源信息的研究助手…"},null,8,Ne),[[A,o.personality]])])]),n("div",xe,[e[20]||(e[20]=n("label",null,"系统提示词",-1)),y(n("textarea",{"onUpdate:modelValue":c=>o.systemPrompt=c,name:`agent-system-prompt-${T}`,autocomplete:"off",rows:"4",placeholder:"可以简单写,也可以详细写。可使用 {{MaidName}}、{{Date}}、{{Time}} 等占位符。如果只想引用某个 Agent.txt 的内容,可以直接写 {{Nova}} 这样的占位符。"},null,8,Se),[[A,o.systemPrompt]]),e[21]||(e[21]=n("p",{class:"aa-hint"},"决定这个助手的性格和能力。",-1))]),n("div",Ee,[n("div",Oe,[e[22]||(e[22]=n("label",null,"最大输出 Token 数",-1)),y(n("input",{type:"number","onUpdate:modelValue":c=>o.maxOutputTokens=c,name:`agent-max-output-tokens-${T}`,autocomplete:"off",min:"1",step:"1",placeholder:"例如:8000"},null,8,Pe),[[A,o.maxOutputTokens,void 0,{number:!0}]]),e[23]||(e[23]=n("p",{class:"aa-hint"}," 控制单次回答的最长长度,一般保持默认即可。 ",-1))]),n("div",ke,[e[24]||(e[24]=n("label",null,"温度(Temperature)",-1)),y(n("input",{type:"number","onUpdate:modelValue":c=>o.temperature=c,name:`agent-temperature-${T}`,autocomplete:"off",step:"0.1",min:"0",max:"2",placeholder:"例如:0.7"},null,8,Ce),[[A,o.temperature,void 0,{number:!0}]]),e[25]||(e[25]=n("p",{class:"aa-hint"},"数值越低越稳健严谨,越高则越有创意。",-1))])])])]))),128))]),n("div",he,[n("button",{onClick:e[6]||(e[6]=(...o)=>m(_)&&m(_)(...o)),class:"btn-primary"}," 保存 AgentAssistant 配置 "),m(u)?(E(),S("span",{key:0,class:X(["status-message",m(g)])},k(m(u)),3)):V("",!0)])])]))}}),He=D(Me,[["__scopeId","data-v-c7c47715"]]);export{He as default}; +import{Dt as k,N as U,O as L,Q as x,U as y,a as I,at as m,d as V,f as S,h as b,j as E,l as n,n as D,q as G,v as B,wt as X}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as A,s as Y}from"./dashboard-card-news-BnyB_dHU.js";import{D as j,E as C,G as O,P as F}from"./dashboard-card-calendar-DWuV34Bn.js";var w=F("AgentAssistantConfig"),H=0;function h(t={}){return H+=1,{localId:`agent-config-${H}`,name:t.name??"",baseName:t.baseName??"",model:t.model??"",personality:t.personality??"",systemPrompt:t.systemPrompt??"",maxOutputTokens:t.maxOutputTokens??8e3,temperature:t.temperature??.7}}function p(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function R(t){let a=t;for(let r=0;r<5&&!(!p(a)||!("data"in a)||!("success"in a||"message"in a||"code"in a||Object.keys(a).length===1));r+=1)a=a.data;return a}function f(t,a,r=""){for(const s of a){const l=t[s];if(typeof l=="string")return l}return r}function P(t,a,r){for(const s of a){const l=t[s],u=typeof l=="number"?l:typeof l=="string"?Number(l):NaN;if(!Number.isNaN(u))return u}return r}function K(t){const a=p(t)?t:{};return h({name:f(a,["chineseName","name","displayName","assistantName"]),baseName:f(a,["baseName","base","agentBaseName"]),model:f(a,["modelId","model","modelName","model_id"]),personality:f(a,["description","personality","desc"]),systemPrompt:f(a,["systemPrompt","system_prompt","prompt"]),maxOutputTokens:P(a,["maxOutputTokens","max_tokens","maxToken","max_output_tokens"],8e3),temperature:P(a,["temperature","temp"],.7)})}function W(t){try{const a=JSON.parse(t);return Array.isArray(a)?a:[]}catch{return[]}}function $(t){const a=Number(t.get("AGENT_ASSISTANT_MAX_HISTORY_ROUNDS")||t.get("MAX_HISTORY_ROUNDS")||t.get("maxHistoryRounds")||7),r=Number(t.get("AGENT_ASSISTANT_CONTEXT_TTL_HOURS")||t.get("CONTEXT_TTL_HOURS")||t.get("contextTtlHours")||24),s=t.get("AGENT_ALL_SYSTEM_PROMPT")||t.get("GLOBAL_SYSTEM_PROMPT")||t.get("globalSystemPrompt")||"",l=W(t.get("AGENTS")||t.get("AGENT_ASSISTANTS")||t.get("agents")||"[]");if(l.length>0)return{maxHistoryRounds:a,contextTtlHours:r,globalSystemPrompt:s,agents:l};const u=new Set;for(const g of t.keys()){const d=g.match(/^AGENT_([A-Z0-9_]+)_MODEL_ID$/i);d&&d[1]&&u.add(d[1].toUpperCase())}return{maxHistoryRounds:a,contextTtlHours:r,globalSystemPrompt:s,agents:Array.from(u).map(g=>{const d=t.get(`AGENT_${g}_MODEL_ID`)||"",v=t.get(`AGENT_${g}_CHINESE_NAME`)||"";if(!d||!v)return null;const N=Number(t.get(`AGENT_${g}_MAX_OUTPUT_TOKENS`)||8e3),_=Number(t.get(`AGENT_${g}_TEMPERATURE`)||.7);return{baseName:g,chineseName:v,modelId:d,description:t.get(`AGENT_${g}_DESCRIPTION`)||"",systemPrompt:t.get(`AGENT_${g}_SYSTEM_PROMPT`)||"",maxOutputTokens:Number.isNaN(N)?8e3:N,temperature:Number.isNaN(_)?.7:_}}).filter(g=>!!g)}}function M(t){const a=new Map,r=t.split(/\r?\n/);for(const s of r){const l=s.trim();if(!l||l.startsWith("#"))continue;const u=l.indexOf("=");if(u<=0)continue;const g=l.slice(0,u).trim();let d=l.slice(u+1).trim();(d.startsWith('"')&&d.endsWith('"')||d.startsWith("'")&&d.endsWith("'"))&&(d=d.slice(1,-1)),a.set(g,d)}return $(a)}function z(t){if(typeof t=="string")return M(t);if(!p(t))return{};if(typeof t.content=="string")return M(t.content);const a=p(t.config)?t.config:t,r=a.agents??a.assistants??a.agentList??a.agentConfigs;if(!Array.isArray(r)&&Object.keys(a).some(s=>s.startsWith("AGENT_"))){const s=new Map;for(const[l,u]of Object.entries(a))u!=null&&s.set(l,String(u));return $(s)}return{maxHistoryRounds:P(a,["maxHistoryRounds","max_history_rounds","maxHistory","MAX_HISTORY_ROUNDS","AGENT_ASSISTANT_MAX_HISTORY_ROUNDS"],7),contextTtlHours:P(a,["contextTtlHours","context_ttl_hours","contextTtl","CONTEXT_TTL_HOURS","AGENT_ASSISTANT_CONTEXT_TTL_HOURS"],24),globalSystemPrompt:f(a,["globalSystemPrompt","global_system_prompt","GLOBAL_SYSTEM_PROMPT","AGENT_ALL_SYSTEM_PROMPT"]),agents:Array.isArray(r)?r.map(s=>({chineseName:f(p(s)?s:{},["chineseName","name","displayName","assistantName"]),baseName:f(p(s)?s:{},["baseName","base","agentBaseName"]),modelId:f(p(s)?s:{},["modelId","model","modelName","model_id"]),description:f(p(s)?s:{},["description","personality","desc"]),systemPrompt:f(p(s)?s:{},["systemPrompt","system_prompt","prompt"]),maxOutputTokens:P(p(s)?s:{},["maxOutputTokens","max_tokens","maxToken","max_output_tokens"],8e3),temperature:P(p(s)?s:{},["temperature","temp"],.7)})):[]}}function J(t){const a=R(t);if(Array.isArray(a))return a.map(r=>typeof r=="string"?r:p(r)?f(r,["name","agentName","label"]):"").filter(Boolean);if(p(a)){const r=p(a.map)?a.map:a;return Object.keys(r)}return[]}async function q(){try{const t=R(await j.getPlugins({showLoader:!1,loadingKey:"agent-assistant.plugins.load"}));if(!Array.isArray(t))return null;const a=t.find(s=>p(s)?f(s,["name"])==="AgentAssistant"?!0:p(s.manifest)?f(s.manifest,["name"])==="AgentAssistant":!1:!1);if(!p(a))return null;const r=f(a,["configEnvContent","content"])||(p(a.manifest)?f(a.manifest,["configEnvContent","content"]):"");return r?M(r):null}catch(t){const a=t instanceof Error?t.message:String(t);return w.warn("Failed to load AgentAssistant config from /admin_api/plugins:",a),null}}function Q(){const t=x({maxHistory:7,contextTtl:24,globalSystemPrompt:""}),a=x([]),r=x([]),s=x(""),l=x(""),u=x("info");async function g(){try{const i=R(await C.getAgentConfig({},{showLoader:!1,loadingKey:"agent-assistant.config.load"}));let e=z(i);if(p(i)&&!Array.isArray(i.agents)&&("systemPromptTemplate"in i||"defaultMemoryPrompt"in i||Object.keys(i).length===0)){const o=await q();o&&(e=o)}t.value={maxHistory:Number(e.maxHistoryRounds)||7,contextTtl:Number(e.contextTtlHours)||24,globalSystemPrompt:e.globalSystemPrompt||""},a.value=Array.isArray(e.agents)?e.agents.map(o=>K(o)):[],r.value=J(await C.getAgentMap({},{showLoader:!1,loadingKey:"agent-assistant.agent-map.load"}))}catch(i){const e=i instanceof Error?i.message:String(i);w.error("Failed to load config:",e),O(`加载配置失败:${e}`,"error")}}function d(){if(!s.value)return;const i=s.value;a.value.push(h({name:i,baseName:i,model:"",personality:`基于已注册 Agent "${i}" 创建的助手,请补充模型 ID 和更详细的说明。`,systemPrompt:`{{${i}}}`,maxOutputTokens:8e3,temperature:.7})),s.value="",O(`已为 "${i}" 创建一个新的 Agent 助手卡片。`,"success")}function v(){a.value.push(h({name:"新 Agent",baseName:"",model:"",personality:"",systemPrompt:"",maxOutputTokens:8e3,temperature:.7}))}function N(i){confirm("确定要删除这个 Agent 助手配置吗?")&&a.value.splice(i,1)}async function _(){try{for(const e of a.value)if(!(!e.name.trim()&&!e.model.trim())){if(!e.name.trim()){O("有助手未填写名称,请补充后再保存。","error");return}if(!e.model.trim()){O(`助手 "${e.name}" 未填写模型 ID,请补充后再保存。`,"error");return}}const i={maxHistoryRounds:t.value.maxHistory,contextTtlHours:t.value.contextTtl,globalSystemPrompt:t.value.globalSystemPrompt,agents:a.value.filter(e=>e.name.trim()||e.model.trim()).map(e=>({baseName:e.baseName,chineseName:e.name,modelId:e.model,description:e.personality,systemPrompt:e.systemPrompt,maxOutputTokens:e.maxOutputTokens||8e3,temperature:e.temperature||.7}))};await C.saveAgentConfig(i,{loadingKey:"agent-assistant.config.save"}),l.value="AgentAssistant 配置已保存!",u.value="success",O("AgentAssistant 配置已保存!","success")}catch(i){const e=i instanceof Error?i.message:String(i);l.value=`保存失败:${e}`,u.value="error",O(`保存失败:${e}`,"error")}}return L(()=>{g()}),{globalConfig:t,agents:a,availableAgents:r,selectedExistingAgent:s,statusMessage:l,statusType:u,loadConfig:g,addFromExisting:d,addCustomAgent:v,removeAgent:N,saveConfig:_}}var Z={class:"config-section active-section"},ee={class:"aa-config-container"},te={class:"aa-global-settings card"},ae={class:"aa-global-grid"},ne={class:"aa-global-item"},se={class:"aa-global-item"},oe={class:"aa-global-item-full"},re={class:"aa-agents-header"},le={class:"aa-agents-actions"},ie={class:"aa-existing-helper"},me=["value"],ue=["disabled"],de={id:"aa-agent-cards-container",class:"aa-agent-cards-container"},pe={class:"aa-agent-card-header"},ge={class:"aa-agent-name-row"},fe=["onUpdate:modelValue","name"],ce={class:"aa-agent-subtitle"},ye=["onClick"],Ae={class:"aa-agent-card-body"},ve={class:"aa-row"},_e={class:"aa-field-group"},Te=["onUpdate:modelValue","name"],be={class:"aa-field-group"},Ne=["onUpdate:modelValue","name"],xe={class:"aa-field-group aa-field-group-full"},Se=["onUpdate:modelValue","name"],Ee={class:"aa-row aa-advanced-params"},Oe={class:"aa-field-group"},Pe=["onUpdate:modelValue","name"],ke={class:"aa-field-group"},Ce=["onUpdate:modelValue","name"],he={class:"aa-footer-actions"},Me=B({__name:"AgentAssistantConfig",setup(t){const{globalConfig:a,agents:r,availableAgents:s,selectedExistingAgent:l,statusMessage:u,statusType:g,addFromExisting:d,addCustomAgent:v,removeAgent:N,saveConfig:_}=Q();return(i,e)=>(E(),S("section",Z,[e[26]||(e[26]=n("p",{class:"description"},[b(" 这里用于配置 "),n("strong",null,"AgentAssistant"),b(" 插件。你可以: "),n("br"),b("1)从已注册的 Agent 一键创建助手; "),n("br"),b("2)添加完全自定义的助手; "),n("br"),b("3)为每个助手设置模型、性格说明和系统提示词。 "),n("br"),b("所有修改会自动写入 "),n("code",null,"Plugin/AgentAssistant/config.env"),b(" 中,无需手动编辑文本。 ")],-1)),n("div",ee,[n("div",te,[e[13]||(e[13]=n("h3",null,"全局会话设置",-1)),n("div",ae,[n("div",ne,[e[7]||(e[7]=n("label",{for:"aa-max-history"},"每个 Agent 记住的历史轮数",-1)),y(n("input",{type:"number",id:"aa-max-history","onUpdate:modelValue":e[0]||(e[0]=o=>m(a).maxHistory=o),min:"1",max:"50",step:"1",placeholder:"例如:7"},null,512),[[A,m(a).maxHistory,void 0,{number:!0}]]),e[8]||(e[8]=n("p",{class:"aa-hint"}," 数值越大,Agent 能记住的上下文越多,但每次调用消耗的 Token 也会增加。 ",-1))]),n("div",se,[e[9]||(e[9]=n("label",{for:"aa-context-ttl"},"上下文保留时间(小时)",-1)),y(n("input",{type:"number",id:"aa-context-ttl","onUpdate:modelValue":e[1]||(e[1]=o=>m(a).contextTtl=o),min:"1",max:"168",step:"1",placeholder:"例如:24"},null,512),[[A,m(a).contextTtl,void 0,{number:!0}]]),e[10]||(e[10]=n("p",{class:"aa-hint"}," 超过这个时间没有对话时,系统会自动清理旧会话,防止记忆无限增长。 ",-1))])]),n("div",oe,[e[11]||(e[11]=n("label",{for:"aa-global-system-prompt"}," 所有助手共享的补充系统提示词(可选) ",-1)),y(n("textarea",{id:"aa-global-system-prompt","onUpdate:modelValue":e[2]||(e[2]=o=>m(a).globalSystemPrompt=o),rows:"3",placeholder:"例如:统一要求所有助手说话更温柔、避免输出敏感内容、统一使用某种语言等。"},null,512),[[A,m(a).globalSystemPrompt]]),e[12]||(e[12]=n("p",{class:"aa-hint"}," 这里的内容会自动追加到每个助手的系统提示词后面,可用于统一规定整体风格和安全边界。 ",-1))])]),n("div",re,[e[16]||(e[16]=n("h3",null,"已配置的 Agent 助手",-1)),n("div",le,[n("div",ie,[e[15]||(e[15]=n("label",{for:"aa-existing-agent-select"},"从已注册 Agent 创建:",-1)),y(n("select",{id:"aa-existing-agent-select","onUpdate:modelValue":e[3]||(e[3]=o=>G(l)?l.value=o:null)},[e[14]||(e[14]=n("option",{value:""},"选择一个已注册 Agent…",-1)),(E(!0),S(I,null,U(m(s),o=>(E(),S("option",{key:o,value:o},k(o),9,me))),128))],512),[[Y,m(l)]]),n("button",{onClick:e[4]||(e[4]=(...o)=>m(d)&&m(d)(...o)),class:"btn-primary",disabled:!m(l)}," 添加 ",8,ue)]),n("button",{onClick:e[5]||(e[5]=(...o)=>m(v)&&m(v)(...o)),class:"btn-secondary"}," 添加自定义 Agent ")])]),n("div",de,[(E(!0),S(I,null,U(m(r),(o,T)=>(E(),S("div",{key:o.localId,class:"aa-agent-card card"},[n("div",pe,[n("div",ge,[y(n("input",{type:"text","onUpdate:modelValue":c=>o.name=c,name:`agent-name-${T}`,autocomplete:"off",class:"aa-agent-name-input",placeholder:"助手名称(例如:小娜、ResearchBot)"},null,8,fe),[[A,o.name]]),n("span",ce,' 在工具调用中使用:agent_name="'+k(o.name)+'" ',1),n("button",{onClick:c=>m(N)(T),class:"btn-danger btn-sm"}," 删除 ",8,ye)])]),n("div",Ae,[n("div",ve,[n("div",_e,[e[17]||(e[17]=n("label",null,"模型 ID",-1)),y(n("input",{type:"text","onUpdate:modelValue":c=>o.model=c,name:`agent-model-${T}`,autocomplete:"off",placeholder:"例如:gemini-2.5-flash-preview-05-20"},null,8,Te),[[A,o.model]]),e[18]||(e[18]=n("p",{class:"aa-hint"},"必须填写一个后端已配置的模型 ID。",-1))]),n("div",be,[e[19]||(e[19]=n("label",null,"角色说明",-1)),y(n("textarea",{"onUpdate:modelValue":c=>o.personality=c,name:`agent-personality-${T}`,autocomplete:"off",rows:"2",placeholder:"例如:擅长检索与汇总多来源信息的研究助手…"},null,8,Ne),[[A,o.personality]])])]),n("div",xe,[e[20]||(e[20]=n("label",null,"系统提示词",-1)),y(n("textarea",{"onUpdate:modelValue":c=>o.systemPrompt=c,name:`agent-system-prompt-${T}`,autocomplete:"off",rows:"4",placeholder:"可以简单写,也可以详细写。可使用 {{MaidName}}、{{Date}}、{{Time}} 等占位符。如果只想引用某个 Agent.txt 的内容,可以直接写 {{Nova}} 这样的占位符。"},null,8,Se),[[A,o.systemPrompt]]),e[21]||(e[21]=n("p",{class:"aa-hint"},"决定这个助手的性格和能力。",-1))]),n("div",Ee,[n("div",Oe,[e[22]||(e[22]=n("label",null,"最大输出 Token 数",-1)),y(n("input",{type:"number","onUpdate:modelValue":c=>o.maxOutputTokens=c,name:`agent-max-output-tokens-${T}`,autocomplete:"off",min:"1",step:"1",placeholder:"例如:8000"},null,8,Pe),[[A,o.maxOutputTokens,void 0,{number:!0}]]),e[23]||(e[23]=n("p",{class:"aa-hint"}," 控制单次回答的最长长度,一般保持默认即可。 ",-1))]),n("div",ke,[e[24]||(e[24]=n("label",null,"温度(Temperature)",-1)),y(n("input",{type:"number","onUpdate:modelValue":c=>o.temperature=c,name:`agent-temperature-${T}`,autocomplete:"off",step:"0.1",min:"0",max:"2",placeholder:"例如:0.7"},null,8,Ce),[[A,o.temperature,void 0,{number:!0}]]),e[25]||(e[25]=n("p",{class:"aa-hint"},"数值越低越稳健严谨,越高则越有创意。",-1))])])])]))),128))]),n("div",he,[n("button",{onClick:e[6]||(e[6]=(...o)=>m(_)&&m(_)(...o)),class:"btn-primary"}," 保存 AgentAssistant 配置 "),m(u)?(E(),S("span",{key:0,class:X(["status-message",m(g)])},k(m(u)),3)):V("",!0)])])]))}}),He=D(Me,[["__scopeId","data-v-c7c47715"]]);export{He as default}; diff --git a/AdminPanel-Vue/dist/assets/js/AgentFilesEditor-CpGFDjqr.js b/AdminPanel-Vue/dist/assets/js/AgentFilesEditor-DBKe1qSu.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/AgentFilesEditor-CpGFDjqr.js rename to AdminPanel-Vue/dist/assets/js/AgentFilesEditor-DBKe1qSu.js index 122e1d7d1..832c2ce4f 100644 --- a/AdminPanel-Vue/dist/assets/js/AgentFilesEditor-CpGFDjqr.js +++ b/AdminPanel-Vue/dist/assets/js/AgentFilesEditor-DBKe1qSu.js @@ -1 +1 @@ -import{Dt as d,H as L,N as j,O as ne,Q as i,U as N,a as W,c as le,d as x,f as r,g as ie,h as c,j as u,l as s,n as oe,v as re,wt as w}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as P}from"./dashboard-card-news-BnyB_dHU.js";import{E as h,G as o,P as ue}from"./dashboard-card-calendar-CA3-tSpi.js";import{t as de}from"./DualPaneEditor-D9nB9raE.js";var ce={class:"config-section active-section agent-files-page"},fe={class:"header-actions"},ge=["disabled"],ve={class:"agent-map-list"},me={class:"agent-entry-row"},pe=["onUpdate:modelValue"],be={class:"agent-entry-row"},Ae=["onUpdate:modelValue","disabled","onBlur"],he={key:0,class:"loading-hint"},_e={class:"agent-entry-actions"},ye=["onClick","disabled"],Fe=["onClick","disabled"],we=["onClick"],Ee={key:0,class:"empty-state"},ke={class:"agent-file-editor"},Ce={class:"agent-editor-controls"},$e={class:"editing-file-display"},xe={class:"editor-actions"},Me=["disabled"],Se=["value"],G="agent-file-options",ze=re({__name:"AgentFilesEditor",setup(Te){const V=ue("AgentFilesEditor");let D=0;function B(t={}){return D+=1,{localId:`agent-map-draft-${D}`,name:t.name??"",file:t.file??""}}const m=i([]),E=i([]),k=i(!1),C=i(""),M=i("info"),_=i(""),$=i(""),y=i(""),S=i("info"),f=i(!1),g=i(!1),H=/\.(txt|md)$/i,R=/^[A-Za-z]:\//,q=le(()=>{const t=new Map;return E.value.forEach(e=>{t.set(e.toLowerCase(),e)}),t});function F(t){return t.trim().replace(/\\/g,"/")}function v(t){const e=F(t);return e?e.startsWith("/")||R.test(e)||e.includes("\0")?!0:e.split("/").some(a=>{const n=a.trim();return n.length===0||n==="."||n===".."}):!1}function p(t){const e=F(t);if(!e||v(e))return"";const a=e.split("/").map(n=>n.trim()).filter(n=>n.length>0).join("/");return a?H.test(a)?a:`${a}.txt`:""}function b(t){const e=p(t);return e?q.value.get(e.toLowerCase())??null:null}function K(t){return b(t)??p(t)}function z(t){const e=F(t.file);if(!e)return t.file="","";if(v(e))return t.file=e,e;const a=p(e);return t.file=b(a)??a,t.file}function T(t){return b(t)!==null}function Q(t){const e=p(t);return e!==""&&!v(t)&&b(e)===null}function X(t){const e=t.lastIndexOf("/");return e<0?{fileName:t}:{fileName:t.slice(e+1),folderPath:t.slice(0,e)}}function Z(t){const e=new Map;return t.forEach(a=>{const n=F(String(a));if(!n)return;const l=n.toLowerCase();e.has(l)||e.set(l,n)}),[...e.values()].sort((a,n)=>a.localeCompare(n,void 0,{sensitivity:"base"}))}function J(){const t={},e=new Set;for(const a of m.value){const n=a.name.trim(),l=z(a);if(!n&&!l)continue;if(!n||!l)throw new Error("Agent 名称和关联文件都需要填写。");if(v(l))throw new Error(`文件路径格式不正确: ${a.file}`);const A=b(l);if(!A)throw new Error(`文件 ${l} 还不存在,请先点击“创建并绑定”或选择已有文件。`);if(e.has(n))throw new Error(`Agent 名称重复: ${n}`);e.add(n),t[n]=A}return t}async function O(){k.value=!0;try{E.value=Z(await h.getAgentFiles({},{showLoader:!1,loadingKey:"agent-files.available-files.load"}))}catch(t){const e=t instanceof Error?t.message:String(t);V.error("Failed to load available files:",e),o(`Failed to load available files: ${e}`,"error"),E.value=[]}finally{k.value=!1}}async function Y(){try{const t=await h.getAgentMap({},{showLoader:!1,loadingKey:"agent-files.map.load"});t&&typeof t=="object"&&(m.value=Object.entries(t).map(([e,a])=>B({name:e,file:String(a)})))}catch(t){const e=t instanceof Error?t.message:String(t);V.error("Failed to load agent map:",e),o(`Failed to load agent map: ${e}`,"error")}}async function ee(){if(!f.value){f.value=!0;try{const t=J();await h.saveAgentMap(t,{loadingKey:"agent-files.map.save"}),C.value="Agent 映射已保存。",M.value="success",o("Agent 映射已保存。","success")}catch(t){const e=t instanceof Error?t.message:String(t);C.value=`保存 Agent 映射失败: ${e}`,M.value="error",o(`保存 Agent 映射失败: ${e}`,"error")}finally{f.value=!1}}}function U(){m.value.push(B())}function te(t){confirm("确定删除这条 Agent 映射吗?")&&m.value.splice(t,1)}async function ae(t){const e=F(t.file);if(!e){o("请先输入要创建的 Agent 文件名。","info");return}if(v(e)){o("文件名不能包含绝对路径、空目录、. 或 ..。","error");return}const a=p(e);t.file=a;const n=b(a);if(n){t.file=n,o(`已绑定已有文件 ${n}。`,"success"),await I(n);return}const l=X(a);try{await h.createAgentFile(l.fileName,l.folderPath,{loadingKey:"agent-files.file.create"}),await O(),t.file=z(t),o(`已创建并绑定文件 ${t.file}。`,"success"),await I(t.file)}catch(A){o(`创建文件失败: ${A instanceof Error?A.message:String(A)}`,"error")}}async function I(t){if(t){_.value=t,y.value="";try{$.value=await h.getAgentFileContent(t,{},{showLoader:!1,loadingKey:"agent-files.file.load"})}catch(e){o(`Failed to load file: ${e instanceof Error?e.message:String(e)}`,"error")}}}async function se(){if(!(!_.value||g.value)){g.value=!0;try{await h.saveAgentFile(_.value,$.value,{loadingKey:"agent-files.file.save"}),y.value="文件已保存。",S.value="success",o("文件已保存。","success")}catch(t){y.value=`保存文件失败: ${t instanceof Error?t.message:String(t)}`,S.value="error"}finally{g.value=!1}}}return ne(()=>{Promise.all([O(),Y()])}),(t,e)=>(u(),r("section",ce,[e[11]||(e[11]=s("p",{class:"description"}," 管理 Agent 的定义名称与对应的 `.txt` / `.md` 文件。你可以在这里添加、删除和修改 Agent 映射,并直接编辑关联的文本文件。 ",-1)),ie(de,{"left-title":"Agent 映射表","right-title":"Agent 文件内容","initial-left-width":450,"min-left-width":350,"max-left-width":600},{"left-actions":L(()=>[s("div",fe,[s("button",{onClick:U,class:"btn-primary btn-sm btn-sm-touch","aria-label":"添加新 Agent",title:"添加新 Agent"},[...e[1]||(e[1]=[s("span",{class:"material-symbols-outlined","aria-hidden":"true"},"add",-1),c(" 添加 ",-1)])]),s("button",{type:"button",onClick:ee,class:"btn-primary btn-sm btn-sm-touch",disabled:f.value,"aria-label":"保存映射表",title:"保存映射表"},[s("span",{class:w(["material-symbols-outlined",{spinning:f.value}]),"aria-hidden":"true"},d(f.value?"sync":"save"),3),c(" "+d(f.value?"保存中…":"保存"),1)],8,ge)])]),"left-content":L(()=>[s("div",ve,[(u(!0),r(W,null,j(m.value,(a,n)=>(u(),r("div",{key:a.localId,class:"agent-map-entry card"},[s("div",me,[e[2]||(e[2]=s("label",null,"Agent 名称:",-1)),N(s("input",{"onUpdate:modelValue":l=>a.name=l,type:"text",placeholder:"输入 Agent 名称"},null,8,pe),[[P,a.name]])]),s("div",be,[e[4]||(e[4]=s("label",null,"关联文件:",-1)),N(s("input",{"onUpdate:modelValue":l=>a.file=l,list:G,type:"text",class:"file-input",disabled:k.value,placeholder:"输入新文件名,或选择已有文件",onBlur:l=>z(a)},null,40,Ae),[[P,a.file]]),k.value?(u(),r("span",he,[...e[3]||(e[3]=[s("span",{class:"material-symbols-outlined spinning"},"sync",-1),c(" 加载文件列表中... ",-1)])])):a.file?(u(),r("span",{key:1,class:w(["file-hint",v(a.file)?"error":T(a.file)?"success":"info"])},d(v(a.file)?"文件名不能包含绝对路径、空目录、. 或 ..":T(a.file)?`将绑定已有文件:${K(a.file)}`:`点击“创建并绑定”后会新建:${p(a.file)}`),3)):x("",!0)]),s("div",_e,[s("button",{onClick:l=>ae(a),disabled:!Q(a.file),class:"btn-primary btn-sm btn-sm-touch"},[...e[5]||(e[5]=[s("span",{class:"material-symbols-outlined"},"note_add",-1),c(" 创建并绑定 ",-1)])],8,ye),s("button",{onClick:l=>I(K(a.file)),disabled:!T(a.file),class:"btn-secondary btn-sm btn-sm-touch"},[...e[6]||(e[6]=[s("span",{class:"material-symbols-outlined"},"edit",-1),c(" 编辑文件 ",-1)])],8,Fe),s("button",{onClick:l=>te(n),class:"btn-danger btn-sm btn-sm-touch"},[...e[7]||(e[7]=[s("span",{class:"material-symbols-outlined"},"delete",-1),c(" 删除 ",-1)])],8,we)])]))),128)),m.value.length===0?(u(),r("div",Ee,[e[8]||(e[8]=s("span",{class:"material-symbols-outlined"},"smart_toy",-1)),e[9]||(e[9]=s("p",null,"暂无 Agent 映射",-1)),s("button",{onClick:U,class:"btn-primary"}," 添加第一个 Agent ")])):x("",!0)])]),"right-content":L(()=>[s("div",ke,[s("div",Ce,[s("span",$e,[e[10]||(e[10]=s("span",{class:"material-symbols-outlined"},"description",-1)),c(" "+d(_.value||"未选择文件"),1)])]),N(s("textarea",{"onUpdate:modelValue":e[0]||(e[0]=a=>$.value=a),spellcheck:"false",rows:"20",placeholder:"从左侧选择一个 Agent 以编辑其关联的 .txt / .md 文件…",class:"file-content-editor"},null,512),[[P,$.value]]),s("div",xe,[s("button",{type:"button",onClick:se,disabled:!_.value||g.value,class:"btn-primary"},[s("span",{class:w(["material-symbols-outlined",{spinning:g.value}])},d(g.value?"sync":"save"),3),c(" "+d(g.value?"保存中…":"保存文件内容"),1)],8,Me),y.value?(u(),r("span",{key:0,class:w(["status-message",S.value])},d(y.value),3)):x("",!0)])])]),_:1}),s("datalist",{id:G},[(u(!0),r(W,null,j(E.value,a=>(u(),r("option",{key:a,value:a},d(a),9,Se))),128))]),C.value?(u(),r("span",{key:0,class:w(["status-message","floating-status",M.value])},d(C.value),3)):x("",!0)]))}}),Ve=oe(ze,[["__scopeId","data-v-65fc48fe"]]);export{Ve as default}; +import{Dt as d,H as L,N as j,O as ne,Q as i,U as N,a as W,c as le,d as x,f as r,g as ie,h as c,j as u,l as s,n as oe,v as re,wt as w}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as P}from"./dashboard-card-news-BnyB_dHU.js";import{E as h,G as o,P as ue}from"./dashboard-card-calendar-DWuV34Bn.js";import{t as de}from"./DualPaneEditor-D9nB9raE.js";var ce={class:"config-section active-section agent-files-page"},fe={class:"header-actions"},ge=["disabled"],ve={class:"agent-map-list"},me={class:"agent-entry-row"},pe=["onUpdate:modelValue"],be={class:"agent-entry-row"},Ae=["onUpdate:modelValue","disabled","onBlur"],he={key:0,class:"loading-hint"},_e={class:"agent-entry-actions"},ye=["onClick","disabled"],Fe=["onClick","disabled"],we=["onClick"],Ee={key:0,class:"empty-state"},ke={class:"agent-file-editor"},Ce={class:"agent-editor-controls"},$e={class:"editing-file-display"},xe={class:"editor-actions"},Me=["disabled"],Se=["value"],G="agent-file-options",ze=re({__name:"AgentFilesEditor",setup(Te){const V=ue("AgentFilesEditor");let D=0;function B(t={}){return D+=1,{localId:`agent-map-draft-${D}`,name:t.name??"",file:t.file??""}}const m=i([]),E=i([]),k=i(!1),C=i(""),M=i("info"),_=i(""),$=i(""),y=i(""),S=i("info"),f=i(!1),g=i(!1),H=/\.(txt|md)$/i,R=/^[A-Za-z]:\//,q=le(()=>{const t=new Map;return E.value.forEach(e=>{t.set(e.toLowerCase(),e)}),t});function F(t){return t.trim().replace(/\\/g,"/")}function v(t){const e=F(t);return e?e.startsWith("/")||R.test(e)||e.includes("\0")?!0:e.split("/").some(a=>{const n=a.trim();return n.length===0||n==="."||n===".."}):!1}function p(t){const e=F(t);if(!e||v(e))return"";const a=e.split("/").map(n=>n.trim()).filter(n=>n.length>0).join("/");return a?H.test(a)?a:`${a}.txt`:""}function b(t){const e=p(t);return e?q.value.get(e.toLowerCase())??null:null}function K(t){return b(t)??p(t)}function z(t){const e=F(t.file);if(!e)return t.file="","";if(v(e))return t.file=e,e;const a=p(e);return t.file=b(a)??a,t.file}function T(t){return b(t)!==null}function Q(t){const e=p(t);return e!==""&&!v(t)&&b(e)===null}function X(t){const e=t.lastIndexOf("/");return e<0?{fileName:t}:{fileName:t.slice(e+1),folderPath:t.slice(0,e)}}function Z(t){const e=new Map;return t.forEach(a=>{const n=F(String(a));if(!n)return;const l=n.toLowerCase();e.has(l)||e.set(l,n)}),[...e.values()].sort((a,n)=>a.localeCompare(n,void 0,{sensitivity:"base"}))}function J(){const t={},e=new Set;for(const a of m.value){const n=a.name.trim(),l=z(a);if(!n&&!l)continue;if(!n||!l)throw new Error("Agent 名称和关联文件都需要填写。");if(v(l))throw new Error(`文件路径格式不正确: ${a.file}`);const A=b(l);if(!A)throw new Error(`文件 ${l} 还不存在,请先点击“创建并绑定”或选择已有文件。`);if(e.has(n))throw new Error(`Agent 名称重复: ${n}`);e.add(n),t[n]=A}return t}async function O(){k.value=!0;try{E.value=Z(await h.getAgentFiles({},{showLoader:!1,loadingKey:"agent-files.available-files.load"}))}catch(t){const e=t instanceof Error?t.message:String(t);V.error("Failed to load available files:",e),o(`Failed to load available files: ${e}`,"error"),E.value=[]}finally{k.value=!1}}async function Y(){try{const t=await h.getAgentMap({},{showLoader:!1,loadingKey:"agent-files.map.load"});t&&typeof t=="object"&&(m.value=Object.entries(t).map(([e,a])=>B({name:e,file:String(a)})))}catch(t){const e=t instanceof Error?t.message:String(t);V.error("Failed to load agent map:",e),o(`Failed to load agent map: ${e}`,"error")}}async function ee(){if(!f.value){f.value=!0;try{const t=J();await h.saveAgentMap(t,{loadingKey:"agent-files.map.save"}),C.value="Agent 映射已保存。",M.value="success",o("Agent 映射已保存。","success")}catch(t){const e=t instanceof Error?t.message:String(t);C.value=`保存 Agent 映射失败: ${e}`,M.value="error",o(`保存 Agent 映射失败: ${e}`,"error")}finally{f.value=!1}}}function U(){m.value.push(B())}function te(t){confirm("确定删除这条 Agent 映射吗?")&&m.value.splice(t,1)}async function ae(t){const e=F(t.file);if(!e){o("请先输入要创建的 Agent 文件名。","info");return}if(v(e)){o("文件名不能包含绝对路径、空目录、. 或 ..。","error");return}const a=p(e);t.file=a;const n=b(a);if(n){t.file=n,o(`已绑定已有文件 ${n}。`,"success"),await I(n);return}const l=X(a);try{await h.createAgentFile(l.fileName,l.folderPath,{loadingKey:"agent-files.file.create"}),await O(),t.file=z(t),o(`已创建并绑定文件 ${t.file}。`,"success"),await I(t.file)}catch(A){o(`创建文件失败: ${A instanceof Error?A.message:String(A)}`,"error")}}async function I(t){if(t){_.value=t,y.value="";try{$.value=await h.getAgentFileContent(t,{},{showLoader:!1,loadingKey:"agent-files.file.load"})}catch(e){o(`Failed to load file: ${e instanceof Error?e.message:String(e)}`,"error")}}}async function se(){if(!(!_.value||g.value)){g.value=!0;try{await h.saveAgentFile(_.value,$.value,{loadingKey:"agent-files.file.save"}),y.value="文件已保存。",S.value="success",o("文件已保存。","success")}catch(t){y.value=`保存文件失败: ${t instanceof Error?t.message:String(t)}`,S.value="error"}finally{g.value=!1}}}return ne(()=>{Promise.all([O(),Y()])}),(t,e)=>(u(),r("section",ce,[e[11]||(e[11]=s("p",{class:"description"}," 管理 Agent 的定义名称与对应的 `.txt` / `.md` 文件。你可以在这里添加、删除和修改 Agent 映射,并直接编辑关联的文本文件。 ",-1)),ie(de,{"left-title":"Agent 映射表","right-title":"Agent 文件内容","initial-left-width":450,"min-left-width":350,"max-left-width":600},{"left-actions":L(()=>[s("div",fe,[s("button",{onClick:U,class:"btn-primary btn-sm btn-sm-touch","aria-label":"添加新 Agent",title:"添加新 Agent"},[...e[1]||(e[1]=[s("span",{class:"material-symbols-outlined","aria-hidden":"true"},"add",-1),c(" 添加 ",-1)])]),s("button",{type:"button",onClick:ee,class:"btn-primary btn-sm btn-sm-touch",disabled:f.value,"aria-label":"保存映射表",title:"保存映射表"},[s("span",{class:w(["material-symbols-outlined",{spinning:f.value}]),"aria-hidden":"true"},d(f.value?"sync":"save"),3),c(" "+d(f.value?"保存中…":"保存"),1)],8,ge)])]),"left-content":L(()=>[s("div",ve,[(u(!0),r(W,null,j(m.value,(a,n)=>(u(),r("div",{key:a.localId,class:"agent-map-entry card"},[s("div",me,[e[2]||(e[2]=s("label",null,"Agent 名称:",-1)),N(s("input",{"onUpdate:modelValue":l=>a.name=l,type:"text",placeholder:"输入 Agent 名称"},null,8,pe),[[P,a.name]])]),s("div",be,[e[4]||(e[4]=s("label",null,"关联文件:",-1)),N(s("input",{"onUpdate:modelValue":l=>a.file=l,list:G,type:"text",class:"file-input",disabled:k.value,placeholder:"输入新文件名,或选择已有文件",onBlur:l=>z(a)},null,40,Ae),[[P,a.file]]),k.value?(u(),r("span",he,[...e[3]||(e[3]=[s("span",{class:"material-symbols-outlined spinning"},"sync",-1),c(" 加载文件列表中... ",-1)])])):a.file?(u(),r("span",{key:1,class:w(["file-hint",v(a.file)?"error":T(a.file)?"success":"info"])},d(v(a.file)?"文件名不能包含绝对路径、空目录、. 或 ..":T(a.file)?`将绑定已有文件:${K(a.file)}`:`点击“创建并绑定”后会新建:${p(a.file)}`),3)):x("",!0)]),s("div",_e,[s("button",{onClick:l=>ae(a),disabled:!Q(a.file),class:"btn-primary btn-sm btn-sm-touch"},[...e[5]||(e[5]=[s("span",{class:"material-symbols-outlined"},"note_add",-1),c(" 创建并绑定 ",-1)])],8,ye),s("button",{onClick:l=>I(K(a.file)),disabled:!T(a.file),class:"btn-secondary btn-sm btn-sm-touch"},[...e[6]||(e[6]=[s("span",{class:"material-symbols-outlined"},"edit",-1),c(" 编辑文件 ",-1)])],8,Fe),s("button",{onClick:l=>te(n),class:"btn-danger btn-sm btn-sm-touch"},[...e[7]||(e[7]=[s("span",{class:"material-symbols-outlined"},"delete",-1),c(" 删除 ",-1)])],8,we)])]))),128)),m.value.length===0?(u(),r("div",Ee,[e[8]||(e[8]=s("span",{class:"material-symbols-outlined"},"smart_toy",-1)),e[9]||(e[9]=s("p",null,"暂无 Agent 映射",-1)),s("button",{onClick:U,class:"btn-primary"}," 添加第一个 Agent ")])):x("",!0)])]),"right-content":L(()=>[s("div",ke,[s("div",Ce,[s("span",$e,[e[10]||(e[10]=s("span",{class:"material-symbols-outlined"},"description",-1)),c(" "+d(_.value||"未选择文件"),1)])]),N(s("textarea",{"onUpdate:modelValue":e[0]||(e[0]=a=>$.value=a),spellcheck:"false",rows:"20",placeholder:"从左侧选择一个 Agent 以编辑其关联的 .txt / .md 文件…",class:"file-content-editor"},null,512),[[P,$.value]]),s("div",xe,[s("button",{type:"button",onClick:se,disabled:!_.value||g.value,class:"btn-primary"},[s("span",{class:w(["material-symbols-outlined",{spinning:g.value}])},d(g.value?"sync":"save"),3),c(" "+d(g.value?"保存中…":"保存文件内容"),1)],8,Me),y.value?(u(),r("span",{key:0,class:w(["status-message",S.value])},d(y.value),3)):x("",!0)])])]),_:1}),s("datalist",{id:G},[(u(!0),r(W,null,j(E.value,a=>(u(),r("option",{key:a,value:a},d(a),9,Se))),128))]),C.value?(u(),r("span",{key:0,class:w(["status-message","floating-status",M.value])},d(C.value),3)):x("",!0)]))}}),Ve=oe(ze,[["__scopeId","data-v-65fc48fe"]]);export{Ve as default}; diff --git a/AdminPanel-Vue/dist/assets/js/AgentScores-BXqgHJyV.js b/AdminPanel-Vue/dist/assets/js/AgentScores-C7Y-y85L.js similarity index 98% rename from AdminPanel-Vue/dist/assets/js/AgentScores-BXqgHJyV.js rename to AdminPanel-Vue/dist/assets/js/AgentScores-C7Y-y85L.js index 6a79115b6..d71c75180 100644 --- a/AdminPanel-Vue/dist/assets/js/AgentScores-BXqgHJyV.js +++ b/AdminPanel-Vue/dist/assets/js/AgentScores-C7Y-y85L.js @@ -1 +1 @@ -import{Dt as l,N as w,O as D,Q as c,a as E,at as s,d as k,f as o,h as v,j as r,l as e,n as z,v as B,wt as L}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{E as M,G as A}from"./dashboard-card-calendar-CA3-tSpi.js";import{t as V}from"./usePagination-OVhnKIrl.js";var $={class:"config-section active-section"},T={class:"agent-scores-container card"},U={class:"scores-header"},j={class:"table-container"},F={class:"modern-table",id:"agent-scores-table"},G={id:"agent-scores-body"},I={key:0},O={key:1},Q={key:0,class:"pagination-controls"},q=["disabled"],H={class:"pagination-info"},J=["disabled"],K=B({__name:"AgentScores",setup(R){const m=c([]),g=c(!1),u=c(""),p=c("info"),{items:_,currentPage:b,totalPages:y,hasNext:C,hasPrev:P,nextPage:f,prevPage:h,reset:x}=V(m,{pageSize:10});async function S(){g.value=!0;try{m.value=(await M.getAgentScores()).map(({baseName:n,name:t,totalPoints:a,history:i})=>{const d=i.length>0?i[i.length-1]:null;return{agent:t||n,totalScore:a||0,recentActivity:d?`+${d.pointsDelta??0} (${d.reason||"未知原因"})`:"无动态",lastUpdated:d?.time?new Date(d.time).toLocaleString("zh-CN"):"无记录"}}).sort((n,t)=>t.totalScore-n.totalScore),x()}catch(n){A(`加载积分数据失败:${n instanceof Error?n.message:String(n)}`,"error")}finally{g.value=!1}}async function N(){u.value="正在刷新数据…",p.value="info",await S(),u.value="数据已刷新",p.value="success",A("数据已刷新","success")}return D(()=>{S()}),(n,t)=>(r(),o("section",$,[t[8]||(t[8]=e("p",{class:"description"},"在这里查看 Agent 的积分情况。",-1)),e("div",T,[e("div",U,[e("button",{onClick:N,class:"btn-secondary"},[...t[2]||(t[2]=[e("span",{class:"material-symbols-outlined"},"refresh",-1),v(" 刷新数据 ",-1)])]),u.value?(r(),o("span",{key:0,class:L(["status-message",p.value])},l(u.value),3)):k("",!0)]),e("div",j,[e("table",F,[t[5]||(t[5]=e("thead",null,[e("tr",null,[e("th",null,"排名"),e("th",null,"执行者 (Agent)"),e("th",null,"总积分"),e("th",null,"最近动态"),e("th",null,"获取时间")])],-1)),e("tbody",G,[g.value?(r(),o("tr",I,[...t[3]||(t[3]=[e("td",{colspan:"5",class:"table-center-cell"}," 正在加载积分数据… ",-1)])])):s(_).length===0?(r(),o("tr",O,[...t[4]||(t[4]=[e("td",{colspan:"5",class:"table-center-cell table-empty-state"},[e("span",{class:"material-symbols-outlined table-empty-icon"},"leaderboard"),v(" 暂无积分数据 ")],-1)])])):(r(!0),o(E,{key:2},w(s(_),(a,i)=>(r(),o("tr",{key:a.agent},[e("td",null,l((s(b)-1)*10+i+1),1),e("td",null,l(a.agent),1),e("td",null,l(a.totalScore),1),e("td",null,l(a.recentActivity),1),e("td",null,l(a.lastUpdated),1)]))),128))])]),s(y)>1?(r(),o("div",Q,[e("button",{class:"btn-secondary btn-sm",disabled:!s(P),onClick:t[0]||(t[0]=(...a)=>s(h)&&s(h)(...a))},[...t[6]||(t[6]=[e("span",{class:"material-symbols-outlined"},"chevron_left",-1),v(" 上一页 ",-1)])],8,q),e("span",H,"第 "+l(s(b))+" / "+l(s(y))+" 页",1),e("button",{class:"btn-secondary btn-sm",disabled:!s(C),onClick:t[1]||(t[1]=(...a)=>s(f)&&s(f)(...a))},[...t[7]||(t[7]=[v(" 下一页 ",-1),e("span",{class:"material-symbols-outlined"},"chevron_right",-1)])],8,J)])):k("",!0)])])]))}}),Z=z(K,[["__scopeId","data-v-22d29edd"]]);export{Z as default}; +import{Dt as l,N as w,O as D,Q as c,a as E,at as s,d as k,f as o,h as v,j as r,l as e,n as z,v as B,wt as L}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{E as M,G as A}from"./dashboard-card-calendar-DWuV34Bn.js";import{t as V}from"./usePagination-OVhnKIrl.js";var $={class:"config-section active-section"},T={class:"agent-scores-container card"},U={class:"scores-header"},j={class:"table-container"},F={class:"modern-table",id:"agent-scores-table"},G={id:"agent-scores-body"},I={key:0},O={key:1},Q={key:0,class:"pagination-controls"},q=["disabled"],H={class:"pagination-info"},J=["disabled"],K=B({__name:"AgentScores",setup(R){const m=c([]),g=c(!1),u=c(""),p=c("info"),{items:_,currentPage:b,totalPages:y,hasNext:C,hasPrev:P,nextPage:f,prevPage:h,reset:x}=V(m,{pageSize:10});async function S(){g.value=!0;try{m.value=(await M.getAgentScores()).map(({baseName:n,name:t,totalPoints:a,history:i})=>{const d=i.length>0?i[i.length-1]:null;return{agent:t||n,totalScore:a||0,recentActivity:d?`+${d.pointsDelta??0} (${d.reason||"未知原因"})`:"无动态",lastUpdated:d?.time?new Date(d.time).toLocaleString("zh-CN"):"无记录"}}).sort((n,t)=>t.totalScore-n.totalScore),x()}catch(n){A(`加载积分数据失败:${n instanceof Error?n.message:String(n)}`,"error")}finally{g.value=!1}}async function N(){u.value="正在刷新数据…",p.value="info",await S(),u.value="数据已刷新",p.value="success",A("数据已刷新","success")}return D(()=>{S()}),(n,t)=>(r(),o("section",$,[t[8]||(t[8]=e("p",{class:"description"},"在这里查看 Agent 的积分情况。",-1)),e("div",T,[e("div",U,[e("button",{onClick:N,class:"btn-secondary"},[...t[2]||(t[2]=[e("span",{class:"material-symbols-outlined"},"refresh",-1),v(" 刷新数据 ",-1)])]),u.value?(r(),o("span",{key:0,class:L(["status-message",p.value])},l(u.value),3)):k("",!0)]),e("div",j,[e("table",F,[t[5]||(t[5]=e("thead",null,[e("tr",null,[e("th",null,"排名"),e("th",null,"执行者 (Agent)"),e("th",null,"总积分"),e("th",null,"最近动态"),e("th",null,"获取时间")])],-1)),e("tbody",G,[g.value?(r(),o("tr",I,[...t[3]||(t[3]=[e("td",{colspan:"5",class:"table-center-cell"}," 正在加载积分数据… ",-1)])])):s(_).length===0?(r(),o("tr",O,[...t[4]||(t[4]=[e("td",{colspan:"5",class:"table-center-cell table-empty-state"},[e("span",{class:"material-symbols-outlined table-empty-icon"},"leaderboard"),v(" 暂无积分数据 ")],-1)])])):(r(!0),o(E,{key:2},w(s(_),(a,i)=>(r(),o("tr",{key:a.agent},[e("td",null,l((s(b)-1)*10+i+1),1),e("td",null,l(a.agent),1),e("td",null,l(a.totalScore),1),e("td",null,l(a.recentActivity),1),e("td",null,l(a.lastUpdated),1)]))),128))])]),s(y)>1?(r(),o("div",Q,[e("button",{class:"btn-secondary btn-sm",disabled:!s(P),onClick:t[0]||(t[0]=(...a)=>s(h)&&s(h)(...a))},[...t[6]||(t[6]=[e("span",{class:"material-symbols-outlined"},"chevron_left",-1),v(" 上一页 ",-1)])],8,q),e("span",H,"第 "+l(s(b))+" / "+l(s(y))+" 页",1),e("button",{class:"btn-secondary btn-sm",disabled:!s(C),onClick:t[1]||(t[1]=(...a)=>s(f)&&s(f)(...a))},[...t[7]||(t[7]=[v(" 下一页 ",-1),e("span",{class:"material-symbols-outlined"},"chevron_right",-1)])],8,J)])):k("",!0)])])]))}}),Z=z(K,[["__scopeId","data-v-22d29edd"]]);export{Z as default}; diff --git a/AdminPanel-Vue/dist/assets/js/BaseConfig-yAUSh-rB.js b/AdminPanel-Vue/dist/assets/js/BaseConfig-ZwMPzMSY.js similarity index 98% rename from AdminPanel-Vue/dist/assets/js/BaseConfig-yAUSh-rB.js rename to AdminPanel-Vue/dist/assets/js/BaseConfig-ZwMPzMSY.js index fdd18afcf..1e1c6f866 100644 --- a/AdminPanel-Vue/dist/assets/js/BaseConfig-yAUSh-rB.js +++ b/AdminPanel-Vue/dist/assets/js/BaseConfig-ZwMPzMSY.js @@ -1,4 +1,4 @@ -import{Dt as u,H as S,N as $,O as V,Q as p,U as g,X as T,a as U,at as k,d as B,f as i,g as F,h as N,j as t,k as I,l as s,n as L,v as O,wt as h}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as D,c as b,d as K,n as j,o as z}from"./dashboard-card-news-BnyB_dHU.js";import{G as y,T as w,a as A,i as m,o as Q,r as G}from"./dashboard-card-calendar-CA3-tSpi.js";var H={id:"base-config-section",class:"config-section active-section"},X={key:0,class:"config-loading"},q={key:0,class:"form-group-comment"},J={key:1,class:"form-group"},P=["for"],R={class:"key-name"},W={key:0,class:"switch-container"},Y={class:"switch"},Z=["id","onUpdate:modelValue"],ee={key:1},ae=["id","onUpdate:modelValue"],se={key:2},ie={key:0,class:"input-with-toggle"},te=["id","value","onInput","rows"],oe=["onClick","aria-label"],le=["id","value","onInput","rows"],ne={key:3},ue={key:0,class:"input-with-toggle"},de=["type","id","onUpdate:modelValue","data-original-key"],re=["onClick","aria-label"],ve=["id","onUpdate:modelValue","data-original-key"],ce={class:"description"},pe={class:"config-action-capsule-container"},ge={class:"config-action-capsule"},me=["disabled"],fe={key:0,class:"loading-spinner-sm"},_e={key:1,class:"material-symbols-outlined"},ke={key:"label",class:"label-text"},he={key:2,class:"config-empty"},be=O({__name:"BaseConfig",setup(ye){const d=p([]),r=p(""),c=p("info"),v=p(!0),n=T({});function C(){const o=document.getElementById("config-details-container");o?o.scrollTo({top:0,behavior:"smooth"}):window.scrollTo({top:0,behavior:"smooth"})}function f(o){n[o]=!n[o]}function x(o,a){return!o||m(o)?"string":/^(true|false)$/i.test(a)?"boolean":!isNaN(parseFloat(a))&&isFinite(parseFloat(a))&&!a.includes(".")?"integer":"string"}async function _(o=!1){o||(v.value=!0);try{d.value=A(await w.getMainConfig({showLoader:!1,loadingKey:"base-config.load"})).map((a,e)=>{const l=a.isCommentOrEmpty?"string":x(a.key,a.value);return{...a,uid:`${a.key??"line"}-${e}`,type:l,value:a.isCommentOrEmpty||!a.key?a.value:G(a.value,l)}})}catch(a){y(`加载全局配置失败:${a instanceof Error?a.message:String(a)}`,"error")}finally{o||(v.value=!1)}}async function E(){const o=M(d.value);try{await w.saveMainConfig(o,{loadingKey:"base-config.save"}),r.value="全局配置已保存!",c.value="success",y("全局配置已保存!","success"),await _(!0),setTimeout(()=>{c.value==="success"&&(r.value="")},4e3)}catch(a){r.value=`保存失败:${a instanceof Error?a.message:String(a)}`,c.value="error"}}function M(o){return o.map(a=>{if(a.isCommentOrEmpty)return a.value;let e=a.value;return a.type==="boolean"&&(e=e?"true":"false"),Q(a.key,e)}).join(` +import{Dt as u,H as S,N as $,O as V,Q as p,U as g,X as T,a as U,at as k,d as B,f as i,g as F,h as N,j as t,k as I,l as s,n as L,v as O,wt as h}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as D,c as b,d as K,n as j,o as z}from"./dashboard-card-news-BnyB_dHU.js";import{G as y,T as w,a as A,i as m,o as Q,r as G}from"./dashboard-card-calendar-DWuV34Bn.js";var H={id:"base-config-section",class:"config-section active-section"},X={key:0,class:"config-loading"},q={key:0,class:"form-group-comment"},J={key:1,class:"form-group"},P=["for"],R={class:"key-name"},W={key:0,class:"switch-container"},Y={class:"switch"},Z=["id","onUpdate:modelValue"],ee={key:1},ae=["id","onUpdate:modelValue"],se={key:2},ie={key:0,class:"input-with-toggle"},te=["id","value","onInput","rows"],oe=["onClick","aria-label"],le=["id","value","onInput","rows"],ne={key:3},ue={key:0,class:"input-with-toggle"},de=["type","id","onUpdate:modelValue","data-original-key"],re=["onClick","aria-label"],ve=["id","onUpdate:modelValue","data-original-key"],ce={class:"description"},pe={class:"config-action-capsule-container"},ge={class:"config-action-capsule"},me=["disabled"],fe={key:0,class:"loading-spinner-sm"},_e={key:1,class:"material-symbols-outlined"},ke={key:"label",class:"label-text"},he={key:2,class:"config-empty"},be=O({__name:"BaseConfig",setup(ye){const d=p([]),r=p(""),c=p("info"),v=p(!0),n=T({});function C(){const o=document.getElementById("config-details-container");o?o.scrollTo({top:0,behavior:"smooth"}):window.scrollTo({top:0,behavior:"smooth"})}function f(o){n[o]=!n[o]}function x(o,a){return!o||m(o)?"string":/^(true|false)$/i.test(a)?"boolean":!isNaN(parseFloat(a))&&isFinite(parseFloat(a))&&!a.includes(".")?"integer":"string"}async function _(o=!1){o||(v.value=!0);try{d.value=A(await w.getMainConfig({showLoader:!1,loadingKey:"base-config.load"})).map((a,e)=>{const l=a.isCommentOrEmpty?"string":x(a.key,a.value);return{...a,uid:`${a.key??"line"}-${e}`,type:l,value:a.isCommentOrEmpty||!a.key?a.value:G(a.value,l)}})}catch(a){y(`加载全局配置失败:${a instanceof Error?a.message:String(a)}`,"error")}finally{o||(v.value=!1)}}async function E(){const o=M(d.value);try{await w.saveMainConfig(o,{loadingKey:"base-config.save"}),r.value="全局配置已保存!",c.value="success",y("全局配置已保存!","success"),await _(!0),setTimeout(()=>{c.value==="success"&&(r.value="")},4e3)}catch(a){r.value=`保存失败:${a instanceof Error?a.message:String(a)}`,c.value="error"}}function M(o){return o.map(a=>{if(a.isCommentOrEmpty)return a.value;let e=a.value;return a.type==="boolean"&&(e=e?"true":"false"),Q(a.key,e)}).join(` `)}return V(()=>{_(),document.documentElement.classList.add("hide-global-back-to-top")}),I(()=>{document.documentElement.classList.remove("hide-global-back-to-top")}),(o,a)=>(t(),i("section",H,[v.value&&d.value.length===0?(t(),i("div",X,[...a[0]||(a[0]=[s("span",{class:"loading-spinner"},null,-1),N(" 加载全局配置中… ",-1)])])):B("",!0),d.value.length>0?(t(),i("form",{key:1,id:"base-config-form",onSubmit:K(E,["prevent"])},[(t(!0),i(U,null,$(d.value,e=>(t(),i("div",{key:e.uid},[e.isCommentOrEmpty?(t(),i("div",q,[s("pre",null,u(e.value),1)])):(t(),i("div",J,[s("label",{for:`config-${e.key}`},[s("span",R,u(e.key),1)],8,P),e.type==="boolean"?(t(),i("div",W,[s("label",Y,[g(s("input",{type:"checkbox",id:`config-${e.key}`,"onUpdate:modelValue":l=>e.value=l,"data-expected-type":"boolean"},null,8,Z),[[D,e.value]]),a[1]||(a[1]=s("span",{class:"slider"},null,-1))]),s("span",null,u(e.value?"启用":"禁用"),1)])):e.type==="integer"?(t(),i("div",ee,[g(s("input",{type:"number",id:`config-${e.key}`,"onUpdate:modelValue":l=>e.value=l,step:"1","data-expected-type":"integer"},null,8,ae),[[b,e.value,void 0,{number:!0}]])])):e.isMultilineQuoted||e.value&&String(e.value).length>60?(t(),i("div",se,[e.key&&k(m)(e.key)?(t(),i("div",ie,[s("textarea",{id:`config-${e.key}`,value:String(e.value),onInput:l=>e.value=l.target.value,rows:Math.min(10,Math.max(3,String(e.value).split(` `).length+1)),class:h({"password-masked":!n[e.key]}),autocomplete:"off"},null,42,te),s("button",{type:"button",class:"toggle-visibility-btn",onClick:l=>f(e.key),"aria-label":n[e.key]?"隐藏值":"显示值"},u(n[e.key]?"隐藏":"显示"),9,oe)])):(t(),i("textarea",{key:1,id:`config-${e.key}`,value:String(e.value),onInput:l=>e.value=l.target.value,rows:Math.min(10,Math.max(3,String(e.value).split(` `).length+1))},null,40,le))])):(t(),i("div",ne,[e.key&&k(m)(e.key)?(t(),i("div",ue,[g(s("input",{type:n[e.key]?"text":"password",id:`config-${e.key}`,"onUpdate:modelValue":l=>e.value=l,"data-original-key":e.key,autocomplete:"off"},null,8,de),[[z,e.value]]),s("button",{type:"button",class:"toggle-visibility-btn",onClick:l=>f(e.key),"aria-label":n[e.key]?"隐藏值":"显示值"},u(n[e.key]?"隐藏":"显示"),9,re)])):g((t(),i("input",{key:1,type:"text",id:`config-${e.key}`,"onUpdate:modelValue":l=>e.value=l,"data-original-key":e.key},null,8,ve)),[[b,e.value]])])),s("span",ce,"根目录 config.env 配置项:"+u(e.key),1)]))]))),128)),s("div",pe,[s("div",ge,[s("button",{type:"submit",class:"capsule-segment save-segment",disabled:v.value,title:"保存全局配置"},[v.value?(t(),i("span",fe)):(t(),i("span",_e,"save")),F(j,{name:"fade-text",mode:"out-in"},{default:S(()=>[r.value?(t(),i("span",{key:"status",class:h(["status-text",c.value])},u(r.value),3)):(t(),i("span",ke,"保存配置"))]),_:1})],8,me),a[3]||(a[3]=s("div",{class:"capsule-divider"},null,-1)),s("button",{type:"button",class:"capsule-segment top-segment",onClick:C,title:"回到顶部"},[...a[2]||(a[2]=[s("span",{class:"material-symbols-outlined"},"keyboard_arrow_up",-1)])])])])],32)):(t(),i("div",he,[...a[4]||(a[4]=[s("span",{class:"material-symbols-outlined"},"settings_suggest",-1),s("h3",null,"暂无配置项",-1),s("p",null,"全局配置文件为空或加载失败,请检查 config.env 文件是否存在。",-1)])]))]))}}),Ee=L(be,[["__scopeId","data-v-37a9bede"]]);export{Ee as default}; diff --git a/AdminPanel-Vue/dist/assets/js/DailyNotesManager-BDCMz35j.js b/AdminPanel-Vue/dist/assets/js/DailyNotesManager-e429OhBh.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/DailyNotesManager-BDCMz35j.js rename to AdminPanel-Vue/dist/assets/js/DailyNotesManager-e429OhBh.js index 083e2574f..dc2238da8 100644 --- a/AdminPanel-Vue/dist/assets/js/DailyNotesManager-BDCMz35j.js +++ b/AdminPanel-Vue/dist/assets/js/DailyNotesManager-e429OhBh.js @@ -1,2 +1,2 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/easymde-BiwpWqxW.js","assets/js/rolldown-runtime-DmMX61E0.js","assets/css/easymde-CuHSnQz_.css"])))=>i.map(i=>d[i]); -import{i as $e}from"./rolldown-runtime-DmMX61E0.js";import{Dt as T,E as le,Et as te,H as be,N as z,O as ce,P as _e,Q as h,U as Ne,V as se,a as Q,at as k,c as U,d as V,f as v,g as ae,h as K,j as c,k as ve,l as e,n as q,u as we,v as W,wt as j}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as ke,d as Ce}from"./dashboard-card-news-BnyB_dHU.js";import{G as H,J as Se,U as Ee,X as Fe,j as B,s as re}from"./dashboard-card-calendar-CA3-tSpi.js";import"./easymde-BiwpWqxW.js";import{t as Re}from"./useVirtualScroll-DdYyc53Y.js";import{t as De}from"./useDebounceFn-X8Lyvegv.js";var ne={thresholdEnabled:!1,threshold:.7,tags:[]},Me=["任务闭环","社区贡献","逻辑共鸣","架构讨论","性能优化","Bug 修复","功能请求","用户反馈","版本发布","技术债务","文档更新","测试覆盖","代码审查","安全加固","用户体验"];function Ae(t,s){if(!s)return[...t];const l=s.toLowerCase();return t.filter(m=>m.title?.toLowerCase().includes(l)||m.file.toLowerCase().includes(l))}function xe(t){const s=new Set(t.map(l=>l.trim().toLowerCase()).filter(Boolean));return Me.filter(l=>!s.has(l.toLowerCase()))}var Ie=Se("diary",()=>{const t=h([]),s=h(""),l=h([]),m=U(()=>Ae(l.value,o.value)),S=h([]),g=h(""),o=h(""),b=h(!1),i=h({...ne}),N=h(""),F=h("info"),w=h(""),R=h("info");function x(){i.value={...ne}}function D(a){o.value=a}function G(){}async function I(){try{t.value=(await B.getFolders()).map(a=>a.name),t.value.length>0?await M(s.value&&t.value.includes(s.value)?s.value:t.value[0]):(s.value="",l.value=[],x())}catch(a){H(`加载知识库列表失败:${a instanceof Error?a.message:String(a)}`,"error"),t.value=[]}}async function M(a){s.value=a,S.value=[],g.value="",await Promise.all([E(),y()])}async function E(){if(s.value){b.value=!0;try{l.value=(await B.getDiaryList({folder:s.value})).notes.map(a=>({file:a.file,title:a.title,modified:a.modified,preview:a.preview}))}catch(a){w.value=`加载日记列表失败:${a instanceof Error?a.message:String(a)}`,R.value="error",l.value=[]}finally{b.value=!1}}}async function y(){if(s.value)try{i.value=await B.getRagTagsConfig(s.value)}catch(a){H(`加载 RAG 标签失败:${a instanceof Error?a.message:String(a)}`,"error")}}function u(){i.value.thresholdEnabled||(i.value.threshold=.7)}function p(a){i.value.threshold=a}function $(){if(i.value.tags.length===0){H("当前没有标签","info");return}i.value.tags=[],H("已清空所有标签","success")}function r(){const a=xe(i.value.tags);if(a.length===0){H("所有常用标签已存在","info");return}i.value.tags.push(...a),H(`已添加 ${a.length} 个常用标签`,"success")}function d(){i.value.tags.push("")}function n(a){a.index<0||a.index>=i.value.tags.length||(i.value.tags[a.index]=a.value)}function _(a){i.value.tags.splice(a,1)}async function A(){if(!s.value)return!1;try{const a={tags:i.value.tags.filter(O=>O.trim())};return i.value.thresholdEnabled&&(a.threshold=i.value.threshold),await B.saveRagTagsConfig(s.value,{thresholdEnabled:i.value.thresholdEnabled,threshold:i.value.threshold,tags:a.tags},{loadingKey:"diary.rag-tags.save"}),N.value="RAG 标签已保存!",F.value="success",H("RAG 标签已保存!","success"),!0}catch(a){return N.value=`保存失败:${a instanceof Error?a.message:String(a)}`,F.value="error",!1}}async function Y(a){if(!s.value)throw new Error("请先选择一个知识库");return B.getDiaryContent(`${s.value}/${a}`)}async function J(a,O){if(!s.value)return!1;try{return await B.saveDiary(`${s.value}/${a}`,O,{loadingKey:"diary.note.save"}),H("日记已保存!","success"),await E(),!0}catch(P){return w.value=`保存失败:${P instanceof Error?P.message:String(P)}`,R.value="error",!1}}async function X(a){if(!s.value)return!1;try{return await B.deleteDiary([`${s.value}/${a}`],{loadingKey:"diary.note.delete"}),w.value="日记已删除",R.value="success",await E(),!0}catch(O){return w.value=`删除失败:${O instanceof Error?O.message:String(O)}`,R.value="error",!1}}async function Z(){if(!s.value||S.value.length===0)return!1;try{return await B.deleteDiary(S.value.map(a=>`${s.value}/${a}`),{loadingKey:"diary.notes.batch-delete"}),w.value="已批量删除选中的日记",R.value="success",S.value=[],await E(),!0}catch(a){return w.value=`批量删除失败:${a instanceof Error?a.message:String(a)}`,R.value="error",!1}}async function ee(){if(!s.value||!g.value||S.value.length===0)return!1;try{return await B.moveDiaries(S.value.map(a=>({folder:s.value,file:a})),g.value,{loadingKey:"diary.notes.batch-move"}),w.value=`已移动 ${S.value.length} 篇日记到 ${g.value}`,R.value="success",S.value=[],g.value="",await E(),!0}catch(a){return w.value=`移动失败:${a instanceof Error?a.message:String(a)}`,R.value="error",!1}}async function oe(){await I()}return{folders:t,selectedFolder:s,notes:l,filteredNotes:m,selectedNotes:S,moveTargetFolder:g,searchQuery:o,loadingNotes:b,ragTagsConfig:i,ragTagsStatus:N,ragTagsStatusType:F,notesStatus:w,notesStatusType:R,init:oe,setSearchQuery:D,filterNotes:G,loadFolders:I,setSelectedFolder:M,loadNotes:E,loadRagTags:y,onThresholdToggle:u,updateThreshold:p,clearAllTags:$,addAllCommonTags:r,addTag:d,updateTag:n,removeTag:_,saveRagTags:A,getNoteContent:Y,saveNoteContent:J,deleteNote:X,deleteSelectedNotesBatch:Z,moveSelectedNotesBatch:ee}}),Le={key:0,class:"note-editor-area card"},He={class:"editor-header"},Ve={class:"editor-title-section"},Be={class:"editor-actions"},Ge=["disabled"],Oe=["disabled"],ze={class:"markdown-editor-wrapper"},Qe=W({__name:"DiaryEditor",props:{editingNote:{},savingNote:{type:Boolean},editorStatus:{},editorStatusType:{}},emits:["saveNote","cancelEdit"],setup(t){return(s,l)=>t.editingNote?(c(),v("div",Le,[e("div",He,[e("div",Ve,[e("button",{class:"btn-secondary btn-back","aria-label":"返回日记列表",onClick:l[0]||(l[0]=m=>s.$emit("cancelEdit"))},[...l[3]||(l[3]=[e("span",{class:"material-symbols-outlined"},"arrow_back",-1)])]),e("h3",null,"编辑日记:"+T(t.editingNote.file),1)]),e("div",Be,[e("button",{class:"btn-primary",disabled:t.savingNote,onClick:l[1]||(l[1]=m=>s.$emit("saveNote"))},T(t.savingNote?"保存中…":"保存日记"),9,Ge),e("button",{class:"btn-secondary",disabled:t.savingNote,onClick:l[2]||(l[2]=m=>s.$emit("cancelEdit"))}," 取消编辑 ",8,Oe),t.editorStatus?(c(),v("span",{key:0,class:j(["status-message",t.editorStatusType])},T(t.editorStatus),3)):V("",!0)])]),e("div",ze,[_e(s.$slots,"editor-textarea",{},void 0,!0)])])):V("",!0)}}),Ue=q(Qe,[["__scopeId","data-v-d507e63b"]]),Pe={class:"modal-header"},Ke={class:"modal-body"},je={class:"discovery-config"},qe={class:"config-row"},We={class:"k-slider-container"},Ye={class:"k-value-display"},Je={class:"config-row"},Xe={class:"folder-chips-container"},Ze=["onClick"],et={key:0,class:"loading-state"},tt={key:1,class:"warning-message"},at={key:2,class:"discovery-results-list"},st=["onClick"],lt={class:"result-header"},ot={class:"result-filename"},rt={class:"result-score-tag"},nt={class:"result-score-bar-container"},it={class:"result-tags"},dt={class:"result-preview"},ut={key:3,class:"no-results"},ct={class:"modal-footer"},vt=["disabled"],gt=W({__name:"DiscoveryModal",props:{modelValue:{type:Boolean},sourceNote:{},selectedFolder:{}},emits:["update:modelValue","openNote"],setup(t,{emit:s}){const l=t,m=s,S=h([]),g=h([]),o=h(50),b=h("50"),i=h(!1),N=h(""),F=h([]),w=h(!1),R=U(()=>l.sourceNote?.title||l.sourceNote?.file||"");async function x(){try{S.value=(await B.getFolders()).map(y=>y.name),l.selectedFolder&&(g.value=[l.selectedFolder])}catch(y){console.error("Failed to load folders:",y)}}function D(){b.value=String(o.value)}function G(y){const u=g.value.indexOf(y);u>-1?g.value.splice(u,1):g.value.push(y)}async function I(){if(l.sourceNote){i.value=!0,N.value="",F.value=[],w.value=!1;try{const y=await B.associativeDiscovery({sourceFilePath:`${l.selectedFolder}/${l.sourceNote.file}`,k:o.value,range:g.value,tagBoost:.15});y.warning&&(N.value=y.warning),y.results&&y.results.length>0&&(F.value=y.results.map(u=>({...u,scorePercent:Math.min(Math.round(u.score*100),100),preview:Array.isArray(u.chunks)?u.chunks.map(p=>p.substring(0,100)).join(" ... "):""}))),w.value=!0}catch(y){H(`联想失败:${y instanceof Error?y.message:String(y)}`,"error")}finally{i.value=!1}}}function M(y){const u=y.path.split(/[/\\]/),p=u[0],$=u[u.length-1];m("openNote",p,$),E()}function E(){m("update:modelValue",!1)}return se(()=>l.modelValue,y=>{y&&(x(),F.value=[],w.value=!1,N.value="")}),(y,u)=>t.modelValue?(c(),v("div",{key:0,class:"modal-overlay",onClick:E},[e("div",{class:"modal-content discovery-modal",onClick:u[1]||(u[1]=Ce(()=>{},["stop"]))},[e("div",Pe,[e("h3",null,"联想追溯:"+T(R.value),1),e("button",{class:"modal-close",onClick:E},[...u[2]||(u[2]=[e("span",{class:"material-symbols-outlined"},"close",-1)])])]),e("div",Ke,[e("div",je,[e("div",qe,[u[3]||(u[3]=e("label",null,"K 值(返回数量):",-1)),e("div",We,[Ne(e("input",{type:"range",min:"1",max:"200","onUpdate:modelValue":u[0]||(u[0]=p=>o.value=p),onInput:D},null,544),[[ke,o.value,void 0,{number:!0}]]),e("span",Ye,T(b.value),1)])]),e("div",Je,[u[4]||(u[4]=e("label",null,"搜索范围:",-1)),e("div",Xe,[(c(!0),v(Q,null,z(S.value,p=>(c(),v("div",{key:p,class:j(["folder-chip",{active:g.value.includes(p)}]),onClick:$=>G(p)},T(p),11,Ze))),128))])])]),i.value?(c(),v("div",et,[...u[5]||(u[5]=[e("span",{class:"loading-spinner"},null,-1),e("p",null,"正在进行联想追溯…",-1)])])):V("",!0),N.value?(c(),v("div",tt,[u[6]||(u[6]=e("span",{class:"material-symbols-outlined"},"warning",-1)),K(" "+T(N.value),1)])):V("",!0),F.value.length>0?(c(),v("div",at,[(c(!0),v(Q,null,z(F.value,(p,$)=>(c(),v("div",{key:p.path||`${p.name}-${$}`,class:"discovery-result-card",onClick:r=>M(p)},[e("div",lt,[e("span",ot,T(p.name),1),e("span",rt,"匹配度:"+T(p.scorePercent)+"%",1)]),e("div",nt,[e("div",{class:"result-score-bar",style:te({width:p.scorePercent+"%"})},null,4)]),e("div",it,[(c(!0),v(Q,null,z(p.matchedTags?.slice(0,5),(r,d)=>(c(),v("span",{key:`${r}-${d}`,class:"result-tag"}," #"+T(r),1))),128))]),e("div",dt,T(p.preview),1)],8,st))),128))])):!i.value&&w.value?(c(),v("div",ut,[...u[7]||(u[7]=[e("span",{class:"material-symbols-outlined"},"search_off",-1),e("p",null,"未发现相关的记忆节点。",-1)])])):V("",!0)]),e("div",ct,[e("button",{class:"btn-primary",onClick:I,disabled:i.value},[...u[8]||(u[8]=[e("span",{class:"material-symbols-outlined"},"psychology",-1),K(" 开始联想 ",-1)])],8,vt)])])])):V("",!0)}}),ft=q(gt,[["__scopeId","data-v-74606b29"]]),ht={class:"notes-sidebar"},mt={id:"notes-folder-list"},yt=["onClick"],pt=W({__name:"FolderList",props:{folders:{},selectedFolder:{}},emits:["selectFolder"],setup(t){return(s,l)=>(c(),v("div",ht,[l[0]||(l[0]=e("h3",null,"知识库列表",-1)),e("ul",mt,[(c(!0),v(Q,null,z(t.folders,m=>(c(),v("li",{key:m,class:j({active:t.selectedFolder===m}),onClick:S=>s.$emit("selectFolder",m)},T(m),11,yt))),128))])]))}}),Tt=q(pt,[["__scopeId","data-v-f92df64a"]]),$t={key:0,class:"notes-content-area"},bt={class:"notes-toolbar"},_t=["value"],Nt=["disabled"],wt=["value","disabled"],kt=["value","disabled"],Ct=["disabled"],St={key:0,class:"loading-state"},Et={key:1,class:"empty-state"},Ft={class:"empty-hint"},Rt={class:"note-card-header"},Dt={class:"note-select-label"},Mt=["checked","onChange"],At={class:"note-title"},xt=["title"],It={class:"note-card-footer"},Lt={class:"note-meta"},Ht={class:"note-actions"},Vt=["onClick"],Bt=["onClick"],Gt=["onClick"],Ot={class:"note-card-header"},zt={class:"note-select-label"},Qt=["checked","onChange"],Ut={class:"note-title"},Pt=["title"],Kt={class:"note-card-footer"},jt={class:"note-meta"},qt={class:"note-actions"},Wt=["onClick"],Yt=["onClick"],Jt=["onClick"],Xt=280,ie=12,Zt=242,de=24,ue=320,ea=W({__name:"NoteList",props:{selectedFolder:{},folders:{},filteredNotes:{},selectedNotes:{},moveTargetFolder:{},searchQuery:{},loadingNotes:{type:Boolean},notesStatus:{},notesStatusType:{}},emits:["update:searchQuery","filterNotes","moveSelectedNotes","update:moveTargetFolder","deleteSelectedNotes","update:selectedNotes","editNote","deleteNote","discoveryNote"],setup(t,{emit:s}){const l=t,m=s,S=De((...r)=>{const d=r[0];m("update:searchQuery",d),m("filterNotes")},{delay:300}),g=U(()=>l.filteredNotes.length>50),o=U(()=>l.filteredNotes.length>1200?16:10),b=h(640),i=h(null),N=h(null),F=h(1);let w=null;const R=U(()=>{const r=Math.max(1,F.value),d=[];for(let n=0;n0&&(F.value=Math.max(1,Math.floor((d+ie)/(Xt+ie))))}const{onScroll:D,setScrollTop:G,visibleItems:I,totalHeight:M,offsetY:E}=Re(U(()=>R.value),{itemHeight:Zt,containerHeight:U(()=>b.value),overscan:U(()=>o.value)});function y(r){D(r);const d=r.target,n=Math.max(0,d.scrollHeight-d.clientHeight);d.scrollTop>n&&(d.scrollTop=n)}se(()=>l.searchQuery,()=>{G(0),N.value&&(N.value.scrollTop=0)}),se(()=>l.filteredNotes.length,()=>{if(le(x),!g.value||!N.value)return;const r=Math.max(0,M.value-b.value),d=Math.min(N.value.scrollTop,r);N.value.scrollTop=d,G(d)}),se(()=>g.value,r=>{r&&le(x)},{immediate:!0}),ce(()=>{x(),window.addEventListener("resize",x),typeof ResizeObserver<"u"&&(w=new ResizeObserver(()=>x()),i.value&&w.observe(i.value))}),ve(()=>{window.removeEventListener("resize",x),w&&(w.disconnect(),w=null)});function u(r){const d=r.target.value;S(d)}function p(r){const d=r.target.value;m("update:moveTargetFolder",d)}function $(r,d){if(d){l.selectedNotes.includes(r)||m("update:selectedNotes",[...l.selectedNotes,r]);return}m("update:selectedNotes",l.selectedNotes.filter(n=>n!==r))}return(r,d)=>t.selectedFolder?(c(),v("div",$t,[e("div",bt,[e("input",{type:"search",value:t.searchQuery,placeholder:"搜索日记…",autocomplete:"off","aria-label":"搜索日记",onInput:u},null,40,_t),e("button",{class:"btn-secondary",disabled:t.selectedNotes.length===0,onClick:d[0]||(d[0]=n=>r.$emit("moveSelectedNotes"))}," 移动选中项到… ",8,Nt),e("select",{value:t.moveTargetFolder,disabled:t.selectedNotes.length===0,onChange:p},[d[2]||(d[2]=e("option",{value:""},"选择目标知识库…",-1)),(c(!0),v(Q,null,z(t.folders,n=>(c(),v("option",{key:n,value:n,disabled:n===t.selectedFolder},T(n),9,kt))),128))],40,wt),e("button",{class:"btn-danger",disabled:t.selectedNotes.length===0,onClick:d[1]||(d[1]=n=>r.$emit("deleteSelectedNotes"))}," 批量删除选中项 ",8,Ct),t.notesStatus?(c(),v("span",{key:0,class:j(["status-message",t.notesStatusType])},T(t.notesStatus),3)):V("",!0)]),e("div",{id:"notes-list-view",ref_key:"notesContainerRef",ref:i,class:j(["notes-list-view",{"is-virtualized-host":g.value&&!t.loadingNotes&&t.filteredNotes.length>0}])},[t.loadingNotes?(c(),v("div",St,[...d[3]||(d[3]=[e("span",{class:"loading-spinner"},null,-1),e("p",null,"正在加载日记…",-1)])])):t.filteredNotes.length===0?(c(),v("div",Et,[d[4]||(d[4]=e("span",{class:"material-symbols-outlined empty-state-icon"},"article",-1)),e("p",null,T(t.searchQuery?"没有找到匹配的日记":"暂无日记"),1),e("p",Ft,T(t.searchQuery?"尝试调整搜索关键词":"当添加日记后,它们将显示在这里"),1)])):g.value?(c(),v("div",{key:2,ref_key:"virtualListRef",ref:N,class:"notes-list-view virtualized",style:te({height:`${b.value}px`}),onScroll:y},[e("div",{class:"virtual-scroll-spacer",style:te({height:`${k(M)}px`})},[e("div",{class:"virtual-scroll-content",style:te({transform:`translateY(${k(E)}px)`})},[(c(!0),v(Q,null,z(k(I),n=>(c(),v("div",{key:n.index,class:"virtual-note-row",style:te({gridTemplateColumns:`repeat(${F.value}, minmax(0, 1fr))`})},[(c(!0),v(Q,null,z(n.item,_=>(c(),v("div",{key:_.file,class:"note-card card virtual-card"},[e("div",Rt,[e("label",Dt,[e("input",{type:"checkbox",checked:t.selectedNotes.includes(_.file),onChange:A=>$(_.file,A.target.checked)},null,40,Mt),e("span",At,T(_.title||_.file),1)])]),e("div",{class:"note-card-preview",title:_.preview||"暂无内容预览,点击编辑可查看完整内容。"},T(_.preview||"暂无内容预览,点击编辑可查看完整内容。"),9,xt),e("div",It,[e("span",Lt,T(k(re)(_.modified)),1),e("div",Ht,[e("button",{class:"btn-secondary btn-sm",onClick:A=>r.$emit("editNote",_)}," 编辑 ",8,Vt),e("button",{class:"btn-secondary btn-sm",onClick:A=>r.$emit("discoveryNote",_)}," 联想 ",8,Bt),e("button",{class:"btn-danger btn-sm",onClick:A=>r.$emit("deleteNote",_)}," 删除 ",8,Gt)])])]))),128))],4))),128))],4)],4)],36)):(c(!0),v(Q,{key:3},z(t.filteredNotes,n=>(c(),v("div",{key:n.file,class:"note-card card"},[e("div",Ot,[e("label",zt,[e("input",{type:"checkbox",checked:t.selectedNotes.includes(n.file),onChange:_=>$(n.file,_.target.checked)},null,40,Qt),e("span",Ut,T(n.title||n.file),1)])]),e("div",{class:"note-card-preview",title:n.preview||"暂无内容预览,点击编辑可查看完整内容。"},T(n.preview||"暂无内容预览,点击编辑可查看完整内容。"),9,Pt),e("div",Kt,[e("span",jt,T(k(re)(n.modified)),1),e("div",qt,[e("button",{class:"btn-secondary btn-sm",onClick:_=>r.$emit("editNote",n)}," 编辑 ",8,Wt),e("button",{class:"btn-secondary btn-sm",onClick:_=>r.$emit("discoveryNote",n)}," 联想 ",8,Yt),e("button",{class:"btn-danger btn-sm",onClick:_=>r.$emit("deleteNote",n)}," 删除 ",8,Jt)])])]))),128))],2)])):V("",!0)}}),ta=q(ea,[["__scopeId","data-v-86fa12d0"]]),aa={key:0,class:"rag-tags-config-area card"},sa={class:"rag-tags-header"},la={class:"rag-tags-title-row"},oa={class:"rag-tags-actions"},ra={class:"kb-entry"},na={class:"threshold-controls"},ia={class:"switch-container"},da={class:"switch"},ua=["checked"],ca=["value","disabled"],va={class:"threshold-value"},ga={class:"tags-container"},fa={key:0,class:"empty-tags-hint"},ha={class:"tag-index"},ma=["value","onInput"],ya=["aria-label","onClick"],pa={class:"add-tag-controls"},Ta={class:"tag-count"},$a={class:"rag-tags-controls"},ba=W({__name:"RagTagsConfig",props:{selectedFolder:{},ragTagsConfig:{},ragTagsStatus:{},ragTagsStatusType:{}},emits:["addCommonTags","clearAllTags","toggleThreshold","updateThreshold","addTag","updateTag","removeTag","saveRagTags"],setup(t,{emit:s}){const l=s;function m(g){const o=g.target;l("updateThreshold",Number(o.value))}function S(g,o){const b=o.target;l("updateTag",{index:g,value:b.value})}return(g,o)=>t.selectedFolder?(c(),v("div",aa,[e("div",sa,[e("div",la,[e("h3",null,"知识库标签列表 - "+T(t.selectedFolder),1),e("div",oa,[e("button",{class:"btn-secondary btn-sm",title:"添加常用标签",onClick:o[0]||(o[0]=b=>g.$emit("addCommonTags"))},[...o[5]||(o[5]=[e("span",{class:"material-symbols-outlined"},"add_reaction",-1),K(" 常用标签 ",-1)])]),e("button",{class:"btn-danger btn-sm",title:"清空所有标签",onClick:o[1]||(o[1]=b=>g.$emit("clearAllTags"))},[...o[6]||(o[6]=[e("span",{class:"material-symbols-outlined"},"delete_sweep",-1),K(" 清空全部 ",-1)])])])]),o[7]||(o[7]=e("p",{class:"rag-tags-hint"}," 点击标签可编辑,悬停显示删除按钮。支持拖拽排序(待实现) ",-1))]),e("div",ra,[e("div",na,[e("label",ia,[o[9]||(o[9]=e("span",null,"启用阈值:",-1)),e("label",da,[e("input",{checked:t.ragTagsConfig.thresholdEnabled,type:"checkbox",onChange:o[2]||(o[2]=b=>g.$emit("toggleThreshold"))},null,40,ua),o[8]||(o[8]=e("span",{class:"slider"},null,-1))])]),e("input",{value:t.ragTagsConfig.threshold,type:"range",min:"0.1",max:"1.0",step:"0.01",disabled:!t.ragTagsConfig.thresholdEnabled,onInput:m},null,40,ca),e("span",va,T(t.ragTagsConfig.threshold.toFixed(2)),1)]),e("div",ga,[t.ragTagsConfig.tags.length===0?(c(),v("div",fa,[...o[10]||(o[10]=[e("span",{class:"material-symbols-outlined"},"tag",-1),e("p",null,'暂无标签,点击上方"常用标签"或"添加标签"按钮添加',-1)])])):V("",!0),(c(!0),v(Q,null,z(t.ragTagsConfig.tags,(b,i)=>(c(),v("div",{key:`${b}-${i}`,class:"tag-item"},[e("span",ha,T(i+1),1),e("input",{value:t.ragTagsConfig.tags[i],class:"tag-input",type:"text",placeholder:"标签名称",onInput:N=>S(i,N)},null,40,ma),e("button",{class:"btn-delete-tag","aria-label":`删除标签 ${b}`,title:"删除此标签",onClick:N=>g.$emit("removeTag",i)},[...o[11]||(o[11]=[e("span",{class:"material-symbols-outlined"},"close",-1)])],8,ya)]))),128))]),e("div",pa,[e("button",{class:"btn-secondary btn-sm",onClick:o[3]||(o[3]=b=>g.$emit("addTag"))},[...o[12]||(o[12]=[e("span",{class:"material-symbols-outlined"},"add",-1),K(" 添加标签 ",-1)])]),e("span",Ta,"当前标签数:"+T(t.ragTagsConfig.tags.length),1)]),e("div",$a,[e("button",{class:"btn-primary",onClick:o[4]||(o[4]=b=>g.$emit("saveRagTags"))},[...o[13]||(o[13]=[e("span",{class:"material-symbols-outlined"},"save",-1),K(" 保存更改到 rag_tags.json ",-1)])]),t.ragTagsStatus?(c(),v("span",{key:0,class:j(["status-message",t.ragTagsStatusType])},T(t.ragTagsStatus),3)):V("",!0)])])])):V("",!0)}}),_a=q(ba,[["__scopeId","data-v-034d5709"]]),Na={class:"config-section active-section"},wa={class:"daily-notes-manager"},ka={class:"notes-main-area"},Ca=W({__name:"DailyNotesManager",setup(t){const s=Ie(),{folders:l,selectedFolder:m,filteredNotes:S,selectedNotes:g,moveTargetFolder:o,searchQuery:b,loadingNotes:i,ragTagsConfig:N,ragTagsStatus:F,ragTagsStatusType:w,notesStatus:R,notesStatusType:x}=Fe(s),D=h(null),G=h(!1),I=h(!1),M=h(""),E=h("info"),y=h(!1),u=h(null),p=h(null);let $=null,r=null;async function d(){return r||(r=(await Ee(()=>import("./easymde-BiwpWqxW.js").then(f=>$e(f.t(),1)),__vite__mapDeps([0,1,2]))).default,r)}async function n(f=""){I.value||(await le(),I.value=!0,$&&($.toTextArea(),$=null),p.value&&($=new(await d())({element:p.value,spellChecker:!1,status:["lines","words","cursor"],minHeight:"500px",maxHeight:"700px",placeholder:"编辑日记内容,支持 Markdown",toolbar:["bold","italic","strikethrough","heading","|","quote","unordered-list","ordered-list","|","link","image","table","horizontal-rule","|","code","preview","side-by-side","fullscreen","|","guide"],renderingConfig:{singleLineBreaks:!1,codeSyntaxHighlighting:!0}}),f&&$.value(f)),I.value=!1)}async function _(f){await s.setSelectedFolder(f)}function A(){s.filterNotes()}function Y(){s.onThresholdToggle()}function J(f){s.updateThreshold(f)}function X(){confirm(`确定要清空所有 ${N.value.tags.length} 个标签吗?此操作不可撤销。`)&&s.clearAllTags()}function Z(){s.addAllCommonTags()}function ee(){s.addTag()}function oe(f){s.updateTag(f)}function a(f){s.removeTag(f)}async function O(){await s.saveRagTags()}async function P(f){if(!m.value){H("请先选择一个知识库","error");return}try{const C=await s.getNoteContent(f.file);D.value={...f,content:C},await le(),await n(C)}catch(C){const L=C instanceof Error?C.message:String(C);M.value=`加载日记内容失败:${L}`,E.value="error",H(`加载日记内容失败:${L}`,"error")}}function ge(f){u.value={file:f.file,title:f.title},y.value=!0}async function fe(f,C){!f||!C||(f!==m.value&&await s.setSelectedFolder(f),await P(s.notes.find(L=>L.file===C)??{file:C,title:C.replace(/\.md$/i,""),modified:""}))}async function he(){if(!(!D.value||!m.value)){G.value=!0,M.value="正在保存...",E.value="info";try{const f=$?$.value():D.value.content;if(!await s.saveNoteContent(D.value.file,f||""))throw new Error("保存失败");M.value="日记已保存",E.value="success",H("日记已保存","success"),D.value=null,I.value=!1,$&&($.toTextArea(),$=null)}catch(f){M.value=`保存失败:${f instanceof Error?f.message:String(f)}`,E.value="error"}finally{G.value=!1}}}function me(){D.value=null,I.value=!1,$&&($.toTextArea(),$=null)}async function ye(f){confirm(`确定要删除日记 "${f.title||f.file}" 吗?`)&&await s.deleteNote(f.file)}async function pe(){confirm(`确定要删除选中的 ${g.value.length} 篇日记吗?`)&&await s.deleteSelectedNotesBatch()}async function Te(){await s.moveSelectedNotesBatch()}return ve(()=>{$&&($.toTextArea(),$=null)}),ce(()=>{s.init()}),(f,C)=>(c(),v("section",Na,[e("div",wa,[ae(Tt,{folders:k(l),"selected-folder":k(m),onSelectFolder:_},null,8,["folders","selected-folder"]),e("div",ka,[ae(_a,{"selected-folder":k(m),"rag-tags-config":k(N),"rag-tags-status":k(F),"rag-tags-status-type":k(w),onAddCommonTags:Z,onClearAllTags:X,onToggleThreshold:Y,onUpdateThreshold:J,onAddTag:ee,onUpdateTag:oe,onRemoveTag:a,onSaveRagTags:O},null,8,["selected-folder","rag-tags-config","rag-tags-status","rag-tags-status-type"]),D.value?V("",!0):(c(),we(ta,{key:0,"selected-folder":k(m),folders:k(l),"filtered-notes":k(S),"selected-notes":k(g),"move-target-folder":k(o),"search-query":k(b),"loading-notes":k(i),"notes-status":k(R),"notes-status-type":k(x),"onUpdate:searchQuery":C[0]||(C[0]=L=>b.value=L),onFilterNotes:A,onMoveSelectedNotes:Te,"onUpdate:moveTargetFolder":C[1]||(C[1]=L=>o.value=L),onDeleteSelectedNotes:pe,"onUpdate:selectedNotes":C[2]||(C[2]=L=>g.value=L),onEditNote:P,onDeleteNote:ye,onDiscoveryNote:ge},null,8,["selected-folder","folders","filtered-notes","selected-notes","move-target-folder","search-query","loading-notes","notes-status","notes-status-type"])),ae(Ue,{"editing-note":D.value,"saving-note":G.value,"editor-status":M.value,"editor-status-type":E.value,onSaveNote:he,onCancelEdit:me},{"editor-textarea":be(()=>[e("textarea",{ref_key:"markdownEditorRef",ref:p,class:"note-content-editor",spellcheck:"false",rows:"20",placeholder:"编辑日记内容…"},null,512)]),_:1},8,["editing-note","saving-note","editor-status","editor-status-type"])])]),ae(ft,{modelValue:y.value,"onUpdate:modelValue":C[3]||(C[3]=L=>y.value=L),"source-note":u.value,"selected-folder":k(m),onOpenNote:fe},null,8,["modelValue","source-note","selected-folder"])]))}}),xa=q(Ca,[["__scopeId","data-v-08a822ed"]]);export{xa as default}; +import{i as $e}from"./rolldown-runtime-DmMX61E0.js";import{Dt as T,E as le,Et as te,H as be,N as z,O as ce,P as _e,Q as h,U as Ne,V as se,a as Q,at as k,c as U,d as V,f as v,g as ae,h as K,j as c,k as ve,l as e,n as q,u as we,v as W,wt as j}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as ke,d as Ce}from"./dashboard-card-news-BnyB_dHU.js";import{G as H,J as Se,U as Ee,X as Fe,j as B,s as re}from"./dashboard-card-calendar-DWuV34Bn.js";import"./easymde-BiwpWqxW.js";import{t as Re}from"./useVirtualScroll-DdYyc53Y.js";import{t as De}from"./useDebounceFn-X8Lyvegv.js";var ne={thresholdEnabled:!1,threshold:.7,tags:[]},Me=["任务闭环","社区贡献","逻辑共鸣","架构讨论","性能优化","Bug 修复","功能请求","用户反馈","版本发布","技术债务","文档更新","测试覆盖","代码审查","安全加固","用户体验"];function Ae(t,s){if(!s)return[...t];const l=s.toLowerCase();return t.filter(m=>m.title?.toLowerCase().includes(l)||m.file.toLowerCase().includes(l))}function xe(t){const s=new Set(t.map(l=>l.trim().toLowerCase()).filter(Boolean));return Me.filter(l=>!s.has(l.toLowerCase()))}var Ie=Se("diary",()=>{const t=h([]),s=h(""),l=h([]),m=U(()=>Ae(l.value,o.value)),S=h([]),g=h(""),o=h(""),b=h(!1),i=h({...ne}),N=h(""),F=h("info"),w=h(""),R=h("info");function x(){i.value={...ne}}function D(a){o.value=a}function G(){}async function I(){try{t.value=(await B.getFolders()).map(a=>a.name),t.value.length>0?await M(s.value&&t.value.includes(s.value)?s.value:t.value[0]):(s.value="",l.value=[],x())}catch(a){H(`加载知识库列表失败:${a instanceof Error?a.message:String(a)}`,"error"),t.value=[]}}async function M(a){s.value=a,S.value=[],g.value="",await Promise.all([E(),y()])}async function E(){if(s.value){b.value=!0;try{l.value=(await B.getDiaryList({folder:s.value})).notes.map(a=>({file:a.file,title:a.title,modified:a.modified,preview:a.preview}))}catch(a){w.value=`加载日记列表失败:${a instanceof Error?a.message:String(a)}`,R.value="error",l.value=[]}finally{b.value=!1}}}async function y(){if(s.value)try{i.value=await B.getRagTagsConfig(s.value)}catch(a){H(`加载 RAG 标签失败:${a instanceof Error?a.message:String(a)}`,"error")}}function u(){i.value.thresholdEnabled||(i.value.threshold=.7)}function p(a){i.value.threshold=a}function $(){if(i.value.tags.length===0){H("当前没有标签","info");return}i.value.tags=[],H("已清空所有标签","success")}function r(){const a=xe(i.value.tags);if(a.length===0){H("所有常用标签已存在","info");return}i.value.tags.push(...a),H(`已添加 ${a.length} 个常用标签`,"success")}function d(){i.value.tags.push("")}function n(a){a.index<0||a.index>=i.value.tags.length||(i.value.tags[a.index]=a.value)}function _(a){i.value.tags.splice(a,1)}async function A(){if(!s.value)return!1;try{const a={tags:i.value.tags.filter(O=>O.trim())};return i.value.thresholdEnabled&&(a.threshold=i.value.threshold),await B.saveRagTagsConfig(s.value,{thresholdEnabled:i.value.thresholdEnabled,threshold:i.value.threshold,tags:a.tags},{loadingKey:"diary.rag-tags.save"}),N.value="RAG 标签已保存!",F.value="success",H("RAG 标签已保存!","success"),!0}catch(a){return N.value=`保存失败:${a instanceof Error?a.message:String(a)}`,F.value="error",!1}}async function Y(a){if(!s.value)throw new Error("请先选择一个知识库");return B.getDiaryContent(`${s.value}/${a}`)}async function J(a,O){if(!s.value)return!1;try{return await B.saveDiary(`${s.value}/${a}`,O,{loadingKey:"diary.note.save"}),H("日记已保存!","success"),await E(),!0}catch(P){return w.value=`保存失败:${P instanceof Error?P.message:String(P)}`,R.value="error",!1}}async function X(a){if(!s.value)return!1;try{return await B.deleteDiary([`${s.value}/${a}`],{loadingKey:"diary.note.delete"}),w.value="日记已删除",R.value="success",await E(),!0}catch(O){return w.value=`删除失败:${O instanceof Error?O.message:String(O)}`,R.value="error",!1}}async function Z(){if(!s.value||S.value.length===0)return!1;try{return await B.deleteDiary(S.value.map(a=>`${s.value}/${a}`),{loadingKey:"diary.notes.batch-delete"}),w.value="已批量删除选中的日记",R.value="success",S.value=[],await E(),!0}catch(a){return w.value=`批量删除失败:${a instanceof Error?a.message:String(a)}`,R.value="error",!1}}async function ee(){if(!s.value||!g.value||S.value.length===0)return!1;try{return await B.moveDiaries(S.value.map(a=>({folder:s.value,file:a})),g.value,{loadingKey:"diary.notes.batch-move"}),w.value=`已移动 ${S.value.length} 篇日记到 ${g.value}`,R.value="success",S.value=[],g.value="",await E(),!0}catch(a){return w.value=`移动失败:${a instanceof Error?a.message:String(a)}`,R.value="error",!1}}async function oe(){await I()}return{folders:t,selectedFolder:s,notes:l,filteredNotes:m,selectedNotes:S,moveTargetFolder:g,searchQuery:o,loadingNotes:b,ragTagsConfig:i,ragTagsStatus:N,ragTagsStatusType:F,notesStatus:w,notesStatusType:R,init:oe,setSearchQuery:D,filterNotes:G,loadFolders:I,setSelectedFolder:M,loadNotes:E,loadRagTags:y,onThresholdToggle:u,updateThreshold:p,clearAllTags:$,addAllCommonTags:r,addTag:d,updateTag:n,removeTag:_,saveRagTags:A,getNoteContent:Y,saveNoteContent:J,deleteNote:X,deleteSelectedNotesBatch:Z,moveSelectedNotesBatch:ee}}),Le={key:0,class:"note-editor-area card"},He={class:"editor-header"},Ve={class:"editor-title-section"},Be={class:"editor-actions"},Ge=["disabled"],Oe=["disabled"],ze={class:"markdown-editor-wrapper"},Qe=W({__name:"DiaryEditor",props:{editingNote:{},savingNote:{type:Boolean},editorStatus:{},editorStatusType:{}},emits:["saveNote","cancelEdit"],setup(t){return(s,l)=>t.editingNote?(c(),v("div",Le,[e("div",He,[e("div",Ve,[e("button",{class:"btn-secondary btn-back","aria-label":"返回日记列表",onClick:l[0]||(l[0]=m=>s.$emit("cancelEdit"))},[...l[3]||(l[3]=[e("span",{class:"material-symbols-outlined"},"arrow_back",-1)])]),e("h3",null,"编辑日记:"+T(t.editingNote.file),1)]),e("div",Be,[e("button",{class:"btn-primary",disabled:t.savingNote,onClick:l[1]||(l[1]=m=>s.$emit("saveNote"))},T(t.savingNote?"保存中…":"保存日记"),9,Ge),e("button",{class:"btn-secondary",disabled:t.savingNote,onClick:l[2]||(l[2]=m=>s.$emit("cancelEdit"))}," 取消编辑 ",8,Oe),t.editorStatus?(c(),v("span",{key:0,class:j(["status-message",t.editorStatusType])},T(t.editorStatus),3)):V("",!0)])]),e("div",ze,[_e(s.$slots,"editor-textarea",{},void 0,!0)])])):V("",!0)}}),Ue=q(Qe,[["__scopeId","data-v-d507e63b"]]),Pe={class:"modal-header"},Ke={class:"modal-body"},je={class:"discovery-config"},qe={class:"config-row"},We={class:"k-slider-container"},Ye={class:"k-value-display"},Je={class:"config-row"},Xe={class:"folder-chips-container"},Ze=["onClick"],et={key:0,class:"loading-state"},tt={key:1,class:"warning-message"},at={key:2,class:"discovery-results-list"},st=["onClick"],lt={class:"result-header"},ot={class:"result-filename"},rt={class:"result-score-tag"},nt={class:"result-score-bar-container"},it={class:"result-tags"},dt={class:"result-preview"},ut={key:3,class:"no-results"},ct={class:"modal-footer"},vt=["disabled"],gt=W({__name:"DiscoveryModal",props:{modelValue:{type:Boolean},sourceNote:{},selectedFolder:{}},emits:["update:modelValue","openNote"],setup(t,{emit:s}){const l=t,m=s,S=h([]),g=h([]),o=h(50),b=h("50"),i=h(!1),N=h(""),F=h([]),w=h(!1),R=U(()=>l.sourceNote?.title||l.sourceNote?.file||"");async function x(){try{S.value=(await B.getFolders()).map(y=>y.name),l.selectedFolder&&(g.value=[l.selectedFolder])}catch(y){console.error("Failed to load folders:",y)}}function D(){b.value=String(o.value)}function G(y){const u=g.value.indexOf(y);u>-1?g.value.splice(u,1):g.value.push(y)}async function I(){if(l.sourceNote){i.value=!0,N.value="",F.value=[],w.value=!1;try{const y=await B.associativeDiscovery({sourceFilePath:`${l.selectedFolder}/${l.sourceNote.file}`,k:o.value,range:g.value,tagBoost:.15});y.warning&&(N.value=y.warning),y.results&&y.results.length>0&&(F.value=y.results.map(u=>({...u,scorePercent:Math.min(Math.round(u.score*100),100),preview:Array.isArray(u.chunks)?u.chunks.map(p=>p.substring(0,100)).join(" ... "):""}))),w.value=!0}catch(y){H(`联想失败:${y instanceof Error?y.message:String(y)}`,"error")}finally{i.value=!1}}}function M(y){const u=y.path.split(/[/\\]/),p=u[0],$=u[u.length-1];m("openNote",p,$),E()}function E(){m("update:modelValue",!1)}return se(()=>l.modelValue,y=>{y&&(x(),F.value=[],w.value=!1,N.value="")}),(y,u)=>t.modelValue?(c(),v("div",{key:0,class:"modal-overlay",onClick:E},[e("div",{class:"modal-content discovery-modal",onClick:u[1]||(u[1]=Ce(()=>{},["stop"]))},[e("div",Pe,[e("h3",null,"联想追溯:"+T(R.value),1),e("button",{class:"modal-close",onClick:E},[...u[2]||(u[2]=[e("span",{class:"material-symbols-outlined"},"close",-1)])])]),e("div",Ke,[e("div",je,[e("div",qe,[u[3]||(u[3]=e("label",null,"K 值(返回数量):",-1)),e("div",We,[Ne(e("input",{type:"range",min:"1",max:"200","onUpdate:modelValue":u[0]||(u[0]=p=>o.value=p),onInput:D},null,544),[[ke,o.value,void 0,{number:!0}]]),e("span",Ye,T(b.value),1)])]),e("div",Je,[u[4]||(u[4]=e("label",null,"搜索范围:",-1)),e("div",Xe,[(c(!0),v(Q,null,z(S.value,p=>(c(),v("div",{key:p,class:j(["folder-chip",{active:g.value.includes(p)}]),onClick:$=>G(p)},T(p),11,Ze))),128))])])]),i.value?(c(),v("div",et,[...u[5]||(u[5]=[e("span",{class:"loading-spinner"},null,-1),e("p",null,"正在进行联想追溯…",-1)])])):V("",!0),N.value?(c(),v("div",tt,[u[6]||(u[6]=e("span",{class:"material-symbols-outlined"},"warning",-1)),K(" "+T(N.value),1)])):V("",!0),F.value.length>0?(c(),v("div",at,[(c(!0),v(Q,null,z(F.value,(p,$)=>(c(),v("div",{key:p.path||`${p.name}-${$}`,class:"discovery-result-card",onClick:r=>M(p)},[e("div",lt,[e("span",ot,T(p.name),1),e("span",rt,"匹配度:"+T(p.scorePercent)+"%",1)]),e("div",nt,[e("div",{class:"result-score-bar",style:te({width:p.scorePercent+"%"})},null,4)]),e("div",it,[(c(!0),v(Q,null,z(p.matchedTags?.slice(0,5),(r,d)=>(c(),v("span",{key:`${r}-${d}`,class:"result-tag"}," #"+T(r),1))),128))]),e("div",dt,T(p.preview),1)],8,st))),128))])):!i.value&&w.value?(c(),v("div",ut,[...u[7]||(u[7]=[e("span",{class:"material-symbols-outlined"},"search_off",-1),e("p",null,"未发现相关的记忆节点。",-1)])])):V("",!0)]),e("div",ct,[e("button",{class:"btn-primary",onClick:I,disabled:i.value},[...u[8]||(u[8]=[e("span",{class:"material-symbols-outlined"},"psychology",-1),K(" 开始联想 ",-1)])],8,vt)])])])):V("",!0)}}),ft=q(gt,[["__scopeId","data-v-74606b29"]]),ht={class:"notes-sidebar"},mt={id:"notes-folder-list"},yt=["onClick"],pt=W({__name:"FolderList",props:{folders:{},selectedFolder:{}},emits:["selectFolder"],setup(t){return(s,l)=>(c(),v("div",ht,[l[0]||(l[0]=e("h3",null,"知识库列表",-1)),e("ul",mt,[(c(!0),v(Q,null,z(t.folders,m=>(c(),v("li",{key:m,class:j({active:t.selectedFolder===m}),onClick:S=>s.$emit("selectFolder",m)},T(m),11,yt))),128))])]))}}),Tt=q(pt,[["__scopeId","data-v-f92df64a"]]),$t={key:0,class:"notes-content-area"},bt={class:"notes-toolbar"},_t=["value"],Nt=["disabled"],wt=["value","disabled"],kt=["value","disabled"],Ct=["disabled"],St={key:0,class:"loading-state"},Et={key:1,class:"empty-state"},Ft={class:"empty-hint"},Rt={class:"note-card-header"},Dt={class:"note-select-label"},Mt=["checked","onChange"],At={class:"note-title"},xt=["title"],It={class:"note-card-footer"},Lt={class:"note-meta"},Ht={class:"note-actions"},Vt=["onClick"],Bt=["onClick"],Gt=["onClick"],Ot={class:"note-card-header"},zt={class:"note-select-label"},Qt=["checked","onChange"],Ut={class:"note-title"},Pt=["title"],Kt={class:"note-card-footer"},jt={class:"note-meta"},qt={class:"note-actions"},Wt=["onClick"],Yt=["onClick"],Jt=["onClick"],Xt=280,ie=12,Zt=242,de=24,ue=320,ea=W({__name:"NoteList",props:{selectedFolder:{},folders:{},filteredNotes:{},selectedNotes:{},moveTargetFolder:{},searchQuery:{},loadingNotes:{type:Boolean},notesStatus:{},notesStatusType:{}},emits:["update:searchQuery","filterNotes","moveSelectedNotes","update:moveTargetFolder","deleteSelectedNotes","update:selectedNotes","editNote","deleteNote","discoveryNote"],setup(t,{emit:s}){const l=t,m=s,S=De((...r)=>{const d=r[0];m("update:searchQuery",d),m("filterNotes")},{delay:300}),g=U(()=>l.filteredNotes.length>50),o=U(()=>l.filteredNotes.length>1200?16:10),b=h(640),i=h(null),N=h(null),F=h(1);let w=null;const R=U(()=>{const r=Math.max(1,F.value),d=[];for(let n=0;n0&&(F.value=Math.max(1,Math.floor((d+ie)/(Xt+ie))))}const{onScroll:D,setScrollTop:G,visibleItems:I,totalHeight:M,offsetY:E}=Re(U(()=>R.value),{itemHeight:Zt,containerHeight:U(()=>b.value),overscan:U(()=>o.value)});function y(r){D(r);const d=r.target,n=Math.max(0,d.scrollHeight-d.clientHeight);d.scrollTop>n&&(d.scrollTop=n)}se(()=>l.searchQuery,()=>{G(0),N.value&&(N.value.scrollTop=0)}),se(()=>l.filteredNotes.length,()=>{if(le(x),!g.value||!N.value)return;const r=Math.max(0,M.value-b.value),d=Math.min(N.value.scrollTop,r);N.value.scrollTop=d,G(d)}),se(()=>g.value,r=>{r&&le(x)},{immediate:!0}),ce(()=>{x(),window.addEventListener("resize",x),typeof ResizeObserver<"u"&&(w=new ResizeObserver(()=>x()),i.value&&w.observe(i.value))}),ve(()=>{window.removeEventListener("resize",x),w&&(w.disconnect(),w=null)});function u(r){const d=r.target.value;S(d)}function p(r){const d=r.target.value;m("update:moveTargetFolder",d)}function $(r,d){if(d){l.selectedNotes.includes(r)||m("update:selectedNotes",[...l.selectedNotes,r]);return}m("update:selectedNotes",l.selectedNotes.filter(n=>n!==r))}return(r,d)=>t.selectedFolder?(c(),v("div",$t,[e("div",bt,[e("input",{type:"search",value:t.searchQuery,placeholder:"搜索日记…",autocomplete:"off","aria-label":"搜索日记",onInput:u},null,40,_t),e("button",{class:"btn-secondary",disabled:t.selectedNotes.length===0,onClick:d[0]||(d[0]=n=>r.$emit("moveSelectedNotes"))}," 移动选中项到… ",8,Nt),e("select",{value:t.moveTargetFolder,disabled:t.selectedNotes.length===0,onChange:p},[d[2]||(d[2]=e("option",{value:""},"选择目标知识库…",-1)),(c(!0),v(Q,null,z(t.folders,n=>(c(),v("option",{key:n,value:n,disabled:n===t.selectedFolder},T(n),9,kt))),128))],40,wt),e("button",{class:"btn-danger",disabled:t.selectedNotes.length===0,onClick:d[1]||(d[1]=n=>r.$emit("deleteSelectedNotes"))}," 批量删除选中项 ",8,Ct),t.notesStatus?(c(),v("span",{key:0,class:j(["status-message",t.notesStatusType])},T(t.notesStatus),3)):V("",!0)]),e("div",{id:"notes-list-view",ref_key:"notesContainerRef",ref:i,class:j(["notes-list-view",{"is-virtualized-host":g.value&&!t.loadingNotes&&t.filteredNotes.length>0}])},[t.loadingNotes?(c(),v("div",St,[...d[3]||(d[3]=[e("span",{class:"loading-spinner"},null,-1),e("p",null,"正在加载日记…",-1)])])):t.filteredNotes.length===0?(c(),v("div",Et,[d[4]||(d[4]=e("span",{class:"material-symbols-outlined empty-state-icon"},"article",-1)),e("p",null,T(t.searchQuery?"没有找到匹配的日记":"暂无日记"),1),e("p",Ft,T(t.searchQuery?"尝试调整搜索关键词":"当添加日记后,它们将显示在这里"),1)])):g.value?(c(),v("div",{key:2,ref_key:"virtualListRef",ref:N,class:"notes-list-view virtualized",style:te({height:`${b.value}px`}),onScroll:y},[e("div",{class:"virtual-scroll-spacer",style:te({height:`${k(M)}px`})},[e("div",{class:"virtual-scroll-content",style:te({transform:`translateY(${k(E)}px)`})},[(c(!0),v(Q,null,z(k(I),n=>(c(),v("div",{key:n.index,class:"virtual-note-row",style:te({gridTemplateColumns:`repeat(${F.value}, minmax(0, 1fr))`})},[(c(!0),v(Q,null,z(n.item,_=>(c(),v("div",{key:_.file,class:"note-card card virtual-card"},[e("div",Rt,[e("label",Dt,[e("input",{type:"checkbox",checked:t.selectedNotes.includes(_.file),onChange:A=>$(_.file,A.target.checked)},null,40,Mt),e("span",At,T(_.title||_.file),1)])]),e("div",{class:"note-card-preview",title:_.preview||"暂无内容预览,点击编辑可查看完整内容。"},T(_.preview||"暂无内容预览,点击编辑可查看完整内容。"),9,xt),e("div",It,[e("span",Lt,T(k(re)(_.modified)),1),e("div",Ht,[e("button",{class:"btn-secondary btn-sm",onClick:A=>r.$emit("editNote",_)}," 编辑 ",8,Vt),e("button",{class:"btn-secondary btn-sm",onClick:A=>r.$emit("discoveryNote",_)}," 联想 ",8,Bt),e("button",{class:"btn-danger btn-sm",onClick:A=>r.$emit("deleteNote",_)}," 删除 ",8,Gt)])])]))),128))],4))),128))],4)],4)],36)):(c(!0),v(Q,{key:3},z(t.filteredNotes,n=>(c(),v("div",{key:n.file,class:"note-card card"},[e("div",Ot,[e("label",zt,[e("input",{type:"checkbox",checked:t.selectedNotes.includes(n.file),onChange:_=>$(n.file,_.target.checked)},null,40,Qt),e("span",Ut,T(n.title||n.file),1)])]),e("div",{class:"note-card-preview",title:n.preview||"暂无内容预览,点击编辑可查看完整内容。"},T(n.preview||"暂无内容预览,点击编辑可查看完整内容。"),9,Pt),e("div",Kt,[e("span",jt,T(k(re)(n.modified)),1),e("div",qt,[e("button",{class:"btn-secondary btn-sm",onClick:_=>r.$emit("editNote",n)}," 编辑 ",8,Wt),e("button",{class:"btn-secondary btn-sm",onClick:_=>r.$emit("discoveryNote",n)}," 联想 ",8,Yt),e("button",{class:"btn-danger btn-sm",onClick:_=>r.$emit("deleteNote",n)}," 删除 ",8,Jt)])])]))),128))],2)])):V("",!0)}}),ta=q(ea,[["__scopeId","data-v-86fa12d0"]]),aa={key:0,class:"rag-tags-config-area card"},sa={class:"rag-tags-header"},la={class:"rag-tags-title-row"},oa={class:"rag-tags-actions"},ra={class:"kb-entry"},na={class:"threshold-controls"},ia={class:"switch-container"},da={class:"switch"},ua=["checked"],ca=["value","disabled"],va={class:"threshold-value"},ga={class:"tags-container"},fa={key:0,class:"empty-tags-hint"},ha={class:"tag-index"},ma=["value","onInput"],ya=["aria-label","onClick"],pa={class:"add-tag-controls"},Ta={class:"tag-count"},$a={class:"rag-tags-controls"},ba=W({__name:"RagTagsConfig",props:{selectedFolder:{},ragTagsConfig:{},ragTagsStatus:{},ragTagsStatusType:{}},emits:["addCommonTags","clearAllTags","toggleThreshold","updateThreshold","addTag","updateTag","removeTag","saveRagTags"],setup(t,{emit:s}){const l=s;function m(g){const o=g.target;l("updateThreshold",Number(o.value))}function S(g,o){const b=o.target;l("updateTag",{index:g,value:b.value})}return(g,o)=>t.selectedFolder?(c(),v("div",aa,[e("div",sa,[e("div",la,[e("h3",null,"知识库标签列表 - "+T(t.selectedFolder),1),e("div",oa,[e("button",{class:"btn-secondary btn-sm",title:"添加常用标签",onClick:o[0]||(o[0]=b=>g.$emit("addCommonTags"))},[...o[5]||(o[5]=[e("span",{class:"material-symbols-outlined"},"add_reaction",-1),K(" 常用标签 ",-1)])]),e("button",{class:"btn-danger btn-sm",title:"清空所有标签",onClick:o[1]||(o[1]=b=>g.$emit("clearAllTags"))},[...o[6]||(o[6]=[e("span",{class:"material-symbols-outlined"},"delete_sweep",-1),K(" 清空全部 ",-1)])])])]),o[7]||(o[7]=e("p",{class:"rag-tags-hint"}," 点击标签可编辑,悬停显示删除按钮。支持拖拽排序(待实现) ",-1))]),e("div",ra,[e("div",na,[e("label",ia,[o[9]||(o[9]=e("span",null,"启用阈值:",-1)),e("label",da,[e("input",{checked:t.ragTagsConfig.thresholdEnabled,type:"checkbox",onChange:o[2]||(o[2]=b=>g.$emit("toggleThreshold"))},null,40,ua),o[8]||(o[8]=e("span",{class:"slider"},null,-1))])]),e("input",{value:t.ragTagsConfig.threshold,type:"range",min:"0.1",max:"1.0",step:"0.01",disabled:!t.ragTagsConfig.thresholdEnabled,onInput:m},null,40,ca),e("span",va,T(t.ragTagsConfig.threshold.toFixed(2)),1)]),e("div",ga,[t.ragTagsConfig.tags.length===0?(c(),v("div",fa,[...o[10]||(o[10]=[e("span",{class:"material-symbols-outlined"},"tag",-1),e("p",null,'暂无标签,点击上方"常用标签"或"添加标签"按钮添加',-1)])])):V("",!0),(c(!0),v(Q,null,z(t.ragTagsConfig.tags,(b,i)=>(c(),v("div",{key:`${b}-${i}`,class:"tag-item"},[e("span",ha,T(i+1),1),e("input",{value:t.ragTagsConfig.tags[i],class:"tag-input",type:"text",placeholder:"标签名称",onInput:N=>S(i,N)},null,40,ma),e("button",{class:"btn-delete-tag","aria-label":`删除标签 ${b}`,title:"删除此标签",onClick:N=>g.$emit("removeTag",i)},[...o[11]||(o[11]=[e("span",{class:"material-symbols-outlined"},"close",-1)])],8,ya)]))),128))]),e("div",pa,[e("button",{class:"btn-secondary btn-sm",onClick:o[3]||(o[3]=b=>g.$emit("addTag"))},[...o[12]||(o[12]=[e("span",{class:"material-symbols-outlined"},"add",-1),K(" 添加标签 ",-1)])]),e("span",Ta,"当前标签数:"+T(t.ragTagsConfig.tags.length),1)]),e("div",$a,[e("button",{class:"btn-primary",onClick:o[4]||(o[4]=b=>g.$emit("saveRagTags"))},[...o[13]||(o[13]=[e("span",{class:"material-symbols-outlined"},"save",-1),K(" 保存更改到 rag_tags.json ",-1)])]),t.ragTagsStatus?(c(),v("span",{key:0,class:j(["status-message",t.ragTagsStatusType])},T(t.ragTagsStatus),3)):V("",!0)])])])):V("",!0)}}),_a=q(ba,[["__scopeId","data-v-034d5709"]]),Na={class:"config-section active-section"},wa={class:"daily-notes-manager"},ka={class:"notes-main-area"},Ca=W({__name:"DailyNotesManager",setup(t){const s=Ie(),{folders:l,selectedFolder:m,filteredNotes:S,selectedNotes:g,moveTargetFolder:o,searchQuery:b,loadingNotes:i,ragTagsConfig:N,ragTagsStatus:F,ragTagsStatusType:w,notesStatus:R,notesStatusType:x}=Fe(s),D=h(null),G=h(!1),I=h(!1),M=h(""),E=h("info"),y=h(!1),u=h(null),p=h(null);let $=null,r=null;async function d(){return r||(r=(await Ee(()=>import("./easymde-BiwpWqxW.js").then(f=>$e(f.t(),1)),__vite__mapDeps([0,1,2]))).default,r)}async function n(f=""){I.value||(await le(),I.value=!0,$&&($.toTextArea(),$=null),p.value&&($=new(await d())({element:p.value,spellChecker:!1,status:["lines","words","cursor"],minHeight:"500px",maxHeight:"700px",placeholder:"编辑日记内容,支持 Markdown",toolbar:["bold","italic","strikethrough","heading","|","quote","unordered-list","ordered-list","|","link","image","table","horizontal-rule","|","code","preview","side-by-side","fullscreen","|","guide"],renderingConfig:{singleLineBreaks:!1,codeSyntaxHighlighting:!0}}),f&&$.value(f)),I.value=!1)}async function _(f){await s.setSelectedFolder(f)}function A(){s.filterNotes()}function Y(){s.onThresholdToggle()}function J(f){s.updateThreshold(f)}function X(){confirm(`确定要清空所有 ${N.value.tags.length} 个标签吗?此操作不可撤销。`)&&s.clearAllTags()}function Z(){s.addAllCommonTags()}function ee(){s.addTag()}function oe(f){s.updateTag(f)}function a(f){s.removeTag(f)}async function O(){await s.saveRagTags()}async function P(f){if(!m.value){H("请先选择一个知识库","error");return}try{const C=await s.getNoteContent(f.file);D.value={...f,content:C},await le(),await n(C)}catch(C){const L=C instanceof Error?C.message:String(C);M.value=`加载日记内容失败:${L}`,E.value="error",H(`加载日记内容失败:${L}`,"error")}}function ge(f){u.value={file:f.file,title:f.title},y.value=!0}async function fe(f,C){!f||!C||(f!==m.value&&await s.setSelectedFolder(f),await P(s.notes.find(L=>L.file===C)??{file:C,title:C.replace(/\.md$/i,""),modified:""}))}async function he(){if(!(!D.value||!m.value)){G.value=!0,M.value="正在保存...",E.value="info";try{const f=$?$.value():D.value.content;if(!await s.saveNoteContent(D.value.file,f||""))throw new Error("保存失败");M.value="日记已保存",E.value="success",H("日记已保存","success"),D.value=null,I.value=!1,$&&($.toTextArea(),$=null)}catch(f){M.value=`保存失败:${f instanceof Error?f.message:String(f)}`,E.value="error"}finally{G.value=!1}}}function me(){D.value=null,I.value=!1,$&&($.toTextArea(),$=null)}async function ye(f){confirm(`确定要删除日记 "${f.title||f.file}" 吗?`)&&await s.deleteNote(f.file)}async function pe(){confirm(`确定要删除选中的 ${g.value.length} 篇日记吗?`)&&await s.deleteSelectedNotesBatch()}async function Te(){await s.moveSelectedNotesBatch()}return ve(()=>{$&&($.toTextArea(),$=null)}),ce(()=>{s.init()}),(f,C)=>(c(),v("section",Na,[e("div",wa,[ae(Tt,{folders:k(l),"selected-folder":k(m),onSelectFolder:_},null,8,["folders","selected-folder"]),e("div",ka,[ae(_a,{"selected-folder":k(m),"rag-tags-config":k(N),"rag-tags-status":k(F),"rag-tags-status-type":k(w),onAddCommonTags:Z,onClearAllTags:X,onToggleThreshold:Y,onUpdateThreshold:J,onAddTag:ee,onUpdateTag:oe,onRemoveTag:a,onSaveRagTags:O},null,8,["selected-folder","rag-tags-config","rag-tags-status","rag-tags-status-type"]),D.value?V("",!0):(c(),we(ta,{key:0,"selected-folder":k(m),folders:k(l),"filtered-notes":k(S),"selected-notes":k(g),"move-target-folder":k(o),"search-query":k(b),"loading-notes":k(i),"notes-status":k(R),"notes-status-type":k(x),"onUpdate:searchQuery":C[0]||(C[0]=L=>b.value=L),onFilterNotes:A,onMoveSelectedNotes:Te,"onUpdate:moveTargetFolder":C[1]||(C[1]=L=>o.value=L),onDeleteSelectedNotes:pe,"onUpdate:selectedNotes":C[2]||(C[2]=L=>g.value=L),onEditNote:P,onDeleteNote:ye,onDiscoveryNote:ge},null,8,["selected-folder","folders","filtered-notes","selected-notes","move-target-folder","search-query","loading-notes","notes-status","notes-status-type"])),ae(Ue,{"editing-note":D.value,"saving-note":G.value,"editor-status":M.value,"editor-status-type":E.value,onSaveNote:he,onCancelEdit:me},{"editor-textarea":be(()=>[e("textarea",{ref_key:"markdownEditorRef",ref:p,class:"note-content-editor",spellcheck:"false",rows:"20",placeholder:"编辑日记内容…"},null,512)]),_:1},8,["editing-note","saving-note","editor-status","editor-status-type"])])]),ae(ft,{modelValue:y.value,"onUpdate:modelValue":C[3]||(C[3]=L=>y.value=L),"source-note":u.value,"selected-folder":k(m),onOpenNote:fe},null,8,["modelValue","source-note","selected-folder"])]))}}),xa=q(Ca,[["__scopeId","data-v-08a822ed"]]);export{xa as default}; diff --git a/AdminPanel-Vue/dist/assets/js/Dashboard-GzJ_ujzh.js b/AdminPanel-Vue/dist/assets/js/Dashboard-JKAcrJUD.js similarity index 98% rename from AdminPanel-Vue/dist/assets/js/Dashboard-GzJ_ujzh.js rename to AdminPanel-Vue/dist/assets/js/Dashboard-JKAcrJUD.js index 125380719..682764148 100644 --- a/AdminPanel-Vue/dist/assets/js/Dashboard-GzJ_ujzh.js +++ b/AdminPanel-Vue/dist/assets/js/Dashboard-JKAcrJUD.js @@ -1,5 +1,5 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/dashboard-card-weather-DlDT7qmx.js","assets/js/dashboard-card-activitychart-CjJ1Boi_.js","assets/js/rolldown-runtime-DmMX61E0.js","assets/css/dashboard-card-activitychart-YGnIvisH.css","assets/css/dashboard-card-weather-C4ozCzjZ.css","assets/js/dashboard-card-newapimonitor-Ct3qz53I.js","assets/css/dashboard-card-newapimonitor-OGmpBE0r.css","assets/js/dashboard-card-cpu-B6CjyXAf.js","assets/css/dashboard-card-cpu-CIR751YT.css","assets/js/dashboard-card-memory-LB2NB56p.js","assets/css/dashboard-card-memory-BDPzjRlb.css","assets/js/dashboard-card-process-g3ndLELy.js","assets/css/dashboard-card-process-kTKbEopV.css","assets/js/dashboard-card-news-BnyB_dHU.js","assets/css/dashboard-card-news-Dgf8YUcC.css","assets/js/dashboard-card-nodeinfo-BLPpobjK.js","assets/css/dashboard-card-nodeinfo-X3MDAYOY.css","assets/js/dashboard-card-calendar-CA3-tSpi.js","assets/css/dashboard-card-calendar-CgD3w8x7.css"])))=>i.map(i=>d[i]); -import{D as pt,Dt as he,Et as mt,H as ft,L as ot,N as vt,O as rt,Q as m,T as yt,Tt as ht,V as ie,_ as q,a as gt,at as ne,c as b,d as st,et as bt,f as Z,g as Ke,h as It,it as Ct,j as x,k as it,l as C,n as lt,u as ge,v as Oe,wt,y as _t}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{r as St}from"./dashboard-card-news-BnyB_dHU.js";import{A as ve,N as Et,O as Tt,P as At,S as Pt,U as J,Y as Mt,k as Lt,n as zt}from"./dashboard-card-calendar-CA3-tSpi.js";import{a as kt,i as et,r as Dt,t as xt}from"./dashboard-components-LHqMn0M5.js";import{t as Pe}from"./usePolling-CJCCePbg.js";import{n as Nt}from"./pointerReorder-DgfeRZqx.js";function Rt(e){return[{typeId:"builtin.weather",title:"天气预报",description:"显示近期天气与简要趋势。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"weather",defaultSize:{desktopCols:6,tabletCols:6,rows:14},minSize:{desktopCols:4,tabletCols:4,rows:9},maxSize:{desktopCols:8,tabletCols:6,rows:18},renderer:{kind:"builtin",componentKey:"weather",buildProps:()=>({data:e.weather.value})}},{typeId:"builtin.newapi-monitor",title:"NewAPI 监控",description:"显示模型调用与健康状态。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"newapi-monitor",defaultSize:{desktopCols:6,tabletCols:6,rows:20},minSize:{desktopCols:4,tabletCols:3,rows:10},maxSize:{desktopCols:12,tabletCols:6,rows:20},renderer:{kind:"builtin",componentKey:"newapi-monitor",buildProps:()=>({summary:e.newApiMonitorSummary.value,trendItems:e.newApiMonitorTrend.value,models:e.newApiMonitorModels.value,status:e.newApiMonitorStatus.value,errorMessage:e.newApiMonitorError.value})}},{typeId:"builtin.cpu",title:"CPU",description:"显示 CPU 使用率与架构信息。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"cpu",defaultSize:{desktopCols:3,tabletCols:3,rows:11},minSize:{desktopCols:3,tabletCols:3,rows:7},maxSize:{desktopCols:6,tabletCols:6,rows:16},renderer:{kind:"builtin",componentKey:"cpu",buildProps:()=>({usage:e.cpuUsage.value,info:"",platform:e.cpuPlatform.value,arch:e.cpuArch.value})}},{typeId:"builtin.memory",title:"内存",description:"显示系统内存与 VCP 进程占用。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"memory",defaultSize:{desktopCols:3,tabletCols:3,rows:11},minSize:{desktopCols:3,tabletCols:3,rows:7},maxSize:{desktopCols:6,tabletCols:6,rows:16},renderer:{kind:"builtin",componentKey:"memory",buildProps:()=>({usage:e.memUsage.value,info:e.memInfo.value,vcpUsage:e.vcpMemUsage.value})}},{typeId:"builtin.process",title:"PM2 进程",description:"显示 PM2 进程状态。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"process",defaultSize:{desktopCols:6,tabletCols:6,rows:9},minSize:{desktopCols:4,tabletCols:3,rows:9},maxSize:{desktopCols:12,tabletCols:6,rows:20},renderer:{kind:"builtin",componentKey:"process",buildProps:()=>({processes:e.pm2Processes.value,authCode:e.userAuthCode.value,maxDisplay:20})}},{typeId:"builtin.news",title:"新闻",description:"显示精选热点新闻。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"news",defaultSize:{desktopCols:6,tabletCols:5,rows:20},minSize:{desktopCols:4,tabletCols:3,rows:9},maxSize:{desktopCols:12,tabletCols:6,rows:20},renderer:{kind:"builtin",componentKey:"news",buildProps:()=>({items:e.newsItems.value})}},{typeId:"builtin.node-info",title:"Node 信息",description:"显示当前 Node 进程与运行时信息。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"node-info",defaultSize:{desktopCols:3,tabletCols:3,rows:16},minSize:{desktopCols:3,tabletCols:3,rows:7},maxSize:{desktopCols:6,tabletCols:6,rows:16},renderer:{kind:"builtin",componentKey:"node-info",buildProps:()=>({info:e.nodeInfo.value})}},{typeId:"builtin.calendar",title:"日程",description:"显示即将开始的日程。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"calendar",defaultSize:{desktopCols:3,tabletCols:3,rows:16},minSize:{desktopCols:3,tabletCols:3,rows:7},maxSize:{desktopCols:6,tabletCols:6,rows:16},renderer:{kind:"builtin",componentKey:"calendar",buildProps:()=>({})}},{typeId:"builtin.activity-chart",title:"服务器活跃度",description:"展示日志活跃度趋势图。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:null,defaultSize:{desktopCols:12,tabletCols:6,rows:16},minSize:{desktopCols:6,tabletCols:6,rows:12},maxSize:{desktopCols:12,tabletCols:6,rows:24},renderer:{kind:"builtin",componentKey:"activity-chart",buildProps:()=>({setCanvasRef:o=>{e.activityCanvas.value=o}})}}]}var Ot=class{contributions=new Map;register(e){this.contributions.set(e.typeId,e)}registerMany(e){e.forEach(o=>{this.register(o)})}get(e){return this.contributions.get(e)}getAll(){return[...this.contributions.values()]}};function Vt(e,o){return e.renderer.kind==="builtin"?{...e,source:"plugin",pluginName:o,renderer:{kind:"builtin",componentKey:e.renderer.componentKey,buildProps:()=>({})}}:{...e,source:"plugin",pluginName:o,renderer:{kind:"web-component",tagName:e.renderer.tagName,publicPath:e.renderer.publicPath}}}function Yt(e){return!e.enabled||!Array.isArray(e.dashboardCards)?[]:e.dashboardCards.filter(o=>!!o).map(o=>Vt(o,o.pluginName||e.manifest.name))}function Gt(e){const o=et(),s=b(()=>o.plugins),r=b(()=>s.value.flatMap(v=>Yt(v))),i=b(()=>[...e.value,...r.value]),d=b(()=>{const v=new Ot;return v.registerMany(i.value),v}),h=b(()=>new Map(i.value.map(v=>[v.typeId,v]))),z=b(()=>new Map(i.value.filter(v=>v.legacyId).map(v=>[v.legacyId,v])));return{cards:i,catalogReady:b(()=>o.pluginsLoaded),contributionMap:h,legacyIdMap:z,pluginCards:r,registry:d}}var Ht="dashboard.layout.v2",Bt="dashboard.card-order",Ft="dashboard.card-sizes",tt={desktopCols:1,tabletCols:1,rows:4},nt={desktopCols:12,tabletCols:6,rows:60};function Ie(e,o,s,r){const i=We(e?.desktopCols,o.desktopCols,s.desktopCols,r.desktopCols);return{desktopCols:i,tabletCols:We(e?.tabletCols,Math.min(o.tabletCols,i),s.tabletCols,Math.min(r.tabletCols,i)),rows:We(e?.rows,o.rows,s.rows,r.rows)}}function We(e,o,s,r){const i=typeof e=="number"?e:Number(e);return Number.isFinite(i)?Math.min(r,Math.max(s,Math.round(i))):o}function be(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function $e(e){return JSON.stringify(e)}function Je(e){return[...new Set(e.filter(o=>typeof o=="string"&&o.trim().length>0))]}function dt(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`dashboard-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Ve(e,o,s){return{instanceId:dt(),typeId:e.typeId,enabled:!0,order:o,size:Ie(s,e.defaultSize,e.minSize,e.maxSize),config:{}}}function V(e){return[...e].sort((o,s)=>o.order-s.order).map((o,s)=>({...o,order:s}))}function Kt(e){if(!be(e))return null;const o=typeof e.instanceId=="string"&&e.instanceId.trim().length>0?e.instanceId:dt(),s=typeof e.typeId=="string"&&e.typeId.trim().length>0?e.typeId:null;return s?{instanceId:o,typeId:s,enabled:e.enabled!==!1,order:typeof e.order=="number"?e.order:0,size:Ie(be(e.size)?e.size:void 0,{desktopCols:6,tabletCols:6,rows:16},tt,nt),config:be(e.config)?e.config:{}}:null}function Ze(e){if(!be(e))return null;const o=Array.isArray(e.instances)?e.instances.map(r=>Kt(r)).filter(r=>r!==null):[],s=Array.isArray(e.dismissedTypeIds)?Je(e.dismissedTypeIds):[];return{version:2,instances:V(o),dismissedTypeIds:s}}function Wt(){if(typeof window>"u")return null;try{const e=window.localStorage.getItem(Bt),o=window.localStorage.getItem(Ft),s=e?JSON.parse(e):[],r=o?JSON.parse(o):{};return{order:Array.isArray(s)?s.filter(i=>typeof i=="string"):[],sizes:be(r)?r:{}}}catch{return null}}function Qe(e,o){return e.filter(s=>s.defaultEnabled&&!o.includes(s.typeId)).map((s,r)=>Ve(s,r))}function $t(e,o){const s=new Map(o.filter(r=>r.legacyId).map(r=>[r.legacyId,r]));return e.order.flatMap((r,i)=>{const d=s.get(r);return d?[Ve(d,i,e.sizes[r])]:[]})}function Xt(e,o){const s=new Map(o.map(i=>[i.typeId,i])),r=new Set;return V(e.flatMap(i=>{const d=s.get(i.typeId);if(d?.singleton){if(r.has(i.typeId))return[];r.add(i.typeId)}const h=d?Ie(i.size,d.defaultSize,d.minSize,d.maxSize):Ie(i.size,i.size,tt,nt);return[{...i,size:h,config:be(i.config)?i.config:{}}]}))}function Ut(e,o,s){const r=Ze(e),i=r?.dismissedTypeIds??[];let d=r?.instances??[];if(d.length===0)if(s){const w=Wt();d=w&&w.order.length>0?$t(w,o):Qe(o,i)}else d=Qe(o,i);const h=Xt(d,o),z=new Set(h.map(w=>w.typeId)),v=s?o.filter(w=>w.defaultEnabled&&w.singleton&&!i.includes(w.typeId)&&!z.has(w.typeId)).map((w,W)=>Ve(w,h.length+W)):[];return{instances:V([...h,...v]),dismissedTypeIds:i}}function jt(e,o){const s=kt(Ht,null,{parser:f=>Ze(JSON.parse(f)),serializer:f=>f===null?"null":$e({version:2,instances:V(f.instances),dismissedTypeIds:Je(f.dismissedTypeIds)})}),r=b(()=>Ut(s.value,e.value,o.value)),i=b({get:()=>r.value.instances,set:f=>{s.value={version:2,instances:V(f),dismissedTypeIds:r.value.dismissedTypeIds}}});ie(r,f=>{if(!o.value&&s.value===null)return;const _={version:2,instances:f.instances,dismissedTypeIds:f.dismissedTypeIds},y=Ze(s.value);(!y||$e(y)!==$e(_))&&(s.value=_)},{immediate:!0});function d(f){const _=e.value.find(c=>c.typeId===f);if(!_)return null;const y=r.value,S=y.instances.find(c=>c.typeId===f),N=y.dismissedTypeIds.filter(c=>c!==f);if(_.singleton&&S)return s.value={version:2,instances:V(y.instances.map(c=>c.instanceId===S.instanceId?{...c,enabled:!0}:c)),dismissedTypeIds:N},S.instanceId;const M=Ve(_,y.instances.length);return s.value={version:2,instances:V([...y.instances,M]),dismissedTypeIds:N},M.instanceId}function h(f){const _=r.value,y=_.instances.find(c=>c.instanceId===f);if(!y)return;const S=e.value.find(c=>c.typeId===y.typeId),N=_.instances.filter(c=>c.instanceId!==f),M=S?.singleton===!0?Je([..._.dismissedTypeIds,y.typeId]):_.dismissedTypeIds;s.value={version:2,instances:V(N),dismissedTypeIds:M}}function z(f){s.value={version:2,instances:V(f.map((_,y)=>({..._,order:y}))),dismissedTypeIds:r.value.dismissedTypeIds}}function v(f,_){s.value={version:2,instances:V(r.value.instances.map(y=>y.instanceId===f?{...y,enabled:_}:y)),dismissedTypeIds:r.value.dismissedTypeIds}}function w(f,_){const y=e.value.find(S=>S.typeId===r.value.instances.find(N=>N.instanceId===f)?.typeId);s.value={version:2,instances:V(r.value.instances.map(S=>S.instanceId!==f?S:{...S,size:y?Ie({...S.size,..._},y.defaultSize,y.minSize,y.maxSize):Ie({...S.size,..._},S.size,tt,nt)})),dismissedTypeIds:r.value.dismissedTypeIds}}function W(){s.value={version:2,instances:Qe(e.value,[]),dismissedTypeIds:[]}}return{instances:i,dismissedTypeIds:b(()=>r.value.dismissedTypeIds),addCard:d,removeInstance:h,replaceInstances:z,resetLayout:W,setInstanceEnabled:v,setInstanceSize:w}}var qt={weather:q(()=>J(()=>import("./dashboard-card-weather-DlDT7qmx.js").then(e=>e.t),__vite__mapDeps([0,1,2,3,4]))),"newapi-monitor":q(()=>J(()=>import("./dashboard-card-newapimonitor-Ct3qz53I.js").then(e=>e.t),__vite__mapDeps([5,1,2,3,6]))),cpu:q(()=>J(()=>import("./dashboard-card-cpu-B6CjyXAf.js").then(e=>e.t),__vite__mapDeps([7,1,2,3,8]))),memory:q(()=>J(()=>import("./dashboard-card-memory-LB2NB56p.js").then(e=>e.t),__vite__mapDeps([9,1,2,3,10]))),process:q(()=>J(()=>import("./dashboard-card-process-g3ndLELy.js").then(e=>e.t),__vite__mapDeps([11,1,2,3,12]))),news:q(()=>J(()=>import("./dashboard-card-news-BnyB_dHU.js").then(e=>e.t),__vite__mapDeps([13,1,2,3,14]))),"node-info":q(()=>J(()=>import("./dashboard-card-nodeinfo-BLPpobjK.js").then(e=>e.t),__vite__mapDeps([15,1,2,3,16]))),calendar:q(()=>J(()=>import("./dashboard-card-calendar-CA3-tSpi.js").then(e=>e.t),__vite__mapDeps([17,1,2,3,18]))),"activity-chart":q(()=>J(()=>import("./dashboard-card-activitychart-CjJ1Boi_.js").then(e=>e.t),__vite__mapDeps([1,2,3])))},Jt=Oe({__name:"BuiltinCardHost",props:{contribution:{},state:{}},setup(e){const o=e,s=b(()=>qt[o.contribution.renderer.componentKey]??null),r=b(()=>o.contribution.renderer.buildProps(o.state));return(i,d)=>s.value?(x(),ge(ot(s.value),ht(yt({key:0},r.value)),null,16)):st("",!0)}}),Zt=Jt,Qt={class:"dashboard-card-shell dashboard-card-shell--rose missing-card"},en={class:"dashboard-card-header"},tn={class:"dashboard-card-title"},nn={class:"dashboard-card-subtitle"},an={class:"dashboard-card-panel missing-card-body"},on=Oe({__name:"MissingCardHost",props:{instance:{},title:{},message:{}},setup(e){const o=e,s=b(()=>o.title||o.instance.typeId.split(".").pop()||"Unavailable Card"),r=b(()=>o.message||"来源插件不可用,可移除或等待恢复。");return(i,d)=>(x(),Z("div",Qt,[C("div",en,[C("div",null,[C("h3",tn,he(s.value),1),C("p",nn,he(r.value),1)]),d[0]||(d[0]=C("span",{class:"dashboard-card-badge"},"Missing",-1))]),C("div",an,[C("p",null,"类型:"+he(e.instance.typeId),1),C("p",null,"实例:"+he(e.instance.instanceId),1)])]))}}),ut=lt(on,[["__scopeId","data-v-ebb0ed4d"]]),Xe=new Map;function rn(e){return new Promise((o,s)=>{const r=document.querySelector(`script[data-plugin-asset-url="${CSS.escape(e)}"]`);if(r?.dataset.loaded==="true"){o();return}const i=()=>{r?.setAttribute("data-loaded","true"),o()},d=()=>{s(new Error(`Failed to load plugin asset: ${e}`))};if(r){r.addEventListener("load",i,{once:!0}),r.addEventListener("error",d,{once:!0});return}const h=document.createElement("script");h.src=e,h.async=!0,h.dataset.pluginAssetUrl=e,h.addEventListener("load",()=>{h.dataset.loaded="true",o()},{once:!0}),h.addEventListener("error",()=>{s(new Error(`Failed to load plugin asset: ${e}`))},{once:!0}),document.head.appendChild(h)})}function sn(e){const o=Xe.get(e);if(o)return o;const s=rn(e).catch(r=>{throw Xe.delete(e),r});return Xe.set(e,s),s}var ln={key:0,class:"dashboard-card-shell dashboard-card-shell--cyan plugin-card-loading"},dn={class:"dashboard-card-title"},un=Oe({__name:"WebComponentCardHost",props:{contribution:{},instance:{},theme:{}},setup(e){const o=e,s=m({status:"loading"}),r=b(()=>JSON.stringify(o.instance.config??{}));async function i(){s.value={status:"loading"};try{await sn(o.contribution.renderer.publicPath),customElements.get(o.contribution.renderer.tagName)||await Promise.race([customElements.whenDefined(o.contribution.renderer.tagName),new Promise((d,h)=>{window.setTimeout(()=>{h(new Error(`插件卡片未注册自定义元素:${o.contribution.renderer.tagName}`))},1e4)})]),s.value={status:"ready"}}catch(d){s.value={status:"error",message:d instanceof Error?`${d.message}。来源插件不可用,可移除或等待恢复。`:"插件资源加载失败。来源插件不可用,可移除或等待恢复。"}}}return rt(()=>{i()}),ie(()=>o.contribution.renderer.publicPath,()=>{i()}),(d,h)=>s.value.status==="loading"?(x(),Z("div",ln,[C("h3",dn,he(e.contribution.title),1),h[0]||(h[0]=C("div",{class:"dashboard-card-empty"},[C("p",null,"正在加载插件卡片资源...")],-1))])):s.value.status==="error"?(x(),ge(ut,{key:1,instance:e.instance,title:e.contribution.title,message:s.value.message},null,8,["instance","title","message"])):(x(),ge(ot(e.contribution.renderer.tagName),{key:2,"plugin-name":e.contribution.pluginName,"type-id":e.instance.typeId,"instance-id":e.instance.instanceId,config:r.value,theme:e.theme},null,8,["plugin-name","type-id","instance-id","config","theme"]))}}),cn=un;function Ue(e,o={}){const{immediate:s=!1,globalLoadingKey:r,onSuccess:i,onError:d}=o,h=m(null),z=m(!1),v=m(null);let w=null;function W(){if(!r)return null;const M=Mt();return M?Et(M):null}function f(){return new DOMException("Request aborted","AbortError")}function _(M,c){return new Promise((A,P)=>{if(c.aborted){P(f());return}const I=globalThis.setTimeout(()=>{D(),A()},M),k=()=>{globalThis.clearTimeout(I),D(),P(f())},D=()=>{c.removeEventListener("abort",k)};c.addEventListener("abort",k,{once:!0})})}function y(){w&&(w.abort(),w=null)}async function S(M={}){const{retry:c=!0}=M;y(),w=new AbortController;const{signal:A}=w;z.value=!0,v.value=null;const P=W();r&&P&&P.start(r);try{let I;if(c)for(let O=1;O<=3;O++)try{if(I=await e({signal:A}),A.aborted)throw f();break}catch($){if(A.aborted)throw f();if(O===3)throw $;await _(1e3*Math.pow(2,O-1),A)}else if(I=await e({signal:A}),A.aborted)throw f();return h.value=I,i?.(I),{success:!0,data:I}}catch(I){const k=I instanceof Error?I:new Error(String(I)),D=k.name==="AbortError";return v.value=k,d?.(k),{success:!1,error:k,aborted:D}}finally{w=null,z.value=!1,r&&P&&P.stop(r)}}function N(){h.value=null,z.value=!1,v.value=null}return s&&S(),_t()&&it(()=>{y()}),{data:h,isLoading:z,error:v,execute:S,cancel:y,reset:N}}var K=At("Dashboard"),pn=5e3,mn=30*1e3,fn=1800*1e3,vn=600*1e3,yn=60*1e3,at=60,je={maxRetries:2,retryDelayMs:500},hn=["cpu","memory","process","node-info"],gn=["process"],bn=["weather"],In=["news"],Cn=["newapi-monitor"],wn=["activity-chart"],_n={100:"sunny",101:"cloudy",102:"cloudy",103:"partly_cloudy_day",104:"cloud",150:"clear_night",151:"nights_stay",152:"nights_stay",153:"nights_stay",154:"cloud",300:"rainy",301:"rainy",302:"rainy_heavy",303:"rainy_heavy",304:"rainy_heavy",305:"rainy",306:"rainy",307:"rainy_heavy",308:"rainy_heavy",309:"rainy",310:"rainy_heavy",311:"rainy_heavy",312:"rainy_heavy",313:"rainy_heavy",314:"rainy",315:"rainy_heavy",316:"rainy_heavy",317:"rainy_heavy",318:"rainy_heavy",350:"rainy",351:"rainy_heavy",399:"rainy",晴:"clear_day",多云:"partly_cloudy_day",阴:"cloud",小雨:"rainy",中雨:"rainy",大雨:"rainy",暴雨:"thunderstorm",雷阵雨:"thunderstorm",雪:"snowing",雾:"foggy",霾:"haze"},Sn="wb_sunny";function ct(e){return e.replace(/\r\n/g,` +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/dashboard-card-weather-DlDT7qmx.js","assets/js/dashboard-card-activitychart-CjJ1Boi_.js","assets/js/rolldown-runtime-DmMX61E0.js","assets/css/dashboard-card-activitychart-YGnIvisH.css","assets/css/dashboard-card-weather-C4ozCzjZ.css","assets/js/dashboard-card-newapimonitor-Ct3qz53I.js","assets/css/dashboard-card-newapimonitor-OGmpBE0r.css","assets/js/dashboard-card-cpu-B6CjyXAf.js","assets/css/dashboard-card-cpu-CIR751YT.css","assets/js/dashboard-card-memory-LB2NB56p.js","assets/css/dashboard-card-memory-BDPzjRlb.css","assets/js/dashboard-card-process-g3ndLELy.js","assets/css/dashboard-card-process-kTKbEopV.css","assets/js/dashboard-card-news-BnyB_dHU.js","assets/css/dashboard-card-news-Dgf8YUcC.css","assets/js/dashboard-card-nodeinfo-BLPpobjK.js","assets/css/dashboard-card-nodeinfo-X3MDAYOY.css","assets/js/dashboard-card-calendar-DWuV34Bn.js","assets/css/dashboard-card-calendar-CgD3w8x7.css"])))=>i.map(i=>d[i]); +import{D as pt,Dt as he,Et as mt,H as ft,L as ot,N as vt,O as rt,Q as m,T as yt,Tt as ht,V as ie,_ as q,a as gt,at as ne,c as b,d as st,et as bt,f as Z,g as Ke,h as It,it as Ct,j as x,k as it,l as C,n as lt,u as ge,v as Oe,wt,y as _t}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{r as St}from"./dashboard-card-news-BnyB_dHU.js";import{A as ve,N as Et,O as Tt,P as At,S as Pt,U as J,Y as Mt,k as Lt,n as zt}from"./dashboard-card-calendar-DWuV34Bn.js";import{a as kt,i as et,r as Dt,t as xt}from"./dashboard-components-B8tHL6X6.js";import{t as Pe}from"./usePolling-CJCCePbg.js";import{n as Nt}from"./pointerReorder-DgfeRZqx.js";function Rt(e){return[{typeId:"builtin.weather",title:"天气预报",description:"显示近期天气与简要趋势。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"weather",defaultSize:{desktopCols:6,tabletCols:6,rows:14},minSize:{desktopCols:4,tabletCols:4,rows:9},maxSize:{desktopCols:8,tabletCols:6,rows:18},renderer:{kind:"builtin",componentKey:"weather",buildProps:()=>({data:e.weather.value})}},{typeId:"builtin.newapi-monitor",title:"NewAPI 监控",description:"显示模型调用与健康状态。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"newapi-monitor",defaultSize:{desktopCols:6,tabletCols:6,rows:20},minSize:{desktopCols:4,tabletCols:3,rows:10},maxSize:{desktopCols:12,tabletCols:6,rows:20},renderer:{kind:"builtin",componentKey:"newapi-monitor",buildProps:()=>({summary:e.newApiMonitorSummary.value,trendItems:e.newApiMonitorTrend.value,models:e.newApiMonitorModels.value,status:e.newApiMonitorStatus.value,errorMessage:e.newApiMonitorError.value})}},{typeId:"builtin.cpu",title:"CPU",description:"显示 CPU 使用率与架构信息。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"cpu",defaultSize:{desktopCols:3,tabletCols:3,rows:11},minSize:{desktopCols:3,tabletCols:3,rows:7},maxSize:{desktopCols:6,tabletCols:6,rows:16},renderer:{kind:"builtin",componentKey:"cpu",buildProps:()=>({usage:e.cpuUsage.value,info:"",platform:e.cpuPlatform.value,arch:e.cpuArch.value})}},{typeId:"builtin.memory",title:"内存",description:"显示系统内存与 VCP 进程占用。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"memory",defaultSize:{desktopCols:3,tabletCols:3,rows:11},minSize:{desktopCols:3,tabletCols:3,rows:7},maxSize:{desktopCols:6,tabletCols:6,rows:16},renderer:{kind:"builtin",componentKey:"memory",buildProps:()=>({usage:e.memUsage.value,info:e.memInfo.value,vcpUsage:e.vcpMemUsage.value})}},{typeId:"builtin.process",title:"PM2 进程",description:"显示 PM2 进程状态。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"process",defaultSize:{desktopCols:6,tabletCols:6,rows:9},minSize:{desktopCols:4,tabletCols:3,rows:9},maxSize:{desktopCols:12,tabletCols:6,rows:20},renderer:{kind:"builtin",componentKey:"process",buildProps:()=>({processes:e.pm2Processes.value,authCode:e.userAuthCode.value,maxDisplay:20})}},{typeId:"builtin.news",title:"新闻",description:"显示精选热点新闻。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"news",defaultSize:{desktopCols:6,tabletCols:5,rows:20},minSize:{desktopCols:4,tabletCols:3,rows:9},maxSize:{desktopCols:12,tabletCols:6,rows:20},renderer:{kind:"builtin",componentKey:"news",buildProps:()=>({items:e.newsItems.value})}},{typeId:"builtin.node-info",title:"Node 信息",description:"显示当前 Node 进程与运行时信息。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"node-info",defaultSize:{desktopCols:3,tabletCols:3,rows:16},minSize:{desktopCols:3,tabletCols:3,rows:7},maxSize:{desktopCols:6,tabletCols:6,rows:16},renderer:{kind:"builtin",componentKey:"node-info",buildProps:()=>({info:e.nodeInfo.value})}},{typeId:"builtin.calendar",title:"日程",description:"显示即将开始的日程。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:"calendar",defaultSize:{desktopCols:3,tabletCols:3,rows:16},minSize:{desktopCols:3,tabletCols:3,rows:7},maxSize:{desktopCols:6,tabletCols:6,rows:16},renderer:{kind:"builtin",componentKey:"calendar",buildProps:()=>({})}},{typeId:"builtin.activity-chart",title:"服务器活跃度",description:"展示日志活跃度趋势图。",source:"builtin",singleton:!0,defaultEnabled:!0,legacyId:null,defaultSize:{desktopCols:12,tabletCols:6,rows:16},minSize:{desktopCols:6,tabletCols:6,rows:12},maxSize:{desktopCols:12,tabletCols:6,rows:24},renderer:{kind:"builtin",componentKey:"activity-chart",buildProps:()=>({setCanvasRef:o=>{e.activityCanvas.value=o}})}}]}var Ot=class{contributions=new Map;register(e){this.contributions.set(e.typeId,e)}registerMany(e){e.forEach(o=>{this.register(o)})}get(e){return this.contributions.get(e)}getAll(){return[...this.contributions.values()]}};function Vt(e,o){return e.renderer.kind==="builtin"?{...e,source:"plugin",pluginName:o,renderer:{kind:"builtin",componentKey:e.renderer.componentKey,buildProps:()=>({})}}:{...e,source:"plugin",pluginName:o,renderer:{kind:"web-component",tagName:e.renderer.tagName,publicPath:e.renderer.publicPath}}}function Yt(e){return!e.enabled||!Array.isArray(e.dashboardCards)?[]:e.dashboardCards.filter(o=>!!o).map(o=>Vt(o,o.pluginName||e.manifest.name))}function Gt(e){const o=et(),s=b(()=>o.plugins),r=b(()=>s.value.flatMap(v=>Yt(v))),i=b(()=>[...e.value,...r.value]),d=b(()=>{const v=new Ot;return v.registerMany(i.value),v}),h=b(()=>new Map(i.value.map(v=>[v.typeId,v]))),z=b(()=>new Map(i.value.filter(v=>v.legacyId).map(v=>[v.legacyId,v])));return{cards:i,catalogReady:b(()=>o.pluginsLoaded),contributionMap:h,legacyIdMap:z,pluginCards:r,registry:d}}var Ht="dashboard.layout.v2",Bt="dashboard.card-order",Ft="dashboard.card-sizes",tt={desktopCols:1,tabletCols:1,rows:4},nt={desktopCols:12,tabletCols:6,rows:60};function Ie(e,o,s,r){const i=We(e?.desktopCols,o.desktopCols,s.desktopCols,r.desktopCols);return{desktopCols:i,tabletCols:We(e?.tabletCols,Math.min(o.tabletCols,i),s.tabletCols,Math.min(r.tabletCols,i)),rows:We(e?.rows,o.rows,s.rows,r.rows)}}function We(e,o,s,r){const i=typeof e=="number"?e:Number(e);return Number.isFinite(i)?Math.min(r,Math.max(s,Math.round(i))):o}function be(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function $e(e){return JSON.stringify(e)}function Je(e){return[...new Set(e.filter(o=>typeof o=="string"&&o.trim().length>0))]}function dt(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`dashboard-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Ve(e,o,s){return{instanceId:dt(),typeId:e.typeId,enabled:!0,order:o,size:Ie(s,e.defaultSize,e.minSize,e.maxSize),config:{}}}function V(e){return[...e].sort((o,s)=>o.order-s.order).map((o,s)=>({...o,order:s}))}function Kt(e){if(!be(e))return null;const o=typeof e.instanceId=="string"&&e.instanceId.trim().length>0?e.instanceId:dt(),s=typeof e.typeId=="string"&&e.typeId.trim().length>0?e.typeId:null;return s?{instanceId:o,typeId:s,enabled:e.enabled!==!1,order:typeof e.order=="number"?e.order:0,size:Ie(be(e.size)?e.size:void 0,{desktopCols:6,tabletCols:6,rows:16},tt,nt),config:be(e.config)?e.config:{}}:null}function Ze(e){if(!be(e))return null;const o=Array.isArray(e.instances)?e.instances.map(r=>Kt(r)).filter(r=>r!==null):[],s=Array.isArray(e.dismissedTypeIds)?Je(e.dismissedTypeIds):[];return{version:2,instances:V(o),dismissedTypeIds:s}}function Wt(){if(typeof window>"u")return null;try{const e=window.localStorage.getItem(Bt),o=window.localStorage.getItem(Ft),s=e?JSON.parse(e):[],r=o?JSON.parse(o):{};return{order:Array.isArray(s)?s.filter(i=>typeof i=="string"):[],sizes:be(r)?r:{}}}catch{return null}}function Qe(e,o){return e.filter(s=>s.defaultEnabled&&!o.includes(s.typeId)).map((s,r)=>Ve(s,r))}function $t(e,o){const s=new Map(o.filter(r=>r.legacyId).map(r=>[r.legacyId,r]));return e.order.flatMap((r,i)=>{const d=s.get(r);return d?[Ve(d,i,e.sizes[r])]:[]})}function Xt(e,o){const s=new Map(o.map(i=>[i.typeId,i])),r=new Set;return V(e.flatMap(i=>{const d=s.get(i.typeId);if(d?.singleton){if(r.has(i.typeId))return[];r.add(i.typeId)}const h=d?Ie(i.size,d.defaultSize,d.minSize,d.maxSize):Ie(i.size,i.size,tt,nt);return[{...i,size:h,config:be(i.config)?i.config:{}}]}))}function Ut(e,o,s){const r=Ze(e),i=r?.dismissedTypeIds??[];let d=r?.instances??[];if(d.length===0)if(s){const w=Wt();d=w&&w.order.length>0?$t(w,o):Qe(o,i)}else d=Qe(o,i);const h=Xt(d,o),z=new Set(h.map(w=>w.typeId)),v=s?o.filter(w=>w.defaultEnabled&&w.singleton&&!i.includes(w.typeId)&&!z.has(w.typeId)).map((w,W)=>Ve(w,h.length+W)):[];return{instances:V([...h,...v]),dismissedTypeIds:i}}function jt(e,o){const s=kt(Ht,null,{parser:f=>Ze(JSON.parse(f)),serializer:f=>f===null?"null":$e({version:2,instances:V(f.instances),dismissedTypeIds:Je(f.dismissedTypeIds)})}),r=b(()=>Ut(s.value,e.value,o.value)),i=b({get:()=>r.value.instances,set:f=>{s.value={version:2,instances:V(f),dismissedTypeIds:r.value.dismissedTypeIds}}});ie(r,f=>{if(!o.value&&s.value===null)return;const _={version:2,instances:f.instances,dismissedTypeIds:f.dismissedTypeIds},y=Ze(s.value);(!y||$e(y)!==$e(_))&&(s.value=_)},{immediate:!0});function d(f){const _=e.value.find(c=>c.typeId===f);if(!_)return null;const y=r.value,S=y.instances.find(c=>c.typeId===f),N=y.dismissedTypeIds.filter(c=>c!==f);if(_.singleton&&S)return s.value={version:2,instances:V(y.instances.map(c=>c.instanceId===S.instanceId?{...c,enabled:!0}:c)),dismissedTypeIds:N},S.instanceId;const M=Ve(_,y.instances.length);return s.value={version:2,instances:V([...y.instances,M]),dismissedTypeIds:N},M.instanceId}function h(f){const _=r.value,y=_.instances.find(c=>c.instanceId===f);if(!y)return;const S=e.value.find(c=>c.typeId===y.typeId),N=_.instances.filter(c=>c.instanceId!==f),M=S?.singleton===!0?Je([..._.dismissedTypeIds,y.typeId]):_.dismissedTypeIds;s.value={version:2,instances:V(N),dismissedTypeIds:M}}function z(f){s.value={version:2,instances:V(f.map((_,y)=>({..._,order:y}))),dismissedTypeIds:r.value.dismissedTypeIds}}function v(f,_){s.value={version:2,instances:V(r.value.instances.map(y=>y.instanceId===f?{...y,enabled:_}:y)),dismissedTypeIds:r.value.dismissedTypeIds}}function w(f,_){const y=e.value.find(S=>S.typeId===r.value.instances.find(N=>N.instanceId===f)?.typeId);s.value={version:2,instances:V(r.value.instances.map(S=>S.instanceId!==f?S:{...S,size:y?Ie({...S.size,..._},y.defaultSize,y.minSize,y.maxSize):Ie({...S.size,..._},S.size,tt,nt)})),dismissedTypeIds:r.value.dismissedTypeIds}}function W(){s.value={version:2,instances:Qe(e.value,[]),dismissedTypeIds:[]}}return{instances:i,dismissedTypeIds:b(()=>r.value.dismissedTypeIds),addCard:d,removeInstance:h,replaceInstances:z,resetLayout:W,setInstanceEnabled:v,setInstanceSize:w}}var qt={weather:q(()=>J(()=>import("./dashboard-card-weather-DlDT7qmx.js").then(e=>e.t),__vite__mapDeps([0,1,2,3,4]))),"newapi-monitor":q(()=>J(()=>import("./dashboard-card-newapimonitor-Ct3qz53I.js").then(e=>e.t),__vite__mapDeps([5,1,2,3,6]))),cpu:q(()=>J(()=>import("./dashboard-card-cpu-B6CjyXAf.js").then(e=>e.t),__vite__mapDeps([7,1,2,3,8]))),memory:q(()=>J(()=>import("./dashboard-card-memory-LB2NB56p.js").then(e=>e.t),__vite__mapDeps([9,1,2,3,10]))),process:q(()=>J(()=>import("./dashboard-card-process-g3ndLELy.js").then(e=>e.t),__vite__mapDeps([11,1,2,3,12]))),news:q(()=>J(()=>import("./dashboard-card-news-BnyB_dHU.js").then(e=>e.t),__vite__mapDeps([13,1,2,3,14]))),"node-info":q(()=>J(()=>import("./dashboard-card-nodeinfo-BLPpobjK.js").then(e=>e.t),__vite__mapDeps([15,1,2,3,16]))),calendar:q(()=>J(()=>import("./dashboard-card-calendar-DWuV34Bn.js").then(e=>e.t),__vite__mapDeps([17,1,2,3,18]))),"activity-chart":q(()=>J(()=>import("./dashboard-card-activitychart-CjJ1Boi_.js").then(e=>e.t),__vite__mapDeps([1,2,3])))},Jt=Oe({__name:"BuiltinCardHost",props:{contribution:{},state:{}},setup(e){const o=e,s=b(()=>qt[o.contribution.renderer.componentKey]??null),r=b(()=>o.contribution.renderer.buildProps(o.state));return(i,d)=>s.value?(x(),ge(ot(s.value),ht(yt({key:0},r.value)),null,16)):st("",!0)}}),Zt=Jt,Qt={class:"dashboard-card-shell dashboard-card-shell--rose missing-card"},en={class:"dashboard-card-header"},tn={class:"dashboard-card-title"},nn={class:"dashboard-card-subtitle"},an={class:"dashboard-card-panel missing-card-body"},on=Oe({__name:"MissingCardHost",props:{instance:{},title:{},message:{}},setup(e){const o=e,s=b(()=>o.title||o.instance.typeId.split(".").pop()||"Unavailable Card"),r=b(()=>o.message||"来源插件不可用,可移除或等待恢复。");return(i,d)=>(x(),Z("div",Qt,[C("div",en,[C("div",null,[C("h3",tn,he(s.value),1),C("p",nn,he(r.value),1)]),d[0]||(d[0]=C("span",{class:"dashboard-card-badge"},"Missing",-1))]),C("div",an,[C("p",null,"类型:"+he(e.instance.typeId),1),C("p",null,"实例:"+he(e.instance.instanceId),1)])]))}}),ut=lt(on,[["__scopeId","data-v-ebb0ed4d"]]),Xe=new Map;function rn(e){return new Promise((o,s)=>{const r=document.querySelector(`script[data-plugin-asset-url="${CSS.escape(e)}"]`);if(r?.dataset.loaded==="true"){o();return}const i=()=>{r?.setAttribute("data-loaded","true"),o()},d=()=>{s(new Error(`Failed to load plugin asset: ${e}`))};if(r){r.addEventListener("load",i,{once:!0}),r.addEventListener("error",d,{once:!0});return}const h=document.createElement("script");h.src=e,h.async=!0,h.dataset.pluginAssetUrl=e,h.addEventListener("load",()=>{h.dataset.loaded="true",o()},{once:!0}),h.addEventListener("error",()=>{s(new Error(`Failed to load plugin asset: ${e}`))},{once:!0}),document.head.appendChild(h)})}function sn(e){const o=Xe.get(e);if(o)return o;const s=rn(e).catch(r=>{throw Xe.delete(e),r});return Xe.set(e,s),s}var ln={key:0,class:"dashboard-card-shell dashboard-card-shell--cyan plugin-card-loading"},dn={class:"dashboard-card-title"},un=Oe({__name:"WebComponentCardHost",props:{contribution:{},instance:{},theme:{}},setup(e){const o=e,s=m({status:"loading"}),r=b(()=>JSON.stringify(o.instance.config??{}));async function i(){s.value={status:"loading"};try{await sn(o.contribution.renderer.publicPath),customElements.get(o.contribution.renderer.tagName)||await Promise.race([customElements.whenDefined(o.contribution.renderer.tagName),new Promise((d,h)=>{window.setTimeout(()=>{h(new Error(`插件卡片未注册自定义元素:${o.contribution.renderer.tagName}`))},1e4)})]),s.value={status:"ready"}}catch(d){s.value={status:"error",message:d instanceof Error?`${d.message}。来源插件不可用,可移除或等待恢复。`:"插件资源加载失败。来源插件不可用,可移除或等待恢复。"}}}return rt(()=>{i()}),ie(()=>o.contribution.renderer.publicPath,()=>{i()}),(d,h)=>s.value.status==="loading"?(x(),Z("div",ln,[C("h3",dn,he(e.contribution.title),1),h[0]||(h[0]=C("div",{class:"dashboard-card-empty"},[C("p",null,"正在加载插件卡片资源...")],-1))])):s.value.status==="error"?(x(),ge(ut,{key:1,instance:e.instance,title:e.contribution.title,message:s.value.message},null,8,["instance","title","message"])):(x(),ge(ot(e.contribution.renderer.tagName),{key:2,"plugin-name":e.contribution.pluginName,"type-id":e.instance.typeId,"instance-id":e.instance.instanceId,config:r.value,theme:e.theme},null,8,["plugin-name","type-id","instance-id","config","theme"]))}}),cn=un;function Ue(e,o={}){const{immediate:s=!1,globalLoadingKey:r,onSuccess:i,onError:d}=o,h=m(null),z=m(!1),v=m(null);let w=null;function W(){if(!r)return null;const M=Mt();return M?Et(M):null}function f(){return new DOMException("Request aborted","AbortError")}function _(M,c){return new Promise((A,P)=>{if(c.aborted){P(f());return}const I=globalThis.setTimeout(()=>{D(),A()},M),k=()=>{globalThis.clearTimeout(I),D(),P(f())},D=()=>{c.removeEventListener("abort",k)};c.addEventListener("abort",k,{once:!0})})}function y(){w&&(w.abort(),w=null)}async function S(M={}){const{retry:c=!0}=M;y(),w=new AbortController;const{signal:A}=w;z.value=!0,v.value=null;const P=W();r&&P&&P.start(r);try{let I;if(c)for(let O=1;O<=3;O++)try{if(I=await e({signal:A}),A.aborted)throw f();break}catch($){if(A.aborted)throw f();if(O===3)throw $;await _(1e3*Math.pow(2,O-1),A)}else if(I=await e({signal:A}),A.aborted)throw f();return h.value=I,i?.(I),{success:!0,data:I}}catch(I){const k=I instanceof Error?I:new Error(String(I)),D=k.name==="AbortError";return v.value=k,d?.(k),{success:!1,error:k,aborted:D}}finally{w=null,z.value=!1,r&&P&&P.stop(r)}}function N(){h.value=null,z.value=!1,v.value=null}return s&&S(),_t()&&it(()=>{y()}),{data:h,isLoading:z,error:v,execute:S,cancel:y,reset:N}}var K=At("Dashboard"),pn=5e3,mn=30*1e3,fn=1800*1e3,vn=600*1e3,yn=60*1e3,at=60,je={maxRetries:2,retryDelayMs:500},hn=["cpu","memory","process","node-info"],gn=["process"],bn=["weather"],In=["news"],Cn=["newapi-monitor"],wn=["activity-chart"],_n={100:"sunny",101:"cloudy",102:"cloudy",103:"partly_cloudy_day",104:"cloud",150:"clear_night",151:"nights_stay",152:"nights_stay",153:"nights_stay",154:"cloud",300:"rainy",301:"rainy",302:"rainy_heavy",303:"rainy_heavy",304:"rainy_heavy",305:"rainy",306:"rainy",307:"rainy_heavy",308:"rainy_heavy",309:"rainy",310:"rainy_heavy",311:"rainy_heavy",312:"rainy_heavy",313:"rainy_heavy",314:"rainy",315:"rainy_heavy",316:"rainy_heavy",317:"rainy_heavy",318:"rainy_heavy",350:"rainy",351:"rainy_heavy",399:"rainy",晴:"clear_day",多云:"partly_cloudy_day",阴:"cloud",小雨:"rainy",中雨:"rainy",大雨:"rainy",暴雨:"thunderstorm",雷阵雨:"thunderstorm",雪:"snowing",雾:"foggy",霾:"haze"},Sn="wb_sunny";function ct(e){return e.replace(/\r\n/g,` `)}function qe(e,o=""){const s=`${o}${ct(e)}`,r=s.split(` `),i=s.endsWith(` `);i&&r[r.length-1]===""&&r.pop();const d=i?"":r.pop()??"";return{completeLines:r,displayedLines:d?[...r,d]:r,trailingFragment:d}}function ye(e,o){return o.some(s=>e.has(s))}function En(e=[]){const o=et(),s=b(()=>o.animationsEnabled),r=b(()=>o.theme),i=m(null),{data:d,execute:h}=Ue(n=>ve.getSystemResources({signal:n?.signal,timeoutMs:1e4},{showLoader:!1}),{globalLoadingKey:"dashboard.system-monitor"}),{data:z,execute:v}=Ue(n=>ve.getPM2Processes({signal:n?.signal,timeoutMs:1e4},{showLoader:!1}),{globalLoadingKey:"dashboard.pm2-processes"}),{data:w,execute:W}=Ue(n=>ve.getUserAuthCode({signal:n?.signal,timeoutMs:1e4},{showLoader:!1}),{globalLoadingKey:"dashboard.auth-code"}),f=m(0),_=m(""),y=m(""),S=m(0),N=m("加载中…"),M=m(0),c=m([]),A=m({}),P=m("加载中…"),I=m({icon:"--",temp:0,text:"加载中…",humidity:0,wind:"--",pressure:0,forecast:[]}),k=m([]),D=m(null),O=m([]),$=m([]),Q=m("loading"),Ce=m(""),X=m(new Array(60).fill(0)),U=m(null),Y=m(0),ae=m(""),ee=m(typeof document>"u"?!0:document.visibilityState==="visible"),te=b(()=>new Set(Ct(e))),Me=b(()=>ye(te.value,hn)),we=b(()=>ye(te.value,gn)),Le=b(()=>ye(te.value,bn)),ze=b(()=>ye(te.value,In)),ke=b(()=>ye(te.value,Cn)),le=b(()=>ye(te.value,wn));let oe=null,de=!1,re=null;async function Ye(){if(await Promise.all([h(),v()]),d.value?.cpu?.usage!==void 0&&(f.value=d.value.cpu.usage,_.value=d.value.nodeProcess?.platform||"",y.value=d.value.nodeProcess?.arch||""),d.value?.memory?.used!==void 0&&d.value?.memory?.total!==void 0){const n=d.value.memory.used/1024/1024/1024,u=d.value.memory.total/1024/1024/1024;S.value=d.value.memory.usage,N.value=`已用:${n.toFixed(2)} GB / 总共:${u.toFixed(2)} GB`,d.value.nodeProcess?.memory?.rss&&(M.value=d.value.nodeProcess.memory.rss/d.value.memory.total*100)}z.value&&(c.value=z.value),d.value?.nodeProcess&&(A.value={pid:d.value.nodeProcess.pid,version:d.value.nodeProcess.version,memory:d.value.nodeProcess.memory,uptime:d.value.nodeProcess.uptime})}async function De(){await W(),w.value?.code&&(P.value=w.value.code)}function _e(){return!we.value||w.value?.code||re||(re=De().catch(n=>{K.error("Failed to load auth code:",n)}).finally(()=>{re=null})),re}async function ue(){try{const n=await Lt.getWeather({timeoutMs:1e4},{showLoader:!1,loadingKey:"dashboard.weather"});if(n){if(n.hourly&&n.hourly.length>0){const u=new Date;let g=n.hourly[0],H=1/0;for(const B of n.hourly){const F=new Date(B.fxTime),L=Math.abs(u.getTime()-F.getTime());L0&&(I.value.forecast=n.daily.slice(1,5).map(u=>{const g=new Date(u.fxDate);return{fxDate:u.fxDate,dayName:g.toLocaleDateString("zh-CN",{weekday:"short"}),icon:Se(u.iconDay),tempMin:parseInt(u.tempMin)||0,tempMax:parseInt(u.tempMax)||0,text:u.textDay||"未知"}}))}}catch(n){K.error("Failed to load weather:",n),I.value.text="加载失败"}}async function Ge(){try{k.value=(await Tt.getGroupedNews(2,10,{timeoutMs:1e4},{showLoader:!1,loadingKey:"dashboard.news"})).map(n=>({title:n.title,url:zt(n.url),source:n.source||"hot"}))}catch(n){K.error("Failed to load news:",n),k.value=[]}}async function He(){try{const n=await Pt.getDashboardSnapshot();D.value=n.summary,O.value=n.trend,$.value=n.models,Ce.value="",Q.value="ready"}catch(n){const u=n instanceof Error?n.message:String(n),g=typeof n=="object"&&n!==null&&"status"in n&&typeof n.status=="number"?n.status:void 0;K.warn("Failed to load NewAPI monitor:",u),D.value||(Ce.value=u,Q.value=g===502||g===503||u.includes("503")||u.includes("502")||u.includes("未配置")?"unavailable":"error")}}function Se(n){return _n[n]||Sn}function Ee(){if(!i.value||(oe=i.value.getContext("2d"),!oe))return;const n=i.value.parentElement;n&&(i.value.width=n.clientWidth,i.value.height=200),ce()}function ce(){if(!oe||!i.value)return;const n=oe,u=i.value.width,g=i.value.height;n.clearRect(0,0,u,g),n.strokeStyle="var(--border-color)",n.lineWidth=.5;for(let L=0;L<5;L++){const se=g/5*L;n.beginPath(),n.moveTo(0,se),n.lineTo(u,se),n.stroke()}const H=X.value,B=u/(H.length-1),F=Math.max(...H,100);n.beginPath(),n.strokeStyle=r.value==="dark"?"#38bdf8":"#0284c7",n.lineWidth=2,H.forEach((L,se)=>{const me=se*B,fe=g-L/F*g*.8-10;se===0?n.moveTo(me,fe):n.lineTo(me,fe)}),n.stroke(),n.lineTo(u,g),n.lineTo(0,g),n.closePath(),n.fillStyle=r.value==="dark"?"rgba(56, 189, 248, 0.1)":"rgba(2, 132, 199, 0.1)",n.fill()}function pe(n){const u=/\[(\d{4}\/\d{1,2}\/\d{1,2}\s\d{1,2}:\d{2}:\d{2})\]/;let g=null;for(const H of n){const B=H.match(u);if(!B||!B[1])continue;const F=new Date(B[1]);isNaN(F.getTime())||(!g||F>g)&&(g=F)}return g}async function xe(){try{const n=Y.value>0?await ve.getIncrementalServerLog(Y.value,{timeoutMs:1e4,retry:je},{showLoader:!1}):await ve.getServerLog({timeoutMs:1e4,retry:je},{showLoader:!1});if(n.needFullReload){Y.value=0,ae.value="",await Be();return}Ne(n)}catch(n){K.error("Failed to update activity data:",n),X.value.push(0),X.value.length>at&&X.value.shift()}s.value&&ce()}function Te(n){X.value.push(n),X.value.length>at&&X.value.shift()}function Ne(n){const u=n.content||"";if(Y.value=n.offset??n.fileSize??Y.value+u.length,U.value===null){const{displayedLines:fe,trailingFragment:Ae}=qe(u);ae.value=Ae,U.value=pe(fe),Te(0);return}const{completeLines:g,displayedLines:H,trailingFragment:B}=qe(u,ae.value);ae.value=B;let F=0,L=null;const se=/\[(\d{4}\/\d{1,2}\/\d{1,2}\s\d{1,2}:\d{2}:\d{2})\]/;for(const fe of g){const Ae=fe.match(se);if(!Ae||!Ae[1])continue;const Re=new Date(Ae[1]);isNaN(Re.getTime())||((!U.value||Re>U.value)&&F++,(!L||Re>L)&&(L=Re))}const me=pe(H);me&&(!L||me>L)&&(L=me),L&&(U.value=L),Te(F)}async function Be(){const n=await ve.getServerLog({timeoutMs:1e4,retry:je},{showLoader:!1}),{displayedLines:u,trailingFragment:g}=qe(n.content||"");ae.value=g,Y.value=n.offset??n.fileSize??ct(n.content||"").length,U.value=pe(u),Te(0)}ie([i,le],([n,u])=>{if(!(n instanceof HTMLCanvasElement)||!u){oe=null;return}Ee()},{flush:"post"}),ie(r,()=>{s.value&&ce()});function Fe(n,u){if(u){n.start();return}n.stop()}const a=Pe(async()=>{await Ye()},{interval:pn,immediate:!0,onError:n=>{K.error("Monitor polling failed:",n)}}),t=Pe(xe,{interval:mn,immediate:!0,onError:n=>{K.error("Log polling failed:",n)}}),l=Pe(ue,{interval:fn,immediate:!0,onError:n=>{K.error("Weather polling failed:",n)}}),p=Pe(Ge,{interval:vn,immediate:!0,onError:n=>{K.error("News polling failed:",n)}}),E=Pe(He,{interval:yn,immediate:!0,onError:n=>{K.error("NewAPI monitor polling failed:",n)}}),T=[{controller:a,enabled:Me},{controller:t,enabled:le},{controller:l,enabled:Le},{controller:p,enabled:ze},{controller:E,enabled:ke}];function R(){T.forEach(({controller:n})=>{n.stop()})}function G(){if(!de)return;const n=ee.value;T.forEach(({controller:u,enabled:g})=>{Fe(u,n&&g.value)})}function j(){ee.value=document.visibilityState==="visible",G()}return ie([ee,Me,le,Le,ze,ke],()=>{G()}),ie([we,ee],([n,u])=>{!de||!n||!u||_e()}),rt(()=>{de=!0,i.value&&le.value&&Ee(),we.value&&ee.value&&_e(),G(),document.addEventListener("visibilitychange",j)}),it(()=>{de=!1,R(),document.removeEventListener("visibilitychange",j)}),{cpuUsage:f,cpuPlatform:_,cpuArch:y,memUsage:S,memInfo:N,vcpMemUsage:M,pm2Processes:c,nodeInfo:A,userAuthCode:P,weather:I,newsItems:k,newApiMonitorSummary:D,newApiMonitorTrend:O,newApiMonitorModels:$,newApiMonitorStatus:Q,newApiMonitorError:Ce,activityCanvas:i}}var Tn={id:"dashboard-section",class:"config-section active-section"},An={class:"dashboard-layout-toolbar"},Pn={class:"dashboard-layout-actions"},Mn={key:0,class:"dashboard-loading"},Ln={key:1,class:"dashboard-empty"},zn=["data-card-id"],kn=["onPointerdown"],Dn=["aria-label","onPointerdown"],xn={class:"dashboard-drag-ghost-shell"},Nn={class:"dashboard-drag-ghost-title"},Rn=8,On=Oe({__name:"Dashboard",setup(e){const o=m([]),s=En(o),r=et(),i=b(()=>r.theme),{cards:d,contributionMap:h,catalogReady:z}=Gt(b(()=>Rt(s))),{instances:v,addCard:w,removeInstance:W,replaceInstances:f,resetLayout:_,setInstanceEnabled:y,setInstanceSize:S}=jt(d,z),N=m(null),M=m(null),c=m(null),A=m(null),P=m(null),I=m(null),k=m(null),D=m(null),O=m("after"),$=bt(null),Q=m(!1),Ce=b(()=>A.value??v.value.map(a=>a.instanceId)),X=b(()=>P.value?P.value:Object.fromEntries(v.value.map(a=>[a.instanceId,a.size]))),U=b(()=>{const a=new Map(v.value.map(t=>[t.instanceId,t]));return Ce.value.map(t=>a.get(t)).filter(t=>t!==void 0).map(t=>{const l=h.value.get(t.typeId)??null;return{instance:t,contribution:l,label:l?.title??t.typeId}})}),Y=b(()=>U.value.filter(a=>a.instance.enabled!==!1));ie(Y,a=>{o.value=[...new Set(a.flatMap(t=>Ne(t.contribution)?[t.contribution.renderer.componentKey]:[]))]},{immediate:!0});const ae=b(()=>I.value?U.value.find(a=>a.instance.instanceId===I.value)??null:null);function ee(){return Object.fromEntries(v.value.map(a=>[a.instanceId,{...a.size}]))}function te(a){const t=v.value.find(p=>p.instanceId===a),l=t?h.value.get(t.typeId):void 0;return l?{minSize:l.minSize,maxSize:l.maxSize}:{minSize:{desktopCols:1,tabletCols:1,rows:4},maxSize:{desktopCols:12,tabletCols:6,rows:60}}}function Me(a){const t=X.value[a];return{"--dashboard-card-cols-desktop":String(t.desktopCols),"--dashboard-card-cols-tablet":String(t.tabletCols),"--dashboard-card-rows":String(t.rows)}}function we(a){return a<=1?"mobile":a<=6?"tablet":"desktop"}function Le(){const a=N.value;if(!(a instanceof HTMLElement))return null;const t=window.getComputedStyle(a),l=t.gridTemplateColumns.split(" ").map(G=>G.trim()).filter(Boolean).length;if(l===0)return null;const p=Number.parseFloat(t.columnGap)||0,E=Number.parseFloat(t.rowGap)||0,T=Number.parseFloat(t.gridAutoRows)||10,{width:R}=a.getBoundingClientRect();return{columnCount:l,columnWidth:(R-p*(l-1))/l,columnGap:p,rowSize:T,rowGap:E}}function ze(a){const t=M.value;if(!t)return;const l=a.currentX-a.startX,p=Math.max(-2.2,Math.min(2.2,l/30));t.style.left=`${a.currentX-a.offsetX}px`,t.style.top=`${a.currentY-a.offsetY}px`,t.style.width=`${a.cardWidth}px`,t.style.height=`${a.cardHeight}px`,t.style.transform=`translate3d(0, 0, 0) scale(1.018) rotate(${p}deg)`}function ke(a,t,l){const p=a.getBoundingClientRect(),E=t-(p.left+p.width/2),T=l-(p.top+p.height/2);return Math.abs(E)>Math.abs(T)?E<0?"before":"after":T<0?"before":"after"}function le(a,t){const l=c.value;if(!I.value||!l||l.mode!=="reorder")return;const p=document.elementFromPoint(a,t);if(!(p instanceof Element))return;const E=p.closest(".dashboard-item[data-card-id]");if(!(E instanceof HTMLElement))return;const T=E.dataset.cardId;if(!T||T===I.value){D.value=I.value;return}const R=A.value??[...v.value.map(n=>n.instanceId)],G=ke(E,a,t),j=Nt(R,I.value,T,G);D.value=T,O.value=G,j.some((n,u)=>n!==R[u])&&(A.value=j)}function oe(a){const t=te(a.instanceId),l=a.currentX-a.startX,p=a.currentY-a.startY,E=a.metrics.columnWidth+a.metrics.columnGap,T=a.metrics.rowSize+a.metrics.rowGap,R=a.breakpoint==="mobile"?0:Math.round(l/Math.max(E,1)),G=Math.round(p/Math.max(T,1)),j=a.breakpoint==="desktop"?Math.min(t.maxSize.desktopCols,Math.max(t.minSize.desktopCols,a.startSize.desktopCols+R)):a.startSize.desktopCols,n={desktopCols:j,tabletCols:a.breakpoint==="tablet"?Math.min(Math.min(t.maxSize.tabletCols,j),Math.max(t.minSize.tabletCols,a.startSize.tabletCols+R)):Math.min(a.startSize.tabletCols,j),rows:Math.min(t.maxSize.rows,Math.max(t.minSize.rows,a.startSize.rows+G))},u=a.nextSize;u.desktopCols===n.desktopCols&&u.tabletCols===n.tabletCols&&u.rows===n.rows||(a.nextSize=n,P.value={...P.value??ee(),[a.instanceId]:n})}function de(){const a=c.value;!a||a.rafId!==null||(a.rafId=requestAnimationFrame(()=>{const t=c.value;if(t){if(t.rafId=null,t.mode==="reorder"){const l=t.currentX-t.startX,p=t.currentY-t.startY,E=Math.hypot(l,p);if(!t.dragging&&ER.instanceId)];const T=ae.value;T&&($.value={label:T.label})}ze(t),le(t.currentX,t.currentY);return}oe(t)}}))}function re(a){const t=a?.captureElement;t instanceof HTMLElement&&a&&t.hasPointerCapture(a.pointerId)&&t.releasePointerCapture(a.pointerId)}function Ye(){window.removeEventListener("pointermove",Se),window.removeEventListener("pointerup",Ee),window.removeEventListener("pointercancel",ce),window.removeEventListener("blur",pe),document.removeEventListener("visibilitychange",xe)}function De(){const a=c.value;a?.rafId!=null&&cancelAnimationFrame(a.rafId),re(a),Ye(),c.value=null,A.value=null,P.value=null,I.value=null,k.value=null,D.value=null,O.value="after",$.value=null}function _e(){window.addEventListener("pointermove",Se,{passive:!1}),window.addEventListener("pointerup",Ee,{passive:!1}),window.addEventListener("pointercancel",ce,{passive:!1}),window.addEventListener("blur",pe),document.addEventListener("visibilitychange",xe)}function ue(a){const t=c.value;if(t){if(a){if(t.mode==="reorder"&&t.dragging&&A.value){const l=new Map(v.value.map(p=>[p.instanceId,p]));f(A.value.map(p=>l.get(p)).filter(p=>p!==void 0))}t.mode==="resize"&&P.value&&S(t.instanceId,P.value[t.instanceId])}De()}}function Ge(a,t){if(c.value||t.pointerType==="mouse"&&t.button!==0)return;const l=t.currentTarget;if(!(l instanceof HTMLElement))return;const p=l.closest(".dashboard-item");if(!(p instanceof HTMLElement))return;t.preventDefault(),t.stopPropagation();const E=p.getBoundingClientRect();l.setPointerCapture(t.pointerId),_e(),c.value={mode:"reorder",pointerId:t.pointerId,instanceId:a,startX:t.clientX,startY:t.clientY,currentX:t.clientX,currentY:t.clientY,offsetX:t.clientX-E.left,offsetY:t.clientY-E.top,cardWidth:E.width,cardHeight:E.height,dragging:!1,rafId:null,captureElement:l}}function He(a,t){if(c.value||t.pointerType==="mouse"&&t.button!==0)return;const l=t.currentTarget;if(!(l instanceof HTMLElement))return;const p=Le();if(!p)return;const E=v.value.find(R=>R.instanceId===a);if(!E)return;t.preventDefault(),t.stopPropagation();const T={...E.size};P.value={...ee(),[a]:T},k.value=a,l.setPointerCapture(t.pointerId),_e(),c.value={mode:"resize",pointerId:t.pointerId,instanceId:a,startX:t.clientX,startY:t.clientY,currentX:t.clientX,currentY:t.clientY,startSize:T,nextSize:T,breakpoint:we(p.columnCount),metrics:p,rafId:null,captureElement:l}}function Se(a){const t=c.value;!t||t.pointerId!==a.pointerId||(t.currentX=a.clientX,t.currentY=a.clientY,a.preventDefault(),de())}function Ee(a){const t=c.value;!t||t.pointerId!==a.pointerId||(a.preventDefault(),ue(!0))}function ce(a){const t=c.value;!t||t.pointerId!==a.pointerId||ue(!1)}function pe(){c.value&&ue(!0)}function xe(){document.visibilityState==="hidden"&&c.value&&ue(!0)}function Te(a){w(a)}function Ne(a){return a?.renderer.kind==="builtin"}function Be(a){return a?.renderer.kind==="web-component"}function Fe(a){y(a.instanceId,a.enabled)}return pt(()=>{De()}),(a,t)=>(x(),Z("section",Tn,[Ke(xt),C("div",An,[t[4]||(t[4]=C("p",{class:"dashboard-layout-hint"}," 按住卡片顶部拖动排序,右下角调整大小,布局会自动保存到本地。 ",-1)),C("div",Pn,[C("button",{type:"button",class:"btn-primary dashboard-layout-manage",onClick:t[0]||(t[0]=l=>Q.value=!0)}," 管理卡片 "),C("button",{type:"button",class:"btn-secondary dashboard-layout-reset",onClick:t[1]||(t[1]=(...l)=>ne(_)&&ne(_)(...l))}," 恢复默认 ")])]),ne(z)?Y.value.length===0?(x(),Z("div",Ln,[t[7]||(t[7]=C("span",{class:"material-symbols-outlined dashboard-empty-icon"},"dashboard",-1)),t[8]||(t[8]=C("h3",null,"还没有添加任何卡片",-1)),t[9]||(t[9]=C("p",null,'点击"管理卡片"按钮开始自定义你的 Dashboard',-1)),C("button",{type:"button",class:"btn-primary dashboard-empty-btn",onClick:t[2]||(t[2]=l=>Q.value=!0)},[...t[6]||(t[6]=[C("span",{class:"material-symbols-outlined"},"add",-1),It(" 管理卡片 ",-1)])])])):(x(),Z("div",{key:2,ref_key:"dashboardGridElement",ref:N,class:"dashboard-grid"},[Ke(St,{name:"dashboard-grid"},{default:ft(()=>[(x(!0),Z(gt,null,vt(Y.value,l=>(x(),Z("div",{key:l.instance.instanceId,"data-card-id":l.instance.instanceId,style:mt(Me(l.instance.instanceId)),class:wt(["dashboard-item",{"dashboard-item--dragging":I.value===l.instance.instanceId,"dashboard-item--resizing":k.value===l.instance.instanceId,"dashboard-item--drop-before":I.value!==null&&D.value===l.instance.instanceId&&O.value==="before","dashboard-item--drop-after":I.value!==null&&D.value===l.instance.instanceId&&O.value==="after","dashboard-item--pointer-active":c.value?.instanceId===l.instance.instanceId}])},[C("div",{class:"dashboard-item-dragzone",onPointerdown:p=>Ge(l.instance.instanceId,p)},null,40,kn),Ne(l.contribution)?(x(),ge(Zt,{key:0,contribution:l.contribution,state:ne(s)},null,8,["contribution","state"])):Be(l.contribution)?(x(),ge(cn,{key:1,contribution:l.contribution,instance:l.instance,theme:i.value},null,8,["contribution","instance","theme"])):(x(),ge(ut,{key:2,instance:l.instance},null,8,["instance"])),C("button",{type:"button",class:"dashboard-item-resize-handle","aria-label":`调整 ${l.label} 大小`,onPointerdown:p=>He(l.instance.instanceId,p)},null,40,Dn)],14,zn))),128))]),_:1})],512)):(x(),Z("div",Mn,[...t[5]||(t[5]=[C("div",{class:"dashboard-loading-spinner"},null,-1),C("p",null,"加载 Dashboard 卡片…",-1)])])),$.value?(x(),Z("div",{key:3,ref_key:"dragGhostElement",ref:M,class:"dashboard-drag-ghost"},[C("div",xn,[t[10]||(t[10]=C("div",{class:"dashboard-drag-ghost-bar"},null,-1)),C("div",Nn,he($.value.label),1)])],512)):st("",!0),Ke(Dt,{modelValue:Q.value,"onUpdate:modelValue":t[3]||(t[3]=l=>Q.value=l),contributions:ne(d),instances:ne(v),onAddCard:Te,onToggleInstance:Fe,onRemoveInstance:ne(W),onResetLayout:ne(_)},null,8,["modelValue","contributions","instances","onRemoveInstance","onResetLayout"])]))}}),Kn=lt(On,[["__scopeId","data-v-07bd6af3"]]);export{Kn as default}; diff --git a/AdminPanel-Vue/dist/assets/js/DreamManager-DzVdkS9U.js b/AdminPanel-Vue/dist/assets/js/DreamManager-B-hn_w0p.js similarity index 98% rename from AdminPanel-Vue/dist/assets/js/DreamManager-DzVdkS9U.js rename to AdminPanel-Vue/dist/assets/js/DreamManager-B-hn_w0p.js index 68c009a87..8aa039623 100644 --- a/AdminPanel-Vue/dist/assets/js/DreamManager-DzVdkS9U.js +++ b/AdminPanel-Vue/dist/assets/js/DreamManager-B-hn_w0p.js @@ -1 +1 @@ -import{Dt as l,N as c,O as j,Q as I,a as o,d as m,f as n,j as i,l as r,n as B,v as z,wt as p}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{d as C}from"./dashboard-card-news-BnyB_dHU.js";import{G as S,v as f}from"./dashboard-card-calendar-CA3-tSpi.js";import{t as E}from"./useMarkdownRenderer-BShYGq9a.js";var J={class:"config-section active-section"},P={id:"dream-manager-content"},R={key:0,class:"dream-placeholder"},G={key:1,class:"dream-error-message"},K={key:2,class:"dream-empty-state"},Q=["onClick"],q={class:"dream-log-title"},W={class:"dream-log-meta"},X={key:0,class:"dream-log-ops-summary"},Y={key:1,class:"dream-log-detail"},Z={key:0,class:"dream-placeholder detail"},U={key:1,class:"dream-error-message"},ee={key:0,class:"dream-narrative-block"},te=["innerHTML"],ae={class:"dream-ops-list"},se={class:"dream-op-header"},re={class:"dream-op-type"},ne={class:"dream-op-body"},ie={class:"dream-op-field"},le={class:"dream-file-list"},de={class:"dream-op-field"},ue=["innerHTML"],oe={key:0,class:"dream-source-details"},me=["innerHTML"],ce={class:"dream-op-field"},ve={class:"dream-file-path"},pe={class:"dream-op-field"},ge={key:0,class:"dream-source-details"},_e=["innerHTML"],fe={class:"dream-op-field"},ye={class:"dream-file-list"},he={class:"dream-op-field"},ke=["innerHTML"],we={key:3,class:"dream-op-raw"},De={key:0,class:"dream-op-actions"},be=["onClick"],Ce=["onClick"],Se={key:1,class:"dream-reviewed-info"},He=z({__name:"DreamManager",setup(Le){const{renderMarkdownSync:v,initializeRenderer:y}=E(),u=I({status:"loading"});function _(e){return e instanceof Error?e.message:String(e)}function g(e){if(!e)return"(未知)";const a=e.replace(/\\/g,"/").split("/");return a[a.length-1]||e}function h(e){if(!e)return"未知时间";const a=new Date(e);return Number.isNaN(a.getTime())?"未知时间":a.toLocaleString("zh-CN")}function k(e){switch(e){case"merge":return"合并";case"delete":return"删除";case"insight":return"感悟";default:return e||"未知"}}function H(e){switch(e){case"merge":return"🔀";case"delete":return"🗑️";case"insight":return"💡";default:return"❓"}}function w(e){switch(e){case"pending_review":return"待审批";case"approved":return"已批准";case"rejected":return"已拒绝";case"error":return"执行出错";default:return e||"未知"}}function L(e){return{type:e.type||"unknown",status:e.status||"unknown"}}function M(e){return{id:e.filename,filename:e.filename,agentName:e.agentName||"未知",timestamp:e.timestamp,operationCount:e.operationCount??0,pendingCount:e.pendingCount??0,operationSummary:Array.isArray(e.operationSummary)?e.operationSummary.map(L):[],expanded:!1,detailState:{status:"idle"}}}function $(e,a){const s=e.type||"unknown",t=e.status||"unknown";return{id:String(e.operationId??e.id??a),type:s,typeLabel:k(s),typeIcon:H(s),status:t,statusLabel:w(t),isPending:t==="pending_review",reviewedAt:e.reviewedAt}}function T(e,a){const s=$(e,a);switch(s.type){case"merge":return{...s,kind:"merge",sourceFiles:(e.sourceDiaries||[]).map(g),contentHtml:v(e.newContent||"(空)"),sourceDetails:Object.entries(e.sourceContents||{}).map(([t,d])=>({name:g(t),contentHtml:v(d||"")}))};case"delete":return{...s,kind:"delete",targetFile:g(e.targetDiary),reason:e.reason||"(无)",targetContentHtml:e.targetContent?v(e.targetContent):""};case"insight":return{...s,kind:"insight",referenceFiles:(e.referenceDiaries||[]).map(g),contentHtml:v(e.insightContent||"(空)")};default:return{...s,kind:"unknown",rawJson:JSON.stringify(e,null,2)}}}function N(e){return{narrativeHtml:e.dreamNarrative?v(e.dreamNarrative):"",operations:Array.isArray(e.operations)?e.operations.map(T):[]}}function O(){return u.value.status!=="loaded"?null:u.value.dreams}async function D(){u.value={status:"loading"};try{u.value={status:"loaded",dreams:(await f.getDreamLogSummaries()).map(M).sort((e,a)=>{const s=e.timestamp?new Date(e.timestamp).getTime():0;return(a.timestamp?new Date(a.timestamp).getTime():0)-s})}}catch(e){u.value={status:"error",message:_(e)}}}async function x(e){e.detailState={status:"loading"};try{const[a]=await Promise.all([f.getDreamLogDetail(e.filename),y()]);e.detailState={status:"loaded",detail:N(a)}}catch(a){e.detailState={status:"error",message:_(a)}}}function A(e){const a=O();if(!a)return;const s=a.find(t=>t.id===e);s&&(s.expanded=!s.expanded,s.expanded&&x(s))}async function b(e,a,s){const t=s==="approve"?"批准":"拒绝";if(confirm(`确定${t}此操作吗?${s==="approve"?"批准后将执行实际的文件操作。":""}`))try{S((await f.reviewDreamOperation(e,a,s,{loadingKey:`dream-manager.operation.${s}`})).message||`操作已${t}`,"success"),await D()}catch(d){S(`${t}失败: ${_(d)}`,"error")}}async function F(e,a){await b(e,a,"approve")}async function V(e,a){await b(e,a,"reject")}return j(async()=>{await y(),D()}),(e,a)=>(i(),n("section",J,[a[9]||(a[9]=r("p",{class:"description"},"在梦境操作触及日记文件前进行审核。",-1)),r("div",P,[u.value.status==="loading"?(i(),n("p",R," 加载中… ")):u.value.status==="error"?(i(),n("p",G," 加载失败: "+l(u.value.message),1)):u.value.dreams.length===0?(i(),n("div",K,[...a[0]||(a[0]=[r("span",{class:"material-symbols-outlined dream-empty-icon"},"nights_stay",-1),r("p",null,"暂无梦操作日志",-1),r("p",{class:"dream-empty-subtitle"}," 当 Agent 发起梦操作后,日志将出现在这里 ",-1)])])):(i(!0),n(o,{key:3},c(u.value.dreams,s=>(i(),n("div",{key:s.id,class:p(["dream-log-card",{"has-pending":s.pendingCount>0}])},[r("div",{class:"dream-log-header",onClick:t=>A(s.id)},[r("div",q,[a[1]||(a[1]=r("span",{class:"material-symbols-outlined"},"nights_stay",-1)),r("strong",null,l(s.agentName),1),r("span",{class:p(["dream-badge",s.pendingCount>0?"pending":"done"])},l(s.pendingCount>0?`${s.pendingCount} 待审批`:"已处理"),3)]),r("div",W,[r("span",null,l(h(s.timestamp)),1),r("span",null,l(s.operationCount)+" 个操作",1)])],8,Q),s.operationSummary.length>0?(i(),n("div",X,[(i(!0),n(o,null,c(s.operationSummary,(t,d)=>(i(),n("span",{key:`${s.id}:${d}`,class:p(["dream-op-chip",t.status])},l(k(t.type))+" · "+l(w(t.status)),3))),128))])):m("",!0),s.expanded?(i(),n("div",Y,[s.detailState.status==="loading"?(i(),n("p",Z," 加载详情… ")):s.detailState.status==="error"?(i(),n("p",U," 加载失败: "+l(s.detailState.message),1)):s.detailState.status==="loaded"?(i(),n(o,{key:2},[s.detailState.detail.narrativeHtml?(i(),n("div",ee,[a[2]||(a[2]=r("h4",null,"🌙 梦境叙事",-1)),r("div",{class:"dream-narrative-text",innerHTML:s.detailState.detail.narrativeHtml},null,8,te)])):m("",!0),r("div",ae,[(i(!0),n(o,null,c(s.detailState.detail.operations,t=>(i(),n("div",{key:t.id,class:p(["dream-op-card",t.status])},[r("div",se,[r("span",re,l(t.typeIcon)+" "+l(t.typeLabel),1),r("span",{class:p(["dream-op-status",t.status])},l(t.statusLabel),3)]),r("div",ne,[t.kind==="merge"?(i(),n(o,{key:0},[r("div",ie,[r("label",null,"源日记 ("+l(t.sourceFiles.length)+" 篇)",1),r("div",le,[(i(!0),n(o,null,c(t.sourceFiles,d=>(i(),n("code",{key:`${t.id}:${d}`,class:"dream-file-path"},l(d),1))),128))])]),r("div",de,[a[3]||(a[3]=r("label",null,"合并后内容",-1)),r("div",{class:"dream-content-preview",innerHTML:t.contentHtml},null,8,ue)]),t.sourceDetails.length>0?(i(),n("details",oe,[a[4]||(a[4]=r("summary",null,"📄 查看源日记原文",-1)),(i(!0),n(o,null,c(t.sourceDetails,d=>(i(),n("div",{key:`${t.id}:${d.name}`,class:"dream-source-item"},[r("strong",null,l(d.name),1),r("div",{class:"dream-content-preview",innerHTML:d.contentHtml},null,8,me)]))),128))])):m("",!0)],64)):t.kind==="delete"?(i(),n(o,{key:1},[r("div",ce,[a[5]||(a[5]=r("label",null,"目标日记",-1)),r("code",ve,l(t.targetFile),1)]),r("div",pe,[a[6]||(a[6]=r("label",null,"删除理由",-1)),r("p",null,l(t.reason),1)]),t.targetContentHtml?(i(),n("details",ge,[a[7]||(a[7]=r("summary",null,"📄 查看待删除内容",-1)),r("div",{class:"dream-content-preview",innerHTML:t.targetContentHtml},null,8,_e)])):m("",!0)],64)):t.kind==="insight"?(i(),n(o,{key:2},[r("div",fe,[r("label",null," 参考日记 ("+l(t.referenceFiles.length)+" 篇) ",1),r("div",ye,[(i(!0),n(o,null,c(t.referenceFiles,d=>(i(),n("code",{key:`${t.id}:${d}`,class:"dream-file-path"},l(d),1))),128))])]),r("div",he,[a[8]||(a[8]=r("label",null,"梦感悟内容",-1)),r("div",{class:"dream-content-preview",innerHTML:t.contentHtml},null,8,ke)])],64)):(i(),n("pre",we,l(t.rawJson),1))]),t.isPending?(i(),n("div",De,[r("button",{type:"button",class:"btn-success",onClick:C(d=>F(s.filename,t.id),["stop"])}," ✅ 批准执行 ",8,be),r("button",{type:"button",class:"btn-danger",onClick:C(d=>V(s.filename,t.id),["stop"])}," ❌ 拒绝 ",8,Ce)])):t.reviewedAt?(i(),n("p",Se," 审批时间: "+l(h(t.reviewedAt)),1)):m("",!0)],2))),128))])],64)):m("",!0)])):m("",!0)],2))),128))])]))}}),Oe=B(He,[["__scopeId","data-v-82dcaf56"]]);export{Oe as default}; +import{Dt as l,N as c,O as j,Q as I,a as o,d as m,f as n,j as i,l as r,n as B,v as z,wt as p}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{d as C}from"./dashboard-card-news-BnyB_dHU.js";import{G as S,v as f}from"./dashboard-card-calendar-DWuV34Bn.js";import{t as E}from"./useMarkdownRenderer-DLeytw2l.js";var J={class:"config-section active-section"},P={id:"dream-manager-content"},R={key:0,class:"dream-placeholder"},G={key:1,class:"dream-error-message"},K={key:2,class:"dream-empty-state"},Q=["onClick"],q={class:"dream-log-title"},W={class:"dream-log-meta"},X={key:0,class:"dream-log-ops-summary"},Y={key:1,class:"dream-log-detail"},Z={key:0,class:"dream-placeholder detail"},U={key:1,class:"dream-error-message"},ee={key:0,class:"dream-narrative-block"},te=["innerHTML"],ae={class:"dream-ops-list"},se={class:"dream-op-header"},re={class:"dream-op-type"},ne={class:"dream-op-body"},ie={class:"dream-op-field"},le={class:"dream-file-list"},de={class:"dream-op-field"},ue=["innerHTML"],oe={key:0,class:"dream-source-details"},me=["innerHTML"],ce={class:"dream-op-field"},ve={class:"dream-file-path"},pe={class:"dream-op-field"},ge={key:0,class:"dream-source-details"},_e=["innerHTML"],fe={class:"dream-op-field"},ye={class:"dream-file-list"},he={class:"dream-op-field"},ke=["innerHTML"],we={key:3,class:"dream-op-raw"},De={key:0,class:"dream-op-actions"},be=["onClick"],Ce=["onClick"],Se={key:1,class:"dream-reviewed-info"},He=z({__name:"DreamManager",setup(Le){const{renderMarkdownSync:v,initializeRenderer:y}=E(),u=I({status:"loading"});function _(e){return e instanceof Error?e.message:String(e)}function g(e){if(!e)return"(未知)";const a=e.replace(/\\/g,"/").split("/");return a[a.length-1]||e}function h(e){if(!e)return"未知时间";const a=new Date(e);return Number.isNaN(a.getTime())?"未知时间":a.toLocaleString("zh-CN")}function k(e){switch(e){case"merge":return"合并";case"delete":return"删除";case"insight":return"感悟";default:return e||"未知"}}function H(e){switch(e){case"merge":return"🔀";case"delete":return"🗑️";case"insight":return"💡";default:return"❓"}}function w(e){switch(e){case"pending_review":return"待审批";case"approved":return"已批准";case"rejected":return"已拒绝";case"error":return"执行出错";default:return e||"未知"}}function L(e){return{type:e.type||"unknown",status:e.status||"unknown"}}function M(e){return{id:e.filename,filename:e.filename,agentName:e.agentName||"未知",timestamp:e.timestamp,operationCount:e.operationCount??0,pendingCount:e.pendingCount??0,operationSummary:Array.isArray(e.operationSummary)?e.operationSummary.map(L):[],expanded:!1,detailState:{status:"idle"}}}function $(e,a){const s=e.type||"unknown",t=e.status||"unknown";return{id:String(e.operationId??e.id??a),type:s,typeLabel:k(s),typeIcon:H(s),status:t,statusLabel:w(t),isPending:t==="pending_review",reviewedAt:e.reviewedAt}}function T(e,a){const s=$(e,a);switch(s.type){case"merge":return{...s,kind:"merge",sourceFiles:(e.sourceDiaries||[]).map(g),contentHtml:v(e.newContent||"(空)"),sourceDetails:Object.entries(e.sourceContents||{}).map(([t,d])=>({name:g(t),contentHtml:v(d||"")}))};case"delete":return{...s,kind:"delete",targetFile:g(e.targetDiary),reason:e.reason||"(无)",targetContentHtml:e.targetContent?v(e.targetContent):""};case"insight":return{...s,kind:"insight",referenceFiles:(e.referenceDiaries||[]).map(g),contentHtml:v(e.insightContent||"(空)")};default:return{...s,kind:"unknown",rawJson:JSON.stringify(e,null,2)}}}function N(e){return{narrativeHtml:e.dreamNarrative?v(e.dreamNarrative):"",operations:Array.isArray(e.operations)?e.operations.map(T):[]}}function O(){return u.value.status!=="loaded"?null:u.value.dreams}async function D(){u.value={status:"loading"};try{u.value={status:"loaded",dreams:(await f.getDreamLogSummaries()).map(M).sort((e,a)=>{const s=e.timestamp?new Date(e.timestamp).getTime():0;return(a.timestamp?new Date(a.timestamp).getTime():0)-s})}}catch(e){u.value={status:"error",message:_(e)}}}async function x(e){e.detailState={status:"loading"};try{const[a]=await Promise.all([f.getDreamLogDetail(e.filename),y()]);e.detailState={status:"loaded",detail:N(a)}}catch(a){e.detailState={status:"error",message:_(a)}}}function A(e){const a=O();if(!a)return;const s=a.find(t=>t.id===e);s&&(s.expanded=!s.expanded,s.expanded&&x(s))}async function b(e,a,s){const t=s==="approve"?"批准":"拒绝";if(confirm(`确定${t}此操作吗?${s==="approve"?"批准后将执行实际的文件操作。":""}`))try{S((await f.reviewDreamOperation(e,a,s,{loadingKey:`dream-manager.operation.${s}`})).message||`操作已${t}`,"success"),await D()}catch(d){S(`${t}失败: ${_(d)}`,"error")}}async function F(e,a){await b(e,a,"approve")}async function V(e,a){await b(e,a,"reject")}return j(async()=>{await y(),D()}),(e,a)=>(i(),n("section",J,[a[9]||(a[9]=r("p",{class:"description"},"在梦境操作触及日记文件前进行审核。",-1)),r("div",P,[u.value.status==="loading"?(i(),n("p",R," 加载中… ")):u.value.status==="error"?(i(),n("p",G," 加载失败: "+l(u.value.message),1)):u.value.dreams.length===0?(i(),n("div",K,[...a[0]||(a[0]=[r("span",{class:"material-symbols-outlined dream-empty-icon"},"nights_stay",-1),r("p",null,"暂无梦操作日志",-1),r("p",{class:"dream-empty-subtitle"}," 当 Agent 发起梦操作后,日志将出现在这里 ",-1)])])):(i(!0),n(o,{key:3},c(u.value.dreams,s=>(i(),n("div",{key:s.id,class:p(["dream-log-card",{"has-pending":s.pendingCount>0}])},[r("div",{class:"dream-log-header",onClick:t=>A(s.id)},[r("div",q,[a[1]||(a[1]=r("span",{class:"material-symbols-outlined"},"nights_stay",-1)),r("strong",null,l(s.agentName),1),r("span",{class:p(["dream-badge",s.pendingCount>0?"pending":"done"])},l(s.pendingCount>0?`${s.pendingCount} 待审批`:"已处理"),3)]),r("div",W,[r("span",null,l(h(s.timestamp)),1),r("span",null,l(s.operationCount)+" 个操作",1)])],8,Q),s.operationSummary.length>0?(i(),n("div",X,[(i(!0),n(o,null,c(s.operationSummary,(t,d)=>(i(),n("span",{key:`${s.id}:${d}`,class:p(["dream-op-chip",t.status])},l(k(t.type))+" · "+l(w(t.status)),3))),128))])):m("",!0),s.expanded?(i(),n("div",Y,[s.detailState.status==="loading"?(i(),n("p",Z," 加载详情… ")):s.detailState.status==="error"?(i(),n("p",U," 加载失败: "+l(s.detailState.message),1)):s.detailState.status==="loaded"?(i(),n(o,{key:2},[s.detailState.detail.narrativeHtml?(i(),n("div",ee,[a[2]||(a[2]=r("h4",null,"🌙 梦境叙事",-1)),r("div",{class:"dream-narrative-text",innerHTML:s.detailState.detail.narrativeHtml},null,8,te)])):m("",!0),r("div",ae,[(i(!0),n(o,null,c(s.detailState.detail.operations,t=>(i(),n("div",{key:t.id,class:p(["dream-op-card",t.status])},[r("div",se,[r("span",re,l(t.typeIcon)+" "+l(t.typeLabel),1),r("span",{class:p(["dream-op-status",t.status])},l(t.statusLabel),3)]),r("div",ne,[t.kind==="merge"?(i(),n(o,{key:0},[r("div",ie,[r("label",null,"源日记 ("+l(t.sourceFiles.length)+" 篇)",1),r("div",le,[(i(!0),n(o,null,c(t.sourceFiles,d=>(i(),n("code",{key:`${t.id}:${d}`,class:"dream-file-path"},l(d),1))),128))])]),r("div",de,[a[3]||(a[3]=r("label",null,"合并后内容",-1)),r("div",{class:"dream-content-preview",innerHTML:t.contentHtml},null,8,ue)]),t.sourceDetails.length>0?(i(),n("details",oe,[a[4]||(a[4]=r("summary",null,"📄 查看源日记原文",-1)),(i(!0),n(o,null,c(t.sourceDetails,d=>(i(),n("div",{key:`${t.id}:${d.name}`,class:"dream-source-item"},[r("strong",null,l(d.name),1),r("div",{class:"dream-content-preview",innerHTML:d.contentHtml},null,8,me)]))),128))])):m("",!0)],64)):t.kind==="delete"?(i(),n(o,{key:1},[r("div",ce,[a[5]||(a[5]=r("label",null,"目标日记",-1)),r("code",ve,l(t.targetFile),1)]),r("div",pe,[a[6]||(a[6]=r("label",null,"删除理由",-1)),r("p",null,l(t.reason),1)]),t.targetContentHtml?(i(),n("details",ge,[a[7]||(a[7]=r("summary",null,"📄 查看待删除内容",-1)),r("div",{class:"dream-content-preview",innerHTML:t.targetContentHtml},null,8,_e)])):m("",!0)],64)):t.kind==="insight"?(i(),n(o,{key:2},[r("div",fe,[r("label",null," 参考日记 ("+l(t.referenceFiles.length)+" 篇) ",1),r("div",ye,[(i(!0),n(o,null,c(t.referenceFiles,d=>(i(),n("code",{key:`${t.id}:${d}`,class:"dream-file-path"},l(d),1))),128))])]),r("div",he,[a[8]||(a[8]=r("label",null,"梦感悟内容",-1)),r("div",{class:"dream-content-preview",innerHTML:t.contentHtml},null,8,ke)])],64)):(i(),n("pre",we,l(t.rawJson),1))]),t.isPending?(i(),n("div",De,[r("button",{type:"button",class:"btn-success",onClick:C(d=>F(s.filename,t.id),["stop"])}," ✅ 批准执行 ",8,be),r("button",{type:"button",class:"btn-danger",onClick:C(d=>V(s.filename,t.id),["stop"])}," ❌ 拒绝 ",8,Ce)])):t.reviewedAt?(i(),n("p",Se," 审批时间: "+l(h(t.reviewedAt)),1)):m("",!0)],2))),128))])],64)):m("",!0)])):m("",!0)],2))),128))])]))}}),Oe=B(He,[["__scopeId","data-v-82dcaf56"]]);export{Oe as default}; diff --git a/AdminPanel-Vue/dist/assets/js/DynamicToolsManager-JKX64yof.js b/AdminPanel-Vue/dist/assets/js/DynamicToolsManager-JKX64yof.js deleted file mode 100644 index b752db8a4..000000000 --- a/AdminPanel-Vue/dist/assets/js/DynamicToolsManager-JKX64yof.js +++ /dev/null @@ -1,4 +0,0 @@ -import{Dt as t,N as B,O as X,Q as f,U as i,a as L,c as M,d as p,f as o,h as y,j as u,l,n as Y,v as Z,wt as N}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as k,c as m,d as j}from"./dashboard-card-news-BnyB_dHU.js";import{G as g,m as C}from"./dashboard-card-calendar-CA3-tSpi.js";import{i as ee}from"./vue-vendor-BUOVPpjf.js";var le={class:"config-section active-section dynamic-tools-page"},se={class:"summary-grid"},ae={class:"summary-item"},ne={class:"summary-item"},te={class:"summary-item"},ie={class:"summary-item"},oe={key:0,class:"warning-box"},ue={class:"panel-grid"},re={class:"switch-row"},de={class:"switch"},me={class:"form-grid"},ve={class:"field"},pe={class:"field"},ye={class:"field"},ge={class:"field"},be={class:"field"},fe={class:"field"},ce={class:"switch-row"},xe={class:"switch"},Me={class:"switch-row"},Ce={class:"switch"},we={class:"switch-row"},Ke={class:"switch"},Oe={class:"field"},ke={class:"field"},Te=["disabled"],he={class:"card operations-card"},Ae={class:"card-header"},Pe={class:"header-actions"},Ee={class:"field alias-field"},Ie={class:"card records-card"},Ve={class:"card-header records-header"},De={class:"records-table-wrap"},Ue={class:"records-table"},_e={class:"badge"},$e={class:"status-stack"},Se={key:0,class:"status-pill status-pill--warning"},Be={key:1,class:"status-pill status-pill--danger"},Le={key:2,class:"status-pill status-pill--info"},Ne={class:"tag-list"},je={key:0,class:"muted"},Re={class:"brief-cell"},Fe={class:"row-actions"},ze=["onClick"],qe=["onClick"],Ge={key:0,class:"empty-state"},T="{{VCPDynamicTools}}",Qe=Z({__name:"DynamicToolsManager",setup(We){function V(){return{enabled:!0,placeholder:T,maxBriefListItems:120,maxExpandedPlugins:4,maxForcedCategoryPlugins:12,maxInjectionChars:16e3,classificationDebounceMs:1e3,classifierTimeoutMs:3e4,useRagEmbeddings:!0,manualOverrides:{excludedOriginKeys:[],pinnedOriginKeys:[],categoryAliases:{}},smallModel:{enabled:!1,useMainConfig:!0,endpoint:"",model:""}}}function w(n){const e=V();return{...e,...n||{},manualOverrides:{...e.manualOverrides,...n?.manualOverrides||{},excludedOriginKeys:Array.isArray(n?.manualOverrides?.excludedOriginKeys)?n.manualOverrides.excludedOriginKeys:[],pinnedOriginKeys:Array.isArray(n?.manualOverrides?.pinnedOriginKeys)?n.manualOverrides.pinnedOriginKeys:[],categoryAliases:n?.manualOverrides?.categoryAliases||{}},smallModel:{...e.smallModel,...n?.smallModel||{},useMainConfig:n?.smallModel?.useMainConfig!==!1}}}function K(n){return Object.entries(n).map(([e,s])=>`${e}=${s}`).join(` -`)}function R(n){const e={};for(const s of n.split(/\r?\n/)){const d=s.trim();if(!d||d.startsWith("#"))continue;const I=d.indexOf("=");if(I<=0)continue;const $=d.slice(0,I).trim(),S=d.slice(I+1).trim();$&&S&&(e[$]=S)}return e}const F=ee(),b=f(null),a=f(V()),v=f(""),h=f(""),r=f(""),c=f("info"),O=M(()=>b.value?.records||[]),z=M(()=>O.value.filter(n=>n.available).length),q=M(()=>new Set(a.value.manualOverrides.excludedOriginKeys)),G=M(()=>new Set(a.value.manualOverrides.pinnedOriginKeys)),D=M(()=>{const n=h.value.toLowerCase();return n?O.value.filter(e=>[e.originKey,e.pluginName,e.displayName,e.brief,...e.categories,...e.keywords].join(" ").toLowerCase().includes(n)):O.value});function U(n){b.value=n,a.value=w(n.config),v.value=K(a.value.manualOverrides.categoryAliases)}async function x(){try{U(await C.getState({showLoader:!1,loadingKey:"dynamic-tools.state.load"}))}catch(n){g(`加载动态工具清单失败:${n instanceof Error?n.message:String(n)}`,"error")}}async function _(){try{const n={...a.value.manualOverrides,categoryAliases:R(v.value)};a.value=w(await C.saveConfig({enabled:a.value.enabled,maxBriefListItems:a.value.maxBriefListItems,maxExpandedPlugins:a.value.maxExpandedPlugins,maxForcedCategoryPlugins:a.value.maxForcedCategoryPlugins,maxInjectionChars:a.value.maxInjectionChars,classificationDebounceMs:a.value.classificationDebounceMs,classifierTimeoutMs:a.value.classifierTimeoutMs,useRagEmbeddings:a.value.useRagEmbeddings,smallModel:{enabled:a.value.smallModel.enabled,useMainConfig:a.value.smallModel.useMainConfig,endpoint:a.value.smallModel.endpoint,model:a.value.smallModel.model},manualOverrides:n},{loadingKey:"dynamic-tools.config.save"})),v.value=K(a.value.manualOverrides.categoryAliases),r.value="动态工具配置已保存",c.value="success",g(r.value,"success"),await x()}catch(n){r.value=`保存失败:${n instanceof Error?n.message:String(n)}`,c.value="error",g(r.value,"error")}}async function A(n){try{U(await C.rebuild(n,{loadingKey:`dynamic-tools.rebuild.${n}`})),r.value="重建任务已完成",c.value="success",g(r.value,"success")}catch(e){r.value=`重建失败:${e instanceof Error?e.message:String(e)}`,c.value="error",g(r.value,"error")}}function P(n){return G.value.has(n)}function E(n){return q.value.has(n)}async function Q(n){const e=!P(n.originKey);a.value=w(await C.updateOverride({originKey:n.originKey,pinned:e},{loadingKey:"dynamic-tools.override.pin"})),v.value=K(a.value.manualOverrides.categoryAliases),await x()}async function W(n){const e=!E(n.originKey);a.value=w(await C.updateOverride({originKey:n.originKey,excluded:e},{loadingKey:"dynamic-tools.override.exclude"})),v.value=K(a.value.manualOverrides.categoryAliases),await x()}async function H(){try{await navigator.clipboard.writeText(T),g("占位符已复制","success")}catch{g(T,"info")}}function J(){F.push({name:"PluginConfig",params:{pluginName:"DynamicToolBridge"}})}return X(()=>{x()}),(n,e)=>(u(),o("section",le,[l("div",{class:"dynamic-tools-header"},[l("div",null,[e[17]||(e[17]=l("h2",null,"动态工具清单",-1)),l("p",{class:"description"},"管理 "+t(T)+" 的注入配置、分类状态和工具暴露规则。")]),l("div",{class:"header-actions"},[l("button",{type:"button",class:"btn-secondary btn-sm btn-sm-touch",onClick:x},[...e[18]||(e[18]=[l("span",{class:"material-symbols-outlined"},"refresh",-1),y(" 刷新 ",-1)])]),l("button",{type:"button",class:"btn-primary btn-sm btn-sm-touch",onClick:H},[...e[19]||(e[19]=[l("span",{class:"material-symbols-outlined"},"content_copy",-1),y(" 复制占位符 ",-1)])])])]),l("div",se,[l("div",ae,[e[20]||(e[20]=l("span",{class:"summary-label"},"可用工具",-1)),l("strong",null,t(z.value),1)]),l("div",ne,[e[21]||(e[21]=l("span",{class:"summary-label"},"总记录",-1)),l("strong",null,t(O.value.length),1)]),l("div",te,[e[22]||(e[22]=l("span",{class:"summary-label"},"分类队列",-1)),l("strong",null,t(b.value?.queueSize??0),1)]),l("div",ie,[e[23]||(e[23]=l("span",{class:"summary-label"},"快照",-1)),l("strong",null,t(b.value?.snapshotId??"-"),1)])]),b.value?.lastError?(u(),o("div",oe,[e[24]||(e[24]=l("span",{class:"material-symbols-outlined"},"warning",-1)),l("span",null,t(b.value.lastError),1)])):p("",!0),l("div",ue,[l("form",{class:"card config-card",onSubmit:j(_,["prevent"])},[e[35]||(e[35]=l("div",{class:"card-header"},[l("h3",null,"注入配置"),l("button",{type:"submit",class:"btn-success btn-sm btn-sm-touch"},[l("span",{class:"material-symbols-outlined"},"save"),y(" 保存 ")])],-1)),l("div",re,[e[26]||(e[26]=l("span",null,"启用动态工具清单",-1)),l("label",de,[i(l("input",{type:"checkbox","onUpdate:modelValue":e[0]||(e[0]=s=>a.value.enabled=s)},null,512),[[k,a.value.enabled]]),e[25]||(e[25]=l("span",{class:"slider"},null,-1))])]),l("div",me,[l("label",ve,[e[27]||(e[27]=l("span",null,"轻量清单数量",-1)),i(l("input",{type:"number",min:"1",max:"500","onUpdate:modelValue":e[1]||(e[1]=s=>a.value.maxBriefListItems=s)},null,512),[[m,a.value.maxBriefListItems,void 0,{number:!0}]])]),l("label",pe,[e[28]||(e[28]=l("span",null,"语义命中展开数",-1)),i(l("input",{type:"number",min:"0",max:"50","onUpdate:modelValue":e[2]||(e[2]=s=>a.value.maxExpandedPlugins=s)},null,512),[[m,a.value.maxExpandedPlugins,void 0,{number:!0}]])]),l("label",ye,[e[29]||(e[29]=l("span",null,"点名分类展开数",-1)),i(l("input",{type:"number",min:"1",max:"100","onUpdate:modelValue":e[3]||(e[3]=s=>a.value.maxForcedCategoryPlugins=s)},null,512),[[m,a.value.maxForcedCategoryPlugins,void 0,{number:!0}]])]),l("label",ge,[e[30]||(e[30]=l("span",null,"最大注入字符数",-1)),i(l("input",{type:"number",min:"1000",max:"120000",step:"1000","onUpdate:modelValue":e[4]||(e[4]=s=>a.value.maxInjectionChars=s)},null,512),[[m,a.value.maxInjectionChars,void 0,{number:!0}]])]),l("label",be,[e[31]||(e[31]=l("span",null,"分类去抖 ms",-1)),i(l("input",{type:"number",min:"0",max:"60000",step:"100","onUpdate:modelValue":e[5]||(e[5]=s=>a.value.classificationDebounceMs=s)},null,512),[[m,a.value.classificationDebounceMs,void 0,{number:!0}]])]),l("label",fe,[e[32]||(e[32]=l("span",null,"分类超时 ms",-1)),i(l("input",{type:"number",min:"100",max:"120000",step:"1000","onUpdate:modelValue":e[6]||(e[6]=s=>a.value.classifierTimeoutMs=s)},null,512),[[m,a.value.classifierTimeoutMs,void 0,{number:!0}]])])]),l("div",ce,[e[34]||(e[34]=l("span",null,"启用 RAG embedding 降级分类",-1)),l("label",xe,[i(l("input",{type:"checkbox","onUpdate:modelValue":e[7]||(e[7]=s=>a.value.useRagEmbeddings=s)},null,512),[[k,a.value.useRagEmbeddings]]),e[33]||(e[33]=l("span",{class:"slider"},null,-1))])])],32),l("form",{class:"card config-card",onSubmit:j(_,["prevent"])},[l("div",{class:"card-header"},[e[37]||(e[37]=l("h3",null,"小模型分类",-1)),l("button",{type:"button",class:"btn-secondary btn-sm btn-sm-touch",onClick:J},[...e[36]||(e[36]=[l("span",{class:"material-symbols-outlined"},"extension",-1),y(" 私有配置 ",-1)])])]),l("div",Me,[e[39]||(e[39]=l("span",null,"启用小模型增量分类",-1)),l("label",Ce,[i(l("input",{type:"checkbox","onUpdate:modelValue":e[8]||(e[8]=s=>a.value.smallModel.enabled=s)},null,512),[[k,a.value.smallModel.enabled]]),e[38]||(e[38]=l("span",{class:"slider"},null,-1))])]),l("div",we,[e[41]||(e[41]=l("span",null,"复用主 API_URL / API_Key",-1)),l("label",Ke,[i(l("input",{type:"checkbox","onUpdate:modelValue":e[9]||(e[9]=s=>a.value.smallModel.useMainConfig=s)},null,512),[[k,a.value.smallModel.useMainConfig]]),e[40]||(e[40]=l("span",{class:"slider"},null,-1))])]),l("label",Oe,[e[42]||(e[42]=l("span",null,"分类模型名",-1)),i(l("input",{type:"text","onUpdate:modelValue":e[10]||(e[10]=s=>a.value.smallModel.model=s),placeholder:"例如:gpt-4o-mini"},null,512),[[m,a.value.smallModel.model,void 0,{trim:!0}]])]),l("label",ke,[e[43]||(e[43]=l("span",null,"独立 OpenAI 兼容端点",-1)),i(l("input",{type:"text","onUpdate:modelValue":e[11]||(e[11]=s=>a.value.smallModel.endpoint=s),disabled:a.value.smallModel.useMainConfig,placeholder:"https://example.com 或完整 /v1/chat/completions"},null,8,Te),[[m,a.value.smallModel.endpoint,void 0,{trim:!0}]])]),e[44]||(e[44]=l("p",{class:"field-hint"}," 复用主配置时只填模型名;独立端点的 API Key 在插件中心 DynamicToolBridge 私有配置里填写。 ",-1))],32)]),l("div",he,[l("div",Ae,[e[48]||(e[48]=l("h3",null,"分类维护",-1)),l("div",Pe,[l("button",{type:"button",class:"btn-secondary btn-sm btn-sm-touch",onClick:e[12]||(e[12]=s=>A("catalog"))},[...e[45]||(e[45]=[l("span",{class:"material-symbols-outlined"},"inventory",-1),y(" 重建清单 ",-1)])]),l("button",{type:"button",class:"btn-secondary btn-sm btn-sm-touch",onClick:e[13]||(e[13]=s=>A("classification"))},[...e[46]||(e[46]=[l("span",{class:"material-symbols-outlined"},"category",-1),y(" 重建分类 ",-1)])]),l("button",{type:"button",class:"btn-primary btn-sm btn-sm-touch",onClick:e[14]||(e[14]=s=>A("all"))},[...e[47]||(e[47]=[l("span",{class:"material-symbols-outlined"},"sync",-1),y(" 全量重建 ",-1)])])])]),l("label",Ee,[e[49]||(e[49]=l("span",null,"分类别名",-1)),i(l("textarea",{"onUpdate:modelValue":e[15]||(e[15]=s=>v.value=s),rows:"4",placeholder:`每行一个别名,例如: -搜索=search -代码=file_code`},null,512),[[m,v.value]])])]),l("div",Ie,[l("div",Ve,[e[50]||(e[50]=l("h3",null,"工具状态",-1)),i(l("input",{"onUpdate:modelValue":e[16]||(e[16]=s=>h.value=s),type:"search",class:"records-filter",placeholder:"搜索插件、分类、关键词"},null,512),[[m,h.value,void 0,{trim:!0}]])]),l("div",De,[l("table",Ue,[e[51]||(e[51]=l("thead",null,[l("tr",null,[l("th",null,"插件"),l("th",null,"来源"),l("th",null,"状态"),l("th",null,"分类"),l("th",null,"说明"),l("th",null,"操作")])],-1)),l("tbody",null,[(u(!0),o(L,null,B(D.value,s=>(u(),o("tr",{key:s.originKey},[l("td",null,[l("strong",null,t(s.displayName||s.pluginName),1),l("small",null,t(s.pluginName),1)]),l("td",null,[l("span",_e,t(s.originKind==="distributed"?s.originId:"local"),1)]),l("td",null,[l("div",$e,[l("span",{class:N(["status-pill",s.available?"status-pill--ok":"status-pill--muted"])},t(s.available?"available":"hidden"),3),s.online?p("",!0):(u(),o("span",Se,"offline")),E(s.originKey)?(u(),o("span",Be,"excluded")):p("",!0),P(s.originKey)?(u(),o("span",Le,"pinned")):p("",!0)])]),l("td",null,[l("div",Ne,[(u(!0),o(L,null,B(s.categories,d=>(u(),o("span",{key:`${s.originKey}-${d}`,class:"tag"},t(d),1))),128)),s.categories.length===0?(u(),o("span",je,"未分类")):p("",!0)])]),l("td",Re,t(s.brief||"-"),1),l("td",null,[l("div",Fe,[l("button",{type:"button",class:"btn-secondary btn-sm",onClick:d=>Q(s)},t(P(s.originKey)?"取消固定":"固定"),9,ze),l("button",{type:"button",class:"btn-secondary btn-sm",onClick:d=>W(s)},t(E(s.originKey)?"恢复":"排除"),9,qe)])])]))),128))])])]),D.value.length===0?(u(),o("div",Ge,[...e[52]||(e[52]=[l("span",{class:"material-symbols-outlined"},"search_off",-1),l("p",null,"没有匹配的工具记录",-1)])])):p("",!0)]),r.value?(u(),o("span",{key:1,class:N(["status-message","floating-status",c.value])},t(r.value),3)):p("",!0)]))}}),Ze=Y(Qe,[["__scopeId","data-v-ed9c5ad5"]]);export{Ze as default}; diff --git a/AdminPanel-Vue/dist/assets/js/DynamicToolsManager-LMmR5Ul0.js b/AdminPanel-Vue/dist/assets/js/DynamicToolsManager-LMmR5Ul0.js new file mode 100644 index 000000000..5ea6e55f4 --- /dev/null +++ b/AdminPanel-Vue/dist/assets/js/DynamicToolsManager-LMmR5Ul0.js @@ -0,0 +1,4 @@ +import{D as le,Dt as t,N,O as se,Q as f,U as i,a as j,c as w,d as p,f as o,h as c,j as u,l,n as ae,v as ne,wt as F}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as P,c as v,d as z}from"./dashboard-card-news-BnyB_dHU.js";import{G as y,m as C}from"./dashboard-card-calendar-DWuV34Bn.js";import{i as te}from"./vue-vendor-BUOVPpjf.js";var ie={class:"config-section active-section dynamic-tools-page"},oe={class:"summary-grid"},ue={class:"summary-item"},re={class:"summary-item"},de={class:"summary-item"},ve={key:0},me={class:"summary-item"},pe={key:0,class:"warning-box"},ye={class:"panel-grid"},be={class:"switch-row"},ge={class:"switch"},fe={class:"form-grid"},ce={class:"field"},xe={class:"field"},Me={class:"field"},we={class:"field"},Ce={class:"field"},Ke={class:"field"},Oe={class:"switch-row"},ke={class:"switch"},he={class:"switch-row"},Pe={class:"switch"},Te={class:"switch-row"},_e={class:"switch"},Ie={class:"field"},Ae={class:"field"},Ee=["disabled"],Ve={class:"card operations-card"},De={class:"card-header"},Ue={class:"header-actions"},$e=["disabled"],Be=["disabled"],Re=["disabled"],Se={class:"field alias-field"},Le={class:"card records-card"},Ne={class:"card-header records-header"},je={class:"records-table-wrap"},Fe={class:"records-table"},ze={class:"badge"},qe={class:"status-stack"},Ge={key:0,class:"status-pill status-pill--warning"},Qe={key:1,class:"status-pill status-pill--danger"},We={key:2,class:"status-pill status-pill--info"},He={class:"tag-list"},Je={key:0,class:"muted"},Xe={class:"brief-cell"},Ye={class:"row-actions"},Ze=["onClick"],el=["onClick"],ll={key:0,class:"empty-state"},T="{{VCPDynamicTools}}",sl=ne({__name:"DynamicToolsManager",setup(al){function U(){return{enabled:!0,placeholder:T,maxBriefListItems:120,maxExpandedPlugins:4,maxForcedCategoryPlugins:12,maxInjectionChars:16e3,classificationDebounceMs:1e3,classifierTimeoutMs:3e4,useRagEmbeddings:!0,manualOverrides:{excludedOriginKeys:[],pinnedOriginKeys:[],categoryAliases:{}},smallModel:{enabled:!1,useMainConfig:!0,endpoint:"",model:""}}}function K(n){const e=U();return{...e,...n||{},manualOverrides:{...e.manualOverrides,...n?.manualOverrides||{},excludedOriginKeys:Array.isArray(n?.manualOverrides?.excludedOriginKeys)?n.manualOverrides.excludedOriginKeys:[],pinnedOriginKeys:Array.isArray(n?.manualOverrides?.pinnedOriginKeys)?n.manualOverrides.pinnedOriginKeys:[],categoryAliases:n?.manualOverrides?.categoryAliases||{}},smallModel:{...e.smallModel,...n?.smallModel||{},useMainConfig:n?.smallModel?.useMainConfig!==!1}}}function O(n){return Object.entries(n).map(([e,s])=>`${e}=${s}`).join(` +`)}function q(n){const e={};for(const s of n.split(/\r?\n/)){const d=s.trim();if(!d||d.startsWith("#"))continue;const D=d.indexOf("=");if(D<=0)continue;const S=d.slice(0,D).trim(),L=d.slice(D+1).trim();S&&L&&(e[S]=L)}return e}const G=te(),b=f(null),a=f(U()),g=f(""),_=f(""),r=f(""),x=f("info"),k=f(null),h=w(()=>b.value?.records||[]),Q=w(()=>h.value.filter(n=>n.available).length),W=w(()=>new Set(a.value.manualOverrides.excludedOriginKeys)),H=w(()=>new Set(a.value.manualOverrides.pinnedOriginKeys)),m=w(()=>!!b.value?.isClassifying),$=w(()=>{const n=_.value.toLowerCase();return n?h.value.filter(e=>[e.originKey,e.pluginName,e.displayName,e.brief,...e.categories,...e.keywords].join(" ").toLowerCase().includes(n)):h.value});function B(n){b.value=n,a.value=K(n.config),g.value=O(a.value.manualOverrides.categoryAliases)}async function M(){try{B(await C.getState({showLoader:!1,loadingKey:"dynamic-tools.state.load"}))}catch(n){y(`加载动态工具清单失败:${n instanceof Error?n.message:String(n)}`,"error")}}function I(){k.value!==null&&(window.clearInterval(k.value),k.value=null)}function J(){I(),k.value=window.setInterval(()=>{(async()=>{const n=m.value;await M(),n&&!m.value&&(I(),r.value="动态工具重建已完成",x.value="success",y(r.value,"success"))})()},2500)}async function R(){try{const n={...a.value.manualOverrides,categoryAliases:q(g.value)};a.value=K(await C.saveConfig({enabled:a.value.enabled,maxBriefListItems:a.value.maxBriefListItems,maxExpandedPlugins:a.value.maxExpandedPlugins,maxForcedCategoryPlugins:a.value.maxForcedCategoryPlugins,maxInjectionChars:a.value.maxInjectionChars,classificationDebounceMs:a.value.classificationDebounceMs,classifierTimeoutMs:a.value.classifierTimeoutMs,useRagEmbeddings:a.value.useRagEmbeddings,smallModel:{enabled:a.value.smallModel.enabled,useMainConfig:a.value.smallModel.useMainConfig,endpoint:a.value.smallModel.endpoint,model:a.value.smallModel.model},manualOverrides:n},{loadingKey:"dynamic-tools.config.save"})),g.value=O(a.value.manualOverrides.categoryAliases),r.value="动态工具配置已保存",x.value="success",y(r.value,"success"),await M()}catch(n){r.value=`保存失败:${n instanceof Error?n.message:String(n)}`,x.value="error",y(r.value,"error")}}async function A(n){try{B(await C.rebuild(n,{loadingKey:`dynamic-tools.rebuild.${n}`},{wait:!1})),r.value=m.value?"重建任务已开始,正在后台分类":"重建任务已完成",x.value=m.value?"info":"success",y(r.value,"success"),m.value&&J()}catch(e){r.value=`重建失败:${e instanceof Error?e.message:String(e)}`,x.value="error",y(r.value,"error")}}function E(n){return H.value.has(n)}function V(n){return W.value.has(n)}async function X(n){const e=!E(n.originKey);a.value=K(await C.updateOverride({originKey:n.originKey,pinned:e},{loadingKey:"dynamic-tools.override.pin"})),g.value=O(a.value.manualOverrides.categoryAliases),await M()}async function Y(n){const e=!V(n.originKey);a.value=K(await C.updateOverride({originKey:n.originKey,excluded:e},{loadingKey:"dynamic-tools.override.exclude"})),g.value=O(a.value.manualOverrides.categoryAliases),await M()}async function Z(){try{await navigator.clipboard.writeText(T),y("占位符已复制","success")}catch{y(T,"info")}}function ee(){G.push({name:"PluginConfig",params:{pluginName:"DynamicToolBridge"}})}return se(()=>{M()}),le(()=>{I()}),(n,e)=>(u(),o("section",ie,[l("div",{class:"dynamic-tools-header"},[l("div",null,[e[17]||(e[17]=l("h2",null,"动态工具清单",-1)),l("p",{class:"description"},"管理 "+t(T)+" 的注入配置、分类状态和工具暴露规则。")]),l("div",{class:"header-actions"},[l("button",{type:"button",class:"btn-secondary btn-sm btn-sm-touch",onClick:M},[...e[18]||(e[18]=[l("span",{class:"material-symbols-outlined"},"refresh",-1),c(" 刷新 ",-1)])]),l("button",{type:"button",class:"btn-primary btn-sm btn-sm-touch",onClick:Z},[...e[19]||(e[19]=[l("span",{class:"material-symbols-outlined"},"content_copy",-1),c(" 复制占位符 ",-1)])])])]),l("div",oe,[l("div",ue,[e[20]||(e[20]=l("span",{class:"summary-label"},"可用工具",-1)),l("strong",null,t(Q.value),1)]),l("div",re,[e[21]||(e[21]=l("span",{class:"summary-label"},"总记录",-1)),l("strong",null,t(h.value.length),1)]),l("div",de,[e[22]||(e[22]=l("span",{class:"summary-label"},"分类队列",-1)),l("strong",null,t(b.value?.queueSize??0),1),m.value?(u(),o("small",ve,"后台分类中")):p("",!0)]),l("div",me,[e[23]||(e[23]=l("span",{class:"summary-label"},"快照",-1)),l("strong",null,t(b.value?.snapshotId??"-"),1)])]),b.value?.lastError?(u(),o("div",pe,[e[24]||(e[24]=l("span",{class:"material-symbols-outlined"},"warning",-1)),l("span",null,t(b.value.lastError),1)])):p("",!0),l("div",ye,[l("form",{class:"card config-card",onSubmit:z(R,["prevent"])},[e[35]||(e[35]=l("div",{class:"card-header"},[l("h3",null,"注入配置"),l("button",{type:"submit",class:"btn-success btn-sm btn-sm-touch"},[l("span",{class:"material-symbols-outlined"},"save"),c(" 保存 ")])],-1)),l("div",be,[e[26]||(e[26]=l("span",null,"启用动态工具清单",-1)),l("label",ge,[i(l("input",{type:"checkbox","onUpdate:modelValue":e[0]||(e[0]=s=>a.value.enabled=s)},null,512),[[P,a.value.enabled]]),e[25]||(e[25]=l("span",{class:"slider"},null,-1))])]),l("div",fe,[l("label",ce,[e[27]||(e[27]=l("span",null,"轻量清单数量",-1)),i(l("input",{type:"number",min:"1",max:"500","onUpdate:modelValue":e[1]||(e[1]=s=>a.value.maxBriefListItems=s)},null,512),[[v,a.value.maxBriefListItems,void 0,{number:!0}]])]),l("label",xe,[e[28]||(e[28]=l("span",null,"语义命中展开数",-1)),i(l("input",{type:"number",min:"0",max:"50","onUpdate:modelValue":e[2]||(e[2]=s=>a.value.maxExpandedPlugins=s)},null,512),[[v,a.value.maxExpandedPlugins,void 0,{number:!0}]])]),l("label",Me,[e[29]||(e[29]=l("span",null,"点名分类展开数",-1)),i(l("input",{type:"number",min:"1",max:"100","onUpdate:modelValue":e[3]||(e[3]=s=>a.value.maxForcedCategoryPlugins=s)},null,512),[[v,a.value.maxForcedCategoryPlugins,void 0,{number:!0}]])]),l("label",we,[e[30]||(e[30]=l("span",null,"最大注入字符数",-1)),i(l("input",{type:"number",min:"1000",max:"120000",step:"1000","onUpdate:modelValue":e[4]||(e[4]=s=>a.value.maxInjectionChars=s)},null,512),[[v,a.value.maxInjectionChars,void 0,{number:!0}]])]),l("label",Ce,[e[31]||(e[31]=l("span",null,"分类去抖 ms",-1)),i(l("input",{type:"number",min:"0",max:"60000",step:"100","onUpdate:modelValue":e[5]||(e[5]=s=>a.value.classificationDebounceMs=s)},null,512),[[v,a.value.classificationDebounceMs,void 0,{number:!0}]])]),l("label",Ke,[e[32]||(e[32]=l("span",null,"分类超时 ms",-1)),i(l("input",{type:"number",min:"100",max:"120000",step:"1000","onUpdate:modelValue":e[6]||(e[6]=s=>a.value.classifierTimeoutMs=s)},null,512),[[v,a.value.classifierTimeoutMs,void 0,{number:!0}]])])]),l("div",Oe,[e[34]||(e[34]=l("span",null,"启用 RAG embedding 降级分类",-1)),l("label",ke,[i(l("input",{type:"checkbox","onUpdate:modelValue":e[7]||(e[7]=s=>a.value.useRagEmbeddings=s)},null,512),[[P,a.value.useRagEmbeddings]]),e[33]||(e[33]=l("span",{class:"slider"},null,-1))])])],32),l("form",{class:"card config-card",onSubmit:z(R,["prevent"])},[l("div",{class:"card-header"},[e[37]||(e[37]=l("h3",null,"小模型分类",-1)),l("button",{type:"button",class:"btn-secondary btn-sm btn-sm-touch",onClick:ee},[...e[36]||(e[36]=[l("span",{class:"material-symbols-outlined"},"extension",-1),c(" 私有配置 ",-1)])])]),l("div",he,[e[39]||(e[39]=l("span",null,"启用小模型增量分类",-1)),l("label",Pe,[i(l("input",{type:"checkbox","onUpdate:modelValue":e[8]||(e[8]=s=>a.value.smallModel.enabled=s)},null,512),[[P,a.value.smallModel.enabled]]),e[38]||(e[38]=l("span",{class:"slider"},null,-1))])]),l("div",Te,[e[41]||(e[41]=l("span",null,"复用主 API_URL / API_Key",-1)),l("label",_e,[i(l("input",{type:"checkbox","onUpdate:modelValue":e[9]||(e[9]=s=>a.value.smallModel.useMainConfig=s)},null,512),[[P,a.value.smallModel.useMainConfig]]),e[40]||(e[40]=l("span",{class:"slider"},null,-1))])]),l("label",Ie,[e[42]||(e[42]=l("span",null,"分类模型名",-1)),i(l("input",{type:"text","onUpdate:modelValue":e[10]||(e[10]=s=>a.value.smallModel.model=s),placeholder:"例如:gpt-4o-mini"},null,512),[[v,a.value.smallModel.model,void 0,{trim:!0}]])]),l("label",Ae,[e[43]||(e[43]=l("span",null,"独立 OpenAI 兼容端点",-1)),i(l("input",{type:"text","onUpdate:modelValue":e[11]||(e[11]=s=>a.value.smallModel.endpoint=s),disabled:a.value.smallModel.useMainConfig,placeholder:"https://example.com 或完整 /v1/chat/completions"},null,8,Ee),[[v,a.value.smallModel.endpoint,void 0,{trim:!0}]])]),e[44]||(e[44]=l("p",{class:"field-hint"}," 复用主配置时只填模型名;独立端点的 API Key 在插件中心 DynamicToolBridge 私有配置里填写。 ",-1))],32)]),l("div",Ve,[l("div",De,[e[48]||(e[48]=l("h3",null,"分类维护",-1)),l("div",Ue,[l("button",{type:"button",class:"btn-secondary btn-sm btn-sm-touch",disabled:m.value,onClick:e[12]||(e[12]=s=>A("catalog"))},[...e[45]||(e[45]=[l("span",{class:"material-symbols-outlined"},"inventory",-1),c(" 重建清单 ",-1)])],8,$e),l("button",{type:"button",class:"btn-secondary btn-sm btn-sm-touch",disabled:m.value,onClick:e[13]||(e[13]=s=>A("classification"))},[...e[46]||(e[46]=[l("span",{class:"material-symbols-outlined"},"category",-1),c(" 重建分类 ",-1)])],8,Be),l("button",{type:"button",class:"btn-primary btn-sm btn-sm-touch",disabled:m.value,onClick:e[14]||(e[14]=s=>A("all"))},[...e[47]||(e[47]=[l("span",{class:"material-symbols-outlined"},"sync",-1),c(" 全量重建 ",-1)])],8,Re)])]),l("label",Se,[e[49]||(e[49]=l("span",null,"分类别名",-1)),i(l("textarea",{"onUpdate:modelValue":e[15]||(e[15]=s=>g.value=s),rows:"4",placeholder:`每行一个别名,例如: +搜索=search +代码=file_code`},null,512),[[v,g.value]])])]),l("div",Le,[l("div",Ne,[e[50]||(e[50]=l("h3",null,"工具状态",-1)),i(l("input",{"onUpdate:modelValue":e[16]||(e[16]=s=>_.value=s),type:"search",class:"records-filter",placeholder:"搜索插件、分类、关键词"},null,512),[[v,_.value,void 0,{trim:!0}]])]),l("div",je,[l("table",Fe,[e[51]||(e[51]=l("thead",null,[l("tr",null,[l("th",null,"插件"),l("th",null,"来源"),l("th",null,"状态"),l("th",null,"分类"),l("th",null,"说明"),l("th",null,"操作")])],-1)),l("tbody",null,[(u(!0),o(j,null,N($.value,s=>(u(),o("tr",{key:s.originKey},[l("td",null,[l("strong",null,t(s.displayName||s.pluginName),1),l("small",null,t(s.pluginName),1)]),l("td",null,[l("span",ze,t(s.originKind==="distributed"?s.originId:"local"),1)]),l("td",null,[l("div",qe,[l("span",{class:F(["status-pill",s.available?"status-pill--ok":"status-pill--muted"])},t(s.available?"available":"hidden"),3),s.online?p("",!0):(u(),o("span",Ge,"offline")),V(s.originKey)?(u(),o("span",Qe,"excluded")):p("",!0),E(s.originKey)?(u(),o("span",We,"pinned")):p("",!0)])]),l("td",null,[l("div",He,[(u(!0),o(j,null,N(s.categories,d=>(u(),o("span",{key:`${s.originKey}-${d}`,class:"tag"},t(d),1))),128)),s.categories.length===0?(u(),o("span",Je,"未分类")):p("",!0)])]),l("td",Xe,t(s.brief||"-"),1),l("td",null,[l("div",Ye,[l("button",{type:"button",class:"btn-secondary btn-sm",onClick:d=>X(s)},t(E(s.originKey)?"取消固定":"固定"),9,Ze),l("button",{type:"button",class:"btn-secondary btn-sm",onClick:d=>Y(s)},t(V(s.originKey)?"恢复":"排除"),9,el)])])]))),128))])])]),$.value.length===0?(u(),o("div",ll,[...e[52]||(e[52]=[l("span",{class:"material-symbols-outlined"},"search_off",-1),l("p",null,"没有匹配的工具记录",-1)])])):p("",!0)]),r.value?(u(),o("span",{key:1,class:F(["status-message","floating-status",x.value])},t(r.value),3)):p("",!0)]))}}),ul=ae(sl,[["__scopeId","data-v-5267cc91"]]);export{ul as default}; diff --git a/AdminPanel-Vue/dist/assets/js/ForumAssistantConfig-DttN-v9R.js b/AdminPanel-Vue/dist/assets/js/ForumAssistantConfig-DYIbRlZ_.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/ForumAssistantConfig-DttN-v9R.js rename to AdminPanel-Vue/dist/assets/js/ForumAssistantConfig-DYIbRlZ_.js index 0a7b208dd..5545bad3a 100644 --- a/AdminPanel-Vue/dist/assets/js/ForumAssistantConfig-DttN-v9R.js +++ b/AdminPanel-Vue/dist/assets/js/ForumAssistantConfig-DYIbRlZ_.js @@ -1,3 +1,3 @@ -import{Dt as s,N as f,O as ge,Q as d,U as u,a as v,c as J,d as x,f as o,j as r,l as e,n as fe,v as he,wt as S}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as L,c as p,d as _e,s as R}from"./dashboard-card-news-BnyB_dHU.js";import{G as g,d as C}from"./dashboard-card-calendar-CA3-tSpi.js";var ye={class:"config-section active-section forum-assistant-view"},be={class:"card toolbar-card"},Te={class:"toolbar-row"},Ae={class:"switch-row"},Ve={class:"field compact-field"},xe={class:"toolbar-actions"},Ce=["disabled"],we=["disabled"],Pe={class:"status-grid"},Me={class:"card status-card"},Ue={class:"status-metrics"},$e={class:"metric"},De={class:"metric"},Se={class:"metric"},Le={class:"card status-card"},Ne={class:"task-type-list"},Fe={class:"card composer-card"},je={class:"composer-head"},Ee={class:"field quick-create-field"},Ie={class:"field quick-create-field"},Ke=["value"],Re={key:0,class:"empty-state"},Oe={key:1,class:"task-list"},Be={class:"task-card-header"},qe={class:"task-card-actions"},ze=["disabled","title","onClick"],He=["onClick"],Qe={class:"task-grid"},Ge={class:"field"},Ye=["onUpdate:modelValue"],Je={class:"field"},We=["onUpdate:modelValue"],Xe=["value"],Ze={class:"field"},ke={class:"agent-input-wrapper"},et=["onUpdate:modelValue","list","onInput"],tt=["onChange"],lt=["value"],at=["value","onChange"],nt=["value"],st=["id"],ot=["value"],rt={class:"field"},it=["onUpdate:modelValue"],ut={class:"field"},dt=["onUpdate:modelValue"],mt={class:"field"},pt=["onUpdate:modelValue"],ct={class:"field"},vt=["onUpdate:modelValue","disabled"],gt={class:"field"},ft=["onUpdate:modelValue","disabled"],ht={class:"field"},_t=["onUpdate:modelValue","disabled"],yt={class:"switch-row section-switch"},bt=["onUpdate:modelValue"],Tt={class:"switch-row section-switch"},At=["onUpdate:modelValue"],Vt={class:"switch-row section-switch"},xt=["onUpdate:modelValue"],Ct={class:"task-grid"},wt={class:"field"},Pt=["onUpdate:modelValue"],Mt={class:"field"},Ut=["onUpdate:modelValue"],$t={class:"field full-field"},Dt=["onUpdate:modelValue"],St={class:"placeholder-row"},Lt={key:0,class:"placeholder-empty"},Nt={class:"runtime-panel"},Ft={class:"runtime-state-row"},jt={class:"runtime-summary"},Et={class:"runtime-grid"},It={class:"runtime-item"},Kt={class:"runtime-item"},Rt={class:"runtime-item"},Ot={class:"runtime-item"},Bt={key:0,class:"runtime-message"},qt={key:1,class:"runtime-message error-text"},zt={class:"card history-card"},Ht={key:0,class:"history-empty"},Qt={key:1,class:"history-list"},Gt={class:"history-item-top"},Yt={class:"history-meta"},Jt=he({__name:"ForumAssistantConfig",setup(Wt){const W=[{type:"forum_patrol",label:"论坛帖子任务",description:"读取论坛帖子列表后,把内容注入提示词模板再派发给 Agent。"},{type:"custom_prompt",label:"通用提示词任务",description:"直接向目标 Agent 派发自定义提示词,不附带论坛帖子预读。"}],w=d(!1),P=d(200),b=d(""),h=d("forum_patrol"),N=d([]),O=d({}),c=d([]),_=d(null),F=d(""),B=d("info"),T=d(!1),A=d(!1),V=d([]),j=d([]),y=J(()=>N.value.length>0?N.value:W),q=J(()=>_.value?.history??[]);function M(){return{running:!1,lastRunTime:null,lastFinishTime:null,lastResult:null,lastError:null,lastDurationMs:null,runCount:0,successCount:0,errorCount:0,nextRunTime:null}}function X(l=""){return l||`draft_${Date.now()}_${Math.random().toString(36).slice(2,8)}`}function z(l){return l.split(",").map(t=>t.trim()).filter(Boolean)}function Z(l){if(!l)return"";const t=new Date(l);return Number.isNaN(t.getTime())?"":new Date(t.getTime()-t.getTimezoneOffset()*6e4).toISOString().slice(0,16)}function k(l){if(!l)return null;const t=new Date(l);return Number.isNaN(t.getTime())?null:t.toISOString()}function U(l){return l==="custom_prompt"?"custom_prompt":"forum_patrol"}function ee(l){return y.value.find(t=>t.type===l)?.label||l}function H(l){return U(l.type)==="forum_patrol"?l.availablePlaceholders.length>0?l.availablePlaceholders:["{{forum_post_list}}"]:l.availablePlaceholders}function te(l){return U(l)==="custom_prompt"?{id:"",name:"新通用任务",type:"custom_prompt",enabled:!0,schedule:{mode:"manual",intervalMinutes:60,runAt:null,cronValue:null,jitterSeconds:0},targets:{agents:[]},dispatch:{channel:"AgentAssistant",temporaryContact:!0,injectTools:["VCPForum"],maid:"VCP系统",taskDelegation:!1},payload:{promptTemplate:"",availablePlaceholders:[]},runtime:M(),meta:{createdAt:null,updatedAt:null}}:{id:"",name:"新论坛帖子任务",type:"forum_patrol",enabled:!0,schedule:{mode:"interval",intervalMinutes:60,runAt:null,cronValue:null,jitterSeconds:0},targets:{agents:[]},dispatch:{channel:"AgentAssistant",temporaryContact:!0,injectTools:["VCPForum"],maid:"VCP系统",taskDelegation:!1},payload:{promptTemplate:`[论坛小助手] 现在是论坛时间,请先阅读帖子列表,再选择你感兴趣的主题互动。 +import{Dt as s,N as f,O as ge,Q as d,U as u,a as v,c as J,d as x,f as o,j as r,l as e,n as fe,v as he,wt as S}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as L,c as p,d as _e,s as R}from"./dashboard-card-news-BnyB_dHU.js";import{G as g,d as C}from"./dashboard-card-calendar-DWuV34Bn.js";var ye={class:"config-section active-section forum-assistant-view"},be={class:"card toolbar-card"},Te={class:"toolbar-row"},Ae={class:"switch-row"},Ve={class:"field compact-field"},xe={class:"toolbar-actions"},Ce=["disabled"],we=["disabled"],Pe={class:"status-grid"},Me={class:"card status-card"},Ue={class:"status-metrics"},$e={class:"metric"},De={class:"metric"},Se={class:"metric"},Le={class:"card status-card"},Ne={class:"task-type-list"},Fe={class:"card composer-card"},je={class:"composer-head"},Ee={class:"field quick-create-field"},Ie={class:"field quick-create-field"},Ke=["value"],Re={key:0,class:"empty-state"},Oe={key:1,class:"task-list"},Be={class:"task-card-header"},qe={class:"task-card-actions"},ze=["disabled","title","onClick"],He=["onClick"],Qe={class:"task-grid"},Ge={class:"field"},Ye=["onUpdate:modelValue"],Je={class:"field"},We=["onUpdate:modelValue"],Xe=["value"],Ze={class:"field"},ke={class:"agent-input-wrapper"},et=["onUpdate:modelValue","list","onInput"],tt=["onChange"],lt=["value"],at=["value","onChange"],nt=["value"],st=["id"],ot=["value"],rt={class:"field"},it=["onUpdate:modelValue"],ut={class:"field"},dt=["onUpdate:modelValue"],mt={class:"field"},pt=["onUpdate:modelValue"],ct={class:"field"},vt=["onUpdate:modelValue","disabled"],gt={class:"field"},ft=["onUpdate:modelValue","disabled"],ht={class:"field"},_t=["onUpdate:modelValue","disabled"],yt={class:"switch-row section-switch"},bt=["onUpdate:modelValue"],Tt={class:"switch-row section-switch"},At=["onUpdate:modelValue"],Vt={class:"switch-row section-switch"},xt=["onUpdate:modelValue"],Ct={class:"task-grid"},wt={class:"field"},Pt=["onUpdate:modelValue"],Mt={class:"field"},Ut=["onUpdate:modelValue"],$t={class:"field full-field"},Dt=["onUpdate:modelValue"],St={class:"placeholder-row"},Lt={key:0,class:"placeholder-empty"},Nt={class:"runtime-panel"},Ft={class:"runtime-state-row"},jt={class:"runtime-summary"},Et={class:"runtime-grid"},It={class:"runtime-item"},Kt={class:"runtime-item"},Rt={class:"runtime-item"},Ot={class:"runtime-item"},Bt={key:0,class:"runtime-message"},qt={key:1,class:"runtime-message error-text"},zt={class:"card history-card"},Ht={key:0,class:"history-empty"},Qt={key:1,class:"history-list"},Gt={class:"history-item-top"},Yt={class:"history-meta"},Jt=he({__name:"ForumAssistantConfig",setup(Wt){const W=[{type:"forum_patrol",label:"论坛帖子任务",description:"读取论坛帖子列表后,把内容注入提示词模板再派发给 Agent。"},{type:"custom_prompt",label:"通用提示词任务",description:"直接向目标 Agent 派发自定义提示词,不附带论坛帖子预读。"}],w=d(!1),P=d(200),b=d(""),h=d("forum_patrol"),N=d([]),O=d({}),c=d([]),_=d(null),F=d(""),B=d("info"),T=d(!1),A=d(!1),V=d([]),j=d([]),y=J(()=>N.value.length>0?N.value:W),q=J(()=>_.value?.history??[]);function M(){return{running:!1,lastRunTime:null,lastFinishTime:null,lastResult:null,lastError:null,lastDurationMs:null,runCount:0,successCount:0,errorCount:0,nextRunTime:null}}function X(l=""){return l||`draft_${Date.now()}_${Math.random().toString(36).slice(2,8)}`}function z(l){return l.split(",").map(t=>t.trim()).filter(Boolean)}function Z(l){if(!l)return"";const t=new Date(l);return Number.isNaN(t.getTime())?"":new Date(t.getTime()-t.getTimezoneOffset()*6e4).toISOString().slice(0,16)}function k(l){if(!l)return null;const t=new Date(l);return Number.isNaN(t.getTime())?null:t.toISOString()}function U(l){return l==="custom_prompt"?"custom_prompt":"forum_patrol"}function ee(l){return y.value.find(t=>t.type===l)?.label||l}function H(l){return U(l.type)==="forum_patrol"?l.availablePlaceholders.length>0?l.availablePlaceholders:["{{forum_post_list}}"]:l.availablePlaceholders}function te(l){return U(l)==="custom_prompt"?{id:"",name:"新通用任务",type:"custom_prompt",enabled:!0,schedule:{mode:"manual",intervalMinutes:60,runAt:null,cronValue:null,jitterSeconds:0},targets:{agents:[]},dispatch:{channel:"AgentAssistant",temporaryContact:!0,injectTools:["VCPForum"],maid:"VCP系统",taskDelegation:!1},payload:{promptTemplate:"",availablePlaceholders:[]},runtime:M(),meta:{createdAt:null,updatedAt:null}}:{id:"",name:"新论坛帖子任务",type:"forum_patrol",enabled:!0,schedule:{mode:"interval",intervalMinutes:60,runAt:null,cronValue:null,jitterSeconds:0},targets:{agents:[]},dispatch:{channel:"AgentAssistant",temporaryContact:!0,injectTools:["VCPForum"],maid:"VCP系统",taskDelegation:!1},payload:{promptTemplate:`[论坛小助手] 现在是论坛时间,请先阅读帖子列表,再选择你感兴趣的主题互动。 {{forum_post_list}}`,availablePlaceholders:["{{forum_post_list}}"],includeForumPostList:!0,forumListPlaceholder:"{{forum_post_list}}",maxPosts:200},runtime:M(),meta:{createdAt:null,updatedAt:null}}}function Q(l,t){const a=U(l.type),n=t?.runtime??l.runtime??M(),i=l.targets.agents,m=i.find(K=>/^random(\d+)$/i.test(K)),I=m?parseInt(m.match(/random(\d+)/i)[1],10):0,ve=i.filter(K=>!/^random(\d+)$/i.test(K));return{localKey:X(l.id),id:l.id,name:l.name,type:a,enabled:l.enabled,taskDelegation:l.dispatch.taskDelegation||!1,targetAgentsText:ve.join(", "),randomCount:I,injectToolsText:l.dispatch.injectTools.join(", "),maid:l.dispatch.maid||"VCP系统",scheduleMode:l.schedule.mode,intervalMinutes:l.schedule.intervalMinutes,cronValue:l.schedule.cronValue||"",runAtLocal:Z(l.schedule.runAt),promptTemplate:l.payload.promptTemplate,includeForumPostList:l.payload.includeForumPostList!==!1,forumListPlaceholder:l.payload.forumListPlaceholder||"{{forum_post_list}}",maxPosts:l.payload.maxPosts??200,availablePlaceholders:[...l.payload.availablePlaceholders],runtime:n}}function le(l,t){const a=new Map(t.map(n=>[n.id,n]));return l.map(n=>{const i=n.id?a.get(n.id):void 0;return i?{...n,runtime:i.runtime}:n})}function $(l,t){F.value=l,B.value=t}function ae(l,t){const a=new Map(t.tasks.map(n=>[n.id,n]));w.value=l.config.globalEnabled,P.value=l.config.settings.maxHistory,N.value=l.availableTaskTypes,O.value=l.taskTemplates,c.value=l.config.tasks.map(n=>Q(n,a.get(n.id))),_.value=t,y.value.some(n=>n.type===h.value)||(h.value=y.value[0]?.type||"forum_patrol")}async function E(l=!1){T.value=!0;try{const[t,a]=await Promise.all([C.getConfig(),C.getStatus()]);ae(t,a);try{const n=await fetch("/admin_api/agent-assistant/config").then(i=>i.json());n&&Array.isArray(n.agents)&&(j.value=n.agents)}catch(n){console.warn("[TaskAssistant] Failed to fetch agent list for suggestions:",n)}$("","info"),l&&g("任务派发中心配置已刷新","success")}catch(t){const a=t instanceof Error?t.message:String(t);$(`加载失败:${a}`,"error"),g(`加载任务派发中心配置失败:${a}`,"error")}finally{T.value=!1}}async function ne(){try{const l=await C.getStatus();_.value=l,c.value=le(c.value,l.tasks)}catch(l){g(`刷新任务状态失败:${l instanceof Error?l.message:String(l)}`,"error")}}function se(){if(!b.value.trim()){g("请输入任务名称","warning");return}const l=Q({...O.value[h.value]??te(h.value),id:"",name:b.value.trim(),runtime:M(),meta:{createdAt:null,updatedAt:null}},void 0);c.value=[...c.value,l],b.value="",g(`已添加任务草稿:${l.name}`,"success")}function oe(l,t){const a=t.target,n=a.value;if(!n)return;const i=l.targetAgentsText.trim();if(i){const m=i.split(",").map(I=>I.trim()).filter(Boolean);m.includes(n)||(m.push(n),l.targetAgentsText=m.join(", "))}else l.targetAgentsText=n;a.value=""}function re(l){const t=l.targetAgentsText.split(",").map(n=>n.trim()).filter(Boolean).filter(n=>!/^random(\d+)$/i.test(n)),a=Math.min(t.length,30);return Array.from({length:a},(n,i)=>i+1)}function ie(l,t){const a=t.target,n=a.value;let i=l.targetAgentsText.split(",").map(m=>m.trim()).filter(Boolean);if(i=i.filter(m=>!/^random(\d+)$/i.test(m)),n){const m=n.match(/^random(\d+)$/i);m&&(l.randomCount=parseInt(m[1],10),i.push(n))}else l.randomCount=0;l.targetAgentsText=i.join(", "),a.value=""}function ue(l){let t=l.targetAgentsText.split(",").map(i=>i.trim()).filter(Boolean);const a=t.some(i=>/^random(\d+)$/i.test(i)),n=t.filter(i=>!/^random(\d+)$/i.test(i));a&&n.lengtha.localKey!==l.localKey))}function G(l){return V.value.includes(l)}async function me(l){if(!l.id){g("请先保存任务,再执行手动触发","warning");return}V.value=[...V.value,l.id];try{g((await C.triggerTask(l.id,{loadingKey:`forum-assistant.trigger.${l.id}`})).message||`已触发任务:${l.name}`,"success"),await ne()}catch(t){g(`触发任务失败:${t instanceof Error?t.message:String(t)}`,"error")}finally{V.value=V.value.filter(t=>t!==l.id)}}function pe(l){const t=U(l.type),a=l.scheduleMode==="manual"||l.scheduleMode==="once"||l.scheduleMode==="cron"?l.scheduleMode:"interval",n=t==="forum_patrol"?{promptTemplate:l.promptTemplate,availablePlaceholders:["{{forum_post_list}}"],includeForumPostList:l.includeForumPostList,forumListPlaceholder:l.forumListPlaceholder.trim()||"{{forum_post_list}}",maxPosts:Math.max(Math.trunc(l.maxPosts||0)||200,1)}:{promptTemplate:l.promptTemplate,availablePlaceholders:[]},i=z(l.targetAgentsText);return l.randomCount>0&&i.push(`random${l.randomCount}`),{id:l.id||void 0,name:l.name.trim(),type:t,enabled:l.enabled,schedule:{mode:a,intervalMinutes:Math.max(Math.trunc(l.intervalMinutes||0)||60,10),cronValue:a==="cron"&&l.cronValue.trim()||null,runAt:a==="once"?k(l.runAtLocal):null,jitterSeconds:0},targets:{agents:i},dispatch:{channel:"AgentAssistant",temporaryContact:!0,injectTools:z(l.injectToolsText),maid:l.maid.trim()||"VCP系统",taskDelegation:l.taskDelegation},payload:n}}async function ce(){A.value=!0;try{const l={globalEnabled:w.value,settings:{maxHistory:Math.max(Math.trunc(P.value||0)||200,20)},tasks:c.value.map(a=>pe(a))},t=await C.saveConfig(l,{loadingKey:"forum-assistant.save"});await E(!1),$(t.message,"success"),g(t.message,"success")}catch(l){const t=l instanceof Error?l.message:String(l);$(`保存失败:${t}`,"error"),g(`保存任务派发中心配置失败:${t}`,"error")}finally{A.value=!1}}function D(l){if(!l)return"未记录";const t=new Date(l);return Number.isNaN(t.getTime())?"未记录":t.toLocaleString("zh-CN",{hour12:!1})}function Y(l){return l==null||!Number.isFinite(l)?"未记录":l<1e3?`${l} ms`:`${(l/1e3).toFixed(2)} s`}return ge(async()=>{await E(!1)}),(l,t)=>(r(),o("section",ye,[t[42]||(t[42]=e("p",{class:"description"}," 这里用于配置任务派发中心。你可以为一个或多个 Agent 预设任务,按间隔执行、一次性执行, 或仅保留为手动触发任务。 ",-1)),e("section",be,[e("div",Te,[e("label",Ae,[u(e("input",{"onUpdate:modelValue":t[0]||(t[0]=a=>w.value=a),type:"checkbox"},null,512),[[L,w.value]]),t[5]||(t[5]=e("span",null,"启用任务派发中心",-1))]),e("label",Ve,[t[6]||(t[6]=e("span",null,"保留历史条数",-1)),u(e("input",{"onUpdate:modelValue":t[1]||(t[1]=a=>P.value=a),type:"number",min:"20",step:"1"},null,512),[[p,P.value,void 0,{number:!0}]])])]),e("div",xe,[e("button",{type:"button",class:"btn-secondary",disabled:T.value||A.value,onClick:t[2]||(t[2]=a=>E(!0))},s(T.value?"刷新中…":"刷新配置"),9,Ce),e("button",{type:"button",class:"btn-success",disabled:T.value||A.value,onClick:ce},s(A.value?"保存中…":"保存任务配置"),9,we)]),F.value?(r(),o("p",{key:0,class:S(["status-message",B.value]),role:"status","aria-live":"polite"},s(F.value),3)):x("",!0)]),e("section",Pe,[e("article",Me,[t[10]||(t[10]=e("div",{class:"card-header"},[e("h3",{class:"card-title"},"运行状态")],-1)),e("div",Ue,[e("div",$e,[t[7]||(t[7]=e("span",{class:"metric-label"},"当前状态",-1)),e("span",{class:S(["status-badge",_.value?.globalEnabled?"status-enabled":"status-disabled"])},s(_.value?.globalEnabled?"运行中":"已停止"),3)]),e("div",De,[t[8]||(t[8]=e("span",{class:"metric-label"},"任务总数",-1)),e("strong",null,s(c.value.length),1)]),e("div",Se,[t[9]||(t[9]=e("span",{class:"metric-label"},"活跃定时器",-1)),e("strong",null,s(_.value?.activeTimerCount??0),1)])]),t[11]||(t[11]=e("p",{class:"hint-text"}," 手动触发不会覆盖当前编辑中的表单;保存后会重新从服务端拉取一次配置。 ",-1))]),e("article",Le,[t[12]||(t[12]=e("div",{class:"card-header"},[e("h3",{class:"card-title"},"可用任务类型")],-1)),e("div",Ne,[(r(!0),o(v,null,f(y.value,a=>(r(),o("article",{key:a.type,class:"task-type-item"},[e("strong",null,s(a.label),1),e("p",null,s(a.description||a.type),1)]))),128))])])]),e("section",Fe,[e("div",je,[t[16]||(t[16]=e("div",null,[e("h3",{class:"card-title"},"任务列表"),e("p",{class:"hint-text"},"先创建草稿,再继续填写目标 Agent、调度方式和提示词。")],-1)),e("form",{class:"composer-controls","aria-label":"快速创建任务",onSubmit:_e(se,["prevent"])},[e("label",Ee,[t[13]||(t[13]=e("span",null,"新任务名称",-1)),u(e("input",{"onUpdate:modelValue":t[3]||(t[3]=a=>b.value=a),type:"text",name:"newTaskName",placeholder:"输入新任务名称",autocomplete:"off"},null,512),[[p,b.value,void 0,{trim:!0}]])]),e("label",Ie,[t[14]||(t[14]=e("span",null,"任务类型",-1)),u(e("select",{"onUpdate:modelValue":t[4]||(t[4]=a=>h.value=a),name:"newTaskType",autocomplete:"off"},[(r(!0),o(v,null,f(y.value,a=>(r(),o("option",{key:a.type,value:a.type},s(a.label),9,Ke))),128))],512),[[R,h.value]])]),t[15]||(t[15]=e("div",{class:"quick-create-actions"},[e("button",{type:"submit",class:"btn-primary"}," 添加任务 ")],-1))],32)]),c.value.length===0?(r(),o("div",Re,[...t[17]||(t[17]=[e("span",{class:"material-symbols-outlined"},"explore_off",-1),e("h3",null,"还没有任务",-1),e("p",null,"先创建一个任务草稿,再填写目标 Agent 和提示词模板。",-1)])])):(r(),o("div",Oe,[(r(!0),o(v,null,f(c.value,a=>(r(),o("article",{key:a.localKey,class:"task-card"},[e("header",Be,[e("div",null,[e("h4",null,s(a.name||"未命名任务"),1),e("p",null,s(ee(a.type)),1)]),e("div",qe,[e("button",{type:"button",class:"btn-secondary",disabled:!a.id||G(a.id),title:a.id?"立即触发当前任务":"请先保存任务再触发",onClick:n=>me(a)},s(a.id&&G(a.id)?"执行中…":"立即执行"),9,ze),e("button",{type:"button",class:"btn-danger",onClick:n=>de(a)}," 移除 ",8,He)])]),e("div",Qe,[e("label",Ge,[t[18]||(t[18]=e("span",null,"任务名称",-1)),u(e("input",{"onUpdate:modelValue":n=>a.name=n,type:"text",placeholder:"例如:论坛巡航可可"},null,8,Ye),[[p,a.name,void 0,{trim:!0}]])]),e("label",Je,[t[19]||(t[19]=e("span",null,"任务类型",-1)),u(e("select",{"onUpdate:modelValue":n=>a.type=n},[(r(!0),o(v,null,f(y.value,n=>(r(),o("option",{key:n.type,value:n.type},s(n.label),9,Xe))),128))],8,We),[[R,a.type]])]),e("label",Ze,[t[22]||(t[22]=e("span",null,"目标 Agent",-1)),e("div",ke,[u(e("input",{"onUpdate:modelValue":n=>a.targetAgentsText=n,type:"text",placeholder:"多个 Agent 用英文逗号分隔",list:`agent-suggestions-${a.localKey}`,onInput:n=>ue(a)},null,40,et),[[p,a.targetAgentsText]]),e("select",{class:"agent-quick-select","aria-label":"目标 Agent 快速选择",onChange:n=>oe(a,n)},[t[20]||(t[20]=e("option",{value:""},"+ 快选",-1)),(r(!0),o(v,null,f(j.value,n=>(r(),o("option",{key:n.chineseName,value:n.chineseName},s(n.chineseName),9,lt))),128))],40,tt),e("select",{class:"agent-random-select","aria-label":"随机执行人数",value:a.randomCount>0?`random${a.randomCount}`:"",onChange:n=>ie(a,n)},[t[21]||(t[21]=e("option",{value:""},"随机选择",-1)),(r(!0),o(v,null,f(re(a),n=>(r(),o("option",{key:n,value:`random${n}`}," 随机 "+s(n)+" 人 ",9,nt))),128))],40,at),e("datalist",{id:`agent-suggestions-${a.localKey}`},[(r(!0),o(v,null,f(j.value,n=>(r(),o("option",{key:n.chineseName,value:n.chineseName},null,8,ot))),128))],8,st)])]),e("label",rt,[t[23]||(t[23]=e("span",null,"请求发送者",-1)),u(e("input",{"onUpdate:modelValue":n=>a.maid=n,type:"text",placeholder:"默认 VCP系统"},null,8,it),[[p,a.maid,void 0,{trim:!0}]])]),e("label",ut,[t[24]||(t[24]=e("span",null,"注入工具",-1)),u(e("input",{"onUpdate:modelValue":n=>a.injectToolsText=n,type:"text",placeholder:"例如:VCPForum"},null,8,dt),[[p,a.injectToolsText]])]),e("label",mt,[t[26]||(t[26]=e("span",null,"调度方式",-1)),u(e("select",{"onUpdate:modelValue":n=>a.scheduleMode=n},[...t[25]||(t[25]=[e("option",{value:"interval"},"循环任务",-1),e("option",{value:"cron"},"CRON 定时",-1),e("option",{value:"manual"},"仅手动触发",-1),e("option",{value:"once"},"一次性任务",-1)])],8,pt),[[R,a.scheduleMode]])]),e("label",ct,[t[27]||(t[27]=e("span",null,"循环间隔(分钟)",-1)),u(e("input",{"onUpdate:modelValue":n=>a.intervalMinutes=n,type:"number",min:"10",step:"1",disabled:a.scheduleMode!=="interval"},null,8,vt),[[p,a.intervalMinutes,void 0,{number:!0}]])]),e("label",gt,[t[28]||(t[28]=e("span",null,"CRON 表达式",-1)),u(e("input",{"onUpdate:modelValue":n=>a.cronValue=n,type:"text",placeholder:"例如:0 0 * * * (每日凌晨)",disabled:a.scheduleMode!=="cron"},null,8,ft),[[p,a.cronValue,void 0,{trim:!0}]])]),e("label",ht,[t[29]||(t[29]=e("span",null,"一次性执行时间",-1)),u(e("input",{"onUpdate:modelValue":n=>a.runAtLocal=n,type:"datetime-local",disabled:a.scheduleMode!=="once"},null,8,_t),[[p,a.runAtLocal]])])]),e("label",yt,[u(e("input",{"onUpdate:modelValue":n=>a.enabled=n,type:"checkbox"},null,8,bt),[[L,a.enabled]]),t[30]||(t[30]=e("span",null,"启用该任务",-1))]),e("label",Tt,[u(e("input",{"onUpdate:modelValue":n=>a.taskDelegation=n,type:"checkbox"},null,8,At),[[L,a.taskDelegation]]),t[31]||(t[31]=e("span",null,"异步高级委托",-1))]),a.type==="forum_patrol"?(r(),o(v,{key:0},[e("label",Vt,[u(e("input",{"onUpdate:modelValue":n=>a.includeForumPostList=n,type:"checkbox"},null,8,xt),[[L,a.includeForumPostList]]),t[32]||(t[32]=e("span",null,"执行前自动读取论坛帖子列表",-1))]),e("div",Ct,[e("label",wt,[t[33]||(t[33]=e("span",null,"论坛列表占位符",-1)),u(e("input",{"onUpdate:modelValue":n=>a.forumListPlaceholder=n,type:"text",placeholder:"{{forum_post_list}}"},null,8,Pt),[[p,a.forumListPlaceholder,void 0,{trim:!0}]])]),e("label",Mt,[t[34]||(t[34]=e("span",null,"最大读取帖子数",-1)),u(e("input",{"onUpdate:modelValue":n=>a.maxPosts=n,type:"number",min:"1",step:"1"},null,8,Ut),[[p,a.maxPosts,void 0,{number:!0}]])])])],64)):x("",!0),e("label",$t,[t[35]||(t[35]=e("span",null,"提示词模板",-1)),u(e("textarea",{"onUpdate:modelValue":n=>a.promptTemplate=n,rows:"8",placeholder:"这里是任务的提示词模板"},null,8,Dt),[[p,a.promptTemplate]])]),e("div",St,[t[36]||(t[36]=e("span",{class:"placeholder-label"},"可用占位符",-1)),(r(!0),o(v,null,f(H(a),n=>(r(),o("span",{key:`${a.localKey}-${n}`,class:"placeholder-chip"},s(n),1))),128)),H(a).length===0?(r(),o("span",Lt," 当前任务没有额外占位符 ")):x("",!0)]),e("div",Nt,[e("div",Ft,[e("span",{class:S(["status-badge",a.runtime?.running?"status-running":"status-neutral"])},s(a.runtime?.running?"执行中":"待机"),3),e("span",jt," 成功 "+s(a.runtime?.successCount??0)+" 次 / 失败 "+s(a.runtime?.errorCount??0)+" 次 / 总计 "+s(a.runtime?.runCount??0)+" 次 ",1)]),e("div",Et,[e("div",It,[t[37]||(t[37]=e("span",null,"上次开始",-1)),e("strong",null,s(D(a.runtime?.lastRunTime)),1)]),e("div",Kt,[t[38]||(t[38]=e("span",null,"上次完成",-1)),e("strong",null,s(D(a.runtime?.lastFinishTime)),1)]),e("div",Rt,[t[39]||(t[39]=e("span",null,"下次运行",-1)),e("strong",null,s(D(a.runtime?.nextRunTime)),1)]),e("div",Ot,[t[40]||(t[40]=e("span",null,"耗时",-1)),e("strong",null,s(Y(a.runtime?.lastDurationMs)),1)])]),a.runtime?.lastResult?(r(),o("p",Bt," 最近结果:"+s(a.runtime.lastResult),1)):x("",!0),a.runtime?.lastError?(r(),o("p",qt," 最近错误:"+s(a.runtime.lastError),1)):x("",!0)])]))),128))]))]),e("section",zt,[t[41]||(t[41]=e("div",{class:"card-header"},[e("h3",{class:"card-title"},"最近执行记录")],-1)),q.value.length===0?(r(),o("div",Ht," 还没有执行记录。 ")):(r(),o("div",Qt,[(r(!0),o(v,null,f(q.value.slice(0,8),a=>(r(),o("article",{key:a.id,class:"history-item"},[e("div",Gt,[e("strong",null,s(a.taskName||a.taskId||"未知任务"),1),e("span",{class:S(["status-badge",a.status==="error"?"status-disabled":"status-enabled"])},s(a.status||"unknown"),3)]),e("p",null,s(a.message||"无返回信息"),1),e("div",Yt,[e("span",null,"触发方式:"+s(a.triggerSource||"unknown"),1),e("span",null,"完成时间:"+s(D(a.finishedAt)),1),e("span",null,"耗时:"+s(Y(a.durationMs)),1)])]))),128))]))])]))}}),el=fe(Jt,[["__scopeId","data-v-38baec53"]]);export{el as default}; diff --git a/AdminPanel-Vue/dist/assets/js/ImageCacheEditor-D04zV43L.js b/AdminPanel-Vue/dist/assets/js/ImageCacheEditor-Du3p9rj1.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/ImageCacheEditor-D04zV43L.js rename to AdminPanel-Vue/dist/assets/js/ImageCacheEditor-Du3p9rj1.js index ac583fbcc..711b02c20 100644 --- a/AdminPanel-Vue/dist/assets/js/ImageCacheEditor-D04zV43L.js +++ b/AdminPanel-Vue/dist/assets/js/ImageCacheEditor-Du3p9rj1.js @@ -1 +1 @@ -import{Dt as c,I as J,N as X,O as Y,Q as l,U as R,a as ee,c as U,d as ae,f as r,j as o,k as se,l as t,n as te,v as ie}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as z,d as F,u as ne}from"./dashboard-card-news-BnyB_dHU.js";import{C,G as g}from"./dashboard-card-calendar-CA3-tSpi.js";var re={class:"config-section active-section media-cache-page"},oe={class:"page-header"},le={class:"header-actions"},ce=["disabled"],de={class:"toolbar"},ue={class:"search-box"},ve=["disabled","onKeydown"],pe=["disabled"],he={class:"pagination-controls"},fe=["disabled"],ge={class:"pagination-summary"},me=["disabled"],ye={key:0,class:"status-tip"},_e={key:1,class:"status-tip"},be={key:2,class:"media-grid"},ke={class:"card-actions"},we=["disabled","aria-label","onClick"],Te=["disabled","onClick"],Ce={class:"media-preview-wrap"},De=["onClick","aria-label"],Me={key:0,alt:"媒体预览",class:"media-preview"},Ee=["src"],Re=["src"],Se={key:2,class:"unsupported-media"},Ie=["for"],$e=["id","onUpdate:modelValue","disabled"],Pe=["disabled","onClick"],xe={class:"hash-info"},We={class:"modal-content"},Ue=["src"],ze=["src"],Fe=20,Be=ie({__name:"ImageCacheEditor",setup(Le){const u=l([]),d=l(!1),D=l(""),M=l(""),n=l(1),v=l(1),p=l(0),y=l(Fe),_=l(!1),b=l(""),S=l("image"),B=U(()=>`第 ${n.value} / ${v.value} 页 · 共 ${p.value} 条`),L=U(()=>M.value?"没有匹配的缓存条目。":"暂无缓存条目。");function I(e){if(!e)return"application/octet-stream";let a=e.trim();a.startsWith("data:")&&(a=a.slice(5));const i=a.indexOf(";");return i>0&&(a=a.slice(0,i)),a.endsWith(",")&&(a=a.slice(0,-1)),a||"application/octet-stream"}function V(e){return e?e.startsWith("data:")?e.match(/^data:([^;]+);base64,/)?.[1]||"application/octet-stream":e.startsWith("/9j/")?"image/jpeg":e.startsWith("iVBOR")?"image/png":e.startsWith("R0lGOD")?"image/gif":e.startsWith("UklGR")?"image/webp":"application/octet-stream":"application/octet-stream"}function m(e){const a=I(e);return a.startsWith("image/")?"image":a.startsWith("audio/")?"audio":a.startsWith("video/")?"video":"unknown"}function k(e){return e.base64?e.base64.startsWith("data:")?e.base64:`data:${e.mimeType};base64,${e.base64}`:""}function w(e){return e.isReidentifying||e.isDeleting||e.isSaving}function N(e){return e.isSaving?"保存中…":e.saveFeedback==="saved"?"已保存":"保存更改"}function T(e){e.saveResetTimer!==null&&(window.clearTimeout(e.saveResetTimer),e.saveResetTimer=null)}function O(e){T(e),e.saveResetTimer=window.setTimeout(()=>{e.saveFeedback="idle",e.saveResetTimer=null},2e3)}function $(e=u.value){e.forEach(a=>T(a))}function A(e){const a=typeof e.description=="string"?e.description:"",i=typeof e.timestamp=="string"?e.timestamp:"",s=typeof e.base64=="string"?e.base64:"",f=e.mimeType||V(s);return{hash:e.hash,base64:s,description:a,originalDescription:a,timestamp:i,mimeType:I(f),isReidentifying:!1,isDeleting:!1,isSaving:!1,saveFeedback:"idle",saveResetTimer:null}}function P(e,a,i,s){p.value=e,v.value=Math.max(a,1),n.value=e>0?Math.min(i,v.value):1,y.value=s||y.value}async function h(e=n.value){d.value=!0;try{const a=await C.getCache({page:e,pageSize:y.value,search:M.value||void 0});if(a.total>0&&a.items.length===0&&e>1&&e>a.totalPages){P(a.total,a.totalPages,a.totalPages,a.pageSize),await h(a.totalPages);return}$(),u.value=a.items.map(A),P(a.total,a.totalPages,a.page,a.pageSize)}catch(a){const i=a instanceof Error?a.message:String(a);console.error("加载多媒体缓存失败:",a),g(`加载失败:${i}`,"error")}finally{d.value=!1}}function G(){h(n.value)}function x(){M.value=D.value,n.value=1,h(1)}function K(){n.value<=1||h(n.value-1)}function j(){n.value>=v.value||h(n.value+1)}async function H(e){if(!e.isSaving){e.isSaving=!0,e.saveFeedback="idle",T(e);try{const a=await C.updateEntry(e.hash,e.description);e.originalDescription=e.description,e.saveFeedback="saved",O(e),g(a.message||"条目已成功更新。","success")}catch(a){const i=a instanceof Error?a.message:String(a);console.error("保存多媒体缓存条目失败:",a),g(`保存失败:${i}`,"error")}finally{e.isSaving=!1}}}async function Q(e){if(!(e.isDeleting||!confirm("确定要删除这个媒体条目吗?"))){e.isDeleting=!0;try{const a=await C.deleteEntry(e.hash);T(e),u.value=u.value.filter(i=>i.hash!==e.hash),p.value=Math.max(p.value-1,0),v.value=Math.max(Math.ceil(p.value/y.value),1),n.value=p.value===0?1:Math.min(n.value,v.value),u.value.length===0&&p.value>0&&await h(n.value),g(a.message||"缓存条目已删除。","success")}catch(a){const i=a instanceof Error?a.message:String(a);console.error("删除多媒体缓存条目失败:",a),g(`删除失败:${i}`,"error")}finally{e.isDeleting=!1}}}async function Z(e){if(!w(e)){e.isReidentifying=!0;try{const a=await C.reidentify(e.hash),i=a?.newDescription||"";e.description=i,e.originalDescription=i,e.timestamp=a?.newTimestamp||e.timestamp,g(a?.message||"媒体重新识别成功。","success")}catch(a){const i=a instanceof Error?a.message:String(a);console.error("重新识别失败:",a),g(`重新识别失败:${i}`,"error")}finally{e.isReidentifying=!1}}}function q(e){const a=m(e.mimeType),i=k(e);a!=="image"&&a!=="video"||!i||(b.value=i,S.value=a,_.value=!0,document.body.style.overflow="hidden")}function E(){_.value=!1,b.value="",document.body.style.overflow=""}function W(e){e.key==="Escape"&&_.value&&E()}return Y(()=>{h(),document.addEventListener("keydown",W)}),se(()=>{$(),document.removeEventListener("keydown",W),document.body.style.overflow=""}),(e,a)=>{const i=J("lazy");return o(),r("section",re,[t("div",oe,[a[1]||(a[1]=t("div",null,[t("p",{class:"description"},"编辑多媒体缓存记录,支持搜索、分页、重新识别与预览。")],-1)),t("div",le,[t("button",{class:"btn-secondary",type:"button",onClick:G,disabled:d.value}," 刷新 ",8,ce)])]),t("div",de,[t("div",ue,[R(t("input",{"onUpdate:modelValue":a[0]||(a[0]=s=>D.value=s),type:"search",placeholder:"搜索媒体描述…",disabled:d.value,onKeydown:ne(F(x,["prevent"]),["enter"])},null,40,ve),[[z,D.value,void 0,{trim:!0}]]),t("button",{class:"btn-secondary",type:"button",onClick:x,disabled:d.value}," 搜索 ",8,pe)]),t("div",he,[t("button",{class:"btn-secondary",type:"button",onClick:K,disabled:d.value||n.value<=1}," 上一页 ",8,fe),t("span",ge,c(B.value),1),t("button",{class:"btn-secondary",type:"button",onClick:j,disabled:d.value||n.value>=v.value}," 下一页 ",8,me)])]),d.value?(o(),r("p",ye,"正在加载多媒体缓存数据…")):u.value.length===0?(o(),r("p",_e,c(L.value),1)):(o(),r("div",be,[(o(!0),r(ee,null,X(u.value,s=>(o(),r("article",{key:s.hash,class:"media-card"},[t("div",ke,[t("button",{class:"icon-btn reidentify",type:"button",disabled:w(s),"aria-label":s.isReidentifying?"正在重新识别":"重新识别媒体描述",onClick:f=>Z(s)},c(s.isReidentifying?"…":"↻"),9,we),t("button",{class:"icon-btn delete",type:"button",disabled:w(s),"aria-label":"删除条目",onClick:f=>Q(s)},c(s.isDeleting?"…":"×"),9,Te)]),t("h3",null,"时间戳: "+c(s.timestamp||"N/A"),1),t("div",Ce,[m(s.mimeType)==="image"||m(s.mimeType)==="video"?(o(),r("button",{key:0,class:"media-preview-button",type:"button",onClick:f=>q(s),"aria-label":`预览${m(s.mimeType)==="image"?"图片":"视频"}`},[m(s.mimeType)==="image"?R((o(),r("img",Me,null,512)),[[i,k(s)]]):(o(),r("video",{key:1,src:k(s),class:"media-preview",preload:"metadata",muted:""},null,8,Ee))],8,De)):m(s.mimeType)==="audio"?(o(),r("audio",{key:1,src:k(s),controls:"",preload:"metadata",class:"media-audio"},null,8,Re)):(o(),r("div",Se,[a[2]||(a[2]=t("p",null,"不支持的媒体类型",-1)),t("span",null,c(s.mimeType),1)]))]),t("label",{class:"desc-label",for:`desc-${s.hash}`},"媒体描述:",8,Ie),R(t("textarea",{id:`desc-${s.hash}`,"onUpdate:modelValue":f=>s.description=f,rows:"4",disabled:s.isDeleting||s.isSaving,placeholder:"请输入媒体描述…"},null,8,$e),[[z,s.description]]),t("button",{class:"btn-success",style:{width:"100%"},type:"button",disabled:w(s),onClick:f=>H(s)},c(N(s)),9,Pe),t("div",xe,"Hash (部分): "+c(s.hash.slice(0,30))+c(s.hash.length>30?"…":""),1)]))),128))])),_.value?(o(),r("div",{key:3,class:"preview-modal",role:"dialog","aria-modal":"true","aria-label":"媒体预览",onClick:F(E,["self"])},[t("button",{class:"modal-close",type:"button","aria-label":"关闭预览",onClick:E},"×"),t("div",We,[S.value==="image"?(o(),r("img",{key:0,src:b.value,alt:"放大预览图"},null,8,Ue)):(o(),r("video",{key:1,controls:"",autoplay:"",src:b.value},null,8,ze))])])):ae("",!0)])}}}),Ae=te(Be,[["__scopeId","data-v-20c84b2e"]]);export{Ae as default}; +import{Dt as c,I as J,N as X,O as Y,Q as l,U as R,a as ee,c as U,d as ae,f as r,j as o,k as se,l as t,n as te,v as ie}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as z,d as F,u as ne}from"./dashboard-card-news-BnyB_dHU.js";import{C,G as g}from"./dashboard-card-calendar-DWuV34Bn.js";var re={class:"config-section active-section media-cache-page"},oe={class:"page-header"},le={class:"header-actions"},ce=["disabled"],de={class:"toolbar"},ue={class:"search-box"},ve=["disabled","onKeydown"],pe=["disabled"],he={class:"pagination-controls"},fe=["disabled"],ge={class:"pagination-summary"},me=["disabled"],ye={key:0,class:"status-tip"},_e={key:1,class:"status-tip"},be={key:2,class:"media-grid"},ke={class:"card-actions"},we=["disabled","aria-label","onClick"],Te=["disabled","onClick"],Ce={class:"media-preview-wrap"},De=["onClick","aria-label"],Me={key:0,alt:"媒体预览",class:"media-preview"},Ee=["src"],Re=["src"],Se={key:2,class:"unsupported-media"},Ie=["for"],$e=["id","onUpdate:modelValue","disabled"],Pe=["disabled","onClick"],xe={class:"hash-info"},We={class:"modal-content"},Ue=["src"],ze=["src"],Fe=20,Be=ie({__name:"ImageCacheEditor",setup(Le){const u=l([]),d=l(!1),D=l(""),M=l(""),n=l(1),v=l(1),p=l(0),y=l(Fe),_=l(!1),b=l(""),S=l("image"),B=U(()=>`第 ${n.value} / ${v.value} 页 · 共 ${p.value} 条`),L=U(()=>M.value?"没有匹配的缓存条目。":"暂无缓存条目。");function I(e){if(!e)return"application/octet-stream";let a=e.trim();a.startsWith("data:")&&(a=a.slice(5));const i=a.indexOf(";");return i>0&&(a=a.slice(0,i)),a.endsWith(",")&&(a=a.slice(0,-1)),a||"application/octet-stream"}function V(e){return e?e.startsWith("data:")?e.match(/^data:([^;]+);base64,/)?.[1]||"application/octet-stream":e.startsWith("/9j/")?"image/jpeg":e.startsWith("iVBOR")?"image/png":e.startsWith("R0lGOD")?"image/gif":e.startsWith("UklGR")?"image/webp":"application/octet-stream":"application/octet-stream"}function m(e){const a=I(e);return a.startsWith("image/")?"image":a.startsWith("audio/")?"audio":a.startsWith("video/")?"video":"unknown"}function k(e){return e.base64?e.base64.startsWith("data:")?e.base64:`data:${e.mimeType};base64,${e.base64}`:""}function w(e){return e.isReidentifying||e.isDeleting||e.isSaving}function N(e){return e.isSaving?"保存中…":e.saveFeedback==="saved"?"已保存":"保存更改"}function T(e){e.saveResetTimer!==null&&(window.clearTimeout(e.saveResetTimer),e.saveResetTimer=null)}function O(e){T(e),e.saveResetTimer=window.setTimeout(()=>{e.saveFeedback="idle",e.saveResetTimer=null},2e3)}function $(e=u.value){e.forEach(a=>T(a))}function A(e){const a=typeof e.description=="string"?e.description:"",i=typeof e.timestamp=="string"?e.timestamp:"",s=typeof e.base64=="string"?e.base64:"",f=e.mimeType||V(s);return{hash:e.hash,base64:s,description:a,originalDescription:a,timestamp:i,mimeType:I(f),isReidentifying:!1,isDeleting:!1,isSaving:!1,saveFeedback:"idle",saveResetTimer:null}}function P(e,a,i,s){p.value=e,v.value=Math.max(a,1),n.value=e>0?Math.min(i,v.value):1,y.value=s||y.value}async function h(e=n.value){d.value=!0;try{const a=await C.getCache({page:e,pageSize:y.value,search:M.value||void 0});if(a.total>0&&a.items.length===0&&e>1&&e>a.totalPages){P(a.total,a.totalPages,a.totalPages,a.pageSize),await h(a.totalPages);return}$(),u.value=a.items.map(A),P(a.total,a.totalPages,a.page,a.pageSize)}catch(a){const i=a instanceof Error?a.message:String(a);console.error("加载多媒体缓存失败:",a),g(`加载失败:${i}`,"error")}finally{d.value=!1}}function G(){h(n.value)}function x(){M.value=D.value,n.value=1,h(1)}function K(){n.value<=1||h(n.value-1)}function j(){n.value>=v.value||h(n.value+1)}async function H(e){if(!e.isSaving){e.isSaving=!0,e.saveFeedback="idle",T(e);try{const a=await C.updateEntry(e.hash,e.description);e.originalDescription=e.description,e.saveFeedback="saved",O(e),g(a.message||"条目已成功更新。","success")}catch(a){const i=a instanceof Error?a.message:String(a);console.error("保存多媒体缓存条目失败:",a),g(`保存失败:${i}`,"error")}finally{e.isSaving=!1}}}async function Q(e){if(!(e.isDeleting||!confirm("确定要删除这个媒体条目吗?"))){e.isDeleting=!0;try{const a=await C.deleteEntry(e.hash);T(e),u.value=u.value.filter(i=>i.hash!==e.hash),p.value=Math.max(p.value-1,0),v.value=Math.max(Math.ceil(p.value/y.value),1),n.value=p.value===0?1:Math.min(n.value,v.value),u.value.length===0&&p.value>0&&await h(n.value),g(a.message||"缓存条目已删除。","success")}catch(a){const i=a instanceof Error?a.message:String(a);console.error("删除多媒体缓存条目失败:",a),g(`删除失败:${i}`,"error")}finally{e.isDeleting=!1}}}async function Z(e){if(!w(e)){e.isReidentifying=!0;try{const a=await C.reidentify(e.hash),i=a?.newDescription||"";e.description=i,e.originalDescription=i,e.timestamp=a?.newTimestamp||e.timestamp,g(a?.message||"媒体重新识别成功。","success")}catch(a){const i=a instanceof Error?a.message:String(a);console.error("重新识别失败:",a),g(`重新识别失败:${i}`,"error")}finally{e.isReidentifying=!1}}}function q(e){const a=m(e.mimeType),i=k(e);a!=="image"&&a!=="video"||!i||(b.value=i,S.value=a,_.value=!0,document.body.style.overflow="hidden")}function E(){_.value=!1,b.value="",document.body.style.overflow=""}function W(e){e.key==="Escape"&&_.value&&E()}return Y(()=>{h(),document.addEventListener("keydown",W)}),se(()=>{$(),document.removeEventListener("keydown",W),document.body.style.overflow=""}),(e,a)=>{const i=J("lazy");return o(),r("section",re,[t("div",oe,[a[1]||(a[1]=t("div",null,[t("p",{class:"description"},"编辑多媒体缓存记录,支持搜索、分页、重新识别与预览。")],-1)),t("div",le,[t("button",{class:"btn-secondary",type:"button",onClick:G,disabled:d.value}," 刷新 ",8,ce)])]),t("div",de,[t("div",ue,[R(t("input",{"onUpdate:modelValue":a[0]||(a[0]=s=>D.value=s),type:"search",placeholder:"搜索媒体描述…",disabled:d.value,onKeydown:ne(F(x,["prevent"]),["enter"])},null,40,ve),[[z,D.value,void 0,{trim:!0}]]),t("button",{class:"btn-secondary",type:"button",onClick:x,disabled:d.value}," 搜索 ",8,pe)]),t("div",he,[t("button",{class:"btn-secondary",type:"button",onClick:K,disabled:d.value||n.value<=1}," 上一页 ",8,fe),t("span",ge,c(B.value),1),t("button",{class:"btn-secondary",type:"button",onClick:j,disabled:d.value||n.value>=v.value}," 下一页 ",8,me)])]),d.value?(o(),r("p",ye,"正在加载多媒体缓存数据…")):u.value.length===0?(o(),r("p",_e,c(L.value),1)):(o(),r("div",be,[(o(!0),r(ee,null,X(u.value,s=>(o(),r("article",{key:s.hash,class:"media-card"},[t("div",ke,[t("button",{class:"icon-btn reidentify",type:"button",disabled:w(s),"aria-label":s.isReidentifying?"正在重新识别":"重新识别媒体描述",onClick:f=>Z(s)},c(s.isReidentifying?"…":"↻"),9,we),t("button",{class:"icon-btn delete",type:"button",disabled:w(s),"aria-label":"删除条目",onClick:f=>Q(s)},c(s.isDeleting?"…":"×"),9,Te)]),t("h3",null,"时间戳: "+c(s.timestamp||"N/A"),1),t("div",Ce,[m(s.mimeType)==="image"||m(s.mimeType)==="video"?(o(),r("button",{key:0,class:"media-preview-button",type:"button",onClick:f=>q(s),"aria-label":`预览${m(s.mimeType)==="image"?"图片":"视频"}`},[m(s.mimeType)==="image"?R((o(),r("img",Me,null,512)),[[i,k(s)]]):(o(),r("video",{key:1,src:k(s),class:"media-preview",preload:"metadata",muted:""},null,8,Ee))],8,De)):m(s.mimeType)==="audio"?(o(),r("audio",{key:1,src:k(s),controls:"",preload:"metadata",class:"media-audio"},null,8,Re)):(o(),r("div",Se,[a[2]||(a[2]=t("p",null,"不支持的媒体类型",-1)),t("span",null,c(s.mimeType),1)]))]),t("label",{class:"desc-label",for:`desc-${s.hash}`},"媒体描述:",8,Ie),R(t("textarea",{id:`desc-${s.hash}`,"onUpdate:modelValue":f=>s.description=f,rows:"4",disabled:s.isDeleting||s.isSaving,placeholder:"请输入媒体描述…"},null,8,$e),[[z,s.description]]),t("button",{class:"btn-success",style:{width:"100%"},type:"button",disabled:w(s),onClick:f=>H(s)},c(N(s)),9,Pe),t("div",xe,"Hash (部分): "+c(s.hash.slice(0,30))+c(s.hash.length>30?"…":""),1)]))),128))])),_.value?(o(),r("div",{key:3,class:"preview-modal",role:"dialog","aria-modal":"true","aria-label":"媒体预览",onClick:F(E,["self"])},[t("button",{class:"modal-close",type:"button","aria-label":"关闭预览",onClick:E},"×"),t("div",We,[S.value==="image"?(o(),r("img",{key:0,src:b.value,alt:"放大预览图"},null,8,Ue)):(o(),r("video",{key:1,controls:"",autoplay:"",src:b.value},null,8,ze))])])):ae("",!0)])}}}),Ae=te(Be,[["__scopeId","data-v-20c84b2e"]]);export{Ae as default}; diff --git a/AdminPanel-Vue/dist/assets/js/Login-DobCpdzn.js b/AdminPanel-Vue/dist/assets/js/Login-O5UIIymr.js similarity index 95% rename from AdminPanel-Vue/dist/assets/js/Login-DobCpdzn.js rename to AdminPanel-Vue/dist/assets/js/Login-O5UIIymr.js index d869a0d73..64142c9ab 100644 --- a/AdminPanel-Vue/dist/assets/js/Login-DobCpdzn.js +++ b/AdminPanel-Vue/dist/assets/js/Login-O5UIIymr.js @@ -1 +1 @@ -import{Dt as m,Q as t,U as c,d as L,f,j as g,l as s,n as x,v as k,wt as _}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as C,d as D,o as V}from"./dashboard-card-news-BnyB_dHU.js";import{i as P,r as S}from"./vue-vendor-BUOVPpjf.js";import{n as A,t as q}from"./index-ByuHVUJE.js";import{n as B}from"./dashboard-components-LHqMn0M5.js";var E={class:"login-page"},M={class:"login-container"},R={class:"login-card"},T={class:"logo-section"},U={class:"form-group"},I={class:"input-wrapper"},N={class:"form-group"},j={class:"input-wrapper"},z=["type"],Q=["aria-label","aria-pressed"],F={class:"material-symbols-outlined","aria-hidden":"true"},G=["disabled"],H=k({__name:"Login",setup(J){const u=P(),b=S(),l=A(),d=t(""),p=t(""),o=t(!1),v=t(!1),r=t(""),i=t("error");function y(a){const e=a.target;e.style.display="none"}function w(){o.value=!o.value}async function h(){if(!d.value||!p.value){r.value="请输入用户名和密码",i.value="error";return}v.value=!0,r.value="";try{const a=await l.login(d.value,p.value);if(a.success){r.value="登录成功,正在跳转…",i.value="success",await new Promise(n=>setTimeout(n,500));const e=q(u,b.query.redirect);u.push(e)}else r.value=a.message||"用户名或密码错误",i.value="error"}catch(a){console.error("Login error:",a),r.value="连接服务器失败,请检查网络连接后重试",i.value="error"}finally{v.value=!1}}return!l.isLoading&&l.isAuthenticated?u.push({name:"Dashboard"}):l.isLoading||l.checkAuth().then(a=>{a&&u.push({name:"Dashboard"})}),(a,e)=>(g(),f("div",E,[s("div",M,[s("div",R,[s("div",T,[s("img",{src:B,alt:"VCP Logo",onError:y},null,32),e[2]||(e[2]=s("p",null,"控制中心管理面板",-1))]),s("form",{onSubmit:D(h,["prevent"])},[s("div",U,[e[4]||(e[4]=s("label",{for:"username"},"用户名",-1)),s("div",I,[c(s("input",{type:"text",id:"username","onUpdate:modelValue":e[0]||(e[0]=n=>d.value=n),placeholder:"请输入用户名",autocomplete:"username",name:"username",required:""},null,512),[[C,d.value]]),e[3]||(e[3]=s("span",{class:"material-symbols-outlined input-icon","aria-hidden":"true"},"person",-1))])]),s("div",N,[e[6]||(e[6]=s("label",{for:"password"},"密码",-1)),s("div",j,[c(s("input",{type:o.value?"text":"password",id:"password","onUpdate:modelValue":e[1]||(e[1]=n=>p.value=n),placeholder:"请输入密码",autocomplete:"current-password",name:"password",required:""},null,8,z),[[V,p.value]]),e[5]||(e[5]=s("span",{class:"material-symbols-outlined input-icon","aria-hidden":"true"},"lock",-1)),s("button",{type:"button",class:"password-toggle",onClick:w,"aria-label":o.value?"隐藏密码":"显示密码","aria-pressed":o.value},[s("span",F,m(o.value?"visibility_off":"visibility"),1)],8,Q)])]),s("button",{type:"submit",class:_(["btn-primary login-button",{loading:v.value}]),disabled:v.value},[...e[7]||(e[7]=[s("span",{class:"spinner"},null,-1),s("span",{class:"btn-text"},"登 录",-1)])],10,G),r.value?(g(),f("div",{key:0,class:_(["message",i.value])},m(r.value),3)):L("",!0)],32),e[8]||(e[8]=s("p",{class:"footer-text"},"安全连接 · 仅限授权管理员访问",-1))])])]))}}),Z=x(H,[["__scopeId","data-v-d0cb7930"]]);export{Z as default}; +import{Dt as m,Q as t,U as c,d as L,f,j as g,l as s,n as x,v as k,wt as _}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as C,d as D,o as V}from"./dashboard-card-news-BnyB_dHU.js";import{i as P,r as S}from"./vue-vendor-BUOVPpjf.js";import{n as A,t as q}from"./index-DavTYS7A.js";import{n as B}from"./dashboard-components-B8tHL6X6.js";var E={class:"login-page"},M={class:"login-container"},R={class:"login-card"},T={class:"logo-section"},U={class:"form-group"},I={class:"input-wrapper"},N={class:"form-group"},j={class:"input-wrapper"},z=["type"],Q=["aria-label","aria-pressed"],F={class:"material-symbols-outlined","aria-hidden":"true"},G=["disabled"],H=k({__name:"Login",setup(J){const u=P(),b=S(),l=A(),d=t(""),p=t(""),o=t(!1),v=t(!1),r=t(""),i=t("error");function y(a){const e=a.target;e.style.display="none"}function w(){o.value=!o.value}async function h(){if(!d.value||!p.value){r.value="请输入用户名和密码",i.value="error";return}v.value=!0,r.value="";try{const a=await l.login(d.value,p.value);if(a.success){r.value="登录成功,正在跳转…",i.value="success",await new Promise(n=>setTimeout(n,500));const e=q(u,b.query.redirect);u.push(e)}else r.value=a.message||"用户名或密码错误",i.value="error"}catch(a){console.error("Login error:",a),r.value="连接服务器失败,请检查网络连接后重试",i.value="error"}finally{v.value=!1}}return!l.isLoading&&l.isAuthenticated?u.push({name:"Dashboard"}):l.isLoading||l.checkAuth().then(a=>{a&&u.push({name:"Dashboard"})}),(a,e)=>(g(),f("div",E,[s("div",M,[s("div",R,[s("div",T,[s("img",{src:B,alt:"VCP Logo",onError:y},null,32),e[2]||(e[2]=s("p",null,"控制中心管理面板",-1))]),s("form",{onSubmit:D(h,["prevent"])},[s("div",U,[e[4]||(e[4]=s("label",{for:"username"},"用户名",-1)),s("div",I,[c(s("input",{type:"text",id:"username","onUpdate:modelValue":e[0]||(e[0]=n=>d.value=n),placeholder:"请输入用户名",autocomplete:"username",name:"username",required:""},null,512),[[C,d.value]]),e[3]||(e[3]=s("span",{class:"material-symbols-outlined input-icon","aria-hidden":"true"},"person",-1))])]),s("div",N,[e[6]||(e[6]=s("label",{for:"password"},"密码",-1)),s("div",j,[c(s("input",{type:o.value?"text":"password",id:"password","onUpdate:modelValue":e[1]||(e[1]=n=>p.value=n),placeholder:"请输入密码",autocomplete:"current-password",name:"password",required:""},null,8,z),[[V,p.value]]),e[5]||(e[5]=s("span",{class:"material-symbols-outlined input-icon","aria-hidden":"true"},"lock",-1)),s("button",{type:"button",class:"password-toggle",onClick:w,"aria-label":o.value?"隐藏密码":"显示密码","aria-pressed":o.value},[s("span",F,m(o.value?"visibility_off":"visibility"),1)],8,Q)])]),s("button",{type:"submit",class:_(["btn-primary login-button",{loading:v.value}]),disabled:v.value},[...e[7]||(e[7]=[s("span",{class:"spinner"},null,-1),s("span",{class:"btn-text"},"登 录",-1)])],10,G),r.value?(g(),f("div",{key:0,class:_(["message",i.value])},m(r.value),3)):L("",!0)],32),e[8]||(e[8]=s("p",{class:"footer-text"},"安全连接 · 仅限授权管理员访问",-1))])])]))}}),Z=x(H,[["__scopeId","data-v-d0cb7930"]]);export{Z as default}; diff --git a/AdminPanel-Vue/dist/assets/js/MainLayout-DAf1ed91.js b/AdminPanel-Vue/dist/assets/js/MainLayout-CLxOFRXT.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/MainLayout-DAf1ed91.js rename to AdminPanel-Vue/dist/assets/js/MainLayout-CLxOFRXT.js index d80340b75..c73c99c82 100644 --- a/AdminPanel-Vue/dist/assets/js/MainLayout-DAf1ed91.js +++ b/AdminPanel-Vue/dist/assets/js/MainLayout-CLxOFRXT.js @@ -1 +1 @@ -import{Dt as $,E as Z,Et as ee,F as we,H as J,L as Ne,N as G,O as ve,Q as E,U as te,V as Y,a as A,at as p,c as k,d as O,f as b,g as V,h as le,j as f,k as ne,l as a,m as $e,n as D,o as xe,u as me,v as U,wt as x}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as Te,d as z,l as pe,n as oe,u as re}from"./dashboard-card-news-BnyB_dHU.js";import{A as de,G as ae,H as ge,P as fe,V as Ee,u as Ie,z as Pe}from"./dashboard-card-calendar-CA3-tSpi.js";import{i as ie,r as se}from"./vue-vendor-BUOVPpjf.js";import{i as Le,n as He,r as Be}from"./index-ByuHVUJE.js";import{a as Ve,i as K}from"./dashboard-components-LHqMn0M5.js";import{i as Re,n as Ae,r as De,t as Ue}from"./useRecentVisits-ryn7iNG7.js";import{t as Oe}from"./useVirtualScroll-DdYyc53Y.js";var ze=["aria-hidden","aria-busy"],Ge=["aria-hidden"],Fe=U({__name:"FeedbackHost",setup(e){const l=Le,t=k(()=>Be.message);return(s,o)=>(f(),b(A,null,[a("div",{class:x(["loading-overlay",{visible:p(l)}]),role:"status","aria-live":"polite","aria-hidden":!p(l),"aria-busy":p(l)},[...o[0]||(o[0]=[a("div",{class:"spinner"},null,-1),a("p",null,"正在加载…",-1)])],10,ze),a("div",{class:x(["message-popup",[t.value.type,{show:t.value.visible}]]),role:"status","aria-live":"polite","aria-atomic":"true","aria-hidden":!t.value.visible},$(t.value.text),11,Ge)],64))}}),Ke=D(Fe,[["__scopeId","data-v-4c61e77f"]]),Qe=U({__name:"SolarSystemBg",setup(e){const l=K(),t=k(()=>l.animationsEnabled),s=k(()=>l.isImmersiveMode);return(o,r)=>(f(),b("div",{class:x(["solar-system-bg",{"immersive-mode":s.value}]),"aria-hidden":"true",style:ee({display:t.value?"":"none"})},[...r[0]||(r[0]=[$e('
',13)])],6))}}),qe=D(Qe,[["__scopeId","data-v-d13f1c26"]]);function j(e){return e.toLowerCase().trim()}function q(e){return e.manifest.name||e.name}function Q(e){return e.manifest.displayName?.trim()||q(e)}function W(e){return j(e.filter(Boolean).join(" "))}function X(e){return e.pluginName?`plugin:${e.pluginName}`:`page:${e.target}`}function F(e,l){return e.badges.includes(l)}function be(e){return e.map((l,t)=>({...l,priority:t}))}function je(e){let l=0;return e.flatMap(t=>{if(!t.target||!t.label||t.category||t.pluginName)return[];const s=t.target==="dashboard"?"控制台主页":"控制台页面";return[{id:`page:${t.target}`,kind:"page",label:t.label,subtitle:s,icon:t.icon||"arrow_outward",target:t.target,badges:[],priority:l++,searchText:W([t.label,t.target,s])}]})}function Ye(e,l){const t=new Set(l);return[...e].sort((s,o)=>{const r=q(s),n=q(o),i=Number(t.has(n))-Number(t.has(r));if(i!==0)return i;const v=Number(o.enabled)-Number(s.enabled);return v!==0?v:Q(s).localeCompare(Q(o),"zh-CN",{sensitivity:"base"})}).map((s,o)=>{const r=q(s),n=[...t.has(r)?["已固定"]:[],s.enabled?"已启用":"已禁用",...s.isDistributed?["分布式"]:[]],i=s.manifest.description?.trim()||r;return{id:`plugin:${r}`,kind:"plugin",label:Q(s),subtitle:i,icon:s.manifest.icon||"extension",target:`plugin-${r}-config`,pluginName:r,badges:n,priority:o,searchText:W([Q(s),r,i,...n])}})}function ue(e,l){return l[Ue(e.target,e.pluginName)]}function ye(e){return new Map(e.map((l,t)=>[X(l),t]))}function he(e,l,t,s){const o=ue(e,s),r=ue(l,s),n=(r?.count??0)-(o?.count??0);if(n!==0)return n;const i=t.get(X(e))??Number.MAX_SAFE_INTEGER,v=t.get(X(l))??Number.MAX_SAFE_INTEGER;if(i!==v)return i-v;const m=(r?.lastVisitedAt??0)-(o?.lastVisitedAt??0);return m!==0?m:e.priority-l.priority||e.label.localeCompare(l.label,"zh-CN",{sensitivity:"base"})}function We(e,l,t){const s=ye(l);return be([...e].sort((o,r)=>he(o,r,s,t)))}function Xe(e,l,t,s){const o=ye(l),r=new Map(s.map((n,i)=>[n,i]));return be([...e].sort((n,i)=>{const v=n.pluginName!==void 0?r.get(n.pluginName):void 0,m=i.pluginName!==void 0?r.get(i.pluginName):void 0,_=v!==void 0,S=m!==void 0;if(_!==S)return Number(S)-Number(_);if(_&&S&&v!==void 0&&m!==void 0&&v!==m)return v-m;const g=+!F(i,"已禁用")-+!F(n,"已禁用");return g!==0?g:he(n,i,o,t)}))}function Je(e,l,t,s){const o=new Map(l.filter(i=>!!(i.target&&i.label&&!i.category)).map(i=>[i.target,i])),r=new Map(t.map(i=>[q(i),i])),n=new Set(s);return e.flatMap((i,v)=>{if(i.pluginName){const S=r.get(i.pluginName);if(!S)return[];const g=q(S),w=["最近访问",...n.has(g)?["已固定"]:[],...S.isDistributed?["分布式"]:[]],y=S.manifest.description?.trim()||`插件 · ${g}`;return[{id:`recent:plugin:${g}`,kind:"recent",label:Q(S),subtitle:y,icon:S.manifest.icon||"extension",target:`plugin-${g}-config`,pluginName:g,badges:w,priority:v,searchText:W([Q(S),g,y,...w])}]}const m=o.get(i.target);if(!m?.label)return[];const _="最近访问的页面";return[{id:`recent:page:${m.target}`,kind:"recent",label:m.label,subtitle:_,icon:m.icon||i.icon||"arrow_outward",target:m.target,badges:["最近访问"],priority:v,searchText:W([m.label,m.target,_])}]})}function Ze(e,l){const t=j(l);if(!t)return 0;const s=t.split(/\s+/).filter(Boolean);if(!s.every(i=>e.searchText.includes(i)))return-1;const o=j(e.label),r=j(e.subtitle);let n=0;for(const i of s){if(o===i){n+=160;continue}if(o.startsWith(i)){n+=120;continue}if(o.includes(i)){n+=90;continue}if(r.startsWith(i)){n+=60;continue}if(r.includes(i)){n+=45;continue}n+=25}return e.kind==="recent"&&(n+=18),F(e,"已固定")&&(n+=10),F(e,"已启用")&&(n+=4),n}function ea(e,l,t){const s=l.filter(n=>F(n,"已固定")),o=l.filter(n=>!F(n,"已固定")&&!F(n,"已禁用")),r=[...s,...o].slice(0,6);return[{id:"recent",title:"最近访问",items:t.slice(0,5)},{id:"page",title:"常用页面",items:e.slice(0,6)},{id:"plugin-shortcuts",title:"插件捷径",items:r}].filter(n=>n.items.length>0)}function aa(e,l,t){const s=e.map(n=>({entry:n,score:Ze(n,l)})).filter(n=>n.score>=0).sort((n,i)=>i.score-n.score||n.entry.priority-i.entry.priority||n.entry.label.localeCompare(i.entry.label,"zh-CN",{sensitivity:"base"})),o=new Set,r=[];for(const n of s){const i=X(n.entry);if(!o.has(i)&&(o.add(i),r.push(n.entry),r.length>=t))break}return[{id:"recent",title:"最近访问",items:r.filter(n=>n.kind==="recent")},{id:"page",title:"页面",items:r.filter(n=>n.kind==="page")},{id:"plugin",title:"插件",items:r.filter(n=>n.kind==="plugin")}].filter(n=>n.items.length>0)}function ta({navItems:e,plugins:l,recentVisits:t,navigationUsage:s,pinnedPluginNames:o}){const r=Je(t,e,l,o),n=We(je(e),r,s),i=Xe(Ye(l,o),r,s,o);return{recentEntries:r,pageEntries:n,pluginEntries:i,allEntries:[...r,...n,...i]}}function na(e,{query:l,limit:t=12}){return j(l)?aa(e.allEntries,l,t):ea(e.pageEntries,e.pluginEntries,e.recentEntries)}var ia={class:"command-header"},sa={class:"command-search"},la=["aria-activedescendant"],oa={key:0,class:"command-empty","aria-live":"polite"},ra={key:1,id:"global-command-results",class:"command-results",role:"listbox"},da={class:"command-section-header"},ua=["id","aria-selected","data-command-index","onMouseenter","onClick"],ca={class:"command-item-icon material-symbols-outlined"},va={class:"command-item-copy"},ma={class:"command-item-topline"},pa={class:"command-kind"},ga={class:"command-item-subtitle"},fa={class:"command-item-badges"},ba=U({__name:"GlobalCommandPalette",props:{isOpen:{type:Boolean},navItems:{},plugins:{},recentVisits:{},navigationUsage:{},pinnedPluginNames:{}},emits:["close","navigateTo"],setup(e,{emit:l}){const t=e,s=l,o={recent:"最近",page:"页面",plugin:"插件"},r=E(null),n=E(""),i=E(0);let v=null;const m=k(()=>t.isOpen?ta({navItems:t.navItems,plugins:t.plugins,recentVisits:t.recentVisits,navigationUsage:t.navigationUsage,pinnedPluginNames:t.pinnedPluginNames}):null),_=k(()=>!t.isOpen||!m.value?[]:na(m.value,{query:n.value})),S=k(()=>{let d=0;return _.value.map(h=>({...h,items:h.items.map(P=>({...P,index:d++}))}))}),g=k(()=>S.value.flatMap(d=>d.items)),w=k(()=>g.value[i.value]?y(i.value):void 0);function y(d){return`command-palette-option-${d}`}function N(){Z(()=>{document.querySelector(`[data-command-index="${i.value}"]`)?.scrollIntoView({block:"nearest"})})}function c(d){if(g.value.length===0){i.value=-1;return}if(i.value<0){i.value=0,N();return}i.value=(i.value+d+g.value.length)%g.value.length,N()}function T(d){s("navigateTo",d.target,d.pluginName),s("close")}function I(d){switch(d.key){case"ArrowDown":d.preventDefault(),c(1);break;case"ArrowUp":d.preventDefault(),c(-1);break;case"Home":d.preventDefault(),i.value=g.value.length>0?0:-1,N();break;case"End":d.preventDefault(),i.value=g.value.length-1,N();break;case"Enter":{const h=g.value[i.value];if(!h)return;d.preventDefault(),T(h);break}case"Escape":d.preventDefault(),s("close");break;default:break}}return Y(()=>t.isOpen,async d=>{if(d){v=document.activeElement instanceof HTMLElement?document.activeElement:null,n.value="",i.value=0,await Z(),r.value?.focus();return}n.value="",i.value=0,v?.focus?.(),v=null}),Y(g,d=>{i.value=d.length>0?0:-1},{immediate:!0}),ne(()=>{v=null}),(d,h)=>(f(),me(xe,{to:"body"},[e.isOpen?(f(),b("div",{key:0,class:"command-palette",role:"dialog","aria-modal":"true","aria-label":"全局跳转",onClick:h[3]||(h[3]=P=>s("close"))},[a("div",{class:"command-panel",onClick:h[2]||(h[2]=z(()=>{},["stop"]))},[a("header",ia,[h[5]||(h[5]=a("div",null,[a("p",{class:"command-eyebrow"},"Global Jump"),a("h2",null,"页面、插件、最近访问都在这里")],-1)),a("button",{type:"button",class:"command-close","aria-label":"关闭全局跳转",onClick:h[0]||(h[0]=P=>s("close"))},[...h[4]||(h[4]=[a("span",{class:"material-symbols-outlined"},"close",-1)])])]),a("label",sa,[h[6]||(h[6]=a("span",{class:"material-symbols-outlined"},"search",-1)),te(a("input",{ref_key:"searchInputRef",ref:r,"onUpdate:modelValue":h[1]||(h[1]=P=>n.value=P),type:"search",placeholder:"搜索页面、插件、最近访问...","aria-label":"搜索页面、插件、最近访问","aria-controls":"global-command-results","aria-activedescendant":w.value,autocomplete:"off",onKeydown:I},null,40,la),[[Te,n.value]])]),h[8]||(h[8]=a("div",{class:"command-hints"},[a("span",null,"↑ ↓ 选择"),a("span",null,"Enter 打开"),a("span",null,"Esc 关闭")],-1)),_.value.length===0?(f(),b("section",oa,[...h[7]||(h[7]=[a("span",{class:"material-symbols-outlined"},"travel_explore",-1),a("h3",null,"没有匹配的结果",-1),a("p",null,"换个关键词试试,或者直接打开插件中心继续找。",-1)])])):(f(),b("div",ra,[(f(!0),b(A,null,G(S.value,P=>(f(),b("section",{key:P.id,class:"command-section"},[a("header",da,[a("span",null,$(P.title),1),a("span",null,$(P.items.length),1)]),(f(!0),b(A,null,G(P.items,u=>(f(),b("button",{id:y(u.index),key:u.id,type:"button",class:x(["command-item",{active:u.index===i.value}]),role:"option","aria-selected":u.index===i.value,"data-command-index":u.index,onMouseenter:C=>i.value=u.index,onClick:C=>T(u)},[a("span",ca,$(u.icon),1),a("span",va,[a("span",ma,[a("strong",null,$(u.label),1),a("span",pa,$(o[u.kind]),1)]),a("span",ga,$(u.subtitle),1)]),a("span",fa,[(f(!0),b(A,null,G(u.badges.slice(0,2),C=>(f(),b("span",{key:`${u.id}-${C}`,class:"command-badge"},$(C),1))),128))])],42,ua))),128))]))),128))]))])])):O("",!0)]))}}),ya=D(ba,[["__scopeId","data-v-9d37fd4a"]]),ha={class:"top-bar"},Sa={class:"top-bar-content"},Ca={class:"top-bar-left"},Ma=["aria-expanded"],ka=["title"],_a={class:"material-symbols-outlined","aria-hidden":"true"},wa={class:"header-actions"},Na=["aria-label","title"],$a={key:0,class:"notification-badge"},xa=["aria-expanded"],Ta={class:"dropdown-menu system-dropdown"},Ea={class:"material-symbols-outlined"},Ia={class:"material-symbols-outlined"},Pa=["aria-expanded"],La=U({__name:"TopBar",props:{isMobileMenuOpen:{type:Boolean},isSidebarCollapsed:{type:Boolean},isSystemMenuOpen:{type:Boolean},isUserMenuOpen:{type:Boolean},hasNotifications:{type:Boolean}},emits:["toggleMobileMenu","toggleSidebarCollapse","toggleSystemMenu","toggleUserMenu","closeAllMenus"],setup(e,{emit:l}){const t=l,s=ie(),o=K(),r=He(),n=k(()=>o.theme),i=k(()=>o.animationsEnabled),v=fe("TopBar");function m(){t("toggleMobileMenu")}function _(){t("toggleSidebarCollapse")}function S(){t("toggleSystemMenu")}function g(){t("toggleUserMenu")}function w(){o.setTheme(n.value==="dark"?"light":"dark"),t("closeAllMenus")}function y(){o.toggleAnimations(),t("closeAllMenus")}async function N(){if(confirm("您确定要重启服务器吗?")){try{ae("正在发送重启服务器命令...","info"),ae((await de.restartServer())?.message||"服务器重启命令已发送。请稍后检查服务器状态。","success",5e3)}catch(I){v.error("Restart server failed:",I)}t("closeAllMenus")}}async function c(){if(confirm("确定要退出登录吗?")){try{await de.logout(),r.logout(),s.push({name:"Login"})}catch(I){v.error("Logout failed:",I)}t("closeAllMenus")}}function T(){s.push({name:"Dashboard"})}return(I,d)=>(f(),b("header",ha,[a("div",Sa,[a("div",Ca,[a("button",{id:"mobile-menu-toggle",class:"mobile-menu-toggle",onClick:m,"aria-label":"切换导航菜单","aria-expanded":e.isMobileMenuOpen},[...d[0]||(d[0]=[a("span",{class:"material-symbols-outlined","aria-hidden":"true"},"menu",-1)])],8,Ma),a("button",{class:"sidebar-collapse-toggle",onClick:_,"aria-label":"折叠侧边栏",title:e.isSidebarCollapsed?"展开侧边栏":"折叠侧边栏"},[a("span",_a,$(e.isSidebarCollapsed?"chevron_right":"chevron_left"),1)],8,ka),a("button",{type:"button",class:"brand",onClick:T,"aria-label":"返回仪表盘"},[...d[1]||(d[1]=[a("span",{class:"server-title"},"VCPToolBox",-1)])])]),a("div",wa,[a("button",{class:"icon-button notification-btn","aria-label":e.hasNotifications?"系统通知(有新通知)":"系统通知",title:e.hasNotifications?"有新通知":"系统通知"},[d[2]||(d[2]=a("span",{class:"material-symbols-outlined","aria-hidden":"true"},"notifications",-1)),e.hasNotifications?(f(),b("span",$a)):O("",!0)],8,Na),a("div",{class:x(["dropdown",{"dropdown-open":e.isSystemMenuOpen}])},[a("button",{class:"icon-button system-menu-btn",onClick:S,"aria-label":"系统菜单","aria-haspopup":"true","aria-expanded":e.isSystemMenuOpen},[...d[3]||(d[3]=[a("span",{class:"material-symbols-outlined","aria-hidden":"true"},"settings",-1)])],8,xa),a("div",Ta,[d[5]||(d[5]=a("div",{class:"dropdown-header"},"系统控制",-1)),a("button",{onClick:y,class:"dropdown-item"},[a("span",Ea,$(i.value?"animation":"toggle_off"),1),a("span",null,$(i.value?"关闭动画":"开启动画"),1)]),a("button",{onClick:w,class:"dropdown-item"},[a("span",Ia,$(n.value==="dark"?"light_mode":"dark_mode"),1),a("span",null,$(n.value==="dark"?"切换亮色":"切换暗色"),1)]),d[6]||(d[6]=a("div",{class:"dropdown-divider"},null,-1)),a("button",{onClick:N,class:"dropdown-item danger"},[...d[4]||(d[4]=[a("span",{class:"material-symbols-outlined"},"restart_alt",-1),a("span",null,"重启服务器",-1)])])])],2),a("div",{class:x(["dropdown",{"dropdown-open":e.isUserMenuOpen}])},[a("button",{class:"user-avatar-btn",onClick:g,"aria-label":"用户菜单","aria-haspopup":"true","aria-expanded":e.isUserMenuOpen},[...d[7]||(d[7]=[a("span",{class:"material-symbols-outlined"},"account_circle",-1)])],8,Pa),a("div",{class:"dropdown-menu user-dropdown"},[d[9]||(d[9]=a("div",{class:"dropdown-header"},[a("span",{class:"material-symbols-outlined"},"admin_panel_settings"),a("span",null,"管理员")],-1)),d[10]||(d[10]=a("div",{class:"dropdown-divider"},null,-1)),a("button",{onClick:c,class:"dropdown-item danger"},[...d[8]||(d[8]=[a("span",{class:"material-symbols-outlined"},"logout",-1),a("span",null,"退出登录",-1)])])])],2)])])]))}}),Ha=D(La,[["__scopeId","data-v-cd17a51b"]]),Ba=["placeholder","value"],Va=U({__name:"SidebarSearch",props:{isExpandedState:{type:Boolean},isSidebarCollapsed:{type:Boolean},isHoveringSidebar:{type:Boolean},searchQuery:{}},emits:["update:searchQuery","openCommandPalette"],setup(e,{expose:l,emit:t}){const s=t,o=E(null);function r(i){const v=i.target.value;s("update:searchQuery",v)}function n(){o.value?.focus()}return l({focusInput:n}),(i,v)=>(f(),b("div",{class:x(["sidebar-header",{"sidebar-collapsed":e.isSidebarCollapsed&&!e.isHoveringSidebar}])},[a("h1",{class:x({"fade-label-hidden":!e.isExpandedState})},"控制中心",2),a("div",{class:x(["search-wrapper",{"search-expanded":!e.isSidebarCollapsed||e.isHoveringSidebar}])},[v[3]||(v[3]=a("span",{class:"material-symbols-outlined search-icon"},"search",-1)),a("input",{id:"sidebar-search",ref_key:"searchInputRef",ref:o,type:"search",placeholder:e.isSidebarCollapsed&&!e.isHoveringSidebar?"":"筛选侧栏入口...",value:e.searchQuery,"aria-label":"筛选侧栏入口",autocomplete:"off",onInput:r,onKeydown:[v[0]||(v[0]=re(z(m=>s("openCommandPalette"),["ctrl","prevent"]),["k"])),v[1]||(v[1]=re(z(m=>s("openCommandPalette"),["meta","prevent"]),["k"]))]},null,40,Ba),a("button",{type:"button",class:x(["search-shortcut",{"fade-label-hidden":!e.isExpandedState}]),title:"打开全局跳转",onClick:v[2]||(v[2]=m=>s("openCommandPalette"))}," Ctrl+K ",2)],2)],2))}}),Ra=D(Va,[["__scopeId","data-v-3edce3d9"]]),Aa=["aria-expanded"],Da={class:"material-symbols-outlined recent-chevron"},Ua={class:"recent-nav"},Oa=["title","onClick"],za={class:"material-symbols-outlined"},Ga={class:"recent-label"},Fa=U({__name:"SidebarRecentVisits",props:{recentVisits:{},isSidebarCollapsed:{type:Boolean},isHoveringSidebar:{type:Boolean},isRecentVisitsCollapsed:{type:Boolean}},emits:["toggleRecent","navigateTo"],setup(e){return(l,t)=>e.recentVisits.length>0&&(!e.isSidebarCollapsed||e.isHoveringSidebar)?(f(),b("div",{key:0,class:x(["recent-visits",{"sidebar-collapsed":e.isSidebarCollapsed&&!e.isHoveringSidebar}])},[a("button",{type:"button",class:x(["recent-header recent-toggle",{"fade-label-hidden":e.isSidebarCollapsed&&!e.isHoveringSidebar}]),"aria-expanded":!e.isRecentVisitsCollapsed,onClick:t[0]||(t[0]=s=>l.$emit("toggleRecent"))},[t[1]||(t[1]=a("span",{class:"recent-title"},[a("span",{class:"material-symbols-outlined"},"history"),a("span",null,"最近访问")],-1)),a("span",Da,$(e.isRecentVisitsCollapsed?"expand_more":"expand_less"),1)],10,Aa),te(a("nav",Ua,[(f(!0),b(A,null,G(e.recentVisits,s=>(f(),b("a",{key:`${s.target}-${s.pluginName||""}`,href:"#",class:x(["recent-item",{"sidebar-collapsed":e.isSidebarCollapsed&&!e.isHoveringSidebar}]),title:s.label,onClick:z(o=>l.$emit("navigateTo",s.target,s.pluginName),["prevent"])},[a("span",za,$(s.icon||"extension"),1),a("span",Ga,$(s.label),1)],10,Oa))),128))],512),[[pe,!e.isRecentVisitsCollapsed&&!e.isSidebarCollapsed||e.isHoveringSidebar]])],2)):O("",!0)}}),Ka=D(Fa,[["__scopeId","data-v-decad60e"]]),Qa={key:1},qa=["data-target","title","onClick"],ja={class:"material-symbols-outlined"},Ya={class:"nav-label"},Wa={key:0,class:"plugin-original-name"},Xa={key:1,class:"plugin-disabled-badge"},Ja={key:1},Za={key:1},et=["data-target","title","onClick"],at={class:"material-symbols-outlined"},tt={class:"nav-label"},nt={key:0,class:"plugin-original-name"},it={key:1,class:"plugin-disabled-badge"},st=U({__name:"SidebarNavList",props:{filteredNavItems:{},isExpandedState:{type:Boolean},isSidebarCollapsed:{type:Boolean},isHoveringSidebar:{type:Boolean},isActiveRoute:{type:Function}},emits:["navigateTo"],setup(e){const l=e,t=k(()=>l.filteredNavItems.length>80&&l.filteredNavItems.every(y=>!y.category)),s=k(()=>l.filteredNavItems.length>200?14:8),o=E(null),r=E(560);function n(){const y=o.value?.clientHeight??560;r.value=Math.max(280,y)}const{onScroll:i,setScrollTop:v,visibleItems:m,totalHeight:_,offsetY:S}=Oe(k(()=>(t.value,l.filteredNavItems)),{itemHeight:56,containerHeight:k(()=>r.value),overscan:k(()=>s.value)});function g(y){const N=y.target,c=Math.max(0,N.scrollHeight-N.clientHeight);N.scrollTop>c&&(N.scrollTop=c),i(y)}const w=k(()=>t.value?m.value.map(y=>y.item):l.filteredNavItems);return ve(()=>{n(),window.addEventListener("resize",n)}),Y(()=>l.filteredNavItems.length,()=>{if(!t.value||!o.value)return;const y=Math.max(0,_.value-r.value),N=Math.min(o.value.scrollTop,y);o.value.scrollTop=N,v(N)}),ne(()=>{window.removeEventListener("resize",n)}),(y,N)=>(f(),b("nav",{id:"plugin-nav",ref_key:"navRef",ref:o,onScroll:g},[t.value?(f(),b("div",{key:0,style:ee({height:`${p(_)}px`,position:"relative"})},[a("ul",{style:ee({transform:`translateY(${p(S)}px)`})},[(f(!0),b(A,null,G(w.value,c=>(f(),b(A,{key:c.category?`category-${c.category}`:`nav-${c.target||c.pluginName||c.label}`},[c.category?(f(),b("li",{key:0,class:x(["nav-category",{"fade-label-hidden":!e.isExpandedState}])},$(c.category),3)):(f(),b("li",Qa,[a("a",{href:"#","data-target":c.target,class:x({active:e.isActiveRoute(c.target,c.pluginName),"sidebar-collapsed":e.isSidebarCollapsed&&!e.isHoveringSidebar}),title:e.isSidebarCollapsed&&!e.isHoveringSidebar?c.label:"",onClick:z(T=>y.$emit("navigateTo",c.target,c.pluginName),["prevent"])},[a("span",ja,$(c.icon||"extension"),1),a("span",Ya,[le($(c.label)+" ",1),c.pluginName?(f(),b("span",Wa," ("+$(c.pluginName)+") ",1)):O("",!0),!c.enabled&&c.pluginName?(f(),b("span",Xa," (已禁用) ")):O("",!0)])],10,qa)]))],64))),128))],4)],4)):(f(),b("ul",Ja,[(f(!0),b(A,null,G(w.value,c=>(f(),b(A,{key:c.category?`category-${c.category}`:`nav-${c.target||c.pluginName||c.label}`},[c.category?(f(),b("li",{key:0,class:x(["nav-category",{"fade-label-hidden":!e.isExpandedState}])},$(c.category),3)):(f(),b("li",Za,[a("a",{href:"#","data-target":c.target,class:x({active:e.isActiveRoute(c.target,c.pluginName),"sidebar-collapsed":e.isSidebarCollapsed&&!e.isHoveringSidebar}),title:e.isSidebarCollapsed&&!e.isHoveringSidebar?c.label:"",onClick:z(T=>y.$emit("navigateTo",c.target,c.pluginName),["prevent"])},[a("span",at,$(c.icon||"extension"),1),a("span",tt,[le($(c.label)+" ",1),c.pluginName?(f(),b("span",nt," ("+$(c.pluginName)+") ",1)):O("",!0),!c.enabled&&c.pluginName?(f(),b("span",it," (已禁用) ")):O("",!0)])],10,et)]))],64))),128))]))],544))}}),lt=D(st,[["__scopeId","data-v-acdd00fb"]]),ot=U({__name:"Sidebar",props:{isMobileMenuOpen:{type:Boolean},isSidebarCollapsed:{type:Boolean},isHoveringSidebar:{type:Boolean},isHoverEnabled:{type:Boolean},recentVisits:{}},emits:["navigateTo","update:isHoveringSidebar","openCommandPalette"],setup(e,{expose:l,emit:t}){const s=e,o=t,r=se(),n=K(),i=k(()=>n.navItems),v=k(()=>n.plugins),m=k(()=>!s.isSidebarCollapsed||s.isHoveringSidebar),_=E(""),S=Ve("sidebarRecentCollapsed",!1),g=k(()=>{const u=_.value.toLowerCase().trim();if(!u)return T(i.value);const C=w(i.value,u),M=N(u);return M.length===0?C:[...C,...M]});function w(u,C){const M=[];let H=null;for(const B of u){if(B.category){H=B;continue}B.label?.toLowerCase().includes(C)&&(H&&(M.push(H),H=null),M.push(B))}return M}function y(u,C){const M=n.getPluginDisplayName(u.manifest.name).toLowerCase(),H=u.manifest.name.toLowerCase(),B=u.manifest.description?.toLowerCase()||"";return M.includes(C)||H.includes(C)||B.includes(C)}function N(u){const C=[...v.value].filter(M=>y(M,u)).sort((M,H)=>{const B=Number(n.isPluginPinned(H.manifest.name))-Number(n.isPluginPinned(M.manifest.name));return B!==0?B:n.getPluginDisplayName(M.manifest.name).localeCompare(n.getPluginDisplayName(H.manifest.name),"zh-CN",{sensitivity:"base"})}).slice(0,8).map(M=>({target:`plugin-${M.manifest.name}-config`,label:n.getPluginDisplayName(M.manifest.name),icon:M.manifest.icon||"extension",pluginName:M.manifest.name,enabled:M.enabled}));return C.length===0?[]:[{category:"———— 插 件 搜 索 ————"},...C]}function c(){return n.pinnedPlugins.length===0?[]:[{category:"固定插件"},...n.pinnedPlugins.map(u=>({target:`plugin-${u.manifest.name}-config`,label:n.getPluginDisplayName(u.manifest.name),icon:u.manifest.icon||"extension",pluginName:u.manifest.name,enabled:u.enabled}))]}function T(u){return[...u,...c()]}function I(u,C){u&&o("navigateTo",u,C)}function d(u,C){if(!u)return!1;if(C)return r.name==="PluginConfig"&&String(r.params.pluginName||"")===C;const M=Ie(r.path);return u==="dashboard"?M==="/"||M==="/dashboard":M===`/${u}`}function h(u){s.isHoverEnabled&&o("update:isHoveringSidebar",u)}function P(){S.value=!S.value}return l({filteredNavItems:g}),(u,C)=>(f(),b("aside",{class:x(["sidebar",{"mobile-active":e.isMobileMenuOpen,collapsed:e.isSidebarCollapsed,hovering:e.isHoveringSidebar}]),"aria-label":"主导航侧边栏",onMouseenter:C[2]||(C[2]=M=>h(!0)),onMouseleave:C[3]||(C[3]=M=>h(!1))},[V(Ra,{"is-expanded-state":m.value,"is-sidebar-collapsed":e.isSidebarCollapsed,"is-hovering-sidebar":e.isHoveringSidebar,"search-query":_.value,"onUpdate:searchQuery":C[0]||(C[0]=M=>_.value=M),onOpenCommandPalette:C[1]||(C[1]=M=>o("openCommandPalette"))},null,8,["is-expanded-state","is-sidebar-collapsed","is-hovering-sidebar","search-query"]),V(Ka,{"recent-visits":e.recentVisits,"is-sidebar-collapsed":e.isSidebarCollapsed,"is-hovering-sidebar":e.isHoveringSidebar,"is-recent-visits-collapsed":p(S),onToggleRecent:P,onNavigateTo:I},null,8,["recent-visits","is-sidebar-collapsed","is-hovering-sidebar","is-recent-visits-collapsed"]),V(lt,{"filtered-nav-items":g.value,"is-expanded-state":m.value,"is-sidebar-collapsed":e.isSidebarCollapsed,"is-hovering-sidebar":e.isHoveringSidebar,"is-active-route":d,onNavigateTo:I},null,8,["filtered-nav-items","is-expanded-state","is-sidebar-collapsed","is-hovering-sidebar"])],34))}}),rt=D(ot,[["__scopeId","data-v-01c5532e"]]),dt={class:"breadcrumb","aria-label":"面包屑导航"},ut={key:0},ct=["onClick"],vt={key:1,class:"breadcrumb-current","aria-current":"page"},mt=U({__name:"Breadcrumb",setup(e){const l=ie(),t=se(),s=K(),o=k(()=>s.navItems),r=k(()=>s.plugins),n=k(()=>ge(t,{navItems:o.value,plugins:r.value})),i=k(()=>{const g=Pe(t.name);if(g&&"navGroup"in g)return g.navGroup}),v={core:"核心功能",agent:"Agent 相关",tools:"工具相关",rag:"RAG 相关",plugins:"插件中心",other:"其他"},m=k(()=>{const g=[];if(i.value){const w=v[i.value];g.push({title:w,route:{name:"Dashboard"}})}return n.value&&g.push({title:n.value,route:t.fullPath}),g});function _(){l.push({name:"Dashboard"})}function S(g){l.push(g)}return(g,w)=>(f(),b("nav",dt,[a("ol",null,[a("li",null,[a("a",{href:"#",onClick:z(_,["prevent"]),"aria-label":"返回首页"},[...w[0]||(w[0]=[a("span",{class:"material-symbols-outlined"},"home",-1)])])]),(f(!0),b(A,null,G(m.value,(y,N)=>(f(),b(A,{key:y.title},[w[1]||(w[1]=a("li",{class:"breadcrumb-separator"},[a("span",{class:"material-symbols-outlined"},"chevron_right")],-1)),NS(y.route),["prevent"])},$(y.title),9,ct)])):(f(),b("li",vt,$(y.title),1))],64))),128))])]))}}),pt=D(mt,[["__scopeId","data-v-e735cd73"]]);function gt(){const e=K(),l=E(!1),t=k(()=>e.isImmersiveMode),s=E(!1),o=E(!1),r=E(!1),n=E(!1),i=E(!1),v=E(!1),m=E(!1);function _(){n.value=!0,w(),T()}function S(){n.value=!1}function g(){l.value=!l.value}function w(){l.value=!1}function y(){s.value=!s.value,s.value||(r.value=!1)}function N(){i.value=!i.value,v.value=!1}function c(){v.value=!v.value,i.value=!1}function T(){i.value=!1,v.value=!1}function I(){S(),w(),T()}function d(){e.enterImmersiveMode()}function h(){e.exitImmersiveMode()}return{isMobileMenuOpen:l,isImmersiveMode:t,isSidebarCollapsed:s,isHoveringSidebar:o,isHoverEnabled:r,isCommandPaletteOpen:n,isSystemMenuOpen:i,isUserMenuOpen:v,hasNotifications:m,openCommandPalette:_,closeCommandPalette:S,toggleMobileMenu:g,closeMobileMenu:w,toggleSidebarCollapse:y,toggleSystemMenu:N,toggleUserMenu:c,closeAllMenus:T,closeTransientUi:I,enterImmersiveMode:d,exitImmersiveMode:h}}var ft=fe("MainLayout"),ce="(max-width: 768px)";function bt({route:e,appStore:l,contentRef:t,controls:s}){const o=E(!1);let r="",n=null,i=null,v=0,m=null;function _(){t.value&&t.value.scrollTo({top:0,behavior:"smooth"})}function S(){o.value=(t.value?.scrollTop||0)>300}function g(){m!==null&&(globalThis.clearTimeout(m),m=null)}function w(){if(typeof document>"u"||typeof window>"u")return;const u=Math.round(window.visualViewport?.height??window.innerHeight);document.documentElement.style.setProperty("--app-viewport-height",`${u}px`)}function y(){w(),!(typeof window>"u")&&(window.matchMedia(ce).matches||s.closeMobileMenu())}function N(u){typeof document>"u"||document.documentElement.classList.toggle("ui-hidden-immersive",u)}function c(){if(v+=1,v===1){m=window.setTimeout(()=>{v=0,m=null},3e3);return}v>=5&&(v=0,g(),s.enterImmersiveMode())}function T(u){u.target.closest(".dropdown")||s.closeAllMenus()}function I(u){if((u.ctrlKey||u.metaKey)&&u.key==="k"){u.preventDefault(),s.openCommandPalette();return}if(u.key==="Escape"){if(s.isCommandPaletteOpen.value){s.closeCommandPalette();return}s.isImmersiveMode.value&&s.exitImmersiveMode(),s.closeAllMenus(),s.closeMobileMenu()}}function d(){y()}async function h(){try{await l.ensurePluginsLoaded()}catch(u){ft.error("Failed to load plugin navigation:",u),ae("Plugin list failed to load; using default navigation.","warning")}}async function P(){typeof document>"u"||(r=document.body.style.overflow,document.body.style.overflow="hidden",document.addEventListener("click",T),document.addEventListener("keydown",I),window.addEventListener("resize",d),window.visualViewport?.addEventListener("resize",d),i=window.matchMedia(ce),typeof i.addEventListener=="function"?i.addEventListener("change",d):i.addListener(d),await Z(),t.value?.addEventListener("scroll",S,{passive:!0}),n=document.querySelector(".brand"),n?.addEventListener("click",c),S(),y(),N(s.isImmersiveMode.value))}return Y(()=>e.fullPath,()=>{s.closeTransientUi(),t.value&&(t.value.scrollTop=0),o.value=!1}),Y(s.isImmersiveMode,u=>{N(u)}),ve(()=>{h(),P()}),ne(()=>{t.value?.removeEventListener("scroll",S),typeof document<"u"&&(document.removeEventListener("click",T),document.removeEventListener("keydown",I),document.body.style.overflow=r,N(!1)),typeof window<"u"&&(window.removeEventListener("resize",d),window.visualViewport?.removeEventListener("resize",d)),i&&(typeof i.removeEventListener=="function"?i.removeEventListener("change",d):i.removeListener(d),i=null),n?.removeEventListener("click",c),n=null,v=0,g()}),{showBackToTop:o,scrollToTop:_}}function yt({router:e,route:l,appStore:t,closeTransientUi:s}){const o=Re(),r=De(),n=k(()=>ge(l,{navItems:t.navItems,plugins:t.plugins})||"Dashboard");function i(v,m){const _=Ae({target:v,navItems:t.navItems,plugins:t.plugins,recentVisits:o.value,navigationUsage:r.value,pluginName:m});o.value=_.recentVisits,r.value=_.navigationUsage,e.push(Ee(v,m)),s()}return{currentPageTitle:n,recentVisits:o,navigationUsage:r,navigateTo:i}}function ht(){const e=ie(),l=se(),t=K(),s=gt(),o=E(null),r=yt({router:e,route:l,appStore:t,closeTransientUi:s.closeTransientUi}),n=bt({route:l,appStore:t,contentRef:o,controls:s});return{...s,...r,...n,contentRef:o}}var St={class:"immersive-fade immersive-fade--topbar"},Ct={class:"container"},Mt={class:"immersive-fade immersive-fade--sidebar"},kt={class:"unified-page-header"},_t=U({__name:"MainLayout",setup(e){const l=K(),{isMobileMenuOpen:t,isImmersiveMode:s,isSidebarCollapsed:o,isHoveringSidebar:r,isHoverEnabled:n,isCommandPaletteOpen:i,isSystemMenuOpen:v,isUserMenuOpen:m,hasNotifications:_,showBackToTop:S,contentRef:g,recentVisits:w,navigationUsage:y,currentPageTitle:N,navigateTo:c,openCommandPalette:T,closeCommandPalette:I,toggleMobileMenu:d,closeMobileMenu:h,toggleSidebarCollapse:P,toggleSystemMenu:u,toggleUserMenu:C,closeAllMenus:M,exitImmersiveMode:H,scrollToTop:B}=ht(),Se=k(()=>l.navItems),Ce=k(()=>l.plugins),Me=k(()=>l.pinnedPluginNames);return(wt,L)=>{const ke=we("router-view");return f(),b("div",{class:x(["admin-layout",{"ui-hidden-immersive":p(s),"sidebar-collapsed":p(o)}])},[V(qe),a("div",St,[V(Ha,{"is-mobile-menu-open":p(t),"is-sidebar-collapsed":p(o),"is-system-menu-open":p(v),"is-user-menu-open":p(m),"has-notifications":p(_),onToggleMobileMenu:p(d),onToggleSidebarCollapse:p(P),onToggleSystemMenu:p(u),onToggleUserMenu:p(C),onCloseAllMenus:p(M)},null,8,["is-mobile-menu-open","is-sidebar-collapsed","is-system-menu-open","is-user-menu-open","has-notifications","onToggleMobileMenu","onToggleSidebarCollapse","onToggleSystemMenu","onToggleUserMenu","onCloseAllMenus"])]),a("div",Ct,[a("div",Mt,[V(rt,{"is-mobile-menu-open":p(t),"is-sidebar-collapsed":p(o),"is-hovering-sidebar":p(r),"is-hover-enabled":p(n),"recent-visits":p(w),onNavigateTo:p(c),onOpenCommandPalette:p(T),"onUpdate:isHoveringSidebar":L[0]||(L[0]=R=>r.value=R)},null,8,["is-mobile-menu-open","is-sidebar-collapsed","is-hovering-sidebar","is-hover-enabled","recent-visits","onNavigateTo","onOpenCommandPalette"])]),a("div",{class:x(["sidebar-overlay",{active:p(t)}]),onClick:L[1]||(L[1]=(...R)=>p(h)&&p(h)(...R))},null,2),a("main",{ref_key:"contentRef",ref:g,class:"content",id:"config-details-container"},[V(pt),a("section",kt,[a("h1",null,$(p(N)),1)]),te(a("button",{type:"button",onClick:L[2]||(L[2]=(...R)=>p(B)&&p(B)(...R)),class:"back-to-top-btn","aria-label":"返回顶部",title:"返回顶部"},[...L[5]||(L[5]=[a("span",{class:"material-symbols-outlined"},"keyboard_arrow_up",-1)])],512),[[pe,p(S)]]),V(ke,null,{default:J(({Component:R,route:_e})=>[V(oe,{name:"fade",mode:"out-in"},{default:J(()=>[(f(),me(Ne(R),{key:_e.fullPath}))]),_:2},1024)]),_:1})],512)]),V(Ke),V(oe,{name:"immersive-exit-btn"},{default:J(()=>[p(s)?(f(),b("button",{key:0,id:"exit-immersive-button",class:"exit-immersive-button",onClick:L[3]||(L[3]=(...R)=>p(H)&&p(H)(...R))},[...L[6]||(L[6]=[a("span",{class:"material-symbols-outlined"},"close_fullscreen",-1),a("span",null,"退出沉浸模式",-1)])])):O("",!0)]),_:1}),p(v)||p(m)?(f(),b("div",{key:0,class:"dropdown-backdrop",onClick:L[4]||(L[4]=(...R)=>p(M)&&p(M)(...R))})):O("",!0),V(ya,{"is-open":p(i),"nav-items":Se.value,plugins:Ce.value,"recent-visits":p(w),"navigation-usage":p(y),"pinned-plugin-names":Me.value,onClose:p(I),onNavigateTo:p(c)},null,8,["is-open","nav-items","plugins","recent-visits","navigation-usage","pinned-plugin-names","onClose","onNavigateTo"])],2)}}}),Ht=D(_t,[["__scopeId","data-v-5009b262"]]);export{Ht as default}; +import{Dt as $,E as Z,Et as ee,F as we,H as J,L as Ne,N as G,O as ve,Q as E,U as te,V as Y,a as A,at as p,c as k,d as O,f as b,g as V,h as le,j as f,k as ne,l as a,m as $e,n as D,o as xe,u as me,v as U,wt as x}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as Te,d as z,l as pe,n as oe,u as re}from"./dashboard-card-news-BnyB_dHU.js";import{A as de,G as ae,H as ge,P as fe,V as Ee,u as Ie,z as Pe}from"./dashboard-card-calendar-DWuV34Bn.js";import{i as ie,r as se}from"./vue-vendor-BUOVPpjf.js";import{i as Le,n as He,r as Be}from"./index-DavTYS7A.js";import{a as Ve,i as K}from"./dashboard-components-B8tHL6X6.js";import{i as Re,n as Ae,r as De,t as Ue}from"./useRecentVisits-Cv1J7k25.js";import{t as Oe}from"./useVirtualScroll-DdYyc53Y.js";var ze=["aria-hidden","aria-busy"],Ge=["aria-hidden"],Fe=U({__name:"FeedbackHost",setup(e){const l=Le,t=k(()=>Be.message);return(s,o)=>(f(),b(A,null,[a("div",{class:x(["loading-overlay",{visible:p(l)}]),role:"status","aria-live":"polite","aria-hidden":!p(l),"aria-busy":p(l)},[...o[0]||(o[0]=[a("div",{class:"spinner"},null,-1),a("p",null,"正在加载…",-1)])],10,ze),a("div",{class:x(["message-popup",[t.value.type,{show:t.value.visible}]]),role:"status","aria-live":"polite","aria-atomic":"true","aria-hidden":!t.value.visible},$(t.value.text),11,Ge)],64))}}),Ke=D(Fe,[["__scopeId","data-v-4c61e77f"]]),Qe=U({__name:"SolarSystemBg",setup(e){const l=K(),t=k(()=>l.animationsEnabled),s=k(()=>l.isImmersiveMode);return(o,r)=>(f(),b("div",{class:x(["solar-system-bg",{"immersive-mode":s.value}]),"aria-hidden":"true",style:ee({display:t.value?"":"none"})},[...r[0]||(r[0]=[$e('
',13)])],6))}}),qe=D(Qe,[["__scopeId","data-v-d13f1c26"]]);function j(e){return e.toLowerCase().trim()}function q(e){return e.manifest.name||e.name}function Q(e){return e.manifest.displayName?.trim()||q(e)}function W(e){return j(e.filter(Boolean).join(" "))}function X(e){return e.pluginName?`plugin:${e.pluginName}`:`page:${e.target}`}function F(e,l){return e.badges.includes(l)}function be(e){return e.map((l,t)=>({...l,priority:t}))}function je(e){let l=0;return e.flatMap(t=>{if(!t.target||!t.label||t.category||t.pluginName)return[];const s=t.target==="dashboard"?"控制台主页":"控制台页面";return[{id:`page:${t.target}`,kind:"page",label:t.label,subtitle:s,icon:t.icon||"arrow_outward",target:t.target,badges:[],priority:l++,searchText:W([t.label,t.target,s])}]})}function Ye(e,l){const t=new Set(l);return[...e].sort((s,o)=>{const r=q(s),n=q(o),i=Number(t.has(n))-Number(t.has(r));if(i!==0)return i;const v=Number(o.enabled)-Number(s.enabled);return v!==0?v:Q(s).localeCompare(Q(o),"zh-CN",{sensitivity:"base"})}).map((s,o)=>{const r=q(s),n=[...t.has(r)?["已固定"]:[],s.enabled?"已启用":"已禁用",...s.isDistributed?["分布式"]:[]],i=s.manifest.description?.trim()||r;return{id:`plugin:${r}`,kind:"plugin",label:Q(s),subtitle:i,icon:s.manifest.icon||"extension",target:`plugin-${r}-config`,pluginName:r,badges:n,priority:o,searchText:W([Q(s),r,i,...n])}})}function ue(e,l){return l[Ue(e.target,e.pluginName)]}function ye(e){return new Map(e.map((l,t)=>[X(l),t]))}function he(e,l,t,s){const o=ue(e,s),r=ue(l,s),n=(r?.count??0)-(o?.count??0);if(n!==0)return n;const i=t.get(X(e))??Number.MAX_SAFE_INTEGER,v=t.get(X(l))??Number.MAX_SAFE_INTEGER;if(i!==v)return i-v;const m=(r?.lastVisitedAt??0)-(o?.lastVisitedAt??0);return m!==0?m:e.priority-l.priority||e.label.localeCompare(l.label,"zh-CN",{sensitivity:"base"})}function We(e,l,t){const s=ye(l);return be([...e].sort((o,r)=>he(o,r,s,t)))}function Xe(e,l,t,s){const o=ye(l),r=new Map(s.map((n,i)=>[n,i]));return be([...e].sort((n,i)=>{const v=n.pluginName!==void 0?r.get(n.pluginName):void 0,m=i.pluginName!==void 0?r.get(i.pluginName):void 0,_=v!==void 0,S=m!==void 0;if(_!==S)return Number(S)-Number(_);if(_&&S&&v!==void 0&&m!==void 0&&v!==m)return v-m;const g=+!F(i,"已禁用")-+!F(n,"已禁用");return g!==0?g:he(n,i,o,t)}))}function Je(e,l,t,s){const o=new Map(l.filter(i=>!!(i.target&&i.label&&!i.category)).map(i=>[i.target,i])),r=new Map(t.map(i=>[q(i),i])),n=new Set(s);return e.flatMap((i,v)=>{if(i.pluginName){const S=r.get(i.pluginName);if(!S)return[];const g=q(S),w=["最近访问",...n.has(g)?["已固定"]:[],...S.isDistributed?["分布式"]:[]],y=S.manifest.description?.trim()||`插件 · ${g}`;return[{id:`recent:plugin:${g}`,kind:"recent",label:Q(S),subtitle:y,icon:S.manifest.icon||"extension",target:`plugin-${g}-config`,pluginName:g,badges:w,priority:v,searchText:W([Q(S),g,y,...w])}]}const m=o.get(i.target);if(!m?.label)return[];const _="最近访问的页面";return[{id:`recent:page:${m.target}`,kind:"recent",label:m.label,subtitle:_,icon:m.icon||i.icon||"arrow_outward",target:m.target,badges:["最近访问"],priority:v,searchText:W([m.label,m.target,_])}]})}function Ze(e,l){const t=j(l);if(!t)return 0;const s=t.split(/\s+/).filter(Boolean);if(!s.every(i=>e.searchText.includes(i)))return-1;const o=j(e.label),r=j(e.subtitle);let n=0;for(const i of s){if(o===i){n+=160;continue}if(o.startsWith(i)){n+=120;continue}if(o.includes(i)){n+=90;continue}if(r.startsWith(i)){n+=60;continue}if(r.includes(i)){n+=45;continue}n+=25}return e.kind==="recent"&&(n+=18),F(e,"已固定")&&(n+=10),F(e,"已启用")&&(n+=4),n}function ea(e,l,t){const s=l.filter(n=>F(n,"已固定")),o=l.filter(n=>!F(n,"已固定")&&!F(n,"已禁用")),r=[...s,...o].slice(0,6);return[{id:"recent",title:"最近访问",items:t.slice(0,5)},{id:"page",title:"常用页面",items:e.slice(0,6)},{id:"plugin-shortcuts",title:"插件捷径",items:r}].filter(n=>n.items.length>0)}function aa(e,l,t){const s=e.map(n=>({entry:n,score:Ze(n,l)})).filter(n=>n.score>=0).sort((n,i)=>i.score-n.score||n.entry.priority-i.entry.priority||n.entry.label.localeCompare(i.entry.label,"zh-CN",{sensitivity:"base"})),o=new Set,r=[];for(const n of s){const i=X(n.entry);if(!o.has(i)&&(o.add(i),r.push(n.entry),r.length>=t))break}return[{id:"recent",title:"最近访问",items:r.filter(n=>n.kind==="recent")},{id:"page",title:"页面",items:r.filter(n=>n.kind==="page")},{id:"plugin",title:"插件",items:r.filter(n=>n.kind==="plugin")}].filter(n=>n.items.length>0)}function ta({navItems:e,plugins:l,recentVisits:t,navigationUsage:s,pinnedPluginNames:o}){const r=Je(t,e,l,o),n=We(je(e),r,s),i=Xe(Ye(l,o),r,s,o);return{recentEntries:r,pageEntries:n,pluginEntries:i,allEntries:[...r,...n,...i]}}function na(e,{query:l,limit:t=12}){return j(l)?aa(e.allEntries,l,t):ea(e.pageEntries,e.pluginEntries,e.recentEntries)}var ia={class:"command-header"},sa={class:"command-search"},la=["aria-activedescendant"],oa={key:0,class:"command-empty","aria-live":"polite"},ra={key:1,id:"global-command-results",class:"command-results",role:"listbox"},da={class:"command-section-header"},ua=["id","aria-selected","data-command-index","onMouseenter","onClick"],ca={class:"command-item-icon material-symbols-outlined"},va={class:"command-item-copy"},ma={class:"command-item-topline"},pa={class:"command-kind"},ga={class:"command-item-subtitle"},fa={class:"command-item-badges"},ba=U({__name:"GlobalCommandPalette",props:{isOpen:{type:Boolean},navItems:{},plugins:{},recentVisits:{},navigationUsage:{},pinnedPluginNames:{}},emits:["close","navigateTo"],setup(e,{emit:l}){const t=e,s=l,o={recent:"最近",page:"页面",plugin:"插件"},r=E(null),n=E(""),i=E(0);let v=null;const m=k(()=>t.isOpen?ta({navItems:t.navItems,plugins:t.plugins,recentVisits:t.recentVisits,navigationUsage:t.navigationUsage,pinnedPluginNames:t.pinnedPluginNames}):null),_=k(()=>!t.isOpen||!m.value?[]:na(m.value,{query:n.value})),S=k(()=>{let d=0;return _.value.map(h=>({...h,items:h.items.map(P=>({...P,index:d++}))}))}),g=k(()=>S.value.flatMap(d=>d.items)),w=k(()=>g.value[i.value]?y(i.value):void 0);function y(d){return`command-palette-option-${d}`}function N(){Z(()=>{document.querySelector(`[data-command-index="${i.value}"]`)?.scrollIntoView({block:"nearest"})})}function c(d){if(g.value.length===0){i.value=-1;return}if(i.value<0){i.value=0,N();return}i.value=(i.value+d+g.value.length)%g.value.length,N()}function T(d){s("navigateTo",d.target,d.pluginName),s("close")}function I(d){switch(d.key){case"ArrowDown":d.preventDefault(),c(1);break;case"ArrowUp":d.preventDefault(),c(-1);break;case"Home":d.preventDefault(),i.value=g.value.length>0?0:-1,N();break;case"End":d.preventDefault(),i.value=g.value.length-1,N();break;case"Enter":{const h=g.value[i.value];if(!h)return;d.preventDefault(),T(h);break}case"Escape":d.preventDefault(),s("close");break;default:break}}return Y(()=>t.isOpen,async d=>{if(d){v=document.activeElement instanceof HTMLElement?document.activeElement:null,n.value="",i.value=0,await Z(),r.value?.focus();return}n.value="",i.value=0,v?.focus?.(),v=null}),Y(g,d=>{i.value=d.length>0?0:-1},{immediate:!0}),ne(()=>{v=null}),(d,h)=>(f(),me(xe,{to:"body"},[e.isOpen?(f(),b("div",{key:0,class:"command-palette",role:"dialog","aria-modal":"true","aria-label":"全局跳转",onClick:h[3]||(h[3]=P=>s("close"))},[a("div",{class:"command-panel",onClick:h[2]||(h[2]=z(()=>{},["stop"]))},[a("header",ia,[h[5]||(h[5]=a("div",null,[a("p",{class:"command-eyebrow"},"Global Jump"),a("h2",null,"页面、插件、最近访问都在这里")],-1)),a("button",{type:"button",class:"command-close","aria-label":"关闭全局跳转",onClick:h[0]||(h[0]=P=>s("close"))},[...h[4]||(h[4]=[a("span",{class:"material-symbols-outlined"},"close",-1)])])]),a("label",sa,[h[6]||(h[6]=a("span",{class:"material-symbols-outlined"},"search",-1)),te(a("input",{ref_key:"searchInputRef",ref:r,"onUpdate:modelValue":h[1]||(h[1]=P=>n.value=P),type:"search",placeholder:"搜索页面、插件、最近访问...","aria-label":"搜索页面、插件、最近访问","aria-controls":"global-command-results","aria-activedescendant":w.value,autocomplete:"off",onKeydown:I},null,40,la),[[Te,n.value]])]),h[8]||(h[8]=a("div",{class:"command-hints"},[a("span",null,"↑ ↓ 选择"),a("span",null,"Enter 打开"),a("span",null,"Esc 关闭")],-1)),_.value.length===0?(f(),b("section",oa,[...h[7]||(h[7]=[a("span",{class:"material-symbols-outlined"},"travel_explore",-1),a("h3",null,"没有匹配的结果",-1),a("p",null,"换个关键词试试,或者直接打开插件中心继续找。",-1)])])):(f(),b("div",ra,[(f(!0),b(A,null,G(S.value,P=>(f(),b("section",{key:P.id,class:"command-section"},[a("header",da,[a("span",null,$(P.title),1),a("span",null,$(P.items.length),1)]),(f(!0),b(A,null,G(P.items,u=>(f(),b("button",{id:y(u.index),key:u.id,type:"button",class:x(["command-item",{active:u.index===i.value}]),role:"option","aria-selected":u.index===i.value,"data-command-index":u.index,onMouseenter:C=>i.value=u.index,onClick:C=>T(u)},[a("span",ca,$(u.icon),1),a("span",va,[a("span",ma,[a("strong",null,$(u.label),1),a("span",pa,$(o[u.kind]),1)]),a("span",ga,$(u.subtitle),1)]),a("span",fa,[(f(!0),b(A,null,G(u.badges.slice(0,2),C=>(f(),b("span",{key:`${u.id}-${C}`,class:"command-badge"},$(C),1))),128))])],42,ua))),128))]))),128))]))])])):O("",!0)]))}}),ya=D(ba,[["__scopeId","data-v-9d37fd4a"]]),ha={class:"top-bar"},Sa={class:"top-bar-content"},Ca={class:"top-bar-left"},Ma=["aria-expanded"],ka=["title"],_a={class:"material-symbols-outlined","aria-hidden":"true"},wa={class:"header-actions"},Na=["aria-label","title"],$a={key:0,class:"notification-badge"},xa=["aria-expanded"],Ta={class:"dropdown-menu system-dropdown"},Ea={class:"material-symbols-outlined"},Ia={class:"material-symbols-outlined"},Pa=["aria-expanded"],La=U({__name:"TopBar",props:{isMobileMenuOpen:{type:Boolean},isSidebarCollapsed:{type:Boolean},isSystemMenuOpen:{type:Boolean},isUserMenuOpen:{type:Boolean},hasNotifications:{type:Boolean}},emits:["toggleMobileMenu","toggleSidebarCollapse","toggleSystemMenu","toggleUserMenu","closeAllMenus"],setup(e,{emit:l}){const t=l,s=ie(),o=K(),r=He(),n=k(()=>o.theme),i=k(()=>o.animationsEnabled),v=fe("TopBar");function m(){t("toggleMobileMenu")}function _(){t("toggleSidebarCollapse")}function S(){t("toggleSystemMenu")}function g(){t("toggleUserMenu")}function w(){o.setTheme(n.value==="dark"?"light":"dark"),t("closeAllMenus")}function y(){o.toggleAnimations(),t("closeAllMenus")}async function N(){if(confirm("您确定要重启服务器吗?")){try{ae("正在发送重启服务器命令...","info"),ae((await de.restartServer())?.message||"服务器重启命令已发送。请稍后检查服务器状态。","success",5e3)}catch(I){v.error("Restart server failed:",I)}t("closeAllMenus")}}async function c(){if(confirm("确定要退出登录吗?")){try{await de.logout(),r.logout(),s.push({name:"Login"})}catch(I){v.error("Logout failed:",I)}t("closeAllMenus")}}function T(){s.push({name:"Dashboard"})}return(I,d)=>(f(),b("header",ha,[a("div",Sa,[a("div",Ca,[a("button",{id:"mobile-menu-toggle",class:"mobile-menu-toggle",onClick:m,"aria-label":"切换导航菜单","aria-expanded":e.isMobileMenuOpen},[...d[0]||(d[0]=[a("span",{class:"material-symbols-outlined","aria-hidden":"true"},"menu",-1)])],8,Ma),a("button",{class:"sidebar-collapse-toggle",onClick:_,"aria-label":"折叠侧边栏",title:e.isSidebarCollapsed?"展开侧边栏":"折叠侧边栏"},[a("span",_a,$(e.isSidebarCollapsed?"chevron_right":"chevron_left"),1)],8,ka),a("button",{type:"button",class:"brand",onClick:T,"aria-label":"返回仪表盘"},[...d[1]||(d[1]=[a("span",{class:"server-title"},"VCPToolBox",-1)])])]),a("div",wa,[a("button",{class:"icon-button notification-btn","aria-label":e.hasNotifications?"系统通知(有新通知)":"系统通知",title:e.hasNotifications?"有新通知":"系统通知"},[d[2]||(d[2]=a("span",{class:"material-symbols-outlined","aria-hidden":"true"},"notifications",-1)),e.hasNotifications?(f(),b("span",$a)):O("",!0)],8,Na),a("div",{class:x(["dropdown",{"dropdown-open":e.isSystemMenuOpen}])},[a("button",{class:"icon-button system-menu-btn",onClick:S,"aria-label":"系统菜单","aria-haspopup":"true","aria-expanded":e.isSystemMenuOpen},[...d[3]||(d[3]=[a("span",{class:"material-symbols-outlined","aria-hidden":"true"},"settings",-1)])],8,xa),a("div",Ta,[d[5]||(d[5]=a("div",{class:"dropdown-header"},"系统控制",-1)),a("button",{onClick:y,class:"dropdown-item"},[a("span",Ea,$(i.value?"animation":"toggle_off"),1),a("span",null,$(i.value?"关闭动画":"开启动画"),1)]),a("button",{onClick:w,class:"dropdown-item"},[a("span",Ia,$(n.value==="dark"?"light_mode":"dark_mode"),1),a("span",null,$(n.value==="dark"?"切换亮色":"切换暗色"),1)]),d[6]||(d[6]=a("div",{class:"dropdown-divider"},null,-1)),a("button",{onClick:N,class:"dropdown-item danger"},[...d[4]||(d[4]=[a("span",{class:"material-symbols-outlined"},"restart_alt",-1),a("span",null,"重启服务器",-1)])])])],2),a("div",{class:x(["dropdown",{"dropdown-open":e.isUserMenuOpen}])},[a("button",{class:"user-avatar-btn",onClick:g,"aria-label":"用户菜单","aria-haspopup":"true","aria-expanded":e.isUserMenuOpen},[...d[7]||(d[7]=[a("span",{class:"material-symbols-outlined"},"account_circle",-1)])],8,Pa),a("div",{class:"dropdown-menu user-dropdown"},[d[9]||(d[9]=a("div",{class:"dropdown-header"},[a("span",{class:"material-symbols-outlined"},"admin_panel_settings"),a("span",null,"管理员")],-1)),d[10]||(d[10]=a("div",{class:"dropdown-divider"},null,-1)),a("button",{onClick:c,class:"dropdown-item danger"},[...d[8]||(d[8]=[a("span",{class:"material-symbols-outlined"},"logout",-1),a("span",null,"退出登录",-1)])])])],2)])])]))}}),Ha=D(La,[["__scopeId","data-v-cd17a51b"]]),Ba=["placeholder","value"],Va=U({__name:"SidebarSearch",props:{isExpandedState:{type:Boolean},isSidebarCollapsed:{type:Boolean},isHoveringSidebar:{type:Boolean},searchQuery:{}},emits:["update:searchQuery","openCommandPalette"],setup(e,{expose:l,emit:t}){const s=t,o=E(null);function r(i){const v=i.target.value;s("update:searchQuery",v)}function n(){o.value?.focus()}return l({focusInput:n}),(i,v)=>(f(),b("div",{class:x(["sidebar-header",{"sidebar-collapsed":e.isSidebarCollapsed&&!e.isHoveringSidebar}])},[a("h1",{class:x({"fade-label-hidden":!e.isExpandedState})},"控制中心",2),a("div",{class:x(["search-wrapper",{"search-expanded":!e.isSidebarCollapsed||e.isHoveringSidebar}])},[v[3]||(v[3]=a("span",{class:"material-symbols-outlined search-icon"},"search",-1)),a("input",{id:"sidebar-search",ref_key:"searchInputRef",ref:o,type:"search",placeholder:e.isSidebarCollapsed&&!e.isHoveringSidebar?"":"筛选侧栏入口...",value:e.searchQuery,"aria-label":"筛选侧栏入口",autocomplete:"off",onInput:r,onKeydown:[v[0]||(v[0]=re(z(m=>s("openCommandPalette"),["ctrl","prevent"]),["k"])),v[1]||(v[1]=re(z(m=>s("openCommandPalette"),["meta","prevent"]),["k"]))]},null,40,Ba),a("button",{type:"button",class:x(["search-shortcut",{"fade-label-hidden":!e.isExpandedState}]),title:"打开全局跳转",onClick:v[2]||(v[2]=m=>s("openCommandPalette"))}," Ctrl+K ",2)],2)],2))}}),Ra=D(Va,[["__scopeId","data-v-3edce3d9"]]),Aa=["aria-expanded"],Da={class:"material-symbols-outlined recent-chevron"},Ua={class:"recent-nav"},Oa=["title","onClick"],za={class:"material-symbols-outlined"},Ga={class:"recent-label"},Fa=U({__name:"SidebarRecentVisits",props:{recentVisits:{},isSidebarCollapsed:{type:Boolean},isHoveringSidebar:{type:Boolean},isRecentVisitsCollapsed:{type:Boolean}},emits:["toggleRecent","navigateTo"],setup(e){return(l,t)=>e.recentVisits.length>0&&(!e.isSidebarCollapsed||e.isHoveringSidebar)?(f(),b("div",{key:0,class:x(["recent-visits",{"sidebar-collapsed":e.isSidebarCollapsed&&!e.isHoveringSidebar}])},[a("button",{type:"button",class:x(["recent-header recent-toggle",{"fade-label-hidden":e.isSidebarCollapsed&&!e.isHoveringSidebar}]),"aria-expanded":!e.isRecentVisitsCollapsed,onClick:t[0]||(t[0]=s=>l.$emit("toggleRecent"))},[t[1]||(t[1]=a("span",{class:"recent-title"},[a("span",{class:"material-symbols-outlined"},"history"),a("span",null,"最近访问")],-1)),a("span",Da,$(e.isRecentVisitsCollapsed?"expand_more":"expand_less"),1)],10,Aa),te(a("nav",Ua,[(f(!0),b(A,null,G(e.recentVisits,s=>(f(),b("a",{key:`${s.target}-${s.pluginName||""}`,href:"#",class:x(["recent-item",{"sidebar-collapsed":e.isSidebarCollapsed&&!e.isHoveringSidebar}]),title:s.label,onClick:z(o=>l.$emit("navigateTo",s.target,s.pluginName),["prevent"])},[a("span",za,$(s.icon||"extension"),1),a("span",Ga,$(s.label),1)],10,Oa))),128))],512),[[pe,!e.isRecentVisitsCollapsed&&!e.isSidebarCollapsed||e.isHoveringSidebar]])],2)):O("",!0)}}),Ka=D(Fa,[["__scopeId","data-v-decad60e"]]),Qa={key:1},qa=["data-target","title","onClick"],ja={class:"material-symbols-outlined"},Ya={class:"nav-label"},Wa={key:0,class:"plugin-original-name"},Xa={key:1,class:"plugin-disabled-badge"},Ja={key:1},Za={key:1},et=["data-target","title","onClick"],at={class:"material-symbols-outlined"},tt={class:"nav-label"},nt={key:0,class:"plugin-original-name"},it={key:1,class:"plugin-disabled-badge"},st=U({__name:"SidebarNavList",props:{filteredNavItems:{},isExpandedState:{type:Boolean},isSidebarCollapsed:{type:Boolean},isHoveringSidebar:{type:Boolean},isActiveRoute:{type:Function}},emits:["navigateTo"],setup(e){const l=e,t=k(()=>l.filteredNavItems.length>80&&l.filteredNavItems.every(y=>!y.category)),s=k(()=>l.filteredNavItems.length>200?14:8),o=E(null),r=E(560);function n(){const y=o.value?.clientHeight??560;r.value=Math.max(280,y)}const{onScroll:i,setScrollTop:v,visibleItems:m,totalHeight:_,offsetY:S}=Oe(k(()=>(t.value,l.filteredNavItems)),{itemHeight:56,containerHeight:k(()=>r.value),overscan:k(()=>s.value)});function g(y){const N=y.target,c=Math.max(0,N.scrollHeight-N.clientHeight);N.scrollTop>c&&(N.scrollTop=c),i(y)}const w=k(()=>t.value?m.value.map(y=>y.item):l.filteredNavItems);return ve(()=>{n(),window.addEventListener("resize",n)}),Y(()=>l.filteredNavItems.length,()=>{if(!t.value||!o.value)return;const y=Math.max(0,_.value-r.value),N=Math.min(o.value.scrollTop,y);o.value.scrollTop=N,v(N)}),ne(()=>{window.removeEventListener("resize",n)}),(y,N)=>(f(),b("nav",{id:"plugin-nav",ref_key:"navRef",ref:o,onScroll:g},[t.value?(f(),b("div",{key:0,style:ee({height:`${p(_)}px`,position:"relative"})},[a("ul",{style:ee({transform:`translateY(${p(S)}px)`})},[(f(!0),b(A,null,G(w.value,c=>(f(),b(A,{key:c.category?`category-${c.category}`:`nav-${c.target||c.pluginName||c.label}`},[c.category?(f(),b("li",{key:0,class:x(["nav-category",{"fade-label-hidden":!e.isExpandedState}])},$(c.category),3)):(f(),b("li",Qa,[a("a",{href:"#","data-target":c.target,class:x({active:e.isActiveRoute(c.target,c.pluginName),"sidebar-collapsed":e.isSidebarCollapsed&&!e.isHoveringSidebar}),title:e.isSidebarCollapsed&&!e.isHoveringSidebar?c.label:"",onClick:z(T=>y.$emit("navigateTo",c.target,c.pluginName),["prevent"])},[a("span",ja,$(c.icon||"extension"),1),a("span",Ya,[le($(c.label)+" ",1),c.pluginName?(f(),b("span",Wa," ("+$(c.pluginName)+") ",1)):O("",!0),!c.enabled&&c.pluginName?(f(),b("span",Xa," (已禁用) ")):O("",!0)])],10,qa)]))],64))),128))],4)],4)):(f(),b("ul",Ja,[(f(!0),b(A,null,G(w.value,c=>(f(),b(A,{key:c.category?`category-${c.category}`:`nav-${c.target||c.pluginName||c.label}`},[c.category?(f(),b("li",{key:0,class:x(["nav-category",{"fade-label-hidden":!e.isExpandedState}])},$(c.category),3)):(f(),b("li",Za,[a("a",{href:"#","data-target":c.target,class:x({active:e.isActiveRoute(c.target,c.pluginName),"sidebar-collapsed":e.isSidebarCollapsed&&!e.isHoveringSidebar}),title:e.isSidebarCollapsed&&!e.isHoveringSidebar?c.label:"",onClick:z(T=>y.$emit("navigateTo",c.target,c.pluginName),["prevent"])},[a("span",at,$(c.icon||"extension"),1),a("span",tt,[le($(c.label)+" ",1),c.pluginName?(f(),b("span",nt," ("+$(c.pluginName)+") ",1)):O("",!0),!c.enabled&&c.pluginName?(f(),b("span",it," (已禁用) ")):O("",!0)])],10,et)]))],64))),128))]))],544))}}),lt=D(st,[["__scopeId","data-v-acdd00fb"]]),ot=U({__name:"Sidebar",props:{isMobileMenuOpen:{type:Boolean},isSidebarCollapsed:{type:Boolean},isHoveringSidebar:{type:Boolean},isHoverEnabled:{type:Boolean},recentVisits:{}},emits:["navigateTo","update:isHoveringSidebar","openCommandPalette"],setup(e,{expose:l,emit:t}){const s=e,o=t,r=se(),n=K(),i=k(()=>n.navItems),v=k(()=>n.plugins),m=k(()=>!s.isSidebarCollapsed||s.isHoveringSidebar),_=E(""),S=Ve("sidebarRecentCollapsed",!1),g=k(()=>{const u=_.value.toLowerCase().trim();if(!u)return T(i.value);const C=w(i.value,u),M=N(u);return M.length===0?C:[...C,...M]});function w(u,C){const M=[];let H=null;for(const B of u){if(B.category){H=B;continue}B.label?.toLowerCase().includes(C)&&(H&&(M.push(H),H=null),M.push(B))}return M}function y(u,C){const M=n.getPluginDisplayName(u.manifest.name).toLowerCase(),H=u.manifest.name.toLowerCase(),B=u.manifest.description?.toLowerCase()||"";return M.includes(C)||H.includes(C)||B.includes(C)}function N(u){const C=[...v.value].filter(M=>y(M,u)).sort((M,H)=>{const B=Number(n.isPluginPinned(H.manifest.name))-Number(n.isPluginPinned(M.manifest.name));return B!==0?B:n.getPluginDisplayName(M.manifest.name).localeCompare(n.getPluginDisplayName(H.manifest.name),"zh-CN",{sensitivity:"base"})}).slice(0,8).map(M=>({target:`plugin-${M.manifest.name}-config`,label:n.getPluginDisplayName(M.manifest.name),icon:M.manifest.icon||"extension",pluginName:M.manifest.name,enabled:M.enabled}));return C.length===0?[]:[{category:"———— 插 件 搜 索 ————"},...C]}function c(){return n.pinnedPlugins.length===0?[]:[{category:"固定插件"},...n.pinnedPlugins.map(u=>({target:`plugin-${u.manifest.name}-config`,label:n.getPluginDisplayName(u.manifest.name),icon:u.manifest.icon||"extension",pluginName:u.manifest.name,enabled:u.enabled}))]}function T(u){return[...u,...c()]}function I(u,C){u&&o("navigateTo",u,C)}function d(u,C){if(!u)return!1;if(C)return r.name==="PluginConfig"&&String(r.params.pluginName||"")===C;const M=Ie(r.path);return u==="dashboard"?M==="/"||M==="/dashboard":M===`/${u}`}function h(u){s.isHoverEnabled&&o("update:isHoveringSidebar",u)}function P(){S.value=!S.value}return l({filteredNavItems:g}),(u,C)=>(f(),b("aside",{class:x(["sidebar",{"mobile-active":e.isMobileMenuOpen,collapsed:e.isSidebarCollapsed,hovering:e.isHoveringSidebar}]),"aria-label":"主导航侧边栏",onMouseenter:C[2]||(C[2]=M=>h(!0)),onMouseleave:C[3]||(C[3]=M=>h(!1))},[V(Ra,{"is-expanded-state":m.value,"is-sidebar-collapsed":e.isSidebarCollapsed,"is-hovering-sidebar":e.isHoveringSidebar,"search-query":_.value,"onUpdate:searchQuery":C[0]||(C[0]=M=>_.value=M),onOpenCommandPalette:C[1]||(C[1]=M=>o("openCommandPalette"))},null,8,["is-expanded-state","is-sidebar-collapsed","is-hovering-sidebar","search-query"]),V(Ka,{"recent-visits":e.recentVisits,"is-sidebar-collapsed":e.isSidebarCollapsed,"is-hovering-sidebar":e.isHoveringSidebar,"is-recent-visits-collapsed":p(S),onToggleRecent:P,onNavigateTo:I},null,8,["recent-visits","is-sidebar-collapsed","is-hovering-sidebar","is-recent-visits-collapsed"]),V(lt,{"filtered-nav-items":g.value,"is-expanded-state":m.value,"is-sidebar-collapsed":e.isSidebarCollapsed,"is-hovering-sidebar":e.isHoveringSidebar,"is-active-route":d,onNavigateTo:I},null,8,["filtered-nav-items","is-expanded-state","is-sidebar-collapsed","is-hovering-sidebar"])],34))}}),rt=D(ot,[["__scopeId","data-v-01c5532e"]]),dt={class:"breadcrumb","aria-label":"面包屑导航"},ut={key:0},ct=["onClick"],vt={key:1,class:"breadcrumb-current","aria-current":"page"},mt=U({__name:"Breadcrumb",setup(e){const l=ie(),t=se(),s=K(),o=k(()=>s.navItems),r=k(()=>s.plugins),n=k(()=>ge(t,{navItems:o.value,plugins:r.value})),i=k(()=>{const g=Pe(t.name);if(g&&"navGroup"in g)return g.navGroup}),v={core:"核心功能",agent:"Agent 相关",tools:"工具相关",rag:"RAG 相关",plugins:"插件中心",other:"其他"},m=k(()=>{const g=[];if(i.value){const w=v[i.value];g.push({title:w,route:{name:"Dashboard"}})}return n.value&&g.push({title:n.value,route:t.fullPath}),g});function _(){l.push({name:"Dashboard"})}function S(g){l.push(g)}return(g,w)=>(f(),b("nav",dt,[a("ol",null,[a("li",null,[a("a",{href:"#",onClick:z(_,["prevent"]),"aria-label":"返回首页"},[...w[0]||(w[0]=[a("span",{class:"material-symbols-outlined"},"home",-1)])])]),(f(!0),b(A,null,G(m.value,(y,N)=>(f(),b(A,{key:y.title},[w[1]||(w[1]=a("li",{class:"breadcrumb-separator"},[a("span",{class:"material-symbols-outlined"},"chevron_right")],-1)),NS(y.route),["prevent"])},$(y.title),9,ct)])):(f(),b("li",vt,$(y.title),1))],64))),128))])]))}}),pt=D(mt,[["__scopeId","data-v-e735cd73"]]);function gt(){const e=K(),l=E(!1),t=k(()=>e.isImmersiveMode),s=E(!1),o=E(!1),r=E(!1),n=E(!1),i=E(!1),v=E(!1),m=E(!1);function _(){n.value=!0,w(),T()}function S(){n.value=!1}function g(){l.value=!l.value}function w(){l.value=!1}function y(){s.value=!s.value,s.value||(r.value=!1)}function N(){i.value=!i.value,v.value=!1}function c(){v.value=!v.value,i.value=!1}function T(){i.value=!1,v.value=!1}function I(){S(),w(),T()}function d(){e.enterImmersiveMode()}function h(){e.exitImmersiveMode()}return{isMobileMenuOpen:l,isImmersiveMode:t,isSidebarCollapsed:s,isHoveringSidebar:o,isHoverEnabled:r,isCommandPaletteOpen:n,isSystemMenuOpen:i,isUserMenuOpen:v,hasNotifications:m,openCommandPalette:_,closeCommandPalette:S,toggleMobileMenu:g,closeMobileMenu:w,toggleSidebarCollapse:y,toggleSystemMenu:N,toggleUserMenu:c,closeAllMenus:T,closeTransientUi:I,enterImmersiveMode:d,exitImmersiveMode:h}}var ft=fe("MainLayout"),ce="(max-width: 768px)";function bt({route:e,appStore:l,contentRef:t,controls:s}){const o=E(!1);let r="",n=null,i=null,v=0,m=null;function _(){t.value&&t.value.scrollTo({top:0,behavior:"smooth"})}function S(){o.value=(t.value?.scrollTop||0)>300}function g(){m!==null&&(globalThis.clearTimeout(m),m=null)}function w(){if(typeof document>"u"||typeof window>"u")return;const u=Math.round(window.visualViewport?.height??window.innerHeight);document.documentElement.style.setProperty("--app-viewport-height",`${u}px`)}function y(){w(),!(typeof window>"u")&&(window.matchMedia(ce).matches||s.closeMobileMenu())}function N(u){typeof document>"u"||document.documentElement.classList.toggle("ui-hidden-immersive",u)}function c(){if(v+=1,v===1){m=window.setTimeout(()=>{v=0,m=null},3e3);return}v>=5&&(v=0,g(),s.enterImmersiveMode())}function T(u){u.target.closest(".dropdown")||s.closeAllMenus()}function I(u){if((u.ctrlKey||u.metaKey)&&u.key==="k"){u.preventDefault(),s.openCommandPalette();return}if(u.key==="Escape"){if(s.isCommandPaletteOpen.value){s.closeCommandPalette();return}s.isImmersiveMode.value&&s.exitImmersiveMode(),s.closeAllMenus(),s.closeMobileMenu()}}function d(){y()}async function h(){try{await l.ensurePluginsLoaded()}catch(u){ft.error("Failed to load plugin navigation:",u),ae("Plugin list failed to load; using default navigation.","warning")}}async function P(){typeof document>"u"||(r=document.body.style.overflow,document.body.style.overflow="hidden",document.addEventListener("click",T),document.addEventListener("keydown",I),window.addEventListener("resize",d),window.visualViewport?.addEventListener("resize",d),i=window.matchMedia(ce),typeof i.addEventListener=="function"?i.addEventListener("change",d):i.addListener(d),await Z(),t.value?.addEventListener("scroll",S,{passive:!0}),n=document.querySelector(".brand"),n?.addEventListener("click",c),S(),y(),N(s.isImmersiveMode.value))}return Y(()=>e.fullPath,()=>{s.closeTransientUi(),t.value&&(t.value.scrollTop=0),o.value=!1}),Y(s.isImmersiveMode,u=>{N(u)}),ve(()=>{h(),P()}),ne(()=>{t.value?.removeEventListener("scroll",S),typeof document<"u"&&(document.removeEventListener("click",T),document.removeEventListener("keydown",I),document.body.style.overflow=r,N(!1)),typeof window<"u"&&(window.removeEventListener("resize",d),window.visualViewport?.removeEventListener("resize",d)),i&&(typeof i.removeEventListener=="function"?i.removeEventListener("change",d):i.removeListener(d),i=null),n?.removeEventListener("click",c),n=null,v=0,g()}),{showBackToTop:o,scrollToTop:_}}function yt({router:e,route:l,appStore:t,closeTransientUi:s}){const o=Re(),r=De(),n=k(()=>ge(l,{navItems:t.navItems,plugins:t.plugins})||"Dashboard");function i(v,m){const _=Ae({target:v,navItems:t.navItems,plugins:t.plugins,recentVisits:o.value,navigationUsage:r.value,pluginName:m});o.value=_.recentVisits,r.value=_.navigationUsage,e.push(Ee(v,m)),s()}return{currentPageTitle:n,recentVisits:o,navigationUsage:r,navigateTo:i}}function ht(){const e=ie(),l=se(),t=K(),s=gt(),o=E(null),r=yt({router:e,route:l,appStore:t,closeTransientUi:s.closeTransientUi}),n=bt({route:l,appStore:t,contentRef:o,controls:s});return{...s,...r,...n,contentRef:o}}var St={class:"immersive-fade immersive-fade--topbar"},Ct={class:"container"},Mt={class:"immersive-fade immersive-fade--sidebar"},kt={class:"unified-page-header"},_t=U({__name:"MainLayout",setup(e){const l=K(),{isMobileMenuOpen:t,isImmersiveMode:s,isSidebarCollapsed:o,isHoveringSidebar:r,isHoverEnabled:n,isCommandPaletteOpen:i,isSystemMenuOpen:v,isUserMenuOpen:m,hasNotifications:_,showBackToTop:S,contentRef:g,recentVisits:w,navigationUsage:y,currentPageTitle:N,navigateTo:c,openCommandPalette:T,closeCommandPalette:I,toggleMobileMenu:d,closeMobileMenu:h,toggleSidebarCollapse:P,toggleSystemMenu:u,toggleUserMenu:C,closeAllMenus:M,exitImmersiveMode:H,scrollToTop:B}=ht(),Se=k(()=>l.navItems),Ce=k(()=>l.plugins),Me=k(()=>l.pinnedPluginNames);return(wt,L)=>{const ke=we("router-view");return f(),b("div",{class:x(["admin-layout",{"ui-hidden-immersive":p(s),"sidebar-collapsed":p(o)}])},[V(qe),a("div",St,[V(Ha,{"is-mobile-menu-open":p(t),"is-sidebar-collapsed":p(o),"is-system-menu-open":p(v),"is-user-menu-open":p(m),"has-notifications":p(_),onToggleMobileMenu:p(d),onToggleSidebarCollapse:p(P),onToggleSystemMenu:p(u),onToggleUserMenu:p(C),onCloseAllMenus:p(M)},null,8,["is-mobile-menu-open","is-sidebar-collapsed","is-system-menu-open","is-user-menu-open","has-notifications","onToggleMobileMenu","onToggleSidebarCollapse","onToggleSystemMenu","onToggleUserMenu","onCloseAllMenus"])]),a("div",Ct,[a("div",Mt,[V(rt,{"is-mobile-menu-open":p(t),"is-sidebar-collapsed":p(o),"is-hovering-sidebar":p(r),"is-hover-enabled":p(n),"recent-visits":p(w),onNavigateTo:p(c),onOpenCommandPalette:p(T),"onUpdate:isHoveringSidebar":L[0]||(L[0]=R=>r.value=R)},null,8,["is-mobile-menu-open","is-sidebar-collapsed","is-hovering-sidebar","is-hover-enabled","recent-visits","onNavigateTo","onOpenCommandPalette"])]),a("div",{class:x(["sidebar-overlay",{active:p(t)}]),onClick:L[1]||(L[1]=(...R)=>p(h)&&p(h)(...R))},null,2),a("main",{ref_key:"contentRef",ref:g,class:"content",id:"config-details-container"},[V(pt),a("section",kt,[a("h1",null,$(p(N)),1)]),te(a("button",{type:"button",onClick:L[2]||(L[2]=(...R)=>p(B)&&p(B)(...R)),class:"back-to-top-btn","aria-label":"返回顶部",title:"返回顶部"},[...L[5]||(L[5]=[a("span",{class:"material-symbols-outlined"},"keyboard_arrow_up",-1)])],512),[[pe,p(S)]]),V(ke,null,{default:J(({Component:R,route:_e})=>[V(oe,{name:"fade",mode:"out-in"},{default:J(()=>[(f(),me(Ne(R),{key:_e.fullPath}))]),_:2},1024)]),_:1})],512)]),V(Ke),V(oe,{name:"immersive-exit-btn"},{default:J(()=>[p(s)?(f(),b("button",{key:0,id:"exit-immersive-button",class:"exit-immersive-button",onClick:L[3]||(L[3]=(...R)=>p(H)&&p(H)(...R))},[...L[6]||(L[6]=[a("span",{class:"material-symbols-outlined"},"close_fullscreen",-1),a("span",null,"退出沉浸模式",-1)])])):O("",!0)]),_:1}),p(v)||p(m)?(f(),b("div",{key:0,class:"dropdown-backdrop",onClick:L[4]||(L[4]=(...R)=>p(M)&&p(M)(...R))})):O("",!0),V(ya,{"is-open":p(i),"nav-items":Se.value,plugins:Ce.value,"recent-visits":p(w),"navigation-usage":p(y),"pinned-plugin-names":Me.value,onClose:p(I),onNavigateTo:p(c)},null,8,["is-open","nav-items","plugins","recent-visits","navigation-usage","pinned-plugin-names","onClose","onNavigateTo"])],2)}}}),Ht=D(_t,[["__scopeId","data-v-5009b262"]]);export{Ht as default}; diff --git a/AdminPanel-Vue/dist/assets/js/PlaceholderViewer-BYgQEdcR.js b/AdminPanel-Vue/dist/assets/js/PlaceholderViewer-qyzPTnil.js similarity index 98% rename from AdminPanel-Vue/dist/assets/js/PlaceholderViewer-BYgQEdcR.js rename to AdminPanel-Vue/dist/assets/js/PlaceholderViewer-qyzPTnil.js index 420e3209f..d46d47829 100644 --- a/AdminPanel-Vue/dist/assets/js/PlaceholderViewer-BYgQEdcR.js +++ b/AdminPanel-Vue/dist/assets/js/PlaceholderViewer-qyzPTnil.js @@ -1 +1 @@ -import{Dt as d,E as O,H as Z,N as T,O as q,Q as v,U as W,V as X,a as k,c as b,d as h,f as n,g as F,h as D,j as u,l as e,n as V,v as S,wt as _}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{l as ee,n as te,u as ae}from"./dashboard-card-news-BnyB_dHU.js";import{G as N,P as le,x as I}from"./dashboard-card-calendar-CA3-tSpi.js";import{t as re}from"./useMarkdownRenderer-BShYGq9a.js";var oe={class:"placeholder-view-mode"},se={class:"placeholder-viewer-filters"},ie=["value"],de=["value"],ne=["value"],ue=S({__name:"PlaceholderFilterBar",props:{viewMode:{},selectedType:{},filterKeyword:{},typeOptions:{}},emits:["update:viewMode","update:selectedType","update:filterKeyword"],setup(o,{emit:m}){const w=m;return(p,r)=>(u(),n(k,null,[e("div",oe,[e("button",{class:_(["view-mode-btn",{active:o.viewMode==="grouped"}]),onClick:r[0]||(r[0]=i=>w("update:viewMode","grouped"))},[...r[4]||(r[4]=[e("span",{class:"material-symbols-outlined"},"view_agenda",-1),D(" 分组视图 ",-1)])],2),e("button",{class:_(["view-mode-btn",{active:o.viewMode==="list"}]),onClick:r[1]||(r[1]=i=>w("update:viewMode","list"))},[...r[5]||(r[5]=[e("span",{class:"material-symbols-outlined"},"view_list",-1),D(" 列表视图 ",-1)])],2)]),e("div",se,[r[7]||(r[7]=e("label",{for:"placeholder-filter-type"},"快速跳转:",-1)),e("select",{id:"placeholder-filter-type",value:o.selectedType,class:"placeholder-filter-select",onChange:r[2]||(r[2]=i=>w("update:selectedType",i.target.value))},[r[6]||(r[6]=e("option",{value:""},"全部类型",-1)),(u(!0),n(k,null,T(o.typeOptions,i=>(u(),n("option",{key:i.value,value:i.value},d(i.label)+" ("+d(i.count)+") ",9,de))),128))],40,ie),r[8]||(r[8]=e("label",{for:"placeholder-filter-keyword"},"搜索:",-1)),e("input",{type:"text",id:"placeholder-filter-keyword",value:o.filterKeyword,class:"placeholder-filter-input",placeholder:"搜索占位符名称或预览…",onInput:r[3]||(r[3]=i=>w("update:filterKeyword",i.target.value))},null,40,ne)])],64))}}),ce=V(ue,[["__scopeId","data-v-9cd940f2"]]),ve={key:0,class:"placeholder-detail-modal",role:"dialog","aria-modal":"true","aria-labelledby":"placeholder-detail-title"},pe={class:"placeholder-detail-modal-header"},ye={id:"placeholder-detail-title"},we={class:"placeholder-name-large"},me={class:"placeholder-detail-type"},fe={class:"placeholder-detail-tabs",role:"tablist"},he={id:"placeholder-detail-body",class:"placeholder-detail-modal-body"},_e={key:0,class:"placeholder-detail-panel active"},ge=["innerHTML"],be={key:2,class:"placeholder-detail-panel"},ke=S({__name:"PlaceholderDetailModal",props:{selectedPlaceholder:{},activeTab:{},detailContent:{},renderedMarkdown:{},getTypeLabel:{type:Function}},emits:["close","update:activeTab"],setup(o,{emit:m}){const w=o,p=m,r=v(null);return X(()=>w.selectedPlaceholder,async i=>{i&&(await O(),r.value?.focus())}),(i,s)=>o.selectedPlaceholder?(u(),n("div",ve,[e("div",{class:"placeholder-detail-modal-backdrop",onClick:s[0]||(s[0]=y=>p("close"))}),e("div",{class:"placeholder-detail-modal-content",ref_key:"modalContentRef",ref:r,tabindex:"-1",onKeydown:s[5]||(s[5]=ae(y=>p("close"),["escape"]))},[e("div",pe,[e("h3",ye,[e("span",we,d(o.selectedPlaceholder.name),1),e("span",me,d(o.getTypeLabel(o.selectedPlaceholder.type)),1)]),e("button",{type:"button",class:"placeholder-detail-modal-close",onClick:s[1]||(s[1]=y=>p("close")),"aria-label":"关闭弹窗"}," × ")]),e("div",fe,[e("button",{type:"button",class:_(["placeholder-detail-tab",{active:o.activeTab==="raw"}]),onClick:s[2]||(s[2]=y=>p("update:activeTab","raw"))}," 原始文本 ",2),e("button",{type:"button",class:_(["placeholder-detail-tab",{active:o.activeTab==="markdown"}]),onClick:s[3]||(s[3]=y=>p("update:activeTab","markdown"))}," Markdown 渲染 ",2),e("button",{type:"button",class:_(["placeholder-detail-tab",{active:o.activeTab==="json"}]),onClick:s[4]||(s[4]=y=>p("update:activeTab","json"))}," JSON 格式化 ",2)]),e("div",he,[o.activeTab==="raw"?(u(),n("div",_e,[e("pre",null,d(o.detailContent),1)])):h("",!0),o.activeTab==="markdown"?(u(),n("div",{key:1,class:"placeholder-detail-panel",innerHTML:o.renderedMarkdown},null,8,ge)):h("",!0),o.activeTab==="json"?(u(),n("div",be,[e("pre",null,d(JSON.stringify(o.selectedPlaceholder,null,2)),1)])):h("",!0)])],544)])):h("",!0)}}),Ce=V(ke,[["__scopeId","data-v-8201c4fb"]]),Te={class:"config-section active-section"},$e={key:0,class:"placeholder-grouped-view"},Pe=["id"],Me={class:"type-group-header"},Le={class:"type-count"},xe=["aria-expanded","aria-controls","onClick"],Fe=["id"],De={class:"placeholder-header"},Ve=["title"],Se=["title"],Ee={key:0,class:"placeholder-description"},Ke={class:"placeholder-footer"},Ae={class:"placeholder-charcount"},Be=["onClick"],Ge={key:1,class:"placeholder-list-view"},Ne={class:"placeholder-header"},Ie=["title"],Oe=["title"],Ue=["title"],je={key:0,class:"placeholder-description"},He={class:"placeholder-footer"},Re={class:"placeholder-charcount"},ze=["onClick"],Je=S({__name:"PlaceholderViewer",setup(o){const m=le("PlaceholderViewer"),w={static_plugin:"Static Plugin",async_placeholder:"Async Placeholder",agent:"Agent",env_tar_var:"Target Variable",env_sar:"Sar Prompt",fixed:"Fixed Value",tool_description:"Tool Description",vcp_all_tools:"All Tools",image_key:"Image Key",diary:"Diary",diary_character:"Diary Character"},{renderMarkdown:p}=re(),r=v([]),i=v(""),s=v(""),y=v("grouped"),$=v(null),P=v("raw"),f=v(""),E=v(""),K=v(null),M=v({});function C(t){return w[t]||t}const L=b(()=>{const t=new Set(r.value.map(l=>l.type));return Array.from(t).sort()}),x=b(()=>{const t={};return r.value.forEach(l=>{t[l.type]||(t[l.type]=[]),t[l.type].push(l)}),t});function U(t){return x.value[t]?.length||0}function A(t){const l=x.value[t]||[];if(!s.value)return l;const a=s.value.toLowerCase();return l.filter(c=>c.name.toLowerCase().includes(a)||c.preview.toLowerCase().includes(a)||c.description&&c.description.toLowerCase().includes(a))}function j(t){return A(t).length}function g(t){return M.value[t]??!1}function H(t){M.value={...M.value,[t]:!g(t)}}function B(t){return`placeholder-type-group-content-${t.replace(/[^a-zA-Z0-9_-]/g,"-")}`}const R=b(()=>L.value.map(t=>({value:t,label:C(t),count:U(t)}))),z=b(()=>{if(s.value){const t=s.value.toLowerCase();return L.value.filter(l=>(x.value[l]||[]).some(a=>a.name.toLowerCase().includes(t)||a.preview.toLowerCase().includes(t)))}return i.value?[i.value]:L.value}),J=b(()=>r.value.filter(t=>{if(i.value&&t.type!==i.value)return!1;if(!s.value)return!0;const l=s.value.toLowerCase();return t.name.toLowerCase().includes(l)||t.preview.toLowerCase().includes(l)}));async function Q(){try{r.value=await I.getPlaceholders()}catch(t){const l=t instanceof Error?t.message:String(t);m.error("Failed to load placeholders",t),N(`Failed to load placeholders: ${l}`,"error")}}async function G(t){K.value=document.activeElement,$.value=t,P.value="raw",f.value="Loading detail...";try{f.value=await I.getPlaceholderDetail(t.type,t.name)??t.content??t.preview,f.value&&(E.value=await p(f.value))}catch(l){const a=l instanceof Error?l.message:String(l);m.error("Failed to load placeholder detail",l),f.value=`Failed to load detail: ${a}`,N(`Failed to load detail: ${a}`,"error")}}function Y(){$.value=null,O(()=>{K.value?.focus()})}return q(()=>{Q()}),(t,l)=>(u(),n("section",Te,[l[6]||(l[6]=e("p",{class:"description"}," 当前可用的系统提示词占位符列表,按类型分类展示。点击「查看详情」可查看完整内容。 ",-1)),F(ce,{"view-mode":y.value,"selected-type":i.value,"filter-keyword":s.value,"type-options":R.value,"onUpdate:viewMode":l[0]||(l[0]=a=>y.value=a),"onUpdate:selectedType":l[1]||(l[1]=a=>i.value=a),"onUpdate:filterKeyword":l[2]||(l[2]=a=>s.value=a)},null,8,["view-mode","selected-type","filter-keyword","type-options"]),y.value==="grouped"?(u(),n("div",$e,[(u(!0),n(k,null,T(z.value,a=>(u(),n("div",{key:a,id:`type-group-${a}`,class:"placeholder-type-group"},[e("div",Me,[e("h3",null,[l[4]||(l[4]=e("span",{class:"material-symbols-outlined"},"folder",-1)),D(" "+d(C(a))+" ",1),e("span",Le,d(j(a)),1)]),e("button",{type:"button",class:_(["group-collapse-toggle",{"is-collapsed":g(a)}]),"aria-expanded":!g(a),"aria-controls":B(a),onClick:c=>H(a)},[e("span",null,d(g(a)?"展开":"折叠"),1),l[5]||(l[5]=e("span",{class:"material-symbols-outlined group-collapse-icon"},"expand_more",-1))],10,xe)]),F(te,{name:"group-collapse"},{default:Z(()=>[W(e("div",{id:B(a),class:"type-group-content"},[(u(!0),n(k,null,T(A(a),c=>(u(),n("div",{key:c.name,class:"placeholder-item card"},[e("div",De,[e("span",{class:"placeholder-name",title:c.name},d(c.name),9,Ve)]),e("div",{class:"placeholder-preview",title:c.preview},d(c.preview),9,Se),c.description?(u(),n("div",Ee,d(c.description),1)):h("",!0),e("div",Ke,[e("span",Ae,d(c.charCount?`${c.charCount} 字符`:"—"),1),e("button",{onClick:Qe=>G(c),class:"btn-secondary btn-sm"}," 查看详情 ",8,Be)])]))),128))],8,Fe),[[ee,!g(a)]])]),_:2},1024)],8,Pe))),128))])):(u(),n("div",Ge,[(u(!0),n(k,null,T(J.value,a=>(u(),n("div",{key:a.name,class:"placeholder-item card"},[e("div",Ne,[e("span",{class:"placeholder-name",title:a.name},d(a.name),9,Ie),e("span",{class:"placeholder-type",title:a.type},d(C(a.type)),9,Oe)]),e("div",{class:"placeholder-preview",title:a.preview},d(a.preview),9,Ue),a.description?(u(),n("div",je,d(a.description),1)):h("",!0),e("div",He,[e("span",Re,d(a.charCount?`${a.charCount} 字符`:"—"),1),e("button",{onClick:c=>G(a),class:"btn-secondary btn-sm"}," 查看详情 ",8,ze)])]))),128))])),F(Ce,{"selected-placeholder":$.value,"active-tab":P.value,"detail-content":f.value,"rendered-markdown":E.value,"get-type-label":C,onClose:Y,"onUpdate:activeTab":l[3]||(l[3]=a=>P.value=a)},null,8,["selected-placeholder","active-tab","detail-content","rendered-markdown"])]))}}),Xe=V(Je,[["__scopeId","data-v-07ba2545"]]);export{Xe as default}; +import{Dt as d,E as O,H as Z,N as T,O as q,Q as v,U as W,V as X,a as k,c as b,d as h,f as n,g as F,h as D,j as u,l as e,n as V,v as S,wt as _}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{l as ee,n as te,u as ae}from"./dashboard-card-news-BnyB_dHU.js";import{G as N,P as le,x as I}from"./dashboard-card-calendar-DWuV34Bn.js";import{t as re}from"./useMarkdownRenderer-DLeytw2l.js";var oe={class:"placeholder-view-mode"},se={class:"placeholder-viewer-filters"},ie=["value"],de=["value"],ne=["value"],ue=S({__name:"PlaceholderFilterBar",props:{viewMode:{},selectedType:{},filterKeyword:{},typeOptions:{}},emits:["update:viewMode","update:selectedType","update:filterKeyword"],setup(o,{emit:m}){const w=m;return(p,r)=>(u(),n(k,null,[e("div",oe,[e("button",{class:_(["view-mode-btn",{active:o.viewMode==="grouped"}]),onClick:r[0]||(r[0]=i=>w("update:viewMode","grouped"))},[...r[4]||(r[4]=[e("span",{class:"material-symbols-outlined"},"view_agenda",-1),D(" 分组视图 ",-1)])],2),e("button",{class:_(["view-mode-btn",{active:o.viewMode==="list"}]),onClick:r[1]||(r[1]=i=>w("update:viewMode","list"))},[...r[5]||(r[5]=[e("span",{class:"material-symbols-outlined"},"view_list",-1),D(" 列表视图 ",-1)])],2)]),e("div",se,[r[7]||(r[7]=e("label",{for:"placeholder-filter-type"},"快速跳转:",-1)),e("select",{id:"placeholder-filter-type",value:o.selectedType,class:"placeholder-filter-select",onChange:r[2]||(r[2]=i=>w("update:selectedType",i.target.value))},[r[6]||(r[6]=e("option",{value:""},"全部类型",-1)),(u(!0),n(k,null,T(o.typeOptions,i=>(u(),n("option",{key:i.value,value:i.value},d(i.label)+" ("+d(i.count)+") ",9,de))),128))],40,ie),r[8]||(r[8]=e("label",{for:"placeholder-filter-keyword"},"搜索:",-1)),e("input",{type:"text",id:"placeholder-filter-keyword",value:o.filterKeyword,class:"placeholder-filter-input",placeholder:"搜索占位符名称或预览…",onInput:r[3]||(r[3]=i=>w("update:filterKeyword",i.target.value))},null,40,ne)])],64))}}),ce=V(ue,[["__scopeId","data-v-9cd940f2"]]),ve={key:0,class:"placeholder-detail-modal",role:"dialog","aria-modal":"true","aria-labelledby":"placeholder-detail-title"},pe={class:"placeholder-detail-modal-header"},ye={id:"placeholder-detail-title"},we={class:"placeholder-name-large"},me={class:"placeholder-detail-type"},fe={class:"placeholder-detail-tabs",role:"tablist"},he={id:"placeholder-detail-body",class:"placeholder-detail-modal-body"},_e={key:0,class:"placeholder-detail-panel active"},ge=["innerHTML"],be={key:2,class:"placeholder-detail-panel"},ke=S({__name:"PlaceholderDetailModal",props:{selectedPlaceholder:{},activeTab:{},detailContent:{},renderedMarkdown:{},getTypeLabel:{type:Function}},emits:["close","update:activeTab"],setup(o,{emit:m}){const w=o,p=m,r=v(null);return X(()=>w.selectedPlaceholder,async i=>{i&&(await O(),r.value?.focus())}),(i,s)=>o.selectedPlaceholder?(u(),n("div",ve,[e("div",{class:"placeholder-detail-modal-backdrop",onClick:s[0]||(s[0]=y=>p("close"))}),e("div",{class:"placeholder-detail-modal-content",ref_key:"modalContentRef",ref:r,tabindex:"-1",onKeydown:s[5]||(s[5]=ae(y=>p("close"),["escape"]))},[e("div",pe,[e("h3",ye,[e("span",we,d(o.selectedPlaceholder.name),1),e("span",me,d(o.getTypeLabel(o.selectedPlaceholder.type)),1)]),e("button",{type:"button",class:"placeholder-detail-modal-close",onClick:s[1]||(s[1]=y=>p("close")),"aria-label":"关闭弹窗"}," × ")]),e("div",fe,[e("button",{type:"button",class:_(["placeholder-detail-tab",{active:o.activeTab==="raw"}]),onClick:s[2]||(s[2]=y=>p("update:activeTab","raw"))}," 原始文本 ",2),e("button",{type:"button",class:_(["placeholder-detail-tab",{active:o.activeTab==="markdown"}]),onClick:s[3]||(s[3]=y=>p("update:activeTab","markdown"))}," Markdown 渲染 ",2),e("button",{type:"button",class:_(["placeholder-detail-tab",{active:o.activeTab==="json"}]),onClick:s[4]||(s[4]=y=>p("update:activeTab","json"))}," JSON 格式化 ",2)]),e("div",he,[o.activeTab==="raw"?(u(),n("div",_e,[e("pre",null,d(o.detailContent),1)])):h("",!0),o.activeTab==="markdown"?(u(),n("div",{key:1,class:"placeholder-detail-panel",innerHTML:o.renderedMarkdown},null,8,ge)):h("",!0),o.activeTab==="json"?(u(),n("div",be,[e("pre",null,d(JSON.stringify(o.selectedPlaceholder,null,2)),1)])):h("",!0)])],544)])):h("",!0)}}),Ce=V(ke,[["__scopeId","data-v-8201c4fb"]]),Te={class:"config-section active-section"},$e={key:0,class:"placeholder-grouped-view"},Pe=["id"],Me={class:"type-group-header"},Le={class:"type-count"},xe=["aria-expanded","aria-controls","onClick"],Fe=["id"],De={class:"placeholder-header"},Ve=["title"],Se=["title"],Ee={key:0,class:"placeholder-description"},Ke={class:"placeholder-footer"},Ae={class:"placeholder-charcount"},Be=["onClick"],Ge={key:1,class:"placeholder-list-view"},Ne={class:"placeholder-header"},Ie=["title"],Oe=["title"],Ue=["title"],je={key:0,class:"placeholder-description"},He={class:"placeholder-footer"},Re={class:"placeholder-charcount"},ze=["onClick"],Je=S({__name:"PlaceholderViewer",setup(o){const m=le("PlaceholderViewer"),w={static_plugin:"Static Plugin",async_placeholder:"Async Placeholder",agent:"Agent",env_tar_var:"Target Variable",env_sar:"Sar Prompt",fixed:"Fixed Value",tool_description:"Tool Description",vcp_all_tools:"All Tools",image_key:"Image Key",diary:"Diary",diary_character:"Diary Character"},{renderMarkdown:p}=re(),r=v([]),i=v(""),s=v(""),y=v("grouped"),$=v(null),P=v("raw"),f=v(""),E=v(""),K=v(null),M=v({});function C(t){return w[t]||t}const L=b(()=>{const t=new Set(r.value.map(l=>l.type));return Array.from(t).sort()}),x=b(()=>{const t={};return r.value.forEach(l=>{t[l.type]||(t[l.type]=[]),t[l.type].push(l)}),t});function U(t){return x.value[t]?.length||0}function A(t){const l=x.value[t]||[];if(!s.value)return l;const a=s.value.toLowerCase();return l.filter(c=>c.name.toLowerCase().includes(a)||c.preview.toLowerCase().includes(a)||c.description&&c.description.toLowerCase().includes(a))}function j(t){return A(t).length}function g(t){return M.value[t]??!1}function H(t){M.value={...M.value,[t]:!g(t)}}function B(t){return`placeholder-type-group-content-${t.replace(/[^a-zA-Z0-9_-]/g,"-")}`}const R=b(()=>L.value.map(t=>({value:t,label:C(t),count:U(t)}))),z=b(()=>{if(s.value){const t=s.value.toLowerCase();return L.value.filter(l=>(x.value[l]||[]).some(a=>a.name.toLowerCase().includes(t)||a.preview.toLowerCase().includes(t)))}return i.value?[i.value]:L.value}),J=b(()=>r.value.filter(t=>{if(i.value&&t.type!==i.value)return!1;if(!s.value)return!0;const l=s.value.toLowerCase();return t.name.toLowerCase().includes(l)||t.preview.toLowerCase().includes(l)}));async function Q(){try{r.value=await I.getPlaceholders()}catch(t){const l=t instanceof Error?t.message:String(t);m.error("Failed to load placeholders",t),N(`Failed to load placeholders: ${l}`,"error")}}async function G(t){K.value=document.activeElement,$.value=t,P.value="raw",f.value="Loading detail...";try{f.value=await I.getPlaceholderDetail(t.type,t.name)??t.content??t.preview,f.value&&(E.value=await p(f.value))}catch(l){const a=l instanceof Error?l.message:String(l);m.error("Failed to load placeholder detail",l),f.value=`Failed to load detail: ${a}`,N(`Failed to load detail: ${a}`,"error")}}function Y(){$.value=null,O(()=>{K.value?.focus()})}return q(()=>{Q()}),(t,l)=>(u(),n("section",Te,[l[6]||(l[6]=e("p",{class:"description"}," 当前可用的系统提示词占位符列表,按类型分类展示。点击「查看详情」可查看完整内容。 ",-1)),F(ce,{"view-mode":y.value,"selected-type":i.value,"filter-keyword":s.value,"type-options":R.value,"onUpdate:viewMode":l[0]||(l[0]=a=>y.value=a),"onUpdate:selectedType":l[1]||(l[1]=a=>i.value=a),"onUpdate:filterKeyword":l[2]||(l[2]=a=>s.value=a)},null,8,["view-mode","selected-type","filter-keyword","type-options"]),y.value==="grouped"?(u(),n("div",$e,[(u(!0),n(k,null,T(z.value,a=>(u(),n("div",{key:a,id:`type-group-${a}`,class:"placeholder-type-group"},[e("div",Me,[e("h3",null,[l[4]||(l[4]=e("span",{class:"material-symbols-outlined"},"folder",-1)),D(" "+d(C(a))+" ",1),e("span",Le,d(j(a)),1)]),e("button",{type:"button",class:_(["group-collapse-toggle",{"is-collapsed":g(a)}]),"aria-expanded":!g(a),"aria-controls":B(a),onClick:c=>H(a)},[e("span",null,d(g(a)?"展开":"折叠"),1),l[5]||(l[5]=e("span",{class:"material-symbols-outlined group-collapse-icon"},"expand_more",-1))],10,xe)]),F(te,{name:"group-collapse"},{default:Z(()=>[W(e("div",{id:B(a),class:"type-group-content"},[(u(!0),n(k,null,T(A(a),c=>(u(),n("div",{key:c.name,class:"placeholder-item card"},[e("div",De,[e("span",{class:"placeholder-name",title:c.name},d(c.name),9,Ve)]),e("div",{class:"placeholder-preview",title:c.preview},d(c.preview),9,Se),c.description?(u(),n("div",Ee,d(c.description),1)):h("",!0),e("div",Ke,[e("span",Ae,d(c.charCount?`${c.charCount} 字符`:"—"),1),e("button",{onClick:Qe=>G(c),class:"btn-secondary btn-sm"}," 查看详情 ",8,Be)])]))),128))],8,Fe),[[ee,!g(a)]])]),_:2},1024)],8,Pe))),128))])):(u(),n("div",Ge,[(u(!0),n(k,null,T(J.value,a=>(u(),n("div",{key:a.name,class:"placeholder-item card"},[e("div",Ne,[e("span",{class:"placeholder-name",title:a.name},d(a.name),9,Ie),e("span",{class:"placeholder-type",title:a.type},d(C(a.type)),9,Oe)]),e("div",{class:"placeholder-preview",title:a.preview},d(a.preview),9,Ue),a.description?(u(),n("div",je,d(a.description),1)):h("",!0),e("div",He,[e("span",Re,d(a.charCount?`${a.charCount} 字符`:"—"),1),e("button",{onClick:c=>G(a),class:"btn-secondary btn-sm"}," 查看详情 ",8,ze)])]))),128))])),F(Ce,{"selected-placeholder":$.value,"active-tab":P.value,"detail-content":f.value,"rendered-markdown":E.value,"get-type-label":C,onClose:Y,"onUpdate:activeTab":l[3]||(l[3]=a=>P.value=a)},null,8,["selected-placeholder","active-tab","detail-content","rendered-markdown"])]))}}),Xe=V(Je,[["__scopeId","data-v-07ba2545"]]);export{Xe as default}; diff --git a/AdminPanel-Vue/dist/assets/js/PluginConfig-Bv0hgz83.js b/AdminPanel-Vue/dist/assets/js/PluginConfig-B_YmEtY4.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/PluginConfig-Bv0hgz83.js rename to AdminPanel-Vue/dist/assets/js/PluginConfig-B_YmEtY4.js index 70ae20cab..7005b1f41 100644 --- a/AdminPanel-Vue/dist/assets/js/PluginConfig-Bv0hgz83.js +++ b/AdminPanel-Vue/dist/assets/js/PluginConfig-B_YmEtY4.js @@ -1,3 +1,3 @@ -import{Dt as m,N as ee,Q as z,U as C,V as re,X as se,a as ae,at as i,c as _,d as k,f as n,h as I,j as o,l as t,n as de,v as ce,wt as O}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as ne,c as P,d as ve,o as oe}from"./dashboard-card-news-BnyB_dHU.js";import{D as ie,G as h,J as me,X as pe,a as ge,i as le,o as fe,r as ue}from"./dashboard-card-calendar-CA3-tSpi.js";import{r as ke}from"./vue-vendor-BUOVPpjf.js";import{i as he}from"./dashboard-components-LHqMn0M5.js";var _e=me("plugin-config",()=>{const L=he(),p=z(null),d=z([]),y=z(""),E=z("info"),w=se({}),$=se({}),c=se({}),M=_(()=>new Set(d.value.filter(s=>!s.isCommentOrEmpty&&!!s.key).map(s=>s.key))),F=_(()=>d.value.some(s=>!s.isCommentOrEmpty)),B=_(()=>{const s=p.value?.manifest.configSchema;return!!s&&Object.keys(s).length>0}),x=_(()=>{const s=p.value?.manifest.configSchema||{},a=p.value?.manifest.defaults||{};return Object.keys(s).map(l=>{const u=d.value.find(te=>!te.isCommentOrEmpty&&te.key===l),g=b(s[l]),v=a[l]??"",f=u?String(u.value??""):v;return{key:l,value:ue(f,g),isCommentOrEmpty:!1,isMultilineQuoted:u?.isMultilineQuoted??String(f).includes(` +import{Dt as m,N as ee,Q as z,U as C,V as re,X as se,a as ae,at as i,c as _,d as k,f as n,h as I,j as o,l as t,n as de,v as ce,wt as O}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as ne,c as P,d as ve,o as oe}from"./dashboard-card-news-BnyB_dHU.js";import{D as ie,G as h,J as me,X as pe,a as ge,i as le,o as fe,r as ue}from"./dashboard-card-calendar-DWuV34Bn.js";import{r as ke}from"./vue-vendor-BUOVPpjf.js";import{i as he}from"./dashboard-components-B8tHL6X6.js";var _e=me("plugin-config",()=>{const L=he(),p=z(null),d=z([]),y=z(""),E=z("info"),w=se({}),$=se({}),c=se({}),M=_(()=>new Set(d.value.filter(s=>!s.isCommentOrEmpty&&!!s.key).map(s=>s.key))),F=_(()=>d.value.some(s=>!s.isCommentOrEmpty)),B=_(()=>{const s=p.value?.manifest.configSchema;return!!s&&Object.keys(s).length>0}),x=_(()=>{const s=p.value?.manifest.configSchema||{},a=p.value?.manifest.defaults||{};return Object.keys(s).map(l=>{const u=d.value.find(te=>!te.isCommentOrEmpty&&te.key===l),g=b(s[l]),v=a[l]??"",f=u?String(u.value??""):v;return{key:l,value:ue(f,g),isCommentOrEmpty:!1,isMultilineQuoted:u?.isMultilineQuoted??String(f).includes(` `),type:g}})}),N=_(()=>d.value.filter(s=>s.isCommentOrEmpty?!0:s.key?!D(s.key):!1)),G=_(()=>x.value.length>0),X=_(()=>d.value.some(s=>s.isCommentOrEmpty)),J=_(()=>d.value.some(s=>!s.isCommentOrEmpty&&!!s.key&&!D(s.key))),K=_(()=>p.value?.manifest.capabilities?.invocationCommands||[]);function T(){Object.keys(w).forEach(s=>{delete w[s]}),Object.keys($).forEach(s=>{delete $[s]}),Object.keys(c).forEach(s=>{delete c[s]})}function j(s){return le(s)}function V(s){w[s]=!w[s]}function S(s){return s.commandIdentifier||s.command||""}function b(s){return s==="boolean"||s==="integer"||s==="string"?s:"string"}function Y(s,a){return s&&le(s)?"string":/^(true|false)$/i.test(a)?"boolean":!Number.isNaN(Number.parseFloat(a))&&Number.isFinite(Number.parseFloat(a))&&!a.includes(".")?"integer":"string"}function A(s){const a=s.value;let l=String(a??"");if(s.type==="boolean")l=a?"true":"false";else if(s.type==="integer"){const u=Number.parseInt(String(a),10);l=Number.isNaN(u)?"":String(u)}return fe(s.key,l)}function D(s){return!!p.value?.manifest.configSchema?.[s]}function q(s){return M.value.has(s)}function H(s){return p.value?.manifest.defaults?.[s]!==void 0}function Q(s){return p.value?.manifest.configSchemaDescriptions?.[s]||`Schema 定义: ${s}`}function W(s){confirm(`确定要删除自定义配置项 "${s}" 吗?更改将在保存后生效。`)&&(d.value=d.value.filter(a=>a.isCommentOrEmpty||a.key!==s))}function Z(){const s=prompt("请输入新自定义配置项的键名 (例如 MY_PLUGIN_VAR):");if(!s||!s.trim())return;const a=s.trim().replace(/\s+/g,"_");if(d.value.some(l=>!l.isCommentOrEmpty&&l.key===a)){h(`配置项 "${a}" 已存在!`,"error");return}d.value.push({key:a,value:"",isCommentOrEmpty:!1,isMultilineQuoted:!1,type:"string"}),h(`已添加自定义配置项 "${a}"`,"success")}async function U(s,a={}){T(),p.value=null,d.value=[];try{const l=(a.forceRefresh?await L.refreshPlugins():await L.ensurePluginsLoaded()).find(u=>u.manifest.name===s||u.name===s);if(!l){p.value=null,d.value=[];return}p.value=l,d.value=ge(l.configEnvContent??l.configENVContent??"").map(u=>{const g=u.isCommentOrEmpty||!u.key?"string":Y(u.key,u.value);return{...u,type:g,value:u.isCommentOrEmpty||!u.key?u.value:ue(u.value,g)}}),K.value.forEach(u=>{const g=S(u);g&&($[g]=u.description||"")})}catch(l){h(`加载插件配置失败:${l instanceof Error?l.message:String(l)}`,"error")}}async function R(s,a){const l=S(a);if(l){c[l]={type:"info",message:"正在保存描述..."};try{await ie.saveInvocationCommandDescription(s,l,$[l]||"",{loadingKey:"plugin-config.command-description.save"}),c[l]={type:"success",message:"描述已保存!"},h(`指令 "${l}" 的描述已成功保存!`,"success")}catch(u){const g=u instanceof Error?u.message:String(u);c[l]={type:"error",message:`保存失败: ${g}`},h(`保存指令描述失败:${g}`,"error")}}}async function r(s){if(!p.value){h("插件信息尚未加载完成。","warning");return}if(p.value.isDistributed){h("分布式插件的启停状态需要在所属节点侧管理。","warning");return}const a=!p.value.enabled,l=a?"启用":"禁用";if(confirm(`确定要${l}插件 "${p.value?.manifest.displayName||s}" 吗?`))try{h((await ie.togglePlugin(s,a,{loadingKey:"plugin-config.toggle"})).message||`${l}插件成功`,"success"),await U(s,{forceRefresh:!0})}catch(u){h(`${l}插件失败:${u instanceof Error?u.message:String(u)}`,"error")}}async function e(s){const a=new Map;x.value.forEach(v=>{v.key&&a.set(v.key,v)}),N.value.forEach(v=>{!v.isCommentOrEmpty&&v.key&&a.set(v.key,v)});const l=new Set(a.keys()),u=[];d.value.forEach(v=>{if(v.isCommentOrEmpty||!v.key){u.push(String(v.value));return}const f=a.get(v.key);f&&(u.push(A(f)),l.delete(v.key))}),l.forEach(v=>{const f=a.get(v);f&&u.push(A(f))});const g=u.join(` `);try{await ie.savePluginConfig(s,g,{loadingKey:"plugin-config.save"}),y.value="插件配置已保存!",E.value="success",h("插件配置已保存!","success"),await U(s,{forceRefresh:!0})}catch(v){const f=v instanceof Error?v.message:String(v);y.value=`保存失败:${f}`,E.value="error",h(`保存失败:${f}`,"error")}}return{pluginData:p,configEntries:d,statusMessage:y,statusType:E,sensitiveFields:w,commandDescriptions:$,commandStatuses:c,hasEnvContent:F,hasConfigSchema:B,schemaEntries:x,customEntries:N,hasSchemaFields:G,hasCommentEntries:X,hasCustomFields:J,invocationCommands:K,isSensitiveKey:j,toggleSensitiveField:V,getCommandIdentifier:S,isKeyInSchema:D,isKeyInEnv:q,hasDefault:H,getSchemaDescription:Q,removeCustomField:W,addCustomField:Z,loadPluginConfig:U,saveInvocationCommandDescription:R,togglePlugin:r,savePluginConfig:e}}),ye={class:"config-section active-section"},be={key:0,class:"description"},Ce={key:1,class:"plugin-config-container"},Ee={class:"plugin-controls"},we=["disabled","title"],Se={key:0,class:"config-warning"},$e={class:"warning-content"},Ie={class:"warning-text"},Ve={key:1,class:"schema-fields-section"},xe=["for"],De={class:"key-name"},Ue={key:0,class:"switch-container"},Oe={class:"switch"},Pe=["id","onUpdate:modelValue"],Me=["id","onUpdate:modelValue"],Fe={key:2,class:"textarea-wrapper"},Ne={key:0,class:"input-with-toggle"},Ke=["id","value","onInput"],Te=["onClick","aria-label","aria-pressed"],je=["id","value","onInput"],Ae={key:3,class:"input-with-toggle"},Qe=["type","id","onUpdate:modelValue"],Re=["onClick","aria-label","aria-pressed"],ze=["id","onUpdate:modelValue"],Le={key:5,class:"description"},Be={key:0,class:"defined-in"},Ge={key:1,class:"defined-in"},Xe={key:2,class:"defined-in"},Je={key:2,class:"custom-fields-section"},Ye={key:0,class:"form-group-comment"},qe={key:1},He=["for"],We={class:"key-name"},Ze=["onClick","title"],es={key:0,class:"switch-container"},ss={class:"switch"},as=["id","onUpdate:modelValue"],is=["id","onUpdate:modelValue"],ts={key:2,class:"textarea-wrapper"},ns={key:0,class:"input-with-toggle"},os=["id","value","onInput"],ls=["onClick","aria-label","aria-pressed"],us=["id","value","onInput"],rs={key:3,class:"input-with-toggle"},ds=["type","id","onUpdate:modelValue"],cs=["onClick","aria-label","aria-pressed"],vs=["id","onUpdate:modelValue"],ms={key:5,class:"description"},ps={key:3,class:"invocation-commands-section"},gs={class:"form-group"},fs=["for"],ks=["id","onUpdate:modelValue"],hs=["onClick"],_s={class:"form-actions"},ys={type:"submit",class:"btn-success"},bs={key:2,class:"empty-state"},Cs=ce({__name:"PluginConfig",setup(L){const p=ke(),d=_(()=>p.params.pluginName),y=_e(),{pluginData:E,statusMessage:w,statusType:$,sensitiveFields:c,commandDescriptions:M,commandStatuses:F,hasEnvContent:B,hasConfigSchema:x,schemaEntries:N,customEntries:G,hasSchemaFields:X,hasCommentEntries:J,hasCustomFields:K,invocationCommands:T}=pe(y),j=_(()=>!!E.value?.isDistributed),{isSensitiveKey:V,toggleSensitiveField:S,getCommandIdentifier:b,isKeyInSchema:Y,isKeyInEnv:A,hasDefault:D,getSchemaDescription:q,removeCustomField:H,addCustomField:Q}=y;async function W(R){await y.saveInvocationCommandDescription(d.value,R)}async function Z(){await y.togglePlugin(d.value)}async function U(){await y.savePluginConfig(d.value)}return re(()=>d.value,()=>{y.loadPluginConfig(d.value)},{immediate:!0}),(R,r)=>(o(),n("section",ye,[d.value?(o(),n("p",be,"配置插件:"+m(d.value),1)):k("",!0),i(E)?(o(),n("div",Ce,[t("div",Ee,[t("button",{onClick:Z,class:O(["btn-primary",{"disabled-state":!i(E).enabled}]),disabled:j.value,title:j.value?"分布式插件状态由所属节点管理":void 0},m(i(E).enabled?"禁用插件":"启用插件"),11,we),i(w)?(o(),n("span",{key:0,class:O(["status-message",i($)])},m(i(w)),3)):k("",!0)]),t("form",{onSubmit:ve(U,["prevent"])},[!i(B)&&!i(x)?(o(),n("div",Se,[t("div",$e,[r[5]||(r[5]=t("p",{class:"warning-title"},"该插件暂无配置文件",-1)),t("p",Ie,[r[1]||(r[1]=I(" 插件 ",-1)),t("code",null,m(d.value),1),r[2]||(r[2]=I(" 目录下不存在 ",-1)),r[3]||(r[3]=t("code",null,"config.env",-1)),r[4]||(r[4]=I(" 文件。 ",-1))]),r[6]||(r[6]=t("p",{class:"warning-text"},[I(" 您可以在下方添加配置项,点击保存后将自动创建 "),t("code",null,"config.env"),I(" 文件。 ")],-1))])])):k("",!0),i(X)?(o(),n("div",Ve,[r[8]||(r[8]=t("h3",null,"Schema 定义的配置",-1)),(o(!0),n(ae,null,ee(i(N),(e,s)=>(o(),n("div",{key:e.key||`schema-${s}`,class:"form-group"},[t("label",{for:`plugin-${e.key}`},[t("span",De,m(e.key),1)],8,xe),e.type==="boolean"?(o(),n("div",Ue,[t("label",Oe,[C(t("input",{type:"checkbox",id:`plugin-${e.key}`,"onUpdate:modelValue":a=>e.value=a},null,8,Pe),[[ne,e.value]]),r[7]||(r[7]=t("span",{class:"slider"},null,-1))]),t("span",null,m(e.value?"启用":"禁用"),1)])):e.type==="integer"?C((o(),n("input",{key:1,type:"number",id:`plugin-${e.key}`,"onUpdate:modelValue":a=>e.value=a},null,8,Me)),[[P,e.value,void 0,{number:!0}]]):k("",!0),e.isMultilineQuoted||String(e.value||"").length>60?(o(),n("div",Fe,[e.key&&i(V)(e.key)?(o(),n("div",Ne,[t("textarea",{id:`plugin-${e.key}`,value:e.value,onInput:a=>e.value=a.target.value,rows:"4",class:O({"password-masked":!i(c)[e.key]})},null,42,Ke),t("button",{type:"button",class:"toggle-visibility-btn",onClick:a=>i(S)(e.key),"aria-label":i(c)[e.key]?"隐藏值":"显示值","aria-pressed":i(c)[e.key]},m(i(c)[e.key]?"隐藏":"显示"),9,Te)])):(o(),n("textarea",{key:1,id:`plugin-${e.key}`,value:e.value,onInput:a=>e.value=a.target.value,rows:"4"},null,40,je))])):e.key&&i(V)(e.key)?(o(),n("div",Ae,[C(t("input",{type:i(c)[e.key]?"text":"password",id:`plugin-${e.key}`,"onUpdate:modelValue":a=>e.value=a},null,8,Qe),[[oe,e.value]]),t("button",{type:"button",class:"toggle-visibility-btn",onClick:a=>i(S)(e.key),"aria-label":i(c)[e.key]?"隐藏值":"显示值","aria-pressed":i(c)[e.key]},m(i(c)[e.key]?"隐藏":"显示"),9,Re)])):C((o(),n("input",{key:4,type:"text",id:`plugin-${e.key}`,"onUpdate:modelValue":a=>e.value=a},null,8,ze)),[[P,e.value]]),e.key?(o(),n("span",Le,[I(m(i(q)(e.key))+" ",1),i(A)(e.key)?(o(),n("span",Be,"(当前在插件 .env 中定义)")):i(D)(e.key)?(o(),n("span",Ge,"(使用插件清单默认值)")):(o(),n("span",Xe,"(未设置,将继承全局或为空)"))])):k("",!0)]))),128))])):k("",!0),i(K)||i(J)?(o(),n("div",Je,[r[11]||(r[11]=t("h3",null,"自定义 .env 配置项 (及注释/空行)",-1)),(o(!0),n(ae,null,ee(i(G),(e,s)=>(o(),n("div",{key:e.key||`custom-${s}`,class:"form-group"},[e.isCommentOrEmpty?(o(),n("div",Ye,[t("pre",null,m(e.value),1)])):(o(),n("div",qe,[t("label",{for:`plugin-${e.key}`},[t("span",We,m(e.key),1),e.key&&!i(Y)(e.key)?(o(),n("button",{key:0,type:"button",class:"delete-config-btn",onClick:a=>i(H)(e.key),title:`删除自定义项 ${e.key}`},"×",8,Ze)):k("",!0)],8,He),e.type==="boolean"?(o(),n("div",es,[t("label",ss,[C(t("input",{type:"checkbox",id:`plugin-${e.key}`,"onUpdate:modelValue":a=>e.value=a},null,8,as),[[ne,e.value]]),r[9]||(r[9]=t("span",{class:"slider"},null,-1))]),t("span",null,m(e.value?"启用":"禁用"),1)])):e.type==="integer"?C((o(),n("input",{key:1,type:"number",id:`plugin-${e.key}`,"onUpdate:modelValue":a=>e.value=a},null,8,is)),[[P,e.value,void 0,{number:!0}]]):k("",!0),e.isMultilineQuoted||String(e.value||"").length>60?(o(),n("div",ts,[e.key&&i(V)(e.key)?(o(),n("div",ns,[t("textarea",{id:`plugin-${e.key}`,value:e.value,onInput:a=>e.value=a.target.value,rows:"4",class:O({"password-masked":!i(c)[e.key]})},null,42,os),t("button",{type:"button",class:"toggle-visibility-btn",onClick:a=>i(S)(e.key),"aria-label":i(c)[e.key]?"隐藏值":"显示值","aria-pressed":i(c)[e.key]},m(i(c)[e.key]?"隐藏":"显示"),9,ls)])):(o(),n("textarea",{key:1,id:`plugin-${e.key}`,value:e.value,onInput:a=>e.value=a.target.value,rows:"4"},null,40,us))])):e.key&&i(V)(e.key)?(o(),n("div",rs,[C(t("input",{type:i(c)[e.key]?"text":"password",id:`plugin-${e.key}`,"onUpdate:modelValue":a=>e.value=a},null,8,ds),[[oe,e.value]]),t("button",{type:"button",class:"toggle-visibility-btn",onClick:a=>i(S)(e.key),"aria-label":i(c)[e.key]?"隐藏值":"显示值","aria-pressed":i(c)[e.key]},m(i(c)[e.key]?"隐藏":"显示"),9,cs)])):C((o(),n("input",{key:4,type:"text",id:`plugin-${e.key}`,"onUpdate:modelValue":a=>e.value=a},null,8,vs)),[[P,e.value]]),e.key?(o(),n("span",ms,[I("自定义配置项:"+m(e.key)+" ",1),r[10]||(r[10]=t("span",{class:"defined-in"},"(当前在插件 .env 中定义)",-1))])):k("",!0)]))]))),128))])):k("",!0),i(T).length>0?(o(),n("div",ps,[r[12]||(r[12]=t("h3",null,"调用命令 AI 指令编辑",-1)),(o(!0),n(ae,null,ee(i(T),(e,s)=>(o(),n("div",{key:`cmd-${i(b)(e)||s}`,class:"command-item"},[t("h4",null,"命令: "+m(i(b)(e)),1),t("div",gs,[t("label",{for:`cmd-desc-${i(b)(e)}`},"指令描述 (AI Instructions):",8,fs),C(t("textarea",{id:`cmd-desc-${i(b)(e)}`,class:"command-description-edit",rows:"5","onUpdate:modelValue":a=>i(M)[i(b)(e)]=a},null,8,ks),[[P,i(M)[i(b)(e)]]]),t("button",{type:"button",onClick:a=>W(e),class:"btn-secondary command-save-btn"},"保存此指令描述",8,hs),t("p",{class:O(["status","command-status",i(F)[i(b)(e)]?.type||""])},m(i(F)[i(b)(e)]?.message||""),3)])]))),128))])):k("",!0),t("div",_s,[t("button",{type:"button",class:"btn-secondary",onClick:r[0]||(r[0]=(...e)=>i(Q)&&i(Q)(...e))},"添加自定义配置项"),t("button",ys,"保存 "+m(d.value)+" 配置",1)])],32)])):(o(),n("div",bs,[...r[13]||(r[13]=[t("p",null,"加载插件配置中…",-1)])]))]))}}),Vs=de(Cs,[["__scopeId","data-v-0c1267c3"]]);export{Vs as default}; diff --git a/AdminPanel-Vue/dist/assets/js/PluginsHub-ByTGOvuj.js b/AdminPanel-Vue/dist/assets/js/PluginsHub-Benzjuey.js similarity index 98% rename from AdminPanel-Vue/dist/assets/js/PluginsHub-ByTGOvuj.js rename to AdminPanel-Vue/dist/assets/js/PluginsHub-Benzjuey.js index 6341ff497..5bdc7eb07 100644 --- a/AdminPanel-Vue/dist/assets/js/PluginsHub-ByTGOvuj.js +++ b/AdminPanel-Vue/dist/assets/js/PluginsHub-Benzjuey.js @@ -1 +1 @@ -import{Dt as o,H as ee,N as P,O as se,Q as N,U as M,a as k,c as b,d as _,f as c,g as ae,h as V,j as p,l as e,n as ne,v as te,wt as C}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as ie,l as le,n as re}from"./dashboard-card-news-BnyB_dHU.js";import{D as oe,G as y}from"./dashboard-card-calendar-CA3-tSpi.js";import{i as ue}from"./vue-vendor-BUOVPpjf.js";import{i as de}from"./dashboard-components-LHqMn0M5.js";import{i as ce,n as pe,r as ve}from"./useRecentVisits-ryn7iNG7.js";function U(i){return i.trim().toLowerCase()}function A(i){return i.manifest.name||i.name}function me(i){return i.manifest.displayName?.trim()||A(i)}function be(i,r){const l=i.replace(/\s+/g," ").trim();if(!l)return"该插件暂未提供描述信息。";const u=Array.from(l);return u.length<=r?l:`${u.slice(0,r).join("").trimEnd()}…`}function ge(i,r){const l=Number(r.isPinned)-Number(i.isPinned);if(l!==0)return l;const u=Number(r.enabled)-Number(i.enabled);return u!==0?u:i.displayName.localeCompare(r.displayName,"zh-CN",{sensitivity:"base"})}function _e(i,r){switch(r){case"enabled":return i.enabled;case"disabled":return!i.enabled;case"pinned":return i.isPinned;case"distributed":return i.isDistributed;default:return!0}}function fe(i,r,l){const u=new Set(r);return i.map(d=>{const v=A(d),m=me(d),f=d.manifest.description?.trim()||"";return{plugin:d,pluginName:v,displayName:m,description:f,summary:be(f,l),icon:d.manifest.icon||"extension",enabled:d.enabled,isDistributed:!!d.isDistributed,isPinned:u.has(v),searchText:U([v,m,f].join(" "))}})}function ye(i){return new Map(i.map(r=>[r.pluginName,r]))}function he(i,r){return i.flatMap(l=>{const u=r.get(l);return u?[u]:[]})}function Pe(i){return i.reduce((r,l)=>(r.total+=1,r.enabled+=Number(l.enabled),r.disabled+=+!l.enabled,r.pinned+=Number(l.isPinned),r),{total:0,enabled:0,disabled:0,pinned:0})}function Ne(i,r,l=6){const u=new Set,d=[];for(const v of i){if(!v.pluginName||u.has(v.pluginName))continue;const m=r.get(v.pluginName);if(m&&(u.add(v.pluginName),d.push({pluginName:m.pluginName,label:m.displayName,icon:m.icon}),d.length>=l))break}return d}function ke(i,{query:r,filter:l}){const u=U(r);return i.filter(d=>u?d.searchText.includes(u):!0).filter(d=>_e(d,l)).sort(ge)}var Ce={class:"plugins-hub"},we={class:"hub-hero card"},De={class:"hero-stats"},Te={class:"stat-chip"},$e={class:"stat-chip enabled"},Re={class:"stat-chip disabled"},Se={class:"stat-chip"},xe={class:"card controls-card"},Ve={class:"controls-top"},Le={class:"search-field"},qe=["disabled"],He={class:"filter-row","aria-label":"插件筛选"},ze=["aria-pressed","onClick"],Ee={key:0,class:"quick-grid"},Ge={key:0,class:"card quick-card"},Ie={class:"quick-list"},Me=["onClick"],Ue={class:"material-symbols-outlined"},Ae={key:1,class:"card quick-card"},Be={class:"quick-list"},je=["onClick"],Fe={class:"material-symbols-outlined"},Oe={class:"results-header"},Qe={key:1,class:"card empty-state"},Xe={key:2,class:"plugin-grouped-view"},Ye={class:"type-group-header"},Ze={class:"type-count"},Je=["aria-expanded","aria-controls","onClick"],Ke=["id"],We={class:"plugin-grid"},es={class:"plugin-card-top"},ss={class:"plugin-identity"},as={class:"plugin-icon-shell"},ns={class:"material-symbols-outlined"},ts={class:"plugin-heading"},is={class:"plugin-title-row"},ls={key:0,class:"status-badge status-neutral"},rs={key:1,class:"status-badge status-pinned"},os={class:"plugin-original-name"},us={class:"plugin-card-side"},ds=["title","aria-label","aria-pressed","onClick"],cs={class:"material-symbols-outlined"},ps={class:"plugin-version-badge"},vs={class:"plugin-card-main"},ms=["title"],bs={key:0,class:"plugin-status-pills"},gs={key:0,class:"mini-pill mini-pill--sensitive"},_s={key:1,class:"mini-pill mini-pill--changed"},fs={class:"plugin-actions"},ys=["onClick"],hs=["disabled","title","onClick"],Ps={class:"material-symbols-outlined"},Ns=96,ks=te({__name:"PluginsHub",setup(i){const r=ue(),l=de(),u=N(""),d=N("all"),v=N(!1),m=N([]),f=ce(),L=ve(),D=N({}),B=b(()=>l.plugins),q=b(()=>l.pinnedPluginNames),j=b(()=>l.pluginsLoaded),F=[{value:"all",label:"全部"},{value:"enabled",label:"已启用"},{value:"disabled",label:"已禁用"},{value:"pinned",label:"已固定"},{value:"distributed",label:"分布式"}],O={static:"静态插件",messagePreprocessor:"消息预处理",synchronous:"同步插件",asynchronous:"异步插件",service:"服务插件",hybridservice:"混合服务",unknown:"未标注类型"},T=b(()=>fe(B.value,q.value,Ns)),H=b(()=>ye(T.value)),$=b(()=>he(q.value,H.value)),w=b(()=>Pe(T.value)),R=b(()=>Ne(f.value,H.value)),S=b(()=>ke(T.value,{query:u.value,filter:d.value}));function Q(a){return a.plugin.manifest.pluginType?.trim()||"unknown"}function X(a){return O[a]||a}const z=b(()=>{const a={};for(const s of S.value){const n=Q(s);a[n]||(a[n]=[]),a[n].push(s)}return Object.entries(a).map(([s,n])=>({type:s,label:X(s),records:n})).sort((s,n)=>s.label.localeCompare(n.label,"zh-CN",{sensitivity:"base"}))});function h(a){return D.value[a]??!1}function Y(a){D.value={...D.value,[a]:!h(a)}}function E(a){return`plugin-type-group-content-${a.replace(/[^a-zA-Z0-9_-]/g,"-")}`}function Z(a){return l.isPluginPinned(a)}function G(a){return m.value.includes(a)}function J(a){const s=pe({target:`plugin-${a}-config`,navItems:l.navItems,plugins:l.plugins,recentVisits:f.value,navigationUsage:L.value,pluginName:a});f.value=s.recentVisits,L.value=s.navigationUsage}function x(a){J(a),r.push({name:"PluginConfig",params:{pluginName:a}})}function K(a){const s=!Z(a);l.togglePinnedPlugin(a),y(s?"已固定到侧栏快捷区。":"已从侧栏快捷区移除。","success")}async function I(a=!0){v.value=!0;try{await l.refreshPlugins(),a&&y("插件列表已刷新。","success")}catch(s){y(`刷新插件列表失败:${s instanceof Error?s.message:String(s)}`,"error")}finally{v.value=!1}}async function W(a){if(a.isDistributed){y("分布式插件需要在所属节点侧启停。","warning");return}const s=a.manifest.name||a.name,n=!a.enabled,t=n?"启用":"禁用";if(confirm(`确定要${t}插件 "${a.manifest.displayName?.trim()||s}" 吗?`)){m.value=[...m.value,s];try{y((await oe.togglePlugin(s,n,{showLoader:!1})).message||`${t}插件成功。`,"success"),await I(!1)}catch(g){y(`${t}插件失败:${g instanceof Error?g.message:String(g)}`,"error")}finally{m.value=m.value.filter(g=>g!==s)}}}return se(async()=>{if(!j.value)try{await l.ensurePluginsLoaded()}catch(a){y(`Failed to load plugins: ${a instanceof Error?a.message:String(a)}`,"error")}}),(a,s)=>(p(),c("section",Ce,[e("section",we,[s[6]||(s[6]=e("div",{class:"hero-copy"},[e("span",{class:"hero-eyebrow"},"Plugin Center"),e("h2",null,"插件中心与启用管理"),e("p",null," 集中查看全部插件的启用状态、固定情况与分布式属性,支持搜索、筛选、刷新列表,并可直接进入插件配置或执行启停管理。 ")],-1)),e("div",De,[e("article",Te,[s[2]||(s[2]=e("span",{class:"stat-label"},"总数",-1)),e("strong",null,o(w.value.total),1)]),e("article",$e,[s[3]||(s[3]=e("span",{class:"stat-label"},"已启用",-1)),e("strong",null,o(w.value.enabled),1)]),e("article",Re,[s[4]||(s[4]=e("span",{class:"stat-label"},"已禁用",-1)),e("strong",null,o(w.value.disabled),1)]),e("article",Se,[s[5]||(s[5]=e("span",{class:"stat-label"},"已固定",-1)),e("strong",null,o(w.value.pinned),1)])])]),e("section",xe,[e("div",Ve,[e("label",Le,[s[7]||(s[7]=e("span",{class:"material-symbols-outlined"},"search",-1)),M(e("input",{"onUpdate:modelValue":s[0]||(s[0]=n=>u.value=n),type:"search",placeholder:"搜索插件名称、原始名或描述…","aria-label":"搜索插件"},null,512),[[ie,u.value]])]),e("button",{type:"button",class:"btn-secondary",disabled:v.value,onClick:s[1]||(s[1]=n=>I())},[s[8]||(s[8]=e("span",{class:"material-symbols-outlined"},"refresh",-1)),e("span",null,o(v.value?"刷新中…":"刷新列表"),1)],8,qe)]),e("div",He,[(p(),c(k,null,P(F,n=>e("button",{key:n.value,type:"button",class:C(["filter-pill",{active:d.value===n.value}]),"aria-pressed":d.value===n.value,onClick:t=>d.value=n.value},o(n.label),11,ze)),64))])]),$.value.length>0||R.value.length>0?(p(),c("section",Ee,[$.value.length>0?(p(),c("article",Ge,[s[9]||(s[9]=e("div",{class:"card-header quick-card-header"},[e("h3",{class:"card-title"},[e("span",{class:"material-symbols-outlined"},"keep"),e("span",null,"侧栏固定插件")])],-1)),e("div",Ie,[(p(!0),c(k,null,P($.value,n=>(p(),c("button",{key:n.pluginName,type:"button",class:"quick-link",onClick:t=>x(n.pluginName)},[e("span",Ue,o(n.icon),1),e("span",null,o(n.displayName),1)],8,Me))),128))])])):_("",!0),R.value.length>0?(p(),c("article",Ae,[s[10]||(s[10]=e("div",{class:"card-header quick-card-header"},[e("h3",{class:"card-title"},[e("span",{class:"material-symbols-outlined"},"history"),e("span",null,"最近访问插件")])],-1)),e("div",Be,[(p(!0),c(k,null,P(R.value,n=>(p(),c("button",{key:n.pluginName,type:"button",class:"quick-link",onClick:t=>x(n.pluginName)},[e("span",Fe,o(n.icon),1),e("span",null,o(n.label),1)],8,je))),128))])])):_("",!0)])):_("",!0),e("section",Oe,[e("div",null,[s[11]||(s[11]=e("h3",null,"插件列表",-1)),e("p",null," 共展示 "+o(S.value.length)+" 个结果,按 "+o(z.value.length)+" 个类型分组 ",1)])]),S.value.length===0?(p(),c("section",Qe,[...s[12]||(s[12]=[e("span",{class:"material-symbols-outlined"},"search_off",-1),e("h3",null,"没有匹配的插件",-1),e("p",null,"试试切换筛选条件,或者搜索插件原始名称。",-1)])])):(p(),c("section",Xe,[(p(!0),c(k,null,P(z.value,n=>(p(),c("article",{key:n.type,class:"plugin-type-group"},[e("div",Ye,[e("h3",null,[s[13]||(s[13]=e("span",{class:"material-symbols-outlined"},"folder",-1)),V(" "+o(n.label)+" ",1),e("span",Ze,o(n.records.length),1)]),e("button",{type:"button",class:C(["group-collapse-toggle",{"is-collapsed":h(n.type)}]),"aria-expanded":!h(n.type),"aria-controls":E(n.type),onClick:t=>Y(n.type)},[e("span",null,o(h(n.type)?"展开":"折叠"),1),s[14]||(s[14]=e("span",{class:"material-symbols-outlined group-collapse-icon"},"expand_more",-1))],10,Je)]),ae(re,{name:"group-collapse"},{default:ee(()=>[M(e("div",{id:E(n.type),class:"type-group-content"},[e("div",We,[(p(!0),c(k,null,P(n.records,t=>(p(),c("article",{key:t.pluginName,class:"plugin-card"},[e("div",es,[e("div",ss,[e("div",as,[e("span",ns,o(t.icon),1)]),e("div",ts,[e("div",is,[e("h3",null,o(t.displayName),1),e("span",{class:C(["status-badge",t.enabled?"status-enabled":"status-disabled"])},o(t.enabled?"启用中":"已禁用"),3),t.isDistributed?(p(),c("span",ls," 分布式 ")):_("",!0),t.isPinned?(p(),c("span",rs," 已固定 ")):_("",!0)]),e("p",os,o(t.pluginName),1)])]),e("div",us,[e("button",{type:"button",class:C(["pin-toggle",{"is-active":t.isPinned}]),title:t.isPinned?"取消固定":"固定到侧栏","aria-label":t.isPinned?"取消固定到侧栏":"固定到侧栏","aria-pressed":t.isPinned,onClick:g=>K(t.pluginName)},[e("span",cs,o(t.isPinned?"keep":"keep_off"),1)],10,ds),e("span",ps," v"+o(t.plugin.manifest.version||"0.0.0"),1)])]),e("div",vs,[e("p",{class:"plugin-description",title:t.description||"该插件暂未提供描述信息。"},o(t.summary),9,ms),t.isDistributed||t.isPinned?(p(),c("div",bs,[t.isDistributed?(p(),c("span",gs,[...s[15]||(s[15]=[e("span",{class:"material-symbols-outlined mini-pill-icon"},"hub",-1),V(" 分布式 ",-1)])])):_("",!0),t.isPinned?(p(),c("span",_s,[...s[16]||(s[16]=[e("span",{class:"material-symbols-outlined mini-pill-icon"},"push_pin",-1),V(" 已固定 ",-1)])])):_("",!0)])):_("",!0),e("div",fs,[e("button",{type:"button",class:"btn-primary",onClick:g=>x(t.pluginName)},[...s[17]||(s[17]=[e("span",{class:"material-symbols-outlined"},"open_in_new",-1),e("span",null,"打开配置",-1)])],8,ys),e("button",{type:"button",class:C(t.enabled?"btn-danger":"btn-secondary"),disabled:t.isDistributed||G(t.pluginName),title:t.isDistributed?"分布式插件状态由所属节点管理":void 0,onClick:g=>W(t.plugin)},[e("span",Ps,o(t.enabled?"power_settings_new":"bolt"),1),e("span",null,o(G(t.pluginName)?"处理中…":t.enabled?"禁用插件":"启用插件"),1)],10,hs)])])]))),128))])],8,Ke),[[le,!h(n.type)]])]),_:2},1024)]))),128))]))]))}}),Ss=ne(ks,[["__scopeId","data-v-64eadfb0"]]);export{Ss as default}; +import{Dt as o,H as ee,N as P,O as se,Q as N,U as M,a as k,c as b,d as _,f as c,g as ae,h as V,j as p,l as e,n as ne,v as te,wt as C}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as ie,l as le,n as re}from"./dashboard-card-news-BnyB_dHU.js";import{D as oe,G as y}from"./dashboard-card-calendar-DWuV34Bn.js";import{i as ue}from"./vue-vendor-BUOVPpjf.js";import{i as de}from"./dashboard-components-B8tHL6X6.js";import{i as ce,n as pe,r as ve}from"./useRecentVisits-Cv1J7k25.js";function U(i){return i.trim().toLowerCase()}function A(i){return i.manifest.name||i.name}function me(i){return i.manifest.displayName?.trim()||A(i)}function be(i,r){const l=i.replace(/\s+/g," ").trim();if(!l)return"该插件暂未提供描述信息。";const u=Array.from(l);return u.length<=r?l:`${u.slice(0,r).join("").trimEnd()}…`}function ge(i,r){const l=Number(r.isPinned)-Number(i.isPinned);if(l!==0)return l;const u=Number(r.enabled)-Number(i.enabled);return u!==0?u:i.displayName.localeCompare(r.displayName,"zh-CN",{sensitivity:"base"})}function _e(i,r){switch(r){case"enabled":return i.enabled;case"disabled":return!i.enabled;case"pinned":return i.isPinned;case"distributed":return i.isDistributed;default:return!0}}function fe(i,r,l){const u=new Set(r);return i.map(d=>{const v=A(d),m=me(d),f=d.manifest.description?.trim()||"";return{plugin:d,pluginName:v,displayName:m,description:f,summary:be(f,l),icon:d.manifest.icon||"extension",enabled:d.enabled,isDistributed:!!d.isDistributed,isPinned:u.has(v),searchText:U([v,m,f].join(" "))}})}function ye(i){return new Map(i.map(r=>[r.pluginName,r]))}function he(i,r){return i.flatMap(l=>{const u=r.get(l);return u?[u]:[]})}function Pe(i){return i.reduce((r,l)=>(r.total+=1,r.enabled+=Number(l.enabled),r.disabled+=+!l.enabled,r.pinned+=Number(l.isPinned),r),{total:0,enabled:0,disabled:0,pinned:0})}function Ne(i,r,l=6){const u=new Set,d=[];for(const v of i){if(!v.pluginName||u.has(v.pluginName))continue;const m=r.get(v.pluginName);if(m&&(u.add(v.pluginName),d.push({pluginName:m.pluginName,label:m.displayName,icon:m.icon}),d.length>=l))break}return d}function ke(i,{query:r,filter:l}){const u=U(r);return i.filter(d=>u?d.searchText.includes(u):!0).filter(d=>_e(d,l)).sort(ge)}var Ce={class:"plugins-hub"},we={class:"hub-hero card"},De={class:"hero-stats"},Te={class:"stat-chip"},$e={class:"stat-chip enabled"},Re={class:"stat-chip disabled"},Se={class:"stat-chip"},xe={class:"card controls-card"},Ve={class:"controls-top"},Le={class:"search-field"},qe=["disabled"],He={class:"filter-row","aria-label":"插件筛选"},ze=["aria-pressed","onClick"],Ee={key:0,class:"quick-grid"},Ge={key:0,class:"card quick-card"},Ie={class:"quick-list"},Me=["onClick"],Ue={class:"material-symbols-outlined"},Ae={key:1,class:"card quick-card"},Be={class:"quick-list"},je=["onClick"],Fe={class:"material-symbols-outlined"},Oe={class:"results-header"},Qe={key:1,class:"card empty-state"},Xe={key:2,class:"plugin-grouped-view"},Ye={class:"type-group-header"},Ze={class:"type-count"},Je=["aria-expanded","aria-controls","onClick"],Ke=["id"],We={class:"plugin-grid"},es={class:"plugin-card-top"},ss={class:"plugin-identity"},as={class:"plugin-icon-shell"},ns={class:"material-symbols-outlined"},ts={class:"plugin-heading"},is={class:"plugin-title-row"},ls={key:0,class:"status-badge status-neutral"},rs={key:1,class:"status-badge status-pinned"},os={class:"plugin-original-name"},us={class:"plugin-card-side"},ds=["title","aria-label","aria-pressed","onClick"],cs={class:"material-symbols-outlined"},ps={class:"plugin-version-badge"},vs={class:"plugin-card-main"},ms=["title"],bs={key:0,class:"plugin-status-pills"},gs={key:0,class:"mini-pill mini-pill--sensitive"},_s={key:1,class:"mini-pill mini-pill--changed"},fs={class:"plugin-actions"},ys=["onClick"],hs=["disabled","title","onClick"],Ps={class:"material-symbols-outlined"},Ns=96,ks=te({__name:"PluginsHub",setup(i){const r=ue(),l=de(),u=N(""),d=N("all"),v=N(!1),m=N([]),f=ce(),L=ve(),D=N({}),B=b(()=>l.plugins),q=b(()=>l.pinnedPluginNames),j=b(()=>l.pluginsLoaded),F=[{value:"all",label:"全部"},{value:"enabled",label:"已启用"},{value:"disabled",label:"已禁用"},{value:"pinned",label:"已固定"},{value:"distributed",label:"分布式"}],O={static:"静态插件",messagePreprocessor:"消息预处理",synchronous:"同步插件",asynchronous:"异步插件",service:"服务插件",hybridservice:"混合服务",unknown:"未标注类型"},T=b(()=>fe(B.value,q.value,Ns)),H=b(()=>ye(T.value)),$=b(()=>he(q.value,H.value)),w=b(()=>Pe(T.value)),R=b(()=>Ne(f.value,H.value)),S=b(()=>ke(T.value,{query:u.value,filter:d.value}));function Q(a){return a.plugin.manifest.pluginType?.trim()||"unknown"}function X(a){return O[a]||a}const z=b(()=>{const a={};for(const s of S.value){const n=Q(s);a[n]||(a[n]=[]),a[n].push(s)}return Object.entries(a).map(([s,n])=>({type:s,label:X(s),records:n})).sort((s,n)=>s.label.localeCompare(n.label,"zh-CN",{sensitivity:"base"}))});function h(a){return D.value[a]??!1}function Y(a){D.value={...D.value,[a]:!h(a)}}function E(a){return`plugin-type-group-content-${a.replace(/[^a-zA-Z0-9_-]/g,"-")}`}function Z(a){return l.isPluginPinned(a)}function G(a){return m.value.includes(a)}function J(a){const s=pe({target:`plugin-${a}-config`,navItems:l.navItems,plugins:l.plugins,recentVisits:f.value,navigationUsage:L.value,pluginName:a});f.value=s.recentVisits,L.value=s.navigationUsage}function x(a){J(a),r.push({name:"PluginConfig",params:{pluginName:a}})}function K(a){const s=!Z(a);l.togglePinnedPlugin(a),y(s?"已固定到侧栏快捷区。":"已从侧栏快捷区移除。","success")}async function I(a=!0){v.value=!0;try{await l.refreshPlugins(),a&&y("插件列表已刷新。","success")}catch(s){y(`刷新插件列表失败:${s instanceof Error?s.message:String(s)}`,"error")}finally{v.value=!1}}async function W(a){if(a.isDistributed){y("分布式插件需要在所属节点侧启停。","warning");return}const s=a.manifest.name||a.name,n=!a.enabled,t=n?"启用":"禁用";if(confirm(`确定要${t}插件 "${a.manifest.displayName?.trim()||s}" 吗?`)){m.value=[...m.value,s];try{y((await oe.togglePlugin(s,n,{showLoader:!1})).message||`${t}插件成功。`,"success"),await I(!1)}catch(g){y(`${t}插件失败:${g instanceof Error?g.message:String(g)}`,"error")}finally{m.value=m.value.filter(g=>g!==s)}}}return se(async()=>{if(!j.value)try{await l.ensurePluginsLoaded()}catch(a){y(`Failed to load plugins: ${a instanceof Error?a.message:String(a)}`,"error")}}),(a,s)=>(p(),c("section",Ce,[e("section",we,[s[6]||(s[6]=e("div",{class:"hero-copy"},[e("span",{class:"hero-eyebrow"},"Plugin Center"),e("h2",null,"插件中心与启用管理"),e("p",null," 集中查看全部插件的启用状态、固定情况与分布式属性,支持搜索、筛选、刷新列表,并可直接进入插件配置或执行启停管理。 ")],-1)),e("div",De,[e("article",Te,[s[2]||(s[2]=e("span",{class:"stat-label"},"总数",-1)),e("strong",null,o(w.value.total),1)]),e("article",$e,[s[3]||(s[3]=e("span",{class:"stat-label"},"已启用",-1)),e("strong",null,o(w.value.enabled),1)]),e("article",Re,[s[4]||(s[4]=e("span",{class:"stat-label"},"已禁用",-1)),e("strong",null,o(w.value.disabled),1)]),e("article",Se,[s[5]||(s[5]=e("span",{class:"stat-label"},"已固定",-1)),e("strong",null,o(w.value.pinned),1)])])]),e("section",xe,[e("div",Ve,[e("label",Le,[s[7]||(s[7]=e("span",{class:"material-symbols-outlined"},"search",-1)),M(e("input",{"onUpdate:modelValue":s[0]||(s[0]=n=>u.value=n),type:"search",placeholder:"搜索插件名称、原始名或描述…","aria-label":"搜索插件"},null,512),[[ie,u.value]])]),e("button",{type:"button",class:"btn-secondary",disabled:v.value,onClick:s[1]||(s[1]=n=>I())},[s[8]||(s[8]=e("span",{class:"material-symbols-outlined"},"refresh",-1)),e("span",null,o(v.value?"刷新中…":"刷新列表"),1)],8,qe)]),e("div",He,[(p(),c(k,null,P(F,n=>e("button",{key:n.value,type:"button",class:C(["filter-pill",{active:d.value===n.value}]),"aria-pressed":d.value===n.value,onClick:t=>d.value=n.value},o(n.label),11,ze)),64))])]),$.value.length>0||R.value.length>0?(p(),c("section",Ee,[$.value.length>0?(p(),c("article",Ge,[s[9]||(s[9]=e("div",{class:"card-header quick-card-header"},[e("h3",{class:"card-title"},[e("span",{class:"material-symbols-outlined"},"keep"),e("span",null,"侧栏固定插件")])],-1)),e("div",Ie,[(p(!0),c(k,null,P($.value,n=>(p(),c("button",{key:n.pluginName,type:"button",class:"quick-link",onClick:t=>x(n.pluginName)},[e("span",Ue,o(n.icon),1),e("span",null,o(n.displayName),1)],8,Me))),128))])])):_("",!0),R.value.length>0?(p(),c("article",Ae,[s[10]||(s[10]=e("div",{class:"card-header quick-card-header"},[e("h3",{class:"card-title"},[e("span",{class:"material-symbols-outlined"},"history"),e("span",null,"最近访问插件")])],-1)),e("div",Be,[(p(!0),c(k,null,P(R.value,n=>(p(),c("button",{key:n.pluginName,type:"button",class:"quick-link",onClick:t=>x(n.pluginName)},[e("span",Fe,o(n.icon),1),e("span",null,o(n.label),1)],8,je))),128))])])):_("",!0)])):_("",!0),e("section",Oe,[e("div",null,[s[11]||(s[11]=e("h3",null,"插件列表",-1)),e("p",null," 共展示 "+o(S.value.length)+" 个结果,按 "+o(z.value.length)+" 个类型分组 ",1)])]),S.value.length===0?(p(),c("section",Qe,[...s[12]||(s[12]=[e("span",{class:"material-symbols-outlined"},"search_off",-1),e("h3",null,"没有匹配的插件",-1),e("p",null,"试试切换筛选条件,或者搜索插件原始名称。",-1)])])):(p(),c("section",Xe,[(p(!0),c(k,null,P(z.value,n=>(p(),c("article",{key:n.type,class:"plugin-type-group"},[e("div",Ye,[e("h3",null,[s[13]||(s[13]=e("span",{class:"material-symbols-outlined"},"folder",-1)),V(" "+o(n.label)+" ",1),e("span",Ze,o(n.records.length),1)]),e("button",{type:"button",class:C(["group-collapse-toggle",{"is-collapsed":h(n.type)}]),"aria-expanded":!h(n.type),"aria-controls":E(n.type),onClick:t=>Y(n.type)},[e("span",null,o(h(n.type)?"展开":"折叠"),1),s[14]||(s[14]=e("span",{class:"material-symbols-outlined group-collapse-icon"},"expand_more",-1))],10,Je)]),ae(re,{name:"group-collapse"},{default:ee(()=>[M(e("div",{id:E(n.type),class:"type-group-content"},[e("div",We,[(p(!0),c(k,null,P(n.records,t=>(p(),c("article",{key:t.pluginName,class:"plugin-card"},[e("div",es,[e("div",ss,[e("div",as,[e("span",ns,o(t.icon),1)]),e("div",ts,[e("div",is,[e("h3",null,o(t.displayName),1),e("span",{class:C(["status-badge",t.enabled?"status-enabled":"status-disabled"])},o(t.enabled?"启用中":"已禁用"),3),t.isDistributed?(p(),c("span",ls," 分布式 ")):_("",!0),t.isPinned?(p(),c("span",rs," 已固定 ")):_("",!0)]),e("p",os,o(t.pluginName),1)])]),e("div",us,[e("button",{type:"button",class:C(["pin-toggle",{"is-active":t.isPinned}]),title:t.isPinned?"取消固定":"固定到侧栏","aria-label":t.isPinned?"取消固定到侧栏":"固定到侧栏","aria-pressed":t.isPinned,onClick:g=>K(t.pluginName)},[e("span",cs,o(t.isPinned?"keep":"keep_off"),1)],10,ds),e("span",ps," v"+o(t.plugin.manifest.version||"0.0.0"),1)])]),e("div",vs,[e("p",{class:"plugin-description",title:t.description||"该插件暂未提供描述信息。"},o(t.summary),9,ms),t.isDistributed||t.isPinned?(p(),c("div",bs,[t.isDistributed?(p(),c("span",gs,[...s[15]||(s[15]=[e("span",{class:"material-symbols-outlined mini-pill-icon"},"hub",-1),V(" 分布式 ",-1)])])):_("",!0),t.isPinned?(p(),c("span",_s,[...s[16]||(s[16]=[e("span",{class:"material-symbols-outlined mini-pill-icon"},"push_pin",-1),V(" 已固定 ",-1)])])):_("",!0)])):_("",!0),e("div",fs,[e("button",{type:"button",class:"btn-primary",onClick:g=>x(t.pluginName)},[...s[17]||(s[17]=[e("span",{class:"material-symbols-outlined"},"open_in_new",-1),e("span",null,"打开配置",-1)])],8,ys),e("button",{type:"button",class:C(t.enabled?"btn-danger":"btn-secondary"),disabled:t.isDistributed||G(t.pluginName),title:t.isDistributed?"分布式插件状态由所属节点管理":void 0,onClick:g=>W(t.plugin)},[e("span",Ps,o(t.enabled?"power_settings_new":"bolt"),1),e("span",null,o(G(t.pluginName)?"处理中…":t.enabled?"禁用插件":"启用插件"),1)],10,hs)])])]))),128))])],8,Ke),[[le,!h(n.type)]])]),_:2},1024)]))),128))]))]))}}),Ss=ne(ks,[["__scopeId","data-v-64eadfb0"]]);export{Ss as default}; diff --git a/AdminPanel-Vue/dist/assets/js/PreprocessorOrderManager-CHo2dl-z.js b/AdminPanel-Vue/dist/assets/js/PreprocessorOrderManager-DZK3zVsY.js similarity index 98% rename from AdminPanel-Vue/dist/assets/js/PreprocessorOrderManager-CHo2dl-z.js rename to AdminPanel-Vue/dist/assets/js/PreprocessorOrderManager-DZK3zVsY.js index 5e4f71230..6091bc3cd 100644 --- a/AdminPanel-Vue/dist/assets/js/PreprocessorOrderManager-CHo2dl-z.js +++ b/AdminPanel-Vue/dist/assets/js/PreprocessorOrderManager-DZK3zVsY.js @@ -1 +1 @@ -import{Dt as f,H as z,N as Q,O as U,Q as u,a as W,at as a,c as X,d as E,f as p,g as q,j as m,l as i,n as J,v as R,wt as H}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{r as Y}from"./dashboard-card-news-BnyB_dHU.js";import{G as N,P as Z,T as S}from"./dashboard-card-calendar-CA3-tSpi.js";import{n as ee,t as re}from"./pointerReorder-DgfeRZqx.js";import{t as ae}from"./usePointerDragSession-B6CxeZBm.js";var T=Z("PreprocessorOrderManager");function se(){const o=u([]),_=u(""),d=u("info"),n=u(null),c=u(null),l=u(null),h=u("after"),O=X(()=>{if(!n.value)return o.value;const e=new Map(o.value.map(r=>[r.name,r]));return n.value.map(r=>e.get(r)).filter(r=>r!==void 0)});function M(){return o.value.map(e=>e.name)}function k(){return n.value??M()}function w(e){const r=new Map(o.value.map(s=>[s.name,s]));o.value=e.map(s=>r.get(s)).filter(s=>s!==void 0)}function x(e,r){const s=c.value;if(!s||typeof document>"u")return;const v=document.elementFromPoint(e,r);if(!(v instanceof Element)){l.value=null;return}const P=k(),G=v.closest("[data-preprocessor-name]"),K=v.closest('[data-preprocessor-list="true"]');let y=null,b="after";if(G?(y=G.dataset.preprocessorName??null,b=re(G,r)):K&&P.length>0&&(y=P[P.length-1]??null,b="after"),!y){l.value=null;return}const L=ee(P,s,y,b),A=L.some(($,j)=>$!==P[j]);l.value=A?y:null,h.value=b,A&&(n.value=L)}const{dragGhost:g,dragGhostElement:t,startPointerDrag:C,handlePointerMove:D,handlePointerUp:B}=ae({ghostScale:1.015,createGhost:({pluginName:e})=>{const r=o.value.find(s=>s.name===e)??null;return r?{label:r.displayName||r.name,description:r.description}:null},onActivate:({item:e})=>{c.value=e.pluginName,n.value=M()},onFrame:e=>{x(e.currentX,e.currentY)},onCommit:()=>{n.value&&w(n.value)},onClear:()=>{n.value=null,c.value=null,l.value=null,h.value="after"}});async function I(){try{T.debug("Loading preprocessors...");const e=await S.getPreprocessorOrder({showLoader:!1,loadingKey:"preprocessors.order.load"});if(!Array.isArray(e)){T.error("Preprocessor order API did not return an array:",e),N("获取预处理器列表失败:返回数据格式错误","error"),o.value=[];return}if(e.length===0){N("未找到预处理器插件","info"),o.value=[];return}o.value=e.map(r=>({name:r.name,displayName:r.displayName||r.name,description:r.description}))}catch(e){const r=e instanceof Error?e.message:String(e);T.error("Failed to load preprocessors:",e),N(`加载预处理器列表失败:${r}`,"error"),o.value=[]}}function F(e,r){const s=r.currentTarget;if(!(s instanceof HTMLElement))return;const v=s.closest("[data-preprocessor-name]");v instanceof HTMLElement&&C({item:{pluginName:e},event:r,itemElement:v,captureElement:s})}async function V(){try{await S.savePreprocessorOrder(o.value.map(e=>e.name),{loadingKey:"preprocessors.order.save"}),_.value="顺序已保存!",d.value="success",N("顺序已保存!","success")}catch(e){_.value=`保存失败:${e instanceof Error?e.message:String(e)}`,d.value="error"}}return U(()=>{I()}),{orderedPreprocessors:O,preprocessors:o,draggingPluginName:c,dragOverPluginName:l,dropPlacement:h,dragGhost:g,dragGhostElement:t,statusMessage:_,statusType:d,loadPreprocessors:I,handleDragHandlePointerDown:F,handlePointerMove:D,handlePointerUp:B,saveOrder:V}}var te={class:"config-section active-section"},oe={class:"preprocessor-order-controls"},ne=["data-preprocessor-name"],le=["onPointerdown"],ie={class:"plugin-index"},de={class:"plugin-copy"},ce={class:"plugin-name"},ue={key:0,class:"plugin-description"},pe={class:"preprocessor-drag-ghost-shell"},me={class:"preprocessor-drag-ghost-title"},ge={key:0,class:"preprocessor-drag-ghost-meta"},ve=R({__name:"PreprocessorOrderManager",setup(o){const{orderedPreprocessors:_,draggingPluginName:d,dragOverPluginName:n,dropPlacement:c,dragGhost:l,dragGhostElement:h,statusMessage:O,statusType:M,handleDragHandlePointerDown:k,saveOrder:w}=se();return(x,g)=>(m(),p("section",te,[g[1]||(g[1]=i("p",{class:"description"}," 在这里,您可以调整消息预处理器的执行顺序。按住左侧手柄拖动时会实时预览落位, 越靠上的插件越优先执行。 ",-1)),i("div",oe,[i("button",{onClick:g[0]||(g[0]=(...t)=>a(w)&&a(w)(...t)),class:"btn-primary"},"保存顺序并热重载"),a(O)?(m(),p("span",{key:0,class:H(["status-message",a(M)])},f(a(O)),3)):E("",!0)]),q(Y,{id:"preprocessor-list",tag:"ul",name:"drag-sort",class:"draggable-list","data-preprocessor-list":"true"},{default:z(()=>[(m(!0),p(W,null,Q(a(_),(t,C)=>(m(),p("li",{key:t.name,"data-preprocessor-name":t.name,class:H(["draggable-item",{"draggable-item--dragging":a(d)===t.name,"draggable-item--drop-before":a(d)!==null&&a(n)===t.name&&a(c)==="before","draggable-item--drop-after":a(d)!==null&&a(n)===t.name&&a(c)==="after"}])},[i("button",{type:"button",class:"drag-handle","aria-label":"拖动排序",title:"拖动排序",onPointerdown:D=>a(k)(t.name,D)}," ☰ ",40,le),i("span",ie,f(C+1)+".",1),i("span",de,[i("span",ce,f(t.displayName||t.name),1),t.description?(m(),p("span",ue,f(t.description),1)):E("",!0)])],10,ne))),128))]),_:1}),a(l)?(m(),p("div",{key:0,ref_key:"dragGhostElement",ref:h,class:"preprocessor-drag-ghost"},[i("div",pe,[i("div",me,f(a(l).label),1),a(l).description?(m(),p("div",ge,f(a(l).description),1)):E("",!0)])],512)):E("",!0)]))}}),Oe=J(ve,[["__scopeId","data-v-491909d4"]]);export{Oe as default}; +import{Dt as f,H as z,N as Q,O as U,Q as u,a as W,at as a,c as X,d as E,f as p,g as q,j as m,l as i,n as J,v as R,wt as H}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{r as Y}from"./dashboard-card-news-BnyB_dHU.js";import{G as N,P as Z,T as S}from"./dashboard-card-calendar-DWuV34Bn.js";import{n as ee,t as re}from"./pointerReorder-DgfeRZqx.js";import{t as ae}from"./usePointerDragSession-B6CxeZBm.js";var T=Z("PreprocessorOrderManager");function se(){const o=u([]),_=u(""),d=u("info"),n=u(null),c=u(null),l=u(null),h=u("after"),O=X(()=>{if(!n.value)return o.value;const e=new Map(o.value.map(r=>[r.name,r]));return n.value.map(r=>e.get(r)).filter(r=>r!==void 0)});function M(){return o.value.map(e=>e.name)}function k(){return n.value??M()}function w(e){const r=new Map(o.value.map(s=>[s.name,s]));o.value=e.map(s=>r.get(s)).filter(s=>s!==void 0)}function x(e,r){const s=c.value;if(!s||typeof document>"u")return;const v=document.elementFromPoint(e,r);if(!(v instanceof Element)){l.value=null;return}const P=k(),G=v.closest("[data-preprocessor-name]"),K=v.closest('[data-preprocessor-list="true"]');let y=null,b="after";if(G?(y=G.dataset.preprocessorName??null,b=re(G,r)):K&&P.length>0&&(y=P[P.length-1]??null,b="after"),!y){l.value=null;return}const L=ee(P,s,y,b),A=L.some(($,j)=>$!==P[j]);l.value=A?y:null,h.value=b,A&&(n.value=L)}const{dragGhost:g,dragGhostElement:t,startPointerDrag:C,handlePointerMove:D,handlePointerUp:B}=ae({ghostScale:1.015,createGhost:({pluginName:e})=>{const r=o.value.find(s=>s.name===e)??null;return r?{label:r.displayName||r.name,description:r.description}:null},onActivate:({item:e})=>{c.value=e.pluginName,n.value=M()},onFrame:e=>{x(e.currentX,e.currentY)},onCommit:()=>{n.value&&w(n.value)},onClear:()=>{n.value=null,c.value=null,l.value=null,h.value="after"}});async function I(){try{T.debug("Loading preprocessors...");const e=await S.getPreprocessorOrder({showLoader:!1,loadingKey:"preprocessors.order.load"});if(!Array.isArray(e)){T.error("Preprocessor order API did not return an array:",e),N("获取预处理器列表失败:返回数据格式错误","error"),o.value=[];return}if(e.length===0){N("未找到预处理器插件","info"),o.value=[];return}o.value=e.map(r=>({name:r.name,displayName:r.displayName||r.name,description:r.description}))}catch(e){const r=e instanceof Error?e.message:String(e);T.error("Failed to load preprocessors:",e),N(`加载预处理器列表失败:${r}`,"error"),o.value=[]}}function F(e,r){const s=r.currentTarget;if(!(s instanceof HTMLElement))return;const v=s.closest("[data-preprocessor-name]");v instanceof HTMLElement&&C({item:{pluginName:e},event:r,itemElement:v,captureElement:s})}async function V(){try{await S.savePreprocessorOrder(o.value.map(e=>e.name),{loadingKey:"preprocessors.order.save"}),_.value="顺序已保存!",d.value="success",N("顺序已保存!","success")}catch(e){_.value=`保存失败:${e instanceof Error?e.message:String(e)}`,d.value="error"}}return U(()=>{I()}),{orderedPreprocessors:O,preprocessors:o,draggingPluginName:c,dragOverPluginName:l,dropPlacement:h,dragGhost:g,dragGhostElement:t,statusMessage:_,statusType:d,loadPreprocessors:I,handleDragHandlePointerDown:F,handlePointerMove:D,handlePointerUp:B,saveOrder:V}}var te={class:"config-section active-section"},oe={class:"preprocessor-order-controls"},ne=["data-preprocessor-name"],le=["onPointerdown"],ie={class:"plugin-index"},de={class:"plugin-copy"},ce={class:"plugin-name"},ue={key:0,class:"plugin-description"},pe={class:"preprocessor-drag-ghost-shell"},me={class:"preprocessor-drag-ghost-title"},ge={key:0,class:"preprocessor-drag-ghost-meta"},ve=R({__name:"PreprocessorOrderManager",setup(o){const{orderedPreprocessors:_,draggingPluginName:d,dragOverPluginName:n,dropPlacement:c,dragGhost:l,dragGhostElement:h,statusMessage:O,statusType:M,handleDragHandlePointerDown:k,saveOrder:w}=se();return(x,g)=>(m(),p("section",te,[g[1]||(g[1]=i("p",{class:"description"}," 在这里,您可以调整消息预处理器的执行顺序。按住左侧手柄拖动时会实时预览落位, 越靠上的插件越优先执行。 ",-1)),i("div",oe,[i("button",{onClick:g[0]||(g[0]=(...t)=>a(w)&&a(w)(...t)),class:"btn-primary"},"保存顺序并热重载"),a(O)?(m(),p("span",{key:0,class:H(["status-message",a(M)])},f(a(O)),3)):E("",!0)]),q(Y,{id:"preprocessor-list",tag:"ul",name:"drag-sort",class:"draggable-list","data-preprocessor-list":"true"},{default:z(()=>[(m(!0),p(W,null,Q(a(_),(t,C)=>(m(),p("li",{key:t.name,"data-preprocessor-name":t.name,class:H(["draggable-item",{"draggable-item--dragging":a(d)===t.name,"draggable-item--drop-before":a(d)!==null&&a(n)===t.name&&a(c)==="before","draggable-item--drop-after":a(d)!==null&&a(n)===t.name&&a(c)==="after"}])},[i("button",{type:"button",class:"drag-handle","aria-label":"拖动排序",title:"拖动排序",onPointerdown:D=>a(k)(t.name,D)}," ☰ ",40,le),i("span",ie,f(C+1)+".",1),i("span",de,[i("span",ce,f(t.displayName||t.name),1),t.description?(m(),p("span",ue,f(t.description),1)):E("",!0)])],10,ne))),128))]),_:1}),a(l)?(m(),p("div",{key:0,ref_key:"dragGhostElement",ref:h,class:"preprocessor-drag-ghost"},[i("div",pe,[i("div",me,f(a(l).label),1),a(l).description?(m(),p("div",ge,f(a(l).description),1)):E("",!0)])],512)):E("",!0)]))}}),Oe=J(ve,[["__scopeId","data-v-491909d4"]]);export{Oe as default}; diff --git a/AdminPanel-Vue/dist/assets/js/RagTuning-BuwlhCjW.js b/AdminPanel-Vue/dist/assets/js/RagTuning-CIyHJpOe.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/RagTuning-BuwlhCjW.js rename to AdminPanel-Vue/dist/assets/js/RagTuning-CIyHJpOe.js index ba9d533af..d95192d78 100644 --- a/AdminPanel-Vue/dist/assets/js/RagTuning-BuwlhCjW.js +++ b/AdminPanel-Vue/dist/assets/js/RagTuning-CIyHJpOe.js @@ -1 +1 @@ -import{Dt as r,E as Le,Et as de,N as M,O as xe,Q as R,U as Z,V as Re,a as k,at as g,c as f,d as p,f as u,h as j,j as d,k as Me,l as e,n as ue,o as Te,u as me,v as ce,wt as I}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as q,d as Ae}from"./dashboard-card-news-BnyB_dHU.js";import{G as se,b as oe}from"./dashboard-card-calendar-CA3-tSpi.js";var ve=["tensionThreshold","baseMomentum","baseDecay","wormholeDecay"],G=[{id:"trigger",title:"触发与点火",summary:"决定什么时候跨域跳转,以及首次跳跃时带着多少动量起步。",icon:"bolt",keys:["tensionThreshold","firingThreshold","baseMomentum"]},{id:"spread",title:"扩散边界",summary:"限制跳几层、扩多宽、以及允许多少新节点重新回流主召回链路。",icon:"hub",keys:["maxSafeHops","maxEmergentNodes","maxNeighborsPerNode"]},{id:"decay",title:"衰减与稳定",summary:"控制常规传播与虫洞传播的能量保留,决定探索能走多远也决定噪声会不会放大。",icon:"vital_signs",keys:["baseDecay","wormholeDecay"]}],De={title:"未命名参数组",description:"该参数组暂时没有补充说明。",icon:"tune",accent:"rgba(56, 189, 248, 0.5)",badge:"待整理"},Ne={label:"未命名参数",summary:"该参数暂时没有补充说明。",tone:"stable"},ne=["ContextFoldingV2","RAGDiaryPlugin","KnowledgeBaseManager"],Se={ContextFoldingV2:{title:"上下文折叠层",description:"负责根据语义相似度和逻辑聚焦度自动折叠远距离 AI 输出,控制上下文窗口大小。",icon:"unfold_less",accent:"rgba(167, 139, 250, 0.55)",badge:"上下文控制"},RAGDiaryPlugin:{title:"感知与裁剪层",description:"负责标签感知、时间衰减与主检索权重,是浪潮 RAG 的第一道调制面。",icon:"flare",accent:"rgba(56, 189, 248, 0.55)",badge:"输入前置"},KnowledgeBaseManager:{title:"增强与路由层",description:"负责残差激活、语言补偿、去重和虫洞传播,决定系统是稳还是敢跳。",icon:"hub",accent:"rgba(251, 191, 36, 0.55)",badge:"检索后段"}},Ee={ContextFoldingV2:{thresholdBase:{label:"折叠阈值基准",summary:"上下文语义折叠V2的相似度判定基准线。相似度低于此值的远距离AI输出会被折叠为摘要。",logic:"调高(如0.60):更激进地折叠,只有高度相关的内容保留原文;调低(如0.40):更保守,大部分内容保留原文。",range:"建议区间: 0.35 ~ 0.65",tone:"sensitive"},thresholdRange:{label:"折叠阈值动态范围",summary:"阈值受逻辑深度(L)和语义宽度(S)调节后的上下限范围。",logic:"下限越低越保守(语义宽泛时保留更多);上限越高越激进(逻辑聚焦时折叠更多)。",range:"建议区间: [0.30, 0.70]",tone:"sensitive",tupleLabels:["下限","上限"]},lWeight:{label:"逻辑深度(L)系数",summary:"逻辑深度对阈值的调节力度。L高表示对话逻辑聚焦,阈值会升高以更激进地折叠无关内容。",logic:"调高:L对阈值的影响更大,聚焦对话时折叠更激进;调低:L影响减弱,对话焦点变化不会显著改变折叠行为。",range:"建议区间: 0.02 ~ 0.15",tone:"sensitive"},sWeight:{label:"语义宽度(S)系数",summary:"语义宽度对阈值的调节力度。S高表示对话语义宽泛,阈值会降低以保守保留更多上下文。",logic:"调高:S对阈值的影响更大,宽泛对话时折叠更保守;调低:S影响减弱,语义宽度变化不会显著改变折叠行为。",range:"建议区间: 0.02 ~ 0.15",tone:"sensitive"}},RAGDiaryPlugin:{noise_penalty:{label:"语义宽度惩罚",summary:"抑制对话发散时的标签误触发,避免噪音上下文把检索带偏。",logic:"调高后更保守,调低后更愿意从散乱上下文里寻找关联。",range:"建议 0.01 ~ 0.20",tone:"sensitive"},tagWeightRange:{label:"标签权重映射区间",summary:"决定标签得分在最终检索向量里最多能占到多少比重。",logic:"上限越高,结果越容易被标签牵引;下限越高,弱标签也更容易留下来。",range:"建议下限 0.01 ~ 0.10;上限 0.30 ~ 0.60",tone:"sensitive",tupleLabels:["最小权重","最大权重"]},tagTruncationBase:{label:"标签截断基准",summary:"定义默认保留多少比例的高分标签,控制召回的精简程度。",logic:"值越高越保留长尾标签,值越低越只保留核心标签。",range:"建议 0.40 ~ 0.80",tone:"stable"},tagTruncationRange:{label:"标签截断动态范围",summary:"给截断比例一个可上下摆动的活动区间,允许系统按语义强度自适应收放。",logic:"区间越宽,系统越愿意根据上下文自动放宽或收紧标签数量。",range:"建议下限 0.50;上限 0.90",tone:"stable",tupleLabels:["下限","上限"]},timeDecay:{label:"时间衰减回退",summary:"给旧记忆设置统一衰减策略,避免久远内容长期占优。",logic:"通常作为局部时间规则失效时的全局兜底。",range:"半衰期建议 15 ~ 90 天;最低分建议不低于 0.50",tone:"sensitive"},"timeDecay.halfLifeDays":{label:"半衰期天数",summary:"记忆分数衰减到一半所需的天数。",range:"建议 15 ~ 90 天",tone:"stable"},"timeDecay.minScore":{label:"最低保留阈值",summary:"衰减后的结果低于这个分数就会被过滤,用来清理过旧且相关度不足的记忆。",logic:"它不是给旧结果托底,而是在时间衰减和重排之后做一次保留阈值筛选。",range:"建议 0.50 ~ 0.80",tone:"stable"},mainSearchWeights:{label:"主检索权重分配",summary:"平衡用户当前输入和 AI 上下文意图在最终检索向量中的占比。",logic:"左侧更重当前问题,右侧更重模型对对话上下文的理解。",range:"常用组合 [0.7, 0.3] 或 [0.8, 0.2]",tone:"sensitive",tupleLabels:["用户输入","AI 意图"]},refreshWeights:{label:"流内刷新权重",summary:"控制工具刷新阶段里用户、AI 和工具结果三者的占比。",logic:"工具权重越高,刷新结果越贴近刚执行完的任务输出。",range:"常用组合 [0.5, 0.35, 0.15]",tone:"stable",tupleLabels:["用户","AI","工具结果"]},metaThinkingWeights:{label:"元思考递归权重",summary:"平衡原始查询和上一轮推理结果,决定递归思考是稳还是深。",logic:"推理结果权重越高,递归越深,但语义漂移风险也越大。",range:"常用组合 [0.8, 0.2]",tone:"sensitive",tupleLabels:["原始查询","推理结果"]}},KnowledgeBaseManager:{geodesicRerank:{label:"测地线重排(V8)",summary:"复用 Spike 距离场对 KNN 候选做基于 Tag 地形的二次重排。通过 ::TagMemo+ 修饰符激活。",logic:"V8 核心引擎,让被语义山峰挡住的相关记忆通过 Tag 拓扑关联浮出。三层防御链保证最坏情况无改动。",range:"包含 2 个子参数,见下方详细说明。",tone:"critical"},"geodesicRerank.alpha":{label:"测地线混合权重 (α)",summary:"测地线分数在最终排序中的占比。0=纯KNN余弦距离,1=纯测地线Tag地形距离。",logic:"调高:更信任 Tag 拓扑关联,被语义山峰遮挡的记忆更容易浮出;调低:更保守,主要依赖原始向量相似度。",range:"建议区间: 0.1 ~ 0.5 (默认 0.3)",tone:"sensitive"},"geodesicRerank.minGeoSamples":{label:"最小采样密度门槛",summary:"一个 chunk 在距离场上至少需要命中多少个 Tag 才有资格参与测地线评估。低于此值退化为纯 KNN。",logic:"调高:更严格,只有 Tag 密度高的 chunk 才会被测地线影响;调低:更宽松,但可能因采样不足导致估计不可靠。莱恩建议 4 作为基准。",range:"建议区间: 2 ~ 8 (整数,默认 4)",tone:"sensitive"},spikeRouting:{label:"虫洞脉冲路由",summary:"V7 的传播引擎,负责跳跃、衰减、扩散上限和新节点涌现。",logic:"这是最敏感的一组参数,建议一次只改一项并观察检索结果。",range:"共 8 个子参数,优先关注 tensionThreshold、baseMomentum 与两个 decay。",tone:"critical"},"spikeRouting.maxSafeHops":{label:"最高安全跳数",summary:"限制任意脉冲路径允许穿行的最大边数,避免图环回路无限扩散。",range:"建议 2 ~ 6",tone:"stable"},"spikeRouting.maxEmergentNodes":{label:"涌现节点上限",summary:"扩散结束后最多允许多少个新节点重新注入召回阶段。",range:"建议 10 ~ 100",tone:"sensitive"},"spikeRouting.maxNeighborsPerNode":{label:"单节点最大邻居数",summary:"每个节点放电时最多向多少个相邻节点传播,决定扩散宽度。",range:"建议 10 ~ 40",tone:"sensitive"},"spikeRouting.baseMomentum":{label:"初始动量 (TTL)",summary:"种子标签启动时拥有的初始动量,类似传播剩余生命值。",range:"建议 1.0 ~ 5.0",tone:"critical"},"spikeRouting.tensionThreshold":{label:"虫洞触发张力",summary:"张力达到多高才允许触发跨域虫洞跳跃。",logic:"这是全组最危险参数之一:过高几乎不跳,过低则到处穿洞。",range:"建议 0.50 ~ 3.00",tone:"critical"},"spikeRouting.firingThreshold":{label:"底层放电阈值",summary:"节点向下传播所需的最低内部能量,用来清理弱信号尾流。",range:"建议 0.05 ~ 0.20",tone:"stable"},"spikeRouting.baseDecay":{label:"常规区衰减",summary:"在同质稠密区域内传播时的能量保留比例。",logic:"值越低衰减越快,用来压制同类簇里的回声放大。",range:"建议 0.10 ~ 0.40",tone:"critical"},"spikeRouting.wormholeDecay":{label:"虫洞区衰减",summary:"穿透语义屏障后的能量保留比例,决定探索路径能走多远。",logic:"通常应明显高于 baseDecay,才能体现跨域探索的优势。",range:"建议 0.60 ~ 0.90",tone:"critical"},activationMultiplier:{label:"金字塔激活倍率区间",summary:"定义 TagMemo 激活系数的倍率区间,用于把金字塔特征映射到最终增强强度。",logic:"系统会根据覆盖率、相干性和噪音信号在两个边界之间插值;左侧是最低倍率,右侧是最高倍率。",range:"建议最小值 0.20 ~ 0.80;最大值 1.0 ~ 2.5",tone:"sensitive",tupleLabels:["最小值","最大值"]},dynamicBoostRange:{label:"动态增强修正",summary:"根据 EPA 或共振分析结果对标签增强做二次修正。",logic:"上限越高,强逻辑场景越容易冲破天花板;下限越低,混乱场景越会压掉增强。",range:"建议下限 0.10 ~ 0.50;上限 1.50 ~ 3.00",tone:"sensitive",tupleLabels:["下限","上限"]},coreBoostRange:{label:"核心标签聚光灯",summary:"给用户手动指定的 coreTags 额外特权,强行提升其存在感。",logic:"值越高越像显式强推,值越低则更接近轻提示。",range:"建议 0.10 ~ 2.00",tone:"sensitive",tupleLabels:["最小增益","最大增益"]},deduplicationThreshold:{label:"语义去重阈值",summary:"两个标签相似到什么程度就合并,避免标签云过度拥挤。",logic:"高值保留细微差别,低值则更激进地合并近义标签。",range:"建议 0.80 ~ 0.95",tone:"stable"},techTagThreshold:{label:"技术标签门槛",summary:"技术样式词进入 matchedTags 列表时所需的相对权重,主要影响非技术语境下的技术词暴露度。",logic:"调高后代码片段、文件名和术语更难出现在返回标签里;它不会直接改写已构建好的上下文向量,但会影响调试观测和部分依赖 matchedTags 的后续逻辑。",range:"建议 0.02 ~ 0.20",tone:"sensitive"},normalTagThreshold:{label:"普通标签门槛",summary:"普通标签进入 matchedTags 列表的相对门槛,用来控制返回标签信息的密度。",logic:"调高后返回标签更少更干净,调低后可见标签更多;它主要影响标签展示与统计,不直接决定向量融合。",range:"建议 0.01 ~ 0.05",tone:"stable"},languageCompensator:{label:"语言置信度补偿",summary:"在启用语言置信度门控后,对非技术语境中的技术型词汇施加惩罚,降低跨语境技术噪音。",logic:"值越小惩罚越重;主要命中非中文且带技术命名特征的词,Unknown 与跨领域语境分别使用不同罚值。",range:"默认常见值:未知语境 0.05,跨领域 0.10",tone:"sensitive"},"languageCompensator.penaltyUnknown":{label:"未知语境惩罚",summary:"语境无法识别时采用的兜底惩罚系数。",range:"建议 0.01 ~ 0.50",tone:"stable"},"languageCompensator.penaltyCrossDomain":{label:"跨领域惩罚",summary:"语境可识别但与标签领域冲突时使用的惩罚系数。",range:"建议 0.01 ~ 0.50",tone:"stable"}}};function Ce(v){return Se[v]??{...De,title:v}}function te(v,_){return Ee[v]?.[_]??{...Ne,label:_}}function Ie(v,_){return v.tupleLabels?.[_]??`值 ${_+1}`}function X(v){switch(v){case"critical":return"高风险";case"sensitive":return"高敏感";default:return"稳态"}}function $(v,_){const c=v.toLowerCase();return c==="tensionthreshold"?{min:.5,max:3,step:.01}:c==="firingthreshold"?{min:0,max:1,step:.01}:c==="basemomentum"?{min:1,max:10,step:.1}:c==="basedecay"||c==="wormholedecay"?{min:0,max:1,step:.01}:c==="maxsafehops"?{min:1,max:20,step:1}:c==="maxemergentnodes"?{min:1,max:200,step:1}:c==="maxneighborspernode"?{min:1,max:20,step:1}:c==="alpha"?{min:0,max:1,step:.01}:c.includes("samples")?{min:1,max:20,step:1}:c.includes("days")?{min:1,max:365,step:1}:c.includes("threshold")?{min:0,max:1,step:.01}:c.includes("hops")||c.includes("nodes")||c.includes("neighbors")?{min:1,max:c.includes("nodes")?200:20,step:1}:c.includes("momentum")?{min:1,max:10,step:.1}:c.includes("penalty")||c.includes("score")||c.includes("min")?{min:0,max:1,step:.01}:typeof _=="number"&&!Number.isInteger(_)?{min:0,max:Math.max(10,Math.ceil(_*20)),step:.01}:{min:0,max:100,step:1}}var Pe={key:0,class:"wormhole-modal",role:"dialog","aria-modal":"true","aria-labelledby":"wormhole-routing-title"},Ve={class:"wormhole-modal__header"},Oe={class:"wormhole-modal__hero"},We={class:"wormhole-modal__title-row"},Ge={class:"wormhole-modal__badges"},Be={class:"wormhole-badge wormhole-badge--neutral"},Fe={class:"wormhole-modal__header-actions"},Ue=["disabled"],je=["form","disabled"],He={class:"wormhole-modal__body"},ze={class:"wormhole-modal__nav"},Qe={class:"wormhole-sidebar-card"},Ye={class:"wormhole-sidebar-card__nav-list"},Je=["onClick"],Ze={class:"material-symbols-outlined"},qe={class:"wormhole-nav-btn__copy"},Xe={class:"wormhole-sidebar-card"},Ke={class:"wormhole-profile__meter"},ea={class:"wormhole-modal__workspace"},aa={class:"wormhole-overview"},la={class:"wormhole-panel-header"},sa={class:"wormhole-field-list"},ta={class:"wormhole-field__copy"},ra={class:"wormhole-field__heading"},oa={class:"wormhole-field__key"},na={class:"wormhole-field__pills"},ia={key:1,class:"wormhole-badge wormhole-badge--changed"},da={class:"wormhole-field__summary"},ua={key:0,class:"wormhole-field__range"},ma={key:1,class:"wormhole-field__details"},ca={class:"wormhole-field__control"},va=["aria-label","value","min","max","step","onInput"],_a={class:"wormhole-field__number-row"},ga=["aria-label","value","min","max","step","onInput"],ha={class:"wormhole-field__current"},pa={class:"wormhole-modal__insights"},ba={class:"wormhole-sidebar-card"},fa={class:"wormhole-insight-list"},ya={class:"wormhole-sidebar-card"},wa={key:0,class:"wormhole-change-list"},ka={key:1,class:"wormhole-empty-state"},$a=ce({__name:"WormholeRoutingModal",props:{modelValue:{type:Boolean},groupName:{},paramKey:{},values:{},originalValues:{},changedLeaves:{},totalLeaves:{},isSaving:{type:Boolean},isDirty:{type:Boolean},formId:{}},emits:["close","restore","updateField"],setup(v,{emit:_}){const c=v,S=_,y=R(null),T=R(G[0].id),L=R(""),w=f(()=>G.find(n=>n.id===T.value)??G[0]),E=f(()=>Object.keys(c.values).filter(n=>c.values[n]!==c.originalValues[n])),B=f(()=>{const n={trigger:0,spread:0,decay:0};for(const i of G)n[i.id]=i.keys.filter(t=>c.values[t]!==c.originalValues[t]).length;return n}),A=f(()=>ve.map(n=>({key:n,label:b(n).label,value:H(c.values[n]),hint:ee(n)}))),V=f(()=>{const n=F(c.values.baseMomentum??1,1,5)*.35+(1-F(c.values.tensionThreshold??1,.5,3))*.35+F(c.values.wormholeDecay??.7,.6,.9)*.2+(1-F(c.values.baseDecay??.2,.1,.4))*.1;return n>=.68?{tone:"critical",label:"激进扩散",summary:"基于当前 4 项核心参数的前端估算,这组配置更愿意跨域跳转,探索更强,但也更容易放大噪声与语义漂移。",score:n}:n<=.4?{tone:"stable",label:"保守探索",summary:"基于当前 4 项核心参数的前端估算,这组配置更偏向留在本域与近邻传播,结果更稳,但可能错过远距离联想。",score:n}:{tone:"sensitive",label:"平衡默认",summary:"基于当前 4 项核心参数的前端估算,这组配置在稳定和探索之间折中,适合大多数常规对话与召回场景。",score:n}}),K=f(()=>{const n=(E.value.length>0?E.value:w.value.keys).map(i=>le[i]).filter(i=>!!i);return Array.from(new Map(n.map(i=>[i.title,i])).values())});function b(n){return te(c.groupName,`${c.paramKey}.${n}`)}function ee(n){switch(n){case"tensionThreshold":return"越低越容易跨域";case"baseMomentum":return"越高越能继续传播";case"baseDecay":return"越低越快衰减";case"wormholeDecay":return"越高越保留跨域收益";default:return"关键指标"}}function F(n,i,t){if(t<=i)return 0;const h=(n-i)/(t-i);return Math.min(1,Math.max(0,h))}function H(n){if(n===void 0)return"--";if(Number.isInteger(n))return String(n);const i=Math.abs(n)>=1?2:3;return n.toFixed(i).replace(/\.?0+$/,"")}function x(n){const i=c.originalValues[n],t=c.values[n];if(i===void 0||t===i)return null;const h=t-i;return`${h>0?"+":""}${H(h)}`}function ae(n){return c.values[n]!==c.originalValues[n]}function z(n,i){const t=i.target;if(!t||t.value==="")return;const h=Number(t.value);Number.isNaN(h)||S("updateField",n,h)}function O(){if(!y.value)return[];const n=["button:not([disabled])","a[href]","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","[tabindex]:not([tabindex='-1'])"].join(",");return Array.from(y.value.querySelectorAll(n)).filter(i=>!i.hasAttribute("disabled"))}function Q(n){if(n.key==="Escape"){n.preventDefault(),S("close");return}if(n.key!=="Tab")return;const i=O();if(i.length===0){n.preventDefault(),y.value?.focus();return}const t=i[0],h=i[i.length-1],W=document.activeElement,J=!!(W&&y.value?.contains(W));if(n.shiftKey){(!J||W===t)&&(n.preventDefault(),h.focus());return}(!J||W===h)&&(n.preventDefault(),t.focus())}function U(){const n=new Set(E.value);return G.find(i=>i.keys.some(t=>n.has(t)))?.id??G[0].id}function Y(n){if(!(typeof document>"u")){if(n){L.value=document.body.style.overflow,document.body.style.overflow="hidden";return}document.body.style.overflow=L.value}}Re(()=>c.modelValue,async n=>{Y(n),n&&(T.value=U(),await Le(),y.value?.focus())}),Me(()=>{Y(!1)});const le={tensionThreshold:{title:"张力阈值会牵动整体跨域意愿",body:"如果它降得太低,最好同步关注 baseMomentum 和 wormholeDecay,否则很容易出现跳得出去却收不回来的情况。"},baseMomentum:{title:"初始动量决定第一跳后还能不能继续扩散",body:"调高它时,建议同时盯住 maxSafeHops 和 baseDecay,避免高动量带来层层外溢。"},baseDecay:{title:"常规衰减是控制本域回声的刹车",body:"如果常规衰减太低,哪怕虫洞参数不激进,也可能在本域里积累过多回音。"},wormholeDecay:{title:"虫洞衰减决定跨域收益会不会保留下来",body:"它通常应明显高于 baseDecay,才能体现跨域探索的价值,但过高也会把偏题结果带回主链路。"},maxSafeHops:{title:"安全跳数是扩散上限",body:"当 baseMomentum 较高时,再放大 hop 上限会显著提升探索跨度,也会提高响应不稳定性。"},maxEmergentNodes:{title:"涌现节点上限影响结果回流密度",body:"这个值与 maxNeighborsPerNode 共同决定扩散后会有多少新节点重新进入召回排序。"},maxNeighborsPerNode:{title:"单节点邻居数决定扩散宽度",body:"如果你已经提高了 maxEmergentNodes,再继续放大邻居数,结果会更发散,也更容易出现噪声堆积。"},firingThreshold:{title:"放电阈值是弱信号清理器",body:"适度提高它可以压掉尾流噪声,但如果张力阈值也偏高,整体路由会迅速变得保守。"}};return(n,i)=>(d(),me(Te,{to:"body"},[v.modelValue?(d(),u("div",Pe,[e("div",{class:"wormhole-modal__backdrop","aria-hidden":"true",onClick:i[0]||(i[0]=t=>S("close"))}),e("div",{ref_key:"dialogRef",ref:y,class:"wormhole-modal__shell",tabindex:"-1",onKeydown:Q},[e("header",Ve,[e("div",Oe,[i[5]||(i[5]=e("span",{class:"wormhole-modal__eyebrow"},"Wormhole Routing Cockpit",-1)),e("div",We,[i[4]||(i[4]=e("div",null,[e("h3",{id:"wormhole-routing-title"},"虫洞脉冲路由")],-1)),e("div",Ge,[i[3]||(i[3]=e("span",{class:"wormhole-badge wormhole-badge--critical"},"高风险",-1)),e("span",Be," 已改 "+r(v.changedLeaves)+"/"+r(v.totalLeaves),1)])])]),e("div",Fe,[e("button",{type:"button",class:"btn-secondary",disabled:v.changedLeaves===0,onClick:i[1]||(i[1]=t=>S("restore"))}," 恢复虫洞参数 ",8,Ue),e("button",{type:"button",class:"btn-secondary",onClick:i[2]||(i[2]=t=>S("close"))}," 收起舱门 "),e("button",{type:"submit",class:"btn-primary",form:v.formId,disabled:v.isSaving||!v.isDirty},r(v.isSaving?"保存中…":"保存全部参数"),9,je)])]),e("div",He,[e("aside",ze,[e("div",Qe,[i[6]||(i[6]=e("span",{class:"wormhole-sidebar-card__label"},"导航",-1)),e("div",Ye,[(d(!0),u(k,null,M(g(G),t=>(d(),u("button",{key:t.id,type:"button",class:I(["wormhole-nav-btn",{"wormhole-nav-btn--active":t.id===w.value.id}]),onClick:h=>T.value=t.id},[e("span",Ze,r(t.icon),1),e("span",qe,[e("strong",null,r(t.title),1),e("small",null,r(B.value[t.id])+" 项改动",1)])],10,Je))),128))])]),e("div",Xe,[i[7]||(i[7]=e("span",{class:"wormhole-sidebar-card__label"},"当前画像(估算)",-1)),e("div",{class:I(["wormhole-profile",`wormhole-profile--${V.value.tone}`])},[e("strong",null,r(V.value.label),1),e("p",null,r(V.value.summary),1),e("div",Ke,[e("span",{style:de({width:`${V.value.score*100}%`})},null,4)])],2)])]),e("section",ea,[e("div",aa,[(d(!0),u(k,null,M(A.value,t=>(d(),u("article",{key:t.key,class:"wormhole-overview__item"},[e("span",null,r(t.label),1),e("strong",null,r(t.value),1),e("small",null,r(t.hint),1)]))),128))]),e("header",la,[e("div",null,[i[8]||(i[8]=e("span",{class:"wormhole-panel-header__label"},"当前分组",-1)),e("h4",null,r(w.value.title),1)]),e("p",null,r(w.value.summary),1)]),e("div",sa,[(d(!0),u(k,null,M(w.value.keys,t=>(d(),u("article",{key:t,class:I(["wormhole-field",{"wormhole-field--changed":ae(t)}])},[e("div",ta,[e("div",ra,[e("div",null,[e("h5",null,r(b(t).label),1),e("p",oa,r(t),1)]),e("div",na,[b(t).tone?(d(),u("span",{key:0,class:I(["wormhole-badge",`wormhole-badge--${b(t).tone}`])},r(g(X)(b(t).tone)),3)):p("",!0),x(t)?(d(),u("span",ia,r(x(t)),1)):p("",!0)])]),e("p",da,r(b(t).summary),1),b(t).range?(d(),u("p",ua,r(b(t).range),1)):p("",!0),b(t).logic?(d(),u("details",ma,[i[9]||(i[9]=e("summary",null,"展开调优逻辑",-1)),e("p",null,r(b(t).logic),1)])):p("",!0)]),e("div",ca,[e("input",{class:"wormhole-field__slider",type:"range","aria-label":`${b(t).label} 滑杆`,value:v.values[t],min:g($)(t).min,max:g($)(t).max,step:g($)(t).step,onInput:h=>z(t,h)},null,40,va),e("div",_a,[e("input",{class:"wormhole-field__number",type:"number","aria-label":`${b(t).label} 数值输入`,value:v.values[t],min:g($)(t).min,max:g($)(t).max,step:g($)(t).step,onInput:h=>z(t,h)},null,40,ga),e("span",ha,r(H(v.values[t])),1)])])],2))),128))])]),e("aside",pa,[e("div",ba,[i[10]||(i[10]=e("span",{class:"wormhole-sidebar-card__label"},"联动提示",-1)),e("ul",fa,[(d(!0),u(k,null,M(K.value,t=>(d(),u("li",{key:t.title},[e("strong",null,r(t.title),1),e("p",null,r(t.body),1)]))),128))])]),e("div",ya,[i[11]||(i[11]=e("span",{class:"wormhole-sidebar-card__label"},"未保存修改",-1)),E.value.length>0?(d(),u("ul",wa,[(d(!0),u(k,null,M(E.value,t=>(d(),u("li",{key:t},[e("span",null,r(b(t).label),1),e("strong",null,r(x(t)),1)]))),128))])):(d(),u("p",ka," 目前还没有未保存修改,建议一次只微调 1 到 2 个关键参数。 "))]),i[12]||(i[12]=e("div",{class:"wormhole-sidebar-card"},[e("span",{class:"wormhole-sidebar-card__label"},"操作建议"),e("ul",{class:"wormhole-insight-list"},[e("li",null,[e("strong",null,"先看点火,再看衰减"),e("p",null,"如果召回开始漂移,优先回看 tensionThreshold、baseMomentum 与 wormholeDecay。")]),e("li",null,[e("strong",null,"大改之前先保存快照"),e("p",null,"虫洞参数耦合较强,连续调很多项时很容易把问题来源混在一起。")])])],-1))])])],544)])):p("",!0)]))}}),La=ue($a,[["__scopeId","data-v-cdd01eba"]]),xa={class:"config-section active-section rag-lab"},Ra={class:"rag-lab__hero card"},Ma={class:"rag-lab__hero-stats"},Ta={class:"hero-stat"},Aa={class:"hero-stat__value"},Da={class:"hero-stat"},Na={class:"hero-stat__value"},Sa={class:"hero-stat__value"},Ea={key:0,class:"rag-lab__state card"},Ca={key:1,class:"rag-lab__state rag-lab__state--error card"},Ia={class:"rag-lab__main"},Pa=["id"],Va={class:"group-panel__header"},Oa={class:"group-panel__header-main"},Wa={class:"group-panel__badge"},Ga={class:"group-panel__title-row"},Ba={class:"material-symbols-outlined"},Fa={class:"group-panel__name"},Ua={class:"group-panel__description"},ja={class:"group-panel__metrics"},Ha={class:"group-panel__metric"},za={class:"group-panel__metric"},Qa={class:"group-panel__list"},Ya={key:0,class:"wormhole-launchpad"},Ja={class:"wormhole-launchpad__copy"},Za={class:"param-row__heading"},qa={class:"param-row__title-block"},Xa={class:"param-row__key"},Ka={class:"param-row__pills"},el={class:"mini-pill mini-pill--critical"},al={key:0,class:"mini-pill mini-pill--changed"},ll={class:"param-row__summary"},sl={key:0,class:"param-row__range"},tl={key:1,class:"param-row__details"},rl={class:"param-row__details-body"},ol={class:"wormhole-launchpad__control"},nl={class:"wormhole-launchpad__stats"},il={class:"param-row__copy"},dl={class:"param-row__heading"},ul={class:"param-row__title-block"},ml={class:"param-row__key"},cl={class:"param-row__pills"},vl={class:"mini-pill mini-pill--neutral"},_l={key:1,class:"mini-pill mini-pill--changed"},gl={class:"param-row__summary"},hl={key:0,class:"param-row__range"},pl={key:1,class:"param-row__details"},bl={class:"param-row__details-body"},fl={class:"param-row__control"},yl={key:0,class:"control-shell"},wl=["for"],kl=["id","onUpdate:modelValue","step"],$l={key:1,class:"control-shell control-shell--tuple"},Ll={class:"tuple-grid"},xl=["onUpdate:modelValue","step"],Rl={key:2,class:"control-shell control-shell--nested"},Ml={class:"nested-header"},Tl={class:"nested-list"},Al={class:"nested-item__copy"},Dl={class:"nested-item__title"},Nl={class:"nested-item__key"},Sl={class:"nested-item__summary"},El={class:"nested-item__meta"},Cl={key:1,class:"nested-item__range"},Il={class:"nested-item__control"},Pl=["onUpdate:modelValue","aria-label","min","max","step"],Vl=["onUpdate:modelValue","aria-label","min","max","step"],Ol={class:"rag-lab__aside"},Wl={class:"rag-console card"},Gl={class:"rag-console__actions"},Bl=["disabled"],Fl=["disabled"],Ul={class:"rag-console__section"},jl={class:"rag-console__jump-list"},Hl=["onClick"],N="KnowledgeBaseManager",C="spikeRouting",ie="rag-tuning-form",zl=ce({__name:"RagTuning",setup(v){const _=R({}),c=R({}),S=R(!0),y=R(!1),T=R(""),L=R(""),w=R("info"),E=R(!1);function B(a){return JSON.parse(JSON.stringify(a))}function A(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function V(a){return Array.isArray(a)?a.length:A(a)?Object.keys(a).length:1}function K(a,l){if(l===void 0)return V(a);if(Array.isArray(a)&&Array.isArray(l)){const o=Math.max(a.length,l.length);let s=0;for(let m=0;m{a[m]!==l[m]&&(s+=1)}),s}return a===l?0:1}function b(a){return`rag-group-${a.replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()||"default"}`}function ee(a,l){return`rag-field-${a}-${l}`.replace(/[^a-zA-Z0-9_-]+/g,"-")}function F(a,l){const o=ne.indexOf(a),s=ne.indexOf(l);return o===-1&&s===-1?a.localeCompare(l):o===-1?1:s===-1?-1:o-s}function H(a,l,o,s){const m={key:l,fieldId:ee(a,l),meta:te(a,l),changedLeaves:K(o,s),totalLeaves:V(o)};return Array.isArray(o)?{...m,kind:"tuple",value:o}:A(o)?{...m,kind:"nested",value:o}:{...m,kind:"number",value:o}}const x=f(()=>Object.entries(_.value).sort(([a],[l])=>F(a,l)).map(([a,l])=>{const o=Object.entries(l).map(([s,m])=>H(a,s,m,c.value[a]?.[s]));return{name:a,anchor:b(a),meta:Ce(a),raw:l,entries:o,changedLeaves:o.reduce((s,m)=>s+m.changedLeaves,0),totalLeaves:o.reduce((s,m)=>s+m.totalLeaves,0)}})),ae=f(()=>x.value.reduce((a,l)=>a+l.totalLeaves,0)),z=f(()=>x.value.reduce((a,l)=>a+l.changedLeaves,0)),O=f(()=>z.value>0),Q=f(()=>x.value.length>0),U=f(()=>{const a=x.value.find(l=>l.name===N)?.entries.find(l=>l.key===C);return a&&a.kind==="nested"?a:null}),Y=f(()=>{const a=_.value[N]?.[C];return A(a)?a:{}}),le=f(()=>{const a=c.value[N]?.[C];return A(a)?a:{}});function n(a){return a.kind==="nested"&&a.key===C}function i(a,l){return a===N&&n(l)}function t(a){switch(a){case"number":return"单值";case"tuple":return"区间/配比";case"nested":return"子模块";default:return"参数"}}function h(a){if(a===void 0)return"--";if(Number.isInteger(a))return String(a);const l=Math.abs(a)>=1?2:3;return a.toFixed(l).replace(/\.?0+$/,"")}function W(a){return Number.isInteger(a)&&Math.abs(a)>=1?1:Math.abs(a)<.1?.001:Math.abs(a)<1?.01:.05}function J(a,l){return Ie(a.meta,l)}function D(a,l,o){return te(a,`${l}.${o}`)}function _e(a){return D(N,C,a).label}function ge(a,l){return n(a)?h(a.value[l]):"--"}function he(a){document.getElementById(a)?.scrollIntoView({behavior:"smooth",block:"start"})}function pe(){U.value&&(E.value=!0)}function be(){E.value=!1}function fe(a,l){const o=_.value[N]?.[C];A(o)&&(o[a]=l)}function ye(){const a=c.value[N]?.[C];!_.value[N]||!A(a)||(_.value[N][C]={...a},L.value="已恢复虫洞脉冲路由的未保存修改。",w.value="info")}async function re(){S.value=!0,T.value="";try{const a=await oe.getRagParams({showLoader:!1,loadingKey:"rag-tuning.params.load"});_.value=B(a),c.value=B(a)}catch(a){T.value=`加载失败:${a instanceof Error?a.message:String(a)}`,L.value=T.value,w.value="error",console.error("Failed to load RAG params:",a),se(T.value,"error")}finally{S.value=!1}}async function we(){if(!(!Q.value||!O.value||y.value)){y.value=!0;try{await oe.saveRagParams(_.value,{loadingKey:"rag-tuning.params.save"}),c.value=B(_.value),L.value="RAG 参数已保存。",w.value="success",se("RAG 参数已保存。","success")}catch(a){L.value=`保存失败:${a instanceof Error?a.message:String(a)}`,w.value="error",se(L.value,"error")}finally{y.value=!1}}}function ke(){_.value=B(c.value),L.value="已恢复到最近一次保存的参数状态。",w.value="info"}return xe(()=>{re()}),(a,l)=>(d(),u("section",xa,[e("header",Ra,[l[3]||(l[3]=e("div",{class:"rag-lab__hero-copy"},[e("span",{class:"rag-lab__eyebrow"},"Wave RAG Parameter Lab"),e("h2",null,"浪潮 RAG 参数调优工作台"),e("p",{class:"description"}," 集中查看和调整浪潮 RAG 的核心参数,支持按模块浏览、快速定位高影响项,并对虫洞脉冲路由等复杂参数进入独立控制舱进行细化编辑。 ")],-1)),e("div",Ma,[e("div",Ta,[e("span",Aa,r(x.value.length),1),l[0]||(l[0]=e("span",{class:"hero-stat__label"},"参数组",-1))]),e("div",Da,[e("span",Na,r(ae.value),1),l[1]||(l[1]=e("span",{class:"hero-stat__label"},"可调节点",-1))]),e("div",{class:I(["hero-stat",{"hero-stat--warning":O.value}])},[e("span",Sa,r(z.value),1),l[2]||(l[2]=e("span",{class:"hero-stat__label"},"未保存修改",-1))],2)])]),S.value?(d(),u("div",Ea,[...l[4]||(l[4]=[e("span",{class:"material-symbols-outlined"},"hourglass_top",-1),e("div",null,[e("strong",null,"正在加载 RAG 参数"),e("p",null,"读取完成后会按分组展开到参数工作台中。")],-1)])])):T.value?(d(),u("div",Ca,[l[6]||(l[6]=e("span",{class:"material-symbols-outlined"},"error",-1)),e("div",null,[l[5]||(l[5]=e("strong",null,"参数加载失败",-1)),e("p",null,r(T.value),1)]),e("button",{type:"button",class:"btn-secondary",onClick:re},"重新加载")])):(d(),u("form",{key:2,id:ie,class:"rag-lab__workspace",onSubmit:Ae(we,["prevent"])},[e("div",Ia,[(d(!0),u(k,null,M(x.value,o=>(d(),u("article",{id:o.anchor,key:o.name,class:"group-panel card",style:de({"--group-accent":o.meta.accent})},[e("header",Va,[e("div",Oa,[e("span",Wa,r(o.meta.badge),1),e("div",Ga,[e("span",Ba,r(o.meta.icon),1),e("div",null,[e("h3",null,r(o.meta.title),1),e("p",Fa,r(o.name),1)])]),e("p",Ua,r(o.meta.description),1)]),e("div",ja,[e("div",Ha,[e("span",null,r(o.entries.length),1),l[7]||(l[7]=e("small",null,"模块",-1))]),e("div",za,[e("span",null,r(o.changedLeaves)+"/"+r(o.totalLeaves),1),l[8]||(l[8]=e("small",null,"已改动",-1))])])]),e("div",Qa,[(d(!0),u(k,null,M(o.entries,s=>(d(),u("section",{key:s.key,class:I(["param-row",`param-row--${s.kind}`,{"param-row--changed":s.changedLeaves>0,"param-row--wormhole":i(o.name,s)}])},[i(o.name,s)?(d(),u("div",Ya,[e("div",Ja,[e("div",Za,[e("div",qa,[e("h4",null,r(s.meta.label),1),e("p",Xa,r(s.key),1)]),e("div",Ka,[e("span",el,r(g(X)(s.meta.tone)),1),s.changedLeaves>0?(d(),u("span",al," 已修改 "+r(s.changedLeaves),1)):p("",!0)])]),e("p",ll,r(s.meta.summary),1),s.meta.range?(d(),u("p",sl,[l[9]||(l[9]=e("span",{class:"material-symbols-outlined"},"straighten",-1)),j(" "+r(s.meta.range),1)])):p("",!0),s.meta.logic?(d(),u("details",tl,[l[10]||(l[10]=e("summary",null,"展开调优逻辑",-1)),e("div",rl,[e("p",null,r(s.meta.logic),1)])])):p("",!0)]),e("div",ol,[e("div",nl,[(d(!0),u(k,null,M(g(ve),m=>(d(),u("article",{key:m,class:"wormhole-launchpad__stat"},[e("span",null,r(_e(m)),1),e("strong",null,r(ge(s,m)),1)]))),128))]),e("div",{class:"wormhole-launchpad__footer"},[e("button",{type:"button",class:"btn-primary",onClick:pe}," 打开虫洞控制舱 ")])])])):(d(),u(k,{key:1},[e("div",il,[e("div",dl,[e("div",ul,[e("h4",null,r(s.meta.label),1),e("p",ml,r(s.key),1)]),e("div",cl,[e("span",vl,r(t(s.kind)),1),s.meta.tone?(d(),u("span",{key:0,class:I(["mini-pill",`mini-pill--${s.meta.tone}`])},r(g(X)(s.meta.tone)),3)):p("",!0),s.changedLeaves>0?(d(),u("span",_l," 已修改 "+r(s.changedLeaves),1)):p("",!0)])]),e("p",gl,r(s.meta.summary),1),s.meta.range?(d(),u("p",hl,[l[11]||(l[11]=e("span",{class:"material-symbols-outlined"},"straighten",-1)),j(" "+r(s.meta.range),1)])):p("",!0),s.meta.logic?(d(),u("details",pl,[l[12]||(l[12]=e("summary",null,"展开调优逻辑",-1)),e("div",bl,[e("p",null,r(s.meta.logic),1)])])):p("",!0)]),e("div",fl,[s.kind==="number"?(d(),u("div",yl,[e("label",{class:"control-shell__label",for:s.fieldId},"当前数值",8,wl),Z(e("input",{id:s.fieldId,"onUpdate:modelValue":m=>o.raw[s.key]=m,type:"number",step:W(s.value)},null,8,kl),[[q,o.raw[s.key],void 0,{number:!0}]])])):s.kind==="tuple"?(d(),u("div",$l,[e("div",Ll,[(d(!0),u(k,null,M(s.value,(m,P)=>(d(),u("label",{key:`${s.key}-${P}`,class:"tuple-field"},[e("span",null,r(J(s,P)),1),Z(e("input",{"onUpdate:modelValue":$e=>o.raw[s.key][P]=$e,type:"number",step:W(m)},null,8,xl),[[q,o.raw[s.key][P],void 0,{number:!0}]])]))),128))])])):(d(),u("div",Rl,[e("div",Ml,[l[13]||(l[13]=e("span",null,"子参数模块",-1)),e("span",null,r(Object.keys(s.value).length)+" 项",1)]),e("div",Tl,[(d(!0),u(k,null,M(Object.keys(s.value),m=>(d(),u("div",{key:`${s.key}-${m}`,class:"nested-item"},[e("div",Al,[e("div",Dl,[e("h5",null,r(D(o.name,s.key,m).label),1),e("span",Nl,r(m),1)]),e("p",Sl,r(D(o.name,s.key,m).summary),1),e("div",El,[D(o.name,s.key,m).tone?(d(),u("span",{key:0,class:I(["mini-pill",`mini-pill--${D(o.name,s.key,m).tone}`])},r(g(X)(D(o.name,s.key,m).tone)),3)):p("",!0),D(o.name,s.key,m).range?(d(),u("span",Cl,r(D(o.name,s.key,m).range),1)):p("",!0)])]),e("div",Il,[Z(e("input",{"onUpdate:modelValue":P=>o.raw[s.key][m]=P,class:"nested-item__slider",type:"range","aria-label":`${D(o.name,s.key,m).label} 滑杆`,min:g($)(m).min,max:g($)(m).max,step:g($)(m).step},null,8,Pl),[[q,o.raw[s.key][m],void 0,{number:!0}]]),Z(e("input",{"onUpdate:modelValue":P=>o.raw[s.key][m]=P,class:"nested-item__number",type:"number","aria-label":`${D(o.name,s.key,m).label} 数值输入`,min:g($)(m).min,max:g($)(m).max,step:g($)(m).step},null,8,Vl),[[q,o.raw[s.key][m],void 0,{number:!0}]])])]))),128))])]))])],64))],2))),128))])],12,Pa))),128))]),e("aside",Ol,[e("div",Wl,[l[15]||(l[15]=e("div",{class:"rag-console__section"},[e("span",{class:"rag-console__label"},"操作台"),e("h3",null,"保存与回退"),e("p",null,"建议一次只改一组高敏参数,并在每次保存后观察实际召回结果。")],-1)),e("div",Gl,[e("button",{type:"submit",class:"btn-primary",disabled:y.value||!Q.value||!O.value},r(y.value?"保存中…":"保存参数配置"),9,Bl),e("button",{type:"button",class:"btn-secondary",disabled:!O.value,onClick:ke}," 重置未保存修改 ",8,Fl)]),L.value?(d(),u("p",{key:0,class:I(["rag-console__status",`rag-console__status--${w.value}`]),role:"status","aria-live":"polite"},r(L.value),3)):p("",!0),e("div",Ul,[l[14]||(l[14]=e("span",{class:"rag-console__label"},"快速跳转",-1)),e("div",jl,[(d(!0),u(k,null,M(x.value,o=>(d(),u("button",{key:`${o.name}-jump`,type:"button",class:"rag-console__jump-btn",onClick:s=>he(o.anchor)},[e("span",null,r(o.meta.title),1),e("small",null,r(o.changedLeaves)+"/"+r(o.totalLeaves),1)],8,Hl))),128))])]),l[16]||(l[16]=e("div",{class:"rag-console__section"},[e("span",{class:"rag-console__label"},"风险提示"),e("ul",{class:"rag-console__tips"},[e("li",null,"标记为“高风险”的参数建议单独修改并观察效果。"),e("li",null,"虫洞路由参数之间耦合较强,不建议一次联动改太多项。"),e("li",null,[j(" 如果召回突然漂移,优先回看 "),e("code",null,"tensionThreshold"),j("、 "),e("code",null,"baseMomentum"),j(" 和 "),e("code",null,"dynamicBoostRange"),j("。 ")])])],-1))])])],32)),U.value?(d(),me(La,{key:3,"model-value":E.value,"group-name":N,"param-key":C,values:Y.value,"original-values":le.value,"changed-leaves":U.value.changedLeaves,"total-leaves":U.value.totalLeaves,"is-saving":y.value,"is-dirty":O.value,"form-id":ie,onClose:be,onRestore:ye,onUpdateField:fe},null,8,["model-value","values","original-values","changed-leaves","total-leaves","is-saving","is-dirty"])):p("",!0)]))}}),Zl=ue(zl,[["__scopeId","data-v-20d809f9"]]);export{Zl as default}; +import{Dt as r,E as Le,Et as de,N as M,O as xe,Q as R,U as Z,V as Re,a as k,at as g,c as f,d as p,f as u,h as j,j as d,k as Me,l as e,n as ue,o as Te,u as me,v as ce,wt as I}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as q,d as Ae}from"./dashboard-card-news-BnyB_dHU.js";import{G as se,b as oe}from"./dashboard-card-calendar-DWuV34Bn.js";var ve=["tensionThreshold","baseMomentum","baseDecay","wormholeDecay"],G=[{id:"trigger",title:"触发与点火",summary:"决定什么时候跨域跳转,以及首次跳跃时带着多少动量起步。",icon:"bolt",keys:["tensionThreshold","firingThreshold","baseMomentum"]},{id:"spread",title:"扩散边界",summary:"限制跳几层、扩多宽、以及允许多少新节点重新回流主召回链路。",icon:"hub",keys:["maxSafeHops","maxEmergentNodes","maxNeighborsPerNode"]},{id:"decay",title:"衰减与稳定",summary:"控制常规传播与虫洞传播的能量保留,决定探索能走多远也决定噪声会不会放大。",icon:"vital_signs",keys:["baseDecay","wormholeDecay"]}],De={title:"未命名参数组",description:"该参数组暂时没有补充说明。",icon:"tune",accent:"rgba(56, 189, 248, 0.5)",badge:"待整理"},Ne={label:"未命名参数",summary:"该参数暂时没有补充说明。",tone:"stable"},ne=["ContextFoldingV2","RAGDiaryPlugin","KnowledgeBaseManager"],Se={ContextFoldingV2:{title:"上下文折叠层",description:"负责根据语义相似度和逻辑聚焦度自动折叠远距离 AI 输出,控制上下文窗口大小。",icon:"unfold_less",accent:"rgba(167, 139, 250, 0.55)",badge:"上下文控制"},RAGDiaryPlugin:{title:"感知与裁剪层",description:"负责标签感知、时间衰减与主检索权重,是浪潮 RAG 的第一道调制面。",icon:"flare",accent:"rgba(56, 189, 248, 0.55)",badge:"输入前置"},KnowledgeBaseManager:{title:"增强与路由层",description:"负责残差激活、语言补偿、去重和虫洞传播,决定系统是稳还是敢跳。",icon:"hub",accent:"rgba(251, 191, 36, 0.55)",badge:"检索后段"}},Ee={ContextFoldingV2:{thresholdBase:{label:"折叠阈值基准",summary:"上下文语义折叠V2的相似度判定基准线。相似度低于此值的远距离AI输出会被折叠为摘要。",logic:"调高(如0.60):更激进地折叠,只有高度相关的内容保留原文;调低(如0.40):更保守,大部分内容保留原文。",range:"建议区间: 0.35 ~ 0.65",tone:"sensitive"},thresholdRange:{label:"折叠阈值动态范围",summary:"阈值受逻辑深度(L)和语义宽度(S)调节后的上下限范围。",logic:"下限越低越保守(语义宽泛时保留更多);上限越高越激进(逻辑聚焦时折叠更多)。",range:"建议区间: [0.30, 0.70]",tone:"sensitive",tupleLabels:["下限","上限"]},lWeight:{label:"逻辑深度(L)系数",summary:"逻辑深度对阈值的调节力度。L高表示对话逻辑聚焦,阈值会升高以更激进地折叠无关内容。",logic:"调高:L对阈值的影响更大,聚焦对话时折叠更激进;调低:L影响减弱,对话焦点变化不会显著改变折叠行为。",range:"建议区间: 0.02 ~ 0.15",tone:"sensitive"},sWeight:{label:"语义宽度(S)系数",summary:"语义宽度对阈值的调节力度。S高表示对话语义宽泛,阈值会降低以保守保留更多上下文。",logic:"调高:S对阈值的影响更大,宽泛对话时折叠更保守;调低:S影响减弱,语义宽度变化不会显著改变折叠行为。",range:"建议区间: 0.02 ~ 0.15",tone:"sensitive"}},RAGDiaryPlugin:{noise_penalty:{label:"语义宽度惩罚",summary:"抑制对话发散时的标签误触发,避免噪音上下文把检索带偏。",logic:"调高后更保守,调低后更愿意从散乱上下文里寻找关联。",range:"建议 0.01 ~ 0.20",tone:"sensitive"},tagWeightRange:{label:"标签权重映射区间",summary:"决定标签得分在最终检索向量里最多能占到多少比重。",logic:"上限越高,结果越容易被标签牵引;下限越高,弱标签也更容易留下来。",range:"建议下限 0.01 ~ 0.10;上限 0.30 ~ 0.60",tone:"sensitive",tupleLabels:["最小权重","最大权重"]},tagTruncationBase:{label:"标签截断基准",summary:"定义默认保留多少比例的高分标签,控制召回的精简程度。",logic:"值越高越保留长尾标签,值越低越只保留核心标签。",range:"建议 0.40 ~ 0.80",tone:"stable"},tagTruncationRange:{label:"标签截断动态范围",summary:"给截断比例一个可上下摆动的活动区间,允许系统按语义强度自适应收放。",logic:"区间越宽,系统越愿意根据上下文自动放宽或收紧标签数量。",range:"建议下限 0.50;上限 0.90",tone:"stable",tupleLabels:["下限","上限"]},timeDecay:{label:"时间衰减回退",summary:"给旧记忆设置统一衰减策略,避免久远内容长期占优。",logic:"通常作为局部时间规则失效时的全局兜底。",range:"半衰期建议 15 ~ 90 天;最低分建议不低于 0.50",tone:"sensitive"},"timeDecay.halfLifeDays":{label:"半衰期天数",summary:"记忆分数衰减到一半所需的天数。",range:"建议 15 ~ 90 天",tone:"stable"},"timeDecay.minScore":{label:"最低保留阈值",summary:"衰减后的结果低于这个分数就会被过滤,用来清理过旧且相关度不足的记忆。",logic:"它不是给旧结果托底,而是在时间衰减和重排之后做一次保留阈值筛选。",range:"建议 0.50 ~ 0.80",tone:"stable"},mainSearchWeights:{label:"主检索权重分配",summary:"平衡用户当前输入和 AI 上下文意图在最终检索向量中的占比。",logic:"左侧更重当前问题,右侧更重模型对对话上下文的理解。",range:"常用组合 [0.7, 0.3] 或 [0.8, 0.2]",tone:"sensitive",tupleLabels:["用户输入","AI 意图"]},refreshWeights:{label:"流内刷新权重",summary:"控制工具刷新阶段里用户、AI 和工具结果三者的占比。",logic:"工具权重越高,刷新结果越贴近刚执行完的任务输出。",range:"常用组合 [0.5, 0.35, 0.15]",tone:"stable",tupleLabels:["用户","AI","工具结果"]},metaThinkingWeights:{label:"元思考递归权重",summary:"平衡原始查询和上一轮推理结果,决定递归思考是稳还是深。",logic:"推理结果权重越高,递归越深,但语义漂移风险也越大。",range:"常用组合 [0.8, 0.2]",tone:"sensitive",tupleLabels:["原始查询","推理结果"]}},KnowledgeBaseManager:{geodesicRerank:{label:"测地线重排(V8)",summary:"复用 Spike 距离场对 KNN 候选做基于 Tag 地形的二次重排。通过 ::TagMemo+ 修饰符激活。",logic:"V8 核心引擎,让被语义山峰挡住的相关记忆通过 Tag 拓扑关联浮出。三层防御链保证最坏情况无改动。",range:"包含 2 个子参数,见下方详细说明。",tone:"critical"},"geodesicRerank.alpha":{label:"测地线混合权重 (α)",summary:"测地线分数在最终排序中的占比。0=纯KNN余弦距离,1=纯测地线Tag地形距离。",logic:"调高:更信任 Tag 拓扑关联,被语义山峰遮挡的记忆更容易浮出;调低:更保守,主要依赖原始向量相似度。",range:"建议区间: 0.1 ~ 0.5 (默认 0.3)",tone:"sensitive"},"geodesicRerank.minGeoSamples":{label:"最小采样密度门槛",summary:"一个 chunk 在距离场上至少需要命中多少个 Tag 才有资格参与测地线评估。低于此值退化为纯 KNN。",logic:"调高:更严格,只有 Tag 密度高的 chunk 才会被测地线影响;调低:更宽松,但可能因采样不足导致估计不可靠。莱恩建议 4 作为基准。",range:"建议区间: 2 ~ 8 (整数,默认 4)",tone:"sensitive"},spikeRouting:{label:"虫洞脉冲路由",summary:"V7 的传播引擎,负责跳跃、衰减、扩散上限和新节点涌现。",logic:"这是最敏感的一组参数,建议一次只改一项并观察检索结果。",range:"共 8 个子参数,优先关注 tensionThreshold、baseMomentum 与两个 decay。",tone:"critical"},"spikeRouting.maxSafeHops":{label:"最高安全跳数",summary:"限制任意脉冲路径允许穿行的最大边数,避免图环回路无限扩散。",range:"建议 2 ~ 6",tone:"stable"},"spikeRouting.maxEmergentNodes":{label:"涌现节点上限",summary:"扩散结束后最多允许多少个新节点重新注入召回阶段。",range:"建议 10 ~ 100",tone:"sensitive"},"spikeRouting.maxNeighborsPerNode":{label:"单节点最大邻居数",summary:"每个节点放电时最多向多少个相邻节点传播,决定扩散宽度。",range:"建议 10 ~ 40",tone:"sensitive"},"spikeRouting.baseMomentum":{label:"初始动量 (TTL)",summary:"种子标签启动时拥有的初始动量,类似传播剩余生命值。",range:"建议 1.0 ~ 5.0",tone:"critical"},"spikeRouting.tensionThreshold":{label:"虫洞触发张力",summary:"张力达到多高才允许触发跨域虫洞跳跃。",logic:"这是全组最危险参数之一:过高几乎不跳,过低则到处穿洞。",range:"建议 0.50 ~ 3.00",tone:"critical"},"spikeRouting.firingThreshold":{label:"底层放电阈值",summary:"节点向下传播所需的最低内部能量,用来清理弱信号尾流。",range:"建议 0.05 ~ 0.20",tone:"stable"},"spikeRouting.baseDecay":{label:"常规区衰减",summary:"在同质稠密区域内传播时的能量保留比例。",logic:"值越低衰减越快,用来压制同类簇里的回声放大。",range:"建议 0.10 ~ 0.40",tone:"critical"},"spikeRouting.wormholeDecay":{label:"虫洞区衰减",summary:"穿透语义屏障后的能量保留比例,决定探索路径能走多远。",logic:"通常应明显高于 baseDecay,才能体现跨域探索的优势。",range:"建议 0.60 ~ 0.90",tone:"critical"},activationMultiplier:{label:"金字塔激活倍率区间",summary:"定义 TagMemo 激活系数的倍率区间,用于把金字塔特征映射到最终增强强度。",logic:"系统会根据覆盖率、相干性和噪音信号在两个边界之间插值;左侧是最低倍率,右侧是最高倍率。",range:"建议最小值 0.20 ~ 0.80;最大值 1.0 ~ 2.5",tone:"sensitive",tupleLabels:["最小值","最大值"]},dynamicBoostRange:{label:"动态增强修正",summary:"根据 EPA 或共振分析结果对标签增强做二次修正。",logic:"上限越高,强逻辑场景越容易冲破天花板;下限越低,混乱场景越会压掉增强。",range:"建议下限 0.10 ~ 0.50;上限 1.50 ~ 3.00",tone:"sensitive",tupleLabels:["下限","上限"]},coreBoostRange:{label:"核心标签聚光灯",summary:"给用户手动指定的 coreTags 额外特权,强行提升其存在感。",logic:"值越高越像显式强推,值越低则更接近轻提示。",range:"建议 0.10 ~ 2.00",tone:"sensitive",tupleLabels:["最小增益","最大增益"]},deduplicationThreshold:{label:"语义去重阈值",summary:"两个标签相似到什么程度就合并,避免标签云过度拥挤。",logic:"高值保留细微差别,低值则更激进地合并近义标签。",range:"建议 0.80 ~ 0.95",tone:"stable"},techTagThreshold:{label:"技术标签门槛",summary:"技术样式词进入 matchedTags 列表时所需的相对权重,主要影响非技术语境下的技术词暴露度。",logic:"调高后代码片段、文件名和术语更难出现在返回标签里;它不会直接改写已构建好的上下文向量,但会影响调试观测和部分依赖 matchedTags 的后续逻辑。",range:"建议 0.02 ~ 0.20",tone:"sensitive"},normalTagThreshold:{label:"普通标签门槛",summary:"普通标签进入 matchedTags 列表的相对门槛,用来控制返回标签信息的密度。",logic:"调高后返回标签更少更干净,调低后可见标签更多;它主要影响标签展示与统计,不直接决定向量融合。",range:"建议 0.01 ~ 0.05",tone:"stable"},languageCompensator:{label:"语言置信度补偿",summary:"在启用语言置信度门控后,对非技术语境中的技术型词汇施加惩罚,降低跨语境技术噪音。",logic:"值越小惩罚越重;主要命中非中文且带技术命名特征的词,Unknown 与跨领域语境分别使用不同罚值。",range:"默认常见值:未知语境 0.05,跨领域 0.10",tone:"sensitive"},"languageCompensator.penaltyUnknown":{label:"未知语境惩罚",summary:"语境无法识别时采用的兜底惩罚系数。",range:"建议 0.01 ~ 0.50",tone:"stable"},"languageCompensator.penaltyCrossDomain":{label:"跨领域惩罚",summary:"语境可识别但与标签领域冲突时使用的惩罚系数。",range:"建议 0.01 ~ 0.50",tone:"stable"}}};function Ce(v){return Se[v]??{...De,title:v}}function te(v,_){return Ee[v]?.[_]??{...Ne,label:_}}function Ie(v,_){return v.tupleLabels?.[_]??`值 ${_+1}`}function X(v){switch(v){case"critical":return"高风险";case"sensitive":return"高敏感";default:return"稳态"}}function $(v,_){const c=v.toLowerCase();return c==="tensionthreshold"?{min:.5,max:3,step:.01}:c==="firingthreshold"?{min:0,max:1,step:.01}:c==="basemomentum"?{min:1,max:10,step:.1}:c==="basedecay"||c==="wormholedecay"?{min:0,max:1,step:.01}:c==="maxsafehops"?{min:1,max:20,step:1}:c==="maxemergentnodes"?{min:1,max:200,step:1}:c==="maxneighborspernode"?{min:1,max:20,step:1}:c==="alpha"?{min:0,max:1,step:.01}:c.includes("samples")?{min:1,max:20,step:1}:c.includes("days")?{min:1,max:365,step:1}:c.includes("threshold")?{min:0,max:1,step:.01}:c.includes("hops")||c.includes("nodes")||c.includes("neighbors")?{min:1,max:c.includes("nodes")?200:20,step:1}:c.includes("momentum")?{min:1,max:10,step:.1}:c.includes("penalty")||c.includes("score")||c.includes("min")?{min:0,max:1,step:.01}:typeof _=="number"&&!Number.isInteger(_)?{min:0,max:Math.max(10,Math.ceil(_*20)),step:.01}:{min:0,max:100,step:1}}var Pe={key:0,class:"wormhole-modal",role:"dialog","aria-modal":"true","aria-labelledby":"wormhole-routing-title"},Ve={class:"wormhole-modal__header"},Oe={class:"wormhole-modal__hero"},We={class:"wormhole-modal__title-row"},Ge={class:"wormhole-modal__badges"},Be={class:"wormhole-badge wormhole-badge--neutral"},Fe={class:"wormhole-modal__header-actions"},Ue=["disabled"],je=["form","disabled"],He={class:"wormhole-modal__body"},ze={class:"wormhole-modal__nav"},Qe={class:"wormhole-sidebar-card"},Ye={class:"wormhole-sidebar-card__nav-list"},Je=["onClick"],Ze={class:"material-symbols-outlined"},qe={class:"wormhole-nav-btn__copy"},Xe={class:"wormhole-sidebar-card"},Ke={class:"wormhole-profile__meter"},ea={class:"wormhole-modal__workspace"},aa={class:"wormhole-overview"},la={class:"wormhole-panel-header"},sa={class:"wormhole-field-list"},ta={class:"wormhole-field__copy"},ra={class:"wormhole-field__heading"},oa={class:"wormhole-field__key"},na={class:"wormhole-field__pills"},ia={key:1,class:"wormhole-badge wormhole-badge--changed"},da={class:"wormhole-field__summary"},ua={key:0,class:"wormhole-field__range"},ma={key:1,class:"wormhole-field__details"},ca={class:"wormhole-field__control"},va=["aria-label","value","min","max","step","onInput"],_a={class:"wormhole-field__number-row"},ga=["aria-label","value","min","max","step","onInput"],ha={class:"wormhole-field__current"},pa={class:"wormhole-modal__insights"},ba={class:"wormhole-sidebar-card"},fa={class:"wormhole-insight-list"},ya={class:"wormhole-sidebar-card"},wa={key:0,class:"wormhole-change-list"},ka={key:1,class:"wormhole-empty-state"},$a=ce({__name:"WormholeRoutingModal",props:{modelValue:{type:Boolean},groupName:{},paramKey:{},values:{},originalValues:{},changedLeaves:{},totalLeaves:{},isSaving:{type:Boolean},isDirty:{type:Boolean},formId:{}},emits:["close","restore","updateField"],setup(v,{emit:_}){const c=v,S=_,y=R(null),T=R(G[0].id),L=R(""),w=f(()=>G.find(n=>n.id===T.value)??G[0]),E=f(()=>Object.keys(c.values).filter(n=>c.values[n]!==c.originalValues[n])),B=f(()=>{const n={trigger:0,spread:0,decay:0};for(const i of G)n[i.id]=i.keys.filter(t=>c.values[t]!==c.originalValues[t]).length;return n}),A=f(()=>ve.map(n=>({key:n,label:b(n).label,value:H(c.values[n]),hint:ee(n)}))),V=f(()=>{const n=F(c.values.baseMomentum??1,1,5)*.35+(1-F(c.values.tensionThreshold??1,.5,3))*.35+F(c.values.wormholeDecay??.7,.6,.9)*.2+(1-F(c.values.baseDecay??.2,.1,.4))*.1;return n>=.68?{tone:"critical",label:"激进扩散",summary:"基于当前 4 项核心参数的前端估算,这组配置更愿意跨域跳转,探索更强,但也更容易放大噪声与语义漂移。",score:n}:n<=.4?{tone:"stable",label:"保守探索",summary:"基于当前 4 项核心参数的前端估算,这组配置更偏向留在本域与近邻传播,结果更稳,但可能错过远距离联想。",score:n}:{tone:"sensitive",label:"平衡默认",summary:"基于当前 4 项核心参数的前端估算,这组配置在稳定和探索之间折中,适合大多数常规对话与召回场景。",score:n}}),K=f(()=>{const n=(E.value.length>0?E.value:w.value.keys).map(i=>le[i]).filter(i=>!!i);return Array.from(new Map(n.map(i=>[i.title,i])).values())});function b(n){return te(c.groupName,`${c.paramKey}.${n}`)}function ee(n){switch(n){case"tensionThreshold":return"越低越容易跨域";case"baseMomentum":return"越高越能继续传播";case"baseDecay":return"越低越快衰减";case"wormholeDecay":return"越高越保留跨域收益";default:return"关键指标"}}function F(n,i,t){if(t<=i)return 0;const h=(n-i)/(t-i);return Math.min(1,Math.max(0,h))}function H(n){if(n===void 0)return"--";if(Number.isInteger(n))return String(n);const i=Math.abs(n)>=1?2:3;return n.toFixed(i).replace(/\.?0+$/,"")}function x(n){const i=c.originalValues[n],t=c.values[n];if(i===void 0||t===i)return null;const h=t-i;return`${h>0?"+":""}${H(h)}`}function ae(n){return c.values[n]!==c.originalValues[n]}function z(n,i){const t=i.target;if(!t||t.value==="")return;const h=Number(t.value);Number.isNaN(h)||S("updateField",n,h)}function O(){if(!y.value)return[];const n=["button:not([disabled])","a[href]","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","[tabindex]:not([tabindex='-1'])"].join(",");return Array.from(y.value.querySelectorAll(n)).filter(i=>!i.hasAttribute("disabled"))}function Q(n){if(n.key==="Escape"){n.preventDefault(),S("close");return}if(n.key!=="Tab")return;const i=O();if(i.length===0){n.preventDefault(),y.value?.focus();return}const t=i[0],h=i[i.length-1],W=document.activeElement,J=!!(W&&y.value?.contains(W));if(n.shiftKey){(!J||W===t)&&(n.preventDefault(),h.focus());return}(!J||W===h)&&(n.preventDefault(),t.focus())}function U(){const n=new Set(E.value);return G.find(i=>i.keys.some(t=>n.has(t)))?.id??G[0].id}function Y(n){if(!(typeof document>"u")){if(n){L.value=document.body.style.overflow,document.body.style.overflow="hidden";return}document.body.style.overflow=L.value}}Re(()=>c.modelValue,async n=>{Y(n),n&&(T.value=U(),await Le(),y.value?.focus())}),Me(()=>{Y(!1)});const le={tensionThreshold:{title:"张力阈值会牵动整体跨域意愿",body:"如果它降得太低,最好同步关注 baseMomentum 和 wormholeDecay,否则很容易出现跳得出去却收不回来的情况。"},baseMomentum:{title:"初始动量决定第一跳后还能不能继续扩散",body:"调高它时,建议同时盯住 maxSafeHops 和 baseDecay,避免高动量带来层层外溢。"},baseDecay:{title:"常规衰减是控制本域回声的刹车",body:"如果常规衰减太低,哪怕虫洞参数不激进,也可能在本域里积累过多回音。"},wormholeDecay:{title:"虫洞衰减决定跨域收益会不会保留下来",body:"它通常应明显高于 baseDecay,才能体现跨域探索的价值,但过高也会把偏题结果带回主链路。"},maxSafeHops:{title:"安全跳数是扩散上限",body:"当 baseMomentum 较高时,再放大 hop 上限会显著提升探索跨度,也会提高响应不稳定性。"},maxEmergentNodes:{title:"涌现节点上限影响结果回流密度",body:"这个值与 maxNeighborsPerNode 共同决定扩散后会有多少新节点重新进入召回排序。"},maxNeighborsPerNode:{title:"单节点邻居数决定扩散宽度",body:"如果你已经提高了 maxEmergentNodes,再继续放大邻居数,结果会更发散,也更容易出现噪声堆积。"},firingThreshold:{title:"放电阈值是弱信号清理器",body:"适度提高它可以压掉尾流噪声,但如果张力阈值也偏高,整体路由会迅速变得保守。"}};return(n,i)=>(d(),me(Te,{to:"body"},[v.modelValue?(d(),u("div",Pe,[e("div",{class:"wormhole-modal__backdrop","aria-hidden":"true",onClick:i[0]||(i[0]=t=>S("close"))}),e("div",{ref_key:"dialogRef",ref:y,class:"wormhole-modal__shell",tabindex:"-1",onKeydown:Q},[e("header",Ve,[e("div",Oe,[i[5]||(i[5]=e("span",{class:"wormhole-modal__eyebrow"},"Wormhole Routing Cockpit",-1)),e("div",We,[i[4]||(i[4]=e("div",null,[e("h3",{id:"wormhole-routing-title"},"虫洞脉冲路由")],-1)),e("div",Ge,[i[3]||(i[3]=e("span",{class:"wormhole-badge wormhole-badge--critical"},"高风险",-1)),e("span",Be," 已改 "+r(v.changedLeaves)+"/"+r(v.totalLeaves),1)])])]),e("div",Fe,[e("button",{type:"button",class:"btn-secondary",disabled:v.changedLeaves===0,onClick:i[1]||(i[1]=t=>S("restore"))}," 恢复虫洞参数 ",8,Ue),e("button",{type:"button",class:"btn-secondary",onClick:i[2]||(i[2]=t=>S("close"))}," 收起舱门 "),e("button",{type:"submit",class:"btn-primary",form:v.formId,disabled:v.isSaving||!v.isDirty},r(v.isSaving?"保存中…":"保存全部参数"),9,je)])]),e("div",He,[e("aside",ze,[e("div",Qe,[i[6]||(i[6]=e("span",{class:"wormhole-sidebar-card__label"},"导航",-1)),e("div",Ye,[(d(!0),u(k,null,M(g(G),t=>(d(),u("button",{key:t.id,type:"button",class:I(["wormhole-nav-btn",{"wormhole-nav-btn--active":t.id===w.value.id}]),onClick:h=>T.value=t.id},[e("span",Ze,r(t.icon),1),e("span",qe,[e("strong",null,r(t.title),1),e("small",null,r(B.value[t.id])+" 项改动",1)])],10,Je))),128))])]),e("div",Xe,[i[7]||(i[7]=e("span",{class:"wormhole-sidebar-card__label"},"当前画像(估算)",-1)),e("div",{class:I(["wormhole-profile",`wormhole-profile--${V.value.tone}`])},[e("strong",null,r(V.value.label),1),e("p",null,r(V.value.summary),1),e("div",Ke,[e("span",{style:de({width:`${V.value.score*100}%`})},null,4)])],2)])]),e("section",ea,[e("div",aa,[(d(!0),u(k,null,M(A.value,t=>(d(),u("article",{key:t.key,class:"wormhole-overview__item"},[e("span",null,r(t.label),1),e("strong",null,r(t.value),1),e("small",null,r(t.hint),1)]))),128))]),e("header",la,[e("div",null,[i[8]||(i[8]=e("span",{class:"wormhole-panel-header__label"},"当前分组",-1)),e("h4",null,r(w.value.title),1)]),e("p",null,r(w.value.summary),1)]),e("div",sa,[(d(!0),u(k,null,M(w.value.keys,t=>(d(),u("article",{key:t,class:I(["wormhole-field",{"wormhole-field--changed":ae(t)}])},[e("div",ta,[e("div",ra,[e("div",null,[e("h5",null,r(b(t).label),1),e("p",oa,r(t),1)]),e("div",na,[b(t).tone?(d(),u("span",{key:0,class:I(["wormhole-badge",`wormhole-badge--${b(t).tone}`])},r(g(X)(b(t).tone)),3)):p("",!0),x(t)?(d(),u("span",ia,r(x(t)),1)):p("",!0)])]),e("p",da,r(b(t).summary),1),b(t).range?(d(),u("p",ua,r(b(t).range),1)):p("",!0),b(t).logic?(d(),u("details",ma,[i[9]||(i[9]=e("summary",null,"展开调优逻辑",-1)),e("p",null,r(b(t).logic),1)])):p("",!0)]),e("div",ca,[e("input",{class:"wormhole-field__slider",type:"range","aria-label":`${b(t).label} 滑杆`,value:v.values[t],min:g($)(t).min,max:g($)(t).max,step:g($)(t).step,onInput:h=>z(t,h)},null,40,va),e("div",_a,[e("input",{class:"wormhole-field__number",type:"number","aria-label":`${b(t).label} 数值输入`,value:v.values[t],min:g($)(t).min,max:g($)(t).max,step:g($)(t).step,onInput:h=>z(t,h)},null,40,ga),e("span",ha,r(H(v.values[t])),1)])])],2))),128))])]),e("aside",pa,[e("div",ba,[i[10]||(i[10]=e("span",{class:"wormhole-sidebar-card__label"},"联动提示",-1)),e("ul",fa,[(d(!0),u(k,null,M(K.value,t=>(d(),u("li",{key:t.title},[e("strong",null,r(t.title),1),e("p",null,r(t.body),1)]))),128))])]),e("div",ya,[i[11]||(i[11]=e("span",{class:"wormhole-sidebar-card__label"},"未保存修改",-1)),E.value.length>0?(d(),u("ul",wa,[(d(!0),u(k,null,M(E.value,t=>(d(),u("li",{key:t},[e("span",null,r(b(t).label),1),e("strong",null,r(x(t)),1)]))),128))])):(d(),u("p",ka," 目前还没有未保存修改,建议一次只微调 1 到 2 个关键参数。 "))]),i[12]||(i[12]=e("div",{class:"wormhole-sidebar-card"},[e("span",{class:"wormhole-sidebar-card__label"},"操作建议"),e("ul",{class:"wormhole-insight-list"},[e("li",null,[e("strong",null,"先看点火,再看衰减"),e("p",null,"如果召回开始漂移,优先回看 tensionThreshold、baseMomentum 与 wormholeDecay。")]),e("li",null,[e("strong",null,"大改之前先保存快照"),e("p",null,"虫洞参数耦合较强,连续调很多项时很容易把问题来源混在一起。")])])],-1))])])],544)])):p("",!0)]))}}),La=ue($a,[["__scopeId","data-v-cdd01eba"]]),xa={class:"config-section active-section rag-lab"},Ra={class:"rag-lab__hero card"},Ma={class:"rag-lab__hero-stats"},Ta={class:"hero-stat"},Aa={class:"hero-stat__value"},Da={class:"hero-stat"},Na={class:"hero-stat__value"},Sa={class:"hero-stat__value"},Ea={key:0,class:"rag-lab__state card"},Ca={key:1,class:"rag-lab__state rag-lab__state--error card"},Ia={class:"rag-lab__main"},Pa=["id"],Va={class:"group-panel__header"},Oa={class:"group-panel__header-main"},Wa={class:"group-panel__badge"},Ga={class:"group-panel__title-row"},Ba={class:"material-symbols-outlined"},Fa={class:"group-panel__name"},Ua={class:"group-panel__description"},ja={class:"group-panel__metrics"},Ha={class:"group-panel__metric"},za={class:"group-panel__metric"},Qa={class:"group-panel__list"},Ya={key:0,class:"wormhole-launchpad"},Ja={class:"wormhole-launchpad__copy"},Za={class:"param-row__heading"},qa={class:"param-row__title-block"},Xa={class:"param-row__key"},Ka={class:"param-row__pills"},el={class:"mini-pill mini-pill--critical"},al={key:0,class:"mini-pill mini-pill--changed"},ll={class:"param-row__summary"},sl={key:0,class:"param-row__range"},tl={key:1,class:"param-row__details"},rl={class:"param-row__details-body"},ol={class:"wormhole-launchpad__control"},nl={class:"wormhole-launchpad__stats"},il={class:"param-row__copy"},dl={class:"param-row__heading"},ul={class:"param-row__title-block"},ml={class:"param-row__key"},cl={class:"param-row__pills"},vl={class:"mini-pill mini-pill--neutral"},_l={key:1,class:"mini-pill mini-pill--changed"},gl={class:"param-row__summary"},hl={key:0,class:"param-row__range"},pl={key:1,class:"param-row__details"},bl={class:"param-row__details-body"},fl={class:"param-row__control"},yl={key:0,class:"control-shell"},wl=["for"],kl=["id","onUpdate:modelValue","step"],$l={key:1,class:"control-shell control-shell--tuple"},Ll={class:"tuple-grid"},xl=["onUpdate:modelValue","step"],Rl={key:2,class:"control-shell control-shell--nested"},Ml={class:"nested-header"},Tl={class:"nested-list"},Al={class:"nested-item__copy"},Dl={class:"nested-item__title"},Nl={class:"nested-item__key"},Sl={class:"nested-item__summary"},El={class:"nested-item__meta"},Cl={key:1,class:"nested-item__range"},Il={class:"nested-item__control"},Pl=["onUpdate:modelValue","aria-label","min","max","step"],Vl=["onUpdate:modelValue","aria-label","min","max","step"],Ol={class:"rag-lab__aside"},Wl={class:"rag-console card"},Gl={class:"rag-console__actions"},Bl=["disabled"],Fl=["disabled"],Ul={class:"rag-console__section"},jl={class:"rag-console__jump-list"},Hl=["onClick"],N="KnowledgeBaseManager",C="spikeRouting",ie="rag-tuning-form",zl=ce({__name:"RagTuning",setup(v){const _=R({}),c=R({}),S=R(!0),y=R(!1),T=R(""),L=R(""),w=R("info"),E=R(!1);function B(a){return JSON.parse(JSON.stringify(a))}function A(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function V(a){return Array.isArray(a)?a.length:A(a)?Object.keys(a).length:1}function K(a,l){if(l===void 0)return V(a);if(Array.isArray(a)&&Array.isArray(l)){const o=Math.max(a.length,l.length);let s=0;for(let m=0;m{a[m]!==l[m]&&(s+=1)}),s}return a===l?0:1}function b(a){return`rag-group-${a.replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()||"default"}`}function ee(a,l){return`rag-field-${a}-${l}`.replace(/[^a-zA-Z0-9_-]+/g,"-")}function F(a,l){const o=ne.indexOf(a),s=ne.indexOf(l);return o===-1&&s===-1?a.localeCompare(l):o===-1?1:s===-1?-1:o-s}function H(a,l,o,s){const m={key:l,fieldId:ee(a,l),meta:te(a,l),changedLeaves:K(o,s),totalLeaves:V(o)};return Array.isArray(o)?{...m,kind:"tuple",value:o}:A(o)?{...m,kind:"nested",value:o}:{...m,kind:"number",value:o}}const x=f(()=>Object.entries(_.value).sort(([a],[l])=>F(a,l)).map(([a,l])=>{const o=Object.entries(l).map(([s,m])=>H(a,s,m,c.value[a]?.[s]));return{name:a,anchor:b(a),meta:Ce(a),raw:l,entries:o,changedLeaves:o.reduce((s,m)=>s+m.changedLeaves,0),totalLeaves:o.reduce((s,m)=>s+m.totalLeaves,0)}})),ae=f(()=>x.value.reduce((a,l)=>a+l.totalLeaves,0)),z=f(()=>x.value.reduce((a,l)=>a+l.changedLeaves,0)),O=f(()=>z.value>0),Q=f(()=>x.value.length>0),U=f(()=>{const a=x.value.find(l=>l.name===N)?.entries.find(l=>l.key===C);return a&&a.kind==="nested"?a:null}),Y=f(()=>{const a=_.value[N]?.[C];return A(a)?a:{}}),le=f(()=>{const a=c.value[N]?.[C];return A(a)?a:{}});function n(a){return a.kind==="nested"&&a.key===C}function i(a,l){return a===N&&n(l)}function t(a){switch(a){case"number":return"单值";case"tuple":return"区间/配比";case"nested":return"子模块";default:return"参数"}}function h(a){if(a===void 0)return"--";if(Number.isInteger(a))return String(a);const l=Math.abs(a)>=1?2:3;return a.toFixed(l).replace(/\.?0+$/,"")}function W(a){return Number.isInteger(a)&&Math.abs(a)>=1?1:Math.abs(a)<.1?.001:Math.abs(a)<1?.01:.05}function J(a,l){return Ie(a.meta,l)}function D(a,l,o){return te(a,`${l}.${o}`)}function _e(a){return D(N,C,a).label}function ge(a,l){return n(a)?h(a.value[l]):"--"}function he(a){document.getElementById(a)?.scrollIntoView({behavior:"smooth",block:"start"})}function pe(){U.value&&(E.value=!0)}function be(){E.value=!1}function fe(a,l){const o=_.value[N]?.[C];A(o)&&(o[a]=l)}function ye(){const a=c.value[N]?.[C];!_.value[N]||!A(a)||(_.value[N][C]={...a},L.value="已恢复虫洞脉冲路由的未保存修改。",w.value="info")}async function re(){S.value=!0,T.value="";try{const a=await oe.getRagParams({showLoader:!1,loadingKey:"rag-tuning.params.load"});_.value=B(a),c.value=B(a)}catch(a){T.value=`加载失败:${a instanceof Error?a.message:String(a)}`,L.value=T.value,w.value="error",console.error("Failed to load RAG params:",a),se(T.value,"error")}finally{S.value=!1}}async function we(){if(!(!Q.value||!O.value||y.value)){y.value=!0;try{await oe.saveRagParams(_.value,{loadingKey:"rag-tuning.params.save"}),c.value=B(_.value),L.value="RAG 参数已保存。",w.value="success",se("RAG 参数已保存。","success")}catch(a){L.value=`保存失败:${a instanceof Error?a.message:String(a)}`,w.value="error",se(L.value,"error")}finally{y.value=!1}}}function ke(){_.value=B(c.value),L.value="已恢复到最近一次保存的参数状态。",w.value="info"}return xe(()=>{re()}),(a,l)=>(d(),u("section",xa,[e("header",Ra,[l[3]||(l[3]=e("div",{class:"rag-lab__hero-copy"},[e("span",{class:"rag-lab__eyebrow"},"Wave RAG Parameter Lab"),e("h2",null,"浪潮 RAG 参数调优工作台"),e("p",{class:"description"}," 集中查看和调整浪潮 RAG 的核心参数,支持按模块浏览、快速定位高影响项,并对虫洞脉冲路由等复杂参数进入独立控制舱进行细化编辑。 ")],-1)),e("div",Ma,[e("div",Ta,[e("span",Aa,r(x.value.length),1),l[0]||(l[0]=e("span",{class:"hero-stat__label"},"参数组",-1))]),e("div",Da,[e("span",Na,r(ae.value),1),l[1]||(l[1]=e("span",{class:"hero-stat__label"},"可调节点",-1))]),e("div",{class:I(["hero-stat",{"hero-stat--warning":O.value}])},[e("span",Sa,r(z.value),1),l[2]||(l[2]=e("span",{class:"hero-stat__label"},"未保存修改",-1))],2)])]),S.value?(d(),u("div",Ea,[...l[4]||(l[4]=[e("span",{class:"material-symbols-outlined"},"hourglass_top",-1),e("div",null,[e("strong",null,"正在加载 RAG 参数"),e("p",null,"读取完成后会按分组展开到参数工作台中。")],-1)])])):T.value?(d(),u("div",Ca,[l[6]||(l[6]=e("span",{class:"material-symbols-outlined"},"error",-1)),e("div",null,[l[5]||(l[5]=e("strong",null,"参数加载失败",-1)),e("p",null,r(T.value),1)]),e("button",{type:"button",class:"btn-secondary",onClick:re},"重新加载")])):(d(),u("form",{key:2,id:ie,class:"rag-lab__workspace",onSubmit:Ae(we,["prevent"])},[e("div",Ia,[(d(!0),u(k,null,M(x.value,o=>(d(),u("article",{id:o.anchor,key:o.name,class:"group-panel card",style:de({"--group-accent":o.meta.accent})},[e("header",Va,[e("div",Oa,[e("span",Wa,r(o.meta.badge),1),e("div",Ga,[e("span",Ba,r(o.meta.icon),1),e("div",null,[e("h3",null,r(o.meta.title),1),e("p",Fa,r(o.name),1)])]),e("p",Ua,r(o.meta.description),1)]),e("div",ja,[e("div",Ha,[e("span",null,r(o.entries.length),1),l[7]||(l[7]=e("small",null,"模块",-1))]),e("div",za,[e("span",null,r(o.changedLeaves)+"/"+r(o.totalLeaves),1),l[8]||(l[8]=e("small",null,"已改动",-1))])])]),e("div",Qa,[(d(!0),u(k,null,M(o.entries,s=>(d(),u("section",{key:s.key,class:I(["param-row",`param-row--${s.kind}`,{"param-row--changed":s.changedLeaves>0,"param-row--wormhole":i(o.name,s)}])},[i(o.name,s)?(d(),u("div",Ya,[e("div",Ja,[e("div",Za,[e("div",qa,[e("h4",null,r(s.meta.label),1),e("p",Xa,r(s.key),1)]),e("div",Ka,[e("span",el,r(g(X)(s.meta.tone)),1),s.changedLeaves>0?(d(),u("span",al," 已修改 "+r(s.changedLeaves),1)):p("",!0)])]),e("p",ll,r(s.meta.summary),1),s.meta.range?(d(),u("p",sl,[l[9]||(l[9]=e("span",{class:"material-symbols-outlined"},"straighten",-1)),j(" "+r(s.meta.range),1)])):p("",!0),s.meta.logic?(d(),u("details",tl,[l[10]||(l[10]=e("summary",null,"展开调优逻辑",-1)),e("div",rl,[e("p",null,r(s.meta.logic),1)])])):p("",!0)]),e("div",ol,[e("div",nl,[(d(!0),u(k,null,M(g(ve),m=>(d(),u("article",{key:m,class:"wormhole-launchpad__stat"},[e("span",null,r(_e(m)),1),e("strong",null,r(ge(s,m)),1)]))),128))]),e("div",{class:"wormhole-launchpad__footer"},[e("button",{type:"button",class:"btn-primary",onClick:pe}," 打开虫洞控制舱 ")])])])):(d(),u(k,{key:1},[e("div",il,[e("div",dl,[e("div",ul,[e("h4",null,r(s.meta.label),1),e("p",ml,r(s.key),1)]),e("div",cl,[e("span",vl,r(t(s.kind)),1),s.meta.tone?(d(),u("span",{key:0,class:I(["mini-pill",`mini-pill--${s.meta.tone}`])},r(g(X)(s.meta.tone)),3)):p("",!0),s.changedLeaves>0?(d(),u("span",_l," 已修改 "+r(s.changedLeaves),1)):p("",!0)])]),e("p",gl,r(s.meta.summary),1),s.meta.range?(d(),u("p",hl,[l[11]||(l[11]=e("span",{class:"material-symbols-outlined"},"straighten",-1)),j(" "+r(s.meta.range),1)])):p("",!0),s.meta.logic?(d(),u("details",pl,[l[12]||(l[12]=e("summary",null,"展开调优逻辑",-1)),e("div",bl,[e("p",null,r(s.meta.logic),1)])])):p("",!0)]),e("div",fl,[s.kind==="number"?(d(),u("div",yl,[e("label",{class:"control-shell__label",for:s.fieldId},"当前数值",8,wl),Z(e("input",{id:s.fieldId,"onUpdate:modelValue":m=>o.raw[s.key]=m,type:"number",step:W(s.value)},null,8,kl),[[q,o.raw[s.key],void 0,{number:!0}]])])):s.kind==="tuple"?(d(),u("div",$l,[e("div",Ll,[(d(!0),u(k,null,M(s.value,(m,P)=>(d(),u("label",{key:`${s.key}-${P}`,class:"tuple-field"},[e("span",null,r(J(s,P)),1),Z(e("input",{"onUpdate:modelValue":$e=>o.raw[s.key][P]=$e,type:"number",step:W(m)},null,8,xl),[[q,o.raw[s.key][P],void 0,{number:!0}]])]))),128))])])):(d(),u("div",Rl,[e("div",Ml,[l[13]||(l[13]=e("span",null,"子参数模块",-1)),e("span",null,r(Object.keys(s.value).length)+" 项",1)]),e("div",Tl,[(d(!0),u(k,null,M(Object.keys(s.value),m=>(d(),u("div",{key:`${s.key}-${m}`,class:"nested-item"},[e("div",Al,[e("div",Dl,[e("h5",null,r(D(o.name,s.key,m).label),1),e("span",Nl,r(m),1)]),e("p",Sl,r(D(o.name,s.key,m).summary),1),e("div",El,[D(o.name,s.key,m).tone?(d(),u("span",{key:0,class:I(["mini-pill",`mini-pill--${D(o.name,s.key,m).tone}`])},r(g(X)(D(o.name,s.key,m).tone)),3)):p("",!0),D(o.name,s.key,m).range?(d(),u("span",Cl,r(D(o.name,s.key,m).range),1)):p("",!0)])]),e("div",Il,[Z(e("input",{"onUpdate:modelValue":P=>o.raw[s.key][m]=P,class:"nested-item__slider",type:"range","aria-label":`${D(o.name,s.key,m).label} 滑杆`,min:g($)(m).min,max:g($)(m).max,step:g($)(m).step},null,8,Pl),[[q,o.raw[s.key][m],void 0,{number:!0}]]),Z(e("input",{"onUpdate:modelValue":P=>o.raw[s.key][m]=P,class:"nested-item__number",type:"number","aria-label":`${D(o.name,s.key,m).label} 数值输入`,min:g($)(m).min,max:g($)(m).max,step:g($)(m).step},null,8,Vl),[[q,o.raw[s.key][m],void 0,{number:!0}]])])]))),128))])]))])],64))],2))),128))])],12,Pa))),128))]),e("aside",Ol,[e("div",Wl,[l[15]||(l[15]=e("div",{class:"rag-console__section"},[e("span",{class:"rag-console__label"},"操作台"),e("h3",null,"保存与回退"),e("p",null,"建议一次只改一组高敏参数,并在每次保存后观察实际召回结果。")],-1)),e("div",Gl,[e("button",{type:"submit",class:"btn-primary",disabled:y.value||!Q.value||!O.value},r(y.value?"保存中…":"保存参数配置"),9,Bl),e("button",{type:"button",class:"btn-secondary",disabled:!O.value,onClick:ke}," 重置未保存修改 ",8,Fl)]),L.value?(d(),u("p",{key:0,class:I(["rag-console__status",`rag-console__status--${w.value}`]),role:"status","aria-live":"polite"},r(L.value),3)):p("",!0),e("div",Ul,[l[14]||(l[14]=e("span",{class:"rag-console__label"},"快速跳转",-1)),e("div",jl,[(d(!0),u(k,null,M(x.value,o=>(d(),u("button",{key:`${o.name}-jump`,type:"button",class:"rag-console__jump-btn",onClick:s=>he(o.anchor)},[e("span",null,r(o.meta.title),1),e("small",null,r(o.changedLeaves)+"/"+r(o.totalLeaves),1)],8,Hl))),128))])]),l[16]||(l[16]=e("div",{class:"rag-console__section"},[e("span",{class:"rag-console__label"},"风险提示"),e("ul",{class:"rag-console__tips"},[e("li",null,"标记为“高风险”的参数建议单独修改并观察效果。"),e("li",null,"虫洞路由参数之间耦合较强,不建议一次联动改太多项。"),e("li",null,[j(" 如果召回突然漂移,优先回看 "),e("code",null,"tensionThreshold"),j("、 "),e("code",null,"baseMomentum"),j(" 和 "),e("code",null,"dynamicBoostRange"),j("。 ")])])],-1))])])],32)),U.value?(d(),me(La,{key:3,"model-value":E.value,"group-name":N,"param-key":C,values:Y.value,"original-values":le.value,"changed-leaves":U.value.changedLeaves,"total-leaves":U.value.totalLeaves,"is-saving":y.value,"is-dirty":O.value,"form-id":ie,onClose:be,onRestore:ye,onUpdateField:fe},null,8,["model-value","values","original-values","changed-leaves","total-leaves","is-saving","is-dirty"])):p("",!0)]))}}),Zl=ue(zl,[["__scopeId","data-v-20d809f9"]]);export{Zl as default}; diff --git a/AdminPanel-Vue/dist/assets/js/SarPromptEditor-D-dh95d_.js b/AdminPanel-Vue/dist/assets/js/SarPromptEditor-Bq853TUQ.js similarity index 96% rename from AdminPanel-Vue/dist/assets/js/SarPromptEditor-D-dh95d_.js rename to AdminPanel-Vue/dist/assets/js/SarPromptEditor-Bq853TUQ.js index 71f547116..94c5edac1 100644 --- a/AdminPanel-Vue/dist/assets/js/SarPromptEditor-D-dh95d_.js +++ b/AdminPanel-Vue/dist/assets/js/SarPromptEditor-Bq853TUQ.js @@ -1 +1 @@ -import{Dt as U,N as w,O as x,Q as v,U as c,a as I,f as l,h,j as d,l as e,n as V,v as E}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as m}from"./dashboard-card-news-BnyB_dHU.js";import{M as f}from"./dashboard-card-calendar-CA3-tSpi.js";var b="/admin_api/sarprompts",A={showLoader:!1},S={async getPrompts(p=A){return f({url:b},p)},async savePrompts(p,r={}){await f({url:b,method:"POST",body:p},r)}},B={class:"config-section active-section sarprompt-page"},C={class:"page-header"},T={class:"header-actions"},D=["disabled"],L=["disabled"],N={key:0,class:"empty-tip card"},F={key:1,class:"empty-tip card"},M={key:2,class:"sarprompt-list"},O={class:"rule-head"},K=["onUpdate:modelValue"],$=["onClick"],j={class:"rule-body"},G={class:"form-group full-width"},R=["onUpdate:modelValue","onBlur"],q={class:"form-group full-width"},Q=["onUpdate:modelValue"],W={class:"editor-actions"},z=["disabled"],H=E({__name:"SarPromptEditor",setup(p){const r=v([]),n=v(!1),u=v(!1),_=async()=>{n.value=!0;try{r.value=(await S.getPrompts()).map(s=>({...s,modelsInput:s.models.join(", ")}))}catch(s){console.error("Failed to fetch SarPrompts:",s)}finally{n.value=!1}},P=()=>{r.value.push({promptKey:`SarPrompt${r.value.length+1}`,models:[],modelsInput:"",content:""})},g=s=>{r.value.splice(s,1)},y=s=>{const t=r.value[s];t.models=t.modelsInput.split(",").map(a=>a.trim()).filter(a=>a!=="")},k=async()=>{u.value=!0;try{r.value.forEach((t,a)=>y(a));const s=r.value.map(({promptKey:t,models:a,content:i})=>({promptKey:t,models:a,content:i}));await S.savePrompts(s)}catch(s){console.error("Failed to save SarPrompts:",s)}finally{u.value=!1}};return x(()=>{_()}),(s,t)=>(d(),l("section",B,[e("div",C,[t[0]||(t[0]=e("div",null,[e("p",{class:"description"},[h(" 多模型提示词管理。用于为不同模型映射特定的提示词内容,解决新模型对齐问题。 支持 "),e("code",null,"SarPromptN"),h(" 占位符的热载入。 ")])],-1)),e("div",T,[e("button",{class:"btn-secondary",type:"button",disabled:n.value,onClick:_}," 刷新 ",8,D),e("button",{class:"btn-primary",type:"button",disabled:n.value,onClick:P}," 新增Sar组 ",8,L)])]),n.value?(d(),l("div",N,[...t[1]||(t[1]=[e("p",null,"正在加载...",-1)])])):r.value.length===0?(d(),l("div",F,[...t[2]||(t[2]=[e("p",null,"暂无SarPrompt配置,点击“新增Sar组”开始。",-1)])])):(d(),l("div",M,[(d(!0),l(I,null,w(r.value,(a,i)=>(d(),l("article",{key:i,class:"rule-card sarprompt-card card"},[e("div",O,[c(e("input",{"onUpdate:modelValue":o=>a.promptKey=o,class:"rule-title",type:"text",placeholder:"提示词键 (如 SarPrompt1)"},null,8,K),[[m,a.promptKey]]),t[3]||(t[3]=e("div",{class:"flex-grow"},null,-1)),e("button",{class:"btn-danger btn-sm",type:"button",onClick:o=>g(i)}," 删除 ",8,$)]),e("div",j,[e("div",G,[t[4]||(t[4]=e("label",null,"适用模型 (逗号分隔)",-1)),c(e("input",{"onUpdate:modelValue":o=>a.modelsInput=o,type:"text",placeholder:"例如: gpt-4, claude-3-opus",onBlur:o=>y(i)},null,40,R),[[m,a.modelsInput]])]),e("div",q,[t[5]||(t[5]=e("label",null,"注入内容 (文本或 .txt 文件名)",-1)),c(e("textarea",{"onUpdate:modelValue":o=>a.content=o,rows:"6",placeholder:"直接输入提示词,或输入 TVStxt 目录下的文件名"},null,8,Q),[[m,a.content]])])])]))),128)),e("div",W,[e("button",{class:"btn-success",type:"button",disabled:u.value,onClick:k},U(u.value?"保存中…":"保存配置"),9,z)])]))]))}}),Z=V(H,[["__scopeId","data-v-4d1d97e2"]]);export{Z as default}; +import{Dt as U,N as w,O as x,Q as v,U as c,a as I,f as l,h,j as d,l as e,n as V,v as E}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as m}from"./dashboard-card-news-BnyB_dHU.js";import{M as f}from"./dashboard-card-calendar-DWuV34Bn.js";var b="/admin_api/sarprompts",A={showLoader:!1},S={async getPrompts(p=A){return f({url:b},p)},async savePrompts(p,r={}){await f({url:b,method:"POST",body:p},r)}},B={class:"config-section active-section sarprompt-page"},C={class:"page-header"},T={class:"header-actions"},D=["disabled"],L=["disabled"],N={key:0,class:"empty-tip card"},F={key:1,class:"empty-tip card"},M={key:2,class:"sarprompt-list"},O={class:"rule-head"},K=["onUpdate:modelValue"],$=["onClick"],j={class:"rule-body"},G={class:"form-group full-width"},R=["onUpdate:modelValue","onBlur"],q={class:"form-group full-width"},Q=["onUpdate:modelValue"],W={class:"editor-actions"},z=["disabled"],H=E({__name:"SarPromptEditor",setup(p){const r=v([]),n=v(!1),u=v(!1),_=async()=>{n.value=!0;try{r.value=(await S.getPrompts()).map(s=>({...s,modelsInput:s.models.join(", ")}))}catch(s){console.error("Failed to fetch SarPrompts:",s)}finally{n.value=!1}},P=()=>{r.value.push({promptKey:`SarPrompt${r.value.length+1}`,models:[],modelsInput:"",content:""})},g=s=>{r.value.splice(s,1)},y=s=>{const t=r.value[s];t.models=t.modelsInput.split(",").map(a=>a.trim()).filter(a=>a!=="")},k=async()=>{u.value=!0;try{r.value.forEach((t,a)=>y(a));const s=r.value.map(({promptKey:t,models:a,content:i})=>({promptKey:t,models:a,content:i}));await S.savePrompts(s)}catch(s){console.error("Failed to save SarPrompts:",s)}finally{u.value=!1}};return x(()=>{_()}),(s,t)=>(d(),l("section",B,[e("div",C,[t[0]||(t[0]=e("div",null,[e("p",{class:"description"},[h(" 多模型提示词管理。用于为不同模型映射特定的提示词内容,解决新模型对齐问题。 支持 "),e("code",null,"SarPromptN"),h(" 占位符的热载入。 ")])],-1)),e("div",T,[e("button",{class:"btn-secondary",type:"button",disabled:n.value,onClick:_}," 刷新 ",8,D),e("button",{class:"btn-primary",type:"button",disabled:n.value,onClick:P}," 新增Sar组 ",8,L)])]),n.value?(d(),l("div",N,[...t[1]||(t[1]=[e("p",null,"正在加载...",-1)])])):r.value.length===0?(d(),l("div",F,[...t[2]||(t[2]=[e("p",null,"暂无SarPrompt配置,点击“新增Sar组”开始。",-1)])])):(d(),l("div",M,[(d(!0),l(I,null,w(r.value,(a,i)=>(d(),l("article",{key:i,class:"rule-card sarprompt-card card"},[e("div",O,[c(e("input",{"onUpdate:modelValue":o=>a.promptKey=o,class:"rule-title",type:"text",placeholder:"提示词键 (如 SarPrompt1)"},null,8,K),[[m,a.promptKey]]),t[3]||(t[3]=e("div",{class:"flex-grow"},null,-1)),e("button",{class:"btn-danger btn-sm",type:"button",onClick:o=>g(i)}," 删除 ",8,$)]),e("div",j,[e("div",G,[t[4]||(t[4]=e("label",null,"适用模型 (逗号分隔)",-1)),c(e("input",{"onUpdate:modelValue":o=>a.modelsInput=o,type:"text",placeholder:"例如: gpt-4, claude-3-opus",onBlur:o=>y(i)},null,40,R),[[m,a.modelsInput]])]),e("div",q,[t[5]||(t[5]=e("label",null,"注入内容 (文本或 .txt 文件名)",-1)),c(e("textarea",{"onUpdate:modelValue":o=>a.content=o,rows:"6",placeholder:"直接输入提示词,或输入 TVStxt 目录下的文件名"},null,8,Q),[[m,a.content]])])])]))),128)),e("div",W,[e("button",{class:"btn-success",type:"button",disabled:u.value,onClick:k},U(u.value?"保存中…":"保存配置"),9,z)])]))]))}}),Z=V(H,[["__scopeId","data-v-e3ed89fa"]]);export{Z as default}; diff --git a/AdminPanel-Vue/dist/assets/js/ScheduleManager-CCU8hQo2.js b/AdminPanel-Vue/dist/assets/js/ScheduleManager-Bbhal8Kk.js similarity index 98% rename from AdminPanel-Vue/dist/assets/js/ScheduleManager-CCU8hQo2.js rename to AdminPanel-Vue/dist/assets/js/ScheduleManager-Bbhal8Kk.js index 627afe875..5843c347d 100644 --- a/AdminPanel-Vue/dist/assets/js/ScheduleManager-CCU8hQo2.js +++ b/AdminPanel-Vue/dist/assets/js/ScheduleManager-Bbhal8Kk.js @@ -1 +1 @@ -import{Dt as g,N as k,O as U,Q as h,U as C,a as $,c as D,d as j,f as i,j as d,l as t,n as A,v as G,wt as S}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as x,d as I,u as T}from"./dashboard-card-news-BnyB_dHU.js";import{G as c,y as w}from"./dashboard-card-calendar-CA3-tSpi.js";var Q={class:"config-section active-section"},W={class:"schedule-manager-container"},q={class:"schedule-left-panel"},H={class:"calendar-container card"},J={class:"calendar-header"},P={id:"current-month-year"},R={id:"calendar-grid",class:"calendar-grid"},X=["onClick","onKeydown","aria-label","tabindex"],Z={class:"day-number"},ee={key:0,class:"schedule-indicator"},te={class:"add-schedule-form card"},ae={class:"form-group"},ne={class:"form-group"},se={class:"schedule-right-panel"},le={class:"schedule-list-container card"},oe={class:"list-header"},re={class:"list-filters"},ie={id:"schedule-list",class:"schedule-list"},de={key:0,class:"empty-msg"},ce={class:"schedule-time"},ue={class:"schedule-content"},ve=["onClick"],he=G({__name:"ScheduleManager",setup(me,{expose:F}){const s=h(new Date),u=h(null),p=h([]),l=h({time:"",content:""}),v=h("all"),K=D(()=>s.value.toLocaleDateString("zh-CN",{year:"numeric",month:"long"})),N=D(()=>{const n=s.value.getFullYear(),e=s.value.getMonth(),a=new Date(n,e,1),o=new Date(n,e,1-a.getDay()),f=new Date,M=[];for(let y=0;y<42;y+=1){const r=new Date(o);r.setDate(o.getDate()+y),M.push({date:new Date(r),day:r.getDate(),isToday:r.toDateString()===f.toDateString(),isSelected:u.value?.toDateString()===r.toDateString(),isOtherMonth:r.getMonth()!==e,hasSchedules:p.value.some(B=>new Date(B.time).toDateString()===r.toDateString())})}return M}),b=D(()=>{const n=new Date;return p.value.filter(e=>{const a=new Date(e.time),o=v.value!=="upcoming"||a.getTime()>=n.getTime(),f=!u.value||a.toDateString()===u.value.toDateString();return o&&f})});function z(){s.value=new Date(s.value.getFullYear(),s.value.getMonth()-1,1)}function E(){s.value=new Date(s.value.getFullYear(),s.value.getMonth()+1,1)}function _(n){u.value=u.value?.toDateString()===n.date.toDateString()?null:n.date}function L(n){return new Date(n).toLocaleString("zh-CN",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}async function m(){try{p.value=(await w.getSchedules({showLoader:!1,loadingKey:"schedule.list.load"})).sort((n,e)=>new Date(n.time).getTime()-new Date(e.time).getTime())}catch(n){const e=n instanceof Error?n.message:String(n);console.error("Failed to load schedules:",n),c(`加载日程失败:${e}`,"error")}}async function O(){if(!l.value.time||!l.value.content.trim()){c("请同时填写时间和内容。","error");return}try{await w.createSchedule({time:l.value.time,content:l.value.content.trim()},{loadingKey:"schedule.create"}),c("日程已添加。","success"),l.value={time:"",content:""},await m()}catch(n){c(`添加日程失败:${n instanceof Error?n.message:String(n)}`,"error")}}async function V(n){if(confirm("确定删除这条日程吗?"))try{await w.deleteSchedule(n,{loadingKey:"schedule.delete"}),c("日程已删除。","success"),await m()}catch(e){c(`删除日程失败:${e instanceof Error?e.message:String(e)}`,"error")}}function Y(n,e=!1){e&&n&&m()}return F({initializeCalendarWidget:Y}),U(()=>{m()}),(n,e)=>(d(),i("section",Q,[t("div",W,[t("div",q,[t("div",H,[t("div",J,[t("button",{type:"button",onClick:z,class:"icon-btn","aria-label":"上个月",title:"上个月"},[...e[4]||(e[4]=[t("span",{class:"material-symbols-outlined"},"chevron_left",-1)])]),t("h3",P,g(K.value),1),t("button",{type:"button",onClick:E,class:"icon-btn","aria-label":"下个月",title:"下个月"},[...e[5]||(e[5]=[t("span",{class:"material-symbols-outlined"},"chevron_right",-1)])])]),t("div",R,[(d(!0),i($,null,k(N.value,a=>(d(),i("button",{key:a.date.toString(),class:S(["calendar-day",{today:a.isToday,selected:a.isSelected,"other-month":a.isOtherMonth}]),onClick:o=>_(a),onKeydown:[T(o=>_(a),["enter"]),T(I(o=>_(a),["prevent"]),["space"])],"aria-label":`选择 ${a.day} 日${a.hasSchedules?",有日程":""}`,tabindex:a.isOtherMonth?-1:0},[t("span",Z,g(a.day),1),a.hasSchedules?(d(),i("div",ee)):j("",!0)],42,X))),128))])]),t("div",te,[e[8]||(e[8]=t("h3",null,"添加日程",-1)),t("div",ae,[e[6]||(e[6]=t("label",{for:"new-schedule-time"},"时间",-1)),C(t("input",{id:"new-schedule-time","onUpdate:modelValue":e[0]||(e[0]=a=>l.value.time=a),type:"datetime-local"},null,512),[[x,l.value.time]])]),t("div",ne,[e[7]||(e[7]=t("label",{for:"new-schedule-content"},"内容",-1)),C(t("textarea",{id:"new-schedule-content","onUpdate:modelValue":e[1]||(e[1]=a=>l.value.content=a),rows:"3",placeholder:"描述日程内容…"},null,512),[[x,l.value.content]])]),t("button",{onClick:O,class:"btn-primary"},"添加")])]),t("div",se,[t("div",le,[t("div",oe,[e[9]||(e[9]=t("h3",null,"日程列表",-1)),t("div",re,[t("button",{onClick:e[2]||(e[2]=a=>v.value="all"),class:S(["filter-btn",{active:v.value==="all"}])}," 全部 ",2),t("button",{onClick:e[3]||(e[3]=a=>v.value="upcoming"),class:S(["filter-btn",{active:v.value==="upcoming"}])}," 即将进行 ",2)])]),t("div",ie,[b.value.length===0?(d(),i("div",de,[...e[10]||(e[10]=[t("span",{class:"material-symbols-outlined empty-icon"},"event_busy",-1),t("p",null,"暂无日程",-1),t("p",{class:"empty-hint"},"在上方日历中选择日期添加新日程",-1)])])):(d(!0),i($,{key:1},k(b.value,a=>(d(),i("div",{key:a.id,class:"schedule-item"},[t("div",ce,g(L(a.time)),1),t("div",ue,g(a.content),1),t("button",{onClick:o=>V(a.id),class:"btn-danger btn-sm"}," 删除 ",8,ve)]))),128))])])])])]))}}),fe=A(he,[["__scopeId","data-v-01cd6de0"]]);export{fe as default}; +import{Dt as g,N as k,O as U,Q as h,U as C,a as $,c as D,d as j,f as i,j as d,l as t,n as A,v as G,wt as S}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as x,d as I,u as T}from"./dashboard-card-news-BnyB_dHU.js";import{G as c,y as w}from"./dashboard-card-calendar-DWuV34Bn.js";var Q={class:"config-section active-section"},W={class:"schedule-manager-container"},q={class:"schedule-left-panel"},H={class:"calendar-container card"},J={class:"calendar-header"},P={id:"current-month-year"},R={id:"calendar-grid",class:"calendar-grid"},X=["onClick","onKeydown","aria-label","tabindex"],Z={class:"day-number"},ee={key:0,class:"schedule-indicator"},te={class:"add-schedule-form card"},ae={class:"form-group"},ne={class:"form-group"},se={class:"schedule-right-panel"},le={class:"schedule-list-container card"},oe={class:"list-header"},re={class:"list-filters"},ie={id:"schedule-list",class:"schedule-list"},de={key:0,class:"empty-msg"},ce={class:"schedule-time"},ue={class:"schedule-content"},ve=["onClick"],he=G({__name:"ScheduleManager",setup(me,{expose:F}){const s=h(new Date),u=h(null),p=h([]),l=h({time:"",content:""}),v=h("all"),K=D(()=>s.value.toLocaleDateString("zh-CN",{year:"numeric",month:"long"})),N=D(()=>{const n=s.value.getFullYear(),e=s.value.getMonth(),a=new Date(n,e,1),o=new Date(n,e,1-a.getDay()),f=new Date,M=[];for(let y=0;y<42;y+=1){const r=new Date(o);r.setDate(o.getDate()+y),M.push({date:new Date(r),day:r.getDate(),isToday:r.toDateString()===f.toDateString(),isSelected:u.value?.toDateString()===r.toDateString(),isOtherMonth:r.getMonth()!==e,hasSchedules:p.value.some(B=>new Date(B.time).toDateString()===r.toDateString())})}return M}),b=D(()=>{const n=new Date;return p.value.filter(e=>{const a=new Date(e.time),o=v.value!=="upcoming"||a.getTime()>=n.getTime(),f=!u.value||a.toDateString()===u.value.toDateString();return o&&f})});function z(){s.value=new Date(s.value.getFullYear(),s.value.getMonth()-1,1)}function E(){s.value=new Date(s.value.getFullYear(),s.value.getMonth()+1,1)}function _(n){u.value=u.value?.toDateString()===n.date.toDateString()?null:n.date}function L(n){return new Date(n).toLocaleString("zh-CN",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}async function m(){try{p.value=(await w.getSchedules({showLoader:!1,loadingKey:"schedule.list.load"})).sort((n,e)=>new Date(n.time).getTime()-new Date(e.time).getTime())}catch(n){const e=n instanceof Error?n.message:String(n);console.error("Failed to load schedules:",n),c(`加载日程失败:${e}`,"error")}}async function O(){if(!l.value.time||!l.value.content.trim()){c("请同时填写时间和内容。","error");return}try{await w.createSchedule({time:l.value.time,content:l.value.content.trim()},{loadingKey:"schedule.create"}),c("日程已添加。","success"),l.value={time:"",content:""},await m()}catch(n){c(`添加日程失败:${n instanceof Error?n.message:String(n)}`,"error")}}async function V(n){if(confirm("确定删除这条日程吗?"))try{await w.deleteSchedule(n,{loadingKey:"schedule.delete"}),c("日程已删除。","success"),await m()}catch(e){c(`删除日程失败:${e instanceof Error?e.message:String(e)}`,"error")}}function Y(n,e=!1){e&&n&&m()}return F({initializeCalendarWidget:Y}),U(()=>{m()}),(n,e)=>(d(),i("section",Q,[t("div",W,[t("div",q,[t("div",H,[t("div",J,[t("button",{type:"button",onClick:z,class:"icon-btn","aria-label":"上个月",title:"上个月"},[...e[4]||(e[4]=[t("span",{class:"material-symbols-outlined"},"chevron_left",-1)])]),t("h3",P,g(K.value),1),t("button",{type:"button",onClick:E,class:"icon-btn","aria-label":"下个月",title:"下个月"},[...e[5]||(e[5]=[t("span",{class:"material-symbols-outlined"},"chevron_right",-1)])])]),t("div",R,[(d(!0),i($,null,k(N.value,a=>(d(),i("button",{key:a.date.toString(),class:S(["calendar-day",{today:a.isToday,selected:a.isSelected,"other-month":a.isOtherMonth}]),onClick:o=>_(a),onKeydown:[T(o=>_(a),["enter"]),T(I(o=>_(a),["prevent"]),["space"])],"aria-label":`选择 ${a.day} 日${a.hasSchedules?",有日程":""}`,tabindex:a.isOtherMonth?-1:0},[t("span",Z,g(a.day),1),a.hasSchedules?(d(),i("div",ee)):j("",!0)],42,X))),128))])]),t("div",te,[e[8]||(e[8]=t("h3",null,"添加日程",-1)),t("div",ae,[e[6]||(e[6]=t("label",{for:"new-schedule-time"},"时间",-1)),C(t("input",{id:"new-schedule-time","onUpdate:modelValue":e[0]||(e[0]=a=>l.value.time=a),type:"datetime-local"},null,512),[[x,l.value.time]])]),t("div",ne,[e[7]||(e[7]=t("label",{for:"new-schedule-content"},"内容",-1)),C(t("textarea",{id:"new-schedule-content","onUpdate:modelValue":e[1]||(e[1]=a=>l.value.content=a),rows:"3",placeholder:"描述日程内容…"},null,512),[[x,l.value.content]])]),t("button",{onClick:O,class:"btn-primary"},"添加")])]),t("div",se,[t("div",le,[t("div",oe,[e[9]||(e[9]=t("h3",null,"日程列表",-1)),t("div",re,[t("button",{onClick:e[2]||(e[2]=a=>v.value="all"),class:S(["filter-btn",{active:v.value==="all"}])}," 全部 ",2),t("button",{onClick:e[3]||(e[3]=a=>v.value="upcoming"),class:S(["filter-btn",{active:v.value==="upcoming"}])}," 即将进行 ",2)])]),t("div",ie,[b.value.length===0?(d(),i("div",de,[...e[10]||(e[10]=[t("span",{class:"material-symbols-outlined empty-icon"},"event_busy",-1),t("p",null,"暂无日程",-1),t("p",{class:"empty-hint"},"在上方日历中选择日期添加新日程",-1)])])):(d(!0),i($,{key:1},k(b.value,a=>(d(),i("div",{key:a.id,class:"schedule-item"},[t("div",ce,g(L(a.time)),1),t("div",ue,g(a.content),1),t("button",{onClick:o=>V(a.id),class:"btn-danger btn-sm"}," 删除 ",8,ve)]))),128))])])])])]))}}),fe=A(he,[["__scopeId","data-v-01cd6de0"]]);export{fe as default}; diff --git a/AdminPanel-Vue/dist/assets/js/SemanticGroupsEditor-Cj5p5sWA.js b/AdminPanel-Vue/dist/assets/js/SemanticGroupsEditor-BH73yceu.js similarity index 95% rename from AdminPanel-Vue/dist/assets/js/SemanticGroupsEditor-Cj5p5sWA.js rename to AdminPanel-Vue/dist/assets/js/SemanticGroupsEditor-BH73yceu.js index 02a375947..37cba45d3 100644 --- a/AdminPanel-Vue/dist/assets/js/SemanticGroupsEditor-Cj5p5sWA.js +++ b/AdminPanel-Vue/dist/assets/js/SemanticGroupsEditor-BH73yceu.js @@ -1 +1 @@ -import{Dt as v,N as b,O as C,Q as u,U as _,a as x,d as E,f as i,j as l,l as t,n as M,v as V,wt as j}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as g}from"./dashboard-card-news-BnyB_dHU.js";import{G as d,b as f}from"./dashboard-card-calendar-CA3-tSpi.js";var D={class:"config-section active-section"},U={class:"semantic-groups-controls"},$={id:"semantic-groups-container"},A={class:"semantic-group-header"},I=["onUpdate:modelValue"],B=["onClick"],K={class:"semantic-group-keywords"},L=["onUpdate:modelValue"],N={class:"keyword-stats"},O={class:"keyword-count"},F=V({__name:"SemanticGroupsEditor",setup(T){const r=u([]),o=u(""),c=u("info");let p=0;function m(e={}){return p+=1,{localId:`semantic-group-${p}`,name:e.name??"",keywords:e.keywords??""}}function y(e){return e.split(",").map(a=>a.trim()).filter(a=>a.length>0).length}async function h(){try{const e=await f.getSemanticGroups({showLoader:!1,loadingKey:"semantic-groups.load"});if(e.groups&&typeof e.groups=="object"){r.value=Object.entries(e.groups).map(([a,s])=>m({name:a,keywords:Array.isArray(s.words)?s.words.join(","):""}));return}r.value=[]}catch(e){const a=e instanceof Error?e.message:String(e);console.error("Failed to load semantic groups:",e),d(`加载语义组失败:${a}`,"error")}}async function w(){try{const e={};r.value.forEach(a=>{e[a.name]={words:a.keywords.split(",").map(s=>s.trim()).filter(s=>s.length>0),auto_learned:[],weight:1}}),await f.saveSemanticGroups({groups:e},{loadingKey:"semantic-groups.save"}),o.value="语义组已保存。",c.value="success",d("语义组已保存。","success")}catch(e){const a=e instanceof Error?e.message:String(e);o.value=`保存失败:${a}`,c.value="error",d(`保存失败:${a}`,"error")}}function k(){r.value.push(m({name:"新语义组"}))}function G(e){confirm("确定要删除这个语义组吗?")&&r.value.splice(e,1)}return C(()=>{h()}),(e,a)=>(l(),i("section",D,[a[1]||(a[1]=t("p",{class:"description"}," 管理 RAGDiaryPlugin 使用的语义组。语义组会通过关键词激活,将相关向量注入查询,以提升检索准确性。 ",-1)),t("div",U,[t("button",{onClick:w,class:"btn-primary"},"保存所有更改"),t("button",{onClick:k,class:"btn-secondary"},"添加新组"),o.value?(l(),i("span",{key:0,class:j(["status-message",c.value])},v(o.value),3)):E("",!0)]),t("div",$,[(l(!0),i(x,null,b(r.value,(s,S)=>(l(),i("div",{key:s.localId,class:"semantic-group-item card"},[t("div",A,[_(t("input",{"onUpdate:modelValue":n=>s.name=n,type:"text",placeholder:"组名称",class:"group-name-input"},null,8,I),[[g,s.name]]),t("button",{onClick:n=>G(S),class:"btn-danger btn-sm"}," 删除 ",8,B)]),t("div",K,[a[0]||(a[0]=t("label",null,"关键词(逗号分隔)",-1)),_(t("textarea",{"onUpdate:modelValue":n=>s.keywords=n,placeholder:"关键词 1, 关键词 2, ...",rows:"3"},null,8,L),[[g,s.keywords]]),t("div",N,[t("span",O," 关键词数:"+v(y(s.keywords)),1)])])]))),128))])]))}}),R=M(F,[["__scopeId","data-v-a16da095"]]);export{R as default}; +import{Dt as v,N as b,O as C,Q as u,U as _,a as x,d as E,f as i,j as l,l as t,n as M,v as V,wt as j}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as g}from"./dashboard-card-news-BnyB_dHU.js";import{G as d,b as f}from"./dashboard-card-calendar-DWuV34Bn.js";var D={class:"config-section active-section"},U={class:"semantic-groups-controls"},$={id:"semantic-groups-container"},A={class:"semantic-group-header"},I=["onUpdate:modelValue"],B=["onClick"],K={class:"semantic-group-keywords"},L=["onUpdate:modelValue"],N={class:"keyword-stats"},O={class:"keyword-count"},F=V({__name:"SemanticGroupsEditor",setup(T){const r=u([]),o=u(""),c=u("info");let p=0;function m(e={}){return p+=1,{localId:`semantic-group-${p}`,name:e.name??"",keywords:e.keywords??""}}function y(e){return e.split(",").map(a=>a.trim()).filter(a=>a.length>0).length}async function h(){try{const e=await f.getSemanticGroups({showLoader:!1,loadingKey:"semantic-groups.load"});if(e.groups&&typeof e.groups=="object"){r.value=Object.entries(e.groups).map(([a,s])=>m({name:a,keywords:Array.isArray(s.words)?s.words.join(","):""}));return}r.value=[]}catch(e){const a=e instanceof Error?e.message:String(e);console.error("Failed to load semantic groups:",e),d(`加载语义组失败:${a}`,"error")}}async function w(){try{const e={};r.value.forEach(a=>{e[a.name]={words:a.keywords.split(",").map(s=>s.trim()).filter(s=>s.length>0),auto_learned:[],weight:1}}),await f.saveSemanticGroups({groups:e},{loadingKey:"semantic-groups.save"}),o.value="语义组已保存。",c.value="success",d("语义组已保存。","success")}catch(e){const a=e instanceof Error?e.message:String(e);o.value=`保存失败:${a}`,c.value="error",d(`保存失败:${a}`,"error")}}function k(){r.value.push(m({name:"新语义组"}))}function G(e){confirm("确定要删除这个语义组吗?")&&r.value.splice(e,1)}return C(()=>{h()}),(e,a)=>(l(),i("section",D,[a[1]||(a[1]=t("p",{class:"description"}," 管理 RAGDiaryPlugin 使用的语义组。语义组会通过关键词激活,将相关向量注入查询,以提升检索准确性。 ",-1)),t("div",U,[t("button",{onClick:w,class:"btn-primary"},"保存所有更改"),t("button",{onClick:k,class:"btn-secondary"},"添加新组"),o.value?(l(),i("span",{key:0,class:j(["status-message",c.value])},v(o.value),3)):E("",!0)]),t("div",$,[(l(!0),i(x,null,b(r.value,(s,S)=>(l(),i("div",{key:s.localId,class:"semantic-group-item card"},[t("div",A,[_(t("input",{"onUpdate:modelValue":n=>s.name=n,type:"text",placeholder:"组名称",class:"group-name-input"},null,8,I),[[g,s.name]]),t("button",{onClick:n=>G(S),class:"btn-danger btn-sm"}," 删除 ",8,B)]),t("div",K,[a[0]||(a[0]=t("label",null,"关键词(逗号分隔)",-1)),_(t("textarea",{"onUpdate:modelValue":n=>s.keywords=n,placeholder:"关键词 1, 关键词 2, ...",rows:"3"},null,8,L),[[g,s.keywords]]),t("div",N,[t("span",O," 关键词数:"+v(y(s.keywords)),1)])])]))),128))])]))}}),R=M(F,[["__scopeId","data-v-a16da095"]]);export{R as default}; diff --git a/AdminPanel-Vue/dist/assets/js/ServerLogViewer-BdiikA3l.js b/AdminPanel-Vue/dist/assets/js/ServerLogViewer-BdlP6B20.js similarity index 98% rename from AdminPanel-Vue/dist/assets/js/ServerLogViewer-BdiikA3l.js rename to AdminPanel-Vue/dist/assets/js/ServerLogViewer-BdlP6B20.js index 0a912ef26..f52024e7d 100644 --- a/AdminPanel-Vue/dist/assets/js/ServerLogViewer-BdiikA3l.js +++ b/AdminPanel-Vue/dist/assets/js/ServerLogViewer-BdlP6B20.js @@ -1,4 +1,4 @@ -import{Dt as k,E as Z,Et as ee,H as Le,N as he,O as be,Q as g,U as te,V as U,a as we,at as s,c as M,d as le,f as E,g as Se,h as se,j as H,k as Re,l,n as xe,q as ne,v as Te,w as _e,wt as G}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as oe,n as Ce}from"./dashboard-card-news-BnyB_dHU.js";import{A as ae,G as Y,P as ke}from"./dashboard-card-calendar-CA3-tSpi.js";import{n as Ee}from"./markdown-Di1VBEdP.js";import{a as W}from"./dashboard-components-LHqMn0M5.js";import{t as He}from"./useVirtualScroll-DdYyc53Y.js";import{t as Oe}from"./usePolling-CJCCePbg.js";var ie=ke("ServerLogViewer"),Ve=22,ze=20,re={maxRetries:2,retryDelayMs:500};function ue(p){return p.replace(/\r\n/g,` +import{Dt as k,E as Z,Et as ee,H as Le,N as he,O as be,Q as g,U as te,V as U,a as we,at as s,c as M,d as le,f as E,g as Se,h as se,j as H,k as Re,l,n as xe,q as ne,v as Te,w as _e,wt as G}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as oe,n as Ce}from"./dashboard-card-news-BnyB_dHU.js";import{A as ae,G as Y,P as ke}from"./dashboard-card-calendar-DWuV34Bn.js";import{n as Ee}from"./markdown-Di1VBEdP.js";import{a as W}from"./dashboard-components-B8tHL6X6.js";import{t as He}from"./useVirtualScroll-DdYyc53Y.js";import{t as Oe}from"./usePolling-CJCCePbg.js";var ie=ke("ServerLogViewer"),Ve=22,ze=20,re={maxRetries:2,retryDelayMs:500};function ue(p){return p.replace(/\r\n/g,` `)}function Fe(){const p=g("加载中…"),r=g([]),u=g(""),v=W("vcp_log_limit",5e3),b=W("vcp_log_reverse",!1),f=W("vcp_log_autoscroll",!0),x=g(!1),T=g(!1),y=g(0),_=g(!1),L=g(""),m=new Map,$=M(()=>{const e=u.value.trim();if(!e)return null;const o=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(${o})`,"gi")}),c=g(null),O=g(600);let h=null;const C=M(()=>{const e=u.value.trim(),o=e?r.value.filter(i=>i.includes(e)):r.value,a=o.length>v.value?o.slice(-v.value):o;return b.value?[...a].reverse():a}),w=M(()=>C.value.map((e,o)=>({index:o,content:e}))),{visibleItems:V,totalHeight:z,offsetY:F,onScroll:N,setScrollTop:A}=He(w,{itemHeight:Ve,containerHeight:O,overscan:ze}),D=M(()=>r.value.length);function j(){A(0),c.value&&(c.value.scrollTop=0)}function t(e){const o=e.target,a=Math.max(0,o.scrollHeight-o.clientHeight);o.scrollTop>a&&(o.scrollTop=a),N(e),x.value=!(o.scrollHeight-o.scrollTop-o.clientHeight<100)&&f.value}function n(){O.value=c.value?.getBoundingClientRect().height||600}function P(){h?.disconnect(),h=null}function q(e){P(),!(!(e instanceof HTMLElement)||typeof ResizeObserver>"u")&&(h=new ResizeObserver(()=>{n()}),h.observe(e))}function d(){c.value&&(c.value.scrollTop=c.value.scrollHeight,x.value=!1)}function I(){f.value=!f.value,f.value&&Z(()=>d())}function B(){b.value=!b.value}function ce(){const e=w.value.map(o=>o.content).join(` `);navigator.clipboard.writeText(e),Y("日志已复制到剪贴板","success")}function ge(){confirm("确定要清空日志显示吗?(这不会删除实际日志文件)")&&(r.value=[],y.value=0,_.value=!1,L.value="",Y("日志显示已清空","success"))}function ve(e){return e.includes("[ERROR]")||e.includes(" ERROR ")||e.includes("error:")?"log-error":e.includes("[WARN]")||e.includes(" WARN ")||e.includes("warning:")?"log-warn":e.includes("[INFO]")||e.includes(" INFO ")?"log-info":e.includes("[DEBUG]")||e.includes(" DEBUG ")?"log-debug":"log-normal"}function de(e){const o=$.value;if(!o)return e;const a=`${u.value}\0${e}`,i=m.get(a);if(i!==void 0)return i;const S=e.replace(o,"$1"),R=Ee.sanitize(S);return m.size>2e3&&m.clear(),m.set(a,R),R}function K(e){return e.length>v.value?e.slice(-v.value):e}function Q(e,o=""){const a=`${o}${ue(e)}`,i=a.split(` `),S=a.endsWith(` diff --git a/AdminPanel-Vue/dist/assets/js/ThinkingChainsEditor-BlBsC1Vg.js b/AdminPanel-Vue/dist/assets/js/ThinkingChainsEditor-B1rNliSG.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/ThinkingChainsEditor-BlBsC1Vg.js rename to AdminPanel-Vue/dist/assets/js/ThinkingChainsEditor-B1rNliSG.js index 06e7296e4..bb36b897e 100644 --- a/AdminPanel-Vue/dist/assets/js/ThinkingChainsEditor-BlBsC1Vg.js +++ b/AdminPanel-Vue/dist/assets/js/ThinkingChainsEditor-B1rNliSG.js @@ -1 +1 @@ -import{Dt as I,H as oe,N as j,O as ce,Q as T,U as de,a as Q,at as o,c as he,d as L,f as C,g as me,j as b,l as i,n as ve,v as ge,wt as N}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as fe,d as O,r as pe}from"./dashboard-card-news-BnyB_dHU.js";import{G as X,P as ke,b as J}from"./dashboard-card-calendar-CA3-tSpi.js";import{n as Ce,t as be}from"./pointerReorder-DgfeRZqx.js";import{t as _e}from"./usePointerDragSession-B6CxeZBm.js";function ye(s,h,p){const k=s.length;if(h<0||h>=k||p<0||p>k)return{items:[...s],moved:!1};if(k<=1)return{items:[...s],moved:!1};const v=p>h?p-1:p;if(v===h)return{items:[...s],moved:!1};const c=[...s],[_]=c.splice(h,1);return c.splice(v,0,_),{items:c,moved:!0}}var Y=ke("ThinkingChainsEditor"),Z=0;function ee(){return Z+=1,`thinking-chain-${Z}`}function te(s){const h=typeof s=="number"?s:Number.parseInt(String(s??""),10);return Number.isFinite(h)?Math.max(1,Math.min(20,Math.trunc(h))):1}function ne(s,h){return s.map((p,k)=>te(h[k]))}function Se(s,h){const p=Array.isArray(h)?[...h]:[...h?.clusters??[]],k=Array.isArray(h)?[]:h?.kSequence??[];return{uiId:ee(),theme:s,clusters:p,kSequence:ne(p,k)}}function Ie(){const s=T([]),h=T([]),p=T(""),k=T("info"),v=T(null),c=T(null);async function _(){try{const e=(await J.getThinkingChains({showLoader:!1,loadingKey:"thinking-chains.load"})).chains??{};s.value=Object.entries(e).map(([t,n])=>Se(t,n))}catch(e){Y.error("Failed to load thinking chains:",e),X(`加载思维链失败:${e instanceof Error?e.message:String(e)}`,"error")}}async function q(){try{const e=await J.getAvailableClusters({showLoader:!1,loadingKey:"thinking-chains.available-clusters.load"});h.value=Array.isArray(e)?[...e]:[]}catch(e){Y.error("Failed to load available clusters:",e)}}async function w(){try{const e={},t=new Set;s.value.forEach(n=>{const a=n.theme.trim();if(!a)throw new Error("主题名称不能为空");if(t.has(a))throw new Error(`主题名称重复:${a}`);const r=ne(n.clusters,n.kSequence);t.add(a),n.theme=a,n.kSequence=r,e[a]={clusters:[...n.clusters],kSequence:[...r]}}),await J.saveThinkingChains({chains:e},{loadingKey:"thinking-chains.save"}),p.value="思维链已保存!",k.value="success",X("思维链已保存!","success")}catch(e){const t=e instanceof Error?e.message:String(e);p.value=`保存失败:${t}`,k.value="error",X(`保存失败:${t}`,"error")}}function E(){s.value.push({uiId:ee(),theme:"新主题",clusters:[],kSequence:[]})}function B(e){confirm("确定要删除这个思维链主题吗?")&&s.value.splice(e,1)}function x(e,t){const n=s.value[e];!n||t<0||t>=n.clusters.length||(n.clusters.splice(t,1),n.kSequence.splice(t,1))}function D(e,t){const n=s.value[e];if(!n)return;const a=n.clusters.indexOf(t);a>=0&&x(e,a)}function G(e,t){const n=s.value[e];!n||n.clusters.includes(t)||(n.clusters.push(t),n.kSequence.push(1))}function H(e){if(c.value?.chainIndex===e)return{chainIndex:e,clusters:[...c.value.clusters],kSequence:[...c.value.kSequence]};const t=s.value[e];return t?{chainIndex:e,clusters:[...t.clusters],kSequence:[...t.kSequence]}:null}function P(e,t){return e.clusters.length!==t.clusters.length||e.kSequence.length!==t.kSequence.length?!0:e.clusters.some((n,a)=>n!==t.clusters[a]||e.kSequence[a]!==t.kSequence[a])}function M(e,t,n){const a=new Map;n.clusters.forEach((u,m)=>{a.set(u,n.kSequence[m]??1)});const r=s.value[e];return r?.clusters.forEach((u,m)=>{a.has(u)||a.set(u,r.kSequence[m]??1)}),t.map(u=>a.get(u)??1)}function A(e){return c.value?.chainIndex===e?c.value.clusters:s.value[e]?.clusters??[]}function z(e,t){if(c.value?.chainIndex===e){const r=c.value.clusters.indexOf(t);if(r>=0)return c.value.kSequence[r]??1}const n=s.value[e];if(!n)return 1;const a=n.clusters.indexOf(t);return a>=0?n.kSequence[a]??1:1}function K(e,t,n){const a=te(n),r=s.value[e];if(!r)return;const u=r.clusters.indexOf(t);if(u>=0&&(r.kSequence[u]=a),c.value?.chainIndex===e){const m=c.value.clusters.indexOf(t);m>=0&&(c.value.kSequence[m]=a)}}function F(e,t){if(typeof document>"u")return null;const n=document.elementFromPoint(e,t);if(!(n instanceof Element))return null;const a=n.closest('[data-chain-list="true"]');if(!(a instanceof HTMLElement))return null;const r=Number.parseInt(a.dataset.chainIndex??"",10);if(!Number.isInteger(r)||r<0)return null;const u=R(a,A(r));for(const[m,y]of u.entries())if(be(y.element,t)==="before")return{chainIndex:r,targetClusterName:y.clusterName,insertionIndex:m,placement:"before"};return u.length>0?{chainIndex:r,targetClusterName:u[u.length-1].clusterName,insertionIndex:u.length,placement:"after"}:{chainIndex:r,targetClusterName:null,insertionIndex:0,placement:"after"}}function R(e,t){if(typeof e.querySelectorAll!="function")return[];const n=new Set,a=[];for(const r of Array.from(e.querySelectorAll('[data-chain-item="true"]'))){if(!(r instanceof HTMLElement))continue;const u=r.dataset.clusterName??"";!u||n.has(u)||!t.includes(u)||(n.add(u),a.push({clusterName:u,element:r}))}return a}function U(e){const t=l.value;if(!t)return null;const n=H(e.chainIndex);if(!n)return null;if(t.item.type==="chain"){if(t.item.chainIndex!==e.chainIndex)return null;const m=n.clusters.indexOf(t.item.clusterName);if(m<0)return null;const y=e.targetClusterName&&e.targetClusterName!==t.item.clusterName?Ce(n.clusters,t.item.clusterName,e.targetClusterName,e.placement):ye(n.clusters,m,e.insertionIndex).items,W={chainIndex:e.chainIndex,clusters:y,kSequence:M(e.chainIndex,y,n)};return P(n,W)?W:null}const a=s.value[e.chainIndex];if(!a||a.clusters.includes(t.item.clusterName))return null;const r=n.clusters.filter(m=>m!==t.item.clusterName);if(e.targetClusterName&&e.targetClusterName!==t.item.clusterName){const m=r.indexOf(e.targetClusterName);if(m>=0){const y=e.placement==="before"?m:m+1;r.splice(y,0,t.item.clusterName)}else r.push(t.item.clusterName)}else{const m=Math.max(0,Math.min(e.insertionIndex,r.length));r.splice(m,0,t.item.clusterName)}const u={chainIndex:e.chainIndex,clusters:r,kSequence:M(e.chainIndex,r,n)};return P(n,u)?u:null}function V(e,t){const n=F(e,t);if(!n){v.value=null,c.value=null;return}const a=U(n);if(!a){if(c.value?.chainIndex===n.chainIndex){v.value=n;return}v.value=null,c.value=null;return}v.value=n,c.value=a}const{pointerState:l,dragGhost:g,dragGhostElement:d,startPointerDrag:f}=_e({createGhost:e=>e.type==="chain"?{label:e.clusterName,meta:s.value[e.chainIndex]?.theme||"当前主题"}:{label:e.clusterName,meta:"可用思维簇"},onFrame:e=>{V(e.currentX,e.currentY)},onCommit:()=>{if(!c.value)return;const e=s.value[c.value.chainIndex];e&&(e.clusters=[...c.value.clusters],e.kSequence=[...c.value.kSequence])},onClear:()=>{v.value=null,c.value=null}}),$=he(()=>l.value?.dragging===!0);function S(e,t,n){const a=n.currentTarget;if(!(a instanceof HTMLElement))return;const r=a.closest('[data-chain-item="true"]');if(!(r instanceof HTMLElement))return;const u=s.value[e]?.clusters[t];u&&f({item:{type:"chain",chainIndex:e,clusterName:u},event:n,itemElement:r,captureElement:a})}function ae(e,t){const n=t.currentTarget;if(!(n instanceof HTMLElement))return;const a=n.closest('[data-available-cluster="true"]');a instanceof HTMLElement&&f({item:{type:"available",clusterName:e},event:t,itemElement:a,captureElement:n})}function re(e,t){const n=l.value?.item;return l.value?.dragging===!0&&n?.type==="chain"&&n.chainIndex===e&&n.clusterName===t}function se(e){const t=l.value?.item;return l.value?.dragging===!0&&t?.type==="available"&&t.clusterName===e}function ie(e){return v.value?.chainIndex===e}function le(e,t){return v.value?.chainIndex===e&&v.value.targetClusterName===t&&v.value.placement==="before"}function ue(e,t){return v.value?.chainIndex===e&&v.value.targetClusterName===t&&v.value.placement==="after"}return ce(()=>{_(),q()}),{thinkingChains:s,availableClusters:h,dragGhost:g,dragGhostElement:d,isPreviewDragging:$,statusMessage:p,statusType:k,loadThinkingChains:_,loadAvailableClusters:q,saveThinkingChains:w,addThinkingChain:E,removeChain:B,removeCluster:x,removeClusterByName:D,addCluster:G,getRenderedClusters:A,getRenderedKValue:z,updateClusterKValue:K,startChainPointerDrag:S,startAvailablePointerDrag:ae,isChainClusterDragging:re,isAvailableClusterDragging:se,isChainDropTarget:ie,isChainDropBefore:le,isChainDropAfter:ue}}var Te={class:"config-section active-section"},Ne={id:"thinking-chains-editor-controls",class:"form-actions"},qe={id:"thinking-chains-container",class:"thinking-chains-layout"},we={class:"thinking-chains-editor"},Ee={open:""},xe={class:"chain-header"},De={class:"theme-name"},Pe=["onClick"],Me={class:"chain-content"},Ae={class:"form-group theme-editor"},Ke=["for"],Ve=["id","onUpdate:modelValue"],$e=["data-chain-index","data-cluster-index","data-cluster-name"],Le=["onPointerdown"],Oe={class:"cluster-content"},Be={class:"cluster-name"},Ge=["for"],He=["id","value","onInput"],ze=["onClick"],Fe={class:"available-clusters-panel card"},Re={class:"draggable-list available-clusters-list"},Ue=["onPointerdown"],je={class:"cluster-name"},Qe={key:0,class:"no-clusters"},Xe={class:"thinking-chain-drag-ghost-shell"},Je={class:"thinking-chain-drag-ghost-title"},We={class:"thinking-chain-drag-ghost-meta"},Ye=ge({__name:"ThinkingChainsEditor",setup(s){const{thinkingChains:h,availableClusters:p,dragGhost:k,dragGhostElement:v,isPreviewDragging:c,statusMessage:_,statusType:q,saveThinkingChains:w,addThinkingChain:E,removeChain:B,removeClusterByName:x,getRenderedClusters:D,getRenderedKValue:G,updateClusterKValue:H,startChainPointerDrag:P,startAvailablePointerDrag:M,isChainClusterDragging:A,isAvailableClusterDragging:z,isChainDropTarget:K,isChainDropBefore:F,isChainDropAfter:R}=Ie();function U(V,l,g){const d=g.target;d instanceof HTMLInputElement&&H(V,l,d.value)}return(V,l)=>(b(),C("section",Te,[l[9]||(l[9]=i("p",{class:"description"}," 管理 RAGDiaryPlugin 使用的元思考链。按住左侧手柄拖动时会实时预览插入位置, 释放后再提交最终顺序。 ",-1)),i("div",Ne,[i("button",{type:"button",class:"btn-primary",onClick:l[0]||(l[0]=(...g)=>o(w)&&o(w)(...g))}," 保存所有更改 "),i("button",{type:"button",class:"btn-secondary",onClick:l[1]||(l[1]=(...g)=>o(E)&&o(E)(...g))}," 添加新主题 "),o(_)?(b(),C("span",{key:0,class:N(["status-message",o(q)])},I(o(_)),3)):L("",!0)]),i("div",qe,[i("div",we,[l[6]||(l[6]=i("h3",null,"思考主题列表",-1)),(b(!0),C(Q,null,j(o(h),(g,d)=>(b(),C("div",{key:g.uiId,class:"thinking-chain-item card"},[i("details",Ee,[i("summary",xe,[i("span",De,"主题:"+I(g.theme||"未命名主题"),1),i("button",{type:"button",class:"btn-danger btn-sm",onClick:O(f=>o(B)(d),["stop","prevent"])}," 删除 ",8,Pe)]),i("div",Me,[i("div",Ae,[i("label",{for:`thinking-theme-${d}`},"主题名称",8,Ke),de(i("input",{id:`thinking-theme-${d}`,"onUpdate:modelValue":f=>g.theme=f,type:"text",placeholder:"请输入主题名称",onClick:l[2]||(l[2]=O(()=>{},["stop"]))},null,8,Ve),[[fe,g.theme,void 0,{trim:!0}]])]),me(pe,{tag:"ul",name:"drag-sort",class:N(["draggable-list",{"draggable-list--active-target":o(K)(d),"draggable-list--previewing":o(c)}]),"data-chain-list":"true","data-chain-index":d},{default:oe(()=>[(b(!0),C(Q,null,j(o(D)(d),(f,$)=>(b(),C("li",{key:f,class:N(["chain-item",{"chain-item--dragging":o(A)(d,f),"chain-item--drop-before":o(F)(d,f),"chain-item--drop-after":o(R)(d,f)}]),"data-chain-item":"true","data-chain-index":d,"data-cluster-index":$,"data-cluster-name":f},[i("button",{type:"button",class:"drag-handle","aria-label":"拖动思维簇排序",title:"拖动思维簇排序",onPointerdown:S=>o(P)(d,$,S)}," ☰ ",40,Le),i("div",Oe,[i("span",Be,I(f),1),i("label",{class:"cluster-k-control",for:`cluster-k-value-${d}-${f}`},[l[5]||(l[5]=i("span",{class:"cluster-k-label"},"K 值",-1)),i("input",{id:`cluster-k-value-${d}-${f}`,type:"number",min:"1",max:"20",class:"cluster-k-input",value:o(G)(d,f),onInput:S=>U(d,f,S),onClick:l[3]||(l[3]=O(()=>{},["stop"])),onPointerdown:l[4]||(l[4]=O(()=>{},["stop"]))},null,40,He)],8,Ge)]),i("button",{type:"button",class:"btn-danger btn-sm",onClick:S=>o(x)(d,f)}," 移除 ",8,ze)],10,$e))),128)),o(D)(d).length===0?(b(),C("li",{key:"empty",class:N(["drop-placeholder",{"drop-placeholder--active":o(K)(d)}])}," 将思维簇拖拽到此处 ",2)):L("",!0)]),_:2},1032,["class","data-chain-index"])])])]))),128))]),i("div",Fe,[l[7]||(l[7]=i("h3",null,"可用的思维簇模块",-1)),l[8]||(l[8]=i("p",{class:"description"},"将模块从这里拖拽到左侧的主题列表中。",-1)),i("ul",Re,[(b(!0),C(Q,null,j(o(p),g=>(b(),C("li",{key:g,class:N(["chain-item","chain-item--available",{"chain-item--dragging":o(z)(g)}]),"data-available-cluster":"true"},[i("button",{type:"button",class:"drag-handle","aria-label":"拖动可用思维簇",title:"拖动可用思维簇",onPointerdown:d=>o(M)(g,d)}," ☰ ",40,Ue),i("span",je,I(g),1)],2))),128)),o(p).length===0?(b(),C("li",Qe," 未找到可用的思维簇模块 ")):L("",!0)])])]),o(k)?(b(),C("div",{key:0,ref_key:"dragGhostElement",ref:v,class:"thinking-chain-drag-ghost"},[i("div",Xe,[i("div",Je,I(o(k).label),1),i("div",We,I(o(k).meta),1)])],512)):L("",!0)]))}}),rt=ve(Ye,[["__scopeId","data-v-82eb25f2"]]);export{rt as default}; +import{Dt as I,H as oe,N as j,O as ce,Q as T,U as de,a as Q,at as o,c as he,d as L,f as C,g as me,j as b,l as i,n as ve,v as ge,wt as N}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as fe,d as O,r as pe}from"./dashboard-card-news-BnyB_dHU.js";import{G as X,P as ke,b as J}from"./dashboard-card-calendar-DWuV34Bn.js";import{n as Ce,t as be}from"./pointerReorder-DgfeRZqx.js";import{t as _e}from"./usePointerDragSession-B6CxeZBm.js";function ye(s,h,p){const k=s.length;if(h<0||h>=k||p<0||p>k)return{items:[...s],moved:!1};if(k<=1)return{items:[...s],moved:!1};const v=p>h?p-1:p;if(v===h)return{items:[...s],moved:!1};const c=[...s],[_]=c.splice(h,1);return c.splice(v,0,_),{items:c,moved:!0}}var Y=ke("ThinkingChainsEditor"),Z=0;function ee(){return Z+=1,`thinking-chain-${Z}`}function te(s){const h=typeof s=="number"?s:Number.parseInt(String(s??""),10);return Number.isFinite(h)?Math.max(1,Math.min(20,Math.trunc(h))):1}function ne(s,h){return s.map((p,k)=>te(h[k]))}function Se(s,h){const p=Array.isArray(h)?[...h]:[...h?.clusters??[]],k=Array.isArray(h)?[]:h?.kSequence??[];return{uiId:ee(),theme:s,clusters:p,kSequence:ne(p,k)}}function Ie(){const s=T([]),h=T([]),p=T(""),k=T("info"),v=T(null),c=T(null);async function _(){try{const e=(await J.getThinkingChains({showLoader:!1,loadingKey:"thinking-chains.load"})).chains??{};s.value=Object.entries(e).map(([t,n])=>Se(t,n))}catch(e){Y.error("Failed to load thinking chains:",e),X(`加载思维链失败:${e instanceof Error?e.message:String(e)}`,"error")}}async function q(){try{const e=await J.getAvailableClusters({showLoader:!1,loadingKey:"thinking-chains.available-clusters.load"});h.value=Array.isArray(e)?[...e]:[]}catch(e){Y.error("Failed to load available clusters:",e)}}async function w(){try{const e={},t=new Set;s.value.forEach(n=>{const a=n.theme.trim();if(!a)throw new Error("主题名称不能为空");if(t.has(a))throw new Error(`主题名称重复:${a}`);const r=ne(n.clusters,n.kSequence);t.add(a),n.theme=a,n.kSequence=r,e[a]={clusters:[...n.clusters],kSequence:[...r]}}),await J.saveThinkingChains({chains:e},{loadingKey:"thinking-chains.save"}),p.value="思维链已保存!",k.value="success",X("思维链已保存!","success")}catch(e){const t=e instanceof Error?e.message:String(e);p.value=`保存失败:${t}`,k.value="error",X(`保存失败:${t}`,"error")}}function E(){s.value.push({uiId:ee(),theme:"新主题",clusters:[],kSequence:[]})}function B(e){confirm("确定要删除这个思维链主题吗?")&&s.value.splice(e,1)}function x(e,t){const n=s.value[e];!n||t<0||t>=n.clusters.length||(n.clusters.splice(t,1),n.kSequence.splice(t,1))}function D(e,t){const n=s.value[e];if(!n)return;const a=n.clusters.indexOf(t);a>=0&&x(e,a)}function G(e,t){const n=s.value[e];!n||n.clusters.includes(t)||(n.clusters.push(t),n.kSequence.push(1))}function H(e){if(c.value?.chainIndex===e)return{chainIndex:e,clusters:[...c.value.clusters],kSequence:[...c.value.kSequence]};const t=s.value[e];return t?{chainIndex:e,clusters:[...t.clusters],kSequence:[...t.kSequence]}:null}function P(e,t){return e.clusters.length!==t.clusters.length||e.kSequence.length!==t.kSequence.length?!0:e.clusters.some((n,a)=>n!==t.clusters[a]||e.kSequence[a]!==t.kSequence[a])}function M(e,t,n){const a=new Map;n.clusters.forEach((u,m)=>{a.set(u,n.kSequence[m]??1)});const r=s.value[e];return r?.clusters.forEach((u,m)=>{a.has(u)||a.set(u,r.kSequence[m]??1)}),t.map(u=>a.get(u)??1)}function A(e){return c.value?.chainIndex===e?c.value.clusters:s.value[e]?.clusters??[]}function z(e,t){if(c.value?.chainIndex===e){const r=c.value.clusters.indexOf(t);if(r>=0)return c.value.kSequence[r]??1}const n=s.value[e];if(!n)return 1;const a=n.clusters.indexOf(t);return a>=0?n.kSequence[a]??1:1}function K(e,t,n){const a=te(n),r=s.value[e];if(!r)return;const u=r.clusters.indexOf(t);if(u>=0&&(r.kSequence[u]=a),c.value?.chainIndex===e){const m=c.value.clusters.indexOf(t);m>=0&&(c.value.kSequence[m]=a)}}function F(e,t){if(typeof document>"u")return null;const n=document.elementFromPoint(e,t);if(!(n instanceof Element))return null;const a=n.closest('[data-chain-list="true"]');if(!(a instanceof HTMLElement))return null;const r=Number.parseInt(a.dataset.chainIndex??"",10);if(!Number.isInteger(r)||r<0)return null;const u=R(a,A(r));for(const[m,y]of u.entries())if(be(y.element,t)==="before")return{chainIndex:r,targetClusterName:y.clusterName,insertionIndex:m,placement:"before"};return u.length>0?{chainIndex:r,targetClusterName:u[u.length-1].clusterName,insertionIndex:u.length,placement:"after"}:{chainIndex:r,targetClusterName:null,insertionIndex:0,placement:"after"}}function R(e,t){if(typeof e.querySelectorAll!="function")return[];const n=new Set,a=[];for(const r of Array.from(e.querySelectorAll('[data-chain-item="true"]'))){if(!(r instanceof HTMLElement))continue;const u=r.dataset.clusterName??"";!u||n.has(u)||!t.includes(u)||(n.add(u),a.push({clusterName:u,element:r}))}return a}function U(e){const t=l.value;if(!t)return null;const n=H(e.chainIndex);if(!n)return null;if(t.item.type==="chain"){if(t.item.chainIndex!==e.chainIndex)return null;const m=n.clusters.indexOf(t.item.clusterName);if(m<0)return null;const y=e.targetClusterName&&e.targetClusterName!==t.item.clusterName?Ce(n.clusters,t.item.clusterName,e.targetClusterName,e.placement):ye(n.clusters,m,e.insertionIndex).items,W={chainIndex:e.chainIndex,clusters:y,kSequence:M(e.chainIndex,y,n)};return P(n,W)?W:null}const a=s.value[e.chainIndex];if(!a||a.clusters.includes(t.item.clusterName))return null;const r=n.clusters.filter(m=>m!==t.item.clusterName);if(e.targetClusterName&&e.targetClusterName!==t.item.clusterName){const m=r.indexOf(e.targetClusterName);if(m>=0){const y=e.placement==="before"?m:m+1;r.splice(y,0,t.item.clusterName)}else r.push(t.item.clusterName)}else{const m=Math.max(0,Math.min(e.insertionIndex,r.length));r.splice(m,0,t.item.clusterName)}const u={chainIndex:e.chainIndex,clusters:r,kSequence:M(e.chainIndex,r,n)};return P(n,u)?u:null}function V(e,t){const n=F(e,t);if(!n){v.value=null,c.value=null;return}const a=U(n);if(!a){if(c.value?.chainIndex===n.chainIndex){v.value=n;return}v.value=null,c.value=null;return}v.value=n,c.value=a}const{pointerState:l,dragGhost:g,dragGhostElement:d,startPointerDrag:f}=_e({createGhost:e=>e.type==="chain"?{label:e.clusterName,meta:s.value[e.chainIndex]?.theme||"当前主题"}:{label:e.clusterName,meta:"可用思维簇"},onFrame:e=>{V(e.currentX,e.currentY)},onCommit:()=>{if(!c.value)return;const e=s.value[c.value.chainIndex];e&&(e.clusters=[...c.value.clusters],e.kSequence=[...c.value.kSequence])},onClear:()=>{v.value=null,c.value=null}}),$=he(()=>l.value?.dragging===!0);function S(e,t,n){const a=n.currentTarget;if(!(a instanceof HTMLElement))return;const r=a.closest('[data-chain-item="true"]');if(!(r instanceof HTMLElement))return;const u=s.value[e]?.clusters[t];u&&f({item:{type:"chain",chainIndex:e,clusterName:u},event:n,itemElement:r,captureElement:a})}function ae(e,t){const n=t.currentTarget;if(!(n instanceof HTMLElement))return;const a=n.closest('[data-available-cluster="true"]');a instanceof HTMLElement&&f({item:{type:"available",clusterName:e},event:t,itemElement:a,captureElement:n})}function re(e,t){const n=l.value?.item;return l.value?.dragging===!0&&n?.type==="chain"&&n.chainIndex===e&&n.clusterName===t}function se(e){const t=l.value?.item;return l.value?.dragging===!0&&t?.type==="available"&&t.clusterName===e}function ie(e){return v.value?.chainIndex===e}function le(e,t){return v.value?.chainIndex===e&&v.value.targetClusterName===t&&v.value.placement==="before"}function ue(e,t){return v.value?.chainIndex===e&&v.value.targetClusterName===t&&v.value.placement==="after"}return ce(()=>{_(),q()}),{thinkingChains:s,availableClusters:h,dragGhost:g,dragGhostElement:d,isPreviewDragging:$,statusMessage:p,statusType:k,loadThinkingChains:_,loadAvailableClusters:q,saveThinkingChains:w,addThinkingChain:E,removeChain:B,removeCluster:x,removeClusterByName:D,addCluster:G,getRenderedClusters:A,getRenderedKValue:z,updateClusterKValue:K,startChainPointerDrag:S,startAvailablePointerDrag:ae,isChainClusterDragging:re,isAvailableClusterDragging:se,isChainDropTarget:ie,isChainDropBefore:le,isChainDropAfter:ue}}var Te={class:"config-section active-section"},Ne={id:"thinking-chains-editor-controls",class:"form-actions"},qe={id:"thinking-chains-container",class:"thinking-chains-layout"},we={class:"thinking-chains-editor"},Ee={open:""},xe={class:"chain-header"},De={class:"theme-name"},Pe=["onClick"],Me={class:"chain-content"},Ae={class:"form-group theme-editor"},Ke=["for"],Ve=["id","onUpdate:modelValue"],$e=["data-chain-index","data-cluster-index","data-cluster-name"],Le=["onPointerdown"],Oe={class:"cluster-content"},Be={class:"cluster-name"},Ge=["for"],He=["id","value","onInput"],ze=["onClick"],Fe={class:"available-clusters-panel card"},Re={class:"draggable-list available-clusters-list"},Ue=["onPointerdown"],je={class:"cluster-name"},Qe={key:0,class:"no-clusters"},Xe={class:"thinking-chain-drag-ghost-shell"},Je={class:"thinking-chain-drag-ghost-title"},We={class:"thinking-chain-drag-ghost-meta"},Ye=ge({__name:"ThinkingChainsEditor",setup(s){const{thinkingChains:h,availableClusters:p,dragGhost:k,dragGhostElement:v,isPreviewDragging:c,statusMessage:_,statusType:q,saveThinkingChains:w,addThinkingChain:E,removeChain:B,removeClusterByName:x,getRenderedClusters:D,getRenderedKValue:G,updateClusterKValue:H,startChainPointerDrag:P,startAvailablePointerDrag:M,isChainClusterDragging:A,isAvailableClusterDragging:z,isChainDropTarget:K,isChainDropBefore:F,isChainDropAfter:R}=Ie();function U(V,l,g){const d=g.target;d instanceof HTMLInputElement&&H(V,l,d.value)}return(V,l)=>(b(),C("section",Te,[l[9]||(l[9]=i("p",{class:"description"}," 管理 RAGDiaryPlugin 使用的元思考链。按住左侧手柄拖动时会实时预览插入位置, 释放后再提交最终顺序。 ",-1)),i("div",Ne,[i("button",{type:"button",class:"btn-primary",onClick:l[0]||(l[0]=(...g)=>o(w)&&o(w)(...g))}," 保存所有更改 "),i("button",{type:"button",class:"btn-secondary",onClick:l[1]||(l[1]=(...g)=>o(E)&&o(E)(...g))}," 添加新主题 "),o(_)?(b(),C("span",{key:0,class:N(["status-message",o(q)])},I(o(_)),3)):L("",!0)]),i("div",qe,[i("div",we,[l[6]||(l[6]=i("h3",null,"思考主题列表",-1)),(b(!0),C(Q,null,j(o(h),(g,d)=>(b(),C("div",{key:g.uiId,class:"thinking-chain-item card"},[i("details",Ee,[i("summary",xe,[i("span",De,"主题:"+I(g.theme||"未命名主题"),1),i("button",{type:"button",class:"btn-danger btn-sm",onClick:O(f=>o(B)(d),["stop","prevent"])}," 删除 ",8,Pe)]),i("div",Me,[i("div",Ae,[i("label",{for:`thinking-theme-${d}`},"主题名称",8,Ke),de(i("input",{id:`thinking-theme-${d}`,"onUpdate:modelValue":f=>g.theme=f,type:"text",placeholder:"请输入主题名称",onClick:l[2]||(l[2]=O(()=>{},["stop"]))},null,8,Ve),[[fe,g.theme,void 0,{trim:!0}]])]),me(pe,{tag:"ul",name:"drag-sort",class:N(["draggable-list",{"draggable-list--active-target":o(K)(d),"draggable-list--previewing":o(c)}]),"data-chain-list":"true","data-chain-index":d},{default:oe(()=>[(b(!0),C(Q,null,j(o(D)(d),(f,$)=>(b(),C("li",{key:f,class:N(["chain-item",{"chain-item--dragging":o(A)(d,f),"chain-item--drop-before":o(F)(d,f),"chain-item--drop-after":o(R)(d,f)}]),"data-chain-item":"true","data-chain-index":d,"data-cluster-index":$,"data-cluster-name":f},[i("button",{type:"button",class:"drag-handle","aria-label":"拖动思维簇排序",title:"拖动思维簇排序",onPointerdown:S=>o(P)(d,$,S)}," ☰ ",40,Le),i("div",Oe,[i("span",Be,I(f),1),i("label",{class:"cluster-k-control",for:`cluster-k-value-${d}-${f}`},[l[5]||(l[5]=i("span",{class:"cluster-k-label"},"K 值",-1)),i("input",{id:`cluster-k-value-${d}-${f}`,type:"number",min:"1",max:"20",class:"cluster-k-input",value:o(G)(d,f),onInput:S=>U(d,f,S),onClick:l[3]||(l[3]=O(()=>{},["stop"])),onPointerdown:l[4]||(l[4]=O(()=>{},["stop"]))},null,40,He)],8,Ge)]),i("button",{type:"button",class:"btn-danger btn-sm",onClick:S=>o(x)(d,f)}," 移除 ",8,ze)],10,$e))),128)),o(D)(d).length===0?(b(),C("li",{key:"empty",class:N(["drop-placeholder",{"drop-placeholder--active":o(K)(d)}])}," 将思维簇拖拽到此处 ",2)):L("",!0)]),_:2},1032,["class","data-chain-index"])])])]))),128))]),i("div",Fe,[l[7]||(l[7]=i("h3",null,"可用的思维簇模块",-1)),l[8]||(l[8]=i("p",{class:"description"},"将模块从这里拖拽到左侧的主题列表中。",-1)),i("ul",Re,[(b(!0),C(Q,null,j(o(p),g=>(b(),C("li",{key:g,class:N(["chain-item","chain-item--available",{"chain-item--dragging":o(z)(g)}]),"data-available-cluster":"true"},[i("button",{type:"button",class:"drag-handle","aria-label":"拖动可用思维簇",title:"拖动可用思维簇",onPointerdown:d=>o(M)(g,d)}," ☰ ",40,Ue),i("span",je,I(g),1)],2))),128)),o(p).length===0?(b(),C("li",Qe," 未找到可用的思维簇模块 ")):L("",!0)])])]),o(k)?(b(),C("div",{key:0,ref_key:"dragGhostElement",ref:v,class:"thinking-chain-drag-ghost"},[i("div",Xe,[i("div",Je,I(o(k).label),1),i("div",We,I(o(k).meta),1)])],512)):L("",!0)]))}}),rt=ve(Ye,[["__scopeId","data-v-82eb25f2"]]);export{rt as default}; diff --git a/AdminPanel-Vue/dist/assets/js/ToolApprovalManager-CgfmrCDo.js b/AdminPanel-Vue/dist/assets/js/ToolApprovalManager-Bf6PJCCw.js similarity index 96% rename from AdminPanel-Vue/dist/assets/js/ToolApprovalManager-CgfmrCDo.js rename to AdminPanel-Vue/dist/assets/js/ToolApprovalManager-Bf6PJCCw.js index 4065fe6fe..0a3ed5b31 100644 --- a/AdminPanel-Vue/dist/assets/js/ToolApprovalManager-CgfmrCDo.js +++ b/AdminPanel-Vue/dist/assets/js/ToolApprovalManager-Bf6PJCCw.js @@ -1,4 +1,4 @@ -import{Dt as A,O as M,Q as n,U as r,d as x,f as u,j as v,l as o,n as T,v as _,wt as w}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as d,c as f,d as C}from"./dashboard-card-news-BnyB_dHU.js";import{G as p,T as m}from"./dashboard-card-calendar-CA3-tSpi.js";var L={class:"config-section active-section"},k={class:"card"},B={class:"config-item"},S={class:"switch-container"},V={class:"switch"},U={class:"config-item"},D={class:"switch-container"},E={class:"switch"},$={class:"config-item"},j={class:"config-item"},z={class:"config-footer"},K=_({__name:"ToolApprovalManager",setup(N){function g(){return{enabled:!1,approveAll:!1,timeoutMinutes:5,approvalListText:""}}function c(a){const e=Array.isArray(a.approvalList)?a.approvalList:Array.isArray(a.toolList)?a.toolList:[];return{enabled:!!a.enabled,approveAll:!!a.approveAll,timeoutMinutes:a.timeoutMinutes??a.timeout??5,approvalListText:e.join(` +import{Dt as A,O as M,Q as n,U as r,d as x,f as u,j as v,l as o,n as T,v as _,wt as w}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as d,c as f,d as C}from"./dashboard-card-news-BnyB_dHU.js";import{G as p,T as m}from"./dashboard-card-calendar-DWuV34Bn.js";var L={class:"config-section active-section"},k={class:"card"},B={class:"config-item"},S={class:"switch-container"},V={class:"switch"},U={class:"config-item"},D={class:"switch-container"},E={class:"switch"},$={class:"config-item"},j={class:"config-item"},z={class:"config-footer"},K=_({__name:"ToolApprovalManager",setup(N){function g(){return{enabled:!1,approveAll:!1,timeoutMinutes:5,approvalListText:""}}function c(a){const e=Array.isArray(a.approvalList)?a.approvalList:Array.isArray(a.toolList)?a.toolList:[];return{enabled:!!a.enabled,approveAll:!!a.approveAll,timeoutMinutes:a.timeoutMinutes??a.timeout??5,approvalListText:e.join(` `)}}const l=n(g()),s=n(""),i=n("info");async function b(){try{l.value=c(await m.getToolApprovalConfig({showLoader:!1,loadingKey:"tool-approval.config.load"}))}catch(a){const e=a instanceof Error?a.message:String(a);console.error("Failed to load config:",a),p(`加载审核配置失败:${e}`,"error")}}async function y(){try{await m.saveToolApprovalConfig({enabled:l.value.enabled,approveAll:l.value.approveAll,timeoutMinutes:l.value.timeoutMinutes,approvalList:l.value.approvalListText.split(` `).map(a=>a.trim()).filter(Boolean)},{loadingKey:"tool-approval.config.save"}),s.value="审核配置已保存!",i.value="success",p("审核配置已保存!","success")}catch(a){const e=a instanceof Error?a.message:String(a);s.value=`保存失败:${e}`,i.value="error",p(`保存失败:${e}`,"error")}}return M(()=>{b()}),(a,e)=>(v(),u("section",L,[e[14]||(e[14]=o("p",{class:"description"},"在此管理工具调用的审核机制。开启后,特定的工具调用将需要通过管理面板进行人工确认。",-1)),o("div",k,[o("form",{onSubmit:C(y,["prevent"])},[o("div",B,[o("label",S,[e[5]||(e[5]=o("span",null,"是否开启工具调用审核",-1)),o("label",V,[r(o("input",{type:"checkbox","onUpdate:modelValue":e[0]||(e[0]=t=>l.value.enabled=t)},null,512),[[d,l.value.enabled]]),e[4]||(e[4]=o("span",{class:"slider"},null,-1))])])]),o("div",U,[o("label",D,[e[7]||(e[7]=o("span",null,"是否开启所有工具调用审核",-1)),o("label",E,[r(o("input",{type:"checkbox","onUpdate:modelValue":e[1]||(e[1]=t=>l.value.approveAll=t)},null,512),[[d,l.value.approveAll]]),e[6]||(e[6]=o("span",{class:"slider"},null,-1))])]),e[8]||(e[8]=o("p",{class:"aa-hint"},"如果开启,所有工具调用都将进入审核流程,无论是否在名单中。",-1))]),o("div",$,[e[9]||(e[9]=o("label",{for:"tool-approval-timeout"},"设置审核最大等待时间 (分钟)",-1)),r(o("input",{type:"number",id:"tool-approval-timeout","onUpdate:modelValue":e[2]||(e[2]=t=>l.value.timeoutMinutes=t),min:"1",max:"60"},null,512),[[f,l.value.timeoutMinutes,void 0,{number:!0}]]),e[10]||(e[10]=o("p",{class:"aa-hint"},"超时后,该审核请求将自动拒绝。",-1))]),o("div",j,[e[11]||(e[11]=o("label",{for:"tool-approval-list"},"被审核工具名单 (每行一个工具名称)",-1)),r(o("textarea",{id:"tool-approval-list","onUpdate:modelValue":e[3]||(e[3]=t=>l.value.approvalListText=t),rows:"8",placeholder:`例如: SciCalculator diff --git a/AdminPanel-Vue/dist/assets/js/ToolListEditor-BGu_g7Pd.js b/AdminPanel-Vue/dist/assets/js/ToolListEditor-ioMxub1G.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/ToolListEditor-BGu_g7Pd.js rename to AdminPanel-Vue/dist/assets/js/ToolListEditor-ioMxub1G.js index 2f8b5bf9c..31d2e5d95 100644 --- a/AdminPanel-Vue/dist/assets/js/ToolListEditor-BGu_g7Pd.js +++ b/AdminPanel-Vue/dist/assets/js/ToolListEditor-ioMxub1G.js @@ -1,4 +1,4 @@ -import{Dt as m,N as L,O as j,Q as u,a as q,c as z,d as G,et as R,f as d,g as A,h as J,j as c,l,n as x,v as E,wt as W}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{G as p,P as X,h}from"./dashboard-card-calendar-CA3-tSpi.js";var Y={class:"left-panel"},Z={class:"tools-container card"},ee={class:"section-header"},te={class:"tool-count"},ae={class:"filter-section"},le=["value"],oe={class:"filter-actions"},ne={class:"checkbox-label"},se=["checked"],ie={key:0,class:"loading-state"},re={key:1,class:"tools-list"},ue={class:"tool-checkbox"},de=["checked","onChange"],ce={class:"tool-name"},ve={class:"tool-plugin"},ge=E({__name:"ToolSelectionPanel",props:{loading:{type:Boolean},filteredTools:{},selectedTools:{},searchQuery:{},showSelectedOnly:{type:Boolean}},emits:["update:searchQuery","update:showSelectedOnly","toggleTool","selectAll","deselectAll"],setup(s,{emit:y}){const i=y;return(C,t)=>(c(),d("div",Y,[l("div",Z,[l("h2",ee,[t[4]||(t[4]=J(" 可用工具 ",-1)),l("span",te,"("+m(s.filteredTools.length)+")",1)]),l("div",ae,[l("input",{type:"search",value:s.searchQuery,placeholder:"🔍 搜索工具…",class:"tool-search",onInput:t[0]||(t[0]=o=>i("update:searchQuery",o.target.value))},null,40,le),l("div",oe,[l("label",ne,[l("input",{type:"checkbox",checked:s.showSelectedOnly,onChange:t[1]||(t[1]=o=>i("update:showSelectedOnly",o.target.checked))},null,40,se),t[5]||(t[5]=l("span",null,"只显示已选",-1))]),l("button",{onClick:t[2]||(t[2]=o=>i("selectAll")),class:"btn-secondary btn-sm"}," 全选 "),l("button",{onClick:t[3]||(t[3]=o=>i("deselectAll")),class:"btn-secondary btn-sm"}," 清空 ")])]),s.loading?(c(),d("div",ie,[...t[6]||(t[6]=[l("span",{class:"loading-spinner"},null,-1),l("p",null,"正在加载工具列表…",-1)])])):(c(),d("div",re,[(c(!0),d(q,null,L(s.filteredTools,o=>(c(),d("div",{key:o.uniqueId,class:"tool-item"},[l("label",ue,[l("input",{type:"checkbox",checked:s.selectedTools.has(o.uniqueId),onChange:r=>i("toggleTool",o.uniqueId,r.target.checked)},null,40,de),l("span",ce,m(o.name),1),l("span",ve,m(o.pluginName),1)])]))),128))]))])]))}}),fe=x(ge,[["__scopeId","data-v-49b9d194"]]),pe={class:"right-panel"},ye={class:"config-manager card"},Ce={class:"config-selector"},he=["value"],me=["value"],we={class:"config-actions"},be=["disabled"],_e=["disabled"],$e={class:"preview-section card"},ke={class:"preview-controls"},Te={class:"checkbox-label"},Se=["checked"],xe={class:"checkbox-label"},Ee=["checked"],Pe=["value"],Ie=E({__name:"ToolConfigPreviewPanel",props:{availableConfigs:{},selectedConfig:{},statusMessage:{},statusType:{},includeHeader:{type:Boolean},includeExamples:{type:Boolean},previewContent:{}},emits:["update:selectedConfig","loadConfig","createConfig","deleteConfig","saveConfig","update:includeHeader","update:includeExamples","copyPreview"],setup(s,{emit:y}){const i=y;return(C,t)=>(c(),d("div",pe,[l("div",ye,[t[9]||(t[9]=l("h2",{class:"section-header"},"📁 配置管理",-1)),l("div",Ce,[l("select",{value:s.selectedConfig,onChange:t[0]||(t[0]=o=>i("update:selectedConfig",o.target.value))},[t[8]||(t[8]=l("option",{value:""},"-- 新建配置文件 --",-1)),(c(!0),d(q,null,L(s.availableConfigs,o=>(c(),d("option",{key:o,value:o},m(o),9,me))),128))],40,he)]),l("div",we,[l("button",{onClick:t[1]||(t[1]=o=>i("loadConfig")),disabled:!s.selectedConfig,class:"btn-primary"}," 加载 ",8,be),l("button",{onClick:t[2]||(t[2]=o=>i("createConfig")),class:"btn-primary"},"新建"),l("button",{onClick:t[3]||(t[3]=o=>i("deleteConfig")),disabled:!s.selectedConfig,class:"btn-danger"}," 删除 ",8,_e),l("button",{onClick:t[4]||(t[4]=o=>i("saveConfig")),class:"btn-success"},"💾 保存")]),s.statusMessage?(c(),d("span",{key:0,class:W(["status-message",s.statusType])},m(s.statusMessage),3)):G("",!0)]),l("div",$e,[t[12]||(t[12]=l("h2",{class:"section-header"},"📝 生成预览",-1)),l("div",ke,[l("label",Te,[l("input",{type:"checkbox",checked:s.includeHeader,onChange:t[5]||(t[5]=o=>i("update:includeHeader",o.target.checked))},null,40,Se),t[10]||(t[10]=l("span",null,"包含文件头",-1))]),l("label",xe,[l("input",{type:"checkbox",checked:s.includeExamples,onChange:t[6]||(t[6]=o=>i("update:includeExamples",o.target.checked))},null,40,Ee),t[11]||(t[11]=l("span",null,"包含示例",-1))]),l("button",{onClick:t[7]||(t[7]=o=>i("copyPreview")),class:"btn-secondary"},"📋 复制")]),l("textarea",{id:"preview-output",readonly:"",value:s.previewContent,placeholder:"选择工具后将在此显示配置内容…"},null,8,Pe)])]))}}),Ae=x(Ie,[["__scopeId","data-v-bcb5691b"]]),Le={class:"config-section active-section"},qe={class:"tool-list-editor"},Ne=E({__name:"ToolListEditor",setup(s){const y=X("ToolListEditor"),i=u(!0),C=u([]),t=R(new Set),o=u([]),r=u(""),w=u(""),b=u(!1),_=u(!0),$=u(!0),k=u(""),v=u(""),g=u("info"),P=z(()=>{let e=C.value;if(w.value){const a=w.value.toLowerCase();e=e.filter(n=>n.name.toLowerCase().includes(a)||n.pluginName.toLowerCase().includes(a))}return b.value&&(e=e.filter(a=>t.value.has(a.uniqueId))),e});function T(e){const a=new Set(t.value);e(a),t.value=a}async function N(){try{i.value=!0,C.value=(await h.getTools()).map((e,a)=>({...e,uniqueId:e.uniqueId||`${e.pluginName}__${e.name}__${a}`}))}catch(e){const a=e instanceof Error?e.message:String(e);y.error("Failed to load tools:",a),p(`Failed to load tools: ${a}`,"error")}finally{i.value=!1}}async function S(){try{o.value=await h.getConfigs()}catch(e){const a=e instanceof Error?e.message:String(e);y.error("Failed to load configs:",a)}}function f(){const e=C.value.filter(n=>t.value.has(n.uniqueId));let a="";_.value&&(a+=`# Available Tools +import{Dt as m,N as L,O as j,Q as u,a as q,c as z,d as G,et as R,f as d,g as A,h as J,j as c,l,n as x,v as E,wt as W}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{G as p,P as X,h}from"./dashboard-card-calendar-DWuV34Bn.js";var Y={class:"left-panel"},Z={class:"tools-container card"},ee={class:"section-header"},te={class:"tool-count"},ae={class:"filter-section"},le=["value"],oe={class:"filter-actions"},ne={class:"checkbox-label"},se=["checked"],ie={key:0,class:"loading-state"},re={key:1,class:"tools-list"},ue={class:"tool-checkbox"},de=["checked","onChange"],ce={class:"tool-name"},ve={class:"tool-plugin"},ge=E({__name:"ToolSelectionPanel",props:{loading:{type:Boolean},filteredTools:{},selectedTools:{},searchQuery:{},showSelectedOnly:{type:Boolean}},emits:["update:searchQuery","update:showSelectedOnly","toggleTool","selectAll","deselectAll"],setup(s,{emit:y}){const i=y;return(C,t)=>(c(),d("div",Y,[l("div",Z,[l("h2",ee,[t[4]||(t[4]=J(" 可用工具 ",-1)),l("span",te,"("+m(s.filteredTools.length)+")",1)]),l("div",ae,[l("input",{type:"search",value:s.searchQuery,placeholder:"🔍 搜索工具…",class:"tool-search",onInput:t[0]||(t[0]=o=>i("update:searchQuery",o.target.value))},null,40,le),l("div",oe,[l("label",ne,[l("input",{type:"checkbox",checked:s.showSelectedOnly,onChange:t[1]||(t[1]=o=>i("update:showSelectedOnly",o.target.checked))},null,40,se),t[5]||(t[5]=l("span",null,"只显示已选",-1))]),l("button",{onClick:t[2]||(t[2]=o=>i("selectAll")),class:"btn-secondary btn-sm"}," 全选 "),l("button",{onClick:t[3]||(t[3]=o=>i("deselectAll")),class:"btn-secondary btn-sm"}," 清空 ")])]),s.loading?(c(),d("div",ie,[...t[6]||(t[6]=[l("span",{class:"loading-spinner"},null,-1),l("p",null,"正在加载工具列表…",-1)])])):(c(),d("div",re,[(c(!0),d(q,null,L(s.filteredTools,o=>(c(),d("div",{key:o.uniqueId,class:"tool-item"},[l("label",ue,[l("input",{type:"checkbox",checked:s.selectedTools.has(o.uniqueId),onChange:r=>i("toggleTool",o.uniqueId,r.target.checked)},null,40,de),l("span",ce,m(o.name),1),l("span",ve,m(o.pluginName),1)])]))),128))]))])]))}}),fe=x(ge,[["__scopeId","data-v-49b9d194"]]),pe={class:"right-panel"},ye={class:"config-manager card"},Ce={class:"config-selector"},he=["value"],me=["value"],we={class:"config-actions"},be=["disabled"],_e=["disabled"],$e={class:"preview-section card"},ke={class:"preview-controls"},Te={class:"checkbox-label"},Se=["checked"],xe={class:"checkbox-label"},Ee=["checked"],Pe=["value"],Ie=E({__name:"ToolConfigPreviewPanel",props:{availableConfigs:{},selectedConfig:{},statusMessage:{},statusType:{},includeHeader:{type:Boolean},includeExamples:{type:Boolean},previewContent:{}},emits:["update:selectedConfig","loadConfig","createConfig","deleteConfig","saveConfig","update:includeHeader","update:includeExamples","copyPreview"],setup(s,{emit:y}){const i=y;return(C,t)=>(c(),d("div",pe,[l("div",ye,[t[9]||(t[9]=l("h2",{class:"section-header"},"📁 配置管理",-1)),l("div",Ce,[l("select",{value:s.selectedConfig,onChange:t[0]||(t[0]=o=>i("update:selectedConfig",o.target.value))},[t[8]||(t[8]=l("option",{value:""},"-- 新建配置文件 --",-1)),(c(!0),d(q,null,L(s.availableConfigs,o=>(c(),d("option",{key:o,value:o},m(o),9,me))),128))],40,he)]),l("div",we,[l("button",{onClick:t[1]||(t[1]=o=>i("loadConfig")),disabled:!s.selectedConfig,class:"btn-primary"}," 加载 ",8,be),l("button",{onClick:t[2]||(t[2]=o=>i("createConfig")),class:"btn-primary"},"新建"),l("button",{onClick:t[3]||(t[3]=o=>i("deleteConfig")),disabled:!s.selectedConfig,class:"btn-danger"}," 删除 ",8,_e),l("button",{onClick:t[4]||(t[4]=o=>i("saveConfig")),class:"btn-success"},"💾 保存")]),s.statusMessage?(c(),d("span",{key:0,class:W(["status-message",s.statusType])},m(s.statusMessage),3)):G("",!0)]),l("div",$e,[t[12]||(t[12]=l("h2",{class:"section-header"},"📝 生成预览",-1)),l("div",ke,[l("label",Te,[l("input",{type:"checkbox",checked:s.includeHeader,onChange:t[5]||(t[5]=o=>i("update:includeHeader",o.target.checked))},null,40,Se),t[10]||(t[10]=l("span",null,"包含文件头",-1))]),l("label",xe,[l("input",{type:"checkbox",checked:s.includeExamples,onChange:t[6]||(t[6]=o=>i("update:includeExamples",o.target.checked))},null,40,Ee),t[11]||(t[11]=l("span",null,"包含示例",-1))]),l("button",{onClick:t[7]||(t[7]=o=>i("copyPreview")),class:"btn-secondary"},"📋 复制")]),l("textarea",{id:"preview-output",readonly:"",value:s.previewContent,placeholder:"选择工具后将在此显示配置内容…"},null,8,Pe)])]))}}),Ae=x(Ie,[["__scopeId","data-v-bcb5691b"]]),Le={class:"config-section active-section"},qe={class:"tool-list-editor"},Ne=E({__name:"ToolListEditor",setup(s){const y=X("ToolListEditor"),i=u(!0),C=u([]),t=R(new Set),o=u([]),r=u(""),w=u(""),b=u(!1),_=u(!0),$=u(!0),k=u(""),v=u(""),g=u("info"),P=z(()=>{let e=C.value;if(w.value){const a=w.value.toLowerCase();e=e.filter(n=>n.name.toLowerCase().includes(a)||n.pluginName.toLowerCase().includes(a))}return b.value&&(e=e.filter(a=>t.value.has(a.uniqueId))),e});function T(e){const a=new Set(t.value);e(a),t.value=a}async function N(){try{i.value=!0,C.value=(await h.getTools()).map((e,a)=>({...e,uniqueId:e.uniqueId||`${e.pluginName}__${e.name}__${a}`}))}catch(e){const a=e instanceof Error?e.message:String(e);y.error("Failed to load tools:",a),p(`Failed to load tools: ${a}`,"error")}finally{i.value=!1}}async function S(){try{o.value=await h.getConfigs()}catch(e){const a=e instanceof Error?e.message:String(e);y.error("Failed to load configs:",a)}}function f(){const e=C.value.filter(n=>t.value.has(n.uniqueId));let a="";_.value&&(a+=`# Available Tools `,a+=`The following tools are currently available: diff --git a/AdminPanel-Vue/dist/assets/js/ToolboxManager-QKOmlxwV.js b/AdminPanel-Vue/dist/assets/js/ToolboxManager-D56-z_F1.js similarity index 98% rename from AdminPanel-Vue/dist/assets/js/ToolboxManager-QKOmlxwV.js rename to AdminPanel-Vue/dist/assets/js/ToolboxManager-D56-z_F1.js index 48af256fc..3db5971b6 100644 --- a/AdminPanel-Vue/dist/assets/js/ToolboxManager-QKOmlxwV.js +++ b/AdminPanel-Vue/dist/assets/js/ToolboxManager-D56-z_F1.js @@ -1 +1 @@ -import{Dt as _,H as h,N as D,O as I,Q as n,U as x,a as L,d as w,f as d,g as N,h as r,j as u,l as t,n as A,v as B,wt as E}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as y}from"./dashboard-card-news-BnyB_dHU.js";import{G as c,_ as p}from"./dashboard-card-calendar-CA3-tSpi.js";import{t as O}from"./DualPaneEditor-D9nB9raE.js";var z={class:"config-section active-section toolbox-manager-page"},G={class:"toolbox-map-list"},H={class:"toolbox-entry-row"},P=["onUpdate:modelValue"],Q={class:"toolbox-entry-row"},q=["onUpdate:modelValue"],J={class:"toolbox-entry-row"},R=["onUpdate:modelValue"],W={class:"toolbox-entry-actions"},X=["onClick"],Y=["onClick"],Z={key:0,class:"empty-state"},oo={class:"toolbox-file-editor"},to={class:"toolbox-editor-controls"},eo={class:"editing-file-display"},lo={class:"editor-actions"},ao=["disabled"],so=B({__name:"ToolboxManager",setup(io){const s=n([]),b=n(""),v=n(""),m=n(""),T=n("info"),f=n(""),g=n("info");let k=0;function C(e={}){return k+=1,{localId:`toolbox-entry-${k}`,alias:e.alias??"",file:e.file??"",description:e.description??""}}async function M(){try{const e=await p.getToolboxMap({showLoader:!1,loadingKey:"toolbox.map.load"});s.value=Object.entries(e||{}).map(([o,a])=>C({alias:o,file:a?.file||"",description:a?.description||""}))}catch(e){console.error("Failed to load toolbox map:",e),s.value=[]}}function V(){s.value.push(C({alias:"新工具",file:"新文件.txt",description:""}))}function F(e){confirm("确定要删除这个 Toolbox 映射吗?")&&s.value.splice(e,1)}async function $(){try{const e=new Set,o=[];for(const i of s.value){const l=i.alias.trim();l&&(e.has(l)&&o.push(l),e.add(l))}if(o.length>0){c(`存在重复的别名:${o.join(", ")}`,"error");return}const a=s.value.reduce((i,l)=>{const S=l.alias.trim();return S&&(i[S]={file:l.file.trim(),description:l.description||""}),i},{});await p.saveToolboxMap(a,{loadingKey:"toolbox.map.save"}),m.value="Toolbox 映射表已保存!",T.value="success",c("Toolbox 映射表已保存!","success")}catch(e){m.value=`保存失败:${e instanceof Error?e.message:String(e)}`,T.value="error"}}async function U(){const e=prompt("请输入新文件名 (例如:MyTool.txt):");if(e)try{await p.createToolboxFile(e,void 0,{loadingKey:"toolbox.file.create"}),c(`文件 ${e} 已创建!`,"success"),M()}catch(o){c(`创建文件失败:${o instanceof Error?o.message:String(o)}`,"error")}}async function K(e){if(e){b.value=e;try{v.value=await p.getToolboxFile(e,{showLoader:!1,loadingKey:"toolbox.file.load"})}catch(o){c(`加载文件失败:${o instanceof Error?o.message:String(o)}`,"error")}}}async function j(){if(b.value)try{await p.saveToolboxFile(b.value,v.value,{loadingKey:"toolbox.file.save"}),f.value="文件已保存!",g.value="success",c("文件已保存!","success")}catch(e){f.value=`保存失败:${e instanceof Error?e.message:String(e)}`,g.value="error"}}return I(()=>{M()}),(e,o)=>(u(),d("section",z,[o[13]||(o[13]=t("p",{class:"description"}," 维护 toolbox_map.json(alias→file+description),并编辑 TVStxt 下映射文件内容。 ",-1)),N(O,{"left-title":"Toolbox 映射表","right-title":"Toolbox 文件内容","initial-left-width":450,"min-left-width":350,"max-left-width":600},{"left-actions":h(()=>[t("div",{class:"header-actions"},[t("button",{type:"button",onClick:V,class:"btn-primary btn-sm btn-sm-touch","aria-label":"添加新 Toolbox",title:"添加新 Toolbox"},[...o[1]||(o[1]=[t("span",{class:"material-symbols-outlined"},"add",-1),r(" 添加 ",-1)])]),t("button",{type:"button",onClick:U,class:"btn-secondary btn-sm btn-sm-touch","aria-label":"新建 Toolbox 文件",title:"新建 Toolbox 文件"},[...o[2]||(o[2]=[t("span",{class:"material-symbols-outlined"},"create_new_folder",-1),r(" 新建 ",-1)])]),t("button",{type:"button",onClick:$,class:"btn-success btn-sm btn-sm-touch","aria-label":"保存 Toolbox 映射表",title:"保存 Toolbox 映射表"},[...o[3]||(o[3]=[t("span",{class:"material-symbols-outlined"},"save",-1),r(" 保存 ",-1)])])])]),"left-content":h(()=>[t("div",G,[(u(!0),d(L,null,D(s.value,(a,i)=>(u(),d("div",{key:a.localId,class:"toolbox-map-entry card"},[t("div",H,[o[4]||(o[4]=t("label",null,"别名 (Alias):",-1)),x(t("input",{type:"text","onUpdate:modelValue":l=>a.alias=l,placeholder:"例如:my-tool"},null,8,P),[[y,a.alias]])]),t("div",Q,[o[5]||(o[5]=t("label",null,"文件名:",-1)),x(t("input",{type:"text","onUpdate:modelValue":l=>a.file=l,placeholder:"例如:MyTool.txt"},null,8,q),[[y,a.file]])]),t("div",J,[o[6]||(o[6]=t("label",null,"描述:",-1)),x(t("input",{type:"text","onUpdate:modelValue":l=>a.description=l,placeholder:"工具描述…"},null,8,R),[[y,a.description]])]),t("div",W,[t("button",{onClick:l=>K(a.file),class:"btn-secondary btn-sm btn-sm-touch"},[...o[7]||(o[7]=[t("span",{class:"material-symbols-outlined"},"edit",-1),r(" 编辑 ",-1)])],8,X),t("button",{onClick:l=>F(i),class:"btn-danger btn-sm btn-sm-touch"},[...o[8]||(o[8]=[t("span",{class:"material-symbols-outlined"},"delete",-1),r(" 删除 ",-1)])],8,Y)])]))),128)),s.value.length===0?(u(),d("div",Z,[o[9]||(o[9]=t("span",{class:"material-symbols-outlined"},"inventory_2",-1)),o[10]||(o[10]=t("p",null,"暂无 Toolbox 映射",-1)),t("button",{onClick:V,class:"btn-primary"},"添加第一个 Toolbox")])):w("",!0)])]),"right-content":h(()=>[t("div",oo,[t("div",to,[t("span",eo,[o[11]||(o[11]=t("span",{class:"material-symbols-outlined"},"description",-1)),r(" "+_(b.value||"未选择文件"),1)])]),x(t("textarea",{"onUpdate:modelValue":o[0]||(o[0]=a=>v.value=a),spellcheck:"false",rows:"20",placeholder:"从左侧选择一个 Toolbox 以编辑其关联文件…",class:"file-content-editor"},null,512),[[y,v.value]]),t("div",lo,[t("button",{onClick:j,disabled:!b.value,class:"btn-success"},[...o[12]||(o[12]=[t("span",{class:"material-symbols-outlined"},"save",-1),r(" 保存文件 ",-1)])],8,ao),f.value?(u(),d("span",{key:0,class:E(["status-message",g.value])},_(f.value),3)):w("",!0)])])]),_:1}),m.value?(u(),d("span",{key:0,class:E(["status-message","floating-status",T.value])},_(m.value),3)):w("",!0)]))}}),bo=A(so,[["__scopeId","data-v-cc50c725"]]);export{bo as default}; +import{Dt as _,H as h,N as D,O as I,Q as n,U as x,a as L,d as w,f as d,g as N,h as r,j as u,l as t,n as A,v as B,wt as E}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as y}from"./dashboard-card-news-BnyB_dHU.js";import{G as c,_ as p}from"./dashboard-card-calendar-DWuV34Bn.js";import{t as O}from"./DualPaneEditor-D9nB9raE.js";var z={class:"config-section active-section toolbox-manager-page"},G={class:"toolbox-map-list"},H={class:"toolbox-entry-row"},P=["onUpdate:modelValue"],Q={class:"toolbox-entry-row"},q=["onUpdate:modelValue"],J={class:"toolbox-entry-row"},R=["onUpdate:modelValue"],W={class:"toolbox-entry-actions"},X=["onClick"],Y=["onClick"],Z={key:0,class:"empty-state"},oo={class:"toolbox-file-editor"},to={class:"toolbox-editor-controls"},eo={class:"editing-file-display"},lo={class:"editor-actions"},ao=["disabled"],so=B({__name:"ToolboxManager",setup(io){const s=n([]),b=n(""),v=n(""),m=n(""),T=n("info"),f=n(""),g=n("info");let k=0;function C(e={}){return k+=1,{localId:`toolbox-entry-${k}`,alias:e.alias??"",file:e.file??"",description:e.description??""}}async function M(){try{const e=await p.getToolboxMap({showLoader:!1,loadingKey:"toolbox.map.load"});s.value=Object.entries(e||{}).map(([o,a])=>C({alias:o,file:a?.file||"",description:a?.description||""}))}catch(e){console.error("Failed to load toolbox map:",e),s.value=[]}}function V(){s.value.push(C({alias:"新工具",file:"新文件.txt",description:""}))}function F(e){confirm("确定要删除这个 Toolbox 映射吗?")&&s.value.splice(e,1)}async function $(){try{const e=new Set,o=[];for(const i of s.value){const l=i.alias.trim();l&&(e.has(l)&&o.push(l),e.add(l))}if(o.length>0){c(`存在重复的别名:${o.join(", ")}`,"error");return}const a=s.value.reduce((i,l)=>{const S=l.alias.trim();return S&&(i[S]={file:l.file.trim(),description:l.description||""}),i},{});await p.saveToolboxMap(a,{loadingKey:"toolbox.map.save"}),m.value="Toolbox 映射表已保存!",T.value="success",c("Toolbox 映射表已保存!","success")}catch(e){m.value=`保存失败:${e instanceof Error?e.message:String(e)}`,T.value="error"}}async function U(){const e=prompt("请输入新文件名 (例如:MyTool.txt):");if(e)try{await p.createToolboxFile(e,void 0,{loadingKey:"toolbox.file.create"}),c(`文件 ${e} 已创建!`,"success"),M()}catch(o){c(`创建文件失败:${o instanceof Error?o.message:String(o)}`,"error")}}async function K(e){if(e){b.value=e;try{v.value=await p.getToolboxFile(e,{showLoader:!1,loadingKey:"toolbox.file.load"})}catch(o){c(`加载文件失败:${o instanceof Error?o.message:String(o)}`,"error")}}}async function j(){if(b.value)try{await p.saveToolboxFile(b.value,v.value,{loadingKey:"toolbox.file.save"}),f.value="文件已保存!",g.value="success",c("文件已保存!","success")}catch(e){f.value=`保存失败:${e instanceof Error?e.message:String(e)}`,g.value="error"}}return I(()=>{M()}),(e,o)=>(u(),d("section",z,[o[13]||(o[13]=t("p",{class:"description"}," 维护 toolbox_map.json(alias→file+description),并编辑 TVStxt 下映射文件内容。 ",-1)),N(O,{"left-title":"Toolbox 映射表","right-title":"Toolbox 文件内容","initial-left-width":450,"min-left-width":350,"max-left-width":600},{"left-actions":h(()=>[t("div",{class:"header-actions"},[t("button",{type:"button",onClick:V,class:"btn-primary btn-sm btn-sm-touch","aria-label":"添加新 Toolbox",title:"添加新 Toolbox"},[...o[1]||(o[1]=[t("span",{class:"material-symbols-outlined"},"add",-1),r(" 添加 ",-1)])]),t("button",{type:"button",onClick:U,class:"btn-secondary btn-sm btn-sm-touch","aria-label":"新建 Toolbox 文件",title:"新建 Toolbox 文件"},[...o[2]||(o[2]=[t("span",{class:"material-symbols-outlined"},"create_new_folder",-1),r(" 新建 ",-1)])]),t("button",{type:"button",onClick:$,class:"btn-success btn-sm btn-sm-touch","aria-label":"保存 Toolbox 映射表",title:"保存 Toolbox 映射表"},[...o[3]||(o[3]=[t("span",{class:"material-symbols-outlined"},"save",-1),r(" 保存 ",-1)])])])]),"left-content":h(()=>[t("div",G,[(u(!0),d(L,null,D(s.value,(a,i)=>(u(),d("div",{key:a.localId,class:"toolbox-map-entry card"},[t("div",H,[o[4]||(o[4]=t("label",null,"别名 (Alias):",-1)),x(t("input",{type:"text","onUpdate:modelValue":l=>a.alias=l,placeholder:"例如:my-tool"},null,8,P),[[y,a.alias]])]),t("div",Q,[o[5]||(o[5]=t("label",null,"文件名:",-1)),x(t("input",{type:"text","onUpdate:modelValue":l=>a.file=l,placeholder:"例如:MyTool.txt"},null,8,q),[[y,a.file]])]),t("div",J,[o[6]||(o[6]=t("label",null,"描述:",-1)),x(t("input",{type:"text","onUpdate:modelValue":l=>a.description=l,placeholder:"工具描述…"},null,8,R),[[y,a.description]])]),t("div",W,[t("button",{onClick:l=>K(a.file),class:"btn-secondary btn-sm btn-sm-touch"},[...o[7]||(o[7]=[t("span",{class:"material-symbols-outlined"},"edit",-1),r(" 编辑 ",-1)])],8,X),t("button",{onClick:l=>F(i),class:"btn-danger btn-sm btn-sm-touch"},[...o[8]||(o[8]=[t("span",{class:"material-symbols-outlined"},"delete",-1),r(" 删除 ",-1)])],8,Y)])]))),128)),s.value.length===0?(u(),d("div",Z,[o[9]||(o[9]=t("span",{class:"material-symbols-outlined"},"inventory_2",-1)),o[10]||(o[10]=t("p",null,"暂无 Toolbox 映射",-1)),t("button",{onClick:V,class:"btn-primary"},"添加第一个 Toolbox")])):w("",!0)])]),"right-content":h(()=>[t("div",oo,[t("div",to,[t("span",eo,[o[11]||(o[11]=t("span",{class:"material-symbols-outlined"},"description",-1)),r(" "+_(b.value||"未选择文件"),1)])]),x(t("textarea",{"onUpdate:modelValue":o[0]||(o[0]=a=>v.value=a),spellcheck:"false",rows:"20",placeholder:"从左侧选择一个 Toolbox 以编辑其关联文件…",class:"file-content-editor"},null,512),[[y,v.value]]),t("div",lo,[t("button",{onClick:j,disabled:!b.value,class:"btn-success"},[...o[12]||(o[12]=[t("span",{class:"material-symbols-outlined"},"save",-1),r(" 保存文件 ",-1)])],8,ao),f.value?(u(),d("span",{key:0,class:E(["status-message",g.value])},_(f.value),3)):w("",!0)])])]),_:1}),m.value?(u(),d("span",{key:0,class:E(["status-message","floating-status",T.value])},_(m.value),3)):w("",!0)]))}}),bo=A(so,[["__scopeId","data-v-cc50c725"]]);export{bo as default}; diff --git a/AdminPanel-Vue/dist/assets/js/TvsFilesEditor-Da-XqgMP.js b/AdminPanel-Vue/dist/assets/js/TvsFilesEditor-C5aiCR9A.js similarity index 97% rename from AdminPanel-Vue/dist/assets/js/TvsFilesEditor-Da-XqgMP.js rename to AdminPanel-Vue/dist/assets/js/TvsFilesEditor-C5aiCR9A.js index 30a60df2f..c43de85d8 100644 --- a/AdminPanel-Vue/dist/assets/js/TvsFilesEditor-Da-XqgMP.js +++ b/AdminPanel-Vue/dist/assets/js/TvsFilesEditor-C5aiCR9A.js @@ -1 +1 @@ -import{D as b,Dt as _,N as k,O as C,Q as i,U as y,V as T,a as w,d as V,f as o,j as n,l as a,n as D,v as L,wt as S}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as U,s as x}from"./dashboard-card-news-BnyB_dHU.js";import{G as p,g as m}from"./dashboard-card-calendar-CA3-tSpi.js";var B={class:"config-section active-section"},M={key:0,class:"tvs-empty-guide"},K={class:"tvs-editor-controls"},N=["value"],$=["disabled"],A={key:0,class:"tvs-file-hint"},j=L({__name:"TvsFilesEditor",setup(z){const c=i([]),t=i(""),l=i(""),v=i(""),u=i(!1),d=i(""),f=i("info");T(l,e=>{u.value=e!==v.value});function g(e){u.value&&(e.preventDefault(),e.returnValue="")}async function h(){try{c.value=await m.getTvsFiles({showLoader:!1,loadingKey:"tvs-files.list.load"})}catch(e){p(`加载文件列表失败:${e instanceof Error?e.message:String(e)}`,"error")}}async function E(){if(!(u.value&&!confirm("有未保存的更改,确定要切换文件吗?"))){if(!t.value){l.value="",v.value="",u.value=!1;return}try{l.value=await m.getTvsFileContent(t.value,{showLoader:!1,loadingKey:"tvs-files.content.load"}),v.value=l.value,u.value=!1}catch(e){p(`加载文件失败:${e instanceof Error?e.message:String(e)}`,"error")}}}async function F(){if(t.value)try{await m.saveTvsFile(t.value,l.value,{loadingKey:"tvs-files.content.save"}),v.value=l.value,u.value=!1,d.value="文件已保存!",f.value="success",p("文件已保存!","success")}catch(e){d.value=`保存失败:${e instanceof Error?e.message:String(e)}`,f.value="error"}}return C(()=>{h(),window.addEventListener("beforeunload",g)}),b(()=>{window.removeEventListener("beforeunload",g)}),(e,s)=>(n(),o("section",B,[c.value.length===0?(n(),o("div",M,[...s[2]||(s[2]=[a("span",{class:"material-symbols-outlined"},"edit_note",-1),a("h3",null,"暂无变量文件",-1),a("p",null,"TVS 文件用于存储系统自定义变量,每行一个 KEY=VALUE 对。",-1)])])):(n(),o(w,{key:1},[a("div",K,[s[4]||(s[4]=a("label",{for:"tvs-file-select"},"选择变量文件:",-1)),y(a("select",{id:"tvs-file-select","onUpdate:modelValue":s[0]||(s[0]=r=>t.value=r),onChange:E},[s[3]||(s[3]=a("option",{value:""},"请选择一个文件…",-1)),(n(!0),o(w,null,k(c.value,r=>(n(),o("option",{key:r,value:r},_(r),9,N))),128))],544),[[x,t.value]]),a("button",{onClick:F,disabled:!t.value,class:"btn-success"},"保存变量文件",8,$),d.value?(n(),o("span",{key:0,class:S(["status-message",f.value])},_(d.value),3)):V("",!0)]),t.value?y((n(),o("textarea",{key:1,id:"tvs-file-content-editor","onUpdate:modelValue":s[1]||(s[1]=r=>l.value=r),spellcheck:"false",placeholder:"选择一个变量文件以编辑其内容…",rows:"25"},null,512)),[[U,l.value]]):(n(),o("div",A,[...s[5]||(s[5]=[a("span",{class:"material-symbols-outlined"},"arrow_upward",-1),a("p",null,"从上方下拉菜单选择一个变量文件开始编辑。",-1)])]))],64))]))}}),Q=D(j,[["__scopeId","data-v-86c82dcb"]]);export{Q as default}; +import{D as b,Dt as _,N as k,O as C,Q as i,U as y,V as T,a as w,d as V,f as o,j as n,l as a,n as D,v as L,wt as S}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{c as U,s as x}from"./dashboard-card-news-BnyB_dHU.js";import{G as p,g as m}from"./dashboard-card-calendar-DWuV34Bn.js";var B={class:"config-section active-section"},M={key:0,class:"tvs-empty-guide"},K={class:"tvs-editor-controls"},N=["value"],$=["disabled"],A={key:0,class:"tvs-file-hint"},j=L({__name:"TvsFilesEditor",setup(z){const c=i([]),t=i(""),l=i(""),v=i(""),u=i(!1),d=i(""),f=i("info");T(l,e=>{u.value=e!==v.value});function g(e){u.value&&(e.preventDefault(),e.returnValue="")}async function h(){try{c.value=await m.getTvsFiles({showLoader:!1,loadingKey:"tvs-files.list.load"})}catch(e){p(`加载文件列表失败:${e instanceof Error?e.message:String(e)}`,"error")}}async function E(){if(!(u.value&&!confirm("有未保存的更改,确定要切换文件吗?"))){if(!t.value){l.value="",v.value="",u.value=!1;return}try{l.value=await m.getTvsFileContent(t.value,{showLoader:!1,loadingKey:"tvs-files.content.load"}),v.value=l.value,u.value=!1}catch(e){p(`加载文件失败:${e instanceof Error?e.message:String(e)}`,"error")}}}async function F(){if(t.value)try{await m.saveTvsFile(t.value,l.value,{loadingKey:"tvs-files.content.save"}),v.value=l.value,u.value=!1,d.value="文件已保存!",f.value="success",p("文件已保存!","success")}catch(e){d.value=`保存失败:${e instanceof Error?e.message:String(e)}`,f.value="error"}}return C(()=>{h(),window.addEventListener("beforeunload",g)}),b(()=>{window.removeEventListener("beforeunload",g)}),(e,s)=>(n(),o("section",B,[c.value.length===0?(n(),o("div",M,[...s[2]||(s[2]=[a("span",{class:"material-symbols-outlined"},"edit_note",-1),a("h3",null,"暂无变量文件",-1),a("p",null,"TVS 文件用于存储系统自定义变量,每行一个 KEY=VALUE 对。",-1)])])):(n(),o(w,{key:1},[a("div",K,[s[4]||(s[4]=a("label",{for:"tvs-file-select"},"选择变量文件:",-1)),y(a("select",{id:"tvs-file-select","onUpdate:modelValue":s[0]||(s[0]=r=>t.value=r),onChange:E},[s[3]||(s[3]=a("option",{value:""},"请选择一个文件…",-1)),(n(!0),o(w,null,k(c.value,r=>(n(),o("option",{key:r,value:r},_(r),9,N))),128))],544),[[x,t.value]]),a("button",{onClick:F,disabled:!t.value,class:"btn-success"},"保存变量文件",8,$),d.value?(n(),o("span",{key:0,class:S(["status-message",f.value])},_(d.value),3)):V("",!0)]),t.value?y((n(),o("textarea",{key:1,id:"tvs-file-content-editor","onUpdate:modelValue":s[1]||(s[1]=r=>l.value=r),spellcheck:"false",placeholder:"选择一个变量文件以编辑其内容…",rows:"25"},null,512)),[[U,l.value]]):(n(),o("div",A,[...s[5]||(s[5]=[a("span",{class:"material-symbols-outlined"},"arrow_upward",-1),a("p",null,"从上方下拉菜单选择一个变量文件开始编辑。",-1)])]))],64))]))}}),Q=D(j,[["__scopeId","data-v-86c82dcb"]]);export{Q as default}; diff --git a/AdminPanel-Vue/dist/assets/js/VcpForum-CELoVyoe.js b/AdminPanel-Vue/dist/assets/js/VcpForum-Id9m3gbZ.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/VcpForum-CELoVyoe.js rename to AdminPanel-Vue/dist/assets/js/VcpForum-Id9m3gbZ.js index 3a1320c9b..8c02ed399 100644 --- a/AdminPanel-Vue/dist/assets/js/VcpForum-CELoVyoe.js +++ b/AdminPanel-Vue/dist/assets/js/VcpForum-Id9m3gbZ.js @@ -1,4 +1,4 @@ -import{Dt as d,N as z,O as re,Q as f,a as K,at as l,d as g,f as m,g as oe,h as C,j as c,l as e,n as B,u as Y,v as L,wt as ne}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{G as y,f as w,s as U}from"./dashboard-card-calendar-CA3-tSpi.js";import{t as le}from"./usePagination-OVhnKIrl.js";import{t as ie}from"./useDebounceFn-X8Lyvegv.js";import{t as ue}from"./useMarkdownRenderer-BShYGq9a.js";var de="[置顶]",ce=` +import{Dt as d,N as z,O as re,Q as f,a as K,at as l,d as g,f as m,g as oe,h as C,j as c,l as e,n as B,u as Y,v as L,wt as ne}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{G as y,f as w,s as U}from"./dashboard-card-calendar-DWuV34Bn.js";import{t as le}from"./usePagination-OVhnKIrl.js";import{t as ie}from"./useDebounceFn-X8Lyvegv.js";import{t as ue}from"./useMarkdownRenderer-DLeytw2l.js";var de="[置顶]",ce=` --- diff --git a/AdminPanel-Vue/dist/assets/js/VcptavernEditor-usw-fRYN.js b/AdminPanel-Vue/dist/assets/js/VcptavernEditor-B0yp57rL.js similarity index 98% rename from AdminPanel-Vue/dist/assets/js/VcptavernEditor-usw-fRYN.js rename to AdminPanel-Vue/dist/assets/js/VcptavernEditor-B0yp57rL.js index 70e91dbc0..ed01d7de7 100644 --- a/AdminPanel-Vue/dist/assets/js/VcptavernEditor-usw-fRYN.js +++ b/AdminPanel-Vue/dist/assets/js/VcptavernEditor-B0yp57rL.js @@ -1 +1 @@ -import{Dt as M,H as le,N as Q,O as de,Q as f,U as m,X as ie,a as Z,at as o,c as ue,d as k,f as v,g as ve,j as p,l as e,n as pe,q as ce,v as me,wt as ge}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as fe,c as x,r as be,s as S}from"./dashboard-card-news-BnyB_dHU.js";import{G as _,P as ye,p as T}from"./dashboard-card-calendar-CA3-tSpi.js";import{n as _e,t as he}from"./pointerReorder-DgfeRZqx.js";import{t as Pe}from"./usePointerDragSession-B6CxeZBm.js";var z=ye("VcptavernEditor");function we(){const B=f([]),w=f(""),u=f(!1),b=f(!1),h=f(!1),V=f(!1),g=f(null),c=f(null),y=f(null),E=f("after"),d=ie({name:"",description:"",rules:[]}),P={get draggingRuleId(){return c.value},get dragOverRuleId(){return y.value},get dropPlacement(){return E.value}},R=ue(()=>{if(!g.value)return d.rules;const s=new Map(d.rules.map(a=>[a.id,a]));return g.value.map(a=>s.get(a)).filter(a=>a!==void 0)});function N(){return d.rules.map(s=>s.id)}function O(){return g.value??N()}function $(s){const a=new Map(d.rules.map(n=>[n.id,n]));d.rules=s.map(n=>a.get(n)).filter(n=>n!==void 0)}function H(s,a){const n=c.value;if(!n||typeof document>"u")return;const i=document.elementFromPoint(s,a);if(!(i instanceof Element)){y.value=null;return}const C=O(),A=i.closest("[data-rule-id]"),se=i.closest('[data-rules-list="true"]');let I=null,L="after";if(A?(I=A.dataset.ruleId??null,L=he(A,a)):se&&C.length>0&&(I=C[C.length-1]??null,L="after"),!I){y.value=null;return}const j=_e(C,n,I,L),q=j.some((oe,ne)=>oe!==C[ne]);y.value=q?I:null,E.value=L,q&&(g.value=j)}function D(){return{id:`rule-${Date.now()}-${Math.random().toString(16).slice(2)}`,name:"新规则",enabled:!0,type:"relative",position:"before",target:"system",depth:1,content:{role:"system",content:""},ui:{textareaWidth:"",textareaHeight:""}}}function U(s){const a=D();return{...a,...s,id:s.id||a.id,content:{role:s.content?.role||a.content.role,content:s.content?.content||""}}}const{dragGhost:G,dragGhostElement:F,startPointerDrag:t,handlePointerMove:r,handlePointerUp:K}=Pe({createGhost:({ruleId:s})=>{const a=d.rules.find(n=>n.id===s)??null;return a?{label:a.name||"未命名规则",meta:a.type}:null},onActivate:({item:s})=>{c.value=s.ruleId,g.value=N()},onFrame:s=>{H(s.currentX,s.currentY)},onCommit:()=>{g.value&&$(g.value)},onClear:()=>{g.value=null,c.value=null,y.value=null,E.value="after"}});async function l(){u.value=!0;try{B.value=await T.getPresets({showLoader:!1,loadingKey:"vcptavern.presets.load"})}catch(s){const a=s instanceof Error?s.message:String(s);z.error("获取预设列表失败:",s),_(`获取预设列表失败:${a}`,"error")}finally{u.value=!1}}async function W(s){if(s){u.value=!0;try{const a=await T.getPreset(s,{showLoader:!1,loadingKey:"vcptavern.preset.load"});d.name=s,d.description=a.description||"",d.rules=(a.rules||[]).map(n=>U(n)),h.value=!0,V.value=!1,_(`已加载预设:${s}`,"success")}catch(a){const n=a instanceof Error?a.message:String(a);z.error("加载预设失败:",a),_(`加载预设失败:${n}`,"error")}finally{u.value=!1}}}function X(){w.value="",d.name="",d.description="",d.rules=[],h.value=!0,V.value=!0}function J(){d.rules.push(D())}function Y(s){const a=R.value[s];if(!a)return;const n=d.rules.findIndex(i=>i.id===a.id);n>=0&&d.rules.splice(n,1)}function ee(s,a){const n=a.currentTarget;if(!(n instanceof HTMLElement))return;const i=n.closest("[data-rule-id]");i instanceof HTMLElement&&t({item:{ruleId:s},event:a,itemElement:i,captureElement:n})}async function te(){const s=w.value;if(s&&confirm(`确定要删除预设 "${s}" 吗?此操作不可撤销。`)){u.value=!0;try{await T.deletePreset(s,{loadingKey:"vcptavern.preset.delete"}),_("预设删除成功","success"),X(),h.value=!1,await l()}catch(a){const n=a instanceof Error?a.message:String(a);z.error("删除预设失败:",a),_(`删除预设失败:${n}`,"error")}finally{u.value=!1}}}function re(s){return/^[a-zA-Z0-9_-]+$/.test(s)}async function ae(){const s=d.name.trim();if(!s){_("请输入预设名称","error");return}if(!re(s)){_("预设名称只能包含字母、数字、下划线和连字符","error");return}b.value=!0;try{const a={description:d.description.trim(),rules:d.rules.map(n=>{const i=U(n);return i.type!=="depth"&&delete i.depth,i.type==="depth"&&(delete i.position,delete i.target),i.type==="embed"&&(i.content.role="system"),i})};await T.savePreset(s,a,{loadingKey:"vcptavern.preset.save"}),_("预设保存成功","success"),w.value=s,V.value=!1,await l(),await W(s)}catch(a){const n=a instanceof Error?a.message:String(a);z.error("保存预设失败:",a),_(`保存预设失败:${n}`,"error")}finally{b.value=!1}}return de(async()=>{await l()}),{presetNames:B,selectedPresetName:w,isLoading:u,isSaving:b,isEditorVisible:h,isNewPreset:V,dragState:P,dragGhost:G,dragGhostElement:F,handlePointerMove:r,handlePointerUp:K,orderedRules:R,editorState:d,fetchPresets:l,loadPreset:W,createNewPreset:X,addRule:J,removeRule:Y,handleRulePointerDown:ee,deletePreset:te,savePreset:ae}}var Ve={class:"config-section active-section vcp-tavern-page"},ke={class:"page-header"},Ee={class:"header-actions"},Re=["disabled"],Ue={class:"preset-toolbar card"},Ce=["disabled"],Ie=["value"],Me=["disabled"],xe=["disabled"],Se=["disabled"],Ne={key:0,class:"empty-tip card"},Oe={key:1,class:"editor card"},$e={class:"meta-grid"},De={class:"form-group"},Ge=["disabled"],Le={class:"form-group full-width"},Te={class:"rules-header"},ze={key:0,class:"empty-rules"},Be=["data-rule-id"],He={class:"rule-head"},Ke=["onPointerdown"],Ae=["onUpdate:modelValue"],Fe={class:"enabled-switch"},We=["onUpdate:modelValue"],Xe=["onClick"],je={class:"rule-body"},qe={class:"form-group"},Qe=["onUpdate:modelValue"],Ze={key:0,class:"form-group"},Je=["onUpdate:modelValue"],Ye={key:1,class:"form-group"},et=["onUpdate:modelValue"],tt={key:2,class:"form-group"},rt=["onUpdate:modelValue"],at={key:3,class:"form-group"},st=["onUpdate:modelValue"],ot={class:"form-group full-width"},nt=["onUpdate:modelValue"],lt={class:"editor-actions"},dt=["disabled"],it={class:"rule-drag-ghost-shell"},ut={class:"rule-drag-ghost-title"},vt={class:"rule-drag-ghost-meta"},pt=me({__name:"VcptavernEditor",setup(B){const{presetNames:w,selectedPresetName:u,isLoading:b,isSaving:h,isEditorVisible:V,isNewPreset:g,dragState:c,dragGhost:y,dragGhostElement:E,orderedRules:d,editorState:P,fetchPresets:R,loadPreset:N,createNewPreset:O,addRule:$,removeRule:H,handleRulePointerDown:D,deletePreset:U,savePreset:G}=we();return(F,t)=>(p(),v("section",Ve,[e("div",ke,[t[9]||(t[9]=e("div",null,[e("p",{class:"description"}," 管理上下文注入预设与规则。按住规则左侧手柄可像仪表盘一样实时预览排序位置, 并在释放时提交最终顺序。 ")],-1)),e("div",Ee,[e("button",{class:"btn-secondary",type:"button",disabled:o(b),onClick:t[0]||(t[0]=(...r)=>o(R)&&o(R)(...r))}," 刷新 ",8,Re)])]),e("div",Ue,[t[11]||(t[11]=e("label",{for:"preset-select"},"选择预设",-1)),m(e("select",{id:"preset-select","onUpdate:modelValue":t[1]||(t[1]=r=>ce(u)?u.value=r:null),disabled:o(b)},[t[10]||(t[10]=e("option",{value:""},"-- 选择一个预设 --",-1)),(p(!0),v(Z,null,Q(o(w),r=>(p(),v("option",{key:r,value:r},M(r),9,Ie))),128))],8,Ce),[[S,o(u)]]),e("button",{class:"btn-primary",type:"button",disabled:!o(u)||o(b),onClick:t[2]||(t[2]=r=>o(N)(o(u)))}," 加载 ",8,Me),e("button",{class:"btn-secondary",type:"button",disabled:o(b),onClick:t[3]||(t[3]=(...r)=>o(O)&&o(O)(...r))}," 新建 ",8,xe),e("button",{class:"btn-danger",type:"button",disabled:!o(u)||o(b),onClick:t[4]||(t[4]=(...r)=>o(U)&&o(U)(...r))}," 删除 ",8,Se)]),o(V)?(p(),v("div",Oe,[e("div",$e,[e("div",De,[t[13]||(t[13]=e("label",{for:"preset-name"},"预设名称",-1)),m(e("input",{id:"preset-name","onUpdate:modelValue":t[5]||(t[5]=r=>o(P).name=r),type:"text",placeholder:"仅限字母、数字、下划线和连字符",disabled:!o(g)},null,8,Ge),[[x,o(P).name,void 0,{trim:!0}]])]),e("div",Le,[t[14]||(t[14]=e("label",{for:"preset-description"},"预设描述",-1)),m(e("textarea",{id:"preset-description","onUpdate:modelValue":t[6]||(t[6]=r=>o(P).description=r),rows:"3",placeholder:"描述预设用途"},null,512),[[x,o(P).description]])])]),e("div",Te,[t[15]||(t[15]=e("h3",null,"注入规则",-1)),e("button",{class:"btn-secondary",type:"button",onClick:t[7]||(t[7]=(...r)=>o($)&&o($)(...r))}," 添加规则 ")]),o(P).rules.length===0?(p(),v("div",ze," 暂无规则,点击“添加规则”创建。 ")):k("",!0),ve(be,{tag:"div",name:"drag-sort",class:"rules-list","data-rules-list":"true"},{default:le(()=>[(p(!0),v(Z,null,Q(o(d),(r,K)=>(p(),v("article",{key:r.id,"data-rule-id":r.id,class:ge(["rule-card",{"rule-card--dragging":o(c).draggingRuleId===r.id,"rule-card--drop-before":o(c).draggingRuleId!==null&&o(c).dragOverRuleId===r.id&&o(c).dropPlacement==="before","rule-card--drop-after":o(c).draggingRuleId!==null&&o(c).dragOverRuleId===r.id&&o(c).dropPlacement==="after"}])},[e("div",He,[e("button",{class:"drag-handle",type:"button","aria-label":"拖动排序",title:"拖动排序",onPointerdown:l=>o(D)(r.id,l)}," ⋮⋮ ",40,Ke),m(e("input",{"onUpdate:modelValue":l=>r.name=l,class:"rule-title",type:"text",placeholder:"规则名称"},null,8,Ae),[[x,r.name]]),e("label",Fe,[m(e("input",{"onUpdate:modelValue":l=>r.enabled=l,type:"checkbox"},null,8,We),[[fe,r.enabled]]),e("span",null,M(r.enabled?"启用":"停用"),1)]),e("button",{class:"btn-danger btn-sm",type:"button",onClick:l=>o(H)(K)}," 删除 ",8,Xe)]),e("div",je,[e("div",qe,[t[17]||(t[17]=e("label",null,"注入类型",-1)),m(e("select",{"onUpdate:modelValue":l=>r.type=l},[...t[16]||(t[16]=[e("option",{value:"relative"},"相对注入",-1),e("option",{value:"depth"},"深度注入",-1),e("option",{value:"embed"},"嵌入",-1)])],8,Qe),[[S,r.type]])]),r.type==="relative"||r.type==="embed"?(p(),v("div",Ze,[t[19]||(t[19]=e("label",null,"相对位置",-1)),m(e("select",{"onUpdate:modelValue":l=>r.position=l},[...t[18]||(t[18]=[e("option",{value:"before"},"之前",-1),e("option",{value:"after"},"之后",-1)])],8,Je),[[S,r.position]])])):k("",!0),r.type==="relative"||r.type==="embed"?(p(),v("div",Ye,[t[21]||(t[21]=e("label",null,"目标",-1)),m(e("select",{"onUpdate:modelValue":l=>r.target=l},[...t[20]||(t[20]=[e("option",{value:"system"},"系统提示",-1),e("option",{value:"last_user"},"最后的用户消息",-1)])],8,et),[[S,r.target]])])):k("",!0),r.type==="depth"?(p(),v("div",tt,[t[22]||(t[22]=e("label",null,"深度",-1)),m(e("input",{"onUpdate:modelValue":l=>r.depth=l,type:"number",min:"1"},null,8,rt),[[x,r.depth,void 0,{number:!0}]])])):k("",!0),r.type!=="embed"?(p(),v("div",at,[t[24]||(t[24]=e("label",null,"注入角色",-1)),m(e("select",{"onUpdate:modelValue":l=>r.content.role=l},[...t[23]||(t[23]=[e("option",{value:"system"},"system",-1),e("option",{value:"user"},"user",-1),e("option",{value:"assistant"},"assistant",-1)])],8,st),[[S,r.content.role]])])):k("",!0),e("div",ot,[t[25]||(t[25]=e("label",null,"注入内容",-1)),m(e("textarea",{"onUpdate:modelValue":l=>r.content.content=l,rows:"5",placeholder:"请输入要注入的文本"},null,8,nt),[[x,r.content.content]])])])],10,Be))),128))]),_:1}),e("div",lt,[e("button",{class:"btn-success",type:"button",disabled:o(h),onClick:t[8]||(t[8]=(...r)=>o(G)&&o(G)(...r))},M(o(h)?"保存中…":"保存预设"),9,dt)])])):(p(),v("div",Ne,[...t[12]||(t[12]=[e("p",null,"请选择一个预设进行编辑,或点击“新建”创建预设。",-1)])])),o(y)?(p(),v("div",{key:2,ref_key:"dragGhostElement",ref:E,class:"rule-drag-ghost"},[e("div",it,[e("div",ut,M(o(y).label),1),e("div",vt,M(o(y).meta),1)])],512)):k("",!0)]))}}),yt=pe(pt,[["__scopeId","data-v-b35274ed"]]);export{yt as default}; +import{Dt as M,H as le,N as Q,O as de,Q as f,U as m,X as ie,a as Z,at as o,c as ue,d as k,f as v,g as ve,j as p,l as e,n as pe,q as ce,v as me,wt as ge}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{a as fe,c as x,r as be,s as S}from"./dashboard-card-news-BnyB_dHU.js";import{G as _,P as ye,p as T}from"./dashboard-card-calendar-DWuV34Bn.js";import{n as _e,t as he}from"./pointerReorder-DgfeRZqx.js";import{t as Pe}from"./usePointerDragSession-B6CxeZBm.js";var z=ye("VcptavernEditor");function we(){const B=f([]),w=f(""),u=f(!1),b=f(!1),h=f(!1),V=f(!1),g=f(null),c=f(null),y=f(null),E=f("after"),d=ie({name:"",description:"",rules:[]}),P={get draggingRuleId(){return c.value},get dragOverRuleId(){return y.value},get dropPlacement(){return E.value}},R=ue(()=>{if(!g.value)return d.rules;const s=new Map(d.rules.map(a=>[a.id,a]));return g.value.map(a=>s.get(a)).filter(a=>a!==void 0)});function N(){return d.rules.map(s=>s.id)}function O(){return g.value??N()}function $(s){const a=new Map(d.rules.map(n=>[n.id,n]));d.rules=s.map(n=>a.get(n)).filter(n=>n!==void 0)}function H(s,a){const n=c.value;if(!n||typeof document>"u")return;const i=document.elementFromPoint(s,a);if(!(i instanceof Element)){y.value=null;return}const C=O(),A=i.closest("[data-rule-id]"),se=i.closest('[data-rules-list="true"]');let I=null,L="after";if(A?(I=A.dataset.ruleId??null,L=he(A,a)):se&&C.length>0&&(I=C[C.length-1]??null,L="after"),!I){y.value=null;return}const j=_e(C,n,I,L),q=j.some((oe,ne)=>oe!==C[ne]);y.value=q?I:null,E.value=L,q&&(g.value=j)}function D(){return{id:`rule-${Date.now()}-${Math.random().toString(16).slice(2)}`,name:"新规则",enabled:!0,type:"relative",position:"before",target:"system",depth:1,content:{role:"system",content:""},ui:{textareaWidth:"",textareaHeight:""}}}function U(s){const a=D();return{...a,...s,id:s.id||a.id,content:{role:s.content?.role||a.content.role,content:s.content?.content||""}}}const{dragGhost:G,dragGhostElement:F,startPointerDrag:t,handlePointerMove:r,handlePointerUp:K}=Pe({createGhost:({ruleId:s})=>{const a=d.rules.find(n=>n.id===s)??null;return a?{label:a.name||"未命名规则",meta:a.type}:null},onActivate:({item:s})=>{c.value=s.ruleId,g.value=N()},onFrame:s=>{H(s.currentX,s.currentY)},onCommit:()=>{g.value&&$(g.value)},onClear:()=>{g.value=null,c.value=null,y.value=null,E.value="after"}});async function l(){u.value=!0;try{B.value=await T.getPresets({showLoader:!1,loadingKey:"vcptavern.presets.load"})}catch(s){const a=s instanceof Error?s.message:String(s);z.error("获取预设列表失败:",s),_(`获取预设列表失败:${a}`,"error")}finally{u.value=!1}}async function W(s){if(s){u.value=!0;try{const a=await T.getPreset(s,{showLoader:!1,loadingKey:"vcptavern.preset.load"});d.name=s,d.description=a.description||"",d.rules=(a.rules||[]).map(n=>U(n)),h.value=!0,V.value=!1,_(`已加载预设:${s}`,"success")}catch(a){const n=a instanceof Error?a.message:String(a);z.error("加载预设失败:",a),_(`加载预设失败:${n}`,"error")}finally{u.value=!1}}}function X(){w.value="",d.name="",d.description="",d.rules=[],h.value=!0,V.value=!0}function J(){d.rules.push(D())}function Y(s){const a=R.value[s];if(!a)return;const n=d.rules.findIndex(i=>i.id===a.id);n>=0&&d.rules.splice(n,1)}function ee(s,a){const n=a.currentTarget;if(!(n instanceof HTMLElement))return;const i=n.closest("[data-rule-id]");i instanceof HTMLElement&&t({item:{ruleId:s},event:a,itemElement:i,captureElement:n})}async function te(){const s=w.value;if(s&&confirm(`确定要删除预设 "${s}" 吗?此操作不可撤销。`)){u.value=!0;try{await T.deletePreset(s,{loadingKey:"vcptavern.preset.delete"}),_("预设删除成功","success"),X(),h.value=!1,await l()}catch(a){const n=a instanceof Error?a.message:String(a);z.error("删除预设失败:",a),_(`删除预设失败:${n}`,"error")}finally{u.value=!1}}}function re(s){return/^[a-zA-Z0-9_-]+$/.test(s)}async function ae(){const s=d.name.trim();if(!s){_("请输入预设名称","error");return}if(!re(s)){_("预设名称只能包含字母、数字、下划线和连字符","error");return}b.value=!0;try{const a={description:d.description.trim(),rules:d.rules.map(n=>{const i=U(n);return i.type!=="depth"&&delete i.depth,i.type==="depth"&&(delete i.position,delete i.target),i.type==="embed"&&(i.content.role="system"),i})};await T.savePreset(s,a,{loadingKey:"vcptavern.preset.save"}),_("预设保存成功","success"),w.value=s,V.value=!1,await l(),await W(s)}catch(a){const n=a instanceof Error?a.message:String(a);z.error("保存预设失败:",a),_(`保存预设失败:${n}`,"error")}finally{b.value=!1}}return de(async()=>{await l()}),{presetNames:B,selectedPresetName:w,isLoading:u,isSaving:b,isEditorVisible:h,isNewPreset:V,dragState:P,dragGhost:G,dragGhostElement:F,handlePointerMove:r,handlePointerUp:K,orderedRules:R,editorState:d,fetchPresets:l,loadPreset:W,createNewPreset:X,addRule:J,removeRule:Y,handleRulePointerDown:ee,deletePreset:te,savePreset:ae}}var Ve={class:"config-section active-section vcp-tavern-page"},ke={class:"page-header"},Ee={class:"header-actions"},Re=["disabled"],Ue={class:"preset-toolbar card"},Ce=["disabled"],Ie=["value"],Me=["disabled"],xe=["disabled"],Se=["disabled"],Ne={key:0,class:"empty-tip card"},Oe={key:1,class:"editor card"},$e={class:"meta-grid"},De={class:"form-group"},Ge=["disabled"],Le={class:"form-group full-width"},Te={class:"rules-header"},ze={key:0,class:"empty-rules"},Be=["data-rule-id"],He={class:"rule-head"},Ke=["onPointerdown"],Ae=["onUpdate:modelValue"],Fe={class:"enabled-switch"},We=["onUpdate:modelValue"],Xe=["onClick"],je={class:"rule-body"},qe={class:"form-group"},Qe=["onUpdate:modelValue"],Ze={key:0,class:"form-group"},Je=["onUpdate:modelValue"],Ye={key:1,class:"form-group"},et=["onUpdate:modelValue"],tt={key:2,class:"form-group"},rt=["onUpdate:modelValue"],at={key:3,class:"form-group"},st=["onUpdate:modelValue"],ot={class:"form-group full-width"},nt=["onUpdate:modelValue"],lt={class:"editor-actions"},dt=["disabled"],it={class:"rule-drag-ghost-shell"},ut={class:"rule-drag-ghost-title"},vt={class:"rule-drag-ghost-meta"},pt=me({__name:"VcptavernEditor",setup(B){const{presetNames:w,selectedPresetName:u,isLoading:b,isSaving:h,isEditorVisible:V,isNewPreset:g,dragState:c,dragGhost:y,dragGhostElement:E,orderedRules:d,editorState:P,fetchPresets:R,loadPreset:N,createNewPreset:O,addRule:$,removeRule:H,handleRulePointerDown:D,deletePreset:U,savePreset:G}=we();return(F,t)=>(p(),v("section",Ve,[e("div",ke,[t[9]||(t[9]=e("div",null,[e("p",{class:"description"}," 管理上下文注入预设与规则。按住规则左侧手柄可像仪表盘一样实时预览排序位置, 并在释放时提交最终顺序。 ")],-1)),e("div",Ee,[e("button",{class:"btn-secondary",type:"button",disabled:o(b),onClick:t[0]||(t[0]=(...r)=>o(R)&&o(R)(...r))}," 刷新 ",8,Re)])]),e("div",Ue,[t[11]||(t[11]=e("label",{for:"preset-select"},"选择预设",-1)),m(e("select",{id:"preset-select","onUpdate:modelValue":t[1]||(t[1]=r=>ce(u)?u.value=r:null),disabled:o(b)},[t[10]||(t[10]=e("option",{value:""},"-- 选择一个预设 --",-1)),(p(!0),v(Z,null,Q(o(w),r=>(p(),v("option",{key:r,value:r},M(r),9,Ie))),128))],8,Ce),[[S,o(u)]]),e("button",{class:"btn-primary",type:"button",disabled:!o(u)||o(b),onClick:t[2]||(t[2]=r=>o(N)(o(u)))}," 加载 ",8,Me),e("button",{class:"btn-secondary",type:"button",disabled:o(b),onClick:t[3]||(t[3]=(...r)=>o(O)&&o(O)(...r))}," 新建 ",8,xe),e("button",{class:"btn-danger",type:"button",disabled:!o(u)||o(b),onClick:t[4]||(t[4]=(...r)=>o(U)&&o(U)(...r))}," 删除 ",8,Se)]),o(V)?(p(),v("div",Oe,[e("div",$e,[e("div",De,[t[13]||(t[13]=e("label",{for:"preset-name"},"预设名称",-1)),m(e("input",{id:"preset-name","onUpdate:modelValue":t[5]||(t[5]=r=>o(P).name=r),type:"text",placeholder:"仅限字母、数字、下划线和连字符",disabled:!o(g)},null,8,Ge),[[x,o(P).name,void 0,{trim:!0}]])]),e("div",Le,[t[14]||(t[14]=e("label",{for:"preset-description"},"预设描述",-1)),m(e("textarea",{id:"preset-description","onUpdate:modelValue":t[6]||(t[6]=r=>o(P).description=r),rows:"3",placeholder:"描述预设用途"},null,512),[[x,o(P).description]])])]),e("div",Te,[t[15]||(t[15]=e("h3",null,"注入规则",-1)),e("button",{class:"btn-secondary",type:"button",onClick:t[7]||(t[7]=(...r)=>o($)&&o($)(...r))}," 添加规则 ")]),o(P).rules.length===0?(p(),v("div",ze," 暂无规则,点击“添加规则”创建。 ")):k("",!0),ve(be,{tag:"div",name:"drag-sort",class:"rules-list","data-rules-list":"true"},{default:le(()=>[(p(!0),v(Z,null,Q(o(d),(r,K)=>(p(),v("article",{key:r.id,"data-rule-id":r.id,class:ge(["rule-card",{"rule-card--dragging":o(c).draggingRuleId===r.id,"rule-card--drop-before":o(c).draggingRuleId!==null&&o(c).dragOverRuleId===r.id&&o(c).dropPlacement==="before","rule-card--drop-after":o(c).draggingRuleId!==null&&o(c).dragOverRuleId===r.id&&o(c).dropPlacement==="after"}])},[e("div",He,[e("button",{class:"drag-handle",type:"button","aria-label":"拖动排序",title:"拖动排序",onPointerdown:l=>o(D)(r.id,l)}," ⋮⋮ ",40,Ke),m(e("input",{"onUpdate:modelValue":l=>r.name=l,class:"rule-title",type:"text",placeholder:"规则名称"},null,8,Ae),[[x,r.name]]),e("label",Fe,[m(e("input",{"onUpdate:modelValue":l=>r.enabled=l,type:"checkbox"},null,8,We),[[fe,r.enabled]]),e("span",null,M(r.enabled?"启用":"停用"),1)]),e("button",{class:"btn-danger btn-sm",type:"button",onClick:l=>o(H)(K)}," 删除 ",8,Xe)]),e("div",je,[e("div",qe,[t[17]||(t[17]=e("label",null,"注入类型",-1)),m(e("select",{"onUpdate:modelValue":l=>r.type=l},[...t[16]||(t[16]=[e("option",{value:"relative"},"相对注入",-1),e("option",{value:"depth"},"深度注入",-1),e("option",{value:"embed"},"嵌入",-1)])],8,Qe),[[S,r.type]])]),r.type==="relative"||r.type==="embed"?(p(),v("div",Ze,[t[19]||(t[19]=e("label",null,"相对位置",-1)),m(e("select",{"onUpdate:modelValue":l=>r.position=l},[...t[18]||(t[18]=[e("option",{value:"before"},"之前",-1),e("option",{value:"after"},"之后",-1)])],8,Je),[[S,r.position]])])):k("",!0),r.type==="relative"||r.type==="embed"?(p(),v("div",Ye,[t[21]||(t[21]=e("label",null,"目标",-1)),m(e("select",{"onUpdate:modelValue":l=>r.target=l},[...t[20]||(t[20]=[e("option",{value:"system"},"系统提示",-1),e("option",{value:"last_user"},"最后的用户消息",-1)])],8,et),[[S,r.target]])])):k("",!0),r.type==="depth"?(p(),v("div",tt,[t[22]||(t[22]=e("label",null,"深度",-1)),m(e("input",{"onUpdate:modelValue":l=>r.depth=l,type:"number",min:"1"},null,8,rt),[[x,r.depth,void 0,{number:!0}]])])):k("",!0),r.type!=="embed"?(p(),v("div",at,[t[24]||(t[24]=e("label",null,"注入角色",-1)),m(e("select",{"onUpdate:modelValue":l=>r.content.role=l},[...t[23]||(t[23]=[e("option",{value:"system"},"system",-1),e("option",{value:"user"},"user",-1),e("option",{value:"assistant"},"assistant",-1)])],8,st),[[S,r.content.role]])])):k("",!0),e("div",ot,[t[25]||(t[25]=e("label",null,"注入内容",-1)),m(e("textarea",{"onUpdate:modelValue":l=>r.content.content=l,rows:"5",placeholder:"请输入要注入的文本"},null,8,nt),[[x,r.content.content]])])])],10,Be))),128))]),_:1}),e("div",lt,[e("button",{class:"btn-success",type:"button",disabled:o(h),onClick:t[8]||(t[8]=(...r)=>o(G)&&o(G)(...r))},M(o(h)?"保存中…":"保存预设"),9,dt)])])):(p(),v("div",Ne,[...t[12]||(t[12]=[e("p",null,"请选择一个预设进行编辑,或点击“新建”创建预设。",-1)])])),o(y)?(p(),v("div",{key:2,ref_key:"dragGhostElement",ref:E,class:"rule-drag-ghost"},[e("div",it,[e("div",ut,M(o(y).label),1),e("div",vt,M(o(y).meta),1)])],512)):k("",!0)]))}}),yt=pe(pt,[["__scopeId","data-v-98bcb6cd"]]);export{yt as default}; diff --git a/AdminPanel-Vue/dist/assets/js/dashboard-card-calendar-CA3-tSpi.js b/AdminPanel-Vue/dist/assets/js/dashboard-card-calendar-CA3-tSpi.js deleted file mode 100644 index abec5481b..000000000 --- a/AdminPanel-Vue/dist/assets/js/dashboard-card-calendar-CA3-tSpi.js +++ /dev/null @@ -1,5 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/Login-DobCpdzn.js","assets/js/dashboard-card-activitychart-CjJ1Boi_.js","assets/js/rolldown-runtime-DmMX61E0.js","assets/css/dashboard-card-activitychart-YGnIvisH.css","assets/js/index-ByuHVUJE.js","assets/js/dashboard-card-news-BnyB_dHU.js","assets/css/dashboard-card-news-Dgf8YUcC.css","assets/js/vue-vendor-BUOVPpjf.js","assets/css/index-B5c5AvQl.css","assets/js/dashboard-components-LHqMn0M5.js","assets/css/dashboard-components-CuENf_SR.css","assets/css/Login-CpAQkj81.css","assets/js/Dashboard-GzJ_ujzh.js","assets/js/usePolling-CJCCePbg.js","assets/js/pointerReorder-DgfeRZqx.js","assets/css/Dashboard-CdcoRcgb.css","assets/js/BaseConfig-yAUSh-rB.js","assets/css/BaseConfig-0PlcRydK.css","assets/js/DailyNotesManager-BDCMz35j.js","assets/js/easymde-BiwpWqxW.js","assets/css/easymde-CuHSnQz_.css","assets/js/useDebounceFn-X8Lyvegv.js","assets/js/useVirtualScroll-DdYyc53Y.js","assets/css/DailyNotesManager-DDfz6gIy.css","assets/js/VcpForum-CELoVyoe.js","assets/js/useMarkdownRenderer-BShYGq9a.js","assets/js/usePagination-OVhnKIrl.js","assets/css/VcpForum-C7GJV0D5.css","assets/js/ForumAssistantConfig-DttN-v9R.js","assets/css/ForumAssistantConfig-Djf1hPr8.css","assets/js/ImageCacheEditor-D04zV43L.js","assets/css/ImageCacheEditor-B2OClZFw.css","assets/js/SemanticGroupsEditor-Cj5p5sWA.js","assets/css/SemanticGroupsEditor-BG4GRIgP.css","assets/js/VcptavernEditor-usw-fRYN.js","assets/js/usePointerDragSession-B6CxeZBm.js","assets/css/VcptavernEditor-owhvFUwg.css","assets/js/SarPromptEditor-D-dh95d_.js","assets/css/SarPromptEditor-C2ZOTWQD.css","assets/js/ScheduleManager-CCU8hQo2.js","assets/css/ScheduleManager-DmMhIa1v.css","assets/js/DreamManager-DzVdkS9U.js","assets/css/DreamManager-D4h6AS01.css","assets/js/ServerLogViewer-BdiikA3l.js","assets/js/markdown-Di1VBEdP.js","assets/css/ServerLogViewer-q73uYUJ4.css","assets/js/AgentFilesEditor-CpGFDjqr.js","assets/js/DualPaneEditor-D9nB9raE.js","assets/css/DualPaneEditor-BzkP9djm.css","assets/css/AgentFilesEditor-BVf2ZuXR.css","assets/js/AgentAssistantConfig-CfMTF1yt.js","assets/css/AgentAssistantConfig-BiFNiaQo.css","assets/js/AgentScores-BXqgHJyV.js","assets/css/AgentScores-B_WvyPqt.css","assets/js/ToolboxManager-QKOmlxwV.js","assets/css/ToolboxManager-CGShgpkK.css","assets/js/TvsFilesEditor-Da-XqgMP.js","assets/css/TvsFilesEditor-BSQejk_P.css","assets/js/ToolListEditor-BGu_g7Pd.js","assets/css/ToolListEditor-BWFw9lGM.css","assets/js/DynamicToolsManager-JKX64yof.js","assets/css/DynamicToolsManager-_CapYPVW.css","assets/js/PreprocessorOrderManager-CHo2dl-z.js","assets/css/PreprocessorOrderManager-DroMueNn.css","assets/js/ToolApprovalManager-CgfmrCDo.js","assets/css/ToolApprovalManager-BzgeP_k2.css","assets/js/ThinkingChainsEditor-BlBsC1Vg.js","assets/css/ThinkingChainsEditor-B9Pf6Zdl.css","assets/js/RagTuning-BuwlhCjW.js","assets/css/RagTuning-CmZW8PX9.css","assets/js/PlaceholderViewer-BYgQEdcR.js","assets/css/PlaceholderViewer-Bdbd_7My.css","assets/js/PluginsHub-ByTGOvuj.js","assets/js/useRecentVisits-ryn7iNG7.js","assets/css/PluginsHub-BHKSL3yg.css","assets/js/PluginConfig-Bv0hgz83.js","assets/css/PluginConfig-CGWZsWiO.css"])))=>i.map(i=>d[i]); -import{n as Lt}from"./rolldown-runtime-DmMX61E0.js";import{C as st,Dt as se,E as Rt,G as Ot,J as ot,K as Ee,N as It,O as Ct,Q as H,S as it,V as Dt,W as ut,X as Ut,Y as Mt,a as Nt,c as we,f as D,j as U,l as L,n as kt,nt as $t,q as W,rt as xt,tt as ct,v as Ft}from"./dashboard-card-activitychart-CjJ1Boi_.js";var Vt=typeof window<"u",be,re=e=>be=e,jt=()=>it()&&st(Se)||be,Se=Symbol();function ye(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var B;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(B||(B={}));var De=typeof window=="object"&&window.window===window?window:typeof self=="object"&&self.self===self?self:typeof global=="object"&&global.global===global?global:typeof globalThis=="object"?globalThis:{HTMLElement:null};function zt(e,{autoBom:t=!1}={}){return t&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob(["\uFEFF",e],{type:e.type}):e}function Pe(e,t,n){const r=new XMLHttpRequest;r.open("GET",e),r.responseType="blob",r.onload=function(){Gt(r.response,t,n)},r.onerror=function(){console.error("could not download file")},r.send()}function lt(e){const t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch{}return t.status>=200&&t.status<=299}function te(e){try{e.dispatchEvent(new MouseEvent("click"))}catch{const n=new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window,detail:0,screenX:80,screenY:20,clientX:80,clientY:20,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null});e.dispatchEvent(n)}}var ne=typeof navigator=="object"?navigator:{userAgent:""},dt=/Macintosh/.test(ne.userAgent)&&/AppleWebKit/.test(ne.userAgent)&&!/Safari/.test(ne.userAgent),Gt=Vt?typeof HTMLAnchorElement<"u"&&"download"in HTMLAnchorElement.prototype&&!dt?qt:"msSaveOrOpenBlob"in ne?Bt:Ht:()=>{};function qt(e,t="download",n){const r=document.createElement("a");r.download=t,r.rel="noopener",typeof e=="string"?(r.href=e,r.origin!==location.origin?lt(r.href)?Pe(e,t,n):(r.target="_blank",te(r)):te(r)):(r.href=URL.createObjectURL(e),setTimeout(function(){URL.revokeObjectURL(r.href)},4e4),setTimeout(function(){te(r)},0))}function Bt(e,t="download",n){if(typeof e=="string")if(lt(e))Pe(e,t,n);else{const r=document.createElement("a");r.href=e,r.target="_blank",setTimeout(function(){te(r)})}else navigator.msSaveOrOpenBlob(zt(e,n),t)}function Ht(e,t,n,r){if(r=r||open("","_blank"),r&&(r.document.title=r.document.body.innerText="downloading..."),typeof e=="string")return Pe(e,t,n);const a=e.type==="application/octet-stream",i=/constructor/i.test(String(De.HTMLElement))||"safari"in De,o=/CriOS\/[\d]+/.test(navigator.userAgent);if((o||a&&i||dt)&&typeof FileReader<"u"){const u=new FileReader;u.onloadend=function(){let c=u.result;if(typeof c!="string")throw r=null,new Error("Wrong reader.result type");c=o?c:c.replace(/^data:[^;]*;/,"data:attachment/file;"),r?r.location.href=c:location.assign(c),r=null},u.readAsDataURL(e)}else{const u=URL.createObjectURL(e);r?r.location.assign(u):location.href=u,r=null,setTimeout(function(){URL.revokeObjectURL(u)},4e4)}}var{assign:xr}=Object;function Fr(){const e=ut(!0),t=e.run(()=>H({}));let n=[],r=[];const a=ot({install(i){re(a),a._a=i,i.provide(Se,a),i.config.globalProperties.$pinia=a,r.forEach(o=>n.push(o)),r=[]},use(i){return this._a?n.push(i):r.push(i),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return a}var mt=()=>{};function Ue(e,t,n,r=mt){e.add(t);const a=()=>{e.delete(t)&&r()};return!n&&Ot()&&Mt(a),a}function M(e,...t){e.forEach(n=>{n(...t)})}var Wt=e=>e(),Me=Symbol(),oe=Symbol();function _e(e,t){e instanceof Map&&t instanceof Map?t.forEach((n,r)=>e.set(r,n)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],a=e[n];ye(a)&&ye(r)&&e.hasOwnProperty(n)&&!W(r)&&!Ee(r)?e[n]=_e(a,r):e[n]=r}return e}var Yt=Symbol();function Kt(e){return!ye(e)||!Object.prototype.hasOwnProperty.call(e,Yt)}var{assign:R}=Object;function Qt(e){return!!(W(e)&&e.effect)}function Xt(e,t,n,r){const{state:a,actions:i,getters:o}=t,u=n.state.value[e];let c;function p(){return u||(n.state.value[e]=a?a():{}),R(xt(n.state.value[e]),i,Object.keys(o||{}).reduce((l,g)=>(l[g]=ot(we(()=>{re(n);const y=n._s.get(e);return o[g].call(y,y)})),l),{}))}return c=ft(e,p,t,n,r,!0),c}function ft(e,t,n={},r,a,i){let o;const u=R({actions:{}},n),c={deep:!0};let p,l,g=new Set,y=new Set,v;const A=r.state.value[e];!i&&!A&&(r.state.value[e]={}),H({});let I;function Ie(f){let d;p=l=!1,typeof f=="function"?(f(r.state.value[e]),d={type:B.patchFunction,storeId:e,events:v}):(_e(r.state.value[e],f),d={type:B.patchObject,payload:f,storeId:e,events:v});const S=I=Symbol();Rt().then(()=>{I===S&&(p=!0)}),l=!0,M(g,d,r.state.value[e])}const wt=i?function(){const{state:d}=n,S=d?d():{};this.$patch(C=>{R(C,S)})}:mt;function bt(){o.stop(),g.clear(),y.clear(),r._s.delete(e)}const Ce=(f,d="")=>{if(Me in f)return f[oe]=d,f;const S=function(){re(r);const C=Array.from(arguments),F=new Set,ae=new Set;function St(T){F.add(T)}function Pt(T){ae.add(T)}M(y,{args:C,name:S[oe],store:b,after:St,onError:Pt});let V;try{V=f.apply(this&&this.$id===e?this:b,C)}catch(T){throw M(ae,T),T}return V instanceof Promise?V.then(T=>(M(F,T),T)).catch(T=>(M(ae,T),Promise.reject(T))):(M(F,V),V)};return S[Me]=!0,S[oe]=d,S},b=Ut({_p:r,$id:e,$onAction:Ue.bind(null,y),$patch:Ie,$reset:wt,$subscribe(f,d={}){const S=Ue(g,f,d.detached,()=>C()),C=o.run(()=>Dt(()=>r.state.value[e],F=>{(d.flush==="sync"?l:p)&&f({storeId:e,type:B.direct,events:v},F)},R({},c,d)));return S},$dispose:bt});r._s.set(e,b);const x=(r._a&&r._a.runWithContext||Wt)(()=>r._e.run(()=>(o=ut()).run(()=>t({action:Ce}))));for(const f in x){const d=x[f];W(d)&&!Qt(d)||Ee(d)?i||(A&&Kt(d)&&(W(d)?d.value=A[f]:_e(d,A[f])),r.state.value[e][f]=d):typeof d=="function"&&(x[f]=Ce(d,f),u.actions[f]=d)}return R(b,x),R(ct(b),x),Object.defineProperty(b,"$state",{get:()=>r.state.value[e],set:f=>{Ie(d=>{R(d,f)})}}),r._p.forEach(f=>{R(b,o.run(()=>f({store:b,app:r._a,pinia:r,options:u})))}),A&&i&&n.hydrate&&n.hydrate(b.$state,A),p=!0,l=!0,b}function Jt(e,t,n){let r;const a=typeof t=="function";r=a?n:t;function i(o,u){const c=it();return o=o||(c?st(Se,null):null),o&&re(o),o=be,o._s.has(e)||(a?ft(e,t,r,o):Xt(e,r,o)),o._s.get(e)}return i.$id=e,i}function Vr(e){const t=ct(e),n={};for(const r in t){const a=t[r];a.effect?n[r]=we({get:()=>e[r],set(i){e[r]=i}}):(W(a)||Ee(a))&&(n[r]=$t(e,r))}return n}var w=class extends Error{status;code;details;constructor(e,t={}){super(e),this.name="HttpError",this.status=t.status,this.code=t.code,this.details=t.details}},Le=class extends w{constructor(e="Unauthorized",t){super(e,{status:401,code:"AUTH_EXPIRED",details:t}),this.name="AuthExpiredError"}};function pt(e){return e instanceof w?e:e instanceof Error?new w(e.message,{details:e}):new w(String(e),{details:e})}var Zt=1e3,gt=null,Ne=0;function jr(e){gt=e??null}function en(e){const t=Date.now();t-Ne{},showMessage:()=>{}},Re=ht;function zr(e){Re=e??ht}function tn(e){Re.showLoading(e)}function nn(e,t="info",n){Re.showMessage(e,t,n)}var ie={showLoading(e){tn(e)},showMessage(e,t="info",n){nn(e,t,n)}},rn="modulepreload",an=function(e){return"/AdminPanel/"+e},ke={},m=function(t,n,r){let a=Promise.resolve();if(n&&n.length>0){let p=function(l){return Promise.all(l.map(g=>Promise.resolve(g).then(y=>({status:"fulfilled",value:y}),y=>({status:"rejected",reason:y}))))};const o=document.getElementsByTagName("link"),u=document.querySelector("meta[property=csp-nonce]"),c=u?.nonce||u?.getAttribute("nonce");a=p(n.map(l=>{if(l=an(l,r),l in ke)return;ke[l]=!0;const g=l.endsWith(".css"),y=g?'[rel="stylesheet"]':"";if(r)for(let A=o.length-1;A>=0;A--){const I=o[A];if(I.href===l&&(!g||I.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${l}"]${y}`))return;const v=document.createElement("link");if(v.rel=g?"stylesheet":rn,g||(v.as="script"),v.crossOrigin="",v.href=l,c&&v.setAttribute("nonce",c),document.head.appendChild(v),g)return new Promise((A,I)=>{v.addEventListener("load",A),v.addEventListener("error",()=>I(new Error(`Unable to preload CSS for ${l}`)))})}))}function i(o){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=o,window.dispatchEvent(u),!u.defaultPrevented)throw o}return a.then(o=>{for(const u of o||[])u.status==="rejected"&&i(u.reason);return t().catch(i)})},sn={core:"———— 核 心 功 能 ————",agent:"———— Agent 相 关 ————",tools:"———— 工 具 相 关 ————",rag:"———— RAG 相 关 ————",plugins:"———— 插 件 中 心 ————",other:"———— 其 他 ————"},Y=[{id:"login",routeName:"Login",path:"/login",title:"登录",icon:"login",requiresAuth:!1,showInSidebar:!1,component:()=>m(()=>import("./Login-DobCpdzn.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))},{id:"dashboard",routeName:"Dashboard",path:"/dashboard",title:"仪表盘",icon:"dashboard",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./Dashboard-GzJ_ujzh.js"),__vite__mapDeps([12,1,2,3,9,5,6,10,13,14,15]))},{id:"base-config",routeName:"BaseConfig",path:"/base-config",title:"全局基础配置",icon:"settings",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./BaseConfig-yAUSh-rB.js"),__vite__mapDeps([16,1,2,3,5,6,17]))},{id:"daily-notes-manager",routeName:"DailyNotesManager",path:"/daily-notes-manager",title:"日记知识库管理",icon:"description",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./DailyNotesManager-BDCMz35j.js"),__vite__mapDeps([18,1,2,3,5,6,19,20,21,22,23]))},{id:"vcp-forum",routeName:"VcpForum",path:"/vcp-forum",title:"VCP 论坛",icon:"forum",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./VcpForum-CELoVyoe.js"),__vite__mapDeps([24,1,2,3,21,25,26,27]))},{id:"forum-assistant-config",routeName:"ForumAssistantConfig",path:"/forum-assistant-config",title:"任务派发中心",icon:"explore",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./ForumAssistantConfig-DttN-v9R.js"),__vite__mapDeps([28,1,2,3,5,6,29]))},{id:"image-cache-editor",routeName:"ImageCacheEditor",path:"/image-cache-editor",title:"多媒体 Base64 编辑器",icon:"photo_library",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./ImageCacheEditor-D04zV43L.js"),__vite__mapDeps([30,1,2,3,5,6,31]))},{id:"semantic-groups-editor",routeName:"SemanticGroupsEditor",path:"/semantic-groups-editor",title:"语义组编辑器",icon:"hub",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./SemanticGroupsEditor-Cj5p5sWA.js"),__vite__mapDeps([32,1,2,3,5,6,33]))},{id:"vcptavern-editor",routeName:"VcptavernEditor",path:"/vcptavern-editor",title:"VCPTavern 预设编辑",icon:"casino",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./VcptavernEditor-usw-fRYN.js"),__vite__mapDeps([34,1,2,3,5,6,35,14,36]))},{id:"sarprompt-editor",routeName:"SarPromptEditor",path:"/sarprompt-editor",title:"多模型提示词管理",icon:"psychology_alt",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./SarPromptEditor-D-dh95d_.js"),__vite__mapDeps([37,1,2,3,5,6,38]))},{id:"schedule-manager",routeName:"ScheduleManager",path:"/schedule-manager",title:"日程管理",icon:"calendar_month",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./ScheduleManager-CCU8hQo2.js"),__vite__mapDeps([39,1,2,3,5,6,40]))},{id:"dream-manager",routeName:"DreamManager",path:"/dream-manager",title:"梦境审批",icon:"nights_stay",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./DreamManager-DzVdkS9U.js"),__vite__mapDeps([41,1,2,3,5,6,25,42]))},{id:"server-log-viewer",routeName:"ServerLogViewer",path:"/server-log-viewer",title:"服务器日志",icon:"terminal",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./ServerLogViewer-BdiikA3l.js"),__vite__mapDeps([43,1,2,3,9,5,6,10,44,13,22,45]))},{id:"agent-files-editor",routeName:"AgentFilesEditor",path:"/agent-files-editor",title:"Agent 管理器",icon:"smart_toy",requiresAuth:!0,navGroup:"agent",showInSidebar:!0,component:()=>m(()=>import("./AgentFilesEditor-CpGFDjqr.js"),__vite__mapDeps([46,1,2,3,5,6,47,48,49]))},{id:"agent-assistant-config",routeName:"AgentAssistantConfig",path:"/agent-assistant-config",title:"Agent 助手配置",icon:"diversity_3",requiresAuth:!0,navGroup:"agent",showInSidebar:!0,component:()=>m(()=>import("./AgentAssistantConfig-CfMTF1yt.js"),__vite__mapDeps([50,1,2,3,5,6,51]))},{id:"agent-scores",routeName:"AgentScores",path:"/agent-scores",title:"Agent 积分排行榜",icon:"leaderboard",requiresAuth:!0,navGroup:"agent",showInSidebar:!0,component:()=>m(()=>import("./AgentScores-BXqgHJyV.js"),__vite__mapDeps([52,1,2,3,26,53]))},{id:"toolbox-manager",routeName:"ToolboxManager",path:"/toolbox-manager",title:"Toolbox 管理器",icon:"inventory_2",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./ToolboxManager-QKOmlxwV.js"),__vite__mapDeps([54,1,2,3,5,6,47,48,55]))},{id:"tvs-files-editor",routeName:"TvsFilesEditor",path:"/tvs-files-editor",title:"高级变量编辑器",icon:"data_object",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./TvsFilesEditor-Da-XqgMP.js"),__vite__mapDeps([56,1,2,3,5,6,57]))},{id:"tool-list-editor",routeName:"ToolListEditor",path:"/tool-list-editor",title:"工具列表配置编辑器",icon:"construction",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./ToolListEditor-BGu_g7Pd.js"),__vite__mapDeps([58,1,2,3,59]))},{id:"dynamic-tools-manager",routeName:"DynamicToolsManager",path:"/dynamic-tools-manager",title:"动态工具清单",icon:"dynamic_feed",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./DynamicToolsManager-JKX64yof.js"),__vite__mapDeps([60,1,2,3,5,6,7,61]))},{id:"preprocessor-order-manager",routeName:"PreprocessorOrderManager",path:"/preprocessor-order-manager",title:"预处理器顺序管理",icon:"sort",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./PreprocessorOrderManager-CHo2dl-z.js"),__vite__mapDeps([62,1,2,3,5,6,35,14,63]))},{id:"tool-approval-manager",routeName:"ToolApprovalManager",path:"/tool-approval-manager",title:"插件调用审核管理",icon:"verified_user",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./ToolApprovalManager-CgfmrCDo.js"),__vite__mapDeps([64,1,2,3,5,6,65]))},{id:"thinking-chains-editor",routeName:"ThinkingChainsEditor",path:"/thinking-chains-editor",title:"思维链编辑器",icon:"psychology",requiresAuth:!0,navGroup:"rag",showInSidebar:!0,component:()=>m(()=>import("./ThinkingChainsEditor-BlBsC1Vg.js"),__vite__mapDeps([66,1,2,3,5,6,35,14,67]))},{id:"rag-tuning",routeName:"RagTuning",path:"/rag-tuning",title:"浪潮 RAG 调参",icon:"tune",requiresAuth:!0,navGroup:"rag",showInSidebar:!0,component:()=>m(()=>import("./RagTuning-BuwlhCjW.js"),__vite__mapDeps([68,1,2,3,5,6,69]))},{id:"placeholder-viewer",routeName:"PlaceholderViewer",path:"/placeholder-viewer",title:"占位符查看器",icon:"view_list",requiresAuth:!0,navGroup:"other",showInSidebar:!0,component:()=>m(()=>import("./PlaceholderViewer-BYgQEdcR.js"),__vite__mapDeps([70,1,2,3,5,6,25,71]))},{id:"plugins",routeName:"PluginsHub",path:"/plugins",title:"插件中心",icon:"extension",requiresAuth:!0,navGroup:"plugins",showInSidebar:!0,component:()=>m(()=>import("./PluginsHub-ByTGOvuj.js"),__vite__mapDeps([72,1,2,3,9,5,6,10,7,73,74]))},{id:"plugin-config",routeName:"PluginConfig",path:"/plugin/:pluginName/config",title:"插件配置",icon:"extension",requiresAuth:!0,showInSidebar:!1,component:()=>m(()=>import("./PluginConfig-Bv0hgz83.js"),__vite__mapDeps([75,1,2,3,9,5,6,10,7,76]))}],Gr="dashboard",$e=new Map(Y.map(e=>[e.id,e])),on=new Set(Y.map(e=>e.id)),un=new Map(Y.map(e=>[e.routeName,e])),cn=new Map(Y.map(e=>[e.path,e]));function yt(e){return $e.get(e)??$e.get("dashboard")}function ln(e){return on.has(e)}function dn(e){if(typeof e=="string")return un.get(e)}function mn(e){return cn.get(e)}function qr(e){return yt(e).path}function fn(e,t=[]){return t.find(n=>n.pluginName===e&&n.label)?.label}function xe(e,t=[],n=[]){return e?t.find(r=>r.manifest.name===e||r.name===e)?.manifest.displayName?.trim()||fn(e,n)||e:"Plugin Config"}function Br(){const e=[];let t;for(const n of Y)!n.showInSidebar||!n.navGroup||(n.navGroup!==t&&(e.push({category:sn[n.navGroup]}),t=n.navGroup),e.push({target:n.id,label:n.title,icon:n.icon}));return e}function Hr(e,t){return t?{name:"PluginConfig",params:{pluginName:t}}:ln(e)?{name:yt(e).routeName}:e.startsWith("/")?{path:e}:{path:`/${e}`}}function Wr(e,t={}){const n=dn(e.name);if(n)return n.routeName==="PluginConfig"?xe(String(e.params.pluginName||""),t.plugins,t.navItems):n.title;if(e.name==="PluginConfig")return xe(String(e.params.pluginName||""),t.plugins,t.navItems);const r=mn(e.path)?.title;if(r)return r;const a=e.path.replace(/^\//,"").split("/")[0]||"dashboard";return t.navItems?.find(i=>i.target===a&&i.label)?.label}var pn=15e3,gn={maxRetries:0,retryDelayMs:600,backoffMultiplier:2};function Fe(e="Request aborted"){return new DOMException(e,"AbortError")}function hn(e,t){if(!t)return e;const n=new URLSearchParams;for(const[a,i]of Object.entries(t))i!==void 0&&n.set(a,String(i));const r=n.toString();return r?e.includes("?")?`${e}&${r}`:`${e}?${r}`:e}function yn(e){if(!e||e<=0)return{signal:void 0,cleanup:()=>{}};const t=new AbortController,n=globalThis.setTimeout(()=>{t.abort()},e);return{signal:t.signal,cleanup:()=>globalThis.clearTimeout(n)}}function _n(e){const t=e.filter(i=>i!==void 0);if(t.length===0)return{signal:void 0,cleanup:()=>{}};const n=new AbortController,r=()=>{n.signal.aborted||n.abort()};for(const i of t)if(i.aborted)return r(),{signal:n.signal,cleanup:()=>{}};const a=t.map(i=>{const o=()=>r();return i.addEventListener("abort",o,{once:!0}),{signal:i,handleAbort:o}});return{signal:n.signal,cleanup:()=>{a.forEach(({signal:i,handleAbort:o})=>{i.removeEventListener("abort",o)})}}}async function vn(e){return(e.headers.get("content-type")||"").includes("application/json")?e.json():e.text()}function An(e){return e===void 0?!0:e>=500}function Tn(e){return e instanceof DOMException&&e.name==="AbortError"||e instanceof Le?!1:e instanceof w?An(e.status):(e instanceof TypeError,!0)}function Ve(e,t){const n=e.trim();return n.length>0?n:t}function En(e,t){if(t&&typeof t=="object"){const n=t,r=typeof n.message=="string"&&n.message||typeof n.error=="string"&&n.error||typeof n.details=="string"&&n.details;if(r)return Ve(r,`HTTP ${e}`)}return typeof t=="string"&&t.trim().length>0?Ve(t,`HTTP ${e}`):`HTTP ${e}`}function wn(e,t){return new Promise((n,r)=>{if(t?.aborted){r(Fe());return}const a=globalThis.setTimeout(()=>{o(),n()},e),i=()=>{globalThis.clearTimeout(a),o(),r(Fe())},o=()=>{t?.removeEventListener("abort",i)};t?.addEventListener("abort",i,{once:!0})})}function bn(){return{async request(e){const t={...gn,...e.retry||{}};let n;const r=t.maxRetries+1;for(let a=1;a<=r;a+=1){const i=yn(e.timeoutMs??pn),o=_n([e.signal,i.signal]);try{const u={...e.body!==void 0?{"Content-Type":"application/json"}:{},...e.headers||{}},c={method:e.method??"GET",headers:u,credentials:e.auth==="none"?"omit":"same-origin",signal:o.signal};e.body!==void 0&&(c.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));const p=await fetch(hn(e.url,e.query),c),l=await vn(p);if(!p.ok)throw p.status===401?(en({source:"httpClient",requestUrl:e.url,error:l}),new Le("Unauthorized",l)):new w(En(p.status,l),{status:p.status,code:"HTTP_ERROR",details:l});return l}catch(u){if(n=u,!(a=je[Rn]}function $(e){const t=`[${e}]`;return{debug:(...n)=>{Q("debug")&&console.log(t,...n)},info:(...n)=>{Q("info")&&console.info(t,...n)},warn:(...n)=>{Q("warn")&&console.warn(t,...n)},error:(...n)=>{Q("error")&&console.error(t,...n)}}}var ue=$("Performance"),On=class{metrics={pageLoadTime:0,domContentLoaded:0,apiRequests:{total:0,success:0,failed:0,avgResponseTime:0},resources:{total:0,cached:0,totalSize:0}};totalApiResponseTime=0;constructor(){typeof window<"u"&&(this.initPageMetrics(),this.initResourceMetrics())}initPageMetrics(){window.addEventListener("load",()=>{const e=performance.getEntriesByType("navigation").find(t=>t instanceof PerformanceNavigationTiming);e&&(this.metrics.pageLoadTime=Math.max(0,e.loadEventEnd-e.startTime),this.metrics.domContentLoaded=Math.max(0,e.domContentLoadedEventEnd-e.startTime)),performance.getEntriesByType("paint").forEach(t=>{t.name==="first-paint"?this.metrics.firstPaint=t.startTime:t.name==="first-contentful-paint"&&(this.metrics.firstContentfulPaint=t.startTime)}),ue.debug("页面加载完成",{加载时间:`${this.metrics.pageLoadTime}ms`,"DOM 就绪":`${this.metrics.domContentLoaded}ms`,首次绘制:`${this.metrics.firstPaint?.toFixed(2)}ms`,内容绘制:`${this.metrics.firstContentfulPaint?.toFixed(2)}ms`})})}initResourceMetrics(){window.addEventListener("load",()=>{const e=performance.getEntriesByType("resource");this.metrics.resources.total=e.length,e.forEach(t=>{t.transferSize===0&&this.metrics.resources.cached++,this.metrics.resources.totalSize+=t.transferSize||0}),ue.debug("资源加载",{总数:this.metrics.resources.total,缓存:this.metrics.resources.cached,总大小:`${(this.metrics.resources.totalSize/1024).toFixed(2)} KB`})})}recordApiRequest(e,t){this.metrics.apiRequests.total++,t?this.metrics.apiRequests.success++:this.metrics.apiRequests.failed++,this.totalApiResponseTime+=e,this.metrics.apiRequests.avgResponseTime=this.totalApiResponseTime/this.metrics.apiRequests.total}getReport(){return{...this.metrics}}printReport(){ue.info("Performance Report",this.metrics)}},ze=new On,ce=$("HttpRequest");function In(e){if(e instanceof w||e&&typeof e=="object"&&"status"in e&&typeof e.status=="number")return e.status}function _t(e){return e instanceof DOMException&&e.name==="AbortError"}function vt(e){return e instanceof Le||In(e)===401}function Cn(e,t){if(_t(t)){ce.warn("API request aborted:",e);return}if(vt(t)){ce.warn("API request requires authentication:",e);return}ce.error("API request failed:",e,t)}async function Oe(e,t={}){const n=performance.now();t.onStart?.();try{const r=await Sn.request(e);return ze.recordApiRequest(performance.now()-n,!0),r}catch(r){throw ze.recordApiRequest(performance.now()-n,!1),Cn(e.url,r),t.onFailure?.(r),r}finally{t.onFinish?.()}}var Dn=Jt("loading",()=>{const e=H({}),t=we(()=>Object.keys(e.value).length>0);function n(o){const u=e.value[o]??0;e.value[o]=u+1}function r(o){const u=e.value[o]??0;if(u<=1){delete e.value[o];return}e.value[o]=u-1}function a(o){return(e.value[o]??0)>0}function i(){e.value={}}return{activeLoaders:e,hasAnyLoading:t,start:n,stop:r,isLoading:a,reset:i}}),Un={showLoader:!0,loadingKey:void 0,suppressErrorMessage:!1};function Mn(e={}){return{...Un,...e}}function Nn(e){return e instanceof TypeError?"Network request failed. Check the connection or service status.":e instanceof Error?`Operation failed: ${e.message}`:`Operation failed: ${String(e)}`}function kn(e){if(!e)return null;const t=jt();return t?Dn(t):null}async function s(e,t={}){const n=Mn(t),r=kn(n.loadingKey);return Oe(e,{onStart:()=>{n.showLoader&&ie.showLoading(!0),r&&n.loadingKey&&r.start(n.loadingKey)},onFailure:a=>{!n.suppressErrorMessage&&!_t(a)&&!vt(a)&&ie.showMessage(Nn(a),"error")},onFinish:()=>{n.showLoader&&ie.showLoading(!1),r&&n.loadingKey&&r.stop(n.loadingKey)}})}var X={showLoader:!1};function le(e){const t=e.replace(/\\/g,"/").split("/").filter(Boolean);if(t.length!==2)throw new Error("Diary path must use the format /.");return{folder:t[0],file:t[1]}}function $n(e){const t=e.name||"";return{file:t,title:t.replace(/\.md$/i,""),modified:e.lastModified||"",preview:e.preview||e.excerpt||e.contentPreview||e.summary||""}}function xn(e){return e?Array.isArray(e)?{thresholdEnabled:!1,threshold:.7,tags:e}:{thresholdEnabled:e.threshold!==void 0,threshold:e.threshold??.7,tags:e.tags||[]}:{thresholdEnabled:!1,threshold:.7,tags:[]}}var Yr={async getDiaryList(e={},t=X){let n={};e.search?.trim()?n=await s({url:"/admin_api/dailynotes/search",query:{term:e.search.trim(),folder:e.folder}},t):e.folder&&(n=await s({url:`/admin_api/dailynotes/folder/${encodeURIComponent(e.folder)}`},t));const r=Array.isArray(n.notes)?n.notes.map(a=>$n(a)):[];return{notes:r,total:r.length,page:e.page??1,pageSize:e.pageSize??r.length}},async getDiaryContent(e,t=X){const n=le(e);return(await s({url:`/admin_api/dailynotes/note/${encodeURIComponent(n.folder)}/${encodeURIComponent(n.file)}`},t)).content||""},async saveDiary(e,t,n={}){const r=le(e);return{path:e,message:(await s({url:`/admin_api/dailynotes/note/${encodeURIComponent(r.folder)}/${encodeURIComponent(r.file)}`,method:"POST",body:{content:t}},n)).message}},async deleteDiary(e,t={}){const n=await s({url:"/admin_api/dailynotes/delete-batch",method:"POST",body:{notesToDelete:e.map(r=>{const a=le(r);return{folder:a.folder,file:a.file}})}},t);return{deleted:n.deleted||[],message:n.message}},async getRagTagsConfig(e,t=X){return xn((await s({url:"/admin_api/rag-tags"},t))[e])},async saveRagTagsConfig(e,t,n={}){const r={[e]:{tags:t.tags.filter(a=>a.trim())}};t.thresholdEnabled&&(r[e].threshold=t.threshold),await s({url:"/admin_api/rag-tags",method:"POST",body:r},n)},async getFolders(e=X){return((await s({url:"/admin_api/dailynotes/folders"},e)).folders||[]).map(t=>({name:t,path:t}))},async moveDiaries(e,t,n={}){await s({url:"/admin_api/dailynotes/move",method:"POST",body:{sourceNotes:e,targetFolder:t}},n)},async associativeDiscovery(e,t={}){return s({url:"/admin_api/dailynotes/associative-discovery",method:"POST",body:e},t)}},N={showLoader:!1};function Fn(e={},t={}){const n=typeof e.offset=="number"&&Number.isFinite(e.offset)&&e.offset>=0?Math.floor(e.offset):void 0;return{url:"/admin_api/server-log",query:{incremental:e.incremental?!0:void 0,offset:n},...t}}async function Ge(e,t={},n=N){return s(Fn(e,t),n)}function Vn(e){const t=e.system.memory.total||0,n=e.system.memory.used||0;return{cpu:e.system.cpu,memory:{...e.system.memory,usage:t>0?n/t*100:0},nodeProcess:e.system.nodeProcess}}var Kr={async getSystemResources(e={},t=N){return Vn(await s({url:"/admin_api/system-monitor/system/resources",...e},t))},async getPM2Processes(e={},t=N){return(await s({url:"/admin_api/system-monitor/pm2/processes",...e},t)).processes??[]},async getUserAuthCode(e={},t=N){return s({url:"/admin_api/user-auth-code",...e},t)},async getServerLog(e={},t=N){return Ge({},e,t)},async getIncrementalServerLog(e,t={},n=N){return Ge({incremental:!0,offset:e},t,n)},async restartServer(e={}){return s({url:"/admin_api/server/restart",method:"POST"},e)},async logout(e={}){return s({url:"/admin_api/logout",method:"POST"},e)}},jn={showLoader:!1},Qr={async getWeather(e={},t=jn){return s({url:"/admin_api/weather",...e},t)}},qe={showLoader:!1},Xr={async getNews(e={},t=qe){return(await s({url:"/admin_api/dailyhot",...e},t)).data||[]},async getGroupedNews(e=2,t=10,n={},r=qe){const a=await this.getNews(n,r),i={};for(const o of a){const u=o.source||"Other";i[u]||(i[u]=[]),i[u].lengtht?q.data:k||(k=s({url:"/admin_api/plugins"},e).then(n=>{const r=qn(n);return q={data:r,expiresAt:Date.now()+Gn},r}).finally(()=>{k=null}),k)},async savePluginConfig(e,t,n={}){try{await s({url:`/admin_api/plugins/${encodeURIComponent(e)}/config`,method:"POST",body:{content:t}},n)}finally{Be()}},async togglePlugin(e,t,n={}){try{return await s({url:`/admin_api/plugins/${encodeURIComponent(e)}/toggle`,method:"POST",body:{enable:t}},n)}finally{Be()}},async saveInvocationCommandDescription(e,t,n,r={}){await s({url:`/admin_api/plugins/${encodeURIComponent(e)}/commands/${encodeURIComponent(t)}/description`,method:"POST",body:{description:n}},r)}},j={showLoader:!1},Zr={async getAgentConfig(e={},t=j){return s({url:"/admin_api/agent-assistant/config",...e},t)},async saveAgentConfig(e,t={}){await s({url:"/admin_api/agent-assistant/config",method:"POST",body:e},t)},async getAgentMap(e={},t=j){return s({url:"/admin_api/agents/map",...e},t)},async saveAgentMap(e,t={}){await s({url:"/admin_api/agents/map",method:"POST",body:e},t)},async getAgentFiles(e={},t=j){const n=await s({url:"/admin_api/agents",...e},t);return Array.isArray(n)?n:n.files||[]},async getAgentFileContent(e,t={},n=j){return(await s({url:`/admin_api/agents/${encodeURIComponent(e)}`,...t},n)).content||""},async saveAgentFile(e,t,n={}){await s({url:`/admin_api/agents/${encodeURIComponent(e)}`,method:"POST",body:{content:t}},n)},async createAgentFile(e,t,n={}){await s({url:"/admin_api/agents/new-file",method:"POST",body:{fileName:e,folderPath:t}},n)},async getAgentScores(e={},t=j){const n=await s({url:"/admin_api/agent-assistant/scores",...e},t);return Object.entries(n||{}).map(([r,a])=>({baseName:r,name:a.name||r,totalPoints:a.totalPoints||0,history:Array.isArray(a.history)?a.history:[]}))}},de={showLoader:!1},ea={async getMainConfig(e=de){return(await s({url:"/admin_api/config/main"},e)).content||""},async saveMainConfig(e,t={}){await s({url:"/admin_api/config/main",method:"POST",body:{content:e}},t)},async getToolApprovalConfig(e=de){return s({url:"/admin_api/tool-approval-config"},e)},async saveToolApprovalConfig(e,t={}){await s({url:"/admin_api/tool-approval-config",method:"POST",body:{config:e}},t)},async getPreprocessorOrder(e=de){const t=await s({url:"/admin_api/preprocessors/order"},e),n=t.order||t.newOrder;return Array.isArray(n)?n:[]},async savePreprocessorOrder(e,t={}){await s({url:"/admin_api/preprocessors/order",method:"POST",body:{order:e}},t)}},z=$("AuthApi");function He(e){return typeof e=="object"&&e!==null}function Bn(e){if(!He(e))return null;const t=e.user;if(!He(t))return null;const n=t.username,r=t.role;return typeof n!="string"||n.length===0?null:{username:n,role:typeof r=="string"?r:void 0}}function Hn(e){return e instanceof w||e instanceof Error?e:pt(e)}function Wn(e){return`Basic ${btoa(`${e.username}:${e.password}`)}`}async function At(e){try{return{ok:!0,data:await Oe(e)}}catch(t){const n=Hn(t);return{ok:!1,status:n.status,message:n.message}}}async function We(e){const t={"Content-Type":"application/json"};return e&&(t.Authorization=Wn(e)),At({url:"/admin_api/verify-login",method:"POST",headers:t})}async function Ye(){return At({url:"/admin_api/check-auth",method:"GET"})}function Yn(e){return e?typeof e.authenticated=="boolean"?e.authenticated:!0:!1}function Kn(e){return e.status===429?{success:!1,message:e.message||"登录尝试过于频繁,请稍后再试"}:e.status===401||e.status===403?{success:!1,message:"用户名或密码错误"}:e.status&&e.status>=500?{success:!1,message:"服务器暂时不可用,请稍后再试"}:e.message?{success:!1,message:"连接服务器失败,请检查网络"}:{success:!1,message:"登录失败,请稍后重试"}}var Ke={async verifyLogin(){const e=await We();return e.ok||z.warn("verify-login check failed:",{status:e.status,message:e.message}),e.ok},async checkAuthStatus(){const e=await Ye();return e.ok?Yn(e.data):e.status===404?(z.warn("check-auth not found, falling back to verify-login"),Ke.verifyLogin()):(z.warn("check-auth failed, falling back to verify-login:",{status:e.status,message:e.message}),Ke.verifyLogin())},async getCurrentUserInfo(){const e=await Ye();return e.ok?Bn(e.data):(e.status!==404&&z.warn("fetch user info failed at /admin_api/check-auth:",{status:e.status,message:e.message}),null)},async login(e){const t=await We(e);return t.ok?{success:!0}:(z.warn("login request failed:",{status:t.status,message:t.message}),Kn(t))}},Qn={showLoader:!1,suppressErrorMessage:!0},me={showLoader:!1,suppressErrorMessage:!0},ta={async getCache(e={},t=Qn){return s({url:"/admin_api/multimodal-cache",query:{page:e.page,pageSize:e.pageSize,search:e.search}},t)},async updateEntry(e,t,n=me){return s({url:"/admin_api/multimodal-cache/update",method:"POST",body:{hash:e,description:t}},n)},async deleteEntry(e,t=me){return s({url:`/admin_api/multimodal-cache/${encodeURIComponent(e)}`,method:"DELETE"},t)},async reidentify(e,t=me){return s({url:"/admin_api/multimodal-cache/reidentify",method:"POST",body:{hash:e}},t)}},Xn=1e4;function fe(e={}){const t=new URLSearchParams;e.startTimestamp!=null&&t.set("start_timestamp",String(e.startTimestamp)),e.endTimestamp!=null&&t.set("end_timestamp",String(e.endTimestamp)),e.modelName&&t.set("model_name",e.modelName);const n=t.toString();return n?`?${n}`:""}function Qe(e,t){const n=new Error(e);return n.status=t,n}async function pe(e){let t=null;try{t=await Oe({url:e,method:"GET",headers:{Accept:"application/json"},timeoutMs:Xn})}catch(n){const r=pt(n);throw Qe(r.message,r.status)}if(t?.success===!1)throw new w(t.error||t.message||"NewAPI monitor request failed");if(!t?.data)throw Qe("NewAPI monitor response is missing data");return t.data}var na={async getSummary(e={}){return pe(`/admin_api/newapi-monitor/summary${fe(e)}`)},async getTrend(e={}){const t=await pe(`/admin_api/newapi-monitor/trend${fe(e)}`);return{...t,items:Array.isArray(t.items)?t.items:[]}},async getModels(e={}){const t=await pe(`/admin_api/newapi-monitor/models${fe(e)}`);return{...t,items:Array.isArray(t.items)?t.items:[]}},async getDashboardSnapshot(e={}){const[t,n,r]=await Promise.allSettled([this.getSummary(e),this.getTrend(e),this.getModels({startTimestamp:e.startTimestamp,endTimestamp:e.endTimestamp})]);if(t.status!=="fulfilled")throw t.reason;return{summary:t.value,trend:n.status==="fulfilled"?n.value.items||[]:[],models:r.status==="fulfilled"?r.value.items||[]:[]}}},Xe={showLoader:!1},ra={async getPlaceholders(e=Xe){return(await s({url:"/admin_api/placeholders"},e)).data?.list||[]},async getPlaceholderDetail(e,t,n=Xe){const r=await s({url:"/admin_api/placeholders/detail",query:{type:e,name:t}},n);return r.data?.value!=null?String(r.data.value):null}},J={showLoader:!1},aa={async getRagParams(e=J){return s({url:"/admin_api/rag-params"},e)},async saveRagParams(e,t={}){await s({url:"/admin_api/rag-params",method:"POST",body:e},t)},async getSemanticGroups(e=J){return s({url:"/admin_api/semantic-groups"},e)},async saveSemanticGroups(e,t={}){await s({url:"/admin_api/semantic-groups",method:"POST",body:e},t)},async getThinkingChains(e=J){return s({url:"/admin_api/thinking-chains"},e)},async saveThinkingChains(e,t={}){await s({url:"/admin_api/thinking-chains",method:"POST",body:e},t)},async getAvailableClusters(e=J){return(await s({url:"/admin_api/available-clusters"},e)).clusters||[]}},Jn={showLoader:!1};function Zn(e){return Array.isArray(e)?e:e.schedules||[]}var er={async getSchedules(e=Jn){return Zn(await s({url:"/admin_api/schedules"},e))},async createSchedule(e,t={}){await s({url:"/admin_api/schedules",method:"POST",body:e},t)},async deleteSchedule(e,t={}){await s({url:`/admin_api/schedules/${encodeURIComponent(e)}`,method:"DELETE"},t)}},Je={showLoader:!1},sa={async getDreamLogSummaries(e=Je){const t=await s({url:"/admin_api/dream-logs"},e);return Array.isArray(t.logs)?t.logs:[]},async getDreamLogDetail(e,t=Je){return s({url:`/admin_api/dream-logs/${encodeURIComponent(e)}`},t)},async reviewDreamOperation(e,t,n,r={}){return s({url:`/admin_api/dream-logs/${encodeURIComponent(e)}/operations/${encodeURIComponent(t)}`,method:"POST",body:{action:n}},r)}},Ze={showLoader:!1},oa={async getToolboxMap(e=Ze){return s({url:"/admin_api/toolbox/map"},e)},async saveToolboxMap(e,t={}){await s({url:"/admin_api/toolbox/map",method:"POST",body:e},t)},async createToolboxFile(e,t,n={}){await s({url:"/admin_api/toolbox/new-file",method:"POST",body:{fileName:e,folderPath:t}},n)},async getToolboxFile(e,t=Ze){return(await s({url:`/admin_api/toolbox/file/${encodeURIComponent(e)}`},t)).content||""},async saveToolboxFile(e,t,n={}){await s({url:`/admin_api/toolbox/file/${encodeURIComponent(e)}`,method:"POST",body:{content:t}},n)}},et={showLoader:!1},ia={async getTvsFiles(e=et){return(await s({url:"/admin_api/tvsvars"},e)).files||[]},async getTvsFileContent(e,t=et){return(await s({url:`/admin_api/tvsvars/${encodeURIComponent(e)}`},t)).content||""},async saveTvsFile(e,t,n={}){await s({url:`/admin_api/tvsvars/${encodeURIComponent(e)}`,method:"POST",body:{content:t}},n)}},ge={showLoader:!1},ua={async getTools(e=ge){return(await s({url:"/admin_api/tool-list-editor/tools"},e)).tools||[]},async getConfigs(e=ge){return(await s({url:"/admin_api/tool-list-editor/configs"},e)).configs||[]},async getConfig(e,t=ge){return(await s({url:`/admin_api/tool-list-editor/config/${encodeURIComponent(e)}`},t)).tools||[]},async saveConfig(e,t,n={}){await s({url:`/admin_api/tool-list-editor/config/${encodeURIComponent(e)}`,method:"POST",body:{tools:t}},n)},async deleteConfig(e,t={}){await s({url:`/admin_api/tool-list-editor/config/${encodeURIComponent(e)}`,method:"DELETE"},t)}},tt={showLoader:!1},ca={async getState(e=tt){return s({url:"/admin_api/dynamic-tools/state"},e)},async getConfig(e=tt){return(await s({url:"/admin_api/dynamic-tools/config"},e)).config},async saveConfig(e,t={}){return(await s({url:"/admin_api/dynamic-tools/config",method:"POST",body:e},t)).config},async rebuild(e,t={}){return(await s({url:"/admin_api/dynamic-tools/rebuild",method:"POST",body:{mode:e}},t)).state},async updateOverride(e,t={}){return(await s({url:"/admin_api/dynamic-tools/override",method:"POST",body:e},t)).config}},Z="/admin_api/vcptavern",nt={showLoader:!1},la={async getPresets(e=nt){const t=await s({url:`${Z}/presets`},e);return Array.isArray(t)?t.filter(n=>typeof n=="string"):[]},async getPreset(e,t=nt){return s({url:`${Z}/presets/${encodeURIComponent(e)}`},t)},async savePreset(e,t,n={}){await s({url:`${Z}/presets/${encodeURIComponent(e)}`,method:"POST",body:t},n)},async deletePreset(e,t={}){await s({url:`${Z}/presets/${encodeURIComponent(e)}`,method:"DELETE"},t)}},tr=15e3,ve={showLoader:!1};function Tt(e){return typeof e=="object"&&e!==null}function nr(e){if(!Tt(e))return{};const t=e;if(t.success===!1)throw new w(t.error||t.message||"Forum request failed");return t.data!==void 0?t.data:e}function O(e){return typeof e=="string"?e:""}function rr(e){if(!Tt(e))return null;const t=O(e.uid),n=O(e.title),r=O(e.author),a=O(e.board),i=O(e.timestamp);return!t||!n||!r||!a||!i?null:{uid:t,title:n,author:r,board:a,timestamp:i,lastReplyBy:typeof e.lastReplyBy=="string"||e.lastReplyBy===null?e.lastReplyBy:null,lastReplyAt:typeof e.lastReplyAt=="string"||e.lastReplyAt===null?e.lastReplyAt:null}}function ar(e){const t=e.maid.trim(),n=e.content.trim();if(!t)throw new Error("回复昵称不能为空");if(!n)throw new Error("回复内容不能为空");return{maid:t,content:n}}function sr(e){if(!Number.isInteger(e)||e<=0)throw new Error("楼层号必须为大于 0 的整数");return e}async function G(e,t=ve){return nr(await s({...e,timeoutMs:tr},t))}var da={async getPosts(e=ve){const t=await G({url:"/admin_api/forum/posts",method:"GET"},e);return(Array.isArray(t.posts)?t.posts:[]).map(n=>rr(n)).filter(n=>n!==null)},async getPostContent(e,t=ve){return O((await G({url:`/admin_api/forum/post/${encodeURIComponent(e)}`,method:"GET"},t)).content)},async submitReply(e,t,n={}){const r=ar(t);await G({url:`/admin_api/forum/reply/${encodeURIComponent(e)}`,method:"POST",body:r},n)},async deletePost(e,t={}){return O((await G({url:`/admin_api/forum/post/${encodeURIComponent(e)}`,method:"DELETE",body:{}},t)).message)},async deleteReply(e,t,n={}){return O((await G({url:`/admin_api/forum/post/${encodeURIComponent(e)}`,method:"DELETE",body:{floor:sr(t)}},n)).message)}},or=15e3,Ae={showLoader:!1};function _(e){return typeof e=="object"&&e!==null}function h(e,t=""){return typeof e=="string"?e:t}function E(e){return typeof e=="string"&&e?e:null}function P(e,t){if(typeof e=="number"&&Number.isFinite(e))return Math.trunc(e);const n=Number.parseInt(String(e??""),10);return Number.isNaN(n)?t:n}function K(e){return Array.isArray(e)?e.map(t=>h(t).trim()).filter(Boolean):[]}function ir(e){return e==="custom_prompt"?"custom_prompt":"forum_patrol"}function ur(e){return e==="manual"||e==="once"||e==="cron"?e:"interval"}function cr(e){if(!_(e))return{};if(e.success===!1)throw new w(h(e.error)||h(e.message)||"Request failed");return"data"in e&&e.data!==void 0?e.data:e}async function ee(e,t=Ae){return cr(await s({...e,timeoutMs:or},t))}function lr(e){const t=_(e)?e:{};return{mode:ur(t.mode),intervalMinutes:Math.max(P(t.intervalMinutes,60),10),runAt:E(t.runAt),cronValue:E(t.cronValue),jitterSeconds:Math.max(P(t.jitterSeconds,0),0)}}function dr(e){const t=_(e)?e:{},n=K(t.injectTools);return{channel:h(t.channel,"AgentAssistant")||"AgentAssistant",temporaryContact:t.temporaryContact!==!1,injectTools:n.length>0?n:["VCPForum"],maid:h(t.maid,"VCP系统")||"VCP系统",taskDelegation:t.taskDelegation===!0}}function mr(e,t){const n=_(e)?e:{},r=K(n.availablePlaceholders);return t==="custom_prompt"?{promptTemplate:h(n.promptTemplate),availablePlaceholders:r}:{promptTemplate:h(n.promptTemplate),availablePlaceholders:r.length>0?r:["{{forum_post_list}}"],includeForumPostList:n.includeForumPostList!==!1,forumListPlaceholder:h(n.forumListPlaceholder,"{{forum_post_list}}")||"{{forum_post_list}}",maxPosts:Math.max(P(n.maxPosts,200),1)}}function fr(e){const t=_(e)?e:{},n=t.lastDurationMs==null?null:P(t.lastDurationMs,0);return{running:t.running===!0,lastRunTime:E(t.lastRunTime),lastFinishTime:E(t.lastFinishTime),lastResult:E(t.lastResult),lastError:E(t.lastError),lastDurationMs:n,runCount:Math.max(P(t.runCount,0),0),successCount:Math.max(P(t.successCount,0),0),errorCount:Math.max(P(t.errorCount,0),0),nextRunTime:E(t.nextRunTime)}}function Te(e){const t=_(e)?e:{},n=_(t.targets)?t.targets:{},r=_(t.meta)?t.meta:{},a=ir(t.type);return{id:h(t.id),name:h(t.name),type:a,enabled:t.enabled!==!1,schedule:lr(t.schedule),targets:{agents:K(n.agents)},dispatch:dr(t.dispatch),payload:mr(t.payload,a),runtime:fr(t.runtime),meta:{createdAt:E(r.createdAt),updatedAt:E(r.updatedAt)}}}function pr(e){if(!_(e))return null;const t=h(e.type).trim();return t?{type:t,label:h(e.label,t),description:h(e.description)}:null}function gr(e){const t=_(e)?e:{},n=_(t.config)?t.config:{},r=_(n.settings)?n.settings:{},a=Array.isArray(n.tasks)?n.tasks:[],i=Array.isArray(t.availableTaskTypes)?t.availableTaskTypes:[],o=_(t.taskTemplates)?t.taskTemplates:{},u=Object.fromEntries(Object.entries(o).filter(([,c])=>_(c)).map(([c,p])=>[c,Te(p)]));return{config:{globalEnabled:n.globalEnabled===!0,settings:{maxHistory:Math.max(P(r.maxHistory,200),20)},tasks:a.map(c=>Te(c))},availableTaskTypes:i.map(c=>pr(c)).filter(c=>c!==null),taskTemplates:u}}function hr(e){const t=Te(e);return{id:t.id,name:t.name,type:t.type,enabled:t.enabled,schedule:t.schedule,runtime:t.runtime,targets:t.targets}}function yr(e){return _(e)?{id:h(e.id),taskId:h(e.taskId),taskName:h(e.taskName),type:h(e.type),triggerSource:h(e.triggerSource),startedAt:E(e.startedAt),finishedAt:E(e.finishedAt),durationMs:e.durationMs==null?null:P(e.durationMs,0),status:h(e.status),agents:K(e.agents),message:h(e.message)}:null}function _r(e){const t=_(e)?e:{},n=Array.isArray(t.tasks)?t.tasks:[],r=Array.isArray(t.history)?t.history:[];return{globalEnabled:t.globalEnabled===!0,activeTimerCount:Math.max(P(t.activeTimerCount,0),0),activeTimers:K(t.activeTimers),tasks:n.map(a=>hr(a)),history:r.map(a=>yr(a)).filter(a=>a!==null)}}var ma={async getConfig(e=Ae){return gr(await ee({url:"/admin_api/task-assistant/config",method:"GET"},e))},async saveConfig(e,t={}){const n=await ee({url:"/admin_api/task-assistant/config",method:"POST",body:e},t),r=_(n)?n:{};return{success:r.success!==!1,message:h(r.message,"任务派发中心配置已保存")}},async getStatus(e=Ae){return _r(await ee({url:"/admin_api/task-assistant/status",method:"GET"},e))},async triggerTask(e,t={}){const n=await ee({url:"/admin_api/task-assistant/trigger",method:"POST",body:{taskId:e}},t),r=_(n)?n:{};return{success:r.success!==!1,message:h(r.message,"任务已触发")}}},he="/AdminPanel";function Et(e,t){return e===t||e.startsWith(`${t}/`)}function vr(e){if(!Et(e,"/AdminPanelLegacy"))return e;const t=e.slice(17);return!t||t==="/"?he:t.startsWith("/")?`${he}${t}`:`${he}/${t}`}function fa(e){return Et(e.pathname,"/AdminPanelLegacy")?`${vr(e.pathname)}${e.search??""}${e.hash??""}`:null}function pa(e){if(!e.startsWith("/AdminPanel"))return e;const t=e.slice(11);return t.startsWith("/")?t||"/":`/${t}`}var ga=$("Auth"),Ar="YYYY-MM-DD HH:mm:ss";function ha(e,t=Ar){const n=new Date(e);if(isNaN(n.getTime()))return"无效日期";const r=n.getFullYear(),a=String(n.getMonth()+1).padStart(2,"0"),i=String(n.getDate()).padStart(2,"0"),o=String(n.getHours()).padStart(2,"0"),u=String(n.getMinutes()).padStart(2,"0"),c=String(n.getSeconds()).padStart(2,"0");return t.replace("YYYY",String(r)).replace("MM",a).replace("DD",i).replace("HH",o).replace("mm",u).replace("ss",c)}var ya=$("Storage");function _a(e,t){const n=String(e);if(t==="boolean")return n.toLowerCase()==="true";if(t==="integer"){const r=parseInt(n,10);return isNaN(r)?0:r}return n}function va(e){return/key|api|secret|password|token/i.test(e)}function Tr(e,t){let n=0,r=t-1;for(;r>=0&&e[r]==="\\";)n++,r--;return n%2===1}function rt(e,t,n){for(let r=n;r{const c=new Date(u.time);return{id:u.id,date:c.toLocaleDateString("zh-CN",{month:"short",day:"numeric"}),time:c.toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit"}),content:u.content,dateTime:c}}).filter(u=>u.dateTime.getTime()>=o.getTime()).sort((u,c)=>u.dateTime.getTime()-c.dateTime.getTime()).slice(0,5)}catch(i){r.error("Failed to load schedules:",i),n.value=[]}finally{t.value=!1}}return Ct(()=>{a()}),(i,o)=>(U(),D("div",Pr,[o[2]||(o[2]=L("h3",{class:"dashboard-card-title"},"即将进行的日程",-1)),t.value?(U(),D("div",Lr,[...o[0]||(o[0]=[L("span",{class:"loading-spinner"},null,-1),L("p",null,"正在加载日程...",-1)])])):n.value.length===0?(U(),D("div",Rr,[...o[1]||(o[1]=[L("p",null,"暂无即将进行的日程。",-1)])])):(U(),D("div",Or,[(U(!0),D(Nt,null,It(n.value,u=>(U(),D("div",{key:u.id,class:"dashboard-card-panel schedule-item"},[L("div",Ir,[L("span",Cr,se(u.date),1),L("span",Dr,se(u.time),1)]),L("div",Ur,se(u.content),1)]))),128))]))]))}}),wa=Lt({default:()=>Nr}),Nr=kt(Mr,[["__scopeId","data-v-e621abee"]]);export{Kr as A,qr as B,ta as C,Jr as D,Zr as E,Gr as F,nn as G,Wr as H,Y as I,Jt as J,jr as K,Br as L,s as M,Dn as N,Xr as O,$ as P,yt as R,na as S,ea as T,m as U,Hr as V,zr as W,Vr as X,jt as Y,oa as _,Ta as a,aa as b,he as c,ma as d,da as f,ia as g,ua as h,va as i,Yr as j,Qr as k,fa as l,ca as m,Ea as n,Aa as o,la as p,Fr as q,_a as r,ha as s,wa as t,pa as u,sa as v,Ke as w,ra as x,er as y,dn as z}; diff --git a/AdminPanel-Vue/dist/assets/js/dashboard-card-calendar-DWuV34Bn.js b/AdminPanel-Vue/dist/assets/js/dashboard-card-calendar-DWuV34Bn.js new file mode 100644 index 000000000..74b1ac459 --- /dev/null +++ b/AdminPanel-Vue/dist/assets/js/dashboard-card-calendar-DWuV34Bn.js @@ -0,0 +1,5 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/Login-O5UIIymr.js","assets/js/dashboard-card-activitychart-CjJ1Boi_.js","assets/js/rolldown-runtime-DmMX61E0.js","assets/css/dashboard-card-activitychart-YGnIvisH.css","assets/js/index-DavTYS7A.js","assets/js/dashboard-card-news-BnyB_dHU.js","assets/css/dashboard-card-news-Dgf8YUcC.css","assets/js/vue-vendor-BUOVPpjf.js","assets/css/index-B5c5AvQl.css","assets/js/dashboard-components-B8tHL6X6.js","assets/css/dashboard-components-CuENf_SR.css","assets/css/Login-CpAQkj81.css","assets/js/Dashboard-JKAcrJUD.js","assets/js/usePolling-CJCCePbg.js","assets/js/pointerReorder-DgfeRZqx.js","assets/css/Dashboard-CdcoRcgb.css","assets/js/BaseConfig-ZwMPzMSY.js","assets/css/BaseConfig-0PlcRydK.css","assets/js/DailyNotesManager-e429OhBh.js","assets/js/easymde-BiwpWqxW.js","assets/css/easymde-CuHSnQz_.css","assets/js/useDebounceFn-X8Lyvegv.js","assets/js/useVirtualScroll-DdYyc53Y.js","assets/css/DailyNotesManager-DDfz6gIy.css","assets/js/VcpForum-Id9m3gbZ.js","assets/js/useMarkdownRenderer-DLeytw2l.js","assets/js/usePagination-OVhnKIrl.js","assets/css/VcpForum-C7GJV0D5.css","assets/js/ForumAssistantConfig-DYIbRlZ_.js","assets/css/ForumAssistantConfig-Djf1hPr8.css","assets/js/ImageCacheEditor-Du3p9rj1.js","assets/css/ImageCacheEditor-B2OClZFw.css","assets/js/SemanticGroupsEditor-BH73yceu.js","assets/css/SemanticGroupsEditor-BG4GRIgP.css","assets/js/VcptavernEditor-B0yp57rL.js","assets/js/usePointerDragSession-B6CxeZBm.js","assets/css/VcptavernEditor-5MCsg1Ga.css","assets/js/SarPromptEditor-Bq853TUQ.js","assets/css/SarPromptEditor-CCC5Xs9a.css","assets/js/ScheduleManager-Bbhal8Kk.js","assets/css/ScheduleManager-DmMhIa1v.css","assets/js/DreamManager-B-hn_w0p.js","assets/css/DreamManager-D4h6AS01.css","assets/js/ServerLogViewer-BdlP6B20.js","assets/js/markdown-Di1VBEdP.js","assets/css/ServerLogViewer-q73uYUJ4.css","assets/js/AgentFilesEditor-DBKe1qSu.js","assets/js/DualPaneEditor-D9nB9raE.js","assets/css/DualPaneEditor-BzkP9djm.css","assets/css/AgentFilesEditor-BVf2ZuXR.css","assets/js/AgentAssistantConfig-BzMHmiof.js","assets/css/AgentAssistantConfig-BiFNiaQo.css","assets/js/AgentScores-C7Y-y85L.js","assets/css/AgentScores-B_WvyPqt.css","assets/js/ToolboxManager-D56-z_F1.js","assets/css/ToolboxManager-CGShgpkK.css","assets/js/TvsFilesEditor-C5aiCR9A.js","assets/css/TvsFilesEditor-BSQejk_P.css","assets/js/ToolListEditor-ioMxub1G.js","assets/css/ToolListEditor-BWFw9lGM.css","assets/js/DynamicToolsManager-LMmR5Ul0.js","assets/css/DynamicToolsManager-bmlUkVu7.css","assets/js/PreprocessorOrderManager-DZK3zVsY.js","assets/css/PreprocessorOrderManager-DroMueNn.css","assets/js/ToolApprovalManager-Bf6PJCCw.js","assets/css/ToolApprovalManager-BzgeP_k2.css","assets/js/ThinkingChainsEditor-B1rNliSG.js","assets/css/ThinkingChainsEditor-B9Pf6Zdl.css","assets/js/RagTuning-CIyHJpOe.js","assets/css/RagTuning-CmZW8PX9.css","assets/js/PlaceholderViewer-qyzPTnil.js","assets/css/PlaceholderViewer-Bdbd_7My.css","assets/js/PluginsHub-Benzjuey.js","assets/js/useRecentVisits-Cv1J7k25.js","assets/css/PluginsHub-BHKSL3yg.css","assets/js/PluginConfig-B_YmEtY4.js","assets/css/PluginConfig-CGWZsWiO.css"])))=>i.map(i=>d[i]); +import{n as Rt}from"./rolldown-runtime-DmMX61E0.js";import{C as st,Dt as se,E as Lt,G as Ot,J as ot,K as Ee,N as It,O as Ct,Q as H,S as it,V as Dt,W as ut,X as Ut,Y as Mt,a as Nt,c as be,f as D,j as U,l as R,n as kt,nt as $t,q as W,rt as xt,tt as ct,v as Ft}from"./dashboard-card-activitychart-CjJ1Boi_.js";var Vt=typeof window<"u",Se,re=e=>Se=e,jt=()=>it()&&st(Pe)||Se,Pe=Symbol();function ye(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var B;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(B||(B={}));var Ue=typeof window=="object"&&window.window===window?window:typeof self=="object"&&self.self===self?self:typeof global=="object"&&global.global===global?global:typeof globalThis=="object"?globalThis:{HTMLElement:null};function zt(e,{autoBom:t=!1}={}){return t&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob(["\uFEFF",e],{type:e.type}):e}function Re(e,t,n){const r=new XMLHttpRequest;r.open("GET",e),r.responseType="blob",r.onload=function(){Gt(r.response,t,n)},r.onerror=function(){console.error("could not download file")},r.send()}function lt(e){const t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch{}return t.status>=200&&t.status<=299}function te(e){try{e.dispatchEvent(new MouseEvent("click"))}catch{const n=new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window,detail:0,screenX:80,screenY:20,clientX:80,clientY:20,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null});e.dispatchEvent(n)}}var ne=typeof navigator=="object"?navigator:{userAgent:""},dt=/Macintosh/.test(ne.userAgent)&&/AppleWebKit/.test(ne.userAgent)&&!/Safari/.test(ne.userAgent),Gt=Vt?typeof HTMLAnchorElement<"u"&&"download"in HTMLAnchorElement.prototype&&!dt?qt:"msSaveOrOpenBlob"in ne?Bt:Ht:()=>{};function qt(e,t="download",n){const r=document.createElement("a");r.download=t,r.rel="noopener",typeof e=="string"?(r.href=e,r.origin!==location.origin?lt(r.href)?Re(e,t,n):(r.target="_blank",te(r)):te(r)):(r.href=URL.createObjectURL(e),setTimeout(function(){URL.revokeObjectURL(r.href)},4e4),setTimeout(function(){te(r)},0))}function Bt(e,t="download",n){if(typeof e=="string")if(lt(e))Re(e,t,n);else{const r=document.createElement("a");r.href=e,r.target="_blank",setTimeout(function(){te(r)})}else navigator.msSaveOrOpenBlob(zt(e,n),t)}function Ht(e,t,n,r){if(r=r||open("","_blank"),r&&(r.document.title=r.document.body.innerText="downloading..."),typeof e=="string")return Re(e,t,n);const a=e.type==="application/octet-stream",i=/constructor/i.test(String(Ue.HTMLElement))||"safari"in Ue,o=/CriOS\/[\d]+/.test(navigator.userAgent);if((o||a&&i||dt)&&typeof FileReader<"u"){const u=new FileReader;u.onloadend=function(){let c=u.result;if(typeof c!="string")throw r=null,new Error("Wrong reader.result type");c=o?c:c.replace(/^data:[^;]*;/,"data:attachment/file;"),r?r.location.href=c:location.assign(c),r=null},u.readAsDataURL(e)}else{const u=URL.createObjectURL(e);r?r.location.assign(u):location.href=u,r=null,setTimeout(function(){URL.revokeObjectURL(u)},4e4)}}var{assign:xr}=Object;function Fr(){const e=ut(!0),t=e.run(()=>H({}));let n=[],r=[];const a=ot({install(i){re(a),a._a=i,i.provide(Pe,a),i.config.globalProperties.$pinia=a,r.forEach(o=>n.push(o)),r=[]},use(i){return this._a?n.push(i):r.push(i),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return a}var mt=()=>{};function Me(e,t,n,r=mt){e.add(t);const a=()=>{e.delete(t)&&r()};return!n&&Ot()&&Mt(a),a}function M(e,...t){e.forEach(n=>{n(...t)})}var Wt=e=>e(),Ne=Symbol(),oe=Symbol();function _e(e,t){e instanceof Map&&t instanceof Map?t.forEach((n,r)=>e.set(r,n)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],a=e[n];ye(a)&&ye(r)&&e.hasOwnProperty(n)&&!W(r)&&!Ee(r)?e[n]=_e(a,r):e[n]=r}return e}var Yt=Symbol();function Kt(e){return!ye(e)||!Object.prototype.hasOwnProperty.call(e,Yt)}var{assign:L}=Object;function Qt(e){return!!(W(e)&&e.effect)}function Xt(e,t,n,r){const{state:a,actions:i,getters:o}=t,u=n.state.value[e];let c;function p(){return u||(n.state.value[e]=a?a():{}),L(xt(n.state.value[e]),i,Object.keys(o||{}).reduce((l,g)=>(l[g]=ot(be(()=>{re(n);const y=n._s.get(e);return o[g].call(y,y)})),l),{}))}return c=ft(e,p,t,n,r,!0),c}function ft(e,t,n={},r,a,i){let o;const u=L({actions:{}},n),c={deep:!0};let p,l,g=new Set,y=new Set,v;const A=r.state.value[e];!i&&!A&&(r.state.value[e]={}),H({});let I;function Ce(f){let d;p=l=!1,typeof f=="function"?(f(r.state.value[e]),d={type:B.patchFunction,storeId:e,events:v}):(_e(r.state.value[e],f),d={type:B.patchObject,payload:f,storeId:e,events:v});const S=I=Symbol();Lt().then(()=>{I===S&&(p=!0)}),l=!0,M(g,d,r.state.value[e])}const Et=i?function(){const{state:d}=n,S=d?d():{};this.$patch(C=>{L(C,S)})}:mt;function bt(){o.stop(),g.clear(),y.clear(),r._s.delete(e)}const De=(f,d="")=>{if(Ne in f)return f[oe]=d,f;const S=function(){re(r);const C=Array.from(arguments),F=new Set,ae=new Set;function St(T){F.add(T)}function Pt(T){ae.add(T)}M(y,{args:C,name:S[oe],store:b,after:St,onError:Pt});let V;try{V=f.apply(this&&this.$id===e?this:b,C)}catch(T){throw M(ae,T),T}return V instanceof Promise?V.then(T=>(M(F,T),T)).catch(T=>(M(ae,T),Promise.reject(T))):(M(F,V),V)};return S[Ne]=!0,S[oe]=d,S},b=Ut({_p:r,$id:e,$onAction:Me.bind(null,y),$patch:Ce,$reset:Et,$subscribe(f,d={}){const S=Me(g,f,d.detached,()=>C()),C=o.run(()=>Dt(()=>r.state.value[e],F=>{(d.flush==="sync"?l:p)&&f({storeId:e,type:B.direct,events:v},F)},L({},c,d)));return S},$dispose:bt});r._s.set(e,b);const x=(r._a&&r._a.runWithContext||Wt)(()=>r._e.run(()=>(o=ut()).run(()=>t({action:De}))));for(const f in x){const d=x[f];W(d)&&!Qt(d)||Ee(d)?i||(A&&Kt(d)&&(W(d)?d.value=A[f]:_e(d,A[f])),r.state.value[e][f]=d):typeof d=="function"&&(x[f]=De(d,f),u.actions[f]=d)}return L(b,x),L(ct(b),x),Object.defineProperty(b,"$state",{get:()=>r.state.value[e],set:f=>{Ce(d=>{L(d,f)})}}),r._p.forEach(f=>{L(b,o.run(()=>f({store:b,app:r._a,pinia:r,options:u})))}),A&&i&&n.hydrate&&n.hydrate(b.$state,A),p=!0,l=!0,b}function Jt(e,t,n){let r;const a=typeof t=="function";r=a?n:t;function i(o,u){const c=it();return o=o||(c?st(Pe,null):null),o&&re(o),o=Se,o._s.has(e)||(a?ft(e,t,r,o):Xt(e,r,o)),o._s.get(e)}return i.$id=e,i}function Vr(e){const t=ct(e),n={};for(const r in t){const a=t[r];a.effect?n[r]=be({get:()=>e[r],set(i){e[r]=i}}):(W(a)||Ee(a))&&(n[r]=$t(e,r))}return n}var E=class extends Error{status;code;details;constructor(e,t={}){super(e),this.name="HttpError",this.status=t.status,this.code=t.code,this.details=t.details}},Le=class extends E{constructor(e="Unauthorized",t){super(e,{status:401,code:"AUTH_EXPIRED",details:t}),this.name="AuthExpiredError"}};function pt(e){return e instanceof E?e:e instanceof Error?new E(e.message,{details:e}):new E(String(e),{details:e})}var Zt=1e3,gt=null,ke=0;function jr(e){gt=e??null}function en(e){const t=Date.now();t-ke{},showMessage:()=>{}},Oe=ht;function zr(e){Oe=e??ht}function tn(e){Oe.showLoading(e)}function nn(e,t="info",n){Oe.showMessage(e,t,n)}var ie={showLoading(e){tn(e)},showMessage(e,t="info",n){nn(e,t,n)}},rn="modulepreload",an=function(e){return"/AdminPanel/"+e},$e={},m=function(t,n,r){let a=Promise.resolve();if(n&&n.length>0){let p=function(l){return Promise.all(l.map(g=>Promise.resolve(g).then(y=>({status:"fulfilled",value:y}),y=>({status:"rejected",reason:y}))))};const o=document.getElementsByTagName("link"),u=document.querySelector("meta[property=csp-nonce]"),c=u?.nonce||u?.getAttribute("nonce");a=p(n.map(l=>{if(l=an(l,r),l in $e)return;$e[l]=!0;const g=l.endsWith(".css"),y=g?'[rel="stylesheet"]':"";if(r)for(let A=o.length-1;A>=0;A--){const I=o[A];if(I.href===l&&(!g||I.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${l}"]${y}`))return;const v=document.createElement("link");if(v.rel=g?"stylesheet":rn,g||(v.as="script"),v.crossOrigin="",v.href=l,c&&v.setAttribute("nonce",c),document.head.appendChild(v),g)return new Promise((A,I)=>{v.addEventListener("load",A),v.addEventListener("error",()=>I(new Error(`Unable to preload CSS for ${l}`)))})}))}function i(o){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=o,window.dispatchEvent(u),!u.defaultPrevented)throw o}return a.then(o=>{for(const u of o||[])u.status==="rejected"&&i(u.reason);return t().catch(i)})},sn={core:"———— 核 心 功 能 ————",agent:"———— Agent 相 关 ————",tools:"———— 工 具 相 关 ————",rag:"———— RAG 相 关 ————",plugins:"———— 插 件 中 心 ————",other:"———— 其 他 ————"},Y=[{id:"login",routeName:"Login",path:"/login",title:"登录",icon:"login",requiresAuth:!1,showInSidebar:!1,component:()=>m(()=>import("./Login-O5UIIymr.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]))},{id:"dashboard",routeName:"Dashboard",path:"/dashboard",title:"仪表盘",icon:"dashboard",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./Dashboard-JKAcrJUD.js"),__vite__mapDeps([12,1,2,3,9,5,6,10,13,14,15]))},{id:"base-config",routeName:"BaseConfig",path:"/base-config",title:"全局基础配置",icon:"settings",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./BaseConfig-ZwMPzMSY.js"),__vite__mapDeps([16,1,2,3,5,6,17]))},{id:"daily-notes-manager",routeName:"DailyNotesManager",path:"/daily-notes-manager",title:"日记知识库管理",icon:"description",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./DailyNotesManager-e429OhBh.js"),__vite__mapDeps([18,1,2,3,5,6,19,20,21,22,23]))},{id:"vcp-forum",routeName:"VcpForum",path:"/vcp-forum",title:"VCP 论坛",icon:"forum",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./VcpForum-Id9m3gbZ.js"),__vite__mapDeps([24,1,2,3,21,25,26,27]))},{id:"forum-assistant-config",routeName:"ForumAssistantConfig",path:"/forum-assistant-config",title:"任务派发中心",icon:"explore",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./ForumAssistantConfig-DYIbRlZ_.js"),__vite__mapDeps([28,1,2,3,5,6,29]))},{id:"image-cache-editor",routeName:"ImageCacheEditor",path:"/image-cache-editor",title:"多媒体 Base64 编辑器",icon:"photo_library",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./ImageCacheEditor-Du3p9rj1.js"),__vite__mapDeps([30,1,2,3,5,6,31]))},{id:"semantic-groups-editor",routeName:"SemanticGroupsEditor",path:"/semantic-groups-editor",title:"语义组编辑器",icon:"hub",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./SemanticGroupsEditor-BH73yceu.js"),__vite__mapDeps([32,1,2,3,5,6,33]))},{id:"vcptavern-editor",routeName:"VcptavernEditor",path:"/vcptavern-editor",title:"VCPTavern 预设编辑",icon:"casino",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./VcptavernEditor-B0yp57rL.js"),__vite__mapDeps([34,1,2,3,5,6,35,14,36]))},{id:"sarprompt-editor",routeName:"SarPromptEditor",path:"/sarprompt-editor",title:"多模型提示词管理",icon:"psychology_alt",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./SarPromptEditor-Bq853TUQ.js"),__vite__mapDeps([37,1,2,3,5,6,38]))},{id:"schedule-manager",routeName:"ScheduleManager",path:"/schedule-manager",title:"日程管理",icon:"calendar_month",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./ScheduleManager-Bbhal8Kk.js"),__vite__mapDeps([39,1,2,3,5,6,40]))},{id:"dream-manager",routeName:"DreamManager",path:"/dream-manager",title:"梦境审批",icon:"nights_stay",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./DreamManager-B-hn_w0p.js"),__vite__mapDeps([41,1,2,3,5,6,25,42]))},{id:"server-log-viewer",routeName:"ServerLogViewer",path:"/server-log-viewer",title:"服务器日志",icon:"terminal",requiresAuth:!0,navGroup:"core",showInSidebar:!0,component:()=>m(()=>import("./ServerLogViewer-BdlP6B20.js"),__vite__mapDeps([43,1,2,3,9,5,6,10,44,13,22,45]))},{id:"agent-files-editor",routeName:"AgentFilesEditor",path:"/agent-files-editor",title:"Agent 管理器",icon:"smart_toy",requiresAuth:!0,navGroup:"agent",showInSidebar:!0,component:()=>m(()=>import("./AgentFilesEditor-DBKe1qSu.js"),__vite__mapDeps([46,1,2,3,5,6,47,48,49]))},{id:"agent-assistant-config",routeName:"AgentAssistantConfig",path:"/agent-assistant-config",title:"Agent 助手配置",icon:"diversity_3",requiresAuth:!0,navGroup:"agent",showInSidebar:!0,component:()=>m(()=>import("./AgentAssistantConfig-BzMHmiof.js"),__vite__mapDeps([50,1,2,3,5,6,51]))},{id:"agent-scores",routeName:"AgentScores",path:"/agent-scores",title:"Agent 积分排行榜",icon:"leaderboard",requiresAuth:!0,navGroup:"agent",showInSidebar:!0,component:()=>m(()=>import("./AgentScores-C7Y-y85L.js"),__vite__mapDeps([52,1,2,3,26,53]))},{id:"toolbox-manager",routeName:"ToolboxManager",path:"/toolbox-manager",title:"Toolbox 管理器",icon:"inventory_2",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./ToolboxManager-D56-z_F1.js"),__vite__mapDeps([54,1,2,3,5,6,47,48,55]))},{id:"tvs-files-editor",routeName:"TvsFilesEditor",path:"/tvs-files-editor",title:"高级变量编辑器",icon:"data_object",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./TvsFilesEditor-C5aiCR9A.js"),__vite__mapDeps([56,1,2,3,5,6,57]))},{id:"tool-list-editor",routeName:"ToolListEditor",path:"/tool-list-editor",title:"工具列表配置编辑器",icon:"construction",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./ToolListEditor-ioMxub1G.js"),__vite__mapDeps([58,1,2,3,59]))},{id:"dynamic-tools-manager",routeName:"DynamicToolsManager",path:"/dynamic-tools-manager",title:"动态工具清单",icon:"dynamic_feed",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./DynamicToolsManager-LMmR5Ul0.js"),__vite__mapDeps([60,1,2,3,5,6,7,61]))},{id:"preprocessor-order-manager",routeName:"PreprocessorOrderManager",path:"/preprocessor-order-manager",title:"预处理器顺序管理",icon:"sort",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./PreprocessorOrderManager-DZK3zVsY.js"),__vite__mapDeps([62,1,2,3,5,6,35,14,63]))},{id:"tool-approval-manager",routeName:"ToolApprovalManager",path:"/tool-approval-manager",title:"插件调用审核管理",icon:"verified_user",requiresAuth:!0,navGroup:"tools",showInSidebar:!0,component:()=>m(()=>import("./ToolApprovalManager-Bf6PJCCw.js"),__vite__mapDeps([64,1,2,3,5,6,65]))},{id:"thinking-chains-editor",routeName:"ThinkingChainsEditor",path:"/thinking-chains-editor",title:"思维链编辑器",icon:"psychology",requiresAuth:!0,navGroup:"rag",showInSidebar:!0,component:()=>m(()=>import("./ThinkingChainsEditor-B1rNliSG.js"),__vite__mapDeps([66,1,2,3,5,6,35,14,67]))},{id:"rag-tuning",routeName:"RagTuning",path:"/rag-tuning",title:"浪潮 RAG 调参",icon:"tune",requiresAuth:!0,navGroup:"rag",showInSidebar:!0,component:()=>m(()=>import("./RagTuning-CIyHJpOe.js"),__vite__mapDeps([68,1,2,3,5,6,69]))},{id:"placeholder-viewer",routeName:"PlaceholderViewer",path:"/placeholder-viewer",title:"占位符查看器",icon:"view_list",requiresAuth:!0,navGroup:"other",showInSidebar:!0,component:()=>m(()=>import("./PlaceholderViewer-qyzPTnil.js"),__vite__mapDeps([70,1,2,3,5,6,25,71]))},{id:"plugins",routeName:"PluginsHub",path:"/plugins",title:"插件中心",icon:"extension",requiresAuth:!0,navGroup:"plugins",showInSidebar:!0,component:()=>m(()=>import("./PluginsHub-Benzjuey.js"),__vite__mapDeps([72,1,2,3,9,5,6,10,7,73,74]))},{id:"plugin-config",routeName:"PluginConfig",path:"/plugin/:pluginName/config",title:"插件配置",icon:"extension",requiresAuth:!0,showInSidebar:!1,component:()=>m(()=>import("./PluginConfig-B_YmEtY4.js"),__vite__mapDeps([75,1,2,3,9,5,6,10,7,76]))}],Gr="dashboard",xe=new Map(Y.map(e=>[e.id,e])),on=new Set(Y.map(e=>e.id)),un=new Map(Y.map(e=>[e.routeName,e])),cn=new Map(Y.map(e=>[e.path,e]));function yt(e){return xe.get(e)??xe.get("dashboard")}function ln(e){return on.has(e)}function dn(e){if(typeof e=="string")return un.get(e)}function mn(e){return cn.get(e)}function qr(e){return yt(e).path}function fn(e,t=[]){return t.find(n=>n.pluginName===e&&n.label)?.label}function Fe(e,t=[],n=[]){return e?t.find(r=>r.manifest.name===e||r.name===e)?.manifest.displayName?.trim()||fn(e,n)||e:"Plugin Config"}function Br(){const e=[];let t;for(const n of Y)!n.showInSidebar||!n.navGroup||(n.navGroup!==t&&(e.push({category:sn[n.navGroup]}),t=n.navGroup),e.push({target:n.id,label:n.title,icon:n.icon}));return e}function Hr(e,t){return t?{name:"PluginConfig",params:{pluginName:t}}:ln(e)?{name:yt(e).routeName}:e.startsWith("/")?{path:e}:{path:`/${e}`}}function Wr(e,t={}){const n=dn(e.name);if(n)return n.routeName==="PluginConfig"?Fe(String(e.params.pluginName||""),t.plugins,t.navItems):n.title;if(e.name==="PluginConfig")return Fe(String(e.params.pluginName||""),t.plugins,t.navItems);const r=mn(e.path)?.title;if(r)return r;const a=e.path.replace(/^\//,"").split("/")[0]||"dashboard";return t.navItems?.find(i=>i.target===a&&i.label)?.label}var pn=15e3,gn={maxRetries:0,retryDelayMs:600,backoffMultiplier:2};function ve(e="Request aborted"){return new DOMException(e,"AbortError")}function hn(e,t){if(!t)return e;const n=new URLSearchParams;for(const[a,i]of Object.entries(t))i!==void 0&&n.set(a,String(i));const r=n.toString();return r?e.includes("?")?`${e}&${r}`:`${e}?${r}`:e}function yn(e){if(!e||e<=0)return{signal:void 0,cleanup:()=>{}};const t=new AbortController,n=globalThis.setTimeout(()=>{t.abort(ve(`Request timed out after ${e}ms`))},e);return{signal:t.signal,cleanup:()=>globalThis.clearTimeout(n)}}function _n(e){const t=e.filter(i=>i!==void 0);if(t.length===0)return{signal:void 0,cleanup:()=>{}};const n=new AbortController,r=i=>{n.signal.aborted||n.abort(i)};for(const i of t)if(i.aborted)return r(i.reason),{signal:n.signal,cleanup:()=>{}};const a=t.map(i=>{const o=()=>r(i.reason);return i.addEventListener("abort",o,{once:!0}),{signal:i,handleAbort:o}});return{signal:n.signal,cleanup:()=>{a.forEach(({signal:i,handleAbort:o})=>{i.removeEventListener("abort",o)})}}}async function vn(e){return(e.headers.get("content-type")||"").includes("application/json")?e.json():e.text()}function An(e){return e===void 0?!0:e>=500}function Tn(e){return e instanceof DOMException&&e.name==="AbortError"||e instanceof Le?!1:e instanceof E?An(e.status):(e instanceof TypeError,!0)}function Ve(e,t){const n=e.trim();return n.length>0?n:t}function wn(e,t){if(t&&typeof t=="object"){const n=t,r=typeof n.message=="string"&&n.message||typeof n.error=="string"&&n.error||typeof n.details=="string"&&n.details;if(r)return Ve(r,`HTTP ${e}`)}return typeof t=="string"&&t.trim().length>0?Ve(t,`HTTP ${e}`):`HTTP ${e}`}function En(e,t){return new Promise((n,r)=>{if(t?.aborted){r(ve());return}const a=globalThis.setTimeout(()=>{o(),n()},e),i=()=>{globalThis.clearTimeout(a),o(),r(ve())},o=()=>{t?.removeEventListener("abort",i)};t?.addEventListener("abort",i,{once:!0})})}function bn(){return{async request(e){const t={...gn,...e.retry||{}};let n;const r=t.maxRetries+1;for(let a=1;a<=r;a+=1){const i=yn(e.timeoutMs??pn),o=_n([e.signal,i.signal]);try{const u={...e.body!==void 0?{"Content-Type":"application/json"}:{},...e.headers||{}},c={method:e.method??"GET",headers:u,credentials:e.auth==="none"?"omit":"same-origin",signal:o.signal};e.body!==void 0&&(c.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));const p=await fetch(hn(e.url,e.query),c),l=await vn(p);if(!p.ok)throw p.status===401?(en({source:"httpClient",requestUrl:e.url,error:l}),new Le("Unauthorized",l)):new E(wn(p.status,l),{status:p.status,code:"HTTP_ERROR",details:l});return l}catch(u){if(n=u,!(a=je[Ln]}function $(e){const t=`[${e}]`;return{debug:(...n)=>{Q("debug")&&console.log(t,...n)},info:(...n)=>{Q("info")&&console.info(t,...n)},warn:(...n)=>{Q("warn")&&console.warn(t,...n)},error:(...n)=>{Q("error")&&console.error(t,...n)}}}var ue=$("Performance"),On=class{metrics={pageLoadTime:0,domContentLoaded:0,apiRequests:{total:0,success:0,failed:0,avgResponseTime:0},resources:{total:0,cached:0,totalSize:0}};totalApiResponseTime=0;constructor(){typeof window<"u"&&(this.initPageMetrics(),this.initResourceMetrics())}initPageMetrics(){window.addEventListener("load",()=>{const e=performance.getEntriesByType("navigation").find(t=>t instanceof PerformanceNavigationTiming);e&&(this.metrics.pageLoadTime=Math.max(0,e.loadEventEnd-e.startTime),this.metrics.domContentLoaded=Math.max(0,e.domContentLoadedEventEnd-e.startTime)),performance.getEntriesByType("paint").forEach(t=>{t.name==="first-paint"?this.metrics.firstPaint=t.startTime:t.name==="first-contentful-paint"&&(this.metrics.firstContentfulPaint=t.startTime)}),ue.debug("页面加载完成",{加载时间:`${this.metrics.pageLoadTime}ms`,"DOM 就绪":`${this.metrics.domContentLoaded}ms`,首次绘制:`${this.metrics.firstPaint?.toFixed(2)}ms`,内容绘制:`${this.metrics.firstContentfulPaint?.toFixed(2)}ms`})})}initResourceMetrics(){window.addEventListener("load",()=>{const e=performance.getEntriesByType("resource");this.metrics.resources.total=e.length,e.forEach(t=>{t.transferSize===0&&this.metrics.resources.cached++,this.metrics.resources.totalSize+=t.transferSize||0}),ue.debug("资源加载",{总数:this.metrics.resources.total,缓存:this.metrics.resources.cached,总大小:`${(this.metrics.resources.totalSize/1024).toFixed(2)} KB`})})}recordApiRequest(e,t){this.metrics.apiRequests.total++,t?this.metrics.apiRequests.success++:this.metrics.apiRequests.failed++,this.totalApiResponseTime+=e,this.metrics.apiRequests.avgResponseTime=this.totalApiResponseTime/this.metrics.apiRequests.total}getReport(){return{...this.metrics}}printReport(){ue.info("Performance Report",this.metrics)}},ze=new On,ce=$("HttpRequest");function In(e){if(e instanceof E||e&&typeof e=="object"&&"status"in e&&typeof e.status=="number")return e.status}function _t(e){return e instanceof DOMException&&e.name==="AbortError"}function vt(e){return e instanceof Le||In(e)===401}function Cn(e,t){if(_t(t)){ce.warn("API request aborted:",e);return}if(vt(t)){ce.warn("API request requires authentication:",e);return}ce.error("API request failed:",e,t)}async function Ie(e,t={}){const n=performance.now();t.onStart?.();try{const r=await Sn.request(e);return ze.recordApiRequest(performance.now()-n,!0),r}catch(r){throw ze.recordApiRequest(performance.now()-n,!1),Cn(e.url,r),t.onFailure?.(r),r}finally{t.onFinish?.()}}var Dn=Jt("loading",()=>{const e=H({}),t=be(()=>Object.keys(e.value).length>0);function n(o){const u=e.value[o]??0;e.value[o]=u+1}function r(o){const u=e.value[o]??0;if(u<=1){delete e.value[o];return}e.value[o]=u-1}function a(o){return(e.value[o]??0)>0}function i(){e.value={}}return{activeLoaders:e,hasAnyLoading:t,start:n,stop:r,isLoading:a,reset:i}}),Un={showLoader:!0,loadingKey:void 0,suppressErrorMessage:!1};function Mn(e={}){return{...Un,...e}}function Nn(e){return e instanceof TypeError?"Network request failed. Check the connection or service status.":e instanceof Error?`Operation failed: ${e.message}`:`Operation failed: ${String(e)}`}function kn(e){if(!e)return null;const t=jt();return t?Dn(t):null}async function s(e,t={}){const n=Mn(t),r=kn(n.loadingKey);return Ie(e,{onStart:()=>{n.showLoader&&ie.showLoading(!0),r&&n.loadingKey&&r.start(n.loadingKey)},onFailure:a=>{!n.suppressErrorMessage&&!_t(a)&&!vt(a)&&ie.showMessage(Nn(a),"error")},onFinish:()=>{n.showLoader&&ie.showLoading(!1),r&&n.loadingKey&&r.stop(n.loadingKey)}})}var X={showLoader:!1};function le(e){const t=e.replace(/\\/g,"/").split("/").filter(Boolean);if(t.length!==2)throw new Error("Diary path must use the format /.");return{folder:t[0],file:t[1]}}function $n(e){const t=e.name||"";return{file:t,title:t.replace(/\.md$/i,""),modified:e.lastModified||"",preview:e.preview||e.excerpt||e.contentPreview||e.summary||""}}function xn(e){return e?Array.isArray(e)?{thresholdEnabled:!1,threshold:.7,tags:e}:{thresholdEnabled:e.threshold!==void 0,threshold:e.threshold??.7,tags:e.tags||[]}:{thresholdEnabled:!1,threshold:.7,tags:[]}}var Yr={async getDiaryList(e={},t=X){let n={};e.search?.trim()?n=await s({url:"/admin_api/dailynotes/search",query:{term:e.search.trim(),folder:e.folder}},t):e.folder&&(n=await s({url:`/admin_api/dailynotes/folder/${encodeURIComponent(e.folder)}`},t));const r=Array.isArray(n.notes)?n.notes.map(a=>$n(a)):[];return{notes:r,total:r.length,page:e.page??1,pageSize:e.pageSize??r.length}},async getDiaryContent(e,t=X){const n=le(e);return(await s({url:`/admin_api/dailynotes/note/${encodeURIComponent(n.folder)}/${encodeURIComponent(n.file)}`},t)).content||""},async saveDiary(e,t,n={}){const r=le(e);return{path:e,message:(await s({url:`/admin_api/dailynotes/note/${encodeURIComponent(r.folder)}/${encodeURIComponent(r.file)}`,method:"POST",body:{content:t}},n)).message}},async deleteDiary(e,t={}){const n=await s({url:"/admin_api/dailynotes/delete-batch",method:"POST",body:{notesToDelete:e.map(r=>{const a=le(r);return{folder:a.folder,file:a.file}})}},t);return{deleted:n.deleted||[],message:n.message}},async getRagTagsConfig(e,t=X){return xn((await s({url:"/admin_api/rag-tags"},t))[e])},async saveRagTagsConfig(e,t,n={}){const r={[e]:{tags:t.tags.filter(a=>a.trim())}};t.thresholdEnabled&&(r[e].threshold=t.threshold),await s({url:"/admin_api/rag-tags",method:"POST",body:r},n)},async getFolders(e=X){return((await s({url:"/admin_api/dailynotes/folders"},e)).folders||[]).map(t=>({name:t,path:t}))},async moveDiaries(e,t,n={}){await s({url:"/admin_api/dailynotes/move",method:"POST",body:{sourceNotes:e,targetFolder:t}},n)},async associativeDiscovery(e,t={}){return s({url:"/admin_api/dailynotes/associative-discovery",method:"POST",body:e},t)}},N={showLoader:!1};function Fn(e={},t={}){const n=typeof e.offset=="number"&&Number.isFinite(e.offset)&&e.offset>=0?Math.floor(e.offset):void 0;return{url:"/admin_api/server-log",query:{incremental:e.incremental?!0:void 0,offset:n},...t}}async function Ge(e,t={},n=N){return s(Fn(e,t),n)}function Vn(e){const t=e.system.memory.total||0,n=e.system.memory.used||0;return{cpu:e.system.cpu,memory:{...e.system.memory,usage:t>0?n/t*100:0},nodeProcess:e.system.nodeProcess}}var Kr={async getSystemResources(e={},t=N){return Vn(await s({url:"/admin_api/system-monitor/system/resources",...e},t))},async getPM2Processes(e={},t=N){return(await s({url:"/admin_api/system-monitor/pm2/processes",...e},t)).processes??[]},async getUserAuthCode(e={},t=N){return s({url:"/admin_api/user-auth-code",...e},t)},async getServerLog(e={},t=N){return Ge({},e,t)},async getIncrementalServerLog(e,t={},n=N){return Ge({incremental:!0,offset:e},t,n)},async restartServer(e={}){return s({url:"/admin_api/server/restart",method:"POST"},e)},async logout(e={}){return s({url:"/admin_api/logout",method:"POST"},e)}},jn={showLoader:!1},Qr={async getWeather(e={},t=jn){return s({url:"/admin_api/weather",...e},t)}},qe={showLoader:!1},Xr={async getNews(e={},t=qe){return(await s({url:"/admin_api/dailyhot",...e},t)).data||[]},async getGroupedNews(e=2,t=10,n={},r=qe){const a=await this.getNews(n,r),i={};for(const o of a){const u=o.source||"Other";i[u]||(i[u]=[]),i[u].lengtht?q.data:k||(k=s({url:"/admin_api/plugins"},e).then(n=>{const r=qn(n);return q={data:r,expiresAt:Date.now()+Gn},r}).finally(()=>{k=null}),k)},async savePluginConfig(e,t,n={}){try{await s({url:`/admin_api/plugins/${encodeURIComponent(e)}/config`,method:"POST",body:{content:t}},n)}finally{Be()}},async togglePlugin(e,t,n={}){try{return await s({url:`/admin_api/plugins/${encodeURIComponent(e)}/toggle`,method:"POST",body:{enable:t}},n)}finally{Be()}},async saveInvocationCommandDescription(e,t,n,r={}){await s({url:`/admin_api/plugins/${encodeURIComponent(e)}/commands/${encodeURIComponent(t)}/description`,method:"POST",body:{description:n}},r)}},j={showLoader:!1},Zr={async getAgentConfig(e={},t=j){return s({url:"/admin_api/agent-assistant/config",...e},t)},async saveAgentConfig(e,t={}){await s({url:"/admin_api/agent-assistant/config",method:"POST",body:e},t)},async getAgentMap(e={},t=j){return s({url:"/admin_api/agents/map",...e},t)},async saveAgentMap(e,t={}){await s({url:"/admin_api/agents/map",method:"POST",body:e},t)},async getAgentFiles(e={},t=j){const n=await s({url:"/admin_api/agents",...e},t);return Array.isArray(n)?n:n.files||[]},async getAgentFileContent(e,t={},n=j){return(await s({url:`/admin_api/agents/${encodeURIComponent(e)}`,...t},n)).content||""},async saveAgentFile(e,t,n={}){await s({url:`/admin_api/agents/${encodeURIComponent(e)}`,method:"POST",body:{content:t}},n)},async createAgentFile(e,t,n={}){await s({url:"/admin_api/agents/new-file",method:"POST",body:{fileName:e,folderPath:t}},n)},async getAgentScores(e={},t=j){const n=await s({url:"/admin_api/agent-assistant/scores",...e},t);return Object.entries(n||{}).map(([r,a])=>({baseName:r,name:a.name||r,totalPoints:a.totalPoints||0,history:Array.isArray(a.history)?a.history:[]}))}},de={showLoader:!1},ea={async getMainConfig(e=de){return(await s({url:"/admin_api/config/main"},e)).content||""},async saveMainConfig(e,t={}){await s({url:"/admin_api/config/main",method:"POST",body:{content:e}},t)},async getToolApprovalConfig(e=de){return s({url:"/admin_api/tool-approval-config"},e)},async saveToolApprovalConfig(e,t={}){await s({url:"/admin_api/tool-approval-config",method:"POST",body:{config:e}},t)},async getPreprocessorOrder(e=de){const t=await s({url:"/admin_api/preprocessors/order"},e),n=t.order||t.newOrder;return Array.isArray(n)?n:[]},async savePreprocessorOrder(e,t={}){await s({url:"/admin_api/preprocessors/order",method:"POST",body:{order:e}},t)}},z=$("AuthApi");function He(e){return typeof e=="object"&&e!==null}function Bn(e){if(!He(e))return null;const t=e.user;if(!He(t))return null;const n=t.username,r=t.role;return typeof n!="string"||n.length===0?null:{username:n,role:typeof r=="string"?r:void 0}}function Hn(e){return e instanceof E||e instanceof Error?e:pt(e)}function Wn(e){return`Basic ${btoa(`${e.username}:${e.password}`)}`}async function At(e){try{return{ok:!0,data:await Ie(e)}}catch(t){const n=Hn(t);return{ok:!1,status:n.status,message:n.message}}}async function We(e){const t={"Content-Type":"application/json"};return e&&(t.Authorization=Wn(e)),At({url:"/admin_api/verify-login",method:"POST",headers:t})}async function Ye(){return At({url:"/admin_api/check-auth",method:"GET"})}function Yn(e){return e?typeof e.authenticated=="boolean"?e.authenticated:!0:!1}function Kn(e){return e.status===429?{success:!1,message:e.message||"登录尝试过于频繁,请稍后再试"}:e.status===401||e.status===403?{success:!1,message:"用户名或密码错误"}:e.status&&e.status>=500?{success:!1,message:"服务器暂时不可用,请稍后再试"}:e.message?{success:!1,message:"连接服务器失败,请检查网络"}:{success:!1,message:"登录失败,请稍后重试"}}var Ke={async verifyLogin(){const e=await We();return e.ok||z.warn("verify-login check failed:",{status:e.status,message:e.message}),e.ok},async checkAuthStatus(){const e=await Ye();return e.ok?Yn(e.data):e.status===404?(z.warn("check-auth not found, falling back to verify-login"),Ke.verifyLogin()):(z.warn("check-auth failed, falling back to verify-login:",{status:e.status,message:e.message}),Ke.verifyLogin())},async getCurrentUserInfo(){const e=await Ye();return e.ok?Bn(e.data):(e.status!==404&&z.warn("fetch user info failed at /admin_api/check-auth:",{status:e.status,message:e.message}),null)},async login(e){const t=await We(e);return t.ok?{success:!0}:(z.warn("login request failed:",{status:t.status,message:t.message}),Kn(t))}},Qn={showLoader:!1,suppressErrorMessage:!0},me={showLoader:!1,suppressErrorMessage:!0},ta={async getCache(e={},t=Qn){return s({url:"/admin_api/multimodal-cache",query:{page:e.page,pageSize:e.pageSize,search:e.search}},t)},async updateEntry(e,t,n=me){return s({url:"/admin_api/multimodal-cache/update",method:"POST",body:{hash:e,description:t}},n)},async deleteEntry(e,t=me){return s({url:`/admin_api/multimodal-cache/${encodeURIComponent(e)}`,method:"DELETE"},t)},async reidentify(e,t=me){return s({url:"/admin_api/multimodal-cache/reidentify",method:"POST",body:{hash:e}},t)}},Xn=1e4;function fe(e={}){const t=new URLSearchParams;e.startTimestamp!=null&&t.set("start_timestamp",String(e.startTimestamp)),e.endTimestamp!=null&&t.set("end_timestamp",String(e.endTimestamp)),e.modelName&&t.set("model_name",e.modelName);const n=t.toString();return n?`?${n}`:""}function Qe(e,t){const n=new Error(e);return n.status=t,n}async function pe(e){let t=null;try{t=await Ie({url:e,method:"GET",headers:{Accept:"application/json"},timeoutMs:Xn})}catch(n){const r=pt(n);throw Qe(r.message,r.status)}if(t?.success===!1)throw new E(t.error||t.message||"NewAPI monitor request failed");if(!t?.data)throw Qe("NewAPI monitor response is missing data");return t.data}var na={async getSummary(e={}){return pe(`/admin_api/newapi-monitor/summary${fe(e)}`)},async getTrend(e={}){const t=await pe(`/admin_api/newapi-monitor/trend${fe(e)}`);return{...t,items:Array.isArray(t.items)?t.items:[]}},async getModels(e={}){const t=await pe(`/admin_api/newapi-monitor/models${fe(e)}`);return{...t,items:Array.isArray(t.items)?t.items:[]}},async getDashboardSnapshot(e={}){const[t,n,r]=await Promise.allSettled([this.getSummary(e),this.getTrend(e),this.getModels({startTimestamp:e.startTimestamp,endTimestamp:e.endTimestamp})]);if(t.status!=="fulfilled")throw t.reason;return{summary:t.value,trend:n.status==="fulfilled"?n.value.items||[]:[],models:r.status==="fulfilled"?r.value.items||[]:[]}}},Xe={showLoader:!1},ra={async getPlaceholders(e=Xe){return(await s({url:"/admin_api/placeholders"},e)).data?.list||[]},async getPlaceholderDetail(e,t,n=Xe){const r=await s({url:"/admin_api/placeholders/detail",query:{type:e,name:t}},n);return r.data?.value!=null?String(r.data.value):null}},J={showLoader:!1},aa={async getRagParams(e=J){return s({url:"/admin_api/rag-params"},e)},async saveRagParams(e,t={}){await s({url:"/admin_api/rag-params",method:"POST",body:e},t)},async getSemanticGroups(e=J){return s({url:"/admin_api/semantic-groups"},e)},async saveSemanticGroups(e,t={}){await s({url:"/admin_api/semantic-groups",method:"POST",body:e},t)},async getThinkingChains(e=J){return s({url:"/admin_api/thinking-chains"},e)},async saveThinkingChains(e,t={}){await s({url:"/admin_api/thinking-chains",method:"POST",body:e},t)},async getAvailableClusters(e=J){return(await s({url:"/admin_api/available-clusters"},e)).clusters||[]}},Jn={showLoader:!1};function Zn(e){return Array.isArray(e)?e:e.schedules||[]}var er={async getSchedules(e=Jn){return Zn(await s({url:"/admin_api/schedules"},e))},async createSchedule(e,t={}){await s({url:"/admin_api/schedules",method:"POST",body:e},t)},async deleteSchedule(e,t={}){await s({url:`/admin_api/schedules/${encodeURIComponent(e)}`,method:"DELETE"},t)}},Je={showLoader:!1},sa={async getDreamLogSummaries(e=Je){const t=await s({url:"/admin_api/dream-logs"},e);return Array.isArray(t.logs)?t.logs:[]},async getDreamLogDetail(e,t=Je){return s({url:`/admin_api/dream-logs/${encodeURIComponent(e)}`},t)},async reviewDreamOperation(e,t,n,r={}){return s({url:`/admin_api/dream-logs/${encodeURIComponent(e)}/operations/${encodeURIComponent(t)}`,method:"POST",body:{action:n}},r)}},Ze={showLoader:!1},oa={async getToolboxMap(e=Ze){return s({url:"/admin_api/toolbox/map"},e)},async saveToolboxMap(e,t={}){await s({url:"/admin_api/toolbox/map",method:"POST",body:e},t)},async createToolboxFile(e,t,n={}){await s({url:"/admin_api/toolbox/new-file",method:"POST",body:{fileName:e,folderPath:t}},n)},async getToolboxFile(e,t=Ze){return(await s({url:`/admin_api/toolbox/file/${encodeURIComponent(e)}`},t)).content||""},async saveToolboxFile(e,t,n={}){await s({url:`/admin_api/toolbox/file/${encodeURIComponent(e)}`,method:"POST",body:{content:t}},n)}},et={showLoader:!1},ia={async getTvsFiles(e=et){return(await s({url:"/admin_api/tvsvars"},e)).files||[]},async getTvsFileContent(e,t=et){return(await s({url:`/admin_api/tvsvars/${encodeURIComponent(e)}`},t)).content||""},async saveTvsFile(e,t,n={}){await s({url:`/admin_api/tvsvars/${encodeURIComponent(e)}`,method:"POST",body:{content:t}},n)}},ge={showLoader:!1},ua={async getTools(e=ge){return(await s({url:"/admin_api/tool-list-editor/tools"},e)).tools||[]},async getConfigs(e=ge){return(await s({url:"/admin_api/tool-list-editor/configs"},e)).configs||[]},async getConfig(e,t=ge){return(await s({url:`/admin_api/tool-list-editor/config/${encodeURIComponent(e)}`},t)).tools||[]},async saveConfig(e,t,n={}){await s({url:`/admin_api/tool-list-editor/config/${encodeURIComponent(e)}`,method:"POST",body:{tools:t}},n)},async deleteConfig(e,t={}){await s({url:`/admin_api/tool-list-editor/config/${encodeURIComponent(e)}`,method:"DELETE"},t)}},tt={showLoader:!1},ca={async getState(e=tt){return s({url:"/admin_api/dynamic-tools/state"},e)},async getConfig(e=tt){return(await s({url:"/admin_api/dynamic-tools/config"},e)).config},async saveConfig(e,t={}){return(await s({url:"/admin_api/dynamic-tools/config",method:"POST",body:e},t)).config},async rebuild(e,t={},n={}){return(await s({url:"/admin_api/dynamic-tools/rebuild",method:"POST",body:{mode:e,wait:n.wait!==!1}},t)).state},async updateOverride(e,t={}){return(await s({url:"/admin_api/dynamic-tools/override",method:"POST",body:e},t)).config}},Z="/admin_api/vcptavern",nt={showLoader:!1},la={async getPresets(e=nt){const t=await s({url:`${Z}/presets`},e);return Array.isArray(t)?t.filter(n=>typeof n=="string"):[]},async getPreset(e,t=nt){return s({url:`${Z}/presets/${encodeURIComponent(e)}`},t)},async savePreset(e,t,n={}){await s({url:`${Z}/presets/${encodeURIComponent(e)}`,method:"POST",body:t},n)},async deletePreset(e,t={}){await s({url:`${Z}/presets/${encodeURIComponent(e)}`,method:"DELETE"},t)}},tr=15e3,Ae={showLoader:!1};function Tt(e){return typeof e=="object"&&e!==null}function nr(e){if(!Tt(e))return{};const t=e;if(t.success===!1)throw new E(t.error||t.message||"Forum request failed");return t.data!==void 0?t.data:e}function O(e){return typeof e=="string"?e:""}function rr(e){if(!Tt(e))return null;const t=O(e.uid),n=O(e.title),r=O(e.author),a=O(e.board),i=O(e.timestamp);return!t||!n||!r||!a||!i?null:{uid:t,title:n,author:r,board:a,timestamp:i,lastReplyBy:typeof e.lastReplyBy=="string"||e.lastReplyBy===null?e.lastReplyBy:null,lastReplyAt:typeof e.lastReplyAt=="string"||e.lastReplyAt===null?e.lastReplyAt:null}}function ar(e){const t=e.maid.trim(),n=e.content.trim();if(!t)throw new Error("回复昵称不能为空");if(!n)throw new Error("回复内容不能为空");return{maid:t,content:n}}function sr(e){if(!Number.isInteger(e)||e<=0)throw new Error("楼层号必须为大于 0 的整数");return e}async function G(e,t=Ae){return nr(await s({...e,timeoutMs:tr},t))}var da={async getPosts(e=Ae){const t=await G({url:"/admin_api/forum/posts",method:"GET"},e);return(Array.isArray(t.posts)?t.posts:[]).map(n=>rr(n)).filter(n=>n!==null)},async getPostContent(e,t=Ae){return O((await G({url:`/admin_api/forum/post/${encodeURIComponent(e)}`,method:"GET"},t)).content)},async submitReply(e,t,n={}){const r=ar(t);await G({url:`/admin_api/forum/reply/${encodeURIComponent(e)}`,method:"POST",body:r},n)},async deletePost(e,t={}){return O((await G({url:`/admin_api/forum/post/${encodeURIComponent(e)}`,method:"DELETE",body:{}},t)).message)},async deleteReply(e,t,n={}){return O((await G({url:`/admin_api/forum/post/${encodeURIComponent(e)}`,method:"DELETE",body:{floor:sr(t)}},n)).message)}},or=15e3,Te={showLoader:!1};function _(e){return typeof e=="object"&&e!==null}function h(e,t=""){return typeof e=="string"?e:t}function w(e){return typeof e=="string"&&e?e:null}function P(e,t){if(typeof e=="number"&&Number.isFinite(e))return Math.trunc(e);const n=Number.parseInt(String(e??""),10);return Number.isNaN(n)?t:n}function K(e){return Array.isArray(e)?e.map(t=>h(t).trim()).filter(Boolean):[]}function ir(e){return e==="custom_prompt"?"custom_prompt":"forum_patrol"}function ur(e){return e==="manual"||e==="once"||e==="cron"?e:"interval"}function cr(e){if(!_(e))return{};if(e.success===!1)throw new E(h(e.error)||h(e.message)||"Request failed");return"data"in e&&e.data!==void 0?e.data:e}async function ee(e,t=Te){return cr(await s({...e,timeoutMs:or},t))}function lr(e){const t=_(e)?e:{};return{mode:ur(t.mode),intervalMinutes:Math.max(P(t.intervalMinutes,60),10),runAt:w(t.runAt),cronValue:w(t.cronValue),jitterSeconds:Math.max(P(t.jitterSeconds,0),0)}}function dr(e){const t=_(e)?e:{},n=K(t.injectTools);return{channel:h(t.channel,"AgentAssistant")||"AgentAssistant",temporaryContact:t.temporaryContact!==!1,injectTools:n.length>0?n:["VCPForum"],maid:h(t.maid,"VCP系统")||"VCP系统",taskDelegation:t.taskDelegation===!0}}function mr(e,t){const n=_(e)?e:{},r=K(n.availablePlaceholders);return t==="custom_prompt"?{promptTemplate:h(n.promptTemplate),availablePlaceholders:r}:{promptTemplate:h(n.promptTemplate),availablePlaceholders:r.length>0?r:["{{forum_post_list}}"],includeForumPostList:n.includeForumPostList!==!1,forumListPlaceholder:h(n.forumListPlaceholder,"{{forum_post_list}}")||"{{forum_post_list}}",maxPosts:Math.max(P(n.maxPosts,200),1)}}function fr(e){const t=_(e)?e:{},n=t.lastDurationMs==null?null:P(t.lastDurationMs,0);return{running:t.running===!0,lastRunTime:w(t.lastRunTime),lastFinishTime:w(t.lastFinishTime),lastResult:w(t.lastResult),lastError:w(t.lastError),lastDurationMs:n,runCount:Math.max(P(t.runCount,0),0),successCount:Math.max(P(t.successCount,0),0),errorCount:Math.max(P(t.errorCount,0),0),nextRunTime:w(t.nextRunTime)}}function we(e){const t=_(e)?e:{},n=_(t.targets)?t.targets:{},r=_(t.meta)?t.meta:{},a=ir(t.type);return{id:h(t.id),name:h(t.name),type:a,enabled:t.enabled!==!1,schedule:lr(t.schedule),targets:{agents:K(n.agents)},dispatch:dr(t.dispatch),payload:mr(t.payload,a),runtime:fr(t.runtime),meta:{createdAt:w(r.createdAt),updatedAt:w(r.updatedAt)}}}function pr(e){if(!_(e))return null;const t=h(e.type).trim();return t?{type:t,label:h(e.label,t),description:h(e.description)}:null}function gr(e){const t=_(e)?e:{},n=_(t.config)?t.config:{},r=_(n.settings)?n.settings:{},a=Array.isArray(n.tasks)?n.tasks:[],i=Array.isArray(t.availableTaskTypes)?t.availableTaskTypes:[],o=_(t.taskTemplates)?t.taskTemplates:{},u=Object.fromEntries(Object.entries(o).filter(([,c])=>_(c)).map(([c,p])=>[c,we(p)]));return{config:{globalEnabled:n.globalEnabled===!0,settings:{maxHistory:Math.max(P(r.maxHistory,200),20)},tasks:a.map(c=>we(c))},availableTaskTypes:i.map(c=>pr(c)).filter(c=>c!==null),taskTemplates:u}}function hr(e){const t=we(e);return{id:t.id,name:t.name,type:t.type,enabled:t.enabled,schedule:t.schedule,runtime:t.runtime,targets:t.targets}}function yr(e){return _(e)?{id:h(e.id),taskId:h(e.taskId),taskName:h(e.taskName),type:h(e.type),triggerSource:h(e.triggerSource),startedAt:w(e.startedAt),finishedAt:w(e.finishedAt),durationMs:e.durationMs==null?null:P(e.durationMs,0),status:h(e.status),agents:K(e.agents),message:h(e.message)}:null}function _r(e){const t=_(e)?e:{},n=Array.isArray(t.tasks)?t.tasks:[],r=Array.isArray(t.history)?t.history:[];return{globalEnabled:t.globalEnabled===!0,activeTimerCount:Math.max(P(t.activeTimerCount,0),0),activeTimers:K(t.activeTimers),tasks:n.map(a=>hr(a)),history:r.map(a=>yr(a)).filter(a=>a!==null)}}var ma={async getConfig(e=Te){return gr(await ee({url:"/admin_api/task-assistant/config",method:"GET"},e))},async saveConfig(e,t={}){const n=await ee({url:"/admin_api/task-assistant/config",method:"POST",body:e},t),r=_(n)?n:{};return{success:r.success!==!1,message:h(r.message,"任务派发中心配置已保存")}},async getStatus(e=Te){return _r(await ee({url:"/admin_api/task-assistant/status",method:"GET"},e))},async triggerTask(e,t={}){const n=await ee({url:"/admin_api/task-assistant/trigger",method:"POST",body:{taskId:e}},t),r=_(n)?n:{};return{success:r.success!==!1,message:h(r.message,"任务已触发")}}},he="/AdminPanel";function wt(e,t){return e===t||e.startsWith(`${t}/`)}function vr(e){if(!wt(e,"/AdminPanelLegacy"))return e;const t=e.slice(17);return!t||t==="/"?he:t.startsWith("/")?`${he}${t}`:`${he}/${t}`}function fa(e){return wt(e.pathname,"/AdminPanelLegacy")?`${vr(e.pathname)}${e.search??""}${e.hash??""}`:null}function pa(e){if(!e.startsWith("/AdminPanel"))return e;const t=e.slice(11);return t.startsWith("/")?t||"/":`/${t}`}var ga=$("Auth"),Ar="YYYY-MM-DD HH:mm:ss";function ha(e,t=Ar){const n=new Date(e);if(isNaN(n.getTime()))return"无效日期";const r=n.getFullYear(),a=String(n.getMonth()+1).padStart(2,"0"),i=String(n.getDate()).padStart(2,"0"),o=String(n.getHours()).padStart(2,"0"),u=String(n.getMinutes()).padStart(2,"0"),c=String(n.getSeconds()).padStart(2,"0");return t.replace("YYYY",String(r)).replace("MM",a).replace("DD",i).replace("HH",o).replace("mm",u).replace("ss",c)}var ya=$("Storage");function _a(e,t){const n=String(e);if(t==="boolean")return n.toLowerCase()==="true";if(t==="integer"){const r=parseInt(n,10);return isNaN(r)?0:r}return n}function va(e){return/key|api|secret|password|token/i.test(e)}function Tr(e,t){let n=0,r=t-1;for(;r>=0&&e[r]==="\\";)n++,r--;return n%2===1}function rt(e,t,n){for(let r=n;r{const c=new Date(u.time);return{id:u.id,date:c.toLocaleDateString("zh-CN",{month:"short",day:"numeric"}),time:c.toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit"}),content:u.content,dateTime:c}}).filter(u=>u.dateTime.getTime()>=o.getTime()).sort((u,c)=>u.dateTime.getTime()-c.dateTime.getTime()).slice(0,5)}catch(i){r.error("Failed to load schedules:",i),n.value=[]}finally{t.value=!1}}return Ct(()=>{a()}),(i,o)=>(U(),D("div",Pr,[o[2]||(o[2]=R("h3",{class:"dashboard-card-title"},"即将进行的日程",-1)),t.value?(U(),D("div",Rr,[...o[0]||(o[0]=[R("span",{class:"loading-spinner"},null,-1),R("p",null,"正在加载日程...",-1)])])):n.value.length===0?(U(),D("div",Lr,[...o[1]||(o[1]=[R("p",null,"暂无即将进行的日程。",-1)])])):(U(),D("div",Or,[(U(!0),D(Nt,null,It(n.value,u=>(U(),D("div",{key:u.id,class:"dashboard-card-panel schedule-item"},[R("div",Ir,[R("span",Cr,se(u.date),1),R("span",Dr,se(u.time),1)]),R("div",Ur,se(u.content),1)]))),128))]))]))}}),Ea=Rt({default:()=>Nr}),Nr=kt(Mr,[["__scopeId","data-v-e621abee"]]);export{Kr as A,qr as B,ta as C,Jr as D,Zr as E,Gr as F,nn as G,Wr as H,Y as I,Jt as J,jr as K,Br as L,s as M,Dn as N,Xr as O,$ as P,yt as R,na as S,ea as T,m as U,Hr as V,zr as W,Vr as X,jt as Y,oa as _,Ta as a,aa as b,he as c,ma as d,da as f,ia as g,ua as h,va as i,Yr as j,Qr as k,fa as l,ca as m,wa as n,Aa as o,la as p,Fr as q,_a as r,ha as s,Ea as t,pa as u,sa as v,Ke as w,ra as x,er as y,dn as z}; diff --git a/AdminPanel-Vue/dist/assets/js/dashboard-components-LHqMn0M5.js b/AdminPanel-Vue/dist/assets/js/dashboard-components-B8tHL6X6.js similarity index 99% rename from AdminPanel-Vue/dist/assets/js/dashboard-components-LHqMn0M5.js rename to AdminPanel-Vue/dist/assets/js/dashboard-components-B8tHL6X6.js index e9cf4485a..8c68db163 100644 --- a/AdminPanel-Vue/dist/assets/js/dashboard-components-LHqMn0M5.js +++ b/AdminPanel-Vue/dist/assets/js/dashboard-components-B8tHL6X6.js @@ -1 +1 @@ -import{Dt as b,G as ae,N as X,O as oe,Q as S,V as W,Y as re,a as Q,c as L,d as ie,f as P,j as E,k as se,l as o,n as Z,v as ee}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{d as le}from"./dashboard-card-news-BnyB_dHU.js";import{D as ue,J as ce,L as de,P as me}from"./dashboard-card-calendar-CA3-tSpi.js";var B=me("useLocalStorage");function ve(r){return typeof r=="object"&&r!==null}function F(r,n,g={}){const{serializer:s=JSON.stringify,parser:h=JSON.parse,listenExternal:d=!1,sync:v=!0,deep:u=ve(n)}=g,t=S((()=>{if(typeof window>"u")return n;try{const m=window.localStorage.getItem(r);return m?h(m):n}catch(m){return B.warn(`Error reading localStorage key "${r}":`,m),n}})());if(W(t,m=>{if(!(typeof window>"u"))try{const c=s(m);window.localStorage.setItem(r,c),(d||v)&&window.dispatchEvent(new Event("local-storage"))}catch(c){B.warn(`Error setting localStorage key "${r}":`,c)}},{deep:u}),v&&typeof window<"u"){const m=c=>{if(c.key===r)try{if(c.newValue===null){t.value=n;return}t.value=h(c.newValue)}catch(I){B.warn(`Error parsing storage event for key "${r}":`,I)}};window.addEventListener("storage",m),ae()&&re(()=>{window.removeEventListener("storage",m)})}return t}var fe="pinnedPlugins";function R(r){return r.manifest.name||r.name}function z(r){return r.manifest.displayName?.trim()||R(r)}function ge(r,n){return z(r).localeCompare(z(n),"zh-CN",{sensitivity:"base"})}var pe=ce("app",()=>{const r=F("theme","dark"),n=F("animationsEnabled",!0),g=S(!1),s=F(fe,[]),h=S(de()),d=S([]),v=S(!1);let u=null;W(r,e=>{typeof document<"u"&&document.documentElement.setAttribute("data-theme",e)},{immediate:!0});const l=L(()=>new Map(d.value.map(e=>[R(e),e]))),t=L(()=>s.value.map(e=>l.value.get(e)).filter(e=>e!==void 0));function m(e){r.value=e}function c(){n.value=!n.value}function I(){g.value=!0,document.body.style.overflow="hidden"}function V(){g.value=!1,document.body.style.overflow=""}function k(e){const f=[...e].sort(ge);d.value=f,v.value=!0;const G=new Set(f.map(R));s.value=s.value.filter(O=>G.has(O))}async function w(){return u||(u=ue.getPlugins().then(e=>(k(e),d.value)).finally(()=>{u=null}),u)}async function M(){return v.value?d.value:w()}function D(e){return h.value.find(f=>f.target===e)?.label}function _(e){return l.value.get(e)}function x(e){const f=_(e);return f?z(f):e}function N(e){return _(e)?.manifest.description?.trim()||""}function a(e){return _(e)?.manifest.icon||"extension"}function p(e){return s.value.includes(e)}function y(e){!l.value.has(e)||p(e)||(s.value=[...s.value,e])}function i(e){s.value=s.value.filter(f=>f!==e)}function C(e){if(p(e)){i(e);return}y(e)}return{theme:r,animationsEnabled:n,isImmersiveMode:g,navItems:h,plugins:d,pluginsLoaded:v,pinnedPluginNames:s,pinnedPlugins:t,setTheme:m,toggleAnimations:c,enterImmersiveMode:I,exitImmersiveMode:V,loadPlugins:k,refreshPlugins:w,ensurePluginsLoaded:M,getNavLabel:D,getPluginByName:_,getPluginDisplayName:x,getPluginDescription:N,getPluginIcon:a,isPluginPinned:p,pinPlugin:y,unpinPlugin:i,togglePinnedPlugin:C}}),he={class:"card-manager"},ye={class:"card-manager-section"},_e={class:"card-manager-section-header"},be={class:"card-manager-grid"},Ie={class:"card-manager-item-copy"},we={class:"card-manager-meta"},Ce=["disabled","onClick"],Pe={class:"card-manager-section"},Ee={class:"card-manager-list"},Se={class:"card-manager-item-copy"},Le={class:"card-manager-instance-actions"},ke=["onClick"],Me=["onClick"],xe=ee({__name:"CardManager",props:{modelValue:{type:Boolean},contributions:{},instances:{}},emits:["update:modelValue","addCard","toggleInstance","removeInstance","resetLayout"],setup(r,{emit:n}){const g=r,s=n,h=L(()=>new Set(g.instances.map(u=>u.typeId)));function d(){s("update:modelValue",!1)}function v(u){return g.contributions.find(l=>l.typeId===u.typeId)?.title??u.typeId}return(u,l)=>r.modelValue?(E(),P("div",{key:0,class:"card-manager-overlay",onClick:le(d,["self"])},[o("div",he,[o("div",{class:"card-manager-header"},[l[1]||(l[1]=o("div",null,[o("h2",null,"卡片管理"),o("p",null,"官方卡片和插件卡片都通过同一套布局系统管理。")],-1)),o("button",{type:"button",class:"btn-secondary card-manager-close",onClick:d},"关闭")]),o("section",ye,[o("div",_e,[l[2]||(l[2]=o("h3",null,"可添加卡片",-1)),o("button",{type:"button",class:"btn-secondary card-manager-reset",onClick:l[0]||(l[0]=t=>s("resetLayout"))}," 恢复默认布局 ")]),o("div",be,[(E(!0),P(Q,null,X(r.contributions,t=>(E(),P("article",{key:t.typeId,class:"card-manager-item"},[o("div",Ie,[o("h4",null,b(t.title),1),o("p",null,b(t.description||"暂无描述"),1),o("span",we,b(t.source==="builtin"?"官方卡片":`插件 · ${t.pluginName}`),1)]),o("button",{type:"button",class:"btn-primary card-manager-add",disabled:t.singleton&&h.value.has(t.typeId),onClick:m=>s("addCard",t.typeId)},b(t.singleton&&h.value.has(t.typeId)?"已添加":"添加"),9,Ce)]))),128))])]),o("section",Pe,[l[3]||(l[3]=o("h3",null,"当前布局",-1)),o("div",Ee,[(E(!0),P(Q,null,X(r.instances,t=>(E(),P("article",{key:t.instanceId,class:"card-manager-instance"},[o("div",Se,[o("h4",null,b(v(t)),1),o("p",null,b(t.typeId),1)]),o("div",Le,[o("button",{type:"button",class:"btn-secondary card-manager-toggle",onClick:m=>s("toggleInstance",{instanceId:t.instanceId,enabled:!t.enabled})},b(t.enabled?"隐藏":"显示"),9,ke),o("button",{type:"button",class:"btn-danger card-manager-remove",onClick:m=>s("removeInstance",t.instanceId)}," 删除 ",8,Me)])]))),128))])])])])):ie("",!0)}}),Be=Z(xe,[["__scopeId","data-v-72467099"]]),Ne="/AdminPanel/VCPLogo2.png",Ae={class:"vcp-animation-container"},Te=5,$e=2e3,$=100,Ve=ee({__name:"VcpAnimation",setup(r){const n=S(null),g=pe(),s=L(()=>g.animationsEnabled),h=L(()=>g.theme);let d=null,v=null,u=!1,l=0,t=null;function m(){l++,t!==null&&clearTimeout(t),l>=Te?(l=0,g.enterImmersiveMode()):t=setTimeout(()=>{l=0,t=null},$e)}let c=[];const I=$,V=[[0,0],[1,0],[0,1],[1,1],[-1,1]];function k(a){if(c.length<=1)return;const p=$*$,y=new Map;c.forEach((i,C)=>{const e=`${Math.floor(i.x/I)},${Math.floor(i.y/I)}`,f=y.get(e);if(f){f.push(C);return}y.set(e,[C])});for(const[i,C]of y.entries()){const[e,f]=i.split(","),G=Number.parseInt(e,10),O=Number.parseInt(f,10);for(const[ne,te]of V){const q=y.get(`${G+ne},${O+te}`);if(q)for(const Y of C)for(const j of q){if(Y>=j)continue;const A=c[Y],T=c[j],H=A.x-T.x,J=A.y-T.y,K=H*H+J*J;if(K>=p)continue;const U=.1*(1-Math.sqrt(K)/$);a.beginPath(),a.moveTo(A.x,A.y),a.lineTo(T.x,T.y),a.strokeStyle=h.value==="dark"?`rgba(56, 189, 248, ${U})`:`rgba(2, 132, 199, ${U})`,a.lineWidth=.5,a.stroke()}}}}function w(){u=!1,v!==null&&(cancelAnimationFrame(v),v=null)}function M(){u||!s.value||!d||!n.value||(u=!0,v=requestAnimationFrame(x))}function D(){if(!n.value||(d=n.value.getContext("2d"),!d))return;const a=n.value.parentElement;a&&(n.value.width=a.clientWidth,n.value.height=a.clientHeight),_(),M()}function _(){if(!n.value)return;c=[];const a=Math.floor(n.value.width*n.value.height/4e3);for(let p=0;p{i.x+=i.vx,i.y+=i.vy,(i.x<0||i.x>p)&&(i.vx*=-1),(i.y<0||i.y>y)&&(i.vy*=-1),a.beginPath(),a.arc(i.x,i.y,i.radius,0,Math.PI*2),a.fillStyle=h.value==="dark"?`rgba(56, 189, 248, ${i.alpha})`:`rgba(2, 132, 199, ${i.alpha})`,a.fill()}),k(a),v=requestAnimationFrame(x)}function N(){if(!n.value)return;const a=n.value.parentElement;a&&(n.value.width=a.clientWidth,n.value.height=a.clientHeight,_())}return W(s,a=>{if(a){M();return}w()}),oe(()=>{D(),window.addEventListener("resize",N)}),se(()=>{w(),window.removeEventListener("resize",N)}),(a,p)=>(E(),P("div",Ae,[o("div",{class:"vcp-logo-container"},[o("img",{src:Ne,alt:"VCPToolBox Logo",class:"vcp-logo",width:"500",height:"200",loading:"eager",onClick:m})]),o("canvas",{ref_key:"canvas",ref:n,id:"vcp-animation-canvas"},null,512)]))}}),Fe=Z(Ve,[["__scopeId","data-v-ca608b8f"]]);export{F as a,pe as i,Ne as n,Be as r,Fe as t}; +import{Dt as b,G as ae,N as X,O as oe,Q as S,V as W,Y as re,a as Q,c as L,d as ie,f as P,j as E,k as se,l as o,n as Z,v as ee}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{d as le}from"./dashboard-card-news-BnyB_dHU.js";import{D as ue,J as ce,L as de,P as me}from"./dashboard-card-calendar-DWuV34Bn.js";var B=me("useLocalStorage");function ve(r){return typeof r=="object"&&r!==null}function F(r,n,g={}){const{serializer:s=JSON.stringify,parser:h=JSON.parse,listenExternal:d=!1,sync:v=!0,deep:u=ve(n)}=g,t=S((()=>{if(typeof window>"u")return n;try{const m=window.localStorage.getItem(r);return m?h(m):n}catch(m){return B.warn(`Error reading localStorage key "${r}":`,m),n}})());if(W(t,m=>{if(!(typeof window>"u"))try{const c=s(m);window.localStorage.setItem(r,c),(d||v)&&window.dispatchEvent(new Event("local-storage"))}catch(c){B.warn(`Error setting localStorage key "${r}":`,c)}},{deep:u}),v&&typeof window<"u"){const m=c=>{if(c.key===r)try{if(c.newValue===null){t.value=n;return}t.value=h(c.newValue)}catch(I){B.warn(`Error parsing storage event for key "${r}":`,I)}};window.addEventListener("storage",m),ae()&&re(()=>{window.removeEventListener("storage",m)})}return t}var fe="pinnedPlugins";function R(r){return r.manifest.name||r.name}function z(r){return r.manifest.displayName?.trim()||R(r)}function ge(r,n){return z(r).localeCompare(z(n),"zh-CN",{sensitivity:"base"})}var pe=ce("app",()=>{const r=F("theme","dark"),n=F("animationsEnabled",!0),g=S(!1),s=F(fe,[]),h=S(de()),d=S([]),v=S(!1);let u=null;W(r,e=>{typeof document<"u"&&document.documentElement.setAttribute("data-theme",e)},{immediate:!0});const l=L(()=>new Map(d.value.map(e=>[R(e),e]))),t=L(()=>s.value.map(e=>l.value.get(e)).filter(e=>e!==void 0));function m(e){r.value=e}function c(){n.value=!n.value}function I(){g.value=!0,document.body.style.overflow="hidden"}function V(){g.value=!1,document.body.style.overflow=""}function k(e){const f=[...e].sort(ge);d.value=f,v.value=!0;const G=new Set(f.map(R));s.value=s.value.filter(O=>G.has(O))}async function w(){return u||(u=ue.getPlugins().then(e=>(k(e),d.value)).finally(()=>{u=null}),u)}async function M(){return v.value?d.value:w()}function D(e){return h.value.find(f=>f.target===e)?.label}function _(e){return l.value.get(e)}function x(e){const f=_(e);return f?z(f):e}function N(e){return _(e)?.manifest.description?.trim()||""}function a(e){return _(e)?.manifest.icon||"extension"}function p(e){return s.value.includes(e)}function y(e){!l.value.has(e)||p(e)||(s.value=[...s.value,e])}function i(e){s.value=s.value.filter(f=>f!==e)}function C(e){if(p(e)){i(e);return}y(e)}return{theme:r,animationsEnabled:n,isImmersiveMode:g,navItems:h,plugins:d,pluginsLoaded:v,pinnedPluginNames:s,pinnedPlugins:t,setTheme:m,toggleAnimations:c,enterImmersiveMode:I,exitImmersiveMode:V,loadPlugins:k,refreshPlugins:w,ensurePluginsLoaded:M,getNavLabel:D,getPluginByName:_,getPluginDisplayName:x,getPluginDescription:N,getPluginIcon:a,isPluginPinned:p,pinPlugin:y,unpinPlugin:i,togglePinnedPlugin:C}}),he={class:"card-manager"},ye={class:"card-manager-section"},_e={class:"card-manager-section-header"},be={class:"card-manager-grid"},Ie={class:"card-manager-item-copy"},we={class:"card-manager-meta"},Ce=["disabled","onClick"],Pe={class:"card-manager-section"},Ee={class:"card-manager-list"},Se={class:"card-manager-item-copy"},Le={class:"card-manager-instance-actions"},ke=["onClick"],Me=["onClick"],xe=ee({__name:"CardManager",props:{modelValue:{type:Boolean},contributions:{},instances:{}},emits:["update:modelValue","addCard","toggleInstance","removeInstance","resetLayout"],setup(r,{emit:n}){const g=r,s=n,h=L(()=>new Set(g.instances.map(u=>u.typeId)));function d(){s("update:modelValue",!1)}function v(u){return g.contributions.find(l=>l.typeId===u.typeId)?.title??u.typeId}return(u,l)=>r.modelValue?(E(),P("div",{key:0,class:"card-manager-overlay",onClick:le(d,["self"])},[o("div",he,[o("div",{class:"card-manager-header"},[l[1]||(l[1]=o("div",null,[o("h2",null,"卡片管理"),o("p",null,"官方卡片和插件卡片都通过同一套布局系统管理。")],-1)),o("button",{type:"button",class:"btn-secondary card-manager-close",onClick:d},"关闭")]),o("section",ye,[o("div",_e,[l[2]||(l[2]=o("h3",null,"可添加卡片",-1)),o("button",{type:"button",class:"btn-secondary card-manager-reset",onClick:l[0]||(l[0]=t=>s("resetLayout"))}," 恢复默认布局 ")]),o("div",be,[(E(!0),P(Q,null,X(r.contributions,t=>(E(),P("article",{key:t.typeId,class:"card-manager-item"},[o("div",Ie,[o("h4",null,b(t.title),1),o("p",null,b(t.description||"暂无描述"),1),o("span",we,b(t.source==="builtin"?"官方卡片":`插件 · ${t.pluginName}`),1)]),o("button",{type:"button",class:"btn-primary card-manager-add",disabled:t.singleton&&h.value.has(t.typeId),onClick:m=>s("addCard",t.typeId)},b(t.singleton&&h.value.has(t.typeId)?"已添加":"添加"),9,Ce)]))),128))])]),o("section",Pe,[l[3]||(l[3]=o("h3",null,"当前布局",-1)),o("div",Ee,[(E(!0),P(Q,null,X(r.instances,t=>(E(),P("article",{key:t.instanceId,class:"card-manager-instance"},[o("div",Se,[o("h4",null,b(v(t)),1),o("p",null,b(t.typeId),1)]),o("div",Le,[o("button",{type:"button",class:"btn-secondary card-manager-toggle",onClick:m=>s("toggleInstance",{instanceId:t.instanceId,enabled:!t.enabled})},b(t.enabled?"隐藏":"显示"),9,ke),o("button",{type:"button",class:"btn-danger card-manager-remove",onClick:m=>s("removeInstance",t.instanceId)}," 删除 ",8,Me)])]))),128))])])])])):ie("",!0)}}),Be=Z(xe,[["__scopeId","data-v-72467099"]]),Ne="/AdminPanel/VCPLogo2.png",Ae={class:"vcp-animation-container"},Te=5,$e=2e3,$=100,Ve=ee({__name:"VcpAnimation",setup(r){const n=S(null),g=pe(),s=L(()=>g.animationsEnabled),h=L(()=>g.theme);let d=null,v=null,u=!1,l=0,t=null;function m(){l++,t!==null&&clearTimeout(t),l>=Te?(l=0,g.enterImmersiveMode()):t=setTimeout(()=>{l=0,t=null},$e)}let c=[];const I=$,V=[[0,0],[1,0],[0,1],[1,1],[-1,1]];function k(a){if(c.length<=1)return;const p=$*$,y=new Map;c.forEach((i,C)=>{const e=`${Math.floor(i.x/I)},${Math.floor(i.y/I)}`,f=y.get(e);if(f){f.push(C);return}y.set(e,[C])});for(const[i,C]of y.entries()){const[e,f]=i.split(","),G=Number.parseInt(e,10),O=Number.parseInt(f,10);for(const[ne,te]of V){const q=y.get(`${G+ne},${O+te}`);if(q)for(const Y of C)for(const j of q){if(Y>=j)continue;const A=c[Y],T=c[j],H=A.x-T.x,J=A.y-T.y,K=H*H+J*J;if(K>=p)continue;const U=.1*(1-Math.sqrt(K)/$);a.beginPath(),a.moveTo(A.x,A.y),a.lineTo(T.x,T.y),a.strokeStyle=h.value==="dark"?`rgba(56, 189, 248, ${U})`:`rgba(2, 132, 199, ${U})`,a.lineWidth=.5,a.stroke()}}}}function w(){u=!1,v!==null&&(cancelAnimationFrame(v),v=null)}function M(){u||!s.value||!d||!n.value||(u=!0,v=requestAnimationFrame(x))}function D(){if(!n.value||(d=n.value.getContext("2d"),!d))return;const a=n.value.parentElement;a&&(n.value.width=a.clientWidth,n.value.height=a.clientHeight),_(),M()}function _(){if(!n.value)return;c=[];const a=Math.floor(n.value.width*n.value.height/4e3);for(let p=0;p{i.x+=i.vx,i.y+=i.vy,(i.x<0||i.x>p)&&(i.vx*=-1),(i.y<0||i.y>y)&&(i.vy*=-1),a.beginPath(),a.arc(i.x,i.y,i.radius,0,Math.PI*2),a.fillStyle=h.value==="dark"?`rgba(56, 189, 248, ${i.alpha})`:`rgba(2, 132, 199, ${i.alpha})`,a.fill()}),k(a),v=requestAnimationFrame(x)}function N(){if(!n.value)return;const a=n.value.parentElement;a&&(n.value.width=a.clientWidth,n.value.height=a.clientHeight,_())}return W(s,a=>{if(a){M();return}w()}),oe(()=>{D(),window.addEventListener("resize",N)}),se(()=>{w(),window.removeEventListener("resize",N)}),(a,p)=>(E(),P("div",Ae,[o("div",{class:"vcp-logo-container"},[o("img",{src:Ne,alt:"VCPToolBox Logo",class:"vcp-logo",width:"500",height:"200",loading:"eager",onClick:m})]),o("canvas",{ref_key:"canvas",ref:n,id:"vcp-animation-canvas"},null,512)]))}}),Fe=Z(Ve,[["__scopeId","data-v-ca608b8f"]]);export{F as a,pe as i,Ne as n,Be as r,Fe as t}; diff --git a/AdminPanel-Vue/dist/assets/js/index-ByuHVUJE.js b/AdminPanel-Vue/dist/assets/js/index-DavTYS7A.js similarity index 93% rename from AdminPanel-Vue/dist/assets/js/index-ByuHVUJE.js rename to AdminPanel-Vue/dist/assets/js/index-DavTYS7A.js index 1541755b2..9545b0bfd 100644 --- a/AdminPanel-Vue/dist/assets/js/index-ByuHVUJE.js +++ b/AdminPanel-Vue/dist/assets/js/index-DavTYS7A.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/MainLayout-DAf1ed91.js","assets/js/dashboard-card-activitychart-CjJ1Boi_.js","assets/js/rolldown-runtime-DmMX61E0.js","assets/css/dashboard-card-activitychart-YGnIvisH.css","assets/js/dashboard-card-calendar-CA3-tSpi.js","assets/css/dashboard-card-calendar-CgD3w8x7.css","assets/js/dashboard-components-LHqMn0M5.js","assets/js/dashboard-card-news-BnyB_dHU.js","assets/css/dashboard-card-news-Dgf8YUcC.css","assets/css/dashboard-components-CuENf_SR.css","assets/js/vue-vendor-BUOVPpjf.js","assets/js/useRecentVisits-ryn7iNG7.js","assets/js/useVirtualScroll-DdYyc53Y.js","assets/css/MainLayout-BV_zkaqI.css"])))=>i.map(i=>d[i]); -import{F as O,Q as d,X as z,c as C,j as q,u as I,v as M}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{i as U}from"./dashboard-card-news-BnyB_dHU.js";import{B as A,F as D,I as F,J as N,K as k,P as B,R as b,U as W,W as H,c as x,l as K,q as V,w as m}from"./dashboard-card-calendar-CA3-tSpi.js";import{n as j,t as G}from"./vue-vendor-BUOVPpjf.js";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))a(r);new MutationObserver(r=>{for(const s of r)if(s.type==="childList")for(const i of s.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&a(i)}).observe(document,{childList:!0,subtree:!0});function t(r){const s={};return r.integrity&&(s.integrity=r.integrity),r.referrerPolicy&&(s.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?s.credentials="include":r.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function a(r){if(r.ep)return;r.ep=!0;const s=t(r);fetch(r.href,s)}})();var J=M({__name:"App",setup(e){return(n,t)=>{const a=O("router-view");return q(),I(a)}}}),Q=J,X=3500,u=z({loadingCount:0,message:{id:0,text:"",type:"info",visible:!1}}),p=null;function Y(){p!==null&&(globalThis.clearTimeout(p),p=null)}function Z(e){return typeof e!="number"||!Number.isFinite(e)||e<=0?X:e}function $(e){u.loadingCount=e?u.loadingCount+1:Math.max(0,u.loadingCount-1)}function ee(e,n="info",t){u.message.id+=1;const a=u.message.id;Y(),u.message.text=e,u.message.type=n,u.message.visible=!0,p=globalThis.setTimeout(()=>{u.message.id===a&&(u.message.visible=!1,p=null)},Z(t))}var pe=u,ve=C(()=>u.loadingCount>0),re={showLoading:$,showMessage:ee},te=300*1e3,w=N("auth",()=>{const e=d(!1),n=d(!0),t=d(null),a=d(null),r=d(0);let s=null;function i(){return r.value===0?!1:Date.now()-r.value{try{n.value=!0,t.value=null;const o=await m.checkAuthStatus();return e.value=o,r.value=Date.now(),o?await g():a.value=null,o}catch(o){return t.value=o instanceof Error?o.message:"认证检查失败",e.value=!1,a.value=null,!1}finally{n.value=!1,s=null}})(),s)}async function E(l,c){try{n.value=!0,t.value=null;const o=await m.login({username:l,password:c});return o.success?(e.value=!0,r.value=Date.now(),await g(l)):t.value=o.message||"登录失败",o}catch(o){return t.value=o instanceof Error?o.message:"登录失败",{success:!1,message:t.value}}finally{n.value=!1}}function R(){e.value=!1,a.value=null,t.value=null,r.value=0,s=null,typeof window<"u"&&sessionStorage.clear()}function T(){t.value=null}return{isAuthenticated:e,isLoading:n,error:t,user:a,checkAuth:S,login:E,logout:R,clearError:T}});function P(e,n,t="dashboard"){const a=A(t);if(typeof n!="string"||!n.startsWith("/"))return a;const r=e.resolve(n);return!r.matched.length||r.name==="Login"?a:r.fullPath.startsWith("/")?r.fullPath:a}var ae=B("Router");if(typeof window<"u"){const e=K(window.location);e&&window.history.replaceState(window.history.state,"",e)}var v=b("login"),ne=b(D),se=F.filter(e=>e.id!=="login").map(e=>({path:e.path.replace(/^\//,""),name:e.routeName,component:e.component,meta:{requiresAuth:e.requiresAuth}})),oe=[{path:v.path,name:v.routeName,component:v.component,meta:{requiresAuth:v.requiresAuth}},{path:"/",name:"Main",component:()=>W(()=>import("./MainLayout-DAf1ed91.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13])),redirect:ne.path,children:se}],f=G({history:j(x),routes:oe});function y(e){return e.meta.requiresAuth===!1||e.name==="Login"}function _(e){return P(f,e.fullPath,"dashboard")}f.beforeEach(async(e,n,t)=>{const a=w();try{if(y(e)){if(e.name==="Login"&&(a.isAuthenticated||await a.checkAuth())){t(P(f,typeof e.query.redirect=="string"?e.query.redirect:null));return}t();return}if(!(a.isAuthenticated||await a.checkAuth())){t({name:"Login",query:{redirect:_(e)}});return}t()}catch(r){if(ae.error("Navigation guard error:",r),y(e)){t();return}t({name:"Login",query:{redirect:_(e)}})}});var ie={mounted(e,n){const t=n.value;if(!t)return;if(!("IntersectionObserver"in window)){e.src=t;return}e._lazySrc=t,e.src="";const a=new IntersectionObserver(r=>{r.forEach(s=>{if(s.isIntersecting){const i=s.target;i._lazySrc&&(i.src=i._lazySrc,delete i._lazySrc,a.unobserve(i),delete i._lazyObserver)}})},{rootMargin:"50px 0px",threshold:.01});a.observe(e),e._lazyObserver=a},beforeUnmount(e){e._lazyObserver&&(e._lazyObserver.disconnect(),delete e._lazyObserver),e._lazySrc&&delete e._lazySrc}},h=U(Q),L=V(),ue=w(L);H(re);k(()=>{ue.logout();const e=f.currentRoute.value;if(e.name==="Login")return;const n=typeof e.fullPath=="string"&&e.fullPath.startsWith("/")?e.fullPath:A("dashboard");f.replace({name:"Login",query:{redirect:n}}).catch(()=>{})});h.directive("lazy",ie);h.use(L);h.use(f);h.mount("#app");export{ve as i,w as n,pe as r,P as t}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/MainLayout-CLxOFRXT.js","assets/js/dashboard-card-activitychart-CjJ1Boi_.js","assets/js/rolldown-runtime-DmMX61E0.js","assets/css/dashboard-card-activitychart-YGnIvisH.css","assets/js/dashboard-card-calendar-DWuV34Bn.js","assets/css/dashboard-card-calendar-CgD3w8x7.css","assets/js/dashboard-components-B8tHL6X6.js","assets/js/dashboard-card-news-BnyB_dHU.js","assets/css/dashboard-card-news-Dgf8YUcC.css","assets/css/dashboard-components-CuENf_SR.css","assets/js/vue-vendor-BUOVPpjf.js","assets/js/useRecentVisits-Cv1J7k25.js","assets/js/useVirtualScroll-DdYyc53Y.js","assets/css/MainLayout-BV_zkaqI.css"])))=>i.map(i=>d[i]); +import{F as O,Q as d,X as z,c as C,j as q,u as I,v as M}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{i as U}from"./dashboard-card-news-BnyB_dHU.js";import{B as A,F as D,I as F,J as N,K as k,P as B,R as b,U as W,W as H,c as x,l as K,q as V,w as m}from"./dashboard-card-calendar-DWuV34Bn.js";import{n as j,t as G}from"./vue-vendor-BUOVPpjf.js";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))a(r);new MutationObserver(r=>{for(const s of r)if(s.type==="childList")for(const i of s.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&a(i)}).observe(document,{childList:!0,subtree:!0});function t(r){const s={};return r.integrity&&(s.integrity=r.integrity),r.referrerPolicy&&(s.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?s.credentials="include":r.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function a(r){if(r.ep)return;r.ep=!0;const s=t(r);fetch(r.href,s)}})();var J=M({__name:"App",setup(e){return(n,t)=>{const a=O("router-view");return q(),I(a)}}}),Q=J,X=3500,u=z({loadingCount:0,message:{id:0,text:"",type:"info",visible:!1}}),p=null;function Y(){p!==null&&(globalThis.clearTimeout(p),p=null)}function Z(e){return typeof e!="number"||!Number.isFinite(e)||e<=0?X:e}function $(e){u.loadingCount=e?u.loadingCount+1:Math.max(0,u.loadingCount-1)}function ee(e,n="info",t){u.message.id+=1;const a=u.message.id;Y(),u.message.text=e,u.message.type=n,u.message.visible=!0,p=globalThis.setTimeout(()=>{u.message.id===a&&(u.message.visible=!1,p=null)},Z(t))}var pe=u,ve=C(()=>u.loadingCount>0),re={showLoading:$,showMessage:ee},te=300*1e3,w=N("auth",()=>{const e=d(!1),n=d(!0),t=d(null),a=d(null),r=d(0);let s=null;function i(){return r.value===0?!1:Date.now()-r.value{try{n.value=!0,t.value=null;const o=await m.checkAuthStatus();return e.value=o,r.value=Date.now(),o?await g():a.value=null,o}catch(o){return t.value=o instanceof Error?o.message:"认证检查失败",e.value=!1,a.value=null,!1}finally{n.value=!1,s=null}})(),s)}async function E(l,c){try{n.value=!0,t.value=null;const o=await m.login({username:l,password:c});return o.success?(e.value=!0,r.value=Date.now(),await g(l)):t.value=o.message||"登录失败",o}catch(o){return t.value=o instanceof Error?o.message:"登录失败",{success:!1,message:t.value}}finally{n.value=!1}}function R(){e.value=!1,a.value=null,t.value=null,r.value=0,s=null,typeof window<"u"&&sessionStorage.clear()}function T(){t.value=null}return{isAuthenticated:e,isLoading:n,error:t,user:a,checkAuth:S,login:E,logout:R,clearError:T}});function P(e,n,t="dashboard"){const a=A(t);if(typeof n!="string"||!n.startsWith("/"))return a;const r=e.resolve(n);return!r.matched.length||r.name==="Login"?a:r.fullPath.startsWith("/")?r.fullPath:a}var ae=B("Router");if(typeof window<"u"){const e=K(window.location);e&&window.history.replaceState(window.history.state,"",e)}var v=b("login"),ne=b(D),se=F.filter(e=>e.id!=="login").map(e=>({path:e.path.replace(/^\//,""),name:e.routeName,component:e.component,meta:{requiresAuth:e.requiresAuth}})),oe=[{path:v.path,name:v.routeName,component:v.component,meta:{requiresAuth:v.requiresAuth}},{path:"/",name:"Main",component:()=>W(()=>import("./MainLayout-CLxOFRXT.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13])),redirect:ne.path,children:se}],f=G({history:j(x),routes:oe});function y(e){return e.meta.requiresAuth===!1||e.name==="Login"}function _(e){return P(f,e.fullPath,"dashboard")}f.beforeEach(async(e,n,t)=>{const a=w();try{if(y(e)){if(e.name==="Login"&&(a.isAuthenticated||await a.checkAuth())){t(P(f,typeof e.query.redirect=="string"?e.query.redirect:null));return}t();return}if(!(a.isAuthenticated||await a.checkAuth())){t({name:"Login",query:{redirect:_(e)}});return}t()}catch(r){if(ae.error("Navigation guard error:",r),y(e)){t();return}t({name:"Login",query:{redirect:_(e)}})}});var ie={mounted(e,n){const t=n.value;if(!t)return;if(!("IntersectionObserver"in window)){e.src=t;return}e._lazySrc=t,e.src="";const a=new IntersectionObserver(r=>{r.forEach(s=>{if(s.isIntersecting){const i=s.target;i._lazySrc&&(i.src=i._lazySrc,delete i._lazySrc,a.unobserve(i),delete i._lazyObserver)}})},{rootMargin:"50px 0px",threshold:.01});a.observe(e),e._lazyObserver=a},beforeUnmount(e){e._lazyObserver&&(e._lazyObserver.disconnect(),delete e._lazyObserver),e._lazySrc&&delete e._lazySrc}},h=U(Q),L=V(),ue=w(L);H(re);k(()=>{ue.logout();const e=f.currentRoute.value;if(e.name==="Login")return;const n=typeof e.fullPath=="string"&&e.fullPath.startsWith("/")?e.fullPath:A("dashboard");f.replace({name:"Login",query:{redirect:n}}).catch(()=>{})});h.directive("lazy",ie);h.use(L);h.use(f);h.mount("#app");export{ve as i,w as n,pe as r,P as t}; diff --git a/AdminPanel-Vue/dist/assets/js/useMarkdownRenderer-BShYGq9a.js b/AdminPanel-Vue/dist/assets/js/useMarkdownRenderer-DLeytw2l.js similarity index 93% rename from AdminPanel-Vue/dist/assets/js/useMarkdownRenderer-BShYGq9a.js rename to AdminPanel-Vue/dist/assets/js/useMarkdownRenderer-DLeytw2l.js index 88e7850f8..2faae722d 100644 --- a/AdminPanel-Vue/dist/assets/js/useMarkdownRenderer-BShYGq9a.js +++ b/AdminPanel-Vue/dist/assets/js/useMarkdownRenderer-DLeytw2l.js @@ -1,2 +1,2 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/markdown-Di1VBEdP.js","assets/js/rolldown-runtime-DmMX61E0.js"])))=>i.map(i=>d[i]); -import{Q as l,c as m}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{U as f}from"./dashboard-card-calendar-CA3-tSpi.js";function w(){let a=null,o=null;const n=l(!1),i=l("");async function d(){if(!n.value)try{const[r,t]=await Promise.all([f(()=>import("./markdown-Di1VBEdP.js").then(e=>e.t),__vite__mapDeps([0,1])),f(()=>import("./markdown-Di1VBEdP.js").then(e=>e.r),__vite__mapDeps([0,1]))]);a=r,o=t,n.value=!0}catch(r){throw console.error("[useMarkdownRenderer] 初始化失败:",r),r}}function u(r){if(!r)return"";if(!a||!o)return console.warn("[useMarkdownRenderer] 渲染引擎未就绪,返回原始内容"),r;const t=a.marked.parse(r),e=typeof t=="string"?t:r,s=o.default.sanitize(e);return i.value=s,s}async function c(r){return r?(n.value||await d(),u(r)):""}return{isReady:n,renderedMarkdown:m(()=>i.value),renderMarkdownSync:u,renderMarkdown:c,initializeRenderer:d}}export{w as t}; +import{Q as l,c as m}from"./dashboard-card-activitychart-CjJ1Boi_.js";import{U as f}from"./dashboard-card-calendar-DWuV34Bn.js";function w(){let a=null,o=null;const n=l(!1),i=l("");async function d(){if(!n.value)try{const[r,t]=await Promise.all([f(()=>import("./markdown-Di1VBEdP.js").then(e=>e.t),__vite__mapDeps([0,1])),f(()=>import("./markdown-Di1VBEdP.js").then(e=>e.r),__vite__mapDeps([0,1]))]);a=r,o=t,n.value=!0}catch(r){throw console.error("[useMarkdownRenderer] 初始化失败:",r),r}}function u(r){if(!r)return"";if(!a||!o)return console.warn("[useMarkdownRenderer] 渲染引擎未就绪,返回原始内容"),r;const t=a.marked.parse(r),e=typeof t=="string"?t:r,s=o.default.sanitize(e);return i.value=s,s}async function c(r){return r?(n.value||await d(),u(r)):""}return{isReady:n,renderedMarkdown:m(()=>i.value),renderMarkdownSync:u,renderMarkdown:c,initializeRenderer:d}}export{w as t}; diff --git a/AdminPanel-Vue/dist/assets/js/useRecentVisits-ryn7iNG7.js b/AdminPanel-Vue/dist/assets/js/useRecentVisits-Cv1J7k25.js similarity index 94% rename from AdminPanel-Vue/dist/assets/js/useRecentVisits-ryn7iNG7.js rename to AdminPanel-Vue/dist/assets/js/useRecentVisits-Cv1J7k25.js index 532179a25..141bc6adf 100644 --- a/AdminPanel-Vue/dist/assets/js/useRecentVisits-ryn7iNG7.js +++ b/AdminPanel-Vue/dist/assets/js/useRecentVisits-Cv1J7k25.js @@ -1 +1 @@ -import{a as u}from"./dashboard-components-LHqMn0M5.js";var l="sidebarRecentVisits";var f="navigationUsage";function s(n){return n.manifest.name||n.name}function N(n){return n.manifest.displayName?.trim()||s(n)}function m(n,t){return n.find(a=>s(a)===t)}function v({target:n,navItems:t,plugins:a,pluginName:e}){if(e){const i=m(a,e);return i?{target:`plugin-${e}-config`,label:N(i),icon:i.manifest.icon||"extension",pluginName:e}:null}const r=t.find(i=>i.target===n&&i.label);return r?.label?{target:n,label:r.label,icon:r.icon,pluginName:r.pluginName}:null}function E(n,t,a=5){return[t,...n.filter(e=>t.pluginName?e.pluginName!==t.pluginName:e.target!==t.target)].slice(0,a)}function I(n,t){return t?`plugin:${t}`:`page:${n}`}function R(n,{target:t,pluginName:a,timestamp:e=Date.now()}){const r=I(t,a),i=n[r];return{...n,[r]:{count:(i?.count??0)+1,lastVisitedAt:e}}}function S({target:n,navItems:t,plugins:a,recentVisits:e,navigationUsage:r,pluginName:i,timestamp:c}){const g=R(r,{target:n,pluginName:i,timestamp:c}),o=v({target:n,navItems:t,plugins:a,pluginName:i});return{recentVisits:o?E(e,o):[...e],navigationUsage:g}}function T(){return u(l,[])}function _(){return u(f,{})}export{T as i,S as n,_ as r,I as t}; +import{a as u}from"./dashboard-components-B8tHL6X6.js";var l="sidebarRecentVisits";var f="navigationUsage";function s(n){return n.manifest.name||n.name}function N(n){return n.manifest.displayName?.trim()||s(n)}function m(n,t){return n.find(a=>s(a)===t)}function v({target:n,navItems:t,plugins:a,pluginName:e}){if(e){const i=m(a,e);return i?{target:`plugin-${e}-config`,label:N(i),icon:i.manifest.icon||"extension",pluginName:e}:null}const r=t.find(i=>i.target===n&&i.label);return r?.label?{target:n,label:r.label,icon:r.icon,pluginName:r.pluginName}:null}function E(n,t,a=5){return[t,...n.filter(e=>t.pluginName?e.pluginName!==t.pluginName:e.target!==t.target)].slice(0,a)}function I(n,t){return t?`plugin:${t}`:`page:${n}`}function R(n,{target:t,pluginName:a,timestamp:e=Date.now()}){const r=I(t,a),i=n[r];return{...n,[r]:{count:(i?.count??0)+1,lastVisitedAt:e}}}function S({target:n,navItems:t,plugins:a,recentVisits:e,navigationUsage:r,pluginName:i,timestamp:c}){const g=R(r,{target:n,pluginName:i,timestamp:c}),o=v({target:n,navItems:t,plugins:a,pluginName:i});return{recentVisits:o?E(e,o):[...e],navigationUsage:g}}function T(){return u(l,[])}function _(){return u(f,{})}export{T as i,S as n,_ as r,I as t}; diff --git a/AdminPanel-Vue/dist/index.html b/AdminPanel-Vue/dist/index.html index d66df96ea..2f434f50a 100644 --- a/AdminPanel-Vue/dist/index.html +++ b/AdminPanel-Vue/dist/index.html @@ -13,10 +13,10 @@ })(); - + - + diff --git a/AdminPanel-Vue/src/api/dynamicTools.ts b/AdminPanel-Vue/src/api/dynamicTools.ts index 05afd5fcf..b723069de 100644 --- a/AdminPanel-Vue/src/api/dynamicTools.ts +++ b/AdminPanel-Vue/src/api/dynamicTools.ts @@ -55,6 +55,7 @@ export interface DynamicToolsState { initialized: boolean; snapshotId: number; queueSize: number; + isClassifying: boolean; lastError: string | null; config: DynamicToolsConfig; records: DynamicToolRecord[]; @@ -111,13 +112,17 @@ export const dynamicToolsApi = { async rebuild( mode: DynamicToolsRebuildMode, - uiOptions: RequestUiOptions = {} + uiOptions: RequestUiOptions = {}, + options: { wait?: boolean } = {} ): Promise { const response = await requestWithUi( { url: "/admin_api/dynamic-tools/rebuild", method: "POST", - body: { mode }, + body: { + mode, + wait: options.wait !== false, + }, }, uiOptions ); diff --git a/AdminPanel-Vue/src/platform/http/httpClient.ts b/AdminPanel-Vue/src/platform/http/httpClient.ts index a8900ebd2..815edecfc 100644 --- a/AdminPanel-Vue/src/platform/http/httpClient.ts +++ b/AdminPanel-Vue/src/platform/http/httpClient.ts @@ -74,7 +74,7 @@ function createTimeoutSignal(timeoutMs?: number): { const controller = new AbortController(); const timer = globalThis.setTimeout(() => { - controller.abort(); + controller.abort(createAbortError(`Request timed out after ${timeoutMs}ms`)); }, timeoutMs); return { @@ -100,15 +100,15 @@ function mergeAbortSignals(signals: Array): { const controller = new AbortController(); - const abort = () => { + const abort = (reason?: unknown) => { if (!controller.signal.aborted) { - controller.abort(); + controller.abort(reason); } }; for (const signal of availableSignals) { if (signal.aborted) { - abort(); + abort(signal.reason); return { signal: controller.signal, cleanup: () => undefined, @@ -117,7 +117,7 @@ function mergeAbortSignals(signals: Array): { } const listeners = availableSignals.map((signal) => { - const handleAbort = () => abort(); + const handleAbort = () => abort(signal.reason); signal.addEventListener("abort", handleAbort, { once: true }); return { signal, diff --git a/AdminPanel-Vue/src/views/DynamicToolsManager.vue b/AdminPanel-Vue/src/views/DynamicToolsManager.vue index b7d312b98..501e9fe96 100644 --- a/AdminPanel-Vue/src/views/DynamicToolsManager.vue +++ b/AdminPanel-Vue/src/views/DynamicToolsManager.vue @@ -29,6 +29,7 @@
分类队列 {{ state?.queueSize ?? 0 }} + 后台分类中
快照 @@ -145,15 +146,15 @@

分类维护

- - - @@ -245,7 +246,7 @@