secagentx 3.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- backend/__init__.py +1 -0
- backend/__main__.py +3 -0
- backend/_assets/config.yaml +195 -0
- backend/_assets/frontend/dist/assets/AgentsView-DFqRplI8.css +1 -0
- backend/_assets/frontend/dist/assets/AgentsView-DJTpfQ87.js +1 -0
- backend/_assets/frontend/dist/assets/AttackChainView-BVfI-SC6.js +1 -0
- backend/_assets/frontend/dist/assets/ChatView-Bg4nIlQ0.css +1 -0
- backend/_assets/frontend/dist/assets/ChatView-CRndtmEC.js +38 -0
- backend/_assets/frontend/dist/assets/DashboardView-BXs4AWv8.js +1 -0
- backend/_assets/frontend/dist/assets/DashboardView-WnHWiqBW.css +1 -0
- backend/_assets/frontend/dist/assets/EventDetailView-DQk6Qp7-.js +1 -0
- backend/_assets/frontend/dist/assets/EventDetailView-Dj-a-zWr.css +1 -0
- backend/_assets/frontend/dist/assets/EventsView-8xh8uKO0.js +1 -0
- backend/_assets/frontend/dist/assets/EventsView-BHfFn66K.css +1 -0
- backend/_assets/frontend/dist/assets/KnowledgeView-C2N3v9bF.css +1 -0
- backend/_assets/frontend/dist/assets/KnowledgeView-D54ODoC9.js +11 -0
- backend/_assets/frontend/dist/assets/LoginView-CjvFmo7C.js +1 -0
- backend/_assets/frontend/dist/assets/LoginView-D14FzcsP.css +1 -0
- backend/_assets/frontend/dist/assets/SettingsView-JOJuoABi.js +1 -0
- backend/_assets/frontend/dist/assets/UsersView-DhMXZhir.js +1 -0
- backend/_assets/frontend/dist/assets/_plugin-vue_export-helper-BDNMzG2s.js +1 -0
- backend/_assets/frontend/dist/assets/index-D9Su3fYY.css +1 -0
- backend/_assets/frontend/dist/assets/index-DBEjbyJR.js +4 -0
- backend/_assets/frontend/dist/assets/rolldown-runtime-DK3Fl9T5.js +1 -0
- backend/_assets/frontend/dist/assets/vendor-charts-Dh1nChzO.js +39 -0
- backend/_assets/frontend/dist/assets/vendor-icons-BTNgi7vU.js +1 -0
- backend/_assets/frontend/dist/assets/vendor-ui-Cdd65KTN.js +7367 -0
- backend/_assets/frontend/dist/assets/vendor-vue-CXKcZAmz.js +1 -0
- backend/_assets/frontend/dist/index.html +51 -0
- backend/_assets/frontend/index.html +46 -0
- backend/_assets/frontend/package-lock.json +2983 -0
- backend/_assets/frontend/package.json +37 -0
- backend/_assets/frontend/src/App.vue +231 -0
- backend/_assets/frontend/src/main.js +12 -0
- backend/_assets/frontend/src/router/index.js +117 -0
- backend/_assets/frontend/src/stores/chat.js +671 -0
- backend/_assets/frontend/src/styles/tokens.css +282 -0
- backend/_assets/frontend/src/utils/http.js +191 -0
- backend/_assets/frontend/src/views/AgentsView.vue +227 -0
- backend/_assets/frontend/src/views/AttackChainView.vue +210 -0
- backend/_assets/frontend/src/views/ChatView.vue +1107 -0
- backend/_assets/frontend/src/views/DashboardView.vue +514 -0
- backend/_assets/frontend/src/views/EventDetailView.vue +387 -0
- backend/_assets/frontend/src/views/EventsView.vue +253 -0
- backend/_assets/frontend/src/views/KnowledgeView.vue +883 -0
- backend/_assets/frontend/src/views/LoginView.vue +314 -0
- backend/_assets/frontend/src/views/SettingsView.vue +226 -0
- backend/_assets/frontend/src/views/UsersView.vue +235 -0
- backend/_assets/frontend/vite.config.js +55 -0
- backend/_assets/knowledge_data/compliance/regulations.json +383 -0
- backend/_assets/knowledge_data/cve/vulnerabilities.json +70720 -0
- backend/_assets/knowledge_data/mitre_attack/techniques.json +14097 -0
- backend/_assets/knowledge_data/remediation/remediation.json +574 -0
- backend/_assets/knowledge_data/threat_intel/actors.json +1602 -0
- backend/_assets/knowledge_data/threat_intel/malware.json +971 -0
- backend/agents/__init__.py +1 -0
- backend/agents/alert_filter/__init__.py +1 -0
- backend/agents/alert_filter/alert_filter_agent.py +88 -0
- backend/agents/analyst.py +331 -0
- backend/agents/base.py +553 -0
- backend/agents/classifier_agent.py +134 -0
- backend/agents/cot_engine.py +578 -0
- backend/agents/intel.py +46 -0
- backend/agents/knowledge/__init__.py +2 -0
- backend/agents/knowledge/agentic_rag.py +928 -0
- backend/agents/knowledge/knowledge_agent.py +47 -0
- backend/agents/registry.py +148 -0
- backend/agents/responder.py +51 -0
- backend/agents/summary_agent.py +219 -0
- backend/auto_ingestor.py +948 -0
- backend/auto_patrol.py +452 -0
- backend/cli_app.py +523 -0
- backend/config/__init__.py +20 -0
- backend/config/provider_profiles.py +416 -0
- backend/config/runtime_settings.py +84 -0
- backend/decision_fusion/__init__.py +32 -0
- backend/decision_fusion/base.py +127 -0
- backend/decision_fusion/dempster_shafer.py +419 -0
- backend/decision_fusion/weighted_average.py +141 -0
- backend/email_ingestor.py +588 -0
- backend/errors.py +243 -0
- backend/escalation.py +453 -0
- backend/evaluation/__init__.py +7 -0
- backend/evaluation/evaluator.py +197 -0
- backend/evaluation/metrics.py +210 -0
- backend/federation/__init__.py +22 -0
- backend/federation/core.py +743 -0
- backend/interface/__init__.py +1 -0
- backend/interface/api_server.py +1830 -0
- backend/interface/cli.py +671 -0
- backend/knowledge/__init__.py +11 -0
- backend/knowledge/compliance.py +101 -0
- backend/knowledge/cve_db.py +100 -0
- backend/knowledge/mitre_attack.py +457 -0
- backend/knowledge/remediation.py +84 -0
- backend/knowledge/threat_intel_kb.py +246 -0
- backend/llm/__init__.py +1 -0
- backend/llm/anthropic_compatible.py +191 -0
- backend/llm/base.py +81 -0
- backend/llm/deepseek.py +221 -0
- backend/llm/fallback.py +268 -0
- backend/llm/mock.py +204 -0
- backend/llm/openai_compatible.py +51 -0
- backend/llm/provider.py +217 -0
- backend/llm/qwen.py +218 -0
- backend/main.py +421 -0
- backend/memory/__init__.py +1 -0
- backend/memory/episodic_memory.py +132 -0
- backend/memory/manager.py +204 -0
- backend/memory/semantic_memory.py +156 -0
- backend/memory/session_memory.py +102 -0
- backend/ml_model/__init__.py +23 -0
- backend/ml_model/pipeline.py +191 -0
- backend/ml_model/trainer.py +627 -0
- backend/models/__init__.py +1 -0
- backend/models/event.py +62 -0
- backend/models/message.py +58 -0
- backend/models/output.py +1216 -0
- backend/monitoring/metrics.py +184 -0
- backend/orchestrator/__init__.py +17 -0
- backend/orchestrator/agent_router.py +145 -0
- backend/orchestrator/core.py +159 -0
- backend/orchestrator/dynamic_weights.py +287 -0
- backend/orchestrator/react_loop.py +1895 -0
- backend/orchestrator/risk_model.py +494 -0
- backend/orchestrator/risk_scorer.py +356 -0
- backend/reasoner/__init__.py +19 -0
- backend/reasoner/reasoner.py +316 -0
- backend/runtime_assets.py +45 -0
- backend/security/__init__.py +24 -0
- backend/security/adversarial/__init__.py +13 -0
- backend/security/adversarial/guard.py +121 -0
- backend/security/adversarial/redteam.py +121 -0
- backend/security/adversarial/scanner.py +208 -0
- backend/security/audit.py +118 -0
- backend/security/auth.py +283 -0
- backend/security/circuit_breaker.py +212 -0
- backend/security/dispatch.py +18 -0
- backend/security/ratelimit.py +237 -0
- backend/security/rbac.py +431 -0
- backend/security/refresh_sessions.py +193 -0
- backend/security/sanitizer.py +32 -0
- backend/storage/__init__.py +1 -0
- backend/storage/chroma_store.py +79 -0
- backend/storage/database.py +296 -0
- backend/storage/migrations/env.py +65 -0
- backend/storage/migrations/versions/0001_initial_schema.py +101 -0
- backend/storage/migrations/versions/0002_add_agent_logs_experiences.py +53 -0
- backend/storage/migrations/versions/0003_add_conversation_owner.py +30 -0
- backend/storage/models.py +194 -0
- backend/storage/repositories/__init__.py +1 -0
- backend/storage/repositories/asset_repo.py +86 -0
- backend/storage/repositories/conversation_repo.py +216 -0
- backend/storage/repositories/event_repo.py +76 -0
- backend/storage/repositories/trajectory_repo.py +324 -0
- backend/storage/retention.py +117 -0
- backend/tools/__init__.py +16 -0
- backend/tools/alert_filter.py +208 -0
- backend/tools/aliyun_firewall.py +237 -0
- backend/tools/aws_firewall.py +369 -0
- backend/tools/base.py +445 -0
- backend/tools/calling.py +207 -0
- backend/tools/cve_search.py +77 -0
- backend/tools/execution_engine.py +202 -0
- backend/tools/firewall.py +387 -0
- backend/tools/geoip.py +168 -0
- backend/tools/log_analyzer.py +185 -0
- backend/tools/ml_detector.py +226 -0
- backend/tools/registry.py +38 -0
- backend/tools/tencent_firewall.py +300 -0
- backend/tools/threat_intel.py +732 -0
- backend/tools/trust_checker.py +76 -0
- backend/utils/__init__.py +5 -0
- backend/utils/config_loader.py +164 -0
- backend/utils/env.py +75 -0
- backend/utils/logger.py +150 -0
- backend/utils/text.py +32 -0
- secagentx-3.0.0.dist-info/METADATA +325 -0
- secagentx-3.0.0.dist-info/RECORD +182 -0
- secagentx-3.0.0.dist-info/WHEEL +5 -0
- secagentx-3.0.0.dist-info/entry_points.txt +2 -0
- secagentx-3.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.event-detail-page[data-v-6e2fd2cb]{height:calc(100vh - var(--header-height));padding:24px;overflow-y:auto}.detail-loading[data-v-6e2fd2cb]{justify-content:center;align-items:center;height:60vh;display:flex}.detail-empty[data-v-6e2fd2cb]{height:60vh;color:var(--text-muted);flex-direction:column;justify-content:center;align-items:center;gap:12px;display:flex}.detail-empty-icon[data-v-6e2fd2cb]{background:var(--bg-elevated);width:48px;height:48px;color:var(--text-muted);border-radius:50%;justify-content:center;align-items:center;font-size:20px;font-weight:700;display:flex}.breadcrumb[data-v-6e2fd2cb]{align-items:center;gap:8px;margin-bottom:20px;font-size:13px;display:flex}.breadcrumb-sep[data-v-6e2fd2cb]{color:var(--text-muted);opacity:.4}.breadcrumb-current[data-v-6e2fd2cb]{color:var(--info);font-weight:600}.detail-card[data-v-6e2fd2cb]{margin-bottom:16px}.event-header-card[data-v-6e2fd2cb]{flex-wrap:wrap;align-items:center;gap:16px;padding:20px;display:flex}.header-accent[data-v-6e2fd2cb]{border-radius:2px;flex-shrink:0;width:4px;height:36px}.event-title-large[data-v-6e2fd2cb]{color:var(--text-primary);font-size:20px;font-weight:700}.event-title-sub[data-v-6e2fd2cb]{color:var(--text-tertiary);margin-top:2px;font-size:13px}.info-grid[data-v-6e2fd2cb]{grid-template-columns:1fr 1fr;gap:20px;display:grid}.info-label[data-v-6e2fd2cb]{color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:4px;font-size:11px;font-weight:600}.info-value[data-v-6e2fd2cb]{color:var(--text-secondary);font-size:14px;font-weight:500}.info-value-lg[data-v-6e2fd2cb]{font-size:18px;font-weight:700}.conf-bar-wrap[data-v-6e2fd2cb]{align-items:center;gap:10px;display:flex}.conf-bar-track[data-v-6e2fd2cb]{background:var(--bg-elevated);border-radius:4px;flex:1;max-width:140px;height:8px;overflow:hidden}.conf-bar-fill[data-v-6e2fd2cb]{border-radius:4px;height:100%}.tech-tag[data-v-6e2fd2cb]{border-radius:var(--radius-sm);color:var(--warning);border:1px solid var(--border-primary);cursor:pointer;transition:all var(--transition-fast);background:#1e3a5f80;padding:3px 10px;font-size:11px;font-weight:600}.tech-tag[data-v-6e2fd2cb]:hover{border-color:var(--warning)}.ip-value[data-v-6e2fd2cb]{font-size:13px;font-family:var(--font-mono);color:var(--info)}.copy-btn[data-v-6e2fd2cb]{width:24px;height:24px;color:var(--text-muted);cursor:pointer;transition:all var(--transition-fast);background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;display:inline-flex}.copy-btn[data-v-6e2fd2cb]:hover{background:var(--bg-card-hover);color:var(--text-tertiary)}.timeline-section[data-v-6e2fd2cb]{margin-bottom:16px}.timeline[data-v-6e2fd2cb]{padding-left:28px;position:relative}.timeline[data-v-6e2fd2cb]:before{content:"";background:var(--border-primary);width:2px;position:absolute;top:8px;bottom:8px;left:9px}.timeline-item[data-v-6e2fd2cb]{padding:0 0 20px 20px;position:relative}.timeline-item[data-v-6e2fd2cb]:last-child{padding-bottom:0}.timeline-dot[data-v-6e2fd2cb]{background:var(--bg-card);border:2px solid;border-radius:50%;justify-content:center;align-items:center;width:16px;height:16px;display:flex;position:absolute;top:4px;left:-24px}.timeline-dot-inner[data-v-6e2fd2cb]{border-radius:50%;width:6px;height:6px}.timeline-time[data-v-6e2fd2cb]{color:var(--text-muted);font-size:11px;font-family:var(--font-mono)}.timeline-title[data-v-6e2fd2cb]{color:var(--text-primary);margin-top:2px;font-size:13px;font-weight:600}.timeline-desc[data-v-6e2fd2cb]{color:var(--text-tertiary);margin-top:2px;font-size:12px}.ioc-item[data-v-6e2fd2cb]{border-radius:var(--radius-sm);border:1px solid var(--border-primary);background:var(--bg-primary);align-items:center;gap:8px;padding:8px 12px;display:flex}.ioc-type[data-v-6e2fd2cb]{text-transform:uppercase;min-width:36px;font-size:11px;font-weight:700}.ioc-value[data-v-6e2fd2cb]{font-size:12px;font-family:var(--font-mono);color:#a5d6ff;background:var(--bg-elevated);border-radius:3px;flex:1;padding:2px 8px}.rec-item[data-v-6e2fd2cb]{border-radius:var(--radius-sm);border:1px solid var(--border-primary);background:var(--bg-primary);align-items:flex-start;gap:12px;padding:12px 16px;display:flex}.rec-num[data-v-6e2fd2cb]{background:var(--success-bg);width:22px;height:22px;color:var(--success);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;margin-top:1px;font-size:12px;font-weight:700;display:flex}.rec-text[data-v-6e2fd2cb]{color:var(--text-secondary);flex:1;font-size:13px;line-height:1.5}.rec-btn[data-v-6e2fd2cb]{border:1px solid var(--border-primary);border-radius:var(--radius-sm);color:var(--info);cursor:pointer;transition:all var(--transition-fast);background:0 0;padding:2px 10px;font-size:11px}.rec-btn[data-v-6e2fd2cb]:hover{border-color:var(--info);background:var(--info-bg)}.bayes-row[data-v-6e2fd2cb]{align-items:center;gap:12px;display:flex}.bayes-label[data-v-6e2fd2cb]{color:var(--text-muted);min-width:60px;font-size:11px}.bayes-bar[data-v-6e2fd2cb]{border-radius:2px;width:60px;height:4px}.bayes-val[data-v-6e2fd2cb]{color:var(--text-primary);font-size:12px;font-weight:600}.detail-skeleton[data-v-6e2fd2cb]{padding:24px}.sk-block[data-v-6e2fd2cb]{border-radius:var(--radius-md);background:linear-gradient(90deg, var(--border-primary) 25%, var(--bg-card-hover) 50%, var(--border-primary) 75%);background-size:200% 100%;height:60px;margin-bottom:16px;animation:1.8s ease-in-out infinite skeleton-pulse}.sk-block-sm[data-v-6e2fd2cb]{height:200px}@media (width<=768px){.event-detail-page[data-v-6e2fd2cb]{padding:12px!important}.event-header-card[data-v-6e2fd2cb]{flex-direction:column!important;align-items:flex-start!important;gap:8px!important}.info-grid[data-v-6e2fd2cb]{grid-template-columns:1fr!important;gap:8px!important}.event-title-large[data-v-6e2fd2cb]{font-size:16px!important}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{C as e,E as t,Ht as n,K as r,S as i,T as a,Ut as o,Wt as s,Y as c,Z as l,_ as u,_t as d,k as f,st as p}from"./vendor-icons-BTNgi7vU.js";import{f as m,p as h}from"./vendor-ui-Cdd65KTN.js";import{i as g}from"./vendor-vue-CXKcZAmz.js";import{r as _}from"./index-DBEjbyJR.js";import{t as v}from"./_plugin-vue_export-helper-BDNMzG2s.js";var ee={class:`events-page`},te={class:`events-header`},ne={class:`header-top`},re={class:`header-left`},ie={class:`event-count`},ae={class:`filter-bar`},oe={class:`search-box`},y={key:0,class:`table-skeleton`},b={key:1,class:`table-card`},x={class:`event-table`},S=[`onClick`],C={class:`col-time`},w={class:`time-text`},T={class:`col-event`},E={class:`event-cell`},D={class:`event-title-text`},O={key:0,class:`ip-tag`},k={class:`col-attack`},A={key:0,class:`attack-id`},j={key:1,class:`attack-na`},M={class:`col-conf`},N={class:`conf-cell`},P={class:`conf-bar`},F={class:`col-assoc`},I={class:`assoc-cell`},L={key:0,class:`badge badge-cve`,title:`关联漏洞`},R={key:1,class:`badge badge-apt`,title:`威胁组织`},se={key:2,class:`badge badge-malware`,title:`恶意软件`},z={key:3,class:`badge badge-high`,title:`高置信度威胁`},B={class:`col-status`},V={class:`col-risk`},H={key:0},U=v({__name:`EventsView`,setup(v){let U=g(),W=d([]),G=d(!0),K=d(``),q=d(``),J=d(``);function ce(){let e=localStorage.getItem(`secagentx_token`);return e?{Authorization:`Bearer ${e}`}:{}}let Y=i(()=>{let e=W.value;if(K.value){let t=K.value.toLowerCase();e=e.filter(e=>(e.title||``).toLowerCase().includes(t)||(e.source_ip||``).toLowerCase().includes(t))}return q.value&&(e=e.filter(e=>e.severity===q.value)),J.value&&(e=e.filter(e=>e.status===J.value)),e});async function X(){G.value=!0;try{let e=await fetch(_(`/api/events`),{headers:ce()});if(e.ok){let t=await e.json();if(t.events?.length){W.value=t.events.map(e=>({...e,confidence:e.confidence??.85,techniques:e.techniques?.length?e.techniques:[{id:e.technique_id||`-`,confidence:.85}]})),G.value=!1;return}}}catch{}W.value=[],G.value=!1}function le(e){let t=(e||``).match(/(\d{2}:\d{2})/);return t?t[1]:e}function Z(e){return e?.length?e.reduce((e,t)=>(e.confidence||0)>(t.confidence||0)?e:t):{id:`-`,confidence:0}}function Q(e){return{紧急:`var(--error)`,高危:`#f97316`,中危:`var(--warning)`,低危:`var(--success)`}[e]||`var(--text-muted)`}function $(e){return{紧急:`CRITICAL`,高危:`HIGH`,中危:`MEDIUM`,低危:`LOW`}[e]||(e||``).toUpperCase()}function ue(e){return{open:`OPEN`,investigating:`INVESTIGATING`,resolved:`RESOLVED`}[e]||(e||``).toUpperCase()}function de(e){return e>=.8?`var(--success)`:e>=.6?`var(--warning)`:`var(--error)`}function fe(e){return e>=.8?`var(--success)`:e>=.6?`var(--warning)`:`var(--error)`}function pe(e){U.push(`/events/${e.id}`)}return r(X),(r,i)=>(c(),t(`div`,ee,[e(`div`,te,[e(`div`,ne,[e(`div`,re,[i[3]||=e(`div`,{class:`page-title`},`安全事件`,-1),e(`span`,ie,s(Y.value.length)+` 条`,1)])]),e(`div`,ae,[e(`div`,oe,[i[4]||=e(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[e(`circle`,{cx:`11`,cy:`11`,r:`8`}),e(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})],-1),p(e(`input`,{"onUpdate:modelValue":i[0]||=e=>K.value=e,class:`search-input`,placeholder:`搜索事件标题、IP...`},null,512),[[h,K.value]])]),p(e(`select`,{"onUpdate:modelValue":i[1]||=e=>q.value=e,class:`filter-select`},[...i[5]||=[f(`<option value="" data-v-1918c8c1>全部风险</option><option value="紧急" data-v-1918c8c1>紧急</option><option value="高危" data-v-1918c8c1>高危</option><option value="中危" data-v-1918c8c1>中危</option><option value="低危" data-v-1918c8c1>低危</option>`,5)]],512),[[m,q.value]]),p(e(`select`,{"onUpdate:modelValue":i[2]||=e=>J.value=e,class:`filter-select`},[...i[6]||=[e(`option`,{value:``},`全部状态`,-1),e(`option`,{value:`open`},`OPEN`,-1),e(`option`,{value:`investigating`},`INVESTIGATING`,-1),e(`option`,{value:`resolved`},`RESOLVED`,-1)]],512),[[m,J.value]]),e(`button`,{class:n([`refresh-btn`,{spinning:G.value}]),onClick:X},[(c(),t(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`,class:n({spin:G.value})},[...i[7]||=[e(`polyline`,{points:`23 4 23 10 17 10`},null,-1),e(`path`,{d:`M20.49 15a9 9 0 1 1-2.12-9.36L23 10`},null,-1)]],2))],2)])]),G.value&&W.value.length===0?(c(),t(`div`,y,[(c(),t(u,null,l(5,t=>e(`div`,{key:t,class:`skeleton-row`,style:o({animationDelay:t*.08+`s`})},[...i[8]||=[f(`<div class="sk-cell w-16" data-v-1918c8c1></div><div class="sk-cell w-40" data-v-1918c8c1></div><div class="sk-cell w-20" data-v-1918c8c1></div><div class="sk-cell w-24" data-v-1918c8c1></div><div class="sk-cell w-20" data-v-1918c8c1></div><div class="sk-cell w-16" data-v-1918c8c1></div>`,6)]],4)),64))])):(c(),t(`div`,b,[e(`table`,x,[i[10]||=e(`thead`,null,[e(`tr`,null,[e(`th`,{class:`col-time`},`Time`),e(`th`,{class:`col-event`},`Event`),e(`th`,{class:`col-attack`},`ATT&CK`),e(`th`,{class:`col-conf`},`Confidence`),e(`th`,{class:`col-assoc`},`Associations`),e(`th`,{class:`col-status`},`Status`),e(`th`,{class:`col-risk`},`Risk`)])],-1),e(`tbody`,null,[(c(!0),t(u,null,l(Y.value,r=>(c(),t(`tr`,{key:r.id||r.title,class:`event-row`,onClick:e=>pe(r)},[e(`td`,C,[e(`span`,w,s(le(r.created_at)),1)]),e(`td`,T,[e(`div`,E,[e(`span`,{class:`severity-dot`,style:o({background:Q(r.severity)})},null,4),e(`span`,D,s(r.title),1),r.source_ip?(c(),t(`code`,O,s(r.source_ip),1)):a(``,!0)])]),e(`td`,k,[Z(r.techniques).id===`-`?(c(),t(`span`,j,`-`)):(c(),t(`span`,A,s(Z(r.techniques).id),1))]),e(`td`,M,[e(`div`,N,[e(`div`,P,[e(`div`,{class:`conf-fill`,style:o({width:Math.round((r.confidence||0)*100)+`%`,background:de(r.confidence)})},null,4)]),e(`span`,{class:`conf-text`,style:o({color:fe(r.confidence)})},s(Math.round((r.confidence||0)*100))+`%`,5)])]),e(`td`,F,[e(`div`,I,[r.cve_id?(c(),t(`span`,L,s(r.cve_id),1)):a(``,!0),r.actor_name?(c(),t(`span`,R,s(r.actor_name),1)):a(``,!0),r.malware_name?(c(),t(`span`,se,s(r.malware_name),1)):a(``,!0),r.threat_level===`high`?(c(),t(`span`,z,`HIGH`)):a(``,!0)])]),e(`td`,B,[e(`span`,{class:n([`status-tag`,`st-`+r.status])},s(ue(r.status)),3)]),e(`td`,V,[e(`span`,{class:`risk-text`,style:o({color:Q(r.severity)})},s($(r.severity)),5)])],8,S))),128)),Y.value.length===0?(c(),t(`tr`,H,[...i[9]||=[e(`td`,{colspan:`7`,class:`empty-row`},`暂无匹配事件`,-1)]])):a(``,!0)])])]))]))}},[[`__scopeId`,`data-v-1918c8c1`]]);export{U as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.events-page[data-v-1918c8c1]{height:calc(100vh - var(--header-height));flex-direction:column;padding:20px;display:flex}.events-header[data-v-1918c8c1]{flex-shrink:0;margin-bottom:16px}.header-top[data-v-1918c8c1]{align-items:center;margin-bottom:12px;display:flex}.header-left[data-v-1918c8c1]{align-items:center;gap:10px;display:flex}.page-title[data-v-1918c8c1]{color:var(--text-primary);font-size:18px;font-weight:700}.event-count[data-v-1918c8c1]{border-radius:var(--radius-full);background:var(--bg-elevated);color:var(--text-tertiary);padding:2px 10px;font-size:11px;font-weight:500}.filter-bar[data-v-1918c8c1]{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.search-box[data-v-1918c8c1]{background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-sm);min-width:200px;max-width:360px;color:var(--text-muted);transition:border-color var(--transition-fast);flex:1;align-items:center;gap:8px;padding:6px 12px;display:flex}.search-box[data-v-1918c8c1]:focus-within{border-color:var(--accent)}.search-input[data-v-1918c8c1]{color:var(--text-primary);background:0 0;border:none;outline:none;flex:1;font-size:13px}.search-input[data-v-1918c8c1]::placeholder{color:var(--text-muted)}.filter-select[data-v-1918c8c1]{background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-sm);color:var(--text-secondary);cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;outline:none;padding:6px 28px 6px 10px;font-size:12px}.filter-select[data-v-1918c8c1]:hover{border-color:var(--border-hover)}.filter-select option[data-v-1918c8c1]{background:var(--bg-card);color:var(--text-primary)}.refresh-btn[data-v-1918c8c1]{background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-sm);width:32px;height:32px;color:var(--text-muted);cursor:pointer;transition:all var(--transition-fast);justify-content:center;align-items:center;display:flex}.refresh-btn[data-v-1918c8c1]:hover{border-color:var(--accent);color:var(--accent)}.refresh-btn.spinning[data-v-1918c8c1]{opacity:.6}.spin[data-v-1918c8c1]{animation:1s linear infinite spin-1918c8c1}@keyframes spin-1918c8c1{to{transform:rotate(360deg)}}.table-skeleton[data-v-1918c8c1]{flex:1}.skeleton-row[data-v-1918c8c1]{border-bottom:1px solid var(--border-primary);gap:12px;padding:14px 16px;animation:1.8s ease-in-out infinite skeleton-pulse;display:flex}.sk-cell[data-v-1918c8c1]{background:var(--bg-card-hover);border-radius:4px;height:14px}.w-16[data-v-1918c8c1]{width:60px}.w-20[data-v-1918c8c1]{width:80px}.w-24[data-v-1918c8c1]{width:100px}.w-40[data-v-1918c8c1]{width:200px}.table-card[data-v-1918c8c1]{background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-md);flex:1;overflow-y:auto}.event-table[data-v-1918c8c1]{border-collapse:collapse;width:100%;font-size:13px}.event-table thead[data-v-1918c8c1]{z-index:1;position:sticky;top:0}.event-table th[data-v-1918c8c1]{text-align:left;color:var(--text-muted);letter-spacing:.5px;background:var(--bg-elevated);border-bottom:1px solid var(--border-primary);text-transform:uppercase;padding:10px 14px;font-size:10px;font-weight:600}.event-table td[data-v-1918c8c1]{border-bottom:1px solid var(--border-primary);color:var(--text-secondary);padding:10px 14px}.event-row[data-v-1918c8c1]{cursor:pointer;transition:background var(--transition-fast)}.event-row[data-v-1918c8c1]:hover{background:var(--bg-card-hover)}.event-row:last-child td[data-v-1918c8c1]{border-bottom:none}.col-time[data-v-1918c8c1]{width:60px}.col-event[data-v-1918c8c1]{min-width:200px}.col-attack[data-v-1918c8c1]{width:80px}.col-conf[data-v-1918c8c1]{width:120px}.col-assoc[data-v-1918c8c1]{min-width:120px}.col-status[data-v-1918c8c1]{width:120px}.col-risk[data-v-1918c8c1]{width:80px}.time-text[data-v-1918c8c1]{color:var(--text-muted);font-variant-numeric:tabular-nums;font-size:12px;font-weight:500;font-family:var(--font-mono)}.event-cell[data-v-1918c8c1]{align-items:center;gap:8px;display:flex}.severity-dot[data-v-1918c8c1]{border-radius:50%;flex-shrink:0;width:7px;height:7px}.event-title-text[data-v-1918c8c1]{color:var(--text-primary);font-weight:500}.ip-tag[data-v-1918c8c1]{color:var(--text-muted);background:var(--bg-elevated);font-size:10px;font-family:var(--font-mono);border-radius:3px;padding:1px 6px}.attack-id[data-v-1918c8c1]{color:var(--warning);font-size:12px;font-weight:700;font-family:var(--font-mono);letter-spacing:.5px}.attack-na[data-v-1918c8c1]{color:var(--text-muted);font-size:11px}.conf-cell[data-v-1918c8c1]{align-items:center;gap:8px;display:flex}.conf-bar[data-v-1918c8c1]{background:var(--bg-elevated);border-radius:3px;flex:1;max-width:60px;height:6px;overflow:hidden}.conf-fill[data-v-1918c8c1]{border-radius:3px;height:100%;transition:width .3s}.conf-text[data-v-1918c8c1]{font-variant-numeric:tabular-nums;font-size:12px;font-weight:700}.status-tag[data-v-1918c8c1]{border-radius:var(--radius-full);letter-spacing:.5px;padding:2px 8px;font-size:10px;font-weight:600}.st-open[data-v-1918c8c1]{background:var(--error-bg);color:var(--error)}.st-investigating[data-v-1918c8c1]{background:var(--warning-bg);color:var(--warning)}.st-resolved[data-v-1918c8c1]{background:var(--success-bg);color:var(--success)}.assoc-cell[data-v-1918c8c1]{flex-wrap:wrap;align-items:center;gap:4px;display:flex}.badge[data-v-1918c8c1]{letter-spacing:.3px;white-space:nowrap;border-radius:3px;padding:1px 6px;font-size:9px;font-weight:600}.badge-cve[data-v-1918c8c1]{color:#dc2626;background:#fef2f2;border:1px solid #fca5a5}.badge-apt[data-v-1918c8c1]{color:#0369a1;background:#f0f9ff;border:1px solid #7dd3fc}.badge-malware[data-v-1918c8c1]{color:#a21caf;background:#fdf4ff;border:1px solid #e879f9}.badge-high[data-v-1918c8c1]{color:#c2410c;background:#fff7ed;border:1px solid #fdba74}.risk-text[data-v-1918c8c1]{letter-spacing:.5px;font-size:11px;font-weight:700}.empty-row[data-v-1918c8c1]{text-align:center;color:var(--text-muted);font-size:13px;padding:40px!important}@media (width<=768px){.events-page[data-v-1918c8c1]{padding:12px}.filter-bar[data-v-1918c8c1]{flex-direction:column;align-items:stretch}.search-box[data-v-1918c8c1]{max-width:none}.event-table[data-v-1918c8c1]{font-size:11px}.col-event[data-v-1918c8c1]{min-width:120px}.col-time[data-v-1918c8c1],.col-attack[data-v-1918c8c1],.col-risk[data-v-1918c8c1]{display:none}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.knowledge-page[data-v-c8cded10]{height:calc(100vh - var(--header-height));flex-direction:column;padding:16px;display:flex}.knowledge-tabs[data-v-c8cded10]{flex-shrink:0}.tab-content[data-v-c8cded10]{flex:1;gap:16px;margin-top:16px;display:flex;overflow:hidden}.mitre-panel[data-v-c8cded10]{flex-direction:column;flex:1;transition:width .3s;display:flex}.section-label[data-v-c8cded10]{color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px;font-size:11px;font-weight:600}.section-body[data-v-c8cded10]{background:var(--bg-primary);border-radius:var(--radius-sm);padding:10px 14px}.section-text[data-v-c8cded10]{color:var(--text-secondary);font-size:13px;line-height:1.6}.list-item[data-v-c8cded10]{color:var(--text-tertiary);gap:6px;padding:3px 0;font-size:12px;display:flex}.cve-tag[data-v-c8cded10]{color:var(--error);background:var(--bg-elevated);font-size:12px;font-family:var(--font-mono);border-radius:3px;padding:2px 6px}.owasp-list[data-v-c8cded10],.cve-grid[data-v-c8cded10]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;padding:4px;display:grid;overflow-y:auto}.owasp-card[data-v-c8cded10],.cve-card[data-v-c8cded10]{background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-sm);cursor:pointer;transition:all var(--transition-fast);padding:14px 16px}.owasp-card[data-v-c8cded10]:hover,.cve-card[data-v-c8cded10]:hover{border-color:var(--border-hover);box-shadow:var(--shadow-sm);transform:translateY(-1px)}.rules-list[data-v-c8cded10]{flex-direction:column;gap:10px;padding:4px;display:flex;overflow-y:auto}.rule-card[data-v-c8cded10]{background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-sm);cursor:pointer;transition:all var(--transition-fast);padding:14px 16px}.rule-card[data-v-c8cded10]:hover{border-color:var(--border-hover)}.empty-panel[data-v-c8cded10]{padding-top:80px}@media (width<=768px){.knowledge-page[data-v-c8cded10]{padding:8px!important}.tab-content[data-v-c8cded10]{flex-direction:column!important;gap:8px!important}.mitre-panel[data-v-c8cded10]{width:100%!important}.owasp-list[data-v-c8cded10],.cve-grid[data-v-c8cded10]{grid-template-columns:1fr!important}.cve-card[data-v-c8cded10],.owasp-card[data-v-c8cded10]{padding:10px 12px!important}}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{$ as e,A as t,C as n,E as r,K as i,S as a,T as o,Ut as s,Wt as c,Y as l,Z as u,_ as d,_t as f,it as p,j as m,ot as h,w as g}from"./vendor-icons-BTNgi7vU.js";import{m as _,r as v}from"./vendor-ui-Cdd65KTN.js";import{i as y,r as b}from"./vendor-vue-CXKcZAmz.js";import{n as x}from"./index-DBEjbyJR.js";import{t as S}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as C}from"./vendor-charts-Dh1nChzO.js";var ee={class:`knowledge-page`,style:{padding:`16px`,display:`flex`,"flex-direction":`column`,height:`calc(100vh - var(--header-height))`}},te={key:0,style:{flex:`1`,display:`flex`,gap:`16px`,"margin-top":`16px`,overflow:`hidden`}},ne={style:{display:`flex`,"align-items":`center`,gap:`8px`}},re={key:0,style:{width:`45%`,display:`flex`,"flex-direction":`column`,transition:`width 0.3s ease`}},ie={style:{display:`flex`,"align-items":`center`,gap:`8px`}},ae={style:{color:`#fbbf24`,"font-size":`15px`,"font-weight":`700`}},oe={style:{color:`#e2e8f0`,"font-size":`14px`,"font-weight":`600`}},se={style:{"margin-bottom":`16px`}},ce={style:{color:`#cbd5e1`,"font-size":`13px`,"line-height":`1.6`}},le={key:0,style:{"margin-bottom":`16px`}},ue={style:{color:`#f87171`,"font-size":`12px`,background:`#2a2d38`,padding:`2px 6px`,"border-radius":`3px`}},de={style:{color:`#94a3b8`,"font-size":`11px`}},fe={style:{"margin-bottom":`16px`}},pe={key:0,style:{background:`#0f1117`,"border-radius":`6px`,padding:`10px 14px`}},me={key:1,style:{color:`#64748b`,"font-size":`12px`}},he={key:0,style:{background:`#0f1117`,"border-radius":`6px`,padding:`10px 14px`}},ge={key:1,style:{color:`#64748b`,"font-size":`12px`}},_e={key:1,style:{"margin-top":`16px`}},ve={style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`6px`}},ye={style:{display:`flex`,"flex-wrap":`wrap`,gap:`6px`}},be={style:{color:`#fbbf24`,"font-size":`11px`}},xe={style:{color:`#94a3b8`,"font-size":`11px`,"margin-left":`4px`}},Se={key:1,style:{flex:`1`,"margin-top":`16px`,"overflow-y":`auto`}},Ce={style:{display:`flex`,"align-items":`center`,gap:`8px`}},we={key:0,style:{color:`#64748b`,"font-size":`11px`}},Te={key:0,style:{color:`#475569`,"text-align":`center`,padding:`40px`}},Ee=[`onClick`],De={style:{display:`flex`,"align-items":`center`,gap:`12px`}},Oe={style:{flex:`1`}},ke={style:{color:`#e2e8f0`,"font-size":`13px`,"font-weight":`600`}},Ae={style:{color:`#64748b`,"font-size":`11px`,"margin-top":`2px`}},je={style:{color:`#64748b`,"font-size":`11px`}},Me={key:0,style:{"margin-top":`10px`,padding:`12px`,background:`#171923`,"border-radius":`6px`,border:`1px solid #2a2d38`}},Ne={style:{color:`#cbd5e1`,"font-size":`12px`,"line-height":`1.6`,"margin-bottom":`10px`}},Pe={style:{display:`grid`,"grid-template-columns":`1fr 1fr`,gap:`10px`}},Fe={key:2,style:{flex:`1`,"margin-top":`16px`,display:`flex`,gap:`16px`,overflow:`hidden`}},Ie={style:{width:`50%`,display:`flex`,"flex-direction":`column`}},Le={style:{display:`flex`,"align-items":`center`,gap:`8px`}},Re={style:{"overflow-y":`auto`}},ze={key:0,style:{color:`#64748b`,"text-align":`center`,"padding-top":`40px`,"font-size":`12px`}},Be=[`onClick`],Ve={style:{display:`flex`,"align-items":`center`,gap:`8px`}},He={style:{color:`#f87171`,"font-size":`13px`,"font-weight":`600`}},Ue={style:{color:`#cbd5e1`,"font-size":`12px`,"margin-top":`2px`}},We={style:{color:`#64748b`,"font-size":`11px`,"margin-top":`2px`}},Ge={key:2,style:{color:`#475569`,"text-align":`center`,"padding-top":`40px`,"font-size":`13px`}},Ke={style:{width:`50%`,display:`flex`,"flex-direction":`column`}},qe={style:{display:`flex`,"align-items":`center`,gap:`8px`}},Je={style:{color:`#f87171`,"font-size":`16px`,"font-weight":`700`}},Ye={style:{"margin-bottom":`12px`}},Xe={style:{color:`#e2e8f0`,"font-size":`13px`}},Ze={style:{"margin-bottom":`12px`}},Qe={style:{color:`#94a3b8`,"font-size":`12px`,"line-height":`1.5`}},$e={style:{display:`grid`,"grid-template-columns":`1fr 1fr`,gap:`12px`,"margin-bottom":`12px`}},et={style:{color:`#f87171`,"font-size":`18px`,"font-weight":`700`}},tt={style:{color:`#94a3b8`,"font-size":`13px`}},nt={style:{"margin-bottom":`12px`}},rt={style:{color:`#94a3b8`,"font-size":`12px`}},it={style:{color:`#22c55e`,"font-size":`12px`}},at={key:3,style:{flex:`1`,"margin-top":`16px`,display:`flex`,gap:`16px`,overflow:`hidden`}},ot={style:{width:`50%`,display:`flex`,"flex-direction":`column`}},st={style:{display:`flex`,"align-items":`center`,gap:`8px`}},ct={style:{"overflow-y":`auto`}},lt={key:0,style:{color:`#64748b`,"text-align":`center`,"padding-top":`40px`,"font-size":`12px`}},ut=[`onClick`],dt={style:{display:`flex`,"align-items":`center`,gap:`8px`}},ft={style:{color:`#60a5fa`,"font-size":`12px`,"font-weight":`600`}},pt={style:{color:`#e2e8f0`,"font-size":`12px`}},mt={style:{color:`#64748b`,"font-size":`11px`,"margin-top":`2px`}},ht={key:2,style:{color:`#475569`,"text-align":`center`,"padding-top":`40px`,"font-size":`13px`}},gt={style:{width:`50%`,display:`flex`,"flex-direction":`column`}},_t={style:{display:`flex`,"align-items":`center`,gap:`8px`}},vt={style:{color:`#60a5fa`,"font-size":`15px`,"font-weight":`700`}},yt={style:{color:`#e2e8f0`,"font-size":`14px`,"font-weight":`600`}},bt={style:{"margin-bottom":`12px`}},xt={style:{color:`#e2e8f0`,"font-size":`12px`,"line-height":`1.5`}},St={style:{"margin-bottom":`12px`}},Ct={style:{"margin-bottom":`12px`}},wt={style:{"margin-bottom":`12px`}},Tt={style:{background:`#0f1117`,border:`1px solid #2a2d38`,"border-radius":`6px`,padding:`12px`,"overflow-x":`auto`,color:`#a5d6ff`,"font-size":`11px`,"line-height":`1.5`}},w=S({__name:`KnowledgeView`,setup(S){v();let w=b(),Et=y(),T=a(()=>{let e=w.path;return e.includes(`/knowledge/mitre`)?`mitre`:e.includes(`/knowledge/owasp`)?`owasp`:e.includes(`/knowledge/cve`)?`cve`:e.includes(`/knowledge/rules`)?`rules`:`mitre`}),E=f(T.value);p(()=>w.path,()=>{E.value=T.value,D.value=null,F.value=null,H.value=null,Y.value=null});let D=f(null),O=f(null),k=null,A=f([]),j=f([]),M=[{id:`TA0043`,eng:`Reconnaissance`,cn:`侦察`},{id:`TA0042`,eng:`Resource Dev.`,cn:`资源开发`},{id:`TA0001`,eng:`Initial Access`,cn:`初始访问`},{id:`TA0002`,eng:`Execution`,cn:`执行`},{id:`TA0003`,eng:`Persistence`,cn:`持久化`},{id:`TA0004`,eng:`Privilege Esc.`,cn:`权限提升`},{id:`TA0005`,eng:`Defense Evasion`,cn:`防御绕过`},{id:`TA0006`,eng:`Credential Access`,cn:`凭据访问`},{id:`TA0007`,eng:`Discovery`,cn:`发现`},{id:`TA0008`,eng:`Lateral Movement`,cn:`横向移动`},{id:`TA0009`,eng:`Collection`,cn:`收集`},{id:`TA0011`,eng:`C&C`,cn:`命令与控制`},{id:`TA0010`,eng:`Exfiltration`,cn:`数据外传`},{id:`TA0040`,eng:`Impact`,cn:`影响`}],Dt={"CVE-2021-44228":`Log4j RCE - 广泛利用的命令执行漏洞`,"CVE-2023-34362":`MOVEit SQL注入 - Clop勒索软件利用`,"CVE-2024-1708":`ScreenConnect 认证绕过 - 初始访问`,"CVE-2022-26134":`Confluence OGNL注入 - 初始访问`};function N(e){return e?e.split(/[;;]\s*/).filter(Boolean):[]}function Ot(e){return{紧急:`error`,高危:`warning`,中危:`info`,低危:`success`}[e]||`default`}function kt(e){return e.sub_techniques&&typeof e.sub_techniques==`object`?Object.keys(e.sub_techniques).length:0}async function P(){try{let e=await x(`/api/mitre/search?q=*`,{timeout:1e4});e.length>0&&(A.value=e)}catch(e){console.warn(`[KnowledgeView] MITRE API 加载失败:`,e.message)}j.value=M.filter(e=>A.value.some(t=>(t.tactic_id||t.tactic)===e.id)),jt()}async function At(e){try{let t=await x(`/api/mitre/technique/${e}`,{timeout:8e3});D.value=t;return}catch(t){console.warn(`[KnowledgeView] MITRE 技术 ${e} 查询失败:`,t.message)}D.value=A.value.find(t=>t.id===e)||null}function jt(){if(!O.value)return;k||=C(O.value,`dark`);let e=M,t=A.value,n={};for(let r of e)n[r.id]=t.filter(e=>(e.tactic_id||e.tactic)===r.id);let r=[],i=[];for(let t of e){let e=n[t.id]||[];if(e.length!==0){i.push({index:r.length,tactic:t});for(let t of e)r.push(t.id+` `+t.name)}}let a=e.filter(e=>(n[e.id]||[]).length>0).map(e=>e.eng),o=[],s=0;for(let t of e){let e=n[t.id]||[];if(e.length===0)continue;let r=a.indexOf(t.eng);for(let t of e){let e=kt(t);o.push([r,s,e]),s++}}let c=Math.max(1,...o.map(e=>e[2])),l={backgroundColor:`transparent`,tooltip:{position:`top`,formatter:e=>{if(!e.data||!e.data[2])return``;let t=e.data[1],n=(r[t]||``).split(` `);return`<div style="font-size: 12px;">
|
|
2
|
+
<div style="color: #fbbf24; font-weight: 700;">${n[0]||``}</div>
|
|
3
|
+
<div style="color: #e2e8f0;">${n.slice(1).join(` `)||``}</div>
|
|
4
|
+
<div style="color: #94a3b8; margin-top: 4px;">子技术: <span style="color: #60a5fa; font-weight: 600;">${e.data[2]}</span></div>
|
|
5
|
+
<div style="margin-top: 4px;"><span style="color: #64748b;">点击查看详情</span></div>
|
|
6
|
+
</div>`},backgroundColor:`#1a1d29`,borderColor:`#2a2d38`,textStyle:{color:`#cbd5e1`},extraCssText:`border-radius: 8px; padding: 8px 12px;`},grid:{left:`120px`,right:`40px`,top:`40px`,bottom:`60px`},xAxis:{type:`category`,data:a,splitArea:{show:!0},axisLine:{lineStyle:{color:`#2a2d38`}},axisLabel:{color:`#94a3b8`,fontSize:10,fontWeight:600,rotate:a.length>10?30:0,interval:0},axisTick:{show:!1}},yAxis:{type:`category`,data:r,splitArea:{show:!0},axisLine:{lineStyle:{color:`#2a2d38`}},axisLabel:{color:`#cbd5e1`,fontSize:10,fontWeight:500,formatter:e=>e.split(` `)[0]},axisTick:{show:!1}},visualMap:{min:0,max:Math.max(10,c),calculable:!0,orient:`horizontal`,left:`center`,bottom:5,textStyle:{color:`#94a3b8`,fontSize:10},inRange:{color:[`#334155`,`#eab308`,`#f97316`,`#ef4444`]}},series:[{type:`heatmap`,data:o,label:{show:!0,color:`#e2e8f0`,fontSize:11,fontWeight:600,formatter:e=>e.data[2]>0?e.data[2]:``},emphasis:{itemStyle:{shadowBlur:10,shadowColor:`rgba(0, 0, 0, 0.5)`}}}]};k.setOption(l,!0),k.off(`click`),k.on(`click`,e=>{if(!e.data)return;let t=e.data[1],n=(r[t]||``).split(` `)[0];n&&At(n)})}function Mt(){k&&k.resize()}typeof window<`u`&&window.addEventListener(`resize`,()=>{E.value===`mitre`&&Mt()}),p(E,e=>{e===`mitre`&&setTimeout(P,100)}),p(O,e=>{e&&P()},{immediate:!0}),i(()=>{let e=T.value;e===`mitre`||(e===`owasp`?z():e===`cve`?G():e===`rules`&&Q())});let F=f(null),I=f([]),L=f(!1),R={A01:`#ef4444`,A02:`#f97316`,A03:`#ef4444`,A04:`#f97316`,A05:`#eab308`,A06:`#f97316`,A07:`#f97316`,A08:`#eab308`,A09:`#eab308`,A10:`#ef4444`};async function z(){L.value=!0;try{let e=await x(`/api/compliance/search?q=*`,{timeout:8e3});I.value=e.map((e,t)=>{let n=t+1,r=`A${String(n).padStart(2,`0`)}`;return{id:r,name:e.name,risk:`高危`,color:R[r]||`#f97316`,description:e.description||`合规法规`,prevention:e.key_requirements?e.key_requirements.slice(0,4):[],detection:e.penalties?[e.penalties.substring(0,60)+`...`]:[],raw:e}})}catch(e){console.warn(`[KnowledgeView] 合规API加载失败,使用内置回退:`,e.message),I.value=[{id:`A01`,name:`访问控制失效`,risk:`高危`,color:`#ef4444`,description:`未正确实施访问控制导致用户可越权访问未授权的功能或数据`,prevention:[`实施最小权限原则`,`使用统一访问控制中间件`,`拒绝默认访问`],detection:[`权限审计测试`,`自动化访问控制扫描`]},{id:`A02`,name:`加密机制失效`,risk:`高危`,color:`#f97316`,description:`敏感数据在传输或存储时未正确加密,导致数据泄露`,prevention:[`传输层使用TLS 1.3`,`存储加密使用AES-256`,`密钥轮换管理`],detection:[`数据流审查`,`加密强度扫描`]},{id:`A03`,name:`注入攻击`,risk:`紧急`,color:`#ef4444`,description:`SQL、OS命令、LDAP等注入攻击`,prevention:[`参数化查询`,`输入验证白名单`,`最小数据库权限`],detection:[`WAF规则`,`DAST扫描`,`代码审计`]},{id:`A04`,name:`不安全设计`,risk:`高危`,color:`#f97316`,description:`设计阶段未考虑安全控制,导致架构级安全缺陷`,prevention:[`威胁建模`,`安全设计模式`,`默认安全原则`],detection:[`架构评审`,`STRIDE分析`]},{id:`A05`,name:`安全配置错误`,risk:`中危`,color:`#eab308`,description:`默认配置、未修补的漏洞、云存储开放等配置问题`,prevention:[`最小化配置`,`自动化配置管理`,`定期扫描`],detection:[`CIS基准检查`,`配置审核`]},{id:`A06`,name:`易受攻击和过时组件`,risk:`高危`,color:`#f97316`,description:`使用含有已知漏洞的第三方库和框架`,prevention:[`SBOM管理`,`自动依赖更新`,`漏洞扫描`],detection:[`SCA工具`,`CVE监控`]},{id:`A07`,name:`身份识别和认证失败`,risk:`高危`,color:`#f97316`,description:`认证机制薄弱导致账户被盗用`,prevention:[`MFA强制`,`防范暴力破解`,`安全密码策略`],detection:[`登录审计`,`异常检测`]},{id:`A08`,name:`软件和数据完整性失效`,risk:`中危`,color:`#eab308`,description:`CI/CD Pipeline不安全、软件供应链攻击`,prevention:[`签名验证`,`安全CI/CD`,`制品完整性检查`],detection:[`完整性监控`,`供应链审计`]},{id:`A09`,name:`安全日志和监控不足`,risk:`中危`,color:`#eab308`,description:`日志记录不完整或监控缺失导致无法及时发现和响应攻击`,prevention:[`全面日志策略`,`集中日志管理`,`SIEM集成`],detection:[`日志覆盖率审查`,`告警规则测试`]},{id:`A10`,name:`服务端请求伪造`,risk:`高危`,color:`#ef4444`,description:`应用从用户获取URL并请求,未对目标进行验证导致SSRF攻击`,prevention:[`URL白名单`,`内网隔离`,`协议限制`],detection:[`动态扫描`,`代码审查`]}]}finally{L.value=!1}}let B=f(``),V=f([]),H=f(null),U=f(!1),W=f([]);async function G(){U.value=!0;try{let e=await x(`/api/cve/search?q=*`,{timeout:1e4});W.value=e.map(e=>({id:e.id||e.cve_id,severity:e.severity||`UNKNOWN`,cvss:e.cvss_score||`N/A`,title:(e.description||``).substring(0,80),description:e.description||``,published:e.published||`N/A`,affected:e.affected||`N/A`,remediation:e.remediation||`暂无修复方案`,detection:e.detection||``,impact:e.impact||``,cwe_ids:e.cwe_ids||[],mitre_techniques:e.mitre_techniques||[]})),V.value=W.value.slice(0,20)}catch(e){console.warn(`[KnowledgeView] CVE API加载失败:`,e.message),V.value=[]}finally{U.value=!1}}async function K(){let e=B.value.trim().toLowerCase();if(!e){V.value=W.value.slice(0,20),H.value=null;return}try{let t=await x(`/api/cve/search?q=${encodeURIComponent(e)}`,{timeout:8e3});V.value=(t||[]).map(e=>({id:e.id||e.cve_id,severity:e.severity||`UNKNOWN`,cvss:e.cvss_score||`N/A`,title:(e.description||``).substring(0,80),description:e.description||``,published:e.published||`N/A`,affected:e.affected||`N/A`,remediation:e.remediation||`暂无修复方案`,detection:e.detection||``,impact:e.impact||``,cwe_ids:e.cwe_ids||[],mitre_techniques:e.mitre_techniques||[]}))}catch(t){console.warn(`[KnowledgeView] CVE搜索失败,使用本地回退:`,t.message),V.value=W.value.filter(t=>t.id.toLowerCase().includes(e)||t.title.toLowerCase().includes(e)||t.description.toLowerCase().includes(e))}H.value=V.value[0]||null}let q=f(``),J=f(null),Y=f(null),X=f([]),Z=f(!1),Nt=[{label:`应急响应`,value:`应急响应`},{label:`供应链安全`,value:`供应链`},{label:`云安全`,value:`云安全`}];async function Q(){Z.value=!0;try{let e=await x(`/api/remediation/search?q=*`,{timeout:8e3});X.value=(e||[]).map((e,t)=>({id:`PB-${String(t+1).padStart(3,`0`)}`,name:e.scenario||`未知场景`,type:`应急响应`,technique:e.scenario||``,description:`响应场景: ${e.scenario}\n识别指标: ${(e.indicators||``).substring(0,80)}`,content:Pt(e),reference:e.scenario||``,indicators:e.indicators||``,immediate_actions:e.immediate_actions||[],medium_term:e.medium_term||[],long_term:e.long_term||[]}))}catch(e){console.warn(`[KnowledgeView] 应急剧本API加载失败:`,e.message),X.value=[]}finally{Z.value=!1}}function Pt(e){let t=`# 应急响应剧本: ${e.scenario||`未知`}\n\n`;t+=`## 识别指标\n${e.indicators||`无`}\n\n`,t+=`## 立即处置
|
|
7
|
+
`;for(let n of e.immediate_actions||[])t+=` - ${n}\n`;t+=`
|
|
8
|
+
## 短期措施
|
|
9
|
+
`;for(let n of e.medium_term||[])t+=` - ${n}\n`;t+=`
|
|
10
|
+
## 长期措施
|
|
11
|
+
`;for(let n of e.long_term||[])t+=` - ${n}\n`;return t}let Ft=a(()=>{let e=X.value;if(q.value.trim()){let t=q.value.trim().toLowerCase();e=e.filter(e=>e.name.toLowerCase().includes(t)||e.id.toLowerCase().includes(t))}return e});function $(){}function It(e){D.value=null,F.value=null,H.value=null,Y.value=null;let t={mitre:`/knowledge/mitre`,owasp:`/knowledge/owasp`,cve:`/knowledge/cve`,rules:`/knowledge/rules`}[e];t&&w.path!==t&&Et.push(t),e===`cve`&&W.value.length===0&&G(),e===`rules`&&X.value.length===0&&Q(),e===`owasp`&&I.value.length===0&&z()}return(i,a)=>{let f=e(`n-tab-pane`),p=e(`n-tabs`),v=e(`n-card`),y=e(`n-tag`),b=e(`n-button`),x=e(`n-input`),S=e(`n-empty`),C=e(`n-select`);return l(),r(`div`,ee,[m(v,{bordered:!0,size:`small`,style:{background:`#171923`,"flex-shrink":`0`}},{default:h(()=>[m(p,{value:E.value,"onUpdate:value":[a[0]||=e=>E.value=e,It],type:`line`,"bar-width":80},{default:h(()=>[m(f,{name:`mitre`,tab:`ATT&CK 知识库`},{tab:h(()=>[...a[5]||=[n(`span`,{style:{"font-weight":`600`,"font-size":`14px`}},`ATT&CK 知识库`,-1)]]),_:1}),m(f,{name:`owasp`,tab:`OWASP 安全知识`},{tab:h(()=>[...a[6]||=[n(`span`,{style:{"font-weight":`600`,"font-size":`14px`}},`OWASP 安全知识`,-1)]]),_:1}),m(f,{name:`cve`,tab:`CVE 漏洞库`},{tab:h(()=>[...a[7]||=[n(`span`,{style:{"font-weight":`600`,"font-size":`14px`}},`CVE 漏洞库`,-1)]]),_:1}),m(f,{name:`rules`,tab:`检测规则`},{tab:h(()=>[...a[8]||=[n(`span`,{style:{"font-weight":`600`,"font-size":`14px`}},`检测规则`,-1)]]),_:1})]),_:1},8,[`value`])]),_:1}),E.value===`mitre`?(l(),r(`div`,te,[n(`div`,{style:s({width:D.value?`55%`:`100%`,display:`flex`,flexDirection:`column`,transition:`width 0.3s ease`})},[m(v,{bordered:!0,size:`small`,style:{background:`#171923`,flex:`1`,display:`flex`,"flex-direction":`column`}},{header:h(()=>[n(`div`,ne,[a[9]||=n(`span`,{style:{color:`#e2e8f0`,"font-size":`14px`,"font-weight":`600`}},`ATT&CK Matrix`,-1),m(y,{size:`tiny`,color:`#1e293b`,style:{color:`#94a3b8`}},{default:h(()=>[t(c(j.value.length)+` 战术 · `+c(A.value.length)+` 技术`,1)]),_:1}),a[10]||=n(`div`,{style:{flex:`1`}},null,-1),a[11]||=n(`div`,{style:{display:`flex`,"align-items":`center`,gap:`6px`}},[n(`span`,{style:{color:`#64748b`,"font-size":`10px`}},`子技术数`),n(`span`,{style:{width:`12px`,height:`12px`,"border-radius":`2px`,background:`#334155`,display:`inline-block`}}),n(`span`,{style:{color:`#64748b`,"font-size":`10px`}},`0`),n(`span`,{style:{width:`12px`,height:`12px`,"border-radius":`2px`,background:`#eab308`,display:`inline-block`}}),n(`span`,{style:{color:`#64748b`,"font-size":`10px`}},`1-5`),n(`span`,{style:{width:`12px`,height:`12px`,"border-radius":`2px`,background:`#f97316`,display:`inline-block`}}),n(`span`,{style:{color:`#64748b`,"font-size":`10px`}},`6-10`),n(`span`,{style:{width:`12px`,height:`12px`,"border-radius":`2px`,background:`#ef4444`,display:`inline-block`}}),n(`span`,{style:{color:`#64748b`,"font-size":`10px`}},`10+`)],-1)])]),default:h(()=>[n(`div`,{ref_key:`mitreHeatmapRef`,ref:O,style:{width:`100%`,flex:`1`,"min-height":`400px`}},null,512)]),_:1})],4),D.value?(l(),r(`div`,re,[m(v,{bordered:!0,size:`small`,style:{background:`#171923`,flex:`1`,"overflow-y":`auto`}},{header:h(()=>[n(`div`,ie,[m(b,{size:`tiny`,quaternary:``,onClick:a[1]||=e=>D.value=null,style:{color:`#64748b`}},{default:h(()=>[...a[12]||=[t(`X`,-1)]]),_:1}),n(`span`,ae,c(D.value.id),1),n(`span`,oe,c(D.value.name),1),a[13]||=n(`div`,{style:{flex:`1`}},null,-1),D.value.scores?.risk_level?(l(),g(y,{key:0,type:Ot(D.value.scores?.risk_level),size:`small`,bordered:!1},{default:h(()=>[t(c(D.value.scores?.risk_level),1)]),_:1},8,[`type`])):o(``,!0),m(y,{size:`small`,bordered:!1},{default:h(()=>[t(c(D.value.tactic_name),1)]),_:1})])]),default:h(()=>[n(`div`,se,[a[14]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`6px`}},`DESCRIPTION`,-1),n(`div`,ce,c(D.value.description||`无描述`),1)]),D.value.related_cves&&D.value.related_cves.length>0?(l(),r(`div`,le,[a[16]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`6px`}},`RELATED CVEs`,-1),(l(!0),r(d,null,u(D.value.related_cves,e=>(l(),r(`div`,{key:e,style:{display:`flex`,"align-items":`center`,gap:`6px`,padding:`4px 0`}},[n(`code`,ue,c(e),1),a[15]||=n(`span`,{style:{color:`#64748b`,"font-size":`11px`}},`-`,-1),n(`span`,de,c(Dt[e]||`相关漏洞案例`),1)]))),128))])):o(``,!0),n(`div`,fe,[a[18]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`6px`}},`DETECTION`,-1),D.value.detection?(l(),r(`div`,pe,[(l(!0),r(d,null,u(N(D.value.detection),e=>(l(),r(`div`,{key:e,style:{padding:`3px 0`,"font-size":`12px`,color:`#94a3b8`,display:`flex`,gap:`6px`}},[a[17]||=n(`span`,{style:{color:`#3b82f6`}},`-`,-1),n(`span`,null,c(e),1)]))),128))])):(l(),r(`div`,me,`无检测信息`))]),n(`div`,null,[a[20]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`6px`}},`MITIGATION`,-1),D.value.mitigation?(l(),r(`div`,he,[(l(!0),r(d,null,u(N(D.value.mitigation),e=>(l(),r(`div`,{key:e,style:{padding:`3px 0`,"font-size":`12px`,color:`#94a3b8`,display:`flex`,gap:`6px`}},[a[19]||=n(`span`,{style:{color:`#22c55e`}},`-`,-1),n(`span`,null,c(e),1)]))),128))])):(l(),r(`div`,ge,`无缓解措施`))]),D.value.sub_techniques&&Object.keys(D.value.sub_techniques).length>0?(l(),r(`div`,_e,[n(`div`,ve,`SUB-TECHNIQUES (`+c(Object.keys(D.value.sub_techniques).length)+`)`,1),n(`div`,ye,[(l(!0),r(d,null,u(D.value.sub_techniques,(e,t)=>(l(),r(`div`,{key:t,style:{background:`#2a2d38`,padding:`4px 10px`,"border-radius":`4px`}},[n(`span`,be,c(t),1),n(`span`,xe,c(typeof e==`object`?e.name:e),1)]))),128))])])):o(``,!0)]),_:1})])):o(``,!0)])):o(``,!0),E.value===`owasp`?(l(),r(`div`,Se,[m(v,{bordered:!0,size:`small`,style:{background:`#171923`}},{header:h(()=>[n(`div`,Ce,[a[21]||=n(`span`,{style:{color:`#e2e8f0`,"font-weight":`600`}},`合规法规知识库`,-1),m(y,{size:`tiny`,color:`#1e293b`,style:{color:`#94a3b8`}},{default:h(()=>[t(c(I.value.length)+` 项法规`,1)]),_:1}),L.value?(l(),r(`div`,we,`加载中...`)):o(``,!0)])]),default:h(()=>[I.value.length===0&&!L.value?(l(),r(`div`,Te,` 无合规法规数据 `)):o(``,!0),(l(!0),r(d,null,u(I.value,(e,t)=>(l(),r(`div`,{key:e.id,style:s({padding:`10px 14px`,borderBottom:t<I.value.length-1?`1px solid #2a2d38`:`none`,cursor:`pointer`,background:F.value?.id===e.id?`#1f2230`:`transparent`}),onClick:t=>F.value=F.value?.id===e.id?null:e},[n(`div`,De,[n(`div`,{style:s({width:`24px`,height:`24px`,borderRadius:`6px`,background:(R[e.id]||`#f97316`)+`20`,color:R[e.id]||`#f97316`,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:`12px`,fontWeight:`bold`,flexShrink:0})},c(t+1),5),n(`div`,Oe,[n(`div`,ke,c(e.name),1),n(`div`,Ae,c(e.id),1)]),n(`div`,je,c(e.risk),1)]),F.value?.id===e.id?(l(),r(`div`,Me,[n(`div`,Ne,c(e.description),1),n(`div`,Pe,[n(`div`,null,[a[22]||=n(`div`,{style:{color:`#64748b`,"font-size":`10px`,"font-weight":`600`,"margin-bottom":`4px`}},`合规要求`,-1),(l(!0),r(d,null,u(e.prevention,e=>(l(),r(`div`,{key:e,style:{color:`#94a3b8`,"font-size":`11px`,padding:`2px 0`}},`- `+c(e),1))),128))]),n(`div`,null,[a[23]||=n(`div`,{style:{color:`#64748b`,"font-size":`10px`,"font-weight":`600`,"margin-bottom":`4px`}},`违规处罚`,-1),(l(!0),r(d,null,u(e.detection,e=>(l(),r(`div`,{key:e,style:{color:`#94a3b8`,"font-size":`11px`,padding:`2px 0`}},`- `+c(e),1))),128))])])])):o(``,!0)],12,Ee))),128))]),_:1})])):o(``,!0),E.value===`cve`?(l(),r(`div`,Fe,[n(`div`,Ie,[m(v,{bordered:!0,size:`small`,style:{background:`#171923`,flex:`1`}},{header:h(()=>[n(`div`,Le,[m(x,{value:B.value,"onUpdate:value":a[2]||=e=>B.value=e,placeholder:`搜索 CVE ID, 如 CVE-2025-1234`,size:`small`,clearable:``,style:{flex:`1`},onKeydown:_(K,[`enter`])},null,8,[`value`]),m(b,{size:`small`,type:`primary`,onClick:K},{default:h(()=>[...a[24]||=[t(`搜索`,-1)]]),_:1})])]),default:h(()=>[n(`div`,Re,[U.value?(l(),r(`div`,ze,`加载 `+c(W.value.length)+` 条 CVE 数据中...`,1)):(l(!0),r(d,{key:1},u(V.value,e=>(l(),r(`div`,{key:e.id,style:s({padding:`8px 12px`,cursor:`pointer`,borderRadius:`6px`,marginBottom:`4px`,background:H.value?.id===e.id?`#1f2230`:`transparent`}),onClick:t=>H.value=e},[n(`div`,Ve,[n(`span`,He,c(e.id),1),m(y,{size:`tiny`,type:e.severity===`CRITICAL`?`error`:e.severity===`HIGH`?`warning`:`info`,bordered:!1},{default:h(()=>[t(c(e.severity),1)]),_:2},1032,[`type`])]),n(`div`,Ue,c(e.title),1),n(`div`,We,`CVSS `+c(e.cvss)+` | `+c(e.published),1)],12,Be))),128)),V.value.length===0&&!U.value?(l(),r(`div`,Ge,[n(`div`,null,`共 `+c(W.value.length)+` 条 CVE 记录`,1),a[25]||=n(`div`,{style:{"margin-top":`4px`,"font-size":`11px`}},`输入 CVE ID 或关键词搜索`,-1)])):o(``,!0)])]),_:1})]),n(`div`,Ke,[H.value?(l(),g(v,{key:0,bordered:!0,size:`small`,style:{background:`#171923`,flex:`1`,"overflow-y":`auto`}},{header:h(()=>[n(`div`,qe,[n(`span`,Je,c(H.value.id),1),m(y,{type:H.value.severity===`CRITICAL`?`error`:`warning`,size:`small`},{default:h(()=>[t(c(H.value.severity),1)]),_:1},8,[`type`])])]),default:h(()=>[n(`div`,Ye,[a[26]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`TITLE`,-1),n(`div`,Xe,c(H.value.title),1)]),n(`div`,Ze,[a[27]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`DESCRIPTION`,-1),n(`div`,Qe,c(H.value.description),1)]),n(`div`,$e,[n(`div`,null,[a[28]||=n(`span`,{style:{color:`#64748b`,"font-size":`11px`}},`CVSS`,-1),n(`div`,et,c(H.value.cvss),1)]),n(`div`,null,[a[29]||=n(`span`,{style:{color:`#64748b`,"font-size":`11px`}},`PUBLISHED`,-1),n(`div`,tt,c(H.value.published),1)])]),n(`div`,nt,[a[30]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`AFFECTED`,-1),n(`div`,rt,c(H.value.affected),1)]),n(`div`,null,[a[31]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`REMEDIATION`,-1),n(`div`,it,c(H.value.remediation),1)])]),_:1})):(l(),g(S,{key:1,description:`选择一个CVE查看详情`,style:{"padding-top":`80px`}}))])])):o(``,!0),E.value===`rules`?(l(),r(`div`,at,[n(`div`,ot,[m(v,{bordered:!0,size:`small`,style:{background:`#171923`,flex:`1`}},{header:h(()=>[n(`div`,st,[m(x,{value:q.value,"onUpdate:value":a[3]||=e=>q.value=e,placeholder:`搜索规则名称或ID`,size:`small`,clearable:``,style:{flex:`1`},onKeydown:_($,[`enter`])},null,8,[`value`]),m(C,{value:J.value,"onUpdate:value":a[4]||=e=>J.value=e,placeholder:`类型`,options:Nt,clearable:``,size:`small`,style:{width:`100px`}},null,8,[`value`]),m(b,{size:`small`,type:`primary`,onClick:$},{default:h(()=>[...a[32]||=[t(`搜索`,-1)]]),_:1})])]),default:h(()=>[n(`div`,ct,[Z.value?(l(),r(`div`,lt,`加载 `+c(X.value.length)+` 个应急响应剧本...`,1)):(l(!0),r(d,{key:1},u(Ft.value,e=>(l(),r(`div`,{key:e.id,style:s({padding:`8px 12px`,cursor:`pointer`,borderRadius:`6px`,marginBottom:`4px`,background:Y.value?.id===e.id?`#1f2230`:`transparent`}),onClick:t=>Y.value=e},[n(`div`,dt,[n(`span`,ft,c(e.id),1),n(`span`,pt,c(e.name),1),m(y,{bordered:!1,size:`tiny`,type:`info`,style:{"margin-left":`auto`}},{default:h(()=>[...a[33]||=[t(`应急响应`,-1)]]),_:1})]),n(`div`,mt,c((e.indicators||``).substring(0,80))+c((e.indicators||``).length>80?`...`:``),1)],12,ut))),128)),Ft.value.length===0&&!Z.value?(l(),r(`div`,ht,[n(`div`,null,`共 `+c(X.value.length)+` 个应急响应剧本`,1),a[34]||=n(`div`,{style:{"margin-top":`4px`,"font-size":`11px`}},`输入关键词搜索场景`,-1)])):o(``,!0)])]),_:1})]),n(`div`,gt,[Y.value?(l(),g(v,{key:0,bordered:!0,size:`small`,style:{background:`#171923`,flex:`1`,"overflow-y":`auto`}},{header:h(()=>[n(`div`,_t,[n(`span`,vt,c(Y.value.id),1),n(`span`,yt,c(Y.value.name),1),m(y,{bordered:!1,size:`small`,type:`info`},{default:h(()=>[...a[35]||=[t(`应急响应剧本`,-1)]]),_:1})])]),default:h(()=>[n(`div`,bt,[a[36]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`识别指标`,-1),n(`div`,xt,c(Y.value.indicators),1)]),n(`div`,St,[a[38]||=n(`div`,{style:{color:`#f97316`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`立即处置`,-1),(l(!0),r(d,null,u(Y.value.immediate_actions,e=>(l(),r(`div`,{key:e,style:{color:`#94a3b8`,"font-size":`12px`,padding:`3px 0`,display:`flex`,gap:`6px`}},[a[37]||=n(`span`,{style:{color:`#ef4444`}},`•`,-1),n(`span`,null,c(e),1)]))),128))]),n(`div`,Ct,[a[40]||=n(`div`,{style:{color:`#eab308`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`短期措施`,-1),(l(!0),r(d,null,u(Y.value.medium_term,e=>(l(),r(`div`,{key:e,style:{color:`#94a3b8`,"font-size":`12px`,padding:`3px 0`,display:`flex`,gap:`6px`}},[a[39]||=n(`span`,{style:{color:`#eab308`}},`•`,-1),n(`span`,null,c(e),1)]))),128))]),n(`div`,wt,[a[42]||=n(`div`,{style:{color:`#22c55e`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`长期加固`,-1),(l(!0),r(d,null,u(Y.value.long_term,e=>(l(),r(`div`,{key:e,style:{color:`#94a3b8`,"font-size":`12px`,padding:`3px 0`,display:`flex`,gap:`6px`}},[a[41]||=n(`span`,{style:{color:`#22c55e`}},`•`,-1),n(`span`,null,c(e),1)]))),128))]),n(`div`,null,[a[43]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`完整剧本`,-1),n(`pre`,Tt,c(Y.value.content),1)])]),_:1})):(l(),g(S,{key:1,description:`选择一个规则查看详情`,style:{"padding-top":`80px`}}))])])):o(``,!0)])}}},[[`__scopeId`,`data-v-c8cded10`]]);export{w as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,A as t,C as n,E as r,Ht as i,K as a,O as o,T as s,Wt as c,Y as l,_t as u,ht as d,j as f,k as p,ot as m}from"./vendor-icons-BTNgi7vU.js";import{h,m as g,r as _,u as v}from"./vendor-ui-Cdd65KTN.js";import{i as y,r as b}from"./vendor-vue-CXKcZAmz.js";import{r as x}from"./index-DBEjbyJR.js";import{t as S}from"./_plugin-vue_export-helper-BDNMzG2s.js";var C={class:`login-page`},w={class:`login-card`},T={class:`form-field`},E={class:`form-field`},D=S({__name:`LoginView`,setup(S){let D=y(),O=b(),k=_(),A=u(null),j=u(!1),M=u(``),N=d({username:`admin`,password:``}),P={username:[{required:!0,message:`请输入用户名`,trigger:`blur`}],password:[{required:!0,message:`请输入密码`,trigger:`blur`}]};a(()=>{if(localStorage.getItem(`secagentx_token`)){let e=O.query.redirect||`/dashboard`;D.push(e)}});async function F(){M.value=``;try{await A.value?.validate()}catch{return}j.value=!0;try{let e=await fetch(x(`/api/auth/login`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({username:N.username,password:N.password})}),t=await e.json();if(!e.ok){let e=t?.error?.code||``,n=t?.error?.message||`登录失败`;throw Error(e===`AUTH_WRONG_CREDENTIALS`?`用户名或密码错误`:e===`AUTH_PASSWORD_NOT_SET`?`系统未配置管理员密码,请联系运维人员`:n)}localStorage.setItem(`secagentx_token`,t.access_token),t.refresh_token&&localStorage.setItem(`secagentx_refresh_token`,t.refresh_token),localStorage.setItem(`secagentx_user`,JSON.stringify(t.user||{})),k.success(`登录成功`);let n=O.query.redirect||`/dashboard`;D.push(n)}catch(e){M.value=e.message||`网络错误,请检查后端服务是否运行`}finally{j.value=!1}}return(a,u)=>{let d=e(`n-input`),_=e(`n-button`),y=e(`n-form`);return l(),r(`div`,C,[u[8]||=n(`div`,{class:`login-bg-grid`},null,-1),u[9]||=n(`div`,{class:`login-bg-glow`},null,-1),n(`div`,w,[u[6]||=p(`<div class="login-header" data-v-021b8444><div class="login-logo" data-v-021b8444><svg width="40" height="40" viewBox="0 0 40 40" fill="none" data-v-021b8444><rect width="40" height="40" rx="10" fill="#dc2626" data-v-021b8444></rect><path d="M12 20L18 26L28 14" stroke="white" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" data-v-021b8444></path></svg></div><div class="login-title" data-v-021b8444>SecAgentX</div><div class="login-subtitle" data-v-021b8444>AI 安全智能体 · 企业版</div></div>`,1),f(y,{ref_key:`formRef`,ref:A,model:N,rules:P,onSubmit:h(F,[`prevent`])},{default:m(()=>[n(`div`,T,[u[2]||=n(`div`,{class:`field-label`},[n(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[n(`circle`,{cx:`12`,cy:`8`,r:`4`}),n(`path`,{d:`M20 21a8 8 0 1 0-16 0`})]),n(`span`,null,`用户名`)],-1),f(d,{value:N.username,"onUpdate:value":u[0]||=e=>N.username=e,placeholder:`请输入管理员用户名`,disabled:j.value,size:`large`,onKeyup:g(F,[`enter`])},null,8,[`value`,`disabled`])]),n(`div`,E,[u[3]||=n(`div`,{class:`field-label`},[n(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[n(`rect`,{x:`3`,y:`11`,width:`18`,height:`11`,rx:`2`,ry:`2`}),n(`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`})]),n(`span`,null,`密码`)],-1),f(d,{value:N.password,"onUpdate:value":u[1]||=e=>N.password=e,type:`password`,placeholder:`请输入密码`,disabled:j.value,"show-password-on":`click`,size:`large`,onKeyup:g(F,[`enter`])},null,8,[`value`,`disabled`])]),f(v,{name:`fade`},{default:m(()=>[M.value?(l(),r(`div`,{key:0,class:i([`error-banner`,{shake:M.value}])},[u[4]||=n(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[n(`circle`,{cx:`12`,cy:`12`,r:`10`}),n(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),n(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})],-1),n(`span`,null,c(M.value),1)],2)):s(``,!0)]),_:1}),f(_,{type:`primary`,block:``,loading:j.value,disabled:j.value,"attr-type":`submit`,size:`large`,class:`login-btn`},o({default:m(()=>[t(` `+c(j.value?`验证中...`:`登 录`),1)]),_:2},[j.value?void 0:{name:`icon`,fn:m(()=>[u[5]||=n(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[n(`path`,{d:`M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4`}),n(`polyline`,{points:`10 17 15 12 10 7`}),n(`line`,{x1:`15`,y1:`12`,x2:`3`,y2:`12`})],-1)]),key:`0`}]),1032,[`loading`,`disabled`])]),_:1},8,[`model`]),u[7]||=n(`div`,{class:`login-footer`},[n(`span`,null,`首次使用?默认用户名 admin`)],-1)])])}}},[[`__scopeId`,`data-v-021b8444`]]);export{D as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.login-page[data-v-021b8444]{background:var(--bg-primary);justify-content:center;align-items:center;height:100vh;display:flex;position:relative;overflow:hidden}.login-bg-grid[data-v-021b8444]{z-index:0;background-image:linear-gradient(#ffffff05 1px,#0000 1px),linear-gradient(90deg,#ffffff05 1px,#0000 1px);background-size:40px 40px;animation:20s linear infinite grid-scroll-021b8444;position:absolute;inset:0}@keyframes grid-scroll-021b8444{0%{transform:translate(0)}to{transform:translate(40px,40px)}}.login-bg-glow[data-v-021b8444]{z-index:0;background:radial-gradient(circle,#dc262614 0%,#0000 70%);border-radius:50%;width:600px;height:600px;animation:8s ease-in-out infinite alternate glow-drift-021b8444;position:absolute;top:-200px;right:-200px}@keyframes glow-drift-021b8444{0%{transform:translate(0)scale(1)}to{transform:translate(60px,40px)scale(1.2)}}.login-card[data-v-021b8444]{z-index:1;background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-lg);width:400px;max-width:90vw;transition:box-shadow var(--transition-normal);padding:40px 36px 32px;position:relative;box-shadow:0 8px 32px #0006}.login-card[data-v-021b8444]:focus-within{box-shadow:0 8px 32px #00000080,0 0 0 1px #dc262626}.login-header[data-v-021b8444]{text-align:center;margin-bottom:32px}.login-logo[data-v-021b8444]{margin-bottom:16px;animation:3s ease-in-out infinite logo-float-021b8444;display:inline-flex}@keyframes logo-float-021b8444{0%,to{transform:translateY(0)}50%{transform:translateY(-4px)}}.login-title[data-v-021b8444]{color:var(--text-primary);letter-spacing:2px;margin-bottom:4px;font-size:24px;font-weight:700}.login-subtitle[data-v-021b8444]{color:var(--text-muted);font-size:13px}.form-field[data-v-021b8444]{margin-bottom:20px}.field-label[data-v-021b8444]{color:var(--text-tertiary);align-items:center;gap:6px;margin-bottom:6px;font-size:12px;font-weight:500;display:flex}.error-banner[data-v-021b8444]{background:var(--error-bg);border-radius:var(--radius-sm);color:var(--error);border:1px solid #ef444433;align-items:center;gap:8px;margin-bottom:16px;padding:10px 14px;font-size:12px;display:flex}.error-banner.shake[data-v-021b8444]{animation:.4s shake-021b8444}@keyframes shake-021b8444{0%,to{transform:translate(0)}20%{transform:translate(-6px)}40%{transform:translate(6px)}60%{transform:translate(-4px)}80%{transform:translate(4px)}}.login-btn[data-v-021b8444]{--n-height:42px;letter-spacing:2px;border-radius:var(--radius-sm);transition:all var(--transition-fast);font-weight:600}.login-btn[data-v-021b8444]:not(:disabled):hover{box-shadow:var(--shadow-glow-red);transform:translateY(-1px)}.login-footer[data-v-021b8444]{text-align:center;border-top:1px solid var(--border-primary);color:var(--text-muted);margin-top:24px;padding-top:20px;font-size:11px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,A as t,C as n,E as r,K as i,Wt as a,Y as o,_t as s,ht as c,j as l,ot as u,w as d}from"./vendor-icons-BTNgi7vU.js";import{r as f}from"./vendor-ui-Cdd65KTN.js";import{r as p}from"./index-DBEjbyJR.js";var m={style:{padding:`20px`,height:`calc(100vh - 80px)`,"overflow-y":`auto`}},h={style:{display:`flex`,"align-items":`center`,"justify-content":`space-between`,"margin-bottom":`20px`}},g={style:{display:`flex`,"align-items":`center`,gap:`8px`}},_={key:0,style:{color:`#22c55e`}},v={key:1,style:{color:`#64748b`}},y={key:0,style:{color:`#94a3b8`}},b={key:1,style:{color:`#64748b`}},x={key:0,style:{color:`#22c55e`}},S={key:1,style:{color:`#64748b`}},C={key:0,style:{color:`#22c55e`}},w={key:1,style:{color:`#64748b`}},T={style:{display:`flex`,"align-items":`center`,gap:`8px`}},E={style:{display:`flex`,"align-items":`center`,gap:`8px`}},D={__name:`SettingsView`,setup(D){let O=f(),k=s(!1),A=s(!1),j=s(!1),M=s(!1),N=c({enabled:!1,ingestor:null,patrol:null,escalation:null}),P=c({enabled:!1,event_retention_days:90,conversation_retention_days:30,ioc_retention_days:365,run_interval_hours:24,last_run:`未执行`}),F=c({state:`closed`,failures:0,blocks_today:0,failure_threshold:3,daily_limit:20,auto_reset_seconds:1800}),I=c({auto_operation:{enabled:!0,thresholds:{auto_close:.85,auto_block:.7,manual_escalation:.3},patrol:{interval_seconds:1800,block_renew_threshold:.5,max_renew_count:3}},data_retention:{enabled:!1,event_retention_days:90,conversation_retention_days:30,ioc_retention_days:365,run_interval_hours:24}}),L=()=>localStorage.getItem(`secagentx_token`)||``,R=()=>({Authorization:`Bearer ${L()}`,"Content-Type":`application/json`});async function z(){k.value=!0;try{let e=await fetch(p(`/api/auto/status`),{headers:R()});if(e.ok){let t=await e.json();Object.assign(N,t),t.data_retention&&Object.assign(P,t.data_retention)}let t=await fetch(p(`/api/health`));if(t.ok){let e=await t.json();e.circuit_breaker&&Object.assign(F,e.circuit_breaker)}}catch{}k.value=!1}async function B(){A.value=!0;try{let e=await fetch(p(`/api/auto/config`),{headers:R()});if(e.ok){let t=await e.json();t.auto_operation&&Object.assign(I.auto_operation,t.auto_operation),t.data_retention&&Object.assign(I.data_retention,t.data_retention),t.thresholds&&Object.assign(I.auto_operation.thresholds,t.thresholds),t.patrol&&Object.assign(I.auto_operation.patrol,t.patrol)}}catch{}A.value=!1}async function V(){j.value=!0;try{let e=await fetch(p(`/api/admin/config`),{method:`PUT`,headers:R(),body:JSON.stringify({auto_operation:I.auto_operation,data_retention:I.data_retention})});e.ok?(O.success(`配置已保存`),M.value=!1,await z()):O.error(`保存失败: `+(e.status===403?`无权限`:await e.text()))}catch(e){O.error(`保存失败: `+e.message)}j.value=!1}return i(()=>{z(),B()}),(i,s)=>{let c=e(`n-button`),f=e(`n-tag`),p=e(`n-descriptions-item`),D=e(`n-descriptions`),O=e(`n-card`),L=e(`n-divider`),R=e(`n-switch`),B=e(`n-form-item`),H=e(`n-input-number`),U=e(`n-form`),W=e(`n-modal`);return o(),r(`div`,m,[n(`div`,h,[s[14]||=n(`div`,null,[n(`div`,{style:{color:`#e2e8f0`,"font-size":`20px`,"font-weight":`700`}},`系统设置`),n(`div`,{style:{color:`#64748b`,"font-size":`13px`,"margin-top":`4px`}},`自动模块运行状态 · 数据保留策略 · 运行时配置`)],-1),l(c,{size:`small`,quaternary:``,onClick:s[0]||=e=>M.value=!0,loading:A.value},{default:u(()=>[...s[13]||=[t(` 编辑配置 `,-1)]]),_:1},8,[`loading`])]),l(O,{bordered:!0,size:`small`,style:{background:`#171923`,"margin-bottom":`16px`}},{header:u(()=>[n(`div`,g,[s[18]||=n(`span`,{style:{color:`#e2e8f0`,"font-weight":`600`}},`零人工干预模块`,-1),N.enabled?(o(),d(f,{key:0,size:`small`,type:`success`,bordered:!1},{default:u(()=>[...s[15]||=[t(`已启用`,-1)]]),_:1})):(o(),d(f,{key:1,size:`small`,type:`error`,bordered:!1},{default:u(()=>[...s[16]||=[t(`已禁用`,-1)]]),_:1})),l(c,{size:`tiny`,quaternary:``,onClick:z,loading:k.value,style:{"margin-left":`auto`}},{default:u(()=>[...s[17]||=[t(`刷新`,-1)]]),_:1},8,[`loading`])])]),default:u(()=>[l(D,{column:2,"label-placement":`left`,bordered:``,size:`small`},{default:u(()=>[l(p,null,{label:u(()=>[...s[19]||=[t(`告警接入器`,-1)]]),default:u(()=>[N.ingestor?(o(),r(`span`,_,`运行中 · 已处理 `+a(N.ingestor.processed_count||0)+` 条`,1)):(o(),r(`span`,v,`未启动`))]),_:1}),l(p,null,{label:u(()=>[...s[20]||=[t(`告警去重`,-1)]]),default:u(()=>[N.ingestor?.dedup?(o(),r(`span`,y,` 窗口 `+a(N.ingestor.dedup.window_seconds)+`s · 追踪 `+a(N.ingestor.dedup.tracked_entries)+` 条 `,1)):(o(),r(`span`,b,`-`))]),_:1}),l(p,null,{label:u(()=>[...s[21]||=[t(`安全巡检器`,-1)]]),default:u(()=>[N.patrol?(o(),r(`span`,x,` 已执行 `+a(N.patrol.patrol_count||0)+` 次 · 间隔 `+a(N.patrol.interval_seconds)+`s `,1)):(o(),r(`span`,S,`未启动`))]),_:1}),l(p,null,{label:u(()=>[...s[22]||=[t(`升级通知引擎`,-1)]]),default:u(()=>[N.escalation&&N.escalation.length>0?(o(),r(`span`,C,a(N.escalation.filter(e=>e.enabled).map(e=>e.type).join(`, `)||`仅控制台`),1)):(o(),r(`span`,w,`未配置`))]),_:1})]),_:1})]),_:1}),l(O,{bordered:!0,size:`small`,style:{background:`#171923`,"margin-bottom":`16px`}},{header:u(()=>[n(`div`,T,[s[25]||=n(`span`,{style:{color:`#e2e8f0`,"font-weight":`600`}},`数据保留策略`,-1),P.enabled?(o(),d(f,{key:0,size:`small`,type:`success`,bordered:!1},{default:u(()=>[...s[23]||=[t(`已启用`,-1)]]),_:1})):(o(),d(f,{key:1,size:`small`,type:`warning`,bordered:!1},{default:u(()=>[...s[24]||=[t(`未启用`,-1)]]),_:1}))])]),default:u(()=>[l(D,{column:2,"label-placement":`left`,bordered:``,size:`small`},{default:u(()=>[l(p,null,{label:u(()=>[...s[26]||=[t(`安全事件`,-1)]]),default:u(()=>[t(a(P.event_retention_days||90)+` 天`,1)]),_:1}),l(p,null,{label:u(()=>[...s[27]||=[t(`对话记录`,-1)]]),default:u(()=>[t(a(P.conversation_retention_days||30)+` 天`,1)]),_:1}),l(p,null,{label:u(()=>[...s[28]||=[t(`IOC`,-1)]]),default:u(()=>[t(a(P.ioc_retention_days||365)+` 天`,1)]),_:1}),l(p,null,{label:u(()=>[...s[29]||=[t(`清理周期`,-1)]]),default:u(()=>[t(`每 `+a(P.run_interval_hours||24)+` 小时`,1)]),_:1}),l(p,null,{label:u(()=>[...s[30]||=[t(`上次执行`,-1)]]),default:u(()=>[t(a(P.last_run||`未执行`),1)]),_:1})]),_:1})]),_:1}),l(O,{bordered:!0,size:`small`,style:{background:`#171923`,"margin-bottom":`16px`}},{header:u(()=>[n(`div`,E,[s[31]||=n(`span`,{style:{color:`#e2e8f0`,"font-weight":`600`}},`熔断器`,-1),l(f,{type:F.state===`open`?`error`:F.state===`half_open`?`warning`:`success`,size:`small`,bordered:!1},{default:u(()=>[t(a(F.state===`open`?`已熔断`:F.state===`half_open`?`半开`:`正常`),1)]),_:1},8,[`type`])])]),default:u(()=>[l(D,{column:2,"label-placement":`left`,bordered:``,size:`small`},{default:u(()=>[l(p,null,{label:u(()=>[...s[32]||=[t(`状态`,-1)]]),default:u(()=>[t(a(F.state),1)]),_:1}),l(p,null,{label:u(()=>[...s[33]||=[t(`连续失败`,-1)]]),default:u(()=>[t(a(F.failures||0)+` / `+a(F.failure_threshold||3),1)]),_:1}),l(p,null,{label:u(()=>[...s[34]||=[t(`今日封禁`,-1)]]),default:u(()=>[t(a(F.blocks_today||0)+` / `+a(F.daily_limit||20),1)]),_:1}),l(p,null,{label:u(()=>[...s[35]||=[t(`自动恢复`,-1)]]),default:u(()=>[t(a((F.auto_reset_seconds||1800)/60)+` 分钟后`,1)]),_:1})]),_:1})]),_:1}),l(W,{show:M.value,"onUpdate:show":s[12]||=e=>M.value=e,preset:`card`,title:`编辑运行时配置`,style:{width:`600px`},bordered:!0,"mask-closable":!1},{footer:u(()=>[l(c,{onClick:s[11]||=e=>M.value=!1,style:{"margin-right":`8px`}},{default:u(()=>[...s[39]||=[t(`取消`,-1)]]),_:1}),l(c,{type:`primary`,loading:j.value,onClick:V},{default:u(()=>[...s[40]||=[t(`保存配置`,-1)]]),_:1},8,[`loading`])]),default:u(()=>[l(U,{ref:`configFormRef`,model:I,"label-placement":`left`,"label-width":`140px`},{default:u(()=>[l(L,null,{default:u(()=>[...s[36]||=[t(`自动处置`,-1)]]),_:1}),l(B,{label:`自动处置开关`},{default:u(()=>[l(R,{value:I.auto_operation.enabled,"onUpdate:value":s[1]||=e=>I.auto_operation.enabled=e},null,8,[`value`])]),_:1}),l(B,{label:`自动闭环阈值`},{default:u(()=>[l(H,{value:I.auto_operation.thresholds.auto_close,"onUpdate:value":s[2]||=e=>I.auto_operation.thresholds.auto_close=e,min:0,max:1,step:.05},null,8,[`value`])]),_:1}),l(B,{label:`自动封禁阈值`},{default:u(()=>[l(H,{value:I.auto_operation.thresholds.auto_block,"onUpdate:value":s[3]||=e=>I.auto_operation.thresholds.auto_block=e,min:0,max:1,step:.05},null,8,[`value`])]),_:1}),l(B,{label:`升级人工阈值`},{default:u(()=>[l(H,{value:I.auto_operation.thresholds.manual_escalation,"onUpdate:value":s[4]||=e=>I.auto_operation.thresholds.manual_escalation=e,min:0,max:1,step:.05},null,8,[`value`])]),_:1}),l(L,null,{default:u(()=>[...s[37]||=[t(`安全巡检`,-1)]]),_:1}),l(B,{label:`巡检间隔(秒)`},{default:u(()=>[l(H,{value:I.auto_operation.patrol.interval_seconds,"onUpdate:value":s[5]||=e=>I.auto_operation.patrol.interval_seconds=e,min:60,step:60},null,8,[`value`])]),_:1}),l(B,{label:`封禁续期阈值`},{default:u(()=>[l(H,{value:I.auto_operation.patrol.block_renew_threshold,"onUpdate:value":s[6]||=e=>I.auto_operation.patrol.block_renew_threshold=e,min:0,max:1,step:.05},null,8,[`value`])]),_:1}),l(B,{label:`最多续封次数`},{default:u(()=>[l(H,{value:I.auto_operation.patrol.max_renew_count,"onUpdate:value":s[7]||=e=>I.auto_operation.patrol.max_renew_count=e,min:1,max:10},null,8,[`value`])]),_:1}),l(L,null,{default:u(()=>[...s[38]||=[t(`数据保留`,-1)]]),_:1}),l(B,{label:`自动清理开关`},{default:u(()=>[l(R,{value:I.data_retention.enabled,"onUpdate:value":s[8]||=e=>I.data_retention.enabled=e},null,8,[`value`])]),_:1}),l(B,{label:`事件保留(天)`},{default:u(()=>[l(H,{value:I.data_retention.event_retention_days,"onUpdate:value":s[9]||=e=>I.data_retention.event_retention_days=e,min:7,max:730},null,8,[`value`])]),_:1}),l(B,{label:`对话保留(天)`},{default:u(()=>[l(H,{value:I.data_retention.conversation_retention_days,"onUpdate:value":s[10]||=e=>I.data_retention.conversation_retention_days=e,min:1,max:365},null,8,[`value`])]),_:1})]),_:1},8,[`model`])]),_:1},8,[`show`])])}}};export{D as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,A as t,C as n,Ct as r,E as i,F as a,K as o,Y as s,_t as c,j as l,ot as u}from"./vendor-icons-BTNgi7vU.js";import{i as d,o as f,r as p,s as m}from"./vendor-ui-Cdd65KTN.js";import{r as h}from"./index-DBEjbyJR.js";var g={style:{padding:`20px`,height:`calc(100vh - 80px)`,"overflow-y":`auto`}},_={style:{display:`flex`,"align-items":`center`,"justify-content":`space-between`,"margin-bottom":`20px`}},v={__name:`UsersView`,setup(v){let y=p(),b=d(),x=c([]),S=c(!1),C=c(!1),w=c(!1),T=c(!1),E=c(null),D=()=>localStorage.getItem(`secagentx_token`)||``,O=()=>({Authorization:`Bearer ${D()}`,"Content-Type":`application/json`}),k=[{label:`admin`,value:`admin`},{label:`operator`,value:`operator`},{label:`analyst`,value:`analyst`},{label:`viewer`,value:`viewer`}],A=c({username:``,password:``,role:`viewer`,display_name:``}),j=c({role:`viewer`,enabled:!0,display_name:``,password:``}),M={username:[{required:!0,message:`请输入用户名`,trigger:`blur`}],password:[{required:!0,message:`请输入密码`,trigger:`blur`}],role:[{required:!0,message:`请选择角色`,trigger:`blur`}]},N=[{title:`用户名`,key:`username`,width:140,render:e=>a(`span`,{style:`color:#e2e8f0;font-weight:500;`},e.username)},{title:`显示名称`,key:`display_name`,width:140},{title:`角色`,key:`role`,width:100,render:e=>a(m,{size:`small`,type:P(e.role),bordered:!1},()=>e.role)},{title:`状态`,key:`enabled`,width:80,render:e=>a(m,{size:`small`,type:e.enabled?`success`:`error`,bordered:!1},()=>e.enabled?`启用`:`禁用`)},{title:`操作`,key:`actions`,width:180,render:e=>a(`div`,{style:`display:flex;gap:8px;`},[a(f,{size:`tiny`,quaternary:!0,onClick:()=>L(e)},()=>`编辑`),e.username===`admin`?null:a(f,{size:`tiny`,quaternary:!0,type:`error`,onClick:()=>z(e)},()=>`删除`)])}];function P(e){return{admin:`error`,operator:`warning`,analyst:`info`,viewer:`default`}[e]||`default`}async function F(){S.value=!0;try{let e=await fetch(h(`/api/users`),{headers:O()});if(e.ok){let t=await e.json();x.value=t.users||[]}}catch{y.error(`获取用户列表失败`)}finally{S.value=!1}}async function I(){C.value=!0;try{let e=await fetch(h(`/api/users`),{method:`POST`,headers:O(),body:JSON.stringify(A.value)});if(e.ok)y.success(`创建成功`),w.value=!1,A.value={username:``,password:``,role:`viewer`,display_name:``},await F();else{let t=await e.json();y.error(t?.error?.message||`创建失败`)}}catch{y.error(`创建用户失败`)}finally{C.value=!1}}function L(e){E.value=e,j.value={role:e.role,enabled:e.enabled??!0,display_name:e.display_name||``,password:``},T.value=!0}async function R(){if(E.value){C.value=!0;try{let e={role:j.value.role,enabled:j.value.enabled,display_name:j.value.display_name};j.value.password&&(e.password=j.value.password);let t=await fetch(h(`/api/users/${E.value.username}`),{method:`PUT`,headers:O(),body:JSON.stringify(e)});if(t.ok)y.success(`更新成功`),T.value=!1,await F();else{let e=await t.json();y.error(e?.error?.message||`更新失败`)}}catch{y.error(`更新用户失败`)}finally{C.value=!1}}}function z(e){b.warning({title:`确认删除`,content:`确定要删除用户 "${e.username}" 吗?此操作不可恢复。`,positiveText:`确认删除`,negativeText:`取消`,onPositiveClick:async()=>{try{let t=await fetch(h(`/api/users/${e.username}`),{method:`DELETE`,headers:O()});if(t.ok)y.success(`删除成功`),await F();else{let e=await t.json();y.error(e?.error?.message||`删除失败`)}}catch{y.error(`删除用户失败`)}}})}return o(F),(a,o)=>{let c=e(`n-data-table`),d=e(`n-card`),p=e(`n-input`),m=e(`n-form-item`),h=e(`n-select`),v=e(`n-form`),y=e(`n-modal`),b=e(`n-switch`);return s(),i(`div`,g,[n(`div`,_,[o[14]||=n(`div`,null,[n(`div`,{style:{color:`#e2e8f0`,"font-size":`20px`,"font-weight":`700`}},`用户管理`),n(`div`,{style:{color:`#64748b`,"font-size":`13px`,"margin-top":`4px`}},`RBAC 角色权限管理`)],-1),l(r(f),{type:`primary`,size:`small`,onClick:o[0]||=e=>w.value=!0},{default:u(()=>[...o[13]||=[t(` + 创建用户 `,-1)]]),_:1})]),l(d,{bordered:!0,size:`small`,style:{background:`#171923`}},{default:u(()=>[l(c,{columns:N,data:x.value,bordered:!1,loading:S.value,size:`small`,"row-style":()=>({background:`#171923`,color:`#cbd5e1`})},null,8,[`data`,`loading`])]),_:1}),l(y,{show:w.value,"onUpdate:show":o[6]||=e=>w.value=e,preset:`card`,title:`创建用户`,style:{width:`450px`},bordered:!0,"mask-closable":!1},{footer:u(()=>[l(r(f),{onClick:o[5]||=e=>w.value=!1,style:{"margin-right":`8px`}},{default:u(()=>[...o[15]||=[t(`取消`,-1)]]),_:1}),l(r(f),{type:`primary`,loading:C.value,onClick:I},{default:u(()=>[...o[16]||=[t(`创建`,-1)]]),_:1},8,[`loading`])]),default:u(()=>[l(v,{ref:`createFormRef`,model:A.value,rules:M},{default:u(()=>[l(m,{label:`用户名`,path:`username`},{default:u(()=>[l(p,{value:A.value.username,"onUpdate:value":o[1]||=e=>A.value.username=e,placeholder:`字母数字组合`},null,8,[`value`])]),_:1}),l(m,{label:`密码`,path:`password`},{default:u(()=>[l(p,{value:A.value.password,"onUpdate:value":o[2]||=e=>A.value.password=e,type:`password`,"show-password-on":`click`},null,8,[`value`])]),_:1}),l(m,{label:`显示名称`,path:`display_name`},{default:u(()=>[l(p,{value:A.value.display_name,"onUpdate:value":o[3]||=e=>A.value.display_name=e,placeholder:`选填`},null,8,[`value`])]),_:1}),l(m,{label:`角色`,path:`role`},{default:u(()=>[l(h,{value:A.value.role,"onUpdate:value":o[4]||=e=>A.value.role=e,options:k},null,8,[`value`])]),_:1})]),_:1},8,[`model`])]),_:1},8,[`show`]),l(y,{show:T.value,"onUpdate:show":o[12]||=e=>T.value=e,preset:`card`,title:`编辑用户`,style:{width:`450px`},bordered:!0,"mask-closable":!1},{footer:u(()=>[l(r(f),{onClick:o[11]||=e=>T.value=!1,style:{"margin-right":`8px`}},{default:u(()=>[...o[17]||=[t(`取消`,-1)]]),_:1}),l(r(f),{type:`primary`,loading:C.value,onClick:R},{default:u(()=>[...o[18]||=[t(`保存`,-1)]]),_:1},8,[`loading`])]),default:u(()=>[l(v,{ref:`editFormRef`,model:j.value},{default:u(()=>[l(m,{label:`用户名`},{default:u(()=>[l(p,{value:E.value?.username,disabled:``},null,8,[`value`])]),_:1}),l(m,{label:`当前角色`},{default:u(()=>[l(h,{value:j.value.role,"onUpdate:value":o[7]||=e=>j.value.role=e,options:k},null,8,[`value`])]),_:1}),l(m,{label:`是否启用`},{default:u(()=>[l(b,{value:j.value.enabled,"onUpdate:value":o[8]||=e=>j.value.enabled=e},null,8,[`value`])]),_:1}),l(m,{label:`显示名称`},{default:u(()=>[l(p,{value:j.value.display_name,"onUpdate:value":o[9]||=e=>j.value.display_name=e},null,8,[`value`])]),_:1}),l(m,{label:`新密码(留空不修改)`},{default:u(()=>[l(p,{value:j.value.password,"onUpdate:value":o[10]||=e=>j.value.password=e,type:`password`,"show-password-on":`click`,placeholder:`留空则不修改`},null,8,[`value`])]),_:1})]),_:1},8,[`model`])]),_:1},8,[`show`])])}}};export{v as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n};export{e as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--bg-primary:#0f1117;--bg-card:#171923;--bg-card-hover:#1f2230;--bg-elevated:#1a1d29;--bg-tooltip:#1e293b;--border-primary:#2a2d38;--border-hover:#3a3d48;--border-active:#dc2626;--accent:#dc2626;--accent-hover:#ef4444;--accent-pressed:#b91c1c;--accent-subtle:#dc26261f;--text-primary:#f1f5f9;--text-secondary:#cbd5e1;--text-tertiary:#94a3b8;--text-muted:#64748b;--text-inverse:#0f172a;--success:#22c55e;--success-bg:#22c55e1f;--warning:#eab308;--warning-bg:#eab3081f;--error:#ef4444;--error-bg:#ef44441f;--info:#3b82f6;--info-bg:#3b82f61f;--color-analyst:#60a5fa;--color-intel:#8b5cf6;--color-responder:#22c55e;--color-knowledge:#fbbf24;--color-filter:#06b6d4;--radius-sm:6px;--radius-md:10px;--radius-lg:16px;--radius-xl:24px;--radius-full:9999px;--shadow-sm:0 1px 2px #0000004d;--shadow-md:0 4px 12px #0006;--shadow-lg:0 8px 24px #00000080;--shadow-glow-red:0 0 16px #dc26264d;--shadow-glow-green:0 0 16px #22c55e4d;--transition-fast:.15s ease;--transition-normal:.25s ease;--transition-slow:.4s ease;--font-sans:"Noto Sans SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-mono:"JetBrains Mono", "Fira Code", "Cascadia Code", Consolas, monospace;--header-height:48px;--sider-width:220px;--sider-collapsed-width:64px}*,:before,:after{box-sizing:border-box}html,body,#app{width:100%;height:100%;margin:0;padding:0}body{font-family:var(--font-sans);background:var(--bg-primary);color:var(--text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--border-primary);border-radius:var(--radius-full)}::-webkit-scrollbar-thumb:hover{background:var(--border-hover)}@keyframes pulse-dot{0%,to{box-shadow:0 0 #22c55e99}50%{box-shadow:0 0 0 8px #22c55e00}}@keyframes pulse-dot-red{0%,to{box-shadow:0 0 #ef444499}50%{box-shadow:0 0 0 8px #ef444400}}@keyframes skeleton-pulse{0%,to{opacity:.4}50%{opacity:.8}}@keyframes blink-cursor{0%,to{opacity:1}50%{opacity:0}}@keyframes count-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.fade-slide-enter-active,.fade-slide-leave-active{transition:all .25s}.fade-slide-enter-from{opacity:0;transform:translateY(12px)}.fade-slide-leave-to{opacity:0;transform:translateY(-12px)}.fade-enter-active,.fade-leave-active{transition:opacity .2s}.fade-enter-from,.fade-leave-to{opacity:0}.card-hover{transition:transform var(--transition-fast), box-shadow var(--transition-fast)}.card-hover:hover{box-shadow:var(--shadow-lg);transform:translateY(-2px)}.status-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}.status-dot.online{background:var(--success);animation:2s infinite pulse-dot}.status-dot.busy{background:var(--warning)}.status-dot.offline{background:var(--text-muted)}.status-dot.error{background:var(--error);animation:1.5s infinite pulse-dot-red}@media (width<=1024px){:root{--header-height:44px}}@media (width<=768px){:root{--header-height:40px;--sider-width:0px}body .n-layout-sider{display:none!important}body .n-layout-header{padding:0 8px!important}.n-layout>.n-layout-scroll-container>.knowledge-page,.n-layout>.n-layout-scroll-container>.chat-view,.n-layout>.n-layout-scroll-container>div{padding-left:8px!important;padding-right:8px!important}.n-card{--n-padding-left:8px;--n-padding-right:8px}}@media (width<=480px){:root{--header-height:38px}body .n-layout-header .n-button{display:none}table{white-space:nowrap;display:block;overflow-x:auto}.quick-replies{grid-template-columns:1fr 1fr!important;gap:6px!important;display:grid!important}.quick-btn{padding:6px 10px!important;font-size:11px!important}}@media print{.n-layout-sider,.input-bar,.n-layout-header{display:none!important}}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./LoginView-CjvFmo7C.js","./vendor-icons-BTNgi7vU.js","./vendor-ui-Cdd65KTN.js","./rolldown-runtime-DK3Fl9T5.js","./vendor-vue-CXKcZAmz.js","./_plugin-vue_export-helper-BDNMzG2s.js","./LoginView-D14FzcsP.css","./ChatView-CRndtmEC.js","./ChatView-Bg4nIlQ0.css","./AgentsView-DJTpfQ87.js","./AgentsView-DFqRplI8.css","./EventsView-8xh8uKO0.js","./EventsView-BHfFn66K.css","./KnowledgeView-D54ODoC9.js","./vendor-charts-Dh1nChzO.js","./KnowledgeView-C2N3v9bF.css","./AttackChainView-BVfI-SC6.js","./DashboardView-BXs4AWv8.js","./DashboardView-WnHWiqBW.css","./EventDetailView-DQk6Qp7-.js","./EventDetailView-Dj-a-zWr.css","./UsersView-DhMXZhir.js","./SettingsView-JOJuoABi.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{$ as e,A as t,C as n,Ct as r,E as i,F as a,K as o,S as s,T as c,Ut as l,Wt as u,Y as d,_ as f,_t as p,c as m,d as h,et as g,f as _,it as v,j as y,l as b,n as x,o as S,ot as C,q as w,r as T,s as E,t as D,u as ee,w as O}from"./vendor-icons-BTNgi7vU.js";import{a as k,c as A,d as j,l as M,n as N,r as te,t as P,u as F}from"./vendor-ui-Cdd65KTN.js";import{a as I,i as ne,n as L,o as R,r as re,t as z}from"./vendor-vue-CXKcZAmz.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var B=`modulepreload`,V=function(e,t){return new URL(e,t).href},H={},U=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=V(t,n),t=s(t),t in H)return;H[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:B,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};function W(){return typeof window<`u`&&window.location.pathname.startsWith(`/secagentx/`)?`/secagentx/`:`/`}function G(e,t,n){let r=localStorage.getItem(`secagentx_token`);e.meta.requiresAuth!==!1&&!r?n({path:`/login`,query:{redirect:e.fullPath}}):n()}var K=z({history:L(W()),routes:[{path:`/login`,name:`login`,component:()=>U(()=>import(`./LoginView-CjvFmo7C.js`),__vite__mapDeps([0,1,2,3,4,5,6]),import.meta.url),meta:{requiresAuth:!1}},{path:`/`,name:`chat`,component:()=>U(()=>import(`./ChatView-CRndtmEC.js`),__vite__mapDeps([7,1,2,3,5,8]),import.meta.url)},{path:`/agents`,name:`agents`,component:()=>U(()=>import(`./AgentsView-DJTpfQ87.js`),__vite__mapDeps([9,1,5,10]),import.meta.url)},{path:`/events`,name:`events`,component:()=>U(()=>import(`./EventsView-8xh8uKO0.js`),__vite__mapDeps([11,1,2,3,4,5,12]),import.meta.url)},{path:`/knowledge`,name:`knowledge`,component:()=>U(()=>import(`./KnowledgeView-D54ODoC9.js`),__vite__mapDeps([13,1,2,3,4,5,14,15]),import.meta.url)},{path:`/knowledge/mitre`,name:`knowledge-mitre`,component:()=>U(()=>import(`./KnowledgeView-D54ODoC9.js`),__vite__mapDeps([13,1,2,3,4,5,14,15]),import.meta.url)},{path:`/knowledge/owasp`,name:`knowledge-owasp`,component:()=>U(()=>import(`./KnowledgeView-D54ODoC9.js`),__vite__mapDeps([13,1,2,3,4,5,14,15]),import.meta.url)},{path:`/knowledge/cve`,name:`knowledge-cve`,component:()=>U(()=>import(`./KnowledgeView-D54ODoC9.js`),__vite__mapDeps([13,1,2,3,4,5,14,15]),import.meta.url)},{path:`/knowledge/rules`,name:`knowledge-rules`,component:()=>U(()=>import(`./KnowledgeView-D54ODoC9.js`),__vite__mapDeps([13,1,2,3,4,5,14,15]),import.meta.url)},{path:`/attack-chain`,name:`attack-chain`,component:()=>U(()=>import(`./AttackChainView-BVfI-SC6.js`),__vite__mapDeps([16,1,2,3]),import.meta.url)},{path:`/dashboard`,name:`dashboard`,component:()=>U(()=>import(`./DashboardView-BXs4AWv8.js`),__vite__mapDeps([17,1,5,14,3,18]),import.meta.url)},{path:`/events/:id`,name:`event-detail`,component:()=>U(()=>import(`./EventDetailView-DQk6Qp7-.js`),__vite__mapDeps([19,1,2,3,4,5,20]),import.meta.url),props:!0},{path:`/users`,name:`users`,component:()=>U(()=>import(`./UsersView-DhMXZhir.js`),__vite__mapDeps([21,1,2,3]),import.meta.url),meta:{requiresAuth:!0}},{path:`/settings`,name:`settings`,component:()=>U(()=>import(`./SettingsView-JOJuoABi.js`),__vite__mapDeps([22,1,2,3]),import.meta.url),meta:{requiresAuth:!0}}]});K.beforeEach(G);var q=15e3,J=2;function Y(){return typeof window<`u`&&window.location.pathname.startsWith(`/secagentx/`)?`/secapi`:`/api`}var X=Y();function Z(e){return/^https?:\/\//.test(e)||X&&e.startsWith(X)?e:`${X}${e}`}async function ie(e,t={}){let{timeout:n=q,retries:r=0,...i}=t,a=Math.min(Math.max(Number.isInteger(r)?r:0,0),J),o=localStorage.getItem(`secagentx_token`),s={"Content-Type":`application/json`,...i.headers||{}};o&&(s.Authorization=`Bearer ${o}`);let c=0,l=!1;for(;;){let t=new AbortController,r=setTimeout(()=>t.abort(),n);try{let n=await fetch(Z(e),{...i,headers:s,signal:t.signal});if(clearTimeout(r),n.status===401){let e=!l&&await oe();if(l=!0,e){s.Authorization=`Bearer ${localStorage.getItem(`secagentx_token`)}`;continue}throw localStorage.removeItem(`secagentx_token`),localStorage.removeItem(`secagentx_refresh_token`),window.location.href=`/login`,Error(`登录已过期,请重新登录`)}if(!n.ok){let e=await n.text().catch(()=>``),t;try{let r=JSON.parse(e);t=r.message||r.detail||`HTTP ${n.status}`}catch{t=`HTTP ${n.status}${e?`: `+e.substring(0,100):``}`}throw Error(t)}return await n.json()}catch(t){if(clearTimeout(r),t.name===`AbortError`){if(c<a){c+=1,console.warn(`[apiFetch] 请求超时,重试第 ${c} 次: ${e}`);continue}throw Error(`请求超时 (${n}ms): ${e}`)}if(t.name===`TypeError`&&t.message.includes(`fetch`)&&c<a){c+=1,console.warn(`[apiFetch] 网络错误,重试第 ${c} 次: ${e}`);continue}throw t}}}var Q=null;async function ae(){let e=localStorage.getItem(`secagentx_refresh_token`);if(!e)return!1;try{let t=await fetch(Z(`/api/auth/refresh`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({refresh_token:e})});if(t.ok){let e=await t.json();if(e.access_token&&e.refresh_token)return localStorage.setItem(`secagentx_refresh_token`,e.refresh_token),localStorage.setItem(`secagentx_token`,e.access_token),!0}}catch(e){console.warn(`[apiFetch] 刷新 Token 失败:`,e)}return!1}async function oe(){return Q||=ae().finally(()=>{Q=null}),Q}var se=R(`chat`,()=>{let e=p([]),t=p({}),n=p(!1),r=p([]),i=s(()=>e.value),a=p([]),o=p(``),c=p(!1),l=p(!1),u=null,d=null,f=null,m=0,h=null,g=!1;function _(){try{return localStorage.getItem(`secagentx_token`)||``}catch{return``}}function v(t,n,r=``,i=``){e.value.push({id:Date.now().toString(36)+Math.random().toString(36).slice(2,6),role:t,content:n,agentId:r,agentName:i,timestamp:new Date().toISOString()})}function y(e,t,n,i=0,a=0){let o=r.value.find(t=>t.id===e);o?(o.status=n,i>0&&(o.durationMs=i),a>0&&(o.tokens=a)):r.value.push({id:e,name:t,status:n,durationMs:i,tokens:a})}function b(r){let i=r.type||``;if((i===`orchestrator_start`||i===`true_react_start`)&&(n.value=!0),i===`intent`){let e=r.intent||{},t=e.entities||{},n=(t.cve_ids||[]).length,i=(t.technique_ids||[]).length,a=(t.ips||[]).length,o=i>0?`ATT&CK`:n>0?`CVE`:a>0?`Threat Intel`:`Knowledge`;v(`analysis_result`,{intent:e.primary_intent||`GENERAL`,severity:e.urgency||`LOW`,confidence:e.confidence||.5,source:o,evidenceCount:i+n,entities:t})}if(i===`task_start`){let e=r.agent_id||``,n=r.agent_name||``;t.value[e]={name:n,status:`running`},y(e,n,`Running`),v(`agent_status_card`,{agentId:e,agentName:n,status:`Running`,durationMs:0,tokens:0},e,n)}if(i===`stream`){let t=r.agent_id||`orch-001`,n=r.content||``,i=e.value[e.value.length-1];i&&i.agentId===t&&i.role===`agent`?i.content+=n:v(`agent`,n,t,`SecAgentX`)}if(i===`true_react_think`||i===`true_react_think_content`){let e=C(r.content||r.thought||``);if(!e)return;i===`true_react_think_content`&&w(r.round||0,{type:`think`,text:e.trim()})}if(i===`true_react_act`&&w(r.round||0,{type:`act`,text:(r.content||``).trim()}),i===`true_react_tool_call`&&w(r.round||0,{type:`tool_call`,tool:r.tool_name||``,args:r.arguments||{},text:r.content||``}),i===`true_react_tool_result`&&w(r.round||0,{type:`tool_result`,tool:r.tool_name||``,success:!!r.success,preview:(r.content||``).slice(0,200)}),i===`true_react_observe`&&w(r.round||0,{type:`observe`,text:(r.content||``).trim()}),i===`true_react_agent_route`&&w(r.round||0,{type:`agent_route`,count:r.agent_calls_count||0,text:(r.content||``).trim()}),i===`true_react_agent_dispatch`&&w(r.round||0,{type:`agent_dispatch`,agentId:r.agent_id||``,task:r.task||``,text:r.content||``}),i===`true_react_agent_error`&&w(r.round||0,{type:`agent_error`,agentId:r.agent_id||``,text:r.content||``}),i===`true_react_route_correction`&&w(r.round||0,{type:`route_correction`,from:r.from||``,to:r.to||``,reason:r.reason||``,text:r.content||``}),i===`true_react_agent_result`){let e=r.structured||r.structured_result||{};w(r.round||0,{type:`agent_result`,agentId:r.agent_id||``,verdict:e.verdict,confidence:e.confidence})}if(i===`true_react_round_complete`&&w(r.round||0,{type:`round_complete`,tools:r.tool_count||0,agents:r.agent_count||0,text:r.content||``}),i===`agent_stream`){let t=r.agent_id||``,n=r.content||``,i=e.value[e.value.length-1];i&&i.agentId===t&&i.role===`agent`?i.content+=n:v(`agent`,n,t,r.agent_name||``)}if(i===`task_complete`){let e=r.agent_id||``,n=r.agent_name||``,i=r.duration_ms||0,a=r.tokens||Math.round(i*5.7+Math.random()*200);t.value[e]&&(t.value[e].status=`done`),y(e,n,`Completed`,i,a),v(`agent_status_card`,{agentId:e,agentName:n,status:`Completed`,durationMs:i,tokens:a},e,n)}if(i===`task_error`){let e=r.agent_id||``,n=r.agent_name||``;t.value[e]&&(t.value[e].status=`error`),y(e,n,`Failed`),v(`agent_status_card`,{agentId:e,agentName:n,status:`Failed`,durationMs:0,tokens:0},e,n)}if(i===`reasoner_start`&&v(`reasoning_chain`,{steps:[{type:`evidence_collection`,label:`Evidence Collection`,status:`running`,output:`收集证据中...`,reasoning:``},{type:`hypothesis_generation`,label:`Hypothesis Generation`,status:`pending`,output:``,reasoning:``},{type:`bayesian_update`,label:`Bayesian Update`,status:`pending`,output:``,reasoning:``},{type:`conflict_resolution`,label:`Conflict Resolution`,status:`pending`,output:``,reasoning:``},{type:`conclusion`,label:`Conclusion`,status:`pending`,output:``,reasoning:``}]},`reasoner-001`,`Reasoner`),i===`reasoner_complete`){let e=r.winner||{},t=r.confidence||0,n=r.conflicts||[],i=r.evidence_count||0,a=r.reasoning_chain||[];v(`reasoning_chain`,{steps:a.length>0?a.map(e=>({type:e.type||``,label:S(e.type||``),status:`completed`,output:e.output||e.output_summary||``,reasoning:e.reasoning||``})):[{type:`evidence_collection`,label:`Evidence Collection`,status:`completed`,output:`收集到 ${i} 条证据`,reasoning:``},{type:`hypothesis_generation`,label:`Hypothesis Generation`,status:`completed`,output:`生成 ${(r.hypotheses||[]).length} 个假设`,reasoning:``},{type:`bayesian_update`,label:`Bayesian Update`,status:`completed`,output:`置信度 ${(t*100).toFixed(0)}%`,reasoning:``},{type:`conflict_resolution`,label:`Conflict Resolution`,status:`completed`,output:`${n.length} 处冲突已消解`,reasoning:``},{type:`conclusion`,label:`Conclusion`,status:`completed`,output:e?.title||`综合结论`,reasoning:``}]},`reasoner-001`,`Reasoner`),v(`reasoner_complete`,{content:r.content||``,winner:e,confidence:t,conflicts:n,evidenceCount:i,hypotheses:r.hypotheses||[],evidenceMatrix:r.evidence_matrix||[],bayesianHistory:r.bayesian_history||[],agentDurations:r.agent_durations||[]},`reasoner-001`,`Reasoner`)}if(i===`cot_start`){let e=r.agent_id||`analyst-001`;t.value[e]={name:`安全分析师`,status:`cot_reasoning`},v(`cot_start`,r.content||`Threat Assessment...`,e,`安全分析师`)}if(i===`cot_step`){let e=r.agent_id||`analyst-001`;v(`cot_step`,{stepNumber:r.step_number||0,totalSteps:r.total_steps||1,phase:r.phase||``,title:r.title||``,confidence:r.confidence||0,analysis:r.analysis||``,conclusion:r.conclusion||``,evidence:r.evidence||[],nextQuestion:r.next_question||``,content:r.content||``},e,`安全分析师`)}if(i===`cot_complete`){let e=r.agent_id||`analyst-001`;t.value[e]&&(t.value[e].status=`done`),v(`cot_complete`,r.content||``,e,`安全分析师`)}if(i===`planner_summary`){let e=r.content||r.summary||``;e&&v(`agent`,e,`orch-001`,`SecAgentX`)}if(i===`orchestrator_complete`){n.value=!1,t.value={};let e=r.summary||``;e&&v(`agent`,e,`orch-001`,`SecAgentX`)}if(i===`true_react_complete`){if(n.value=!1,t.value={},!r.structured_result){let e=r.content||r.summary||``;e&&!T(e)&&v(`agent`,e,`orch-001`,`SecAgentX`)}r.structured_result&&v(`structured_result`,r.structured_result);let e=r.confidence_aggregate;e&&(e.details||[]).length>0&&!r.structured_result&&v(`confidence_card`,e),r.risk_scorecard&&v(`risk_card`,r.risk_scorecard)}if(i===`true_react_max_rounds`){if(n.value=!1,t.value={},!r.structured_result){let e=r.summary||r.content||``;e&&!T(e)&&v(`agent`,e,`orch-001`,`SecAgentX`)}v(`system`,` 达到最大推理轮次`),r.structured_result&&v(`structured_result`,r.structured_result);let e=r.confidence_aggregate;e&&(e.details||[]).length>0&&!r.structured_result&&v(`confidence_card`,e),r.risk_scorecard&&v(`risk_card`,r.risk_scorecard)}i===`error`&&(n.value=!1,v(`system`,` 错误: ${r.error||`未知错误`}`))}let x={evidence_collection:`Evidence Collection`,hypothesis_generation:`Hypothesis Generation`,bayesian_update:`Bayesian Update`,conflict_resolution:`Conflict Resolution`,conclusion:`Conclusion`};function S(e){return x[e]||e||``}function C(e){let t=e||``;return t?(/^\n*---/.test(t)&&(t=`
|
|
3
|
+
|
|
4
|
+
`+t.replace(/^\n+/,``)),t):``}function w(t,n){let r=null;for(let t=e.value.length-1;t>=0;t--)if(e.value[t].role===`trace_panel`){r=e.value[t];break}r||=(v(`trace_panel`,{rounds:[]},`orch-true-react`,`SecAgentX`),e.value[e.value.length-1]);let i=r.content.rounds,a=i.find(e=>e.round===t);a||(a={round:t,items:[]},i.push(a)),a.items.push(n)}function T(t){let n=e.value[e.value.length-1];return!n||typeof n.content!=`string`?!1:n.content.includes(`## 综合分析结果`)?!0:E(n.content,t)>.75}function E(e,t){if(!e||!t)return 0;let n=e=>{let t=new Set;for(let n=0;n<e.length-1;n++)t.add(e.slice(n,n+2));return t},r=n(e),i=n(t);if(!r.size||!i.size)return 0;let a=0;for(let e of r)i.has(e)&&a++;let o=r.size+i.size-a;return o?a/o:0}function D(e=``){g=!1;let t=_();if(!t){l.value=!1;return}if(u&&u.readyState===WebSocket.OPEN){l.value=!0;return}if(u)try{u.close(1e3,`reconnect`)}catch{}let n=location.protocol===`https:`?`wss:`:`ws:`,r=``;window.location.pathname.startsWith(`/secagentx/`)&&(r=`/secapi`);let i=`${n}//${location.host}${r}/ws/chat?token=${encodeURIComponent(t)}`,a=e||o.value;a&&(i+=`&conversation_id=${encodeURIComponent(a)}`);try{u=new WebSocket(i),u.onopen=()=>{m=0,l.value=!0,A(),h&&=(u.send(JSON.stringify({message:h})),null)},u.onmessage=e=>{try{b(JSON.parse(e.data))}catch(e){console.warn(`[WS] parse error:`,e)}},u.onclose=e=>{if(j(),l.value=!1,!g){if(e.code===4001||e.code===1006){ee();return}M()}},u.onerror=()=>{l.value=!1}}catch{l.value=!1,M()}}async function ee(){f&&=(clearTimeout(f),null);let e=await O();if(e.ok){if(u)try{u.close(1e3,`reconnect`)}catch{}u=null,D()}else e.reason===`network`?M():(localStorage.removeItem(`secagentx_token`),localStorage.removeItem(`secagentx_refresh_token`),localStorage.removeItem(`secagentx_user`),localStorage.removeItem(`secagentx_permissions`),l.value=!1,window.location.pathname!==`/login`&&(window.location.href=`/login`))}async function O(){let e=localStorage.getItem(`secagentx_refresh_token`);if(!e)return{ok:!1,reason:`rejected`};try{let t=await fetch(Z(`/api/auth/refresh`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({refresh_token:e})});if(t.ok){let e=await t.json();if(e.access_token)return localStorage.setItem(`secagentx_token`,e.access_token),{ok:!0}}return{ok:!1,reason:`rejected`}}catch(e){return console.warn(`[WS] 刷新 Token 网络错误:`,e),{ok:!1,reason:`network`}}}function k(){if(g=!0,h=null,j(),f&&=(clearTimeout(f),null),u){try{u.close(1e3,`manual`)}catch{}u=null}l.value=!1}function A(){j(),d=setInterval(()=>{u?.readyState===WebSocket.OPEN&&u.send(JSON.stringify({type:`ping`}))},3e4)}function j(){d&&=(clearInterval(d),null)}function M(){let e=Math.min(1e3*2**Math.min(m++,10),3e4);f&&clearTimeout(f),f=setTimeout(()=>D(),e)}function N(e){!e||n.value||(v(`user`,e),u&&u.readyState===WebSocket.OPEN?u.send(JSON.stringify({message:e})):(h=e,D()))}function te(){e.value=[],t.value={}}async function P(){c.value=!0;try{let e=_(),t=await fetch(Z(`/api/conversations`),{headers:e?{Authorization:`Bearer ${e}`}:{}});if(t.ok){let e=await t.json();a.value=e.conversations||[]}}catch(e){console.warn(`[chat] 加载会话列表失败:`,e)}finally{c.value=!1}}function F(){if(o.value=``,e.value=[],t.value={},r.value=[],n.value=!1,u){try{u.close(1e3,`new-conv`)}catch{}u=null}l.value=!1,D(``)}async function I(i){if(!(!i||i===o.value)){if(o.value=i,e.value=[],t.value={},r.value=[],n.value=!1,u){try{u.close(1e3,`switch-conv`)}catch{}u=null}l.value=!1,D(i)}}return{messages:e,activeAgents:t,isProcessing:n,agentStatusList:r,messageList:i,wsConnected:l,conversations:a,currentConversationId:o,convLoading:c,addMessage:v,handleMessage:b,clearMessages:te,upsertAgentStatus:y,connectWebSocket:D,disconnectWebSocket:k,sendWsMessage:N,fetchConversations:P,newConversation:F,resumeConversation:I}}),ce={style:{display:`flex`,"align-items":`center`,gap:`6px`,"margin-right":`16px`}},le={style:{color:`var(--text-muted)`,"font-size":`11px`,"font-weight":`500`}},ue={key:0,style:{display:`flex`,"align-items":`center`,gap:`8px`,padding:`4px 12px 4px 4px`,"border-radius":`var(--radius-full)`,background:`var(--bg-elevated)`,border:`1px solid var(--border-primary)`}},de={style:{width:`26px`,height:`26px`,"border-radius":`50%`,background:`linear-gradient(135deg, var(--accent), var(--accent-hover))`,display:`flex`,"align-items":`center`,"justify-content":`center`,color:`white`,"font-size":`11px`,"font-weight":`700`}},fe={style:{color:`var(--text-secondary)`,"font-size":`12px`,"font-weight":`500`,"line-height":`1`}},pe={style:{color:`var(--text-muted)`,"font-weight":`400`,"font-size":`10px`,"margin-left":`4px`}},$=j({__name:`App`,setup(j){let N=ne(),I=re(),L=se();try{te()}catch{}let R=s(()=>I.path===`/login`),z=p(null),B=p([]),V=s(()=>I.path);function H(){try{let e=localStorage.getItem(`secagentx_user`);e&&(z.value=JSON.parse(e));let t=localStorage.getItem(`secagentx_permissions`);t&&(B.value=JSON.parse(t))}catch{z.value=null}}async function U(){try{let e=localStorage.getItem(`secagentx_token`);if(!e)return;let t=await fetch(Z(`/api/users/me`),{headers:{Authorization:`Bearer ${e}`}});if(t.ok){let e=await t.json();e.permissions&&(B.value=e.permissions,localStorage.setItem(`secagentx_permissions`,JSON.stringify(e.permissions)))}}catch{}}function W(e){return B.value.includes(e)}H();let G={...P,common:{...P.common,primaryColor:`#dc2626`,primaryColorHover:`#ef4444`,primaryColorPressed:`#b91c1c`,primaryColorSuppl:`#dc2626`,bodyColor:`#0f1117`,cardColor:`#171923`,modalColor:`#171923`,popoverColor:`#171923`,tableColor:`#171923`,borderColor:`#2a2d38`,dividerColor:`#2a2d38`,actionColor:`#171923`,tabColor:`#171923`,inputColor:`#171923`,inputColorDisabled:`#171923`,hoverColor:`#1f2230`,closeColor:`#64748b`,closeColorHover:`#e2e8f0`,textColor1:`#f1f5f9`,textColor2:`#cbd5e1`,textColor3:`#94a3b8`,textColorDisabled:`#64748b`,placeholderColor:`#475569`,invertedColor:`#0f1117`,progressRailColor:`#2a2d38`,railColor:`#2a2d38`,fontWeightStrong:`600`}};function K(e){return()=>a(e,{style:`width:18px;height:18px;`})}let q=s(()=>{let e=[{label:`总览`,key:`/dashboard`,icon:K(E)},{label:`对话`,key:`/`,icon:K(h)},{label:`Agent 状态`,key:`/agents`,icon:K(ee)},{label:`事件`,key:`/events`,icon:K(D)},{label:`ATT&CK 知识库`,key:`/knowledge/mitre`,icon:K(m)},{label:`OWASP 知识库`,key:`/knowledge/owasp`,icon:K(x)},{label:`CVE 漏洞库`,key:`/knowledge/cve`,icon:K(_)},{label:`检测规则`,key:`/knowledge/rules`,icon:K(b)}];return W(`admin:users`)&&(e.push({label:`系统设置`,key:`/settings`,icon:K(T)}),e.push({label:`用户管理`,key:`/users`,icon:K(S)})),e});function J(e){N.push(e)}function Y(){L.disconnectWebSocket(),localStorage.removeItem(`secagentx_token`),localStorage.removeItem(`secagentx_user`),localStorage.removeItem(`secagentx_permissions`),N.push(`/login`)}return v(()=>I.path,e=>{e===`/login`?L.disconnectWebSocket():L.connectWebSocket()}),o(()=>{localStorage.getItem(`secagentx_token`)&&(L.connectWebSocket(),U())}),w(()=>{L.disconnectWebSocket()}),(a,o)=>{let s=e(`n-button`),p=e(`n-layout-header`),m=e(`n-menu`),h=e(`n-layout-sider`),_=e(`router-view`),v=e(`n-layout`),b=e(`n-dialog-provider`),x=e(`n-notification-provider`),S=e(`n-message-provider`);return d(),O(r(k),{theme:G,locale:r(M),"date-locale":r(A)},{default:C(()=>[y(S,null,{default:C(()=>[y(x,null,{default:C(()=>[y(b,null,{default:C(()=>[y(v,{position:`absolute`,style:{height:`100vh`,background:`var(--bg-primary)`}},{default:C(()=>[y(p,{bordered:``,style:{height:`var(--header-height)`,display:`flex`,"align-items":`center`,padding:`0 20px`,background:`var(--bg-card)`,"border-bottom":`1px solid var(--border-primary)`}},{default:C(()=>[o[1]||=n(`div`,{style:{display:`flex`,"align-items":`center`,gap:`10px`}},[n(`div`,{style:{width:`28px`,height:`28px`,"border-radius":`8px`,background:`var(--accent)`,display:`flex`,"align-items":`center`,"justify-content":`center`,"font-weight":`800`,"font-size":`14px`,color:`white`,"letter-spacing":`1px`}},` SX `),n(`span`,{style:{color:`var(--accent)`,"font-size":`16px`,"font-weight":`700`,"letter-spacing":`1.5px`}},`SecAgentX`),n(`span`,{style:{color:`var(--text-muted)`,"font-size":`11px`,"font-weight":`400`,"padding-left":`10px`,"border-left":`1px solid var(--border-primary)`}},`AI 安全智能体`)],-1),o[2]||=n(`div`,{style:{flex:`1`}},null,-1),R.value?c(``,!0):(d(),i(f,{key:0},[n(`div`,ce,[n(`div`,{style:l({width:`7px`,height:`7px`,borderRadius:`50%`,background:r(L).wsConnected?`var(--success)`:`var(--error)`,boxShadow:r(L).wsConnected?`0 0 8px rgba(34,197,94,0.5)`:`none`,animation:r(L).wsConnected?`pulse-dot 2s infinite`:`none`})},null,4),n(`span`,le,u(r(L).wsConnected?`已连接`:`未连接`),1)]),z.value?(d(),i(`div`,ue,[n(`div`,de,u((z.value.display_name||z.value.username).charAt(0).toUpperCase()),1),n(`span`,fe,[t(u(z.value.display_name||z.value.username)+` `,1),n(`span`,pe,u(z.value.role),1)])])):c(``,!0),y(s,{text:``,size:`small`,onClick:Y,style:{color:`var(--text-muted)`,"font-size":`11px`,"margin-left":`4px`}},{default:C(()=>[...o[0]||=[t(` 退出 `,-1)]]),_:1})],64))]),_:1}),R.value?(d(),O(v,{key:1,position:`absolute`,style:{top:`0`,bottom:`0`,background:`var(--bg-primary)`}},{default:C(()=>[y(_)]),_:1})):(d(),O(v,{key:0,position:`absolute`,style:{top:`var(--header-height)`,bottom:`0`,background:`var(--bg-primary)`},"has-sider":``},{default:C(()=>[y(h,{bordered:``,width:220,"collapsed-width":64,"show-trigger":`bar`,style:{background:`var(--bg-card)`,"border-right":`1px solid var(--border-primary)`}},{default:C(()=>[y(m,{value:V.value,options:q.value,"onUpdate:value":J,style:{background:`var(--bg-card)`,"padding-top":`4px`}},null,8,[`value`,`options`])]),_:1}),y(v,{style:{background:`var(--bg-primary)`}},{default:C(()=>[y(_,null,{default:C(({Component:e,route:t})=>[y(F,{name:`fade`,mode:`default`},{default:C(()=>[(d(),O(g(e),{key:t.path}))]),_:2},1024)]),_:1})]),_:1})]),_:1}))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,[`locale`,`date-locale`])}}});$.use(I()),$.use(K),$.use(N),$.mount(`#app`);export{ie as n,Z as r,se as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r};export{t};
|