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
backend/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
backend/__main__.py
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# SecAgentX 配置文件
|
|
2
|
+
# 自动从 .env 加载 API Key,此处配置业务参数
|
|
3
|
+
|
|
4
|
+
# LLM 配置(API Key 从 .env 读取)
|
|
5
|
+
llm:
|
|
6
|
+
deepseek:
|
|
7
|
+
model: "deepseek-chat"
|
|
8
|
+
temperature: 0.1
|
|
9
|
+
max_tokens: 8192
|
|
10
|
+
api_key: "${DEEPSEEK_API_KEY}"
|
|
11
|
+
timeout_seconds: 90
|
|
12
|
+
qwen:
|
|
13
|
+
model: "qwen-max"
|
|
14
|
+
temperature: 0.1
|
|
15
|
+
max_tokens: 4096
|
|
16
|
+
api_key: "${QWEN_API_KEY}"
|
|
17
|
+
timeout_seconds: 90
|
|
18
|
+
|
|
19
|
+
# LLM 超时降级与自动切换
|
|
20
|
+
# 主 LLM 超时/失败时自动切换到备用 LLM,提升系统可靠性
|
|
21
|
+
fallback:
|
|
22
|
+
enabled: true # 总开关(设为 true 启用)
|
|
23
|
+
provider: "qwen" # 备用 LLM 名称 (deepseek / qwen)
|
|
24
|
+
timeout_seconds: 60 # 超时阈值(秒),超过则切换到备用(与主 LLM 90s 对齐,减少误降级)
|
|
25
|
+
fallback_on_timeout: true # 超时触发降级
|
|
26
|
+
fallback_on_error: true # 其他错误触发降级
|
|
27
|
+
config: # ═══ 修复:必须显式指定可用模型(否则 QwenProvider 落默认 qwen2.5-72b-instruct → 403) ═══
|
|
28
|
+
model: "qwen-max" # 当前账号已开通(实测 200);qwen2.5-72b-instruct 会 403 access_denied
|
|
29
|
+
api_key: "${QWEN_API_KEY}"
|
|
30
|
+
|
|
31
|
+
# Agent 配置
|
|
32
|
+
agents:
|
|
33
|
+
knowledge:
|
|
34
|
+
max_retrieval_rounds: 3
|
|
35
|
+
free_qa_direct: true # 普通咨询直接 LLM 回答,不访问安全知识库
|
|
36
|
+
free_qa_fallback: true # RAG 无接地结果时允许降级为谨慎的 LLM 直答
|
|
37
|
+
|
|
38
|
+
# 总调度配置
|
|
39
|
+
orchestrator:
|
|
40
|
+
agent_id: "orch-001"
|
|
41
|
+
|
|
42
|
+
# ============================================================
|
|
43
|
+
# Decision Fusion 统一决策框架(Sense-Decide 分离)
|
|
44
|
+
# 各专业 Agent 只输出证据包(findings + evidence_confidence),
|
|
45
|
+
# 唯一 final verdict 由融合引擎统一裁决。引擎为可替换模块。
|
|
46
|
+
# ============================================================
|
|
47
|
+
decision_fusion:
|
|
48
|
+
enabled: true # false → 回退旧确定性聚合(_aggregate_confidence)
|
|
49
|
+
engine: "dempster_shafer" # 可替换: dempster_shafer | weighted_average
|
|
50
|
+
conflict_threshold: 0.6 # Dempster 冲突系数 K 超阈值 → 需人工介入
|
|
51
|
+
# agent_weights: # 可选:覆盖各 Agent 基础权重
|
|
52
|
+
# analyst-001: 0.35
|
|
53
|
+
# intel-001: 0.25
|
|
54
|
+
|
|
55
|
+
# ============================================================
|
|
56
|
+
# 风险评分模型(Risk Score Model v3.0)
|
|
57
|
+
# 范围: 0~100(Clamp)
|
|
58
|
+
# 公式: Risk = Behavior×40% + Intel×30% + Asset×20% + Context×10%
|
|
59
|
+
# enabled=false → 回退旧规则加法模型(LegacyRiskScorer)
|
|
60
|
+
# ============================================================
|
|
61
|
+
risk_model:
|
|
62
|
+
enabled: true # true=加权模型(默认) false=回退旧加法模型
|
|
63
|
+
weights: # 参数化权重(四维,和为 1.0)
|
|
64
|
+
behavior: 0.40 # 行为证据 40%
|
|
65
|
+
intel: 0.30 # 威胁情报 30%
|
|
66
|
+
asset: 0.20 # 资产价值 20%
|
|
67
|
+
context: 0.10 # 上下文线索 10%
|
|
68
|
+
thresholds: # 风险等级阈值(0~100)
|
|
69
|
+
low: 40 # 0~39 低危
|
|
70
|
+
mid: 60 # 40~59 中危
|
|
71
|
+
high: 80 # 60~79 高危
|
|
72
|
+
critical: 100 # 80~100 紧急
|
|
73
|
+
unknown_baseline: 50 # 信息缺失时子分基线(缺失≠干净)
|
|
74
|
+
benign_score: 15 # 确认良性时子分
|
|
75
|
+
|
|
76
|
+
# ============================================================
|
|
77
|
+
# 跨区域联邦配置
|
|
78
|
+
# ============================================================
|
|
79
|
+
federation:
|
|
80
|
+
enabled: false # 总开关
|
|
81
|
+
region_id: "default" # 本区域 ID(如 "beijing" / "shanghai")
|
|
82
|
+
region_name: "默认区域" # 本区域名称
|
|
83
|
+
|
|
84
|
+
# 其他区域的连接信息(每个区域一个条目)
|
|
85
|
+
peers:
|
|
86
|
+
- region_id: "beijing"
|
|
87
|
+
region_name: "北京"
|
|
88
|
+
api_url: "http://10.0.1.100:8000" # 对端 API 地址
|
|
89
|
+
api_token: "${FED_TOKEN_BEIJING}" # 对端认证 Token
|
|
90
|
+
sync_events: true # 是否同步事件
|
|
91
|
+
sync_blacklist: true # 是否同步黑名单
|
|
92
|
+
|
|
93
|
+
# 同步策略
|
|
94
|
+
sync:
|
|
95
|
+
event_interval_seconds: 60 # 事件同步间隔
|
|
96
|
+
blacklist_interval_seconds: 30 # 黑名单同步间隔
|
|
97
|
+
max_batch_size: 100 # 每批最大同步条数
|
|
98
|
+
timeout_seconds: 10 # 同步请求超时
|
|
99
|
+
|
|
100
|
+
# ============================================================
|
|
101
|
+
# 零人工干预配置
|
|
102
|
+
# ============================================================
|
|
103
|
+
auto_operation:
|
|
104
|
+
enabled: false # 总开关:false 时只分析不自动处置
|
|
105
|
+
|
|
106
|
+
# --- 告警接入 ---
|
|
107
|
+
ingestion:
|
|
108
|
+
webhook_path: "/webhook/alert" # Webhook 接收路径
|
|
109
|
+
kafka_topic: "" # Kafka 主题(空=不启用)
|
|
110
|
+
kafka_bootstrap: "" # Kafka 地址
|
|
111
|
+
syslog_port: 0 # Syslog 端口(0=不启用)
|
|
112
|
+
max_queue_size: 1000 # 内部队列上限
|
|
113
|
+
|
|
114
|
+
# --- 邮件接入(将可疑邮件转发到指定邮箱,自动分析) ---
|
|
115
|
+
email_ingestion:
|
|
116
|
+
enabled: false # 总开关
|
|
117
|
+
imap_server: "" # IMAP 服务器地址(也可通过环境变量 EMAIL_IMAP_SERVER 设置)
|
|
118
|
+
imap_port: 993 # IMAP 端口
|
|
119
|
+
username: "" # 邮箱用户名(也可通过环境变量 EMAIL_USERNAME 设置)
|
|
120
|
+
password: "" # 邮箱密码/应用专用密码(也可通过环境变量 EMAIL_PASSWORD 设置)
|
|
121
|
+
mailbox: "INBOX" # 监控的邮箱目录
|
|
122
|
+
processed_folder: "Processed" # 处理完成后移动到的目录
|
|
123
|
+
poll_interval_seconds: 60 # 轮询间隔(秒)
|
|
124
|
+
max_email_size_mb: 10 # 单封邮件最大处理大小
|
|
125
|
+
process_attachments: true # 是否解析附件元数据
|
|
126
|
+
|
|
127
|
+
# --- 告警去重 ---
|
|
128
|
+
dedup:
|
|
129
|
+
window_seconds: 1800 # 去重窗口(秒),默认 30 分钟
|
|
130
|
+
max_entries: 10000 # 最大跟踪数,超限时淘汰最早 1/3
|
|
131
|
+
|
|
132
|
+
# --- 自动处置阈值 ---
|
|
133
|
+
thresholds:
|
|
134
|
+
auto_close: 0.85 # ≥0.85 自动闭环
|
|
135
|
+
auto_block: 0.70 # ≥0.70 自动封禁(低于此值拒绝自动封禁)
|
|
136
|
+
expand_investigation: 0.50 # ≥0.50 扩大调查
|
|
137
|
+
manual_escalation: 0.30 # <0.30 升级人工
|
|
138
|
+
|
|
139
|
+
# --- 自动封禁保护 ---
|
|
140
|
+
block_protection:
|
|
141
|
+
whitelist_ips: # 永不自动封禁的 IP
|
|
142
|
+
- "10.0.0.1"
|
|
143
|
+
- "192.168.1.1"
|
|
144
|
+
- "172.16.0.1"
|
|
145
|
+
default_duration_minutes: 120 # 默认封禁时长
|
|
146
|
+
max_duration_minutes: 1440 # 最大封禁时长(24h)
|
|
147
|
+
|
|
148
|
+
# --- 自动升级通知 ---
|
|
149
|
+
escalation:
|
|
150
|
+
enabled: true
|
|
151
|
+
channels:
|
|
152
|
+
- type: console # 控制台输出(默认启用)
|
|
153
|
+
enabled: true
|
|
154
|
+
- type: slack # Slack Webhook
|
|
155
|
+
enabled: false
|
|
156
|
+
webhook_url: "${SLACK_WEBHOOK_URL}"
|
|
157
|
+
- type: dingtalk # 钉钉机器人
|
|
158
|
+
enabled: false
|
|
159
|
+
token: "${DINGTALK_TOKEN}"
|
|
160
|
+
- type: webhook # 通用 Webhook
|
|
161
|
+
enabled: false
|
|
162
|
+
url: "${ESCALATION_WEBHOOK_URL}"
|
|
163
|
+
- type: openim # OpenIM 即时通讯(需显式配置后启用)
|
|
164
|
+
enabled: false
|
|
165
|
+
api_url: "http://localhost:10002" # OpenIM API 地址
|
|
166
|
+
secret: "${OPENIM_SECRET}" # OpenIM 应用密钥
|
|
167
|
+
admin_user_id: "imAdmin" # OpenIM 管理员账号
|
|
168
|
+
group_id: "sec-agentx-alerts" # 告警推送目标群组
|
|
169
|
+
token_ttl: 7200 # token 缓存时长(秒)
|
|
170
|
+
min_interval_seconds: 300 # 同一事件最小通知间隔(防刷)
|
|
171
|
+
|
|
172
|
+
# --- 自动巡检 ---
|
|
173
|
+
patrol:
|
|
174
|
+
enabled: false
|
|
175
|
+
interval_seconds: 1800 # 每 30 分钟巡检一次
|
|
176
|
+
block_renew_threshold: 0.50 # 威胁评分 ≥0.5 自动续封
|
|
177
|
+
reopen_window_hours: 24 # 闭环后 24h 内新告警→重新调查
|
|
178
|
+
max_renew_count: 3 # 最多自动续封次数(之后升级人工)
|
|
179
|
+
|
|
180
|
+
# --- 数据保留策略(自动清理,防止数据库无限增长) ---
|
|
181
|
+
data_retention:
|
|
182
|
+
enabled: false # 总开关(默认关闭,开启后首次运行即开始清理)
|
|
183
|
+
event_retention_days: 90 # 事件保留天数
|
|
184
|
+
conversation_retention_days: 30 # 对话记录保留天数
|
|
185
|
+
ioc_retention_days: 365 # IOC 保留天数
|
|
186
|
+
run_interval_hours: 24 # 清理周期(小时)
|
|
187
|
+
|
|
188
|
+
# ============================================================
|
|
189
|
+
# 熔断器配置
|
|
190
|
+
# ============================================================
|
|
191
|
+
circuit_breaker:
|
|
192
|
+
max_consecutive_failures: 3 # 连续 N 次误封禁 → 熔断
|
|
193
|
+
max_daily_blocks: 20 # 每日最多封禁 IP 数
|
|
194
|
+
reset_minutes: 30 # 自动半开等待分钟数
|
|
195
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.agents-page[data-v-c9d34680]{height:calc(100vh - var(--header-height));padding:24px;overflow-y:auto}.page-header[data-v-c9d34680]{justify-content:space-between;align-items:center;margin-bottom:20px;display:flex}.page-title[data-v-c9d34680]{color:var(--text-primary);letter-spacing:.5px;font-size:20px;font-weight:700}.page-desc[data-v-c9d34680]{color:var(--text-muted);margin-top:4px;font-size:13px}.header-right[data-v-c9d34680]{align-items:center;gap:10px;display:flex}.agent-total[data-v-c9d34680]{border-radius:var(--radius-full);background:var(--bg-elevated);color:var(--text-tertiary);padding:3px 10px;font-size:11px;font-weight:500}.refresh-btn[data-v-c9d34680]{border:1px solid var(--border-primary);border-radius:var(--radius-sm);color:var(--text-tertiary);cursor:pointer;transition:all var(--transition-fast);background:0 0;align-items:center;gap:5px;padding:6px 12px;font-size:12px;display:inline-flex}.refresh-btn[data-v-c9d34680]:hover{border-color:var(--accent);color:var(--accent)}.refresh-btn.loading[data-v-c9d34680]{opacity:.6;pointer-events:none}.spinning[data-v-c9d34680]{animation:1s linear infinite spin-c9d34680}@keyframes spin-c9d34680{to{transform:rotate(360deg)}}.agent-grid[data-v-c9d34680]{grid-template-columns:repeat(auto-fill,minmax(380px,1fr));gap:16px;margin-bottom:24px;display:grid}.skeleton-agent[data-v-c9d34680]{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:180px;animation:1.8s ease-in-out infinite skeleton-pulse}.agent-card[data-v-c9d34680]{border-radius:var(--radius-md);border:1px solid var(--border-primary);transition:all var(--transition-fast);overflow:hidden}.agent-card[data-v-c9d34680]:hover{box-shadow:var(--shadow-md);transform:translateY(-2px)}.agent-card.card-running[data-v-c9d34680]{border-color:#22c55e33}.agent-top[data-v-c9d34680]{border-bottom:1px solid var(--border-primary);align-items:center;gap:12px;padding:16px 20px;display:flex}.agent-avatar[data-v-c9d34680]{border-radius:var(--radius-sm);color:#fff;flex-shrink:0;justify-content:center;align-items:center;width:36px;height:36px;font-size:15px;font-weight:700;display:flex}.agent-meta[data-v-c9d34680]{flex:1}.agent-name[data-v-c9d34680]{color:var(--text-primary);font-size:14px;font-weight:600}.agent-id[data-v-c9d34680]{color:var(--text-muted);font-size:11px;font-family:var(--font-mono);margin-top:1px}.agent-status[data-v-c9d34680]{border-radius:var(--radius-full);align-items:center;gap:6px;padding:4px 10px;font-size:12px;font-weight:500;display:flex}.status-running[data-v-c9d34680]{background:var(--success-bg);color:var(--success)}.status-completed[data-v-c9d34680]{background:var(--info-bg);color:var(--info)}.status-idle[data-v-c9d34680]{background:var(--bg-elevated);color:var(--text-muted)}.status-busy[data-v-c9d34680]{background:var(--warning-bg);color:var(--warning)}.status-error[data-v-c9d34680]{background:var(--error-bg);color:var(--error)}.status-dot[data-v-c9d34680]{border-radius:50%;width:6px;height:6px}.status-dot.running[data-v-c9d34680]{background:var(--success);animation:2s infinite pulse-dot}.status-dot.completed[data-v-c9d34680]{background:var(--info)}.status-dot.idle[data-v-c9d34680]{background:var(--text-muted)}.agent-metrics[data-v-c9d34680]{grid-template-columns:1fr 1fr 1fr;display:grid}.metric-col[data-v-c9d34680]{text-align:center;border-right:1px solid var(--border-primary);padding:14px 12px}.metric-col[data-v-c9d34680]:last-child{border-right:none}.metric-label[data-v-c9d34680]{color:var(--text-muted);letter-spacing:1px;margin-bottom:6px;font-size:10px;font-weight:600}.metric-value[data-v-c9d34680]{font-size:16px;font-weight:700}.metric-unit[data-v-c9d34680]{color:var(--text-tertiary);margin-left:2px;font-size:11px;font-weight:400}.latency-val[data-v-c9d34680]{color:var(--warning)}.token-val[data-v-c9d34680]{color:var(--info)}.task-val[data-v-c9d34680]{color:var(--text-primary)}.agent-footer[data-v-c9d34680]{background:var(--bg-primary);border-top:1px solid var(--border-primary);padding:12px 20px}.progress-row[data-v-c9d34680]{align-items:center;gap:10px;margin-bottom:8px;display:flex}.progress-label[data-v-c9d34680]{color:var(--text-muted);min-width:28px;font-size:10px}.progress-track[data-v-c9d34680]{background:var(--bg-elevated);border-radius:2px;flex:1;height:4px;overflow:hidden}.progress-fill[data-v-c9d34680]{border-radius:2px;height:100%;transition:width .5s}.progress-val[data-v-c9d34680]{color:var(--text-tertiary);text-align:right;min-width:36px;font-size:10px}.footer-stats[data-v-c9d34680]{gap:20px;display:flex}.stat-item[data-v-c9d34680]{align-items:center;gap:8px;display:flex}.stat-label[data-v-c9d34680]{color:var(--text-muted);font-size:10px}.stat-value[data-v-c9d34680]{font-size:12px;font-weight:600}.overview-card[data-v-c9d34680]{background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-md);margin-bottom:16px;padding:20px}.overview-grid[data-v-c9d34680]{grid-template-columns:repeat(4,1fr);gap:16px;display:grid}.overview-item[data-v-c9d34680]{text-align:center}.overview-value[data-v-c9d34680]{font-size:22px;font-weight:700}.overview-label[data-v-c9d34680]{color:var(--text-muted);margin-top:4px;font-size:11px}.offline-banner[data-v-c9d34680]{background:var(--warning-bg);border-radius:var(--radius-sm);color:var(--warning);border:1px solid #eab30833;align-items:center;gap:10px;padding:12px 16px;font-size:13px;display:flex}.retry-btn[data-v-c9d34680]{border-radius:var(--radius-sm);color:var(--warning);cursor:pointer;background:0 0;border:1px solid #eab3084d;margin-left:auto;padding:4px 12px;font-size:12px}.retry-btn[data-v-c9d34680]:hover{background:#eab3081a}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,C as t,E as n,Ht 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}from"./vendor-icons-BTNgi7vU.js";import{r as p}from"./index-DBEjbyJR.js";import{t as m}from"./_plugin-vue_export-helper-BDNMzG2s.js";var h={class:`agents-page`},g={class:`page-header`},_={class:`header-right`},v={class:`agent-total`},y={key:0,class:`agent-grid`},b={key:1,class:`agent-grid`},x={class:`agent-top`},S={class:`agent-meta`},C={class:`agent-name`},w={class:`agent-id`},T={class:`agent-metrics`},E={class:`metric-col`},D={class:`metric-value latency-val`},O={class:`metric-col`},k={class:`metric-value token-val`},A={class:`metric-col`},j={class:`metric-value task-val`},M={class:`agent-footer`},N={class:`progress-row`},ee={class:`progress-track`},P={class:`progress-val`},F={class:`footer-stats`},I={class:`stat-item`},L={class:`stat-value`,style:{color:`var(--info)`}},R={class:`stat-item`},z={class:`stat-value`,style:{color:`var(--text-primary)`}},B={class:`overview-card`},V={class:`overview-grid`},H={class:`overview-label`},U={key:2,class:`offline-banner`},W=m({__name:`AgentsView`,setup(m){let W=f(!0),G=f(!1),K=f([]);function q(){let e=localStorage.getItem(`secagentx_token`);return e?{Authorization:`Bearer ${e}`}:{}}let J=a(()=>{let e=K.value;if(!e.length)return[];let t=e.reduce((e,t)=>e+(t.total_tokens||0),0);e.reduce((e,t)=>e+(t.total_tasks||0),0);let n=e.length?Math.round(e.reduce((e,t)=>e+(t.latency||0),0)/e.length):0,r=e.filter(e=>e.status===`running`).length;return[{label:`Agent 总数`,value:e.length,color:`var(--info)`},{label:`运行中`,value:r,color:r>0?`var(--success)`:`var(--text-muted)`},{label:`平均延迟`,value:n+`ms`,color:`var(--warning)`},{label:`累计 Token`,value:Q(t),color:`var(--color-intel)`}]});function Y(e){return{running:`运行中`,completed:`已完成`,idle:`空闲`,busy:`忙碌`,error:`错误`}[e]||e}function X(e){return{安全分析师:`var(--color-analyst)`,威胁情报员:`var(--color-intel)`,应急响应员:`var(--color-responder)`,知识智能体:`var(--color-knowledge)`,告警误报剔除专家:`var(--color-filter)`}[e]||`var(--color-intel)`}function Z(e){return e<200?`var(--success)`:e<400?`var(--warning)`:`var(--error)`}function Q(e){return!e&&e!==0?`0`:e>=1e6?(e/1e6).toFixed(1)+`M`:e>=1e3?(e/1e3).toFixed(1)+`K`:String(e)}async function $(){W.value=!0,G.value=!1;try{let e=await fetch(p(`/api/agents/runtime`),{headers:q()});if(e.ok){let t=await e.json();if(t.agents?.length){K.value=t.agents;return}}throw Error(`no data`)}catch{G.value=!0,K.value=[]}finally{W.value=!1}}return i($),(i,a)=>(l(),n(`div`,h,[t(`div`,g,[a[2]||=t(`div`,{class:`header-left`},[t(`div`,{class:`page-title`},`Agent Runtime`),t(`div`,{class:`page-desc`},`多智能体运行时状态监控 · 实时延迟 / Token 消耗`)],-1),t(`div`,_,[t(`span`,v,c(K.value.length)+` Agents`,1),t(`button`,{class:r([`refresh-btn`,{loading:W.value}]),onClick:$},[(l(),n(`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:r({spinning:W.value})},[...a[0]||=[t(`polyline`,{points:`23 4 23 10 17 10`},null,-1),t(`path`,{d:`M20.49 15a9 9 0 1 1-2.12-9.36L23 10`},null,-1)]],2)),a[1]||=e(` 刷新 `,-1)],2)])]),W.value&&K.value.length===0?(l(),n(`div`,y,[(l(),n(d,null,u(4,e=>t(`div`,{key:e,class:`skeleton-agent`})),64))])):(l(),n(`div`,b,[(l(!0),n(d,null,u(K.value,i=>(l(),n(`div`,{key:i.agent_id,class:r([`agent-card`,`card-`+i.status])},[t(`div`,x,[t(`div`,{class:`agent-avatar`,style:s({background:X(i.agent)})},c(i.agent.charAt(0)),5),t(`div`,S,[t(`div`,C,c(i.agent),1),t(`div`,w,c(i.agent_id),1)]),t(`div`,{class:r([`agent-status`,`status-`+i.status])},[t(`div`,{class:r([`status-dot`,i.status])},null,2),e(` `+c(Y(i.status)),1)],2)]),t(`div`,T,[t(`div`,E,[a[4]||=t(`div`,{class:`metric-label`},`LATENCY`,-1),t(`div`,D,[e(c(i.latency),1),a[3]||=t(`span`,{class:`metric-unit`},`ms`,-1)])]),t(`div`,O,[a[6]||=t(`div`,{class:`metric-label`},`TOKENS`,-1),t(`div`,k,[e(c(Q(i.tokens)),1),a[5]||=t(`span`,{class:`metric-unit`},`tok`,-1)])]),t(`div`,A,[a[7]||=t(`div`,{class:`metric-label`},`TASKS`,-1),t(`div`,j,c(i.total_tasks),1)])]),t(`div`,M,[t(`div`,N,[a[8]||=t(`span`,{class:`progress-label`},`延迟`,-1),t(`div`,ee,[t(`div`,{class:`progress-fill`,style:s({width:Math.min(100,i.latency/500*100)+`%`,background:Z(i.latency)})},null,4)]),t(`span`,P,c(i.latency)+`ms`,1)]),t(`div`,F,[t(`div`,I,[a[9]||=t(`span`,{class:`stat-label`},`累计 Token`,-1),t(`span`,L,c(Q(i.total_tokens)),1)]),t(`div`,R,[a[10]||=t(`span`,{class:`stat-label`},`总任务数`,-1),t(`span`,z,c(i.total_tasks),1)])])])],2))),128))])),t(`div`,B,[t(`div`,V,[(l(!0),n(d,null,u(J.value,e=>(l(),n(`div`,{key:e.label,class:`overview-item`},[t(`div`,{class:`overview-value`,style:s({color:e.color})},c(e.value),5),t(`div`,H,c(e.label),1)]))),128))])]),G.value?(l(),n(`div`,U,[a[11]||=t(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[t(`circle`,{cx:`12`,cy:`12`,r:`10`}),t(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),t(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})],-1),a[12]||=t(`span`,null,`后端未连接,无法获取实时数据`,-1),t(`button`,{class:`retry-btn`,onClick:$},`重新连接`)])):o(``,!0)]))}},[[`__scopeId`,`data-v-c9d34680`]]);export{W as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,A as t,C as n,E as r,T as i,Ut as a,Wt as o,Y as s,Z as c,_ as l,_t as u,j as d,ot as f,w as p}from"./vendor-icons-BTNgi7vU.js";import{r as m}from"./vendor-ui-Cdd65KTN.js";import{n as h}from"./index-DBEjbyJR.js";var g={style:{padding:`24px`}},_={key:0,style:{"margin-top":`20px`}},v={style:{display:`flex`,"flex-wrap":`wrap`,gap:`4px`,"align-items":`center`}},y=[`onClick`,`title`],b={style:{fontSize:`12px`,color:`#94a3b8`}},x={key:1,style:{fontSize:`16px`,color:`#4b5563`}},S={key:0,style:{color:`#4b5563`,fontSize:`16px`}},C={style:{"margin-top":`12px`,display:`flex`,gap:`16px`}},w={key:0,style:{"margin-top":`4px`}},T={key:0},E={key:1,style:{"text-align":`center`,"margin-top":`80px`}},D={style:{"margin-top":`16px`}},O={__name:`AttackChainView`,setup(O){let k=m(),A=u(!1),j=u(!1),M=u(null),N=u(null);function P(e){return e>=.8?`success`:e>=.5?`warning`:`error`}async function F(){A.value=!0;try{M.value=await h(`/api/attack-chain/from-events?count=30`),N.value=null,k.success(`攻击链构建完成`)}catch(e){k.error(`构建失败: `+e.message)}A.value=!1}async function I(){j.value=!0,k.info(`当前视图按需从事件库重建,不生成演示历史`),j.value=!1}function L(e){N.value=e.position||e.pos}return(u,m)=>{let h=e(`n-h2`),O=e(`n-text`),k=e(`n-button`),R=e(`n-space`),z=e(`n-statistic`),B=e(`n-card`),V=e(`n-grid-item`),H=e(`n-grid`),U=e(`n-tag`),W=e(`n-thing`),G=e(`n-list-item`),K=e(`n-list`),q=e(`n-empty`),J=e(`n-description-list-item`),Y=e(`n-description-list`),X=e(`n-spin`);return s(),r(`div`,g,[d(h,null,{default:f(()=>[...m[0]||=[t(` 攻击链自动生成`,-1)]]),_:1}),d(O,{depth:`3`},{default:f(()=>[...m[1]||=[t(`基于告警自动聚类 -> ATT&CK映射 -> 杀伤链构建`,-1)]]),_:1}),d(R,{style:{"margin-top":`16px`}},{default:f(()=>[d(k,{type:`primary`,onClick:F,loading:A.value},{default:f(()=>[...m[2]||=[t(` 从真实告警构建攻击链 `,-1)]]),_:1},8,[`loading`]),d(k,{onClick:I,loading:j.value},{default:f(()=>[...m[3]||=[t(` 查看历史 `,-1)]]),_:1},8,[`loading`])]),_:1}),M.value?(s(),r(`div`,_,[d(H,{cols:5,"x-gap":12,"y-gap":12},{default:f(()=>[d(V,null,{default:f(()=>[d(B,{size:`small`,bordered:!0},{default:f(()=>[d(z,{title:`杀伤链覆盖率`,value:`${M.value.coverage}%`},null,8,[`value`])]),_:1})]),_:1}),d(V,null,{default:f(()=>[d(B,{size:`small`,bordered:!0},{default:f(()=>[d(z,{title:`检测到阶段`,value:`${M.value.detected_steps}/${M.value.total_steps}`},null,8,[`value`])]),_:1})]),_:1}),d(V,null,{default:f(()=>[d(B,{size:`small`,bordered:!0},{default:f(()=>[d(z,{title:`整体置信度`,value:`${(M.value.overall_confidence*100).toFixed(0)}%`},null,8,[`value`])]),_:1})]),_:1}),d(V,null,{default:f(()=>[d(B,{size:`small`,bordered:!0},{default:f(()=>[d(z,{title:`告警总数`,value:M.value.total_alerts},null,8,[`value`])]),_:1})]),_:1}),d(V,null,{default:f(()=>[d(B,{size:`small`,bordered:!0},{header:f(()=>[d(O,{depth:`3`},{default:f(()=>[...m[4]||=[t(`源IP`,-1)]]),_:1})]),default:f(()=>[d(O,{tag:`code`},{default:f(()=>[t(o(M.value.source_ip),1)]),_:1})]),_:1})]),_:1})]),_:1}),d(B,{title:` 杀伤链 (Kill Chain)`,bordered:!0,style:{"margin-top":`16px`}},{default:f(()=>[n(`div`,v,[(s(!0),r(l,null,c(M.value.kill_chain_visual,(e,t)=>(s(),r(l,{key:e.position},[n(`div`,{style:a({display:`flex`,flexDirection:`column`,alignItems:`center`,padding:`8px 10px`,borderRadius:`8px`,minWidth:`72px`,background:e.status===`detected`?e.confidence>=.8?`rgba(74,222,128,0.15)`:e.confidence>=.5?`rgba(250,204,21,0.15)`:`rgba(248,113,113,0.15)`:`rgba(75,85,99,0.2)`,border:e.status===`detected`?e.confidence>=.8?`2px solid #4ade80`:e.confidence>=.5?`2px solid #facc15`:`2px solid #f87171`:`2px dashed #4b5563`,cursor:e.status===`detected`?`pointer`:`default`,transition:`all 0.2s`}),onClick:t=>e.status===`detected`&&L(e),title:e.status===`detected`?`${e.technique_name} (${e.confidence})`:`未检测到`},[n(`div`,b,`[`+o(e.position)+`]`,1),n(`div`,{style:a({fontSize:`11px`,fontWeight:`bold`,textAlign:`center`,color:e.status===`detected`?`#e2e8f0`:`#6b7280`})},o(e.tactic_name.length>4?e.tactic_name.slice(0,4):e.tactic_name),5),e.status===`detected`?(s(),r(`div`,{key:0,style:a({fontSize:`9px`,color:e.confidence>=.8?`#4ade80`:`#facc15`,marginTop:`2px`})},o((e.confidence*100).toFixed(0))+`% `,5)):(s(),r(`div`,x))],12,y),t<M.value.kill_chain_visual.length-1?(s(),r(`div`,S,` -> `)):i(``,!0)],64))),128))]),n(`div`,C,[d(R,null,{default:f(()=>[m[6]||=n(`div`,{style:{width:`16px`,height:`16px`,"border-radius":`4px`,background:`rgba(74,222,128,0.3)`,border:`2px solid #4ade80`}},null,-1),d(O,{depth:`3`,style:{"font-size":`12px`}},{default:f(()=>[...m[5]||=[t(`高置信度`,-1)]]),_:1})]),_:1}),d(R,null,{default:f(()=>[m[8]||=n(`div`,{style:{width:`16px`,height:`16px`,"border-radius":`4px`,background:`rgba(250,204,21,0.3)`,border:`2px solid #facc15`}},null,-1),d(O,{depth:`3`,style:{"font-size":`12px`}},{default:f(()=>[...m[7]||=[t(`中置信度`,-1)]]),_:1})]),_:1}),d(R,null,{default:f(()=>[m[10]||=n(`div`,{style:{width:`16px`,height:`16px`,"border-radius":`4px`,background:`rgba(248,113,113,0.3)`,border:`2px solid #f87171`}},null,-1),d(O,{depth:`3`,style:{"font-size":`12px`}},{default:f(()=>[...m[9]||=[t(`低置信度`,-1)]]),_:1})]),_:1}),d(R,null,{default:f(()=>[m[12]||=n(`div`,{style:{width:`16px`,height:`16px`,"border-radius":`4px`,background:`rgba(75,85,99,0.2)`,border:`2px dashed #4b5563`}},null,-1),d(O,{depth:`3`,style:{"font-size":`12px`}},{default:f(()=>[...m[11]||=[t(`未检测到`,-1)]]),_:1})]),_:1})])]),_:1}),d(H,{cols:2,"x-gap":16,style:{"margin-top":`16px`}},{default:f(()=>[d(V,null,{default:f(()=>[d(B,{title:` 检测到的攻击步骤`,bordered:!0},{default:f(()=>[M.value.steps.length>0?(s(),p(K,{key:0},{default:f(()=>[(s(!0),r(l,null,c(M.value.steps,e=>(s(),p(G,{key:e.position,style:a({background:N.value===e.position?`rgba(99,102,241,0.1)`:``,borderRadius:`4px`}),clickable:``,onClick:t=>L(e)},{default:f(()=>[d(W,{title:`第${e.position}步: ${e.tactic_name}`},{"header-extra":f(()=>[d(U,{type:P(e.confidence),size:`tiny`},{default:f(()=>[t(o((e.confidence*100).toFixed(0))+`%`,1)]),_:2},1032,[`type`])]),description:f(()=>[n(`div`,null,[d(U,{size:`tiny`,bordered:!1},{default:f(()=>[t(o(e.technique_id),1)]),_:2},1024),t(` `+o(e.technique_name),1)]),d(O,{depth:`3`,style:{"font-size":`0.85em`}},{default:f(()=>[t(o(e.alerts_count)+` 条告警`,1)]),_:2},1024),e.evidence&&e.evidence.length>0?(s(),r(`div`,w,[(s(!0),r(l,null,c(e.evidence.slice(0,2),e=>(s(),r(`div`,{key:e,style:{"font-size":`0.85em`,color:`#94a3b8`}},o(e),1))),128))])):i(``,!0)]),_:2},1032,[`title`])]),_:2},1032,[`style`,`onClick`]))),128))]),_:1})):(s(),p(q,{key:1,description:`未检测到攻击阶段`}))]),_:1})]),_:1}),d(V,null,{default:f(()=>[d(B,{title:` 可能遗漏的阶段`,bordered:!0,style:{"margin-bottom":`16px`}},{default:f(()=>[M.value.missing_stages&&M.value.missing_stages.length>0?(s(),p(K,{key:0},{default:f(()=>[(s(!0),r(l,null,c(M.value.missing_stages,e=>(s(),p(G,{key:e.tactic_id},{default:f(()=>[d(W,{title:`[${e.pos}] ${e.tactic_name}`,description:`未触发告警,可能是遗漏阶段`},{avatar:f(()=>[...m[13]||=[]]),_:1},8,[`title`])]),_:2},1024))),128))]),_:1})):(s(),p(q,{key:1,description:`所有阶段均已覆盖`}))]),_:1}),d(B,{title:` 原始聚类信息`,bordered:!0},{default:f(()=>[M.value.cluster?(s(),r(`div`,T,[d(Y,{column:1,size:`small`},{default:f(()=>[d(J,{label:`聚类ID`},{default:f(()=>[t(o(M.value.cluster.cluster_id),1)]),_:1}),d(J,{label:`源IP`},{default:f(()=>[t(o(M.value.cluster.source_ip),1)]),_:1}),d(J,{label:`告警数`},{default:f(()=>[t(o(M.value.cluster.alert_count),1)]),_:1}),d(J,{label:`持续时间`},{default:f(()=>[t(o(M.value.cluster.duration_minutes)+` 分钟`,1)]),_:1}),d(J,{label:`目标IP数`},{default:f(()=>[t(o(M.value.cluster.target_ips?.length||0),1)]),_:1}),d(J,{label:`告警类型`},{default:f(()=>[d(R,null,{default:f(()=>[(s(!0),r(l,null,c(M.value.cluster.alert_types||[],e=>(s(),p(U,{key:e,size:`tiny`,bordered:!1},{default:f(()=>[t(o(e),1)]),_:2},1024))),128))]),_:1})]),_:1})]),_:1})])):i(``,!0)]),_:1})]),_:1})]),_:1})])):A.value?(s(),p(X,{key:2,size:`large`,style:{display:`block`,margin:`80px auto`}})):(s(),r(`div`,E,[d(h,{style:{opacity:`0.5`}}),d(O,{depth:`3`},{default:f(()=>[...m[14]||=[t(`点击「生成攻击链」从数据库中的真实告警构建杀伤链`,-1)]]),_:1}),n(`div`,D,[d(O,{depth:`3`,style:{"font-size":`0.9em`}},{default:f(()=>[...m[15]||=[t(` 系统将自动执行: `,-1),n(`br`,null,null,-1),t(` 告警聚类 -> ATT&CK技术映射 -> 杀伤链排序 -> 缺失分析 -> 可视化 `,-1)]]),_:1})])]))])}}};export{O as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.chat-view[data-v-01665c60]{background:var(--bg-primary);height:100%;display:flex}.chat-main[data-v-01665c60]{flex-direction:column;flex:1;min-width:0;display:flex}.conv-sidebar[data-v-01665c60]{border-right:1px solid var(--border-primary);background:var(--bg-card);flex-direction:column;flex-shrink:0;gap:10px;width:220px;padding:12px;display:flex;overflow-y:auto}.new-conv-btn[data-v-01665c60]{background:var(--accent);color:#fff;cursor:pointer;transition:all var(--transition-fast);border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;gap:6px;padding:8px 12px;font-size:12px;font-weight:600;display:flex}.new-conv-btn[data-v-01665c60]:hover{background:var(--accent-hover)}.conv-list[data-v-01665c60]{flex-direction:column;flex:1;gap:4px;display:flex;overflow-y:auto}.conv-item[data-v-01665c60]{cursor:pointer;color:var(--text-secondary);transition:background var(--transition-fast);border-radius:8px;align-items:center;gap:8px;padding:8px 10px;font-size:12px;display:flex}.conv-item[data-v-01665c60]:hover{background:var(--bg-elevated)}.conv-item.active[data-v-01665c60]{background:var(--accent-subtle);color:var(--accent-hover)}.conv-title[data-v-01665c60]{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.conv-loading[data-v-01665c60]{color:var(--text-muted);text-align:center;padding:8px;font-size:12px}.conv-empty[data-v-01665c60]{color:var(--text-muted);text-align:center;padding:16px 8px;font-size:12px}.msg-list[data-v-01665c60]{scroll-behavior:smooth;flex:1;padding:20px 24px;overflow-y:auto}.empty-state[data-v-01665c60]{text-align:center;margin-top:80px;animation:.5s count-up}.empty-icon[data-v-01665c60]{opacity:.4;margin-bottom:16px}.empty-title[data-v-01665c60]{color:var(--text-primary);letter-spacing:2px;margin-bottom:6px;font-size:22px;font-weight:700}.empty-subtitle[data-v-01665c60]{color:var(--text-muted);margin-bottom:32px;font-size:13px}.quick-replies[data-v-01665c60]{flex-wrap:wrap;justify-content:center;gap:10px;display:flex}.quick-btn[data-v-01665c60]{background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-full);color:var(--text-tertiary);cursor:pointer;transition:all var(--transition-fast);align-items:center;gap:6px;padding:8px 16px;font-size:12px;font-weight:500;display:inline-flex}.quick-btn[data-v-01665c60]:hover{border-color:var(--accent);color:var(--accent-hover);background:var(--accent-subtle)}.msg-item[data-v-01665c60]{margin-bottom:16px;animation:.3s count-up}.msg-user[data-v-01665c60]{justify-content:flex-end;display:flex}.msg-bubble[data-v-01665c60]{gap:10px;max-width:75%;display:flex}.bubble-avatar[data-v-01665c60]{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;margin-top:4px;font-size:12px;font-weight:700;display:flex}.user-avatar[data-v-01665c60]{background:var(--accent);color:#fff;order:1}.agent-avatar[data-v-01665c60]{background:linear-gradient(135deg, var(--color-intel), var(--color-analyst));color:#fff}.bubble-content[data-v-01665c60]{font-size:14px;line-height:1.7;position:relative}.user-bubble .bubble-content[data-v-01665c60]{background:var(--accent-subtle);color:var(--text-secondary);border:1px solid #dc262633;border-radius:16px 4px 16px 16px;padding:10px 16px}.agent-bubble[data-v-01665c60]{justify-content:flex-start}.agent-bubble .bubble-content[data-v-01665c60]{background:var(--bg-card);border:1px solid var(--border-primary);color:var(--text-secondary);border-radius:4px 16px 16px;padding:10px 16px}[data-v-01665c60] .md-h3{color:var(--text-primary);margin:16px 0 6px;font-size:15px;font-weight:600}[data-v-01665c60] .md-h4{color:var(--text-primary);margin:12px 0 4px;font-size:14px;font-weight:600}[data-v-01665c60] .md-bold{color:var(--warning);font-weight:600}[data-v-01665c60] .md-code{background:var(--bg-elevated);color:#a5d6ff;font-family:var(--font-mono);border-radius:4px;padding:2px 6px;font-size:13px}[data-v-01665c60] .md-li{color:var(--text-secondary);margin:3px 0;list-style:none}[data-v-01665c60] .md-li:before{content:"";background:var(--accent);vertical-align:middle;border-radius:50%;width:5px;height:5px;margin-right:8px;display:inline-block}[data-v-01665c60] .md-para{margin:8px 0}[data-v-01665c60] .md-arrow{color:var(--warning)}.status-card[data-v-01665c60]{border-radius:var(--radius-sm);border:1px solid var(--border-primary);background:var(--bg-card);width:100%;transition:all var(--transition-fast);align-items:center;gap:10px;padding:10px 16px;display:flex}.status-card.status-running[data-v-01665c60]{border-color:#22c55e4d}.status-card.status-completed[data-v-01665c60]{border-color:#3b82f64d}.status-card.status-error[data-v-01665c60]{border-color:#ef44444d}.status-card.status-pending[data-v-01665c60]{border-color:#eab30833}.status-info[data-v-01665c60]{flex:1;align-items:center;gap:8px;display:flex}.status-name[data-v-01665c60]{color:var(--text-secondary);font-size:13px;font-weight:500}.status-label[data-v-01665c60]{border-radius:3px;padding:1px 6px;font-size:10px;font-weight:600}.label-completed[data-v-01665c60]{color:var(--info);background:var(--info-bg)}.label-running[data-v-01665c60]{color:var(--success);background:var(--success-bg)}.label-failed[data-v-01665c60]{color:var(--error);background:var(--error-bg)}.label-pending[data-v-01665c60]{color:var(--warning);background:var(--warning-bg)}.status-metrics[data-v-01665c60]{color:var(--text-muted);gap:12px;font-size:11px;display:flex}.metric-item[data-v-01665c60]{align-items:center;gap:4px;display:flex}.status-result[data-v-01665c60]{font-size:11px;font-weight:600}.result-pass[data-v-01665c60]{color:var(--success)}.result-fail[data-v-01665c60]{color:var(--error)}.result-pending[data-v-01665c60]{color:var(--warning)}.status-spinner[data-v-01665c60]{border:2px solid var(--border-primary);border-top-color:var(--warning);border-radius:50%;width:14px;height:14px;animation:.8s linear infinite spin-01665c60}@keyframes spin-01665c60{to{transform:rotate(360deg)}}.cot-card[data-v-01665c60]{border-radius:var(--radius-sm);width:100%;overflow:hidden}.cot-start[data-v-01665c60]{border-left:4px solid var(--warning);background:var(--bg-card)}.cot-step[data-v-01665c60]{border-left:4px solid var(--color-intel);background:var(--bg-card)}.cot-complete[data-v-01665c60]{border-left:4px solid var(--success);background:var(--bg-card)}.cot-header[data-v-01665c60]{color:var(--warning);border-bottom:1px solid var(--border-primary);align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:600;display:flex}.cot-step .cot-header[data-v-01665c60]{color:var(--color-intel)}.cot-complete .cot-header[data-v-01665c60]{color:var(--success)}.cot-body[data-v-01665c60]{color:var(--text-secondary);padding:12px 14px;font-size:13px;line-height:1.6}.cot-section[data-v-01665c60]{margin-bottom:10px}.cot-section-title[data-v-01665c60]{color:var(--text-muted);margin-bottom:4px;font-size:11px;font-weight:600}.cot-section-body[data-v-01665c60]{background:var(--bg-primary);border-radius:var(--radius-sm);padding:8px 12px;font-size:13px}.conclusion-body[data-v-01665c60]{border-left:3px solid var(--success)}.ev-item[data-v-01665c60]{color:var(--text-tertiary);padding:2px 0;font-size:13px}.cot-next[data-v-01665c60]{background:var(--bg-elevated);border-radius:var(--radius-sm);color:var(--info);margin-top:8px;padding:4px 10px;font-size:12px;display:inline-block}.conf-badge[data-v-01665c60]{background:var(--bg-elevated);color:var(--text-tertiary);border-radius:3px;margin-left:auto;padding:1px 8px;font-size:11px;font-weight:600}.chain-list[data-v-01665c60]{width:100%}.chain-step[data-v-01665c60]{margin-bottom:4px}.step-node[data-v-01665c60]{border-radius:var(--radius-sm);border:1px solid var(--border-primary);background:var(--bg-card);transition:all var(--transition-fast);align-items:center;gap:12px;padding:10px 14px;display:flex}.step-completed .step-node[data-v-01665c60]{border-color:#3b82f633}.step-running .step-node[data-v-01665c60]{border-color:#22c55e4d}.step-pending .step-node[data-v-01665c60]{opacity:.5}.step-indicator[data-v-01665c60]{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;font-size:12px;font-weight:700;display:flex}.indicator-completed[data-v-01665c60]{background:var(--info-bg);color:var(--info)}.indicator-running[data-v-01665c60]{background:var(--success-bg);color:var(--success);animation:1.5s infinite pulse-dot-01665c60}.indicator-pending[data-v-01665c60]{background:var(--bg-elevated);color:var(--text-muted)}.step-body[data-v-01665c60]{flex:1}.step-title[data-v-01665c60]{color:var(--text-secondary);font-size:13px;font-weight:600}.step-output[data-v-01665c60]{color:var(--text-muted);margin-top:2px;font-size:11px}.step-badge[data-v-01665c60]{border-radius:var(--radius-full);padding:2px 8px;font-size:10px;font-weight:600}.badge-completed[data-v-01665c60]{background:var(--info-bg);color:var(--info)}.badge-running[data-v-01665c60]{background:var(--success-bg);color:var(--success)}.badge-pending[data-v-01665c60]{background:var(--bg-elevated);color:var(--text-muted)}.step-num[data-v-01665c60]{color:var(--text-muted)}.reasoner-card[data-v-01665c60]{background:var(--bg-primary);border:1px solid var(--border-primary);border-left:4px solid var(--color-intel);border-radius:var(--radius-sm);width:100%}.reasoner-header[data-v-01665c60]{color:var(--color-intel);border-bottom:1px solid var(--border-primary);align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:600;display:flex}.winner-tag[data-v-01665c60]{border-radius:var(--radius-full);margin-left:auto;padding:2px 8px;font-size:11px;font-weight:600}.winner-high[data-v-01665c60]{background:var(--success-bg);color:var(--success)}.winner-mid[data-v-01665c60]{background:var(--warning-bg);color:var(--warning)}.winner-low[data-v-01665c60]{background:var(--error-bg);color:var(--error)}.reasoner-body[data-v-01665c60]{color:var(--text-secondary);padding:12px 14px;font-size:13px;line-height:1.6}.viz-grid[data-v-01665c60]{grid-template-columns:1fr 1fr;gap:12px;padding:0 14px 14px;display:grid}.viz-card[data-v-01665c60]{background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-sm);padding:10px}.viz-title[data-v-01665c60]{color:var(--text-muted);letter-spacing:1px;margin-bottom:8px;font-size:10px;font-weight:600}.viz-table[data-v-01665c60]{border-collapse:collapse;width:100%;font-size:11px}.viz-table th[data-v-01665c60]{text-align:left;color:var(--text-muted);border-bottom:1px solid var(--border-primary);padding:4px 6px}.viz-table td[data-v-01665c60]{border-bottom:1px solid var(--bg-elevated);padding:4px 6px}.ev-cell[data-v-01665c60]{color:var(--text-tertiary);text-overflow:ellipsis;white-space:nowrap;max-width:100px;overflow:hidden}.val-cell[data-v-01665c60]{text-align:center;font-weight:600}.viz-side[data-v-01665c60]{flex-direction:column;gap:12px;display:flex}.bayes-item[data-v-01665c60]{margin-bottom:8px}.bayes-label[data-v-01665c60]{color:var(--text-secondary);gap:8px;margin-bottom:2px;font-size:11px;display:flex}.bayes-id[data-v-01665c60]{color:var(--warning)}.bar-row[data-v-01665c60]{color:var(--text-muted);align-items:center;gap:6px;margin-bottom:2px;font-size:10px;display:flex}.bar-label[data-v-01665c60]{min-width:28px}.bar-track[data-v-01665c60]{background:var(--bg-elevated);border-radius:3px;flex:1;height:6px;overflow:hidden}.bar-fill[data-v-01665c60]{background:var(--text-muted);border-radius:3px;height:100%}.bar-up[data-v-01665c60]{background:var(--success)}.bar-down[data-v-01665c60]{background:var(--error)}.bar-val[data-v-01665c60]{text-align:right;min-width:32px}.text-up[data-v-01665c60]{color:var(--success)}.text-down[data-v-01665c60]{color:var(--error)}.dur-row[data-v-01665c60]{align-items:center;gap:8px;margin-bottom:4px;display:flex}.dur-name[data-v-01665c60]{color:var(--text-secondary);min-width:65px;font-size:11px}.dur-track[data-v-01665c60]{background:var(--bg-elevated);border-radius:4px;flex:1;height:8px;overflow:hidden}.dur-fill[data-v-01665c60]{border-radius:4px;height:100%}.dur-val[data-v-01665c60]{color:var(--text-muted);text-align:right;min-width:50px;font-size:10px}.trace-card[data-v-01665c60]{border:1px solid var(--border-primary);border-radius:var(--radius-sm);background:var(--bg-card);width:100%;overflow:hidden}.trace-card>summary[data-v-01665c60]{cursor:pointer;list-style:none}.trace-card>summary[data-v-01665c60]::-webkit-details-marker{display:none}.trace-header[data-v-01665c60]{color:var(--color-intel);background:var(--bg-elevated);border-bottom:1px solid var(--border-primary);-webkit-user-select:none;user-select:none;align-items:center;gap:8px;padding:8px 14px;font-size:12px;font-weight:600;display:flex}.trace-header svg[data-v-01665c60]{color:var(--color-intel);flex-shrink:0}.trace-badge[data-v-01665c60]{color:var(--text-muted);background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-full);margin-left:auto;padding:1px 8px;font-size:10px;font-weight:500}.trace-body[data-v-01665c60]{max-height:340px;padding:6px 14px 10px;overflow-y:auto}.trace-round[data-v-01665c60]{margin-top:8px}.trace-round-title[data-v-01665c60]{color:var(--text-tertiary);letter-spacing:.5px;margin-bottom:4px;font-size:11px;font-weight:700}.trace-item[data-v-01665c60]{align-items:flex-start;gap:8px;padding:3px 0;font-size:12px;line-height:1.5;display:flex}.t-badge[data-v-01665c60]{text-align:center;background:var(--bg-elevated);min-width:30px;color:var(--text-muted);border-radius:3px;flex-shrink:0;margin-top:1px;padding:1px 6px;font-size:10px;font-weight:600}.t-content[data-v-01665c60]{min-width:0;color:var(--text-secondary);flex:1}.t-line[data-v-01665c60],.t-name[data-v-01665c60]{color:var(--text-secondary)}.t-name code[data-v-01665c60],.t-content code[data-v-01665c60]{background:var(--bg-elevated);color:#a5d6ff;font-family:var(--font-mono);border-radius:3px;padding:0 4px;font-size:11px}.t-ok[data-v-01665c60]{color:var(--success)}.t-err[data-v-01665c60]{color:var(--error)}.t-warn[data-v-01665c60]{color:var(--warning)}.t-task[data-v-01665c60]{color:var(--text-muted);text-overflow:ellipsis;margin-top:1px;font-size:11px;overflow:hidden}.t-meta[data-v-01665c60]{color:var(--text-muted);margin-left:6px;font-size:11px}.t-verdict[data-v-01665c60]{font-weight:600}.t-verdict.v-malicious[data-v-01665c60]{color:var(--error)}.t-verdict.v-suspicious[data-v-01665c60]{color:var(--warning)}.t-verdict.v-benign[data-v-01665c60]{color:var(--success)}.t-verdict.v-unknown[data-v-01665c60]{color:var(--text-muted)}.t-args[data-v-01665c60]{background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:var(--radius-sm);font-family:var(--font-mono);color:var(--text-tertiary);white-space:pre-wrap;word-break:break-all;margin:3px 0 0;padding:6px 8px;font-size:10px;overflow-x:auto}.t-think[data-v-01665c60]{color:var(--text-tertiary);padding:2px 0;font-size:12px;line-height:1.7}.t-think p[data-v-01665c60]{margin:4px 0}.t-think strong[data-v-01665c60]{color:var(--text-secondary)}.t-item.t-think[data-v-01665c60]{border-left:2px solid var(--color-intel);margin-left:2px;padding-left:8px}.t-item.t-think .t-badge[data-v-01665c60]{color:var(--color-intel);background:#06b6d41f}.t-item.t-agent_error .t-badge[data-v-01665c60]{color:var(--error);background:#ef44441f}.t-item.t-route_correction .t-badge[data-v-01665c60]{color:var(--warning);background:#f59e0b1f}.t-item.t-tool_call .t-badge[data-v-01665c60]{color:var(--color-intel);background:#3b82f61f}.t-item.t-agent_result .t-badge[data-v-01665c60]{color:var(--success);background:#22c55e1f}.analysis-card[data-v-01665c60]{border:1px solid var(--border-primary);border-radius:var(--radius-sm);width:100%;overflow:hidden}.analysis-header[data-v-01665c60]{color:var(--text-secondary);background:var(--bg-elevated);border-bottom:1px solid var(--border-primary);padding:8px 14px;font-size:12px;font-weight:600}.analysis-grid[data-v-01665c60]{grid-template-columns:repeat(5,1fr);display:grid}.analysis-cell[data-v-01665c60]{border-right:1px solid var(--border-primary);padding:8px 10px}.analysis-cell[data-v-01665c60]:last-child{border-right:none}.cell-label[data-v-01665c60]{color:var(--text-muted);margin-bottom:2px;font-size:10px;display:block}.cell-value[data-v-01665c60]{color:var(--text-secondary);font-size:13px;font-weight:500}.msg-system[data-v-01665c60]{text-align:center}.sys-text[data-v-01665c60]{color:var(--text-muted);opacity:.7;font-size:11px}.sr-card[data-v-01665c60]{border:1px solid var(--border-primary);border-radius:var(--radius-sm);background:var(--bg-card);width:100%;overflow:hidden}.sr-header[data-v-01665c60]{color:var(--text-secondary);background:var(--bg-elevated);border-bottom:1px solid var(--border-primary);align-items:center;gap:6px;padding:8px 14px;font-size:12px;font-weight:600;display:flex}.sr-header svg[data-v-01665c60]{color:var(--color-analyst,var(--accent))}.sr-status[data-v-01665c60]{color:var(--text-muted);margin-left:auto;font-size:10px;font-weight:500}.sr-main[data-v-01665c60]{border-bottom:1px solid var(--border-primary);align-items:baseline;gap:12px;padding:12px 14px;display:flex}.sr-score[data-v-01665c60]{font-size:34px;font-weight:800;line-height:1}.sr-label[data-v-01665c60]{color:var(--text-muted);font-size:11px}.sr-decision[data-v-01665c60]{text-transform:capitalize;margin-left:auto;font-size:14px;font-weight:700}.sr-human[data-v-01665c60]{color:var(--warning);font-size:11px}.sr-unknown-hint[data-v-01665c60]{color:var(--text-muted);border:1px dashed var(--border-primary);white-space:nowrap;border-radius:3px;padding:1px 6px;font-size:10px}.sr-meta[data-v-01665c60]{color:var(--text-muted);border-bottom:1px solid var(--border-primary);gap:18px;padding:8px 14px;font-size:11px;display:flex}.sr-meta-item strong[data-v-01665c60]{color:var(--text-secondary)}.sr-summary[data-v-01665c60]{color:var(--text-secondary);border-bottom:1px dashed var(--border-primary);padding:10px 14px;font-size:13px;line-height:1.7}.sr-agents[data-v-01665c60]{padding:6px 14px 10px}.sr-agent[data-v-01665c60]{align-items:center;gap:8px;padding:4px 0;font-size:12px;display:flex}.sr-agent-name[data-v-01665c60]{width:130px;color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.sr-agent-verdict[data-v-01665c60]{text-transform:capitalize;font-weight:600}.sr-agent-verdict.agent-verdict-malicious[data-v-01665c60]{color:var(--error)}.sr-agent-verdict.agent-verdict-suspicious[data-v-01665c60]{color:var(--warning)}.sr-agent-verdict.agent-verdict-benign[data-v-01665c60]{color:var(--success)}.sr-agent-verdict.agent-verdict-unknown[data-v-01665c60]{color:var(--text-muted)}.sr-agent-conf[data-v-01665c60]{color:var(--text-secondary);margin-left:auto;font-size:11px}.sr-path[data-v-01665c60]{border-top:1px dashed var(--border-primary);padding:8px 14px 12px}.sr-path-title[data-v-01665c60]{color:var(--text-secondary);margin-bottom:6px;font-size:11px;font-weight:600}.sr-path-step[data-v-01665c60]{color:var(--text-secondary);align-items:flex-start;gap:8px;padding:3px 0;font-size:12px;line-height:1.5;display:flex}.sr-path-num[data-v-01665c60]{background:var(--bg-elevated);width:18px;height:18px;color:var(--text-muted);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;margin-top:1px;font-size:10px;font-weight:700;display:flex}.path-tag-evidence .sr-path-num[data-v-01665c60]{color:var(--color-intel,#3b82f6);background:#60a5fa26}.path-tag-conflict .sr-path-num[data-v-01665c60]{color:var(--warning);background:#f59e0b26}.path-tag-fusion .sr-path-num[data-v-01665c60]{color:#a855f7;background:#a855f726}.path-tag-decision .sr-path-num[data-v-01665c60]{color:var(--error);background:#dc262626}.sr-path-conflicts[data-v-01665c60]{border-top:1px dashed var(--border-primary);margin-top:6px;padding-top:6px}.sr-conflict[data-v-01665c60]{color:var(--warning);padding:2px 0;font-size:11px}.sr-tpl-tag[data-v-01665c60]{color:var(--color-intel);background:#3b82f61f;border-radius:10px;padding:1px 8px;font-size:10px;font-weight:600}.sr-mode-switch[data-v-01665c60]{gap:4px;display:flex}.mode-btn[data-v-01665c60]{border:1px solid var(--border-primary);background:var(--bg-card);color:var(--text-muted);cursor:pointer;transition:all var(--transition-fast);border-radius:3px;padding:2px 8px;font-size:10px;font-weight:600}.mode-btn[data-v-01665c60]:hover{border-color:var(--accent);color:var(--accent-hover)}.mode-btn.mode-active[data-v-01665c60]{background:var(--accent);border-color:var(--accent);color:#fff}.sr-section[data-v-01665c60]{border-bottom:1px dashed var(--border-primary);padding:8px 14px}.sr-section-title[data-v-01665c60]{color:var(--text-tertiary);letter-spacing:.5px;margin-bottom:6px;font-size:11px;font-weight:700}.sr-finding[data-v-01665c60]{color:var(--text-secondary);align-items:flex-start;gap:8px;padding:2px 0;font-size:12px;line-height:1.5;display:flex}.sr-finding-dot[data-v-01665c60]{background:var(--accent);border-radius:50%;flex-shrink:0;width:6px;height:6px;margin-top:6px}.sr-finding-text[data-v-01665c60]{flex:1}.sr-action[data-v-01665c60]{color:var(--text-secondary);align-items:flex-start;gap:8px;padding:3px 0;font-size:12px;line-height:1.5;display:flex}.sr-action-num[data-v-01665c60]{background:var(--success-bg);width:18px;height:18px;color:var(--success);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;margin-top:1px;font-size:10px;font-weight:700;display:flex}.sr-action-text[data-v-01665c60]{flex:1}.ec-item[data-v-01665c60]{border:1px solid var(--border-primary);border-left:3px solid var(--color-intel);border-radius:var(--radius-sm);background:var(--bg-primary);margin-bottom:6px;padding:8px 10px}.ec-head[data-v-01665c60]{align-items:center;gap:8px;margin-bottom:4px;display:flex}.ec-agent[data-v-01665c60]{color:var(--text-secondary);font-size:12px;font-weight:700}.ec-verdict[data-v-01665c60]{text-transform:capitalize;font-size:10px;font-weight:600}.ec-verdict.agent-verdict-malicious[data-v-01665c60]{color:var(--error)}.ec-verdict.agent-verdict-suspicious[data-v-01665c60]{color:var(--warning)}.ec-verdict.agent-verdict-benign[data-v-01665c60]{color:var(--success)}.ec-verdict.agent-verdict-unknown[data-v-01665c60]{color:var(--text-muted)}.ec-conf[data-v-01665c60]{color:var(--text-secondary);margin-left:auto;font-size:11px;font-weight:600}.ec-row[data-v-01665c60]{align-items:flex-start;gap:8px;padding:2px 0;font-size:11px;line-height:1.5;display:flex}.ec-label[data-v-01665c60]{min-width:28px;color:var(--text-muted);flex-shrink:0;font-weight:600}.ec-val[data-v-01665c60]{color:var(--text-secondary);flex:1}.ec-tools[data-v-01665c60]{flex-wrap:wrap;flex:1;gap:4px;display:flex}.ec-tool[data-v-01665c60]{background:var(--bg-elevated);color:#a5d6ff;font-family:var(--font-mono);border-radius:3px;padding:0 6px;font-size:10px}.sr-table[data-v-01665c60]{border-collapse:collapse;width:100%;margin-top:4px;font-size:11px}.sr-table th[data-v-01665c60]{text-align:left;color:var(--text-muted);border-bottom:1px solid var(--border-primary);white-space:nowrap;padding:4px 8px}.sr-table td[data-v-01665c60]{border-bottom:1px solid var(--bg-elevated);color:var(--text-secondary);padding:4px 8px}.sr-detail[data-v-01665c60]{border-bottom:1px dashed var(--border-primary)}.sr-detail-summary[data-v-01665c60]{color:var(--text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;padding:8px 14px;font-size:12px;font-weight:600;list-style:none;display:flex}.sr-detail-summary[data-v-01665c60]::-webkit-details-marker{display:none}.sr-detail-summary svg[data-v-01665c60]{color:var(--text-muted);transition:transform .2s}.sr-detail[open] .sr-detail-summary svg[data-v-01665c60]{transform:rotate(90deg)}.sr-detail-body[data-v-01665c60]{color:var(--text-secondary);padding:0 14px 12px;font-size:13px;line-height:1.7}.sr-agent-summary[data-v-01665c60]{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:11px;overflow:hidden}.sr-full[data-v-01665c60]{border-top:1px dashed var(--border-primary);padding:8px 14px 12px}.sr-full-body[data-v-01665c60]{color:var(--text-secondary);font-size:12px;line-height:1.6}.sr-card.tpl-漏洞分析[data-v-01665c60]{border-top:2px solid var(--color-knowledge,#8b5cf6)}.sr-card.tpl-攻击检测[data-v-01665c60]{border-top:2px solid var(--error)}.sr-card.tpl-安全配置[data-v-01665c60]{border-top:2px solid var(--color-analyst,#3b82f6)}.sr-card.tpl-威胁情报[data-v-01665c60]{border-top:2px solid var(--color-intel,#06b6d4)}.sr-card.tpl-应急响应[data-v-01665c60]{border-top:2px solid var(--warning)}.confidence-card[data-v-01665c60]{border:1px solid var(--border-primary);border-radius:var(--radius-sm);background:var(--bg-card);width:100%;overflow:hidden}.conf-header[data-v-01665c60]{color:var(--text-secondary);background:var(--bg-elevated);border-bottom:1px solid var(--border-primary);align-items:center;gap:6px;padding:8px 14px;font-size:12px;font-weight:600;display:flex}.conf-header svg[data-v-01665c60]{color:var(--color-intel)}.conf-main[data-v-01665c60]{border-bottom:1px solid var(--border-primary);align-items:baseline;gap:10px;padding:10px 14px;display:flex}.conf-value[data-v-01665c60]{font-size:26px;font-weight:700}.conf-level-high[data-v-01665c60]{color:var(--error)}.conf-level-mid[data-v-01665c60]{color:var(--warning)}.conf-level-low[data-v-01665c60]{color:var(--success)}.conf-verdict[data-v-01665c60]{text-transform:capitalize;font-size:13px;font-weight:600}.conf-verdict-mal[data-v-01665c60]{color:var(--error)}.conf-verdict-susp[data-v-01665c60]{color:var(--warning)}.conf-verdict-unk[data-v-01665c60]{color:var(--text-muted)}.conf-human[data-v-01665c60]{color:var(--warning);margin-left:auto;font-size:11px}.conf-details[data-v-01665c60]{padding:6px 14px}.conf-row[data-v-01665c60]{align-items:center;gap:8px;padding:3px 0;font-size:11px;display:flex}.conf-agent[data-v-01665c60]{width:120px;color:var(--text-secondary);font-family:var(--font-mono,monospace);font-size:10px}.conf-weight[data-v-01665c60]{width:32px;color:var(--text-muted);text-align:right}.conf-bar[data-v-01665c60]{background:var(--bg-elevated);border-radius:3px;flex:1;height:5px;overflow:hidden}.conf-bar i[data-v-01665c60]{background:var(--color-intel);opacity:.7;height:100%;display:block}.conf-agent-conf[data-v-01665c60]{text-align:right;width:44px;color:var(--text-secondary);font-weight:600}.conf-tag[data-v-01665c60]{border-radius:3px;padding:1px 5px;font-size:9px}.tag-degraded[data-v-01665c60]{color:var(--warning);background:#f59e0b1f}.tag-failed[data-v-01665c60]{color:var(--error);background:#ef44441f}.conf-coverage[data-v-01665c60]{color:var(--text-muted);border-top:1px dashed var(--border-primary);padding:6px 14px 10px;font-size:11px}.conf-coverage strong[data-v-01665c60]{color:var(--text-secondary)}.risk-card[data-v-01665c60]{border:1px solid var(--border-primary);border-radius:var(--radius-sm);background:var(--bg-card);width:100%;overflow:hidden}.risk-header[data-v-01665c60]{color:var(--text-secondary);background:var(--bg-elevated);border-bottom:1px solid var(--border-primary);align-items:center;gap:6px;padding:8px 14px;font-size:12px;font-weight:600;display:flex}.risk-header svg[data-v-01665c60]{color:var(--warning)}.risk-level[data-v-01665c60]{border-radius:10px;margin-left:auto;padding:1px 8px;font-size:11px;font-weight:700}.risk-level-high[data-v-01665c60]{color:var(--error);background:#ef44441f}.risk-level-mid[data-v-01665c60]{color:var(--warning);background:#f59e0b1f}.risk-level-low[data-v-01665c60]{color:var(--success);background:#22c55e1f}.risk-main[data-v-01665c60]{border-bottom:1px solid var(--border-primary);align-items:baseline;gap:8px;padding:10px 14px;display:flex}.risk-score[data-v-01665c60]{font-size:30px;font-weight:800;line-height:1}.risk-score-high[data-v-01665c60]{color:var(--error)}.risk-score-mid[data-v-01665c60]{color:var(--warning)}.risk-score-low[data-v-01665c60]{color:var(--success)}.risk-label[data-v-01665c60]{color:var(--text-muted);font-size:11px}.risk-human[data-v-01665c60]{color:var(--warning);margin-left:auto;font-size:11px}.risk-dims[data-v-01665c60]{padding:6px 14px}.risk-dim[data-v-01665c60]{align-items:baseline;gap:8px;padding:3px 0;font-size:11px;display:flex}.risk-dim-name[data-v-01665c60]{width:64px;color:var(--text-secondary);flex-shrink:0;font-weight:600}.risk-dim-delta[data-v-01665c60]{text-align:right;width:40px;font-weight:700;font-family:var(--font-mono,monospace);flex-shrink:0}.delta-pos[data-v-01665c60]{color:var(--error)}.delta-neg[data-v-01665c60]{color:var(--success)}.delta-zero[data-v-01665c60]{color:var(--text-muted)}.risk-dim-reason[data-v-01665c60]{color:var(--text-muted);flex:1}.risk-footer[data-v-01665c60]{color:var(--text-secondary);border-top:1px dashed var(--border-primary);justify-content:space-between;gap:8px;padding:6px 14px 10px;font-size:11px;display:flex}.risk-rules[data-v-01665c60]{color:var(--text-muted);font-family:var(--font-mono,monospace);text-align:right;font-size:10px}.ws-status-bar[data-v-01665c60]{border-top:1px solid var(--border-primary);transition:all var(--transition-fast);align-items:center;gap:8px;padding:4px 20px;font-size:11px;display:flex}.ws-dot[data-v-01665c60]{border-radius:50%;flex-shrink:0;width:8px;height:8px;transition:background .3s}.ws-label[data-v-01665c60]{color:var(--text-muted)}.ws-retry[data-v-01665c60]{color:var(--warning);margin-left:auto;font-size:10px}.ws-connected .ws-dot[data-v-01665c60]{background:var(--success);box-shadow:0 0 4px #22c55e66}.ws-connected .ws-label[data-v-01665c60]{color:var(--success)}.ws-connecting .ws-dot[data-v-01665c60]{background:var(--warning);animation:1s infinite pulse-dot-01665c60}.ws-connecting .ws-label[data-v-01665c60]{color:var(--warning)}.ws-reconnecting .ws-dot[data-v-01665c60]{background:var(--warning);animation:1s infinite pulse-dot-01665c60}.ws-reconnecting .ws-label[data-v-01665c60]{color:var(--warning)}.ws-disconnected .ws-dot[data-v-01665c60]{background:var(--error)}.ws-disconnected .ws-label[data-v-01665c60]{color:var(--error)}@keyframes pulse-dot-01665c60{0%,to{opacity:1}50%{opacity:.3}}.processing-bar[data-v-01665c60]{color:var(--text-muted);align-items:center;gap:10px;padding:8px 0;font-size:12px;display:flex}.processing-dots[data-v-01665c60]{gap:4px;display:flex}.processing-dots span[data-v-01665c60]{background:var(--text-muted);border-radius:50%;width:6px;height:6px;animation:1.4s ease-in-out infinite both bounce-01665c60}.processing-dots span[data-v-01665c60]:first-child{animation-delay:-.32s}.processing-dots span[data-v-01665c60]:nth-child(2){animation-delay:-.16s}@keyframes bounce-01665c60{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}.input-bar[data-v-01665c60]{border-top:1px solid var(--border-primary);background:var(--bg-card);padding:16px 20px}.input-wrapper[data-v-01665c60]{background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:var(--radius-md);transition:border-color var(--transition-fast);align-items:flex-end;gap:10px;padding:8px 12px;display:flex}.input-wrapper[data-v-01665c60]:focus-within{border-color:var(--accent);box-shadow:0 0 0 1px #dc262626}.chat-input[data-v-01665c60]{color:var(--text-primary);font-family:var(--font-sans);resize:none;background:0 0;border:none;outline:none;flex:1;max-height:120px;font-size:14px;line-height:1.5}.chat-input[data-v-01665c60]::placeholder{color:var(--text-muted)}.chat-input[data-v-01665c60]:disabled{opacity:.5}.send-btn[data-v-01665c60]{background:var(--bg-elevated);width:36px;height:36px;color:var(--text-muted);cursor:pointer;transition:all var(--transition-fast);border:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;display:flex}.send-btn.active[data-v-01665c60]{background:var(--accent);color:#fff}.send-btn.active[data-v-01665c60]:hover{background:var(--accent-hover);box-shadow:var(--shadow-glow-red)}.send-btn[data-v-01665c60]:disabled{cursor:not-allowed;opacity:.4}.send-spinner[data-v-01665c60]{border:2px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:16px;height:16px;animation:.8s linear infinite spin-01665c60}@media (width<=768px){.msg-list[data-v-01665c60]{padding:12px!important}.msg-bubble[data-v-01665c60]{max-width:90%!important}.bubble-content[data-v-01665c60]{font-size:13px!important}.input-bar[data-v-01665c60]{padding:8px 10px!important}.input-wrapper[data-v-01665c60]{padding:6px 10px!important}.chat-input[data-v-01665c60]{font-size:13px!important}.empty-state[data-v-01665c60]{margin-top:40px!important}.empty-title[data-v-01665c60]{font-size:18px!important}.empty-subtitle[data-v-01665c60]{font-size:12px!important}.analysis-grid[data-v-01665c60]{grid-template-columns:repeat(2,1fr)!important}.analysis-cell[data-v-01665c60]{padding:6px 8px!important}.analysis-cell[data-v-01665c60]:nth-child(5){grid-column:span 2}.viz-grid[data-v-01665c60]{grid-template-columns:1fr!important}.step-node[data-v-01665c60]{flex-wrap:wrap;gap:6px!important}.step-output[data-v-01665c60]{width:100%}.status-metrics[data-v-01665c60]{gap:6px;font-size:10px}}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import{A as e,B as t,C as n,Ct as r,E as i,Ht as a,K as o,S as s,T as c,Ut as l,Wt as u,Y as d,Z as f,_ as p,_t as ee,ht as te,it as ne,k as m,st as re}from"./vendor-icons-BTNgi7vU.js";import{h as ie,m as ae,p as oe}from"./vendor-ui-Cdd65KTN.js";import{t as se}from"./index-DBEjbyJR.js";import{t as ce}from"./_plugin-vue_export-helper-BDNMzG2s.js";function h(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var g=h();function _(e){g=e}var v=/[&<>"']/,le=new RegExp(v.source,`g`),ue=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,de=new RegExp(ue.source,`g`),fe={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`},pe=e=>fe[e];function y(e,t){if(t){if(v.test(e))return e.replace(le,pe)}else if(ue.test(e))return e.replace(de,pe);return e}var b=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function me(e){return e.replace(b,(e,t)=>(t=t.toLowerCase(),t===`colon`?`:`:t.charAt(0)===`#`?t.charAt(1)===`x`?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):``))}var he=/(^|[^\[])\^/g;function x(e,t){let n=typeof e==`string`?e:e.source;t||=``;let r={replace:(e,t)=>{let i=typeof t==`string`?t:t.source;return i=i.replace(he,`$1`),n=n.replace(e,i),r},getRegex:()=>new RegExp(n,t)};return r}function ge(e){try{e=encodeURI(e).replace(/%25/g,`%`)}catch{return null}return e}var S={exec:()=>null};function C(e,t){let n=e.replace(/\|/g,(e,t,n)=>{let r=!1,i=t;for(;--i>=0&&n[i]===`\\`;)r=!r;return r?`|`:` |`}).split(/ \|/),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t){if(n.length>t)n.splice(t);else for(;n.length<t;)n.push(``)}for(;r<n.length;r++)n[r]=n[r].trim().replace(/\\\|/g,`|`);return n}function w(e,t,n){let r=e.length;if(r===0)return``;let i=0;for(;i<r;){let a=e.charAt(r-i-1);if(a===t&&!n)i++;else if(a!==t&&n)i++;else break}return e.slice(0,r-i)}function _e(e,t){if(e.indexOf(t[1])===-1)return-1;let n=0;for(let r=0;r<e.length;r++)if(e[r]===`\\`)r++;else if(e[r]===t[0])n++;else if(e[r]===t[1]&&(n--,n<0))return r;return-1}function T(e,t,n,r){let i=t.href,a=t.title?y(t.title):null,o=e[1].replace(/\\([\[\]])/g,`$1`);if(e[0].charAt(0)!==`!`){r.state.inLink=!0;let e={type:`link`,raw:n,href:i,title:a,text:o,tokens:r.inlineTokens(o)};return r.state.inLink=!1,e}return{type:`image`,raw:n,href:i,title:a,text:y(o)}}function ve(e,t){let n=e.match(/^(\s+)(?:```)/);if(n===null)return t;let r=n[1];return t.split(`
|
|
2
|
+
`).map(e=>{let t=e.match(/^\s+/);if(t===null)return e;let[n]=t;return n.length>=r.length?e.slice(r.length):e}).join(`
|
|
3
|
+
`)}var E=class{options;rules;lexer;constructor(e){this.options=e||g}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:`space`,raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let e=t[0].replace(/^ {1,4}/gm,``);return{type:`code`,raw:t[0],codeBlockStyle:`indented`,text:this.options.pedantic?e:w(e,`
|
|
4
|
+
`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let e=t[0],n=ve(e,t[3]||``);return{type:`code`,raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,`$1`):t[2],text:n}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(/#$/.test(e)){let t=w(e,`#`);(this.options.pedantic||!t||/ $/.test(t))&&(e=t.trim())}return{type:`heading`,raw:t[0],depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:`hr`,raw:t[0]}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let e=t[0].replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,`
|
|
5
|
+
$1`);e=w(e.replace(/^ *>[ \t]?/gm,``),`
|
|
6
|
+
`);let n=this.lexer.state.top;this.lexer.state.top=!0;let r=this.lexer.blockTokens(e);return this.lexer.state.top=n,{type:`blockquote`,raw:t[0],tokens:r,text:e}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,i={type:`list`,raw:``,ordered:r,start:r?+n.slice(0,-1):``,loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:`[*+-]`);let a=RegExp(`^( {0,3}${n})((?:[\t ][^\\n]*)?(?:\\n|$))`),o=``,s=``,c=!1;for(;e;){let n=!1;if(!(t=a.exec(e))||this.rules.block.hr.test(e))break;o=t[0],e=e.substring(o.length);let r=t[2].split(`
|
|
7
|
+
`,1)[0].replace(/^\t+/,e=>` `.repeat(3*e.length)),l=e.split(`
|
|
8
|
+
`,1)[0],u=0;this.options.pedantic?(u=2,s=r.trimStart()):(u=t[2].search(/[^ ]/),u=u>4?1:u,s=r.slice(u),u+=t[1].length);let d=!1;if(!r&&/^ *$/.test(l)&&(o+=l+`
|
|
9
|
+
`,e=e.substring(l.length+1),n=!0),!n){let t=RegExp(`^ {0,${Math.min(3,u-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),n=RegExp(`^ {0,${Math.min(3,u-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),i=RegExp(`^ {0,${Math.min(3,u-1)}}(?:\`\`\`|~~~)`),a=RegExp(`^ {0,${Math.min(3,u-1)}}#`);for(;e;){let c=e.split(`
|
|
10
|
+
`,1)[0];if(l=c,this.options.pedantic&&(l=l.replace(/^ {1,4}(?=( {4})*[^ ])/g,` `)),i.test(l)||a.test(l)||t.test(l)||n.test(e))break;if(l.search(/[^ ]/)>=u||!l.trim())s+=`
|
|
11
|
+
`+l.slice(u);else{if(d||r.search(/[^ ]/)>=4||i.test(r)||a.test(r)||n.test(r))break;s+=`
|
|
12
|
+
`+l}!d&&!l.trim()&&(d=!0),o+=c+`
|
|
13
|
+
`,e=e.substring(c.length+1),r=l.slice(u)}}i.loose||(c?i.loose=!0:/\n *\n *$/.test(o)&&(c=!0));let f=null,p;this.options.gfm&&(f=/^\[[ xX]\] /.exec(s),f&&(p=f[0]!==`[ ] `,s=s.replace(/^\[[ xX]\] +/,``))),i.items.push({type:`list_item`,raw:o,task:!!f,checked:p,loose:!1,text:s,tokens:[]}),i.raw+=o}i.items[i.items.length-1].raw=o.trimEnd(),i.items[i.items.length-1].text=s.trimEnd(),i.raw=i.raw.trimEnd();for(let e=0;e<i.items.length;e++)if(this.lexer.state.top=!1,i.items[e].tokens=this.lexer.blockTokens(i.items[e].text,[]),!i.loose){let t=i.items[e].tokens.filter(e=>e.type===`space`);i.loose=t.length>0&&t.some(e=>/\n.*\n/.test(e.raw))}if(i.loose)for(let e=0;e<i.items.length;e++)i.items[e].loose=!0;return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:`html`,block:!0,raw:t[0],pre:t[1]===`pre`||t[1]===`script`||t[1]===`style`,text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let e=t[1].toLowerCase().replace(/\s+/g,` `),n=t[2]?t[2].replace(/^<(.*)>$/,`$1`).replace(this.rules.inline.anyPunctuation,`$1`):``,r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,`$1`):t[3];return{type:`def`,tag:e,raw:t[0],href:n,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!/[:|]/.test(t[2]))return;let n=C(t[1]),r=t[2].replace(/^\||\| *$/g,``).split(`|`),i=t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,``).split(`
|
|
14
|
+
`):[],a={type:`table`,raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let e of r)/^ *-+: *$/.test(e)?a.align.push(`right`):/^ *:-+: *$/.test(e)?a.align.push(`center`):/^ *:-+ *$/.test(e)?a.align.push(`left`):a.align.push(null);for(let e of n)a.header.push({text:e,tokens:this.lexer.inline(e)});for(let e of i)a.rows.push(C(e,a.header.length).map(e=>({text:e,tokens:this.lexer.inline(e)})));return a}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:`heading`,raw:t[0],depth:t[2].charAt(0)===`=`?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let e=t[1].charAt(t[1].length-1)===`
|
|
15
|
+
`?t[1].slice(0,-1):t[1];return{type:`paragraph`,raw:t[0],text:e,tokens:this.lexer.inline(e)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:`text`,raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:`escape`,raw:t[0],text:y(t[1])}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&/^<a /i.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&/^<\/a>/i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:`html`,raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let e=t[2].trim();if(!this.options.pedantic&&/^</.test(e)){if(!/>$/.test(e))return;let t=w(e.slice(0,-1),`\\`);if((e.length-t.length)%2==0)return}else{let e=_e(t[2],`()`);if(e>-1){let n=(t[0].indexOf(`!`)===0?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=``}}let n=t[2],r=``;if(this.options.pedantic){let e=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n);e&&(n=e[1],r=e[3])}else r=t[3]?t[3].slice(1,-1):``;return n=n.trim(),/^</.test(n)&&(n=this.options.pedantic&&!/>$/.test(e)?n.slice(1):n.slice(1,-1)),T(t,{href:n&&n.replace(this.rules.inline.anyPunctuation,`$1`),title:r&&r.replace(this.rules.inline.anyPunctuation,`$1`)},t[0],this.lexer)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let e=t[(n[2]||n[1]).replace(/\s+/g,` `).toLowerCase()];if(!e){let e=n[0].charAt(0);return{type:`text`,raw:e,text:e}}return T(n,e,n[0],this.lexer)}}emStrong(e,t,n=``){let r=this.rules.inline.emStrongLDelim.exec(e);if(r&&!(r[3]&&n.match(/[\p{L}\p{N}]/u))&&(!(r[1]||r[2])||!n||this.rules.inline.punctuation.exec(n))){let n=[...r[0]].length-1,i,a,o=n,s=0,c=r[0][0]===`*`?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+n);(r=c.exec(t))!=null;){if(i=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!i)continue;if(a=[...i].length,r[3]||r[4]){o+=a;continue}if((r[5]||r[6])&&n%3&&!((n+a)%3)){s+=a;continue}if(o-=a,o>0)continue;a=Math.min(a,a+o+s);let t=[...r[0]][0].length,c=e.slice(0,n+r.index+t+a);if(Math.min(n,a)%2){let e=c.slice(1,-1);return{type:`em`,raw:c,text:e,tokens:this.lexer.inlineTokens(e)}}let l=c.slice(2,-2);return{type:`strong`,raw:c,text:l,tokens:this.lexer.inlineTokens(l)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(/\n/g,` `),n=/[^ ]/.test(e),r=/^ /.test(e)&&/ $/.test(e);return n&&r&&(e=e.substring(1,e.length-1)),e=y(e,!0),{type:`codespan`,raw:t[0],text:e}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:`br`,raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:`del`,raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let e,n;return t[2]===`@`?(e=y(t[1]),n=`mailto:`+e):(e=y(t[1]),n=e),{type:`link`,raw:t[0],text:e,href:n,tokens:[{type:`text`,raw:e,text:e}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let e,n;if(t[2]===`@`)e=y(t[0]),n=`mailto:`+e;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??``;while(r!==t[0]);e=y(t[0]),n=t[1]===`www.`?`http://`+t[0]:t[0]}return{type:`link`,raw:t[0],text:e,href:n,tokens:[{type:`text`,raw:e,text:e}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let e;return e=this.lexer.state.inRawBlock?t[0]:y(t[0]),{type:`text`,raw:t[0],text:e}}}},ye=/^(?: *(?:\n|$))+/,D=/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,be=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,O=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,k=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,A=/(?:[*+-]|\d{1,9}[.)])/,xe=x(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,A).replace(/blockCode/g,/ {4}/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).getRegex(),j=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,M=/^[^\n]+/,N=/(?!\s*\])(?:\\.|[^\[\]\\])+/,P=x(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace(`label`,N).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Se=x(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,A).getRegex(),F=`address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul`,I=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Ce=x(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))`,`i`).replace(`comment`,I).replace(`tag`,F).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),L=x(j).replace(`hr`,O).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)]) `).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,F).getRegex(),R={blockquote:x(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,L).getRegex(),code:D,def:P,fences:be,heading:k,hr:O,html:Ce,lheading:xe,list:Se,newline:ye,paragraph:L,table:S,text:M},z=x(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,O).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,` {4}[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)]) `).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,F).getRegex(),we={...R,table:z,paragraph:x(j).replace(`hr`,O).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,z).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)]) `).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,F).getRegex()},B={...R,html:x(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,I).replace(/tag/g,`(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b`).getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:S,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:x(j).replace(`hr`,O).replace(`heading`,` *#{1,6} *[^
|
|
16
|
+
]`).replace(`lheading`,xe).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()},V=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Te=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Ee=/^( {2,}|\\)\n(?!\s*$)/,De=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,H=`\\p{P}\\p{S}`,U=x(/^((?![*_])[\spunctuation])/,`u`).replace(/punctuation/g,H).getRegex(),Oe=/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g,ke=x(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,`u`).replace(/punct/g,H).getRegex(),Ae=x(`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])`,`gu`).replace(/punct/g,H).getRegex(),je=x(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])`,`gu`).replace(/punct/g,H).getRegex(),Me=x(/\\([punct])/,`gu`).replace(/punct/g,H).getRegex(),Ne=x(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace(`scheme`,/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(`email`,/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Pe=x(I).replace(`(?:-->|$)`,`-->`).getRegex(),Fe=x(`^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>`).replace(`comment`,Pe).replace(`attribute`,/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),W=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Ie=x(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace(`label`,W).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Le=x(/^!?\[(label)\]\[(ref)\]/).replace(`label`,W).replace(`ref`,N).getRegex(),Re=x(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,N).getRegex(),ze={_backpedal:S,anyPunctuation:Me,autolink:Ne,blockSkip:Oe,br:Ee,code:Te,del:S,emStrongLDelim:ke,emStrongRDelimAst:Ae,emStrongRDelimUnd:je,escape:V,link:Ie,nolink:Re,punctuation:U,reflink:Le,reflinkSearch:x(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,Le).replace(`nolink`,Re).getRegex(),tag:Fe,text:De,url:S},Be={...ze,link:x(/^!?\[(label)\]\((.*?)\)/).replace(`label`,W).getRegex(),reflink:x(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,W).getRegex()},Ve={...ze,escape:x(V).replace(`])`,`~|])`).getRegex(),url:x(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,`i`).replace(`email`,/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/},He={...Ve,br:x(Ee).replace(`{2,}`,`*`).getRegex(),text:x(Ve.text).replace(`\\b_`,`\\b_| {2,}\\n`).replace(/\{2,\}/g,`*`).getRegex()},G={normal:R,gfm:we,pedantic:B},K={normal:ze,gfm:Ve,breaks:He,pedantic:Be},q=class e{tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||g,this.options.tokenizer=this.options.tokenizer||new E,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={block:G.normal,inline:K.normal};this.options.pedantic?(t.block=G.pedantic,t.inline=K.pedantic):this.options.gfm&&(t.block=G.gfm,t.inline=this.options.breaks?K.breaks:K.gfm),this.tokenizer.rules=t}static get rules(){return{block:G,inline:K}}static lex(t,n){return new e(n).lex(t)}static lexInline(t,n){return new e(n).inlineTokens(t)}lex(e){e=e.replace(/\r\n|\r/g,`
|
|
17
|
+
`),this.blockTokens(e,this.tokens);for(let e=0;e<this.inlineQueue.length;e++){let t=this.inlineQueue[e];this.inlineTokens(t.src,t.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[]){e=this.options.pedantic?e.replace(/\t/g,` `).replace(/^ +$/gm,``):e.replace(/^( *)(\t+)/gm,(e,t,n)=>t+` `.repeat(n.length));let n,r,i,a;for(;e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some(r=>(n=r.call({lexer:this},e,t))?(e=e.substring(n.raw.length),t.push(n),!0):!1))){if(n=this.tokenizer.space(e)){e=e.substring(n.raw.length),n.raw.length===1&&t.length>0?t[t.length-1].raw+=`
|
|
18
|
+
`:t.push(n);continue}if(n=this.tokenizer.code(e)){e=e.substring(n.raw.length),r=t[t.length-1],r&&(r.type===`paragraph`||r.type===`text`)?(r.raw+=`
|
|
19
|
+
`+n.raw,r.text+=`
|
|
20
|
+
`+n.text,this.inlineQueue[this.inlineQueue.length-1].src=r.text):t.push(n);continue}if(n=this.tokenizer.fences(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.heading(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.hr(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.blockquote(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.list(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.html(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.def(e)){e=e.substring(n.raw.length),r=t[t.length-1],r&&(r.type===`paragraph`||r.type===`text`)?(r.raw+=`
|
|
21
|
+
`+n.raw,r.text+=`
|
|
22
|
+
`+n.raw,this.inlineQueue[this.inlineQueue.length-1].src=r.text):this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title});continue}if(n=this.tokenizer.table(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.lheading(e)){e=e.substring(n.raw.length),t.push(n);continue}if(i=e,this.options.extensions&&this.options.extensions.startBlock){let t=1/0,n=e.slice(1),r;this.options.extensions.startBlock.forEach(e=>{r=e.call({lexer:this},n),typeof r==`number`&&r>=0&&(t=Math.min(t,r))}),t<1/0&&t>=0&&(i=e.substring(0,t+1))}if(this.state.top&&(n=this.tokenizer.paragraph(i))){r=t[t.length-1],a&&r.type===`paragraph`?(r.raw+=`
|
|
23
|
+
`+n.raw,r.text+=`
|
|
24
|
+
`+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=r.text):t.push(n),a=i.length!==e.length,e=e.substring(n.raw.length);continue}if(n=this.tokenizer.text(e)){e=e.substring(n.raw.length),r=t[t.length-1],r&&r.type===`text`?(r.raw+=`
|
|
25
|
+
`+n.raw,r.text+=`
|
|
26
|
+
`+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=r.text):t.push(n);continue}if(e){let t=`Infinite loop on byte: `+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw Error(t)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n,r,i,a=e,o,s,c;if(this.tokens.links){let e=Object.keys(this.tokens.links);if(e.length>0)for(;(o=this.tokenizer.rules.inline.reflinkSearch.exec(a))!=null;)e.includes(o[0].slice(o[0].lastIndexOf(`[`)+1,-1))&&(a=a.slice(0,o.index)+`[`+`a`.repeat(o[0].length-2)+`]`+a.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(o=this.tokenizer.rules.inline.blockSkip.exec(a))!=null;)a=a.slice(0,o.index)+`[`+`a`.repeat(o[0].length-2)+`]`+a.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(o=this.tokenizer.rules.inline.anyPunctuation.exec(a))!=null;)a=a.slice(0,o.index)+`++`+a.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;e;)if(s||(c=``),s=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some(r=>(n=r.call({lexer:this},e,t))?(e=e.substring(n.raw.length),t.push(n),!0):!1))){if(n=this.tokenizer.escape(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.tag(e)){e=e.substring(n.raw.length),r=t[t.length-1],r&&n.type===`text`&&r.type===`text`?(r.raw+=n.raw,r.text+=n.text):t.push(n);continue}if(n=this.tokenizer.link(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(n.raw.length),r=t[t.length-1],r&&n.type===`text`&&r.type===`text`?(r.raw+=n.raw,r.text+=n.text):t.push(n);continue}if(n=this.tokenizer.emStrong(e,a,c)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.codespan(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.br(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.del(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.autolink(e)){e=e.substring(n.raw.length),t.push(n);continue}if(!this.state.inLink&&(n=this.tokenizer.url(e))){e=e.substring(n.raw.length),t.push(n);continue}if(i=e,this.options.extensions&&this.options.extensions.startInline){let t=1/0,n=e.slice(1),r;this.options.extensions.startInline.forEach(e=>{r=e.call({lexer:this},n),typeof r==`number`&&r>=0&&(t=Math.min(t,r))}),t<1/0&&t>=0&&(i=e.substring(0,t+1))}if(n=this.tokenizer.inlineText(i)){e=e.substring(n.raw.length),n.raw.slice(-1)!==`_`&&(c=n.raw.slice(-1)),s=!0,r=t[t.length-1],r&&r.type===`text`?(r.raw+=n.raw,r.text+=n.text):t.push(n);continue}if(e){let t=`Infinite loop on byte: `+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw Error(t)}}return t}},J=class{options;constructor(e){this.options=e||g}code(e,t,n){let r=(t||``).match(/^\S*/)?.[0];return e=e.replace(/\n$/,``)+`
|
|
27
|
+
`,r?`<pre><code class="language-`+y(r)+`">`+(n?e:y(e,!0))+`</code></pre>
|
|
28
|
+
`:`<pre><code>`+(n?e:y(e,!0))+`</code></pre>
|
|
29
|
+
`}blockquote(e){return`<blockquote>\n${e}</blockquote>\n`}html(e,t){return e}heading(e,t,n){return`<h${t}>${e}</h${t}>\n`}hr(){return`<hr>
|
|
30
|
+
`}list(e,t,n){let r=t?`ol`:`ul`,i=t&&n!==1?` start="`+n+`"`:``;return`<`+r+i+`>
|
|
31
|
+
`+e+`</`+r+`>
|
|
32
|
+
`}listitem(e,t,n){return`<li>${e}</li>\n`}checkbox(e){return`<input `+(e?`checked="" `:``)+`disabled="" type="checkbox">`}paragraph(e){return`<p>${e}</p>\n`}table(e,t){return t&&=`<tbody>${t}</tbody>`,`<table>
|
|
33
|
+
<thead>
|
|
34
|
+
`+e+`</thead>
|
|
35
|
+
`+t+`</table>
|
|
36
|
+
`}tablerow(e){return`<tr>\n${e}</tr>\n`}tablecell(e,t){let n=t.header?`th`:`td`;return(t.align?`<${n} align="${t.align}">`:`<${n}>`)+e+`</${n}>\n`}strong(e){return`<strong>${e}</strong>`}em(e){return`<em>${e}</em>`}codespan(e){return`<code>${e}</code>`}br(){return`<br>`}del(e){return`<del>${e}</del>`}link(e,t,n){let r=ge(e);if(r===null)return n;e=r;let i=`<a href="`+e+`"`;return t&&(i+=` title="`+t+`"`),i+=`>`+n+`</a>`,i}image(e,t,n){let r=ge(e);if(r===null)return n;e=r;let i=`<img src="${e}" alt="${n}"`;return t&&(i+=` title="${t}"`),i+=`>`,i}text(e){return e}},Y=class{strong(e){return e}em(e){return e}codespan(e){return e}del(e){return e}html(e){return e}text(e){return e}link(e,t,n){return``+n}image(e,t,n){return``+n}br(){return``}},X=class e{options;renderer;textRenderer;constructor(e){this.options=e||g,this.options.renderer=this.options.renderer||new J,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new Y}static parse(t,n){return new e(n).parse(t)}static parseInline(t,n){return new e(n).parseInline(t)}parse(e,t=!0){let n=``;for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[i.type]){let e=i,t=this.options.extensions.renderers[e.type].call({parser:this},e);if(t!==!1||![`space`,`hr`,`heading`,`code`,`table`,`blockquote`,`list`,`html`,`paragraph`,`text`].includes(e.type)){n+=t||``;continue}}switch(i.type){case`space`:continue;case`hr`:n+=this.renderer.hr();continue;case`heading`:{let e=i;n+=this.renderer.heading(this.parseInline(e.tokens),e.depth,me(this.parseInline(e.tokens,this.textRenderer)));continue}case`code`:{let e=i;n+=this.renderer.code(e.text,e.lang,!!e.escaped);continue}case`table`:{let e=i,t=``,r=``;for(let t=0;t<e.header.length;t++)r+=this.renderer.tablecell(this.parseInline(e.header[t].tokens),{header:!0,align:e.align[t]});t+=this.renderer.tablerow(r);let a=``;for(let t=0;t<e.rows.length;t++){let n=e.rows[t];r=``;for(let t=0;t<n.length;t++)r+=this.renderer.tablecell(this.parseInline(n[t].tokens),{header:!1,align:e.align[t]});a+=this.renderer.tablerow(r)}n+=this.renderer.table(t,a);continue}case`blockquote`:{let e=i,t=this.parse(e.tokens);n+=this.renderer.blockquote(t);continue}case`list`:{let e=i,t=e.ordered,r=e.start,a=e.loose,o=``;for(let t=0;t<e.items.length;t++){let n=e.items[t],r=n.checked,i=n.task,s=``;if(n.task){let e=this.renderer.checkbox(!!r);a?n.tokens.length>0&&n.tokens[0].type===`paragraph`?(n.tokens[0].text=e+` `+n.tokens[0].text,n.tokens[0].tokens&&n.tokens[0].tokens.length>0&&n.tokens[0].tokens[0].type===`text`&&(n.tokens[0].tokens[0].text=e+` `+n.tokens[0].tokens[0].text)):n.tokens.unshift({type:`text`,text:e+` `}):s+=e+` `}s+=this.parse(n.tokens,a),o+=this.renderer.listitem(s,i,!!r)}n+=this.renderer.list(o,t,r);continue}case`html`:{let e=i;n+=this.renderer.html(e.text,e.block);continue}case`paragraph`:{let e=i;n+=this.renderer.paragraph(this.parseInline(e.tokens));continue}case`text`:{let a=i,o=a.tokens?this.parseInline(a.tokens):a.text;for(;r+1<e.length&&e[r+1].type===`text`;)a=e[++r],o+=`
|
|
37
|
+
`+(a.tokens?this.parseInline(a.tokens):a.text);n+=t?this.renderer.paragraph(o):o;continue}default:{let e=`Token with "`+i.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return n}parseInline(e,t){t||=this.renderer;let n=``;for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[i.type]){let e=this.options.extensions.renderers[i.type].call({parser:this},i);if(e!==!1||![`escape`,`html`,`link`,`image`,`strong`,`em`,`codespan`,`br`,`del`,`text`].includes(i.type)){n+=e||``;continue}}switch(i.type){case`escape`:{let e=i;n+=t.text(e.text);break}case`html`:{let e=i;n+=t.html(e.text);break}case`link`:{let e=i;n+=t.link(e.href,e.title,this.parseInline(e.tokens,t));break}case`image`:{let e=i;n+=t.image(e.href,e.title,e.text);break}case`strong`:{let e=i;n+=t.strong(this.parseInline(e.tokens,t));break}case`em`:{let e=i;n+=t.em(this.parseInline(e.tokens,t));break}case`codespan`:{let e=i;n+=t.codespan(e.text);break}case`br`:n+=t.br();break;case`del`:{let e=i;n+=t.del(this.parseInline(e.tokens,t));break}case`text`:{let e=i;n+=t.text(e.text);break}default:{let e=`Token with "`+i.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return n}},Z=class{options;constructor(e){this.options=e||g}static passThroughHooks=new Set([`preprocess`,`postprocess`,`processAllTokens`]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}},Q=new class{defaults=h();options=this.setOptions;parse=this.#e(q.lex,X.parse);parseInline=this.#e(q.lexInline,X.parseInline);Parser=X;Renderer=J;TextRenderer=Y;Lexer=q;Tokenizer=E;Hooks=Z;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case`table`:{let e=r;for(let r of e.header)n=n.concat(this.walkTokens(r.tokens,t));for(let r of e.rows)for(let e of r)n=n.concat(this.walkTokens(e.tokens,t));break}case`list`:{let e=r;n=n.concat(this.walkTokens(e.items,t));break}default:{let e=r;this.defaults.extensions?.childTokens?.[e.type]?this.defaults.extensions.childTokens[e.type].forEach(r=>{let i=e[r].flat(1/0);n=n.concat(this.walkTokens(i,t))}):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(e=>{let n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach(e=>{if(!e.name)throw Error(`extension name required`);if(`renderer`in e){let n=t.renderers[e.name];n?t.renderers[e.name]=function(...t){let r=e.renderer.apply(this,t);return r===!1&&(r=n.apply(this,t)),r}:t.renderers[e.name]=e.renderer}if(`tokenizer`in e){if(!e.level||e.level!==`block`&&e.level!==`inline`)throw Error(`extension level must be 'block' or 'inline'`);let n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&(e.level===`block`?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:e.level===`inline`&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}`childTokens`in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)}),n.extensions=t),e.renderer){let t=this.defaults.renderer||new J(this.defaults);for(let n in e.renderer){if(!(n in t))throw Error(`renderer '${n}' does not exist`);if(n===`options`)continue;let r=n,i=e.renderer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n||``}}n.renderer=t}if(e.tokenizer){let t=this.defaults.tokenizer||new E(this.defaults);for(let n in e.tokenizer){if(!(n in t))throw Error(`tokenizer '${n}' does not exist`);if([`options`,`rules`,`lexer`].includes(n))continue;let r=n,i=e.tokenizer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){let t=this.defaults.hooks||new Z;for(let n in e.hooks){if(!(n in t))throw Error(`hook '${n}' does not exist`);if(n===`options`)continue;let r=n,i=e.hooks[r],a=t[r];t[r]=Z.passThroughHooks.has(n)?e=>{if(this.defaults.async)return Promise.resolve(i.call(t,e)).then(e=>a.call(t,e));let n=i.call(t,e);return a.call(t,n)}:(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){let t=this.defaults.walkTokens,r=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(r.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return q.lex(e,t??this.defaults)}parser(e,t){return X.parse(e,t??this.defaults)}#e(e,t){return(n,r)=>{let i={...r},a={...this.defaults,...i};this.defaults.async===!0&&i.async===!1&&(a.silent||console.warn(`marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored.`),a.async=!0);let o=this.#t(!!a.silent,!!a.async);if(n==null)return o(Error(`marked(): input parameter is undefined or null`));if(typeof n!=`string`)return o(Error(`marked(): input parameter is of type `+Object.prototype.toString.call(n)+`, string expected`));if(a.hooks&&(a.hooks.options=a),a.async)return Promise.resolve(a.hooks?a.hooks.preprocess(n):n).then(t=>e(t,a)).then(e=>a.hooks?a.hooks.processAllTokens(e):e).then(e=>a.walkTokens?Promise.all(this.walkTokens(e,a.walkTokens)).then(()=>e):e).then(e=>t(e,a)).then(e=>a.hooks?a.hooks.postprocess(e):e).catch(o);try{a.hooks&&(n=a.hooks.preprocess(n));let r=e(n,a);a.hooks&&(r=a.hooks.processAllTokens(r)),a.walkTokens&&this.walkTokens(r,a.walkTokens);let i=t(r,a);return a.hooks&&(i=a.hooks.postprocess(i)),i}catch(e){return o(e)}}}#t(e,t){return n=>{if(n.message+=`
|
|
38
|
+
Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error occurred:</p><pre>`+y(n.message+``,!0)+`</pre>`;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function $(e,t){return Q.parse(e,t)}$.options=$.setOptions=function(e){return Q.setOptions(e),$.defaults=Q.defaults,_($.defaults),$},$.getDefaults=h,$.defaults=g,$.use=function(...e){return Q.use(...e),$.defaults=Q.defaults,_($.defaults),$},$.walkTokens=function(e,t){return Q.walkTokens(e,t)},$.parseInline=Q.parseInline,$.Parser=X,$.parser=X.parse,$.Renderer=J,$.TextRenderer=Y,$.Lexer=q,$.lexer=q.lex,$.Tokenizer=E,$.Hooks=Z,$.parse=$,$.options,$.setOptions,$.use,$.walkTokens,$.parseInline,X.parse,q.lex;var Ue={class:`chat-view`},We={class:`conv-sidebar`},Ge={class:`conv-list`},Ke={key:0,class:`conv-loading`},qe=[`onClick`,`title`],Je={width:`12`,height:`12`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{"flex-shrink":`0`}},Ye={class:`conv-title`},Xe={key:0,class:`conv-empty`},Ze={class:`chat-main`},Qe={key:0,class:`empty-state`},$e={class:`quick-replies`},et={key:0,class:`msg-user`},tt={class:`msg-bubble user-bubble`},nt={class:`bubble-avatar user-avatar`},rt=[`innerHTML`],it={key:1,class:`msg-agent`},at={class:`msg-bubble agent-bubble`},ot=[`innerHTML`],st={key:2,class:`msg-agent`},ct={class:`status-info`},lt={class:`status-name`},ut={class:`status-metrics`},dt={key:0,class:`metric-item`},ft={key:1,class:`metric-item`},pt={class:`status-result`},mt={key:0,class:`result-pass`},ht={key:1,class:`result-fail`},gt={key:2,class:`result-pending`},_t={key:3,class:`msg-agent`},vt={class:`status-card status-pending`},yt={class:`status-name`},bt={key:4,class:`msg-agent`},xt={class:`cot-card cot-start`},St=[`innerHTML`],Ct={key:5,class:`msg-agent`},wt={class:`chain-list`},Tt={class:`step-node`},Et={key:0,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`3`,"stroke-linecap":`round`,"stroke-linejoin":`round`},Dt={key:1,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},Ot={key:2,class:`step-num`},kt={class:`step-body`},At={class:`step-title`},jt={key:0,class:`step-output`},Mt={key:6,class:`msg-agent`},Nt={class:`reasoner-card`},Pt={class:`reasoner-header`},Ft=[`innerHTML`],It={key:0,class:`viz-grid`},Lt={key:0,class:`viz-card`},Rt={class:`viz-table`},zt={class:`ev-cell`},Bt={class:`viz-side`},Vt={key:0,class:`viz-card`},Ht={class:`bayes-label`},Ut={class:`bayes-id`},Wt={class:`bar-row`},Gt={class:`bar-track`},Kt={class:`bar-val`},qt={class:`bar-row`},Jt={class:`bar-track`},Yt={key:1,class:`viz-card`},Xt={class:`dur-name`},Zt={class:`dur-track`},Qt={class:`dur-val`},$t={key:7,class:`msg-agent`},en={class:`cot-card cot-step`},tn={class:`cot-header`},nn={class:`conf-badge`},rn={class:`cot-body`},an={key:0,class:`cot-section`},on=[`innerHTML`],sn={key:1,class:`cot-section`},cn=[`innerHTML`],ln={key:2,class:`cot-section`},un=[`innerHTML`],dn={key:3,class:`cot-next`},fn={key:8,class:`msg-agent`},pn={class:`cot-card cot-complete`},mn=[`innerHTML`],hn={key:9,class:`msg-agent`},gn={class:`analysis-card`},_n={class:`analysis-grid`},vn={class:`analysis-cell`},yn={class:`cell-value`},bn={class:`analysis-cell`},xn={class:`analysis-cell`},Sn={class:`cell-value`},Cn={class:`analysis-cell`},wn={class:`cell-value`},Tn={class:`analysis-cell`},En={class:`cell-value`},Dn={key:10,class:`msg-agent`},On={class:`sr-header`},kn={class:`sr-tpl-tag`},An={class:`sr-status`},jn={class:`sr-mode-switch`},Mn=[`onClick`],Nn=[`onClick`],Pn={class:`sr-main`},Fn={key:0,class:`sr-human`},In={key:1,class:`sr-unknown-hint`},Ln={class:`sr-meta`},Rn={class:`sr-meta-item`},zn={class:`sr-meta-item`},Bn={class:`sr-meta-item`},Vn={class:`sr-meta-item`},Hn=[`innerHTML`],Un={key:1,class:`sr-section`},Wn={class:`sr-finding-text`},Gn={key:2,class:`sr-section`},Kn={class:`sr-action-num`},qn={class:`sr-action-text`},Jn={key:3,class:`sr-section`},Yn={class:`ec-head`},Xn={class:`ec-agent`},Zn={class:`ec-verdict`},Qn={key:0,class:`ec-conf`},$n={key:0,class:`ec-row`},er={class:`ec-val`},tr={key:1,class:`ec-row`},nr={class:`ec-val`},rr={key:2,class:`ec-row`},ir={class:`ec-tools`},ar={key:4,class:`sr-section`},or={class:`sr-section-title`},sr={class:`sr-table`},cr=[`open`],lr=[`innerHTML`],ur={key:0,class:`sr-agents`},dr={class:`sr-agent-name`},fr={class:`sr-agent-verdict`},pr={class:`sr-agent-conf`},mr={key:0,class:`sr-agent-summary`},hr={key:1,class:`conf-tag tag-degraded`},gr={key:2,class:`conf-tag tag-failed`},_r={key:1,class:`sr-path`},vr={class:`sr-path-num`},yr={class:`sr-path-desc`},br={key:0,class:`sr-path-conflicts`},xr={key:2,class:`sr-full`},Sr=[`innerHTML`],Cr={key:11,class:`msg-agent`},wr={class:`trace-card`,open:!1},Tr={class:`trace-header`},Er={class:`trace-badge`},Dr={class:`trace-body`},Or={class:`trace-round-title`},kr={class:`t-badge`},Ar={class:`t-content`},jr=[`innerHTML`],Mr={key:1,class:`t-line`},Nr={class:`t-name`},Pr={key:0,class:`t-args`},Fr={key:0,class:`t-args`},Ir={class:`t-name`},Lr={key:0,class:`t-task`},Rr={class:`t-name`},zr={key:1,class:`t-meta`},Br={key:6,class:`t-name t-err`},Vr={class:`t-name t-warn`},Hr={key:0,class:`t-task`},Ur={key:12,class:`msg-agent`},Wr={class:`confidence-card`},Gr={class:`conf-main`},Kr={key:0,class:`conf-human`},qr={class:`conf-details`},Jr={class:`conf-agent`},Yr={class:`conf-weight`},Xr={class:`conf-bar`},Zr={class:`conf-agent-conf`},Qr={key:0,class:`conf-tag tag-degraded`},$r={key:1,class:`conf-tag tag-failed`},ei={key:0,class:`conf-coverage`},ti={key:0},ni={key:13,class:`msg-agent`},ri={class:`risk-card`},ii={class:`risk-header`},ai={class:`risk-main`},oi={key:0,class:`risk-human`},si={class:`risk-dims`},ci={class:`risk-dim-name`},li={class:`risk-dim-reason`},ui={class:`risk-footer`},di={key:0,class:`risk-rules`},fi={key:14,class:`msg-system`},pi={class:`sys-text`},mi={key:1,class:`processing-bar`},hi={class:`ws-label`},gi={key:0,class:`ws-retry`},_i={class:`input-bar`},vi={class:`input-wrapper`},yi=[`disabled`,`onKeydown`],bi=[`disabled`],xi={key:0,width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},Si={key:1,class:`send-spinner`},Ci=ce({__name:`ChatView`,setup(ce){$.setOptions({breaks:!0,gfm:!0});let h=se(),g=ee(``),_=ee(null),v=ee(null);function le(){h.newConversation()}function ue(e){h.resumeConversation(e)}o(()=>{h.fetchConversations()});let de=(()=>{try{let e=JSON.parse(localStorage.getItem(`secagentx_user`)||`{}`);return(e.display_name||e.username||`U`).charAt(0).toUpperCase()}catch{return`U`}})(),fe=s(()=>h.wsConnected?`connected`:`disconnected`),pe=s(()=>h.wsConnected?`已连接`:`未连接`);function y(){let e=g.value.trim();!e||h.isProcessing||(h.sendWsMessage(e),g.value=``,me())}function b(e){g.value=e,y()}function me(){v.value&&(v.value.style.height=`auto`)}ne(()=>h.messages.length,async()=>{await t(),_.value&&(_.value.scrollTop=_.value.scrollHeight)}),ne(g,()=>{t(()=>{v.value&&(v.value.style.height=`auto`,v.value.style.height=Math.min(v.value.scrollHeight,120)+`px`)})});function he(e){return{Completed:`completed`,Failed:`error`,Running:`running`,Pending:`pending`}[e]||`pending`}function x(e){return e.evidenceMatrix?.length?Object.keys(e.evidenceMatrix[0]).filter(e=>/^H\d$/.test(e)).sort():[]}function ge(e){let t=parseFloat(e);return isNaN(t)?`var(--text-muted)`:t>=.6?`var(--success)`:t>=.3?`var(--warning)`:t>0?`var(--error)`:t<0?`var(--info)`:`var(--text-muted)`}function S(e){return!!(e.evidenceMatrix?.length||e.bayesianHistory?.length||e.agentDurations?.length)}function C(e,t){return Math.max(3,e.duration_ms/Math.max(...t.map(e=>e.duration_ms),1)*100)+`%`}function w(e){return{安全分析师:`var(--color-analyst)`,威胁情报员:`var(--color-intel)`,应急响应员:`var(--color-responder)`,知识智能体:`var(--color-knowledge)`}[e]||`var(--color-intel)`}function _e(e){return{紧急:`var(--error)`,高危:`#f97316`,中危:`var(--warning)`,低危:`var(--success)`}[e]||`var(--text-muted)`}function T(e){return e>=.7?`conf-level-high`:e>=.4?`conf-level-mid`:`conf-level-low`}function ve(e){return{malicious:`conf-verdict-mal`,suspicious:`conf-verdict-susp`,unknown:`conf-verdict-unk`}[e]||`conf-verdict-unk`}function E(e){return{高危:`risk-level-high`,中危:`risk-level-mid`,低危:`risk-level-low`}[e]||`risk-level-low`}function ye(e){return e>=60?`risk-score-high`:e>=20?`risk-score-mid`:`risk-score-low`}function D(e){return e.verdict&&e.verdict.verdict||`unknown`}function be(e){let t=e.verdict&&e.verdict.confidence;return t==null?`—`:(t*100).toFixed(0)+`%`}function O(e){return e.verdict&&e.verdict.risk_level||`低危`}function k(e){let t=e&&e.verdict&&e.verdict.verdict,n=e&&e.verdict&&e.verdict.risk_probability;return n==null?`—`:t===`unknown`&&n===0?`未知`:(n*100).toFixed(0)+`%`}function A(e){if(e===`—`||e===`未知`)return``;let t=parseFloat(e);return t>=60?`risk-score-high`:t>=30?`risk-score-mid`:`risk-score-low`}function xe(e){return{completed:`分析完成`,max_rounds:`达到最大轮次`,timeout:`超时熔断`,error:`异常终止`}[e]||`完成`}let j=te({});function M(e){return j[e]||`quick`}function N(e,t){j[e]=t}function P(e){return e&&e.summary_report&&typeof e.summary_report==`object`&&Object.keys(e.summary_report).length?e.summary_report:null}function Se(e){let t=P(e);return t&&t.risk_summary||e&&e.risk_summary||e&&e.summary_text||``}function F(e){let t=P(e);return t&&t.core_findings&&t.core_findings.length?t.core_findings.slice(0,3):(e&&e.agent_results?e.agent_results.flatMap(e=>e.key_evidence||[]):[]).slice(0,3)}function I(e){let t=P(e);if(t&&t.recommended_actions&&t.recommended_actions.length)return t.recommended_actions.slice(0,3);let n=e&&e.verdict&&e.verdict.recommended_action;return n?{block:[`封禁来源地址`],monitoring:[`持续监控`],escalate:[`升级人工处置`],none:[`无需处置`]}[n]||[n]:[]}function Ce(e){let t=P(e);return t&&t.detail||e&&e.summary_text||``}function L(e){let t=P(e);return t&&t.template_type||e&&e.template_type||`安全配置`}function R(e){return{漏洞分析:`漏洞分析`,攻击检测:`攻击检测`,安全配置:`安全配置`,威胁情报:`威胁情报`,应急响应:`应急响应`}[e]||`安全分析`}function z(e){let t=P(e),n=t&&t.table||e&&e.table||[];return Array.isArray(n)?n.filter(e=>e&&typeof e==`object`):[]}function we(e){return{漏洞分析:`漏洞明细`,攻击检测:`攻击证据`,安全配置:`配置项明细`,威胁情报:`情报命中`,应急响应:`处置步骤`}[e]||`明细`}function B(e){let t=z(e),n=[];for(let e of t)for(let t in e)n.includes(t)||n.push(t);return n.slice(0,6)}function V(e){let t=e&&e.evidence_chain||[];return Array.isArray(t)?t:[]}function Te(e){return(e?.rounds||[]).reduce((e,t)=>e+(t.items?.length||0),0)}function Ee(e){return{think:`推理`,act:`决策`,observe:`观察`,agent_route:`路由`,round_complete:`轮次`,tool_call:`工具`,tool_result:`结果`,agent_dispatch:`分发`,agent_result:`完成`,agent_error:`失败`,route_correction:`修正`}[e.type]||e.type}function De(e){return!!e&&typeof e==`object`&&Object.keys(e).length>0}function H(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}function U(e){if(!e)return``;if(typeof e!=`string`)try{e=JSON.stringify(e,null,2)}catch{e=String(e)}try{return $.parse(e).replace(/<script[\s\S]*?<\/script>/gi,``).replace(/on\w+="[^"]*"/gi,``)}catch{return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/\*\*(.+?)\*\*/g,`<strong>$1</strong>`).replace(/\n/g,`<br>`)}}return(t,o)=>(d(),i(`div`,Ue,[n(`div`,We,[n(`button`,{class:`new-conv-btn`,onClick:le},[...o[5]||=[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(`line`,{x1:`12`,y1:`5`,x2:`12`,y2:`19`}),n(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`})],-1),e(` 新建对话 `,-1)]]),n(`div`,Ge,[r(h).convLoading?(d(),i(`div`,Ke,`加载中...`)):(d(),i(p,{key:1},[(d(!0),i(p,null,f(r(h).conversations,e=>(d(),i(`div`,{key:e.conversation_id,class:a([`conv-item`,{active:e.conversation_id===r(h).currentConversationId}]),onClick:t=>ue(e.conversation_id),title:e.title},[(d(),i(`svg`,Je,[...o[6]||=[n(`path`,{d:`M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z`},null,-1)]])),n(`span`,Ye,u(e.title||e.conversation_id),1)],10,qe))),128)),r(h).conversations.length===0?(d(),i(`div`,Xe,`暂无历史对话`)):c(``,!0)],64))])]),n(`div`,Ze,[n(`div`,{ref_key:`msgContainer`,ref:_,class:`msg-list`},[r(h).messages.length===0?(d(),i(`div`,Qe,[o[11]||=m(`<div class="empty-icon" data-v-01665c60><svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="var(--text-muted)" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" data-v-01665c60><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" data-v-01665c60></path><line x1="9" y1="10" x2="15" y2="10" data-v-01665c60></line><line x1="12" y1="7" x2="12" y2="13" data-v-01665c60></line></svg></div><div class="empty-title" data-v-01665c60>SecAgentX</div><div class="empty-subtitle" data-v-01665c60>多智能体协同 · Agentic-RAG · 多厂商模型兼容</div>`,3),n(`div`,$e,[n(`button`,{class:`quick-btn`,onClick:o[0]||=e=>b(`查询 T1566.001 的防御措施`)},[...o[7]||=[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(`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`}),n(`line`,{x1:`12`,y1:`17`,x2:`12.01`,y2:`17`})],-1),e(` T1566.001 防御 `,-1)]]),n(`button`,{class:`quick-btn`,onClick:o[1]||=e=>b(`调查 IP 45.33.32.156`)},[...o[8]||=[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(`circle`,{cx:`12`,cy:`12`,r:`4`}),n(`line`,{x1:`21.93`,y1:`12`,x2:`2.07`,y2:`12`})],-1),e(` 调查 IP `,-1)]]),n(`button`,{class:`quick-btn`,onClick:o[2]||=e=>b(`分析 SSH 暴力破解告警`)},[...o[9]||=[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(`path`,{d:`M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z`})],-1),e(` 分析告警 `,-1)]]),n(`button`,{class:`quick-btn`,onClick:o[3]||=e=>b(`非工作时间内部用户大量外传数据,分析是否内部威胁`)},[...o[10]||=[m(`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-01665c60><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" data-v-01665c60></path><circle cx="9" cy="7" r="4" data-v-01665c60></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87" data-v-01665c60></path><path d="M16 3.13a4 4 0 0 1 0 7.75" data-v-01665c60></path></svg> 内部威胁分析 `,2)]])])])):c(``,!0),(d(!0),i(p,null,f(r(h).messages,t=>(d(),i(`div`,{key:t.id,class:a([`msg-item`,`role-`+t.role])},[t.role===`user`?(d(),i(`div`,et,[n(`div`,tt,[n(`div`,nt,u(r(de)),1),n(`div`,{class:`bubble-content`,innerHTML:U(t.content)},null,8,rt)])])):t.role===`agent`?(d(),i(`div`,it,[n(`div`,at,[o[12]||=n(`div`,{class:`bubble-avatar agent-avatar`},`AI`,-1),n(`div`,{class:`bubble-content agent-text`,innerHTML:U(t.content)},null,8,ot)])])):t.role===`agent_status_card`?(d(),i(`div`,st,[n(`div`,{class:a([`status-card`,`status-`+(t.content.status||``).toLowerCase()])},[n(`div`,{class:a([`status-dot`,he(t.content.status)])},null,2),n(`div`,ct,[n(`span`,lt,u(t.content.agentName||t.content.agentId),1),n(`span`,{class:a([`status-label`,`label-`+(t.content.status||``).toLowerCase()])},u(t.content.status),3)]),n(`div`,ut,[t.content.durationMs>0?(d(),i(`span`,dt,[o[13]||=n(`svg`,{width:`12`,height:`12`,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(`polyline`,{points:`12 6 12 12 16 14`})],-1),e(` `+u(t.content.durationMs.toFixed(0))+`ms `,1)])):c(``,!0),t.content.tokens>0?(d(),i(`span`,ft,[o[14]||=n(`svg`,{width:`12`,height:`12`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[n(`polyline`,{points:`4 7 4 4 20 4 20 7`}),n(`line`,{x1:`9`,y1:`20`,x2:`15`,y2:`20`}),n(`line`,{x1:`12`,y1:`4`,x2:`12`,y2:`20`})],-1),e(` `+u(t.content.tokens)+` tok `,1)])):c(``,!0)]),n(`div`,pt,[t.content.status===`Completed`?(d(),i(`span`,mt,`Success`)):t.content.status===`Failed`?(d(),i(`span`,ht,`Failed`)):(d(),i(`span`,gt,`Pending`))])],2)])):t.role===`agent_start`?(d(),i(`div`,_t,[n(`div`,vt,[o[15]||=n(`div`,{class:`status-spinner`},null,-1),n(`span`,yt,u(t.agentName)+` 正在处理...`,1)])])):t.role===`cot_start`?(d(),i(`div`,bt,[n(`div`,xt,[o[16]||=m(`<div class="cot-header" data-v-01665c60><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-01665c60><circle cx="12" cy="12" r="10" data-v-01665c60></circle><line x1="12" y1="16" x2="12" y2="12" data-v-01665c60></line><line x1="12" y1="8" x2="12.01" y2="8" data-v-01665c60></line></svg><span data-v-01665c60>Threat Assessment</span></div>`,1),n(`div`,{class:`cot-body`,innerHTML:U(t.content)},null,8,St)])])):t.role===`reasoning_chain`?(d(),i(`div`,Ct,[n(`div`,wt,[(d(!0),i(p,null,f(t.content.steps,(e,t)=>(d(),i(`div`,{key:e.type,class:a([`chain-step`,`step-`+e.status])},[n(`div`,Tt,[n(`div`,{class:a([`step-indicator`,`indicator-`+e.status])},[e.status===`completed`?(d(),i(`svg`,Et,[...o[17]||=[n(`polyline`,{points:`20 6 9 17 4 12`},null,-1)]])):e.status===`running`?(d(),i(`svg`,Dt,[...o[18]||=[n(`circle`,{cx:`12`,cy:`12`,r:`10`},null,-1),n(`polyline`,{points:`12 6 12 12 16 14`},null,-1)]])):(d(),i(`span`,Ot,u(t+1),1))],2),n(`div`,kt,[n(`div`,At,u(e.label),1),e.output?(d(),i(`div`,jt,u(e.output),1)):c(``,!0)]),n(`span`,{class:a([`step-badge`,`badge-`+e.status])},u(e.status===`running`?`RUNNING`:e.status===`completed`?`DONE`:`PENDING`),3)])],2))),128))])])):t.role===`reasoner_complete`?(d(),i(`div`,Mt,[n(`div`,Nt,[n(`div`,Pt,[o[19]||=n(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[n(`polygon`,{points:`12 2 2 7 12 12 22 7 12 2`}),n(`polyline`,{points:`2 17 12 22 22 17`}),n(`polyline`,{points:`2 12 12 17 22 12`})],-1),o[20]||=n(`span`,null,`Source`,-1),t.content.winner?(d(),i(`span`,{key:0,class:a([`winner-tag`,`winner-`+(t.content.confidence>=.7?`high`:t.content.confidence>=.4?`mid`:`low`)])},u(t.content.winner.title)+` · `+u((t.content.confidence*100).toFixed(0))+`% `,3)):c(``,!0)]),n(`div`,{class:`reasoner-body`,innerHTML:U(t.content.content||``)},null,8,Ft),S(t.content)?(d(),i(`div`,It,[t.content.evidenceMatrix&&t.content.evidenceMatrix.length>0?(d(),i(`div`,Lt,[o[22]||=n(`div`,{class:`viz-title`},`EVIDENCE MATRIX`,-1),n(`table`,Rt,[n(`thead`,null,[n(`tr`,null,[o[21]||=n(`th`,null,`Evidence`,-1),(d(!0),i(p,null,f(x(t.content),e=>(d(),i(`th`,{key:e},u(e),1))),128))])]),n(`tbody`,null,[(d(!0),i(p,null,f(t.content.evidenceMatrix.slice(0,5),(e,r)=>(d(),i(`tr`,{key:r},[n(`td`,zt,u(e.content),1),(d(!0),i(p,null,f(x(t.content),t=>(d(),i(`td`,{key:t,class:`val-cell`},[e[t]===void 0?c(``,!0):(d(),i(`span`,{key:0,style:l({color:ge(e[t])})},u(typeof e[t]==`number`?e[t].toFixed(1):e[t]),5))]))),128))]))),128))])])])):c(``,!0),n(`div`,Bt,[t.content.bayesianHistory&&t.content.bayesianHistory.length>0?(d(),i(`div`,Vt,[o[25]||=n(`div`,{class:`viz-title`},`BAYESIAN UPDATE`,-1),(d(!0),i(p,null,f(t.content.bayesianHistory,t=>(d(),i(`div`,{key:t.id,class:`bayes-item`},[n(`div`,Ht,[n(`span`,Ut,u(t.id),1),e(u(t.title),1)]),n(`div`,Wt,[o[23]||=n(`span`,{class:`bar-label`},`Prior`,-1),n(`div`,Gt,[n(`div`,{class:`bar-fill`,style:l({width:Math.max(1,t.prior*100)+`%`})},null,4)]),n(`span`,Kt,u((t.prior*100).toFixed(0))+`%`,1)]),n(`div`,qt,[o[24]||=n(`span`,{class:`bar-label`},`Post`,-1),n(`div`,Jt,[n(`div`,{class:a([`bar-fill`,t.posterior>t.prior?`bar-up`:`bar-down`]),style:l({width:Math.max(1,t.posterior*100)+`%`})},null,6)]),n(`span`,{class:a([`bar-val`,t.posterior>t.prior?`text-up`:`text-down`])},u((t.posterior*100).toFixed(0))+`%`,3)])]))),128))])):c(``,!0),t.content.agentDurations&&t.content.agentDurations.length>0?(d(),i(`div`,Yt,[o[26]||=n(`div`,{class:`viz-title`},`AGENT DURATION`,-1),(d(!0),i(p,null,f(t.content.agentDurations,e=>(d(),i(`div`,{key:e.name,class:`dur-row`},[n(`span`,Xt,u(e.name),1),n(`div`,Zt,[n(`div`,{class:`dur-fill`,style:l({width:C(e,t.content.agentDurations),background:w(e.name)})},null,4)]),n(`span`,Qt,u(e.duration_ms.toFixed(0))+`ms`,1)]))),128))])):c(``,!0)])])):c(``,!0)])])):t.role===`cot_step`?(d(),i(`div`,$t,[n(`div`,en,[n(`div`,tn,[n(`span`,null,`Step `+u(t.content.stepNumber)+`/`+u(t.content.totalSteps)+`: `+u(t.content.title),1),n(`span`,nn,u((t.content.confidence*100).toFixed(0))+`%`,1)]),n(`div`,rn,[t.content.analysis?(d(),i(`div`,an,[o[27]||=n(`div`,{class:`cot-section-title`},`Knowledge`,-1),n(`div`,{class:`cot-section-body`,innerHTML:U(t.content.analysis)},null,8,on)])):c(``,!0),t.content.conclusion?(d(),i(`div`,sn,[o[28]||=n(`div`,{class:`cot-section-title`},`Conclusion`,-1),n(`div`,{class:`cot-section-body conclusion-body`,innerHTML:U(t.content.conclusion)},null,8,cn)])):c(``,!0),t.content.evidence&&t.content.evidence.length>0?(d(),i(`div`,ln,[o[29]||=n(`div`,{class:`cot-section-title`},`Evidence`,-1),(d(!0),i(p,null,f(t.content.evidence,(e,t)=>(d(),i(`div`,{key:t,class:`ev-item`,innerHTML:U(e)},null,8,un))),128))])):c(``,!0),t.content.nextQuestion?(d(),i(`div`,dn,`Next Step: `+u(t.content.nextQuestion),1)):c(``,!0)])])])):t.role===`cot_complete`?(d(),i(`div`,fn,[n(`div`,pn,[o[30]||=n(`div`,{class:`cot-header`},`Conclusion`,-1),n(`div`,{class:`cot-body`,innerHTML:U(t.content)},null,8,mn)])])):t.role===`analysis_result`?(d(),i(`div`,hn,[n(`div`,gn,[o[36]||=n(`div`,{class:`analysis-header`},`Intent Analysis`,-1),n(`div`,_n,[n(`div`,vn,[o[31]||=n(`span`,{class:`cell-label`},`INTENT`,-1),n(`span`,yn,u(t.content.intent),1)]),n(`div`,bn,[o[32]||=n(`span`,{class:`cell-label`},`RISK`,-1),n(`span`,{class:`cell-value`,style:l({color:_e(t.content.severity)})},u(t.content.severity),5)]),n(`div`,xn,[o[33]||=n(`span`,{class:`cell-label`},`CONFIDENCE`,-1),n(`span`,Sn,u((t.content.confidence*100).toFixed(0))+`%`,1)]),n(`div`,Cn,[o[34]||=n(`span`,{class:`cell-label`},`SOURCE`,-1),n(`span`,wn,u(t.content.source),1)]),n(`div`,Tn,[o[35]||=n(`span`,{class:`cell-label`},`EVIDENCE`,-1),n(`span`,En,u(t.content.evidenceCount),1)])])])])):t.role===`structured_result`?(d(),i(`div`,Dn,[n(`div`,{class:a([`sr-card`,`tpl-`+L(t.content)])},[n(`div`,On,[o[37]||=m(`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-01665c60><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" data-v-01665c60></path><polyline points="14 2 14 8 20 8" data-v-01665c60></polyline><line x1="16" y1="13" x2="8" y2="13" data-v-01665c60></line><line x1="16" y1="17" x2="8" y2="17" data-v-01665c60></line></svg><span class="sr-title" data-v-01665c60>安全事件分析</span>`,2),n(`span`,kn,u(R(L(t.content))),1),n(`span`,An,u(xe(t.content.status)),1),n(`span`,jn,[n(`button`,{class:a([`mode-btn`,{"mode-active":M(t.id)===`quick`}]),onClick:e=>N(t.id,`quick`)},`快速分析`,10,Mn),n(`button`,{class:a([`mode-btn`,{"mode-active":M(t.id)===`expert`}]),onClick:e=>N(t.id,`expert`)},`专家报告`,10,Nn)])]),n(`div`,Pn,[n(`span`,{class:a([`sr-score`,ye(t.content.score)])},u(t.content.score),3),o[38]||=n(`span`,{class:`sr-label`},`风险评分`,-1),n(`span`,{class:a([`sr-decision`,ve(D(t.content))])},u(D(t.content)),3),t.content.needs_human?(d(),i(`span`,Fn,`需人工介入`)):c(``,!0),D(t.content)===`unknown`?(d(),i(`span`,In,`证据不足/冲突,置信度不作高估`)):c(``,!0)]),n(`div`,Ln,[n(`span`,Rn,[o[39]||=e(`风险概率 `,-1),n(`strong`,{class:a(A(k(t.content)))},u(k(t.content)),3)]),n(`span`,zn,[o[40]||=e(`置信度 `,-1),n(`strong`,null,u(be(t.content)),1)]),n(`span`,Bn,[o[41]||=e(`风险等级 `,-1),n(`strong`,{style:l({color:_e(O(t.content))})},u(O(t.content)),5)]),n(`span`,Vn,[o[42]||=e(`轮次 `,-1),n(`strong`,null,u(t.content.rounds||0),1)])]),Se(t.content)?(d(),i(`div`,{key:0,class:`sr-summary`,innerHTML:U(Se(t.content))},null,8,Hn)):c(``,!0),F(t.content).length?(d(),i(`div`,Un,[o[44]||=n(`div`,{class:`sr-section-title`},`核心发现`,-1),(d(!0),i(p,null,f(F(t.content),(e,t)=>(d(),i(`div`,{key:`cf`+t,class:`sr-finding`},[o[43]||=n(`span`,{class:`sr-finding-dot`},null,-1),n(`span`,Wn,u(e),1)]))),128))])):c(``,!0),I(t.content).length?(d(),i(`div`,Gn,[o[45]||=n(`div`,{class:`sr-section-title`},`推荐动作`,-1),(d(!0),i(p,null,f(I(t.content),(e,t)=>(d(),i(`div`,{key:`ra`+t,class:`sr-action`},[n(`span`,Kn,u(t+1),1),n(`span`,qn,u(e),1)]))),128))])):c(``,!0),V(t.content).length?(d(),i(`div`,Jn,[o[49]||=n(`div`,{class:`sr-section-title`},`证据链`,-1),(d(!0),i(p,null,f(V(t.content),(e,t)=>(d(),i(`div`,{key:`ec`+t,class:a([`ec-item`,`agent-verdict-`+(e.verdict||`unknown`)])},[n(`div`,Yn,[n(`span`,Xn,u(e.agent_name||e.agent_id),1),n(`span`,Zn,u(e.verdict),1),e.confidence==null?c(``,!0):(d(),i(`span`,Qn,u((e.confidence*100).toFixed(0))+`%`,1))]),e.evidence?(d(),i(`div`,$n,[o[46]||=n(`span`,{class:`ec-label`},`结论`,-1),n(`span`,er,u(e.evidence),1)])):c(``,!0),e.basis?(d(),i(`div`,tr,[o[47]||=n(`span`,{class:`ec-label`},`依据`,-1),n(`span`,nr,u(e.basis),1)])):c(``,!0),e.tools&&e.tools.length?(d(),i(`div`,rr,[o[48]||=n(`span`,{class:`ec-label`},`工具`,-1),n(`span`,ir,[(d(!0),i(p,null,f(e.tools,(e,t)=>(d(),i(`code`,{key:t,class:`ec-tool`},u(e),1))),128))])])):c(``,!0)],2))),128))])):c(``,!0),z(t.content).length?(d(),i(`div`,ar,[n(`div`,or,u(we(L(t.content))),1),n(`table`,sr,[n(`thead`,null,[n(`tr`,null,[(d(!0),i(p,null,f(B(t.content),e=>(d(),i(`th`,{key:e},u(e),1))),128))])]),n(`tbody`,null,[(d(!0),i(p,null,f(z(t.content),(e,n)=>(d(),i(`tr`,{key:n},[(d(!0),i(p,null,f(B(t.content),t=>(d(),i(`td`,{key:t},u(e[t]),1))),128))]))),128))])])])):c(``,!0),n(`details`,{class:`sr-detail`,open:M(t.id)===`expert`},[o[50]||=n(`summary`,{class:`sr-detail-summary`},[n(`svg`,{width:`12`,height:`12`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[n(`polyline`,{points:`9 18 15 12 9 6`})]),e(` 详细分析 `)],-1),n(`div`,{class:`sr-detail-body`,innerHTML:U(Ce(t.content))},null,8,lr)],8,cr),M(t.id)===`expert`?(d(),i(p,{key:5},[(t.content.agent_results||[]).length?(d(),i(`div`,ur,[o[51]||=n(`div`,{class:`sr-section-title`},`参与分析 Agent`,-1),(d(!0),i(p,null,f(t.content.agent_results,e=>(d(),i(`div`,{key:e.agent_id||Math.random(),class:a([`sr-agent`,`agent-verdict-`+(e.verdict||`unknown`)])},[n(`span`,dr,u(e.agent_name||e.agent_id),1),n(`span`,fr,u(e.verdict),1),n(`span`,pr,u(e.confidence!==null&&e.confidence!==void 0?(e.confidence*100).toFixed(0)+`%`:`—`),1),e.risk_summary?(d(),i(`span`,mr,u(e.risk_summary),1)):c(``,!0),e.degraded?(d(),i(`span`,hr,`已降级`)):e.status===`failed`?(d(),i(`span`,gr,`失败`)):c(``,!0)],2))),128))])):c(``,!0),(t.content.decision_path||[]).length?(d(),i(`div`,_r,[o[52]||=n(`div`,{class:`sr-path-title`},`决策依据链`,-1),(d(!0),i(p,null,f(t.content.decision_path,e=>(d(),i(`div`,{key:`dp-`+e.step,class:a([`sr-path-step`,`path-tag-`+(e.tag||``)])},[n(`span`,vr,u(e.step),1),n(`span`,yr,u(e.desc),1)],2))),128)),(t.content.fusion_result?.conflicts||[]).length?(d(),i(`div`,br,[(d(!0),i(p,null,f(t.content.fusion_result.conflicts,(e,t)=>(d(),i(`div`,{key:`cf-`+t,class:`sr-conflict`},u(e.between)+` 冲突系数 `+u((e.coefficient*100).toFixed(0))+`% — `+u(e.resolution),1))),128))])):c(``,!0)])):c(``,!0),t.content.summary_text?(d(),i(`div`,xr,[o[53]||=n(`div`,{class:`sr-section-title`},`完整分析`,-1),n(`div`,{class:`sr-full-body`,innerHTML:U(t.content.summary_text)},null,8,Sr)])):c(``,!0)],64)):c(``,!0)],2)])):t.role===`trace_panel`?(d(),i(`div`,Cr,[n(`details`,wr,[n(`summary`,Tr,[o[54]||=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(`polyline`,{points:`22 12 16 12 14 15 10 15 8 12 2 12`}),n(`path`,{d:`M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`})],-1),o[55]||=n(`span`,{class:`trace-title`},`多智能体执行过程`,-1),n(`span`,Er,u(Te(t.content))+` 项操作`,1)]),n(`div`,Dr,[(d(!0),i(p,null,f(t.content.rounds,t=>(d(),i(`div`,{key:`r`+t.round,class:`trace-round`},[n(`div`,Or,`第 `+u(t.round)+` 轮`,1),(d(!0),i(p,null,f(t.items,(t,r)=>(d(),i(`div`,{key:r,class:a([`trace-item`,`t-`+t.type])},[n(`span`,kr,u(Ee(t)),1),n(`div`,Ar,[t.type===`think`?(d(),i(`div`,{key:0,class:`t-think`,innerHTML:U(t.text)},null,8,jr)):t.type===`act`||t.type===`observe`||t.type===`agent_route`||t.type===`round_complete`?(d(),i(`span`,Mr,u(t.text),1)):t.type===`tool_call`?(d(),i(p,{key:2},[n(`span`,Nr,[o[56]||=e(`调用工具 `,-1),n(`code`,null,u(t.tool),1)]),De(t.args)?(d(),i(`pre`,Pr,u(H(t.args)),1)):c(``,!0)],64)):t.type===`tool_result`?(d(),i(p,{key:3},[n(`span`,{class:a([`t-name`,t.success?`t-ok`:`t-err`])},[e(u(t.success?`[OK]`:`[FAIL]`)+` `,1),n(`code`,null,u(t.tool),1)],2),t.preview?(d(),i(`pre`,Fr,u(t.preview),1)):c(``,!0)],64)):t.type===`agent_dispatch`?(d(),i(p,{key:4},[n(`span`,Ir,[o[57]||=e(`路由 `,-1),n(`code`,null,u(t.agentId),1),o[58]||=e(` 分析`,-1)]),t.task?(d(),i(`div`,Lr,`> `+u(t.task),1)):c(``,!0)],64)):t.type===`agent_result`?(d(),i(p,{key:5},[n(`span`,Rr,[n(`code`,null,u(t.agentId),1),o[59]||=e(` 完成`,-1)]),t.verdict?(d(),i(`span`,{key:0,class:a([`t-meta t-verdict`,`v-`+t.verdict])},`裁决 `+u(t.verdict),3)):c(``,!0),t.confidence==null?c(``,!0):(d(),i(`span`,zr,`置信度 `+u((t.confidence*100).toFixed(0))+`%`,1))],64)):t.type===`agent_error`?(d(),i(`span`,Br,[o[60]||=e(`✗ `,-1),n(`code`,null,u(t.agentId),1),o[61]||=e(` 分析失败`,-1)])):t.type===`route_correction`?(d(),i(p,{key:7},[n(`span`,Vr,[o[62]||=e(`路由修正 `,-1),n(`code`,null,u(t.from),1),o[63]||=e(` → `,-1),n(`code`,null,u(t.to),1)]),t.reason?(d(),i(`div`,Hr,`原因: `+u(t.reason),1)):c(``,!0)],64)):c(``,!0)])],2))),128))]))),128))])])])):t.role===`confidence_card`?(d(),i(`div`,Ur,[n(`div`,Wr,[o[65]||=n(`div`,{class:`conf-header`},[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(`path`,{d:`M12 2 L15.09 8.26 L22 9.27 L17 14.14 L18.18 21.02 L12 17.77 L5.82 21.02 L7 14.14 L2 9.27 L8.91 8.26 Z`})]),n(`span`,{class:`conf-title`},`确定性置信度裁决(可复现)`)],-1),n(`div`,Gr,[n(`span`,{class:a([`conf-value`,T(t.content.confidence)])},u((t.content.confidence*100).toFixed(0))+`%`,3),n(`span`,{class:a([`conf-verdict`,ve(t.content.verdict)])},u(t.content.verdict),3),t.content.needs_human?(d(),i(`span`,Kr,`需人工介入`)):c(``,!0)]),n(`div`,qr,[(d(!0),i(p,null,f(t.content.details||[],e=>(d(),i(`div`,{key:e.agent_id,class:`conf-row`},[n(`span`,Jr,u(e.agent_id),1),n(`span`,Yr,u((e.weight*100).toFixed(0))+`%`,1),n(`span`,Xr,[n(`i`,{style:l({width:e.weight*100+`%`})},null,4)]),n(`span`,Zr,u(e.confidence===null?`—`:(e.confidence*100).toFixed(0)+`%`),1),e.degraded?(d(),i(`span`,Qr,`已降级`)):e.failed?(d(),i(`span`,$r,`失败`)):c(``,!0)]))),128))]),t.content.coverage!==null&&t.content.coverage!==void 0?(d(),i(`div`,ei,[o[64]||=e(` 情报覆盖度 `,-1),n(`strong`,null,u((t.content.coverage*100).toFixed(0))+`%`,1),t.content.coverage<1?(d(),i(`span`,ti,`(缺失源按"未知"处理,不视为无恶意)`)):c(``,!0)])):c(``,!0)])])):t.role===`risk_card`?(d(),i(`div`,ni,[n(`div`,ri,[n(`div`,ii,[o[66]||=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(`path`,{d:`M12 9V3 M12 21v-6 M5.6 6.2l4.2 4.2 M14.2 13.6l4.2 4.2 M3 12h6 M15 12h6`}),n(`circle`,{cx:`12`,cy:`12`,r:`2`})],-1),o[67]||=n(`span`,{class:`risk-title`},`可解释风险评分`,-1),n(`span`,{class:a([`risk-level`,E(t.content.risk_level)])},u(t.content.risk_level),3)]),n(`div`,ai,[n(`span`,{class:a([`risk-score`,ye(t.content.risk_score)])},u(t.content.risk_score),3),o[68]||=n(`span`,{class:`risk-label`},`最终风险评分`,-1),t.content.needs_human?(d(),i(`span`,oi,`需人工复核`)):c(``,!0)]),n(`div`,si,[(d(!0),i(p,null,f(t.content.dimensions||[],e=>(d(),i(`div`,{key:e.name,class:a([`risk-dim`,`risk-tag-`+(e.tag||`neutral`)])},[n(`span`,ci,u(e.name),1),n(`span`,{class:a([`risk-dim-delta`,e.delta>0?`delta-pos`:e.delta<0?`delta-neg`:`delta-zero`])},u(e.delta>0?`+`:``)+u(e.delta),3),n(`span`,li,u(e.reason),1)],2))),128))]),n(`div`,ui,[n(`span`,null,u(t.content.summarized),1),(t.content.rules_hit||[]).length?(d(),i(`span`,di,`规则: `+u(t.content.rules_hit.join(` / `)),1)):c(``,!0)])])])):(d(),i(`div`,fi,[n(`span`,pi,u(typeof t.content==`string`?t.content:t.content?.content||``),1)]))],2))),128)),r(h).isProcessing?(d(),i(`div`,mi,[...o[69]||=[n(`div`,{class:`processing-dots`},[n(`span`),n(`span`),n(`span`)],-1),n(`span`,null,`多智能体协同分析中...`,-1)]])):c(``,!0)],512),n(`div`,{class:a([`ws-status-bar`,`ws-`+fe.value])},[o[70]||=n(`span`,{class:`ws-dot`},null,-1),n(`span`,hi,u(pe.value),1),t.wsReconnectAttempts>0?(d(),i(`span`,gi,`重试 `+u(t.wsReconnectAttempts)+`/`+u(t.MAX_RECONNECT_ATTEMPTS),1)):c(``,!0)],2),n(`div`,_i,[n(`div`,vi,[re(n(`textarea`,{ref_key:`inputRef`,ref:v,"onUpdate:modelValue":o[4]||=e=>g.value=e,class:`chat-input`,placeholder:`输入安全问题,按 Enter 发送...`,disabled:r(h).isProcessing,rows:`1`,onKeydown:ae(ie(y,[`exact`,`prevent`]),[`enter`])},null,40,yi),[[oe,g.value]]),n(`button`,{class:a([`send-btn`,{active:g.value.trim()}]),disabled:!g.value.trim()||r(h).isProcessing,onClick:y},[r(h).isProcessing?(d(),i(`div`,Si)):(d(),i(`svg`,xi,[...o[71]||=[n(`line`,{x1:`22`,y1:`2`,x2:`11`,y2:`13`},null,-1),n(`polygon`,{points:`22 2 15 22 11 13 2 9 22 2`},null,-1)]]))],10,bi)])])])]))}},[[`__scopeId`,`data-v-01665c60`]]);export{Ci as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,C as t,E as n,Ht as r,K as i,T as a,Ut as o,Wt as s,Y as c,Z as l,_ as u,_t as d,a as ee,et as te,ht as f,i as ne,p as re,pt as p,q as m,u as h,w as ie}from"./vendor-icons-BTNgi7vU.js";import{r as g}from"./index-DBEjbyJR.js";import{t as ae}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{n as oe,t as se}from"./vendor-charts-Dh1nChzO.js";var _={class:`dashboard`},v={class:`kpi-grid`},y={class:`kpi-body`},b={class:`kpi-label`},x={class:`kpi-value`},S={class:`section-card`},C={class:`section-header`},w={class:`section-title`},T={width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{color:`var(--text-tertiary)`}},E={class:`agent-count-badge`},D={key:0,class:`skeleton-row-list`},O={key:1,class:`agent-grid`},k={class:`agent-info`},A={class:`agent-name`},j={class:`agent-id`},M={class:`agent-metrics`},N={class:`metric`},P={class:`metric-value`,style:{color:`var(--warning)`}},F={class:`metric`},ce={class:`metric-value`,style:{color:`var(--info)`}},I={class:`bottom-grid`},L={class:`section-card chart-card`},R={class:`section-header`},z={class:`section-title`},B={width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{color:`var(--text-tertiary)`}},V={class:`section-card`},H={class:`section-header`},U={class:`section-title`},W={width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,style:{color:`var(--text-tertiary)`}},G={class:`agent-count-badge`},le={key:0,class:`skeleton-row-list`},ue={key:1,class:`event-list`},de={class:`event-title`},fe={key:0,class:`empty-state`},K=ae({__name:`DashboardView`,setup(ae){let K=f({agents:!0,events:!0}),q=d([]),J=d([]),Y=d(null),X=null,Z=null,Q=f([{label:`事件总数`,value:`-`,icon:p(ee),iconBg:`rgba(59,130,246,0.12)`,iconColor:`#3b82f6`,badge:``},{label:`Agent 数`,value:`-`,icon:p(h),iconBg:`rgba(139,92,246,0.12)`,iconColor:`#8b5cf6`,badge:``},{label:`工具就绪`,value:`-`,icon:p(ne),iconBg:`rgba(34,197,94,0.12)`,iconColor:`#22c55e`,badge:`Ready`},{label:`ATT&CK 技术`,value:`-`,icon:p(re),iconBg:`rgba(251,191,36,0.12)`,iconColor:`#fbbf24`,badge:`MITRE`}]);function $(e){return{紧急:`#ef4444`,高危:`#f97316`,中危:`#eab308`,低危:`#22c55e`}[e]||`#64748b`}function pe(e){return!e&&e!==0?`-`:e>=1e6?(e/1e6).toFixed(1)+`M`:e>=1e3?(e/1e3).toFixed(1)+`K`:String(e)}function me(){let e=localStorage.getItem(`secagentx_token`);return e?{Authorization:`Bearer ${e}`}:{}}async function he(){try{let e=me(),[t,n,r,i,a]=await Promise.all([fetch(g(`/api/health`),{headers:e}).then(e=>e.ok?e.json():{}),fetch(g(`/api/stats`),{headers:e}).then(e=>e.ok?e.json():{}),fetch(g(`/api/agents/runtime`),{headers:e}).then(e=>e.ok?e.json():{agents:[]}),fetch(g(`/api/events`),{headers:e}).then(e=>e.ok?e.json():{events:[]}),fetch(g(`/api/mitre/dashboard`),{headers:e}).then(e=>e.ok?e.json():{})]),o=t||{},s=n||{},c=o.agents||[];Q[0].value=s.total_tasks??0,Q[1].value=c.length||0,Q[2].value=s.tools_count??0,Q[3].value=a.total_techniques||0;let l=r.agents||[];l.length>0&&(q.value=l),K.agents=!1;let u=i.events||[];u.length>0&&(J.value=u.slice(0,10)),K.events=!1}catch{K.agents=!1,K.events=!1}}function ge(){if(!Y.value)return;X=se(Y.value,`dark`);let e=Array.from({length:24},(e,t)=>String(t).padStart(2,`0`)+`:00`),t=Array(24).fill(0);for(let e of J.value){let n=(e.created_at||``).match(/(\d{2}):/);if(n){let e=parseInt(n[1]);e>=0&&e<24&&t[e]++}}let n={tooltip:{trigger:`axis`,backgroundColor:`#2a2d38`,borderColor:`#2a2d38`,textStyle:{color:`#e2e8f0`}},grid:{left:`3%`,right:`4%`,bottom:`3%`,top:`10%`,containLabel:!0},xAxis:{type:`category`,data:e,axisLine:{lineStyle:{color:`#2a2d38`}},axisLabel:{color:`#64748b`,fontSize:10,interval:3}},yAxis:{type:`value`,splitLine:{lineStyle:{color:`#2a2d38`,type:`dashed`}},axisLabel:{color:`#64748b`,fontSize:10},minInterval:1},series:[{name:`告警`,type:`bar`,barWidth:12,itemStyle:{color:new oe(0,0,0,1,[{offset:0,color:`#3b82f6`},{offset:1,color:`#1d4ed8`}]),borderRadius:[4,4,0,0]},data:t}],legend:{data:[`告警`],textStyle:{color:`#94a3b8`,fontSize:11},top:0,right:0}};X.setOption(n),Z=new ResizeObserver(()=>{X?.resize()}),Z.observe(Y.value)}return i(()=>{he().then(()=>setTimeout(ge,100))}),m(()=>{X?.dispose(),Z?.disconnect()}),(i,d)=>(c(),n(`div`,_,[t(`div`,v,[(c(!0),n(u,null,l(Q,e=>(c(),n(`div`,{class:`kpi-card`,key:e.label},[t(`div`,{class:`kpi-icon`,style:o({background:e.iconBg})},[(c(),ie(te(e.icon),{style:o({width:`20px`,height:`20px`,color:e.iconColor})},null,8,[`style`]))],4),t(`div`,y,[t(`div`,b,s(e.label),1),t(`div`,x,s(e.value),1)]),e.badge?(c(),n(`div`,{key:0,class:`kpi-badge`,style:o({background:e.badgeBg,color:e.badgeColor})},s(e.badge),5)):a(``,!0)]))),128))]),t(`div`,S,[t(`div`,C,[t(`div`,w,[(c(),n(`svg`,T,[...d[0]||=[t(`rect`,{x:`4`,y:`4`,width:`16`,height:`16`,rx:`2`},null,-1),t(`rect`,{x:`9`,y:`9`,width:`6`,height:`6`},null,-1)]])),d[1]||=t(`span`,null,`Agent Runtime`,-1),t(`span`,E,s(q.value.length)+` Agents`,1)])]),K.agents?(c(),n(`div`,D,[(c(),n(u,null,l(4,e=>t(`div`,{key:e,class:`skeleton-agent`})),64))])):(c(),n(`div`,O,[(c(!0),n(u,null,l(q.value,i=>(c(),n(`div`,{key:i.agent_id,class:`agent-card`},[t(`div`,{class:r([`agent-dot`,i.status])},null,2),t(`div`,k,[t(`div`,A,s(i.agent),1),t(`div`,j,s(i.agent_id),1)]),t(`div`,M,[t(`div`,N,[t(`span`,P,[e(s(i.latency),1),d[2]||=t(`span`,{class:`metric-unit`},`ms`,-1)])]),t(`div`,F,[t(`span`,ce,[e(s(pe(i.tokens)),1),d[3]||=t(`span`,{class:`metric-unit`},`tok`,-1)])])])]))),128))]))]),t(`div`,I,[t(`div`,L,[t(`div`,R,[t(`div`,z,[(c(),n(`svg`,B,[...d[4]||=[t(`polyline`,{points:`22 12 18 12 15 21 9 3 6 12 2 12`},null,-1)]])),d[5]||=t(`span`,null,`事件趋势 (24h)`,-1)])]),t(`div`,{ref_key:`chartRef`,ref:Y,class:`chart-container`},null,512)]),t(`div`,V,[t(`div`,H,[t(`div`,U,[(c(),n(`svg`,W,[...d[6]||=[t(`path`,{d:`M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9`},null,-1),t(`path`,{d:`M13.73 21a2 2 0 0 1-3.46 0`},null,-1)]])),d[7]||=t(`span`,null,`最近事件`,-1),t(`span`,G,s(J.value.length)+` 条`,1)])]),K.events?(c(),n(`div`,le,[(c(),n(u,null,l(5,e=>t(`div`,{key:e,class:`skeleton-row`})),64))])):(c(),n(`div`,ue,[(c(!0),n(u,null,l(J.value,e=>(c(),n(`div`,{key:e.id||e.title,class:`event-row`},[t(`div`,{class:`event-dot`,style:o({background:$(e.severity)})},null,4),t(`div`,de,s(e.title),1),t(`div`,{class:`event-severity`,style:o({color:$(e.severity)})},s(e.severity),5)]))),128)),J.value.length===0?(c(),n(`div`,fe,`暂无事件数据`)):a(``,!0)]))])])]))}},[[`__scopeId`,`data-v-b5023e3d`]]);export{K as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.dashboard[data-v-b5023e3d]{height:calc(100vh - var(--header-height));padding:20px;overflow-y:auto}.kpi-grid[data-v-b5023e3d]{grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:16px;display:grid}.kpi-card[data-v-b5023e3d]{background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-md);transition:all var(--transition-fast);align-items:center;gap:14px;padding:18px 20px;display:flex;position:relative}.kpi-card[data-v-b5023e3d]:hover{border-color:var(--border-hover);box-shadow:var(--shadow-md);transform:translateY(-1px)}.kpi-icon[data-v-b5023e3d]{border-radius:var(--radius-sm);flex-shrink:0;justify-content:center;align-items:center;width:42px;height:42px;display:flex}.kpi-body[data-v-b5023e3d]{flex:1;min-width:0}.kpi-label[data-v-b5023e3d]{color:var(--text-muted);margin-bottom:2px;font-size:11px;font-weight:500}.kpi-value[data-v-b5023e3d]{color:var(--text-primary);font-variant-numeric:tabular-nums;font-size:24px;font-weight:700;line-height:1.2}.kpi-badge[data-v-b5023e3d]{border-radius:var(--radius-full);letter-spacing:.5px;padding:2px 8px;font-size:9px;font-weight:600;position:absolute;top:10px;right:10px}.section-card[data-v-b5023e3d]{background:var(--bg-card);border:1px solid var(--border-primary);border-radius:var(--radius-md);margin-bottom:16px;padding:16px 20px}.section-header[data-v-b5023e3d]{justify-content:space-between;align-items:center;margin-bottom:14px;display:flex}.section-title[data-v-b5023e3d]{color:var(--text-secondary);align-items:center;gap:8px;font-size:13px;font-weight:600;display:flex}.agent-count-badge[data-v-b5023e3d]{border-radius:var(--radius-full);background:var(--bg-elevated);color:var(--text-muted);padding:1px 8px;font-size:10px;font-weight:500}.agent-grid[data-v-b5023e3d]{grid-template-columns:repeat(4,1fr);gap:12px;display:grid}.agent-card[data-v-b5023e3d]{border-radius:var(--radius-sm);border:1px solid var(--border-primary);background:var(--bg-primary);transition:all var(--transition-fast);align-items:center;gap:12px;padding:14px 16px;display:flex}.agent-card[data-v-b5023e3d]:hover{border-color:var(--border-hover);background:var(--bg-card-hover)}.agent-dot[data-v-b5023e3d]{border-radius:50%;flex-shrink:0;width:10px;height:10px}.agent-dot.idle[data-v-b5023e3d]{background:var(--text-muted)}.agent-dot.running[data-v-b5023e3d]{background:var(--success);animation:2s infinite pulse-dot}.agent-dot.completed[data-v-b5023e3d]{background:var(--info)}.agent-dot.busy[data-v-b5023e3d]{background:var(--warning)}.agent-info[data-v-b5023e3d]{flex:1;min-width:0}.agent-name[data-v-b5023e3d]{color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;overflow:hidden}.agent-id[data-v-b5023e3d]{color:var(--text-muted);margin-top:1px;font-size:10px}.agent-metrics[data-v-b5023e3d]{flex-shrink:0;gap:12px;display:flex}.metric-value[data-v-b5023e3d]{font-variant-numeric:tabular-nums;font-size:12px;font-weight:700}.metric-unit[data-v-b5023e3d]{color:var(--text-muted);margin-left:1px;font-size:10px;font-weight:400}.bottom-grid[data-v-b5023e3d]{grid-template-columns:1fr 1fr;gap:16px;display:grid}.chart-card[data-v-b5023e3d]{grid-column:1}.chart-container[data-v-b5023e3d]{width:100%;height:240px}.event-list[data-v-b5023e3d]{max-height:280px;overflow-y:auto}.event-row[data-v-b5023e3d]{border-bottom:1px solid var(--border-primary);cursor:pointer;transition:background var(--transition-fast);align-items:center;gap:10px;padding:8px 4px;display:flex}.event-row[data-v-b5023e3d]:last-child{border-bottom:none}.event-row[data-v-b5023e3d]:hover{background:var(--bg-card-hover);border-radius:4px}.event-dot[data-v-b5023e3d]{border-radius:50%;flex-shrink:0;width:6px;height:6px}.event-title[data-v-b5023e3d]{color:var(--text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:12px;overflow:hidden}.event-severity[data-v-b5023e3d]{flex-shrink:0;font-size:11px;font-weight:600}.empty-state[data-v-b5023e3d]{text-align:center;color:var(--text-muted);padding:24px;font-size:12px}@media (width<=1024px){.kpi-grid[data-v-b5023e3d],.agent-grid[data-v-b5023e3d]{grid-template-columns:repeat(2,1fr)}.bottom-grid[data-v-b5023e3d]{grid-template-columns:1fr}}@media (width<=640px){.dashboard[data-v-b5023e3d]{padding:12px}.kpi-grid[data-v-b5023e3d]{grid-template-columns:repeat(2,1fr);gap:8px}.kpi-card[data-v-b5023e3d]{padding:12px 14px}.kpi-value[data-v-b5023e3d]{font-size:18px}.agent-grid[data-v-b5023e3d]{grid-template-columns:1fr}}.skeleton-row-list[data-v-b5023e3d]{flex-direction:column;gap:10px;display:flex}.skeleton-agent[data-v-b5023e3d]{border-radius:var(--radius-sm);background:linear-gradient(90deg, var(--border-primary) 25%, var(--bg-card-hover) 50%, var(--border-primary) 75%);background-size:200% 100%;height:52px;animation:1.8s ease-in-out infinite skeleton-pulse}.skeleton-row[data-v-b5023e3d]{background:linear-gradient(90deg, var(--border-primary) 25%, var(--bg-card-hover) 50%, var(--border-primary) 75%);background-size:200% 100%;border-radius:4px;height:32px;animation:1.8s ease-in-out infinite skeleton-pulse}
|
|
@@ -0,0 +1 @@
|
|
|
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,j as p,ot as m,w as h}from"./vendor-icons-BTNgi7vU.js";import{r as g}from"./vendor-ui-Cdd65KTN.js";import{r as _}from"./vendor-vue-CXKcZAmz.js";import{r as v}from"./index-DBEjbyJR.js";import{t as y}from"./_plugin-vue_export-helper-BDNMzG2s.js";var ee={class:`event-detail-page`,style:{padding:`24px`,height:`calc(100vh - 48px)`,"overflow-y":`auto`}},te={key:0,style:{display:`flex`,"justify-content":`center`,"align-items":`center`,height:`60vh`}},ne={key:1,style:{display:`flex`,"flex-direction":`column`,"align-items":`center`,"justify-content":`center`,height:`60vh`,color:`#475569`,gap:`12px`}},re={style:{"font-size":`13px`}},ie={style:{display:`flex`,"align-items":`center`,gap:`8px`,"margin-bottom":`20px`,"font-size":`13px`}},ae={style:{color:`#60a5fa`,"font-weight":`600`}},oe={style:{display:`flex`,"align-items":`center`,gap:`16px`,"flex-wrap":`wrap`}},se={style:{display:`flex`,"align-items":`center`,gap:`12px`}},b={style:{color:`#e2e8f0`,"font-size":`20px`,"font-weight":`700`}},x={style:{color:`#94a3b8`,"font-size":`13px`,"margin-top":`2px`}},S={style:{display:`grid`,"grid-template-columns":`1fr 1fr`,gap:`20px`}},C={style:{display:`flex`,"align-items":`center`,gap:`10px`}},w={style:{flex:`1`,"max-width":`140px`,height:`8px`,"border-radius":`4px`,background:`#2a2d38`,overflow:`hidden`}},T={style:{display:`flex`,"flex-wrap":`wrap`,gap:`6px`,"margin-top":`2px`}},E={key:0,style:{color:`#64748b`,"font-size":`13px`}},D={style:{color:`#cbd5e1`,"font-size":`14px`,"font-weight":`500`}},O={style:{display:`flex`,"flex-wrap":`wrap`,gap:`6px`,"margin-top":`2px`}},k={key:0,style:{color:`#64748b`,"margin-left":`4px`}},A={key:4,style:{color:`#64748b`,"font-size":`13px`}},j={style:{display:`flex`,"align-items":`center`,gap:`6px`}},M={style:{color:`#cbd5e1`,"font-size":`14px`,"font-weight":`500`}},N={key:0,style:{color:`#64748b`,"margin-left":`4px`}},P={style:{color:`#a5d6ff`,"font-size":`13px`}},F={key:0,style:{display:`flex`,gap:`4px`,"flex-wrap":`wrap`,"margin-top":`4px`}},I={style:{color:`#94a3b8`,"font-size":`13px`}},L={style:{display:`flex`,"align-items":`center`,gap:`8px`}},R={style:{color:`#cbd5e1`,"font-size":`13px`,"line-height":`1.7`}},z={key:0,style:{"white-space":`pre-wrap`}},B={style:{display:`flex`,"align-items":`center`,gap:`12px`}},V={style:{display:`grid`,"grid-template-columns":`1fr 1fr`,gap:`20px`}},H={key:0,style:{display:`flex`,"flex-direction":`column`,gap:`6px`}},U={style:{color:`#a5d6ff`,"font-size":`12px`,flex:`1`,background:`#2a2d38`,padding:`2px 8px`,"border-radius":`3px`}},ce={key:1,style:{color:`#475569`,"font-size":`13px`}},W={key:0,style:{display:`flex`,"flex-direction":`column`,gap:`8px`}},G={style:{display:`flex`,"align-items":`center`,gap:`8px`}},le={style:{color:`#cbd5e1`,"font-size":`13px`}},ue={key:0,style:{"margin-top":`4px`}},de={key:1,style:{color:`#475569`,"font-size":`13px`}},fe={style:{display:`flex`,"align-items":`center`,gap:`8px`}},pe={key:0,style:{display:`flex`,"flex-direction":`column`,gap:`8px`}},me={style:{width:`22px`,height:`22px`,"border-radius":`50%`,background:`rgba(34,197,94,0.15)`,display:`flex`,"align-items":`center`,"justify-content":`center`,"flex-shrink":`0`,"margin-top":`1px`}},he={style:{color:`#22c55e`,"font-size":`12px`,"font-weight":`700`}},ge={style:{flex:`1`,color:`#cbd5e1`,"font-size":`13px`,"line-height":`1.5`}},_e={key:1,style:{color:`#475569`,"font-size":`13px`}},K=y({__name:`EventDetailView`,setup(y){let K=_(),q=g(),J=f(!0),Y=f(null),X=a(()=>Y.value?(Array.isArray(Y.value.iocs)?Y.value.iocs:[]).map(e=>typeof e==`string`?{type:`indicator`,value:e}:{type:e.type||`indicator`,value:e.value||e.indicator||``}).filter(e=>e.value):[]),ve=a(()=>JSON.stringify(Y.value||{},null,2));function ye(e){return{critical:`#ef4444`,high:`#f97316`,medium:`#eab308`,low:`#22c55e`,紧急:`#ef4444`,高危:`#f97316`,中危:`#eab308`,低危:`#22c55e`}[e]||`#64748b`}function be(e){return ye(e)}function xe(e){return{critical:`error`,high:`error`,medium:`warning`,low:`success`,紧急:`error`,高危:`error`,中危:`warning`,低危:`success`}[e]||`default`}function Se(e){return{open:`error`,investigating:`warning`,resolved:`success`,closed:`default`}[e]||`default`}function Z(e){return{open:`待处理`,investigating:`调查中`,resolved:`已解决`,closed:`已关闭`}[e]||e||`未知`}function Q(e){return Number(e)>=.8?`#22c55e`:Number(e)>=.5?`#eab308`:`#ef4444`}function Ce(e){return Q(e)}function we(e){return{ip:`#60a5fa`,domain:`#c084fc`,hash:`#f59e0b`,url:`#34d399`}[e]||`#94a3b8`}function Te(e){return{ip:`IP`,domain:`域名`,hash:`HASH`,url:`URL`,indicator:`IOC`}[e]||String(e||`IOC`).toUpperCase()}function $(e){navigator.clipboard.writeText(String(e||``)).then(()=>q.success(`已复制`)).catch(()=>q.warning(`复制失败`))}function Ee(e){/^T\d{4}(?:\.\d{3})?$/.test(String(e||``))&&window.open(`https://attack.mitre.org/techniques/${e.replace(`.`,`/`)}/`,`_blank`,`noopener,noreferrer`)}async function De(e){let t=localStorage.getItem(`secagentx_token`),n=t?{Authorization:`Bearer ${t}`}:{};try{let t=await fetch(v(`/api/events/${e}`),{headers:n});if(t.ok){let e=await t.json();return e.confidence=Number(e.confidence)||0,e.techniques=(Array.isArray(e.techniques)?e.techniques:[]).map(e=>({...e,confidence:Number(e.confidence)||0})),e.recommendation=Array.isArray(e.recommendation)?e.recommendation:[],Y.value=e,!0}}catch(e){console.warn(`[EventDetailView] 事件加载失败:`,e.message)}return!1}return i(async()=>{let e=K.params.id;await De(e),J.value=!1}),(i,a)=>{let f=e(`n-spin`),g=e(`n-button`),_=e(`n-tag`),v=e(`n-card`),y=e(`n-empty`),K=e(`n-code`);return l(),r(`div`,ee,[J.value?(l(),r(`div`,te,[p(f,{size:`large`})])):Y.value?(l(),r(d,{key:2},[n(`div`,ie,[p(g,{text:``,size:`tiny`,onClick:a[1]||=e=>i.$router.push(`/events`),style:{color:`#64748b`}},{default:m(()=>[...a[7]||=[t(`事件`,-1)]]),_:1}),a[9]||=n(`span`,{style:{color:`#475569`}},`/`,-1),n(`span`,ae,c(Y.value.id),1),a[10]||=n(`div`,{style:{flex:`1`}},null,-1),p(g,{size:`tiny`,quaternary:``,onClick:a[2]||=e=>i.$router.push(`/events`)},{default:m(()=>[...a[8]||=[t(`← 返回`,-1)]]),_:1})]),p(v,{bordered:!0,size:`small`,style:{background:`#171923`,"margin-bottom":`16px`,"border-radius":`8px`}},{default:m(()=>[n(`div`,oe,[n(`div`,se,[a[11]||=n(`div`,{style:{width:`4px`,height:`32px`,"border-radius":`2px`,background:`severityColor(event.severity)`}},null,-1),n(`div`,null,[n(`div`,b,` Event `+c(Y.value.id),1),n(`div`,x,c(Y.value.title)+` · `+c(Y.value.created_at),1)])]),a[12]||=n(`div`,{style:{flex:`1`,"min-width":`20px`}},null,-1),p(_,{type:xe(Y.value.severity),size:`medium`,style:{"font-weight":`600`}},{default:m(()=>[t(c(Y.value.severity),1)]),_:1},8,[`type`]),p(_,{type:Se(Y.value.status),size:`medium`,bordered:!1},{default:m(()=>[t(c(Z(Y.value.status)),1)]),_:1},8,[`type`])])]),_:1}),p(v,{bordered:!0,size:`small`,style:{background:`#171923`,"margin-bottom":`16px`,"border-radius":`8px`}},{header:m(()=>[...a[13]||=[n(`span`,{style:{color:`#e2e8f0`,"font-size":`14px`,"font-weight":`600`}},`关键信息`,-1)]]),default:m(()=>[n(`div`,S,[n(`div`,null,[a[14]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`SEVERITY`,-1),n(`div`,{style:s({color:be(Y.value.severity),fontSize:`18px`,fontWeight:`700`})},c(Y.value.severity),5)]),n(`div`,null,[a[15]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`CONFIDENCE`,-1),n(`div`,C,[n(`div`,w,[n(`div`,{style:s({width:Y.value.confidence*100+`%`,height:`100%`,borderRadius:`4px`,background:Q(Y.value.confidence)})},null,4)]),n(`span`,{style:s({color:Ce(Y.value.confidence),fontSize:`16px`,fontWeight:`700`})},c((Y.value.confidence*100).toFixed(0))+`% `,5)])]),n(`div`,null,[a[16]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`MITRE ATT&CK`,-1),n(`div`,T,[(l(!0),r(d,null,u(Y.value.techniques,e=>(l(),h(_,{key:e.id,size:`small`,color:`#1e3a5f`,style:{color:`#fbbf24`,border:`1px solid #334155`}},{default:m(()=>[t(c(e.id)+` `+c(e.name),1)]),_:2},1024))),128)),!Y.value.techniques||Y.value.techniques.length===0?(l(),r(`span`,E,`无映射`)):o(``,!0)])]),n(`div`,null,[a[17]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`ALERT TYPE`,-1),n(`div`,D,c(Y.value.alert_type),1)]),n(`div`,null,[a[19]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`THREAT ASSOCIATIONS`,-1),n(`div`,O,[Y.value.cve_id?(l(),h(_,{key:0,size:`small`,color:`#3b1f1f`,style:{color:`#fca5a5`,border:`1px solid #7f1d1d`}},{default:m(()=>[t(` 🛡️ `+c(Y.value.cve_id),1)]),_:1})):o(``,!0),Y.value.actor_name?(l(),h(_,{key:1,size:`small`,color:`#1e3a5f`,style:{color:`#93c5fd`,border:`1px solid #1e40af`}},{default:m(()=>[t(` 🕵️ `+c(Y.value.actor_name),1),Y.value.actor_country?(l(),r(`span`,k,`(`+c(Y.value.actor_country)+`)`,1)):o(``,!0)]),_:1})):o(``,!0),Y.value.malware_name?(l(),h(_,{key:2,size:`small`,color:`#3b1f3b`,style:{color:`#f0abfc`,border:`1px solid #86198f`}},{default:m(()=>[t(` 💀 `+c(Y.value.malware_name),1)]),_:1})):o(``,!0),Y.value.threat_level===`high`?(l(),h(_,{key:3,size:`small`,color:`#3b1f1f`,style:{color:`#fbbf24`,border:`1px solid #92400e`}},{default:m(()=>[...a[18]||=[t(` 高置信度威胁 `,-1)]]),_:1})):o(``,!0),!Y.value.cve_id&&!Y.value.actor_name&&!Y.value.malware_name?(l(),r(`span`,A,`无关联`)):o(``,!0)])]),n(`div`,null,[a[22]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`SOURCE IP`,-1),n(`div`,j,[p(_,{size:`small`,color:`#1e293b`,style:{color:`#60a5fa`,border:`1px solid #334155`}},{icon:m(()=>[...a[20]||=[n(`span`,{style:{color:`#3b82f6`}},`●`,-1)]]),default:m(()=>[t(` `+c(Y.value.source_ip),1)]),_:1}),p(g,{size:`tiny`,quaternary:``,circle:``,style:{color:`#64748b`},onClick:a[3]||=e=>$(Y.value.source_ip),title:`复制IP`},{icon:m(()=>[...a[21]||=[n(`span`,{style:{"font-size":`11px`}},`复制`,-1)]]),_:1})])]),n(`div`,null,[a[23]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`DESTINATION`,-1),n(`div`,M,[t(c(Y.value.destination||Y.value.target||`—`)+` `,1),Y.value.destination_port?(l(),r(`span`,N,`:`+c(Y.value.destination_port),1)):o(``,!0)])]),n(`div`,null,[a[24]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`DATA SOURCE`,-1),n(`div`,P,c(Y.value.source||`—`),1),Y.value.threat_sources&&Y.value.threat_sources.length?(l(),r(`div`,F,[(l(!0),r(d,null,u(Y.value.threat_sources.slice(0,3),e=>(l(),h(_,{key:e,size:`tiny`,color:`#1e293b`,style:{color:`#94a3b8`,"font-size":`10px`}},{default:m(()=>[t(c(e),1)]),_:2},1024))),128)),Y.value.threat_sources.length>3?(l(),h(_,{key:0,size:`tiny`,color:`#1e293b`,style:{color:`#64748b`}},{default:m(()=>[t(`+`+c(Y.value.threat_sources.length-3),1)]),_:1})):o(``,!0)])):o(``,!0)]),n(`div`,null,[a[25]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`4px`}},`DETECTED AT`,-1),n(`div`,I,c(Y.value.created_at),1)])])]),_:1}),p(v,{bordered:!0,size:`small`,style:{background:`#171923`,"margin-bottom":`16px`,"border-radius":`8px`}},{header:m(()=>[n(`div`,L,[a[27]||=n(`span`,{style:{color:`#22c55e`,"font-size":`16px`,"font-weight":`600`}},`AI Analysis`,-1),p(_,{size:`tiny`,color:`#1e293b`,style:{color:`#94a3b8`}},{default:m(()=>[...a[26]||=[t(`Agent-Intel · Analyst`,-1)]]),_:1})])]),default:m(()=>[n(`div`,R,[Y.value.ai_analysis?(l(),r(`div`,z,c(Y.value.ai_analysis),1)):(l(),h(y,{key:1,size:`small`,description:`该事件尚无已持久化的 AI 分析结果`}))])]),_:1}),p(v,{bordered:!0,size:`small`,style:{background:`#171923`,"margin-bottom":`16px`,"border-radius":`8px`}},{header:m(()=>[n(`div`,B,[a[28]||=n(`span`,{style:{color:`#e2e8f0`,"font-size":`14px`,"font-weight":`600`}},`IOC & 技术映射`,-1),p(_,{size:`tiny`,color:`#1e293b`,style:{color:`#94a3b8`}},{default:m(()=>[t(c(X.value.length)+` 项IOC · `+c(Y.value.techniques?Y.value.techniques.length:0)+` 项技术`,1)]),_:1})])]),default:m(()=>[n(`div`,V,[n(`div`,null,[a[30]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`8px`}},`威胁指标 (IOC)`,-1),X.value.length>0?(l(),r(`div`,H,[(l(!0),r(d,null,u(X.value,e=>(l(),r(`div`,{key:e.value,style:{display:`flex`,"align-items":`center`,gap:`8px`,background:`#1a1d29`,padding:`8px 12px`,"border-radius":`6px`,border:`1px solid #2a2d38`}},[n(`span`,{style:s({color:we(e.type),fontSize:`11px`,fontWeight:`700`,minWidth:`36px`,textTransform:`uppercase`})},c(Te(e.type)),5),n(`code`,U,c(e.value),1),p(g,{size:`tiny`,quaternary:``,circle:``,style:{color:`#475569`},onClick:t=>$(e.value)},{icon:m(()=>[...a[29]||=[n(`span`,{style:{"font-size":`11px`}},`复制`,-1)]]),_:1},8,[`onClick`])]))),128))])):(l(),r(`div`,ce,`无关联IOC`))]),n(`div`,null,[a[32]||=n(`div`,{style:{color:`#64748b`,"font-size":`11px`,"font-weight":`600`,"margin-bottom":`8px`}},`MITRE ATT&CK 映射`,-1),Y.value.techniques&&Y.value.techniques.length>0?(l(),r(`div`,W,[(l(!0),r(d,null,u(Y.value.techniques,e=>(l(),r(`div`,{key:e.id,style:{background:`#1a1d29`,padding:`10px 12px`,"border-radius":`6px`,border:`1px solid #2a2d38`}},[n(`div`,G,[p(g,{text:``,size:`tiny`,style:{color:`#fbbf24`,"font-weight":`700`},onClick:t=>Ee(e.id)},{default:m(()=>[t(c(e.id),1)]),_:2},1032,[`onClick`]),n(`span`,le,c(e.name),1),a[31]||=n(`div`,{style:{flex:`1`}},null,-1),p(_,{bordered:!1,size:`tiny`,type:e.confidence>=.8?`success`:e.confidence>=.5?`warning`:`info`},{default:m(()=>[t(c((e.confidence*100).toFixed(0))+`% `,1)]),_:2},1032,[`type`])]),e.tactic?(l(),r(`div`,ue,[p(_,{size:`tiny`,color:`#1e293b`,style:{color:`#94a3b8`}},{default:m(()=>[t(c(e.tactic),1)]),_:2},1024)])):o(``,!0)]))),128))])):(l(),r(`div`,de,`无ATT&CK映射`))])])]),_:1}),p(v,{bordered:!0,size:`small`,style:{background:`#171923`,"margin-bottom":`16px`,"border-radius":`8px`}},{header:m(()=>[n(`div`,fe,[a[34]||=n(`span`,{style:{color:`#22c55e`,"font-size":`14px`,"font-weight":`600`}},`Recommendations`,-1),p(_,{size:`tiny`,color:`#1e293b`,style:{color:`#94a3b8`}},{default:m(()=>[...a[33]||=[t(`Agent-Responder`,-1)]]),_:1})])]),default:m(()=>[Y.value.recommendation&&Y.value.recommendation.length>0?(l(),r(`div`,pe,[(l(!0),r(d,null,u(Y.value.recommendation,(e,i)=>(l(),r(`div`,{key:i,style:{display:`flex`,"align-items":`flex-start`,gap:`12px`,background:`#0f1117`,padding:`12px 16px`,"border-radius":`6px`,border:`1px solid #2a2d38`}},[n(`div`,me,[n(`span`,he,c(i+1),1)]),n(`div`,ge,c(e),1),p(_,{size:`tiny`,bordered:!1},{default:m(()=>[...a[35]||=[t(`建议,需人工确认`,-1)]]),_:1})]))),128))])):(l(),r(`div`,_e,`无建议`))]),_:1}),p(v,{bordered:!0,size:`small`,style:{background:`#171923`,"margin-bottom":`16px`,"border-radius":`8px`}},{header:m(()=>[...a[36]||=[n(`span`,{style:{color:`#e2e8f0`,"font-size":`14px`,"font-weight":`600`}},`原始数据`,-1)]]),default:m(()=>[p(K,{code:ve.value,language:`json`,style:{"font-size":`12px`,background:`#0f1117`,"border-radius":`6px`,padding:`12px`}},null,8,[`code`])]),_:1})],64)):(l(),r(`div`,ne,[a[5]||=n(`div`,{style:{"font-size":`48px`,opacity:`0.3`}},`!`,-1),a[6]||=n(`div`,{style:{"font-size":`16px`,"font-weight":`600`}},`事件未找到`,-1),n(`div`,re,`事件 ID "`+c(i.$route.params.id)+`" 不存在`,1),p(g,{size:`small`,onClick:a[0]||=e=>i.$router.push(`/events`),style:{"margin-top":`8px`}},{default:m(()=>[...a[4]||=[t(`← 返回事件列表`,-1)]]),_:1})]))])}}},[[`__scopeId`,`data-v-6e2fd2cb`]]);export{K as default};
|