openclaw-agent-dashboard 1.0.41 → 1.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard/api/timeline.py +3 -2
- package/dashboard/data/timeline_reader.py +59 -14
- package/frontend-dist/assets/{index-Cnr0b02R.js → index-BtN_FdUX.js} +1 -1
- package/frontend-dist/assets/{index-BIZ2xHfw.css → index-CrwySDZq.css} +1 -1
- package/frontend-dist/index.html +2 -2
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
|
@@ -86,12 +86,13 @@ async def get_timeline(
|
|
|
86
86
|
record_error("unknown", str(e), "api:timeline:get", exc=e)
|
|
87
87
|
raise HTTPException(status_code=500, detail=safe_api_error_detail(e)) from e
|
|
88
88
|
elapsed_ms = (time.perf_counter() - t0) * 1000
|
|
89
|
-
|
|
89
|
+
steps_count = len(result.get("steps", []))
|
|
90
|
+
if elapsed_ms >= 100.0:
|
|
90
91
|
LOG.info(
|
|
91
92
|
"timeline agent=%s limit=%d steps=%d ms=%.1f",
|
|
92
93
|
agent_id,
|
|
93
94
|
limit,
|
|
94
|
-
|
|
95
|
+
steps_count,
|
|
95
96
|
elapsed_ms,
|
|
96
97
|
)
|
|
97
98
|
|
|
@@ -15,6 +15,8 @@ LOG = logging.getLogger(__name__)
|
|
|
15
15
|
LARGE_JSONL_BYTES = 512 * 1024
|
|
16
16
|
TAIL_JSONL_BYTES = 2 * 1024 * 1024
|
|
17
17
|
TAIL_JSONL_MAX_LINES = 4000
|
|
18
|
+
# 主 Agent 头部安全行数(超大文件且步骤不足 limit 时补充读)
|
|
19
|
+
_HEAD_JSONL_LINES = 2000
|
|
18
20
|
|
|
19
21
|
|
|
20
22
|
class StepType(str, Enum):
|
|
@@ -115,9 +117,12 @@ def _read_session_header_timestamp(path: Path) -> Optional[int]:
|
|
|
115
117
|
return None
|
|
116
118
|
|
|
117
119
|
|
|
118
|
-
def _read_jsonl_tail_line_slice(path: Path) -> Optional[List[str]]:
|
|
120
|
+
def _read_jsonl_tail_line_slice(path: Path, target_lines: int = 0) -> Optional[List[str]]:
|
|
119
121
|
"""
|
|
120
122
|
大文件时返回尾部若干行(字节与行数双上限),否则返回 None 表示应整文件读取。
|
|
123
|
+
|
|
124
|
+
当 target_lines > 0 时:优先满足 target_lines(但最少读 TAIL_JSONL_MAX_LINES/2 行保证有足够数据),
|
|
125
|
+
上限为 TAIL_JSONL_MAX_LINES。当 target_lines = 0 时退化为原行为。
|
|
121
126
|
"""
|
|
122
127
|
try:
|
|
123
128
|
size = path.stat().st_size
|
|
@@ -125,6 +130,12 @@ def _read_jsonl_tail_line_slice(path: Path) -> Optional[List[str]]:
|
|
|
125
130
|
return None
|
|
126
131
|
if size <= LARGE_JSONL_BYTES:
|
|
127
132
|
return None
|
|
133
|
+
|
|
134
|
+
# 目标行数转换为行数上限:多读一些(2x)以便有足够步骤,但不超过 TAIL_JSONL_MAX_LINES
|
|
135
|
+
max_lines = TAIL_JSONL_MAX_LINES
|
|
136
|
+
if target_lines > 0:
|
|
137
|
+
max_lines = min(max_lines, max(target_lines * 2, TAIL_JSONL_MAX_LINES // 2))
|
|
138
|
+
|
|
128
139
|
with open(path, 'rb') as f:
|
|
129
140
|
f.seek(max(0, size - TAIL_JSONL_BYTES))
|
|
130
141
|
raw = f.read()
|
|
@@ -134,14 +145,40 @@ def _read_jsonl_tail_line_slice(path: Path) -> Optional[List[str]]:
|
|
|
134
145
|
return []
|
|
135
146
|
if size > TAIL_JSONL_BYTES:
|
|
136
147
|
lines = lines[1:]
|
|
137
|
-
if len(lines) >
|
|
138
|
-
lines = lines[-
|
|
148
|
+
if len(lines) > max_lines:
|
|
149
|
+
lines = lines[-max_lines:]
|
|
139
150
|
return lines
|
|
140
151
|
|
|
141
152
|
|
|
142
|
-
def _read_text_lines(path: Path) -> List[str]:
|
|
153
|
+
def _read_text_lines(path: Path, max_lines: int = 0) -> List[str]:
|
|
154
|
+
"""读取文件全部行,或当 max_lines > 0 时只读尾部 max_lines 行。"""
|
|
155
|
+
if max_lines <= 0:
|
|
156
|
+
with open(path, 'r', encoding='utf-8') as f:
|
|
157
|
+
return f.readlines()
|
|
158
|
+
# 只读尾部 max_lines 行(从头读,跳过后半部分)
|
|
143
159
|
with open(path, 'r', encoding='utf-8') as f:
|
|
144
|
-
|
|
160
|
+
f.seek(0, 2)
|
|
161
|
+
file_size = f.tell()
|
|
162
|
+
if file_size <= 64 * 1024:
|
|
163
|
+
lines = f.read().splitlines()
|
|
164
|
+
else:
|
|
165
|
+
# 从文件末尾读取约 1MB 再提取最后 max_lines 行
|
|
166
|
+
chunk_size = min(1024 * 1024, file_size)
|
|
167
|
+
f.seek(max(0, file_size - chunk_size))
|
|
168
|
+
tail = f.read()
|
|
169
|
+
all_lines = tail.splitlines()
|
|
170
|
+
# 如果不够,继续向前读
|
|
171
|
+
lines = all_lines
|
|
172
|
+
lines_read = len(all_lines)
|
|
173
|
+
while lines_read < max_lines and file_size > chunk_size:
|
|
174
|
+
f.seek(max(0, file_size - chunk_size * 2))
|
|
175
|
+
more = f.read(chunk_size)
|
|
176
|
+
more_lines = more.splitlines()
|
|
177
|
+
lines = more_lines + lines
|
|
178
|
+
lines_read = len(lines)
|
|
179
|
+
if len(lines) > max_lines:
|
|
180
|
+
lines = lines[-max_lines:]
|
|
181
|
+
return lines
|
|
145
182
|
|
|
146
183
|
|
|
147
184
|
# 子 Agent 回传消息的特征
|
|
@@ -1358,44 +1395,52 @@ def _parse_session_file(
|
|
|
1358
1395
|
)
|
|
1359
1396
|
elif file_size <= _SUBAGENT_READ_SAFETY_BYTES:
|
|
1360
1397
|
steps, started_at, session_status = _parse_session_lines(
|
|
1361
|
-
_read_text_lines(path), requester_info, started_at_hint=header_ts
|
|
1398
|
+
_read_text_lines(path, limit * 3), requester_info, started_at_hint=header_ts
|
|
1362
1399
|
)
|
|
1363
1400
|
if subagent_anchor_ms is None:
|
|
1364
1401
|
steps = _slice_subagent_steps_from_first_user(steps)
|
|
1365
1402
|
elif subagent_anchor_ms is not None:
|
|
1366
1403
|
# 超大 + 有 run:以尾部为窗口(近期)再交给 get_timeline 的 _apply 锚定
|
|
1367
|
-
tail_lines = _read_jsonl_tail_line_slice(path)
|
|
1404
|
+
tail_lines = _read_jsonl_tail_line_slice(path, target_lines=limit)
|
|
1368
1405
|
if tail_lines is not None:
|
|
1369
1406
|
steps, started_at, session_status = _parse_session_lines(
|
|
1370
1407
|
tail_lines, requester_info, started_at_hint=header_ts
|
|
1371
1408
|
)
|
|
1372
1409
|
else:
|
|
1373
1410
|
steps, started_at, session_status = _parse_session_lines(
|
|
1374
|
-
_read_text_line_window(path, 0,
|
|
1411
|
+
_read_text_line_window(path, 0, limit * 3),
|
|
1375
1412
|
requester_info, started_at_hint=header_ts
|
|
1376
1413
|
)
|
|
1377
1414
|
else:
|
|
1378
1415
|
# 超大 + 无 run:先定位首条 user 行,自 PM/主控下发起读有限行
|
|
1379
1416
|
uidx = _line_index_of_first_user_message(path)
|
|
1380
1417
|
start = uidx if uidx is not None else 0
|
|
1381
|
-
part = _read_text_line_window(path, start,
|
|
1418
|
+
part = _read_text_line_window(path, start, limit * 3)
|
|
1382
1419
|
steps, started_at, session_status = _parse_session_lines(
|
|
1383
1420
|
part, requester_info, started_at_hint=header_ts
|
|
1384
1421
|
)
|
|
1385
1422
|
steps = _slice_subagent_steps_from_first_user(steps)
|
|
1386
1423
|
else:
|
|
1387
|
-
tail_lines = _read_jsonl_tail_line_slice(path)
|
|
1424
|
+
tail_lines = _read_jsonl_tail_line_slice(path, target_lines=limit)
|
|
1388
1425
|
if tail_lines is not None:
|
|
1389
1426
|
steps, started_at, session_status = _parse_session_lines(
|
|
1390
1427
|
tail_lines, requester_info, started_at_hint=header_ts
|
|
1391
1428
|
)
|
|
1392
1429
|
if len(steps) < limit:
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1430
|
+
# 尾部步骤不够,从头部补充(最多读 limit 步对应的行数缓冲)
|
|
1431
|
+
head_lines = _read_text_lines(path, _HEAD_JSONL_LINES)
|
|
1432
|
+
if head_lines:
|
|
1433
|
+
more_steps, _, _ = _parse_session_lines(
|
|
1434
|
+
head_lines, requester_info, started_at_hint=header_ts
|
|
1435
|
+
)
|
|
1436
|
+
# 合并并重新截取最新的 limit 步
|
|
1437
|
+
combined = more_steps + steps
|
|
1438
|
+
if len(combined) > limit:
|
|
1439
|
+
combined = combined[-limit:]
|
|
1440
|
+
steps, started_at, session_status = combined, started_at, session_status
|
|
1396
1441
|
else:
|
|
1397
1442
|
steps, started_at, session_status = _parse_session_lines(
|
|
1398
|
-
_read_text_lines(path), requester_info, started_at_hint=header_ts
|
|
1443
|
+
_read_text_lines(path, limit * 3), requester_info, started_at_hint=header_ts
|
|
1399
1444
|
)
|
|
1400
1445
|
|
|
1401
1446
|
if len(steps) > step_budget:
|
|
@@ -20,5 +20,5 @@
|
|
|
20
20
|
`).length:0),b=Q(()=>s.step.toolResult?o.value||!x.value?s.step.toolResult:s.step.toolResult.split(`
|
|
21
21
|
`).slice(0,10).join(`
|
|
22
22
|
`)+`
|
|
23
|
-
...`:""),M=Q(()=>s.step.type!=="toolResult"||s.step.toolResultStatus!=="error"?"":s.step.toolResultError?s.step.toolResultError:s.step.toolResult||"工具执行失败"),_=Q(()=>{if(s.step.type!=="toolResult"||s.step.toolResultStatus!=="error")return null;const G=(s.step.toolResultError||s.step.toolResult||"").toLowerCase(),A=(s.step.toolName||"").toLowerCase(),st=[];return(G.includes("enoent")||G.includes("no such file")||G.includes("文件不存在"))&&st.push("检查文件路径是否正确","确认文件是否存在"),(G.includes("eacces")||G.includes("permission")||G.includes("权限"))&&st.push("检查文件/目录权限","确认当前用户有访问权限"),(G.includes("timeout")||G.includes("超时"))&&st.push("增加超时时间","简化任务或检查网络"),A==="read"&&st.length===0&&st.push("检查路径是否在 workspace 内","确认文件编码正确"),A.includes("bash")&&st.length===0&&st.push("检查命令语法","确认依赖已安装","查看退出码"),st.length===0&&st.push("查看原始返回详情","尝试调整参数后重试"),st}),w=Q(()=>s.step.type!=="error"||!s.step.errorType?null:{"rate-limit":["降低调用频率","切换到 fallback model","等待配额恢复"],"token-limit":["减少上下文长度","分段处理任务","使用更大 context 的模型"],timeout:["检查网络连接","简化任务复杂度","增加超时时间"],quota:["充值账户","切换到其他 provider","等待配额重置"]}[s.step.errorType]||null);function K(){if(v.value){const G=s.step.pairedToolCallId||s.step.id,A=s.step.pairedToolResultId||s.step.id;l("highlight-pair",{callId:G,resultId:A})}P()}function P(){S.value&&(i.value=!i.value)}function N(G){return G?new Date(G).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function Z(G){return G?G<1e3?`${G}ms`:G<6e4?`${(G/1e3).toFixed(1)}s`:`${(G/6e4).toFixed(1)}min`:"0ms"}function F(G){try{return JSON.stringify(G,null,2)}catch{return String(G)}}async function q(){if(s.step.toolResult)try{await navigator.clipboard.writeText(s.step.toolResult),alert("已复制到剪贴板")}catch{}}return(G,A)=>(c(),u("div",{class:nt(["timeline-step",[`step-${t.step.type}`,`status-${t.step.status}`,{"is-paired-result":p.value,highlighted:C.value}]])},[n("div",{class:"step-header",onClick:K},[n("div",ir,[n("span",or,f(a.value),1),n("span",ar,f(r.value),1),d.value?(c(),u("span",rr,f(d.value),1)):R("",!0),!i.value&&k.value?(c(),u("span",cr,f(k.value),1)):R("",!0),n("span",ur,f(N(t.step.timestamp)),1),t.step.duration&&t.step.duration>0?(c(),u("span",dr," +"+f(Z(t.step.duration)),1)):R("",!0),t.step.executionTime?(c(),u("span",fr," ⏱ "+f(Z(t.step.executionTime)),1)):R("",!0)]),n("div",hr,[t.step.tokens?(c(),u("span",pr,[A[2]||(A[2]=n("span",{class:"token-label"},"tokens:",-1)),At(" "+f(t.step.tokens.input+t.step.tokens.output),1)])):R("",!0),v.value?(c(),u("span",{key:1,class:"pair-indicator",title:I.value}," 🔗 ",8,vr)):R("",!0),S.value?(c(),u("span",gr,f(i.value?"▼":"▶"),1)):R("",!0)])]),S.value&&i.value?(c(),u("div",mr,[t.step.type==="user"&&t.step.content?(c(),u("div",_r,[n("pre",null,f(t.step.content),1)])):R("",!0),t.step.type==="thinking"&&t.step.thinking?(c(),u("div",yr,[A[3]||(A[3]=n("div",{class:"thinking-label"},"💭 思考过程",-1)),n("pre",null,f(t.step.thinking),1)])):R("",!0),t.step.type==="text"&&t.step.content?(c(),u("div",br,[n("pre",null,f(t.step.content),1)])):R("",!0),t.step.type==="toolCall"?(c(),u("div",$r,[t.step.toolArguments?(c(),u("div",kr,[A[4]||(A[4]=n("div",{class:"section-label"},"参数:",-1)),n("pre",wr,f(F(t.step.toolArguments)),1)])):R("",!0)])):R("",!0),t.step.type==="toolResult"?(c(),u("div",Cr,[n("div",Tr,[n("span",{class:nt(["result-status",t.step.toolResultStatus])},f(t.step.toolResultStatus==="ok"?"✅ 成功":"❌ 工具执行失败"),3),t.step.toolResult?(c(),u("button",{key:0,class:"copy-btn",onClick:q}," 复制 ")):R("",!0)]),t.step.toolResultStatus==="error"?(c(),u(Y,{key:0},[M.value?(c(),u("div",Sr,[n("div",xr,f(M.value),1),_.value?(c(),u("div",Ar,[A[5]||(A[5]=n("span",{class:"suggestion-label"},"💡 建议:",-1)),n("ul",null,[(c(!0),u(Y,null,ct(_.value,(st,mt)=>(c(),u("li",{key:mt},f(st),1))),128))])])):R("",!0)])):R("",!0),t.step.toolResult?(c(),u("div",Ir,[A[6]||(A[6]=n("div",{class:"section-label"},"原始返回:",-1)),n("pre",{class:nt({truncated:!o.value})},f(b.value),3),x.value?(c(),u("button",{key:0,class:"show-more-btn",onClick:A[0]||(A[0]=le(st=>o.value=!o.value,["stop"]))},f(o.value?"收起":`展开全部 (${T.value} 行)`),1)):R("",!0)])):R("",!0)],64)):(c(),u(Y,{key:1},[t.step.toolResult?(c(),u("div",Mr,[n("pre",{class:nt({truncated:!o.value})},f(b.value),3),x.value?(c(),u("button",{key:0,class:"show-more-btn",onClick:A[1]||(A[1]=le(st=>o.value=!o.value,["stop"]))},f(o.value?"收起":`展开全部 (${T.value} 行)`),1)):R("",!0)])):R("",!0)],64))])):R("",!0),t.step.type==="error"?(c(),u("div",Rr,[n("div",Er,f(t.step.errorType||"unknown"),1),n("div",Pr,f(t.step.errorMessage),1),w.value?(c(),u("div",Dr,[A[7]||(A[7]=n("div",{class:"suggestion-label"},"💡 建议:",-1)),n("ul",null,[(c(!0),u(Y,null,ct(w.value,(st,mt)=>(c(),u("li",{key:mt},f(st),1))),128))])])):R("",!0)])):R("",!0)])):R("",!0)],2))}}),Ct=(t,e)=>{const s=t.__vccOpts||t;for(const[l,i]of e)s[l]=i;return s},mn=Ct(Fr,[["__scopeId","data-v-b8bd62e0"]]),Lr={class:"timeline-connector"},Or=wt({__name:"TimelineConnector",setup(t){return(e,s)=>(c(),u("div",Lr,[...s[0]||(s[0]=[n("div",{class:"connector-line"},null,-1),n("div",{class:"connector-arrow"},"▼",-1)])]))}}),_n=Ct(Or,[["__scopeId","data-v-01a6bfe6"]]),Nr={class:"round-header"},jr={class:"round-badge"},Ur={class:"round-trigger"},Vr={key:0,class:"round-stats"},Wr={class:"round-content"},Hr=wt({__name:"TimelineRound",props:{round:{},steps:{},highlightedPair:{}},emits:["highlight-pair"],setup(t){const e=t,s={user_input:"👤 用户输入触发",subagent_result:"↩️ 子代理回传",tool_result:"🔧 工具结果触发",start:"🚀 会话开始"},l=Q(()=>{const o=s[e.round.trigger]||e.round.trigger;return e.round.triggerBy&&e.round.triggerBy!=="用户"?`${o} · ${e.round.triggerBy}`:o});function i(o){const a=e.steps.find(r=>r.id===o);return a||(console.warn(`Step not found: ${o}`),{id:o,type:"text",status:"success",timestamp:0})}return(o,a)=>(c(),u("div",{class:nt(["timeline-round",`trigger-${t.round.trigger}`])},[n("div",Nr,[n("span",jr,"LLM #"+f(t.round.index),1),n("span",Ur,f(l.value),1),t.round.tokens?(c(),u("span",Vr,f(t.round.tokens.input+t.round.tokens.output)+" tokens ",1)):R("",!0)]),n("div",Wr,[(c(!0),u(Y,null,ct(t.round.stepIds,(r,d)=>(c(),u(Y,{key:r},[d>0?(c(),Gt(_n,{key:0})):R("",!0),bt(mn,{step:i(r),prevStep:d>0?i(t.round.stepIds[d-1]):void 0,highlightedPair:t.highlightedPair,onHighlightPair:a[0]||(a[0]=v=>o.$emit("highlight-pair",v))},null,8,["step","prevStep","highlightedPair"])],64))),128))])],2))}}),Br=Ct(Hr,[["__scopeId","data-v-2aa49052"]]),Kr={key:0,class:"link-time"},qr=wt({__name:"TimelineToolLink",props:{isError:{type:Boolean},isActive:{type:Boolean},executionTime:{}},setup(t){function e(s){return s?s<1e3?`${s}ms`:s<6e4?`${(s/1e3).toFixed(1)}s`:`${(s/6e4).toFixed(1)}min`:""}return(s,l)=>(c(),u("div",{class:nt(["tool-link",{"link-error":t.isError,"link-active":t.isActive}])},[l[0]||(l[0]=n("div",{class:"link-line"},[n("span",{class:"link-dot top"}),n("span",{class:"link-connector"}),n("span",{class:"link-dot bottom"})],-1)),t.executionTime?(c(),u("span",Kr,f(e(t.executionTime)),1)):R("",!0)],2))}}),Sl=Ct(qr,[["__scopeId","data-v-d1e21896"]]),Gr={class:"timeline-view"},zr={class:"timeline-header"},Jr={class:"header-left"},Qr={key:0,class:"agent-info"},Yr={key:0,class:"model"},Xr={class:"header-right"},Zr=["disabled"],tc={key:0,class:"loading-state"},ec={key:1,class:"empty-state"},sc={key:0,class:"empty-message"},nc={key:1,class:"empty-message"},lc={key:2},ic={key:3,class:"empty-hint"},oc={key:2,class:"timeline-content"},ac={key:0,class:"session-info"},rc={class:"session-id"},cc={key:0,class:"started-at"},uc={class:"steps-list"},dc={key:0,class:"tool-execution-label"},fc={class:"timeline-footer"},hc={class:"stats-grid"},pc={class:"stat-item"},vc={class:"stat-value"},gc={class:"stat-item"},mc={class:"stat-value"},_c={class:"stat-item"},yc={class:"stat-value"},bc={class:"stat-item"},$c={class:"stat-value"},kc=wt({__name:"TimelineView",props:{agentId:{},sessionKey:{},autoRefresh:{type:Boolean},refreshInterval:{}},setup(t){const e=t,s=W(null),l=W(!1),i=W(null),o=W(null),a=Q(()=>s.value?s.value.status:"empty"),r=Q(()=>({running:"🔄 进行中",completed:"✅ 已完成",error:"❌ 出错",empty:"空",no_sessions:"无会话"})[a.value]||"未知"),d=Q(()=>{var _;return((_=s.value)==null?void 0:_.roundMode)&&s.value.rounds&&s.value.rounds.length>0}),v=Q(()=>{var w;const _=new Map;if(!((w=s.value)!=null&&w.rounds))return _;for(const K of s.value.rounds)for(const P of K.stepIds)_.set(P,K);return _}),p=Q(()=>{if(!s.value||!d.value)return[];const _=[],w=new Set;for(const K of s.value.steps){if(w.has(K.id))continue;const P=v.value.get(K.id);P?(_.push({type:"round",data:P}),P.stepIds.forEach(N=>w.add(N))):(_.push({type:"step",data:K}),w.add(K.id))}return _});async function C(){if(e.agentId){l.value=!0,i.value=null;try{let _=`/api/timeline/${e.agentId}?limit=500`;e.sessionKey&&(_+=`&session_key=${encodeURIComponent(e.sessionKey)}`);const w=await fetch(_);if(!w.ok)throw new Error(`HTTP ${w.status}`);s.value=await w.json()}catch(_){i.value=_ instanceof Error?_.message:"加载失败",console.error("Timeline load error:",_)}finally{l.value=!1}}}function I(_){s.value&&s.value.steps[_]&&(s.value.steps[_].collapsed=!s.value.steps[_].collapsed)}function S(_){if(s.value){const w=s.value.steps.find(K=>K.id===_);w&&(w.collapsed=!w.collapsed)}}function k(_){o.value=_,setTimeout(()=>{o.value=null},3e3)}function x(_){return _?new Date(_).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function T(_){return _?_<1e3?`${_}ms`:_<6e4?`${(_/1e3).toFixed(1)}s`:`${(_/6e4).toFixed(1)}min`:"0ms"}function b(_){return _>=1e3?`${(_/1e3).toFixed(1)}k`:String(_)}Nt(C),Bt(()=>e.agentId,C);let M=null;return Bt([()=>e.autoRefresh,()=>e.refreshInterval],([_,w])=>{M&&(clearInterval(M),M=null),_&&w&&w>0&&(M=setInterval(C,w*1e3))},{immediate:!0}),(_,w)=>{var K,P,N,Z;return c(),u("div",Gr,[n("div",zr,[n("div",Jr,[w[0]||(w[0]=n("span",{class:"title"},"📊 实时执行时序",-1)),s.value?(c(),u("span",Qr,[At(f(s.value.agentName||s.value.agentId)+" ",1),s.value.model?(c(),u("span",Yr,"("+f(s.value.model)+")",1)):R("",!0)])):R("",!0)]),n("div",Xr,[n("span",{class:nt(["status-badge",`status-${a.value}`])},f(r.value),3),n("button",{class:"refresh-btn",onClick:C,disabled:l.value},f(l.value?"加载中...":"🔄 刷新"),9,Zr)])]),l.value&&!s.value?(c(),u("div",tc,[...w[1]||(w[1]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载时序数据...",-1)])])):!s.value||s.value.steps.length===0?(c(),u("div",ec,[w[2]||(w[2]=n("span",{class:"empty-icon"},"📭",-1)),((K=s.value)==null?void 0:K.status)==="no_sessions"&&((P=s.value)!=null&&P.isMainAgent)?(c(),u("span",sc," 主 Agent 暂无会话记录 ")):((N=s.value)==null?void 0:N.status)==="no_sessions"?(c(),u("span",nc," 该 Agent 是子代理,暂无独立会话记录 ")):(c(),u("span",lc,"暂无会话记录")),(Z=s.value)!=null&&Z.message?(c(),u("div",ic,f(s.value.message),1)):R("",!0)])):(c(),u("div",oc,[w[8]||(w[8]=Ii('<div class="timeline-legend" data-v-4917257d><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>👤</span> 用户/回传</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>🧠</span> LLM 思考</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>🤖</span> LLM 回复</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>🔧</span> 工具调用</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>✅</span> 工具成功</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>❌</span> 工具失败</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>⚠️</span> 错误</span></div>',1)),s.value.sessionId?(c(),u("div",ac,[n("span",rc,"Session: "+f(s.value.sessionId.slice(0,8))+"...",1),s.value.startedAt?(c(),u("span",cc," 开始: "+f(x(s.value.startedAt)),1)):R("",!0)])):R("",!0),n("div",uc,[d.value?(c(!0),u(Y,{key:0},ct(p.value,(F,q)=>{var G;return c(),u(Y,{key:(F.type==="round",F.data.id)},[q>0?(c(),Gt(_n,{key:0})):R("",!0),F.type==="round"?(c(),Gt(Br,{key:1,round:F.data,steps:s.value.steps,highlightedPair:o.value,onHighlightPair:k},null,8,["round","steps","highlightedPair"])):(c(),u(Y,{key:2},[F.data.type==="toolResult"?(c(),u("div",dc,[...w[3]||(w[3]=[n("span",{class:"label-line"},null,-1),n("span",{class:"label-text"},"⚡ 工具执行",-1),n("span",{class:"label-line"},null,-1)])])):R("",!0),F.data.type==="toolResult"&&F.data.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:F.data.toolResultStatus==="error",isActive:((G=o.value)==null?void 0:G.resultId)===F.data.id,executionTime:F.data.executionTime},null,8,["isError","isActive","executionTime"])):R("",!0),bt(mn,{step:F.data,highlightedPair:o.value,onToggleCollapse:A=>S(F.data.id),onHighlightPair:k},null,8,["step","highlightedPair","onToggleCollapse"])],64))],64)}),128)):(c(!0),u(Y,{key:1},ct(s.value.steps,(F,q)=>{var G;return c(),u(Y,{key:F.id},[q>0?(c(),Gt(_n,{key:0})):R("",!0),F.type==="toolResult"&&F.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:F.toolResultStatus==="error",isActive:((G=o.value)==null?void 0:G.resultId)===F.id,executionTime:F.executionTime},null,8,["isError","isActive","executionTime"])):R("",!0),bt(mn,{step:F,prevStep:s.value.steps[q-1],highlightedPair:o.value,onToggleCollapse:A=>I(q),onHighlightPair:k},null,8,["step","prevStep","highlightedPair","onToggleCollapse"])],64)}),128))]),n("div",fc,[n("div",hc,[n("div",pc,[w[4]||(w[4]=n("span",{class:"stat-label"},"总耗时",-1)),n("span",vc,f(T(s.value.stats.totalDuration)),1)]),n("div",gc,[w[5]||(w[5]=n("span",{class:"stat-label"},"Token",-1)),n("span",mc,f(b(s.value.stats.totalInputTokens))+" / "+f(b(s.value.stats.totalOutputTokens)),1)]),n("div",_c,[w[6]||(w[6]=n("span",{class:"stat-label"},"工具调用",-1)),n("span",yc,f(s.value.stats.toolCallCount)+" 次",1)]),n("div",bc,[w[7]||(w[7]=n("span",{class:"stat-label"},"步骤数",-1)),n("span",$c,f(s.value.stats.stepCount),1)])])])]))])}}}),wc=Ct(kc,[["__scopeId","data-v-4917257d"]]),yn={pending:{icon:"⏳",bgColor:"#f3f4f6",borderColor:"#9ca3af",label:"等待中"},running:{icon:"🔄",bgColor:"#eff6ff",borderColor:"#3b82f6",label:"进行中"},completed:{icon:"✅",bgColor:"#f0fdf4",borderColor:"#22c55e",label:"已完成"},error:{icon:"❌",bgColor:"#fef2f2",borderColor:"#ef4444",label:"失败"}},Cc={class:"node-icon"},Tc={class:"node-info"},Sc={class:"node-name"},xc={class:"node-role"},Ac={class:"node-status"},Ic={key:0,class:"node-time"},Mc={key:1,class:"node-progress"},Rc=wt({__name:"ChainNode",props:{node:{},isSelected:{type:Boolean}},emits:["click"],setup(t){const e=t,s=Q(()=>{var o;return((o=yn[e.node.status])==null?void 0:o.icon)||"📄"}),l=Q(()=>{var o;return((o=yn[e.node.status])==null?void 0:o.label)||e.node.status});function i(o){return o?o<1e3?`${o}ms`:o<6e4?`${(o/1e3).toFixed(1)}s`:`${(o/6e4).toFixed(1)}min`:""}return(o,a)=>(c(),u("div",{class:nt(["chain-node",[`status-${t.node.status}`,{selected:t.isSelected}]]),onClick:a[0]||(a[0]=r=>o.$emit("click"))},[n("div",Cc,f(s.value),1),n("div",Tc,[n("div",Sc,f(t.node.agentName),1),n("div",xc,f(t.node.role),1)]),n("div",Ac,f(l.value),1),t.node.startedAt?(c(),u("div",Ic,f(i(t.node.duration)),1)):R("",!0),t.node.status==="running"?(c(),u("div",Mc,[...a[1]||(a[1]=[n("div",{class:"progress-spinner"},null,-1)])])):R("",!0)],2))}}),Ec=Ct(Rc,[["__scopeId","data-v-973c6755"]]),Pc={width:"60",height:"20",viewBox:"0 0 60 20"},Dc={id:"arrowhead",markerWidth:"10",markerHeight:"7",refX:"9",refY:"3.5",orient:"auto"},Fc=["fill"],Lc=["stroke","stroke-dasharray"],Oc=wt({__name:"ChainEdge",props:{fromStatus:{},toStatus:{}},setup(t){const e=t,s=Q(()=>e.toStatus==="running"?"#3b82f6":e.toStatus==="completed"?"#22c55e":e.toStatus==="error"?"#ef4444":"#9ca3af"),l=Q(()=>s.value),i=Q(()=>e.toStatus==="pending"?"4 4":"none"),o=Q(()=>({"edge-running":e.toStatus==="running","edge-completed":e.toStatus==="completed","edge-error":e.toStatus==="error","edge-pending":e.toStatus==="pending"}));return(a,r)=>(c(),u("div",{class:nt(["chain-edge",o.value])},[(c(),u("svg",Pc,[n("defs",null,[n("marker",Dc,[n("polygon",{points:"0 0, 10 3.5, 0 7",fill:l.value},null,8,Fc)])]),n("line",{x1:"0",y1:"10",x2:"50",y2:"10",stroke:s.value,"stroke-width":"2","stroke-dasharray":i.value,"marker-end":"url(#arrowhead)"},null,8,Lc)]))],2))}}),Nc=Ct(Oc,[["__scopeId","data-v-c94ab96b"]]),jc={class:"chain-view"},Uc={class:"chain-header"},Vc={class:"header-left"},Wc={key:0,class:"project-info"},Hc={class:"header-right"},Bc=["disabled"],Kc={key:0,class:"loading-state"},qc={key:1,class:"empty-state"},Gc={key:2,class:"chain-content"},zc={key:0,class:"root-task"},Jc={class:"task-text"},Qc={class:"task-meta"},Yc={key:0},Xc={key:1,class:"chain-diagram"},Zc={class:"diagram-container"},tu={key:2,class:"chain-progress"},eu={class:"progress-bar"},su={class:"progress-text"},nu={key:3,class:"node-detail"},lu={class:"detail-header"},iu={class:"detail-title"},ou={class:"detail-content"},au={key:0,class:"detail-section"},ru={class:"section-value"},cu={class:"detail-row"},uu={class:"detail-item"},du={class:"item-value"},fu={class:"detail-item"},hu={class:"item-value"},pu={key:1,class:"detail-row"},vu={class:"detail-item"},gu={class:"item-value"},mu={class:"detail-item"},_u={class:"item-value"},yu={key:2,class:"detail-section"},bu={class:"section-value"},$u={key:3,class:"detail-section"},ku={class:"artifacts-list"},wu=wt({__name:"TaskChainView",props:{autoRefresh:{type:Boolean},refreshInterval:{}},setup(t){const e=t,s=W([]),l=W(null),i=W(null),o=W(!1),a=Q(()=>l.value?l.value:s.value.length>0?s.value[0]:null),r=Q(()=>{var T;return{running:"🔄 进行中",completed:"✅ 已完成",error:"❌ 出错",empty:"空"}[((T=a.value)==null?void 0:T.status)||"empty"]||"未知"}),d=Q(()=>{var b;const x=(b=a.value)==null?void 0:b.nodes;if(!x)return[];const T=["main","analyst","architect","devops"];return[...x].sort((M,_)=>{const w=T.findIndex(P=>M.role.includes(P)),K=T.findIndex(P=>_.role.includes(P));return w-K})});async function v(){o.value=!0;try{const x=await fetch("/api/chains?limit=10");if(x.ok){const T=await x.json();s.value=T.chains||[],l.value=T.activeChain||null}}catch(x){console.error("Chain load error:",x)}finally{o.value=!1}}function p(x){var T;i.value=((T=i.value)==null?void 0:T.agentId)===x.agentId?null:x}function C(x){return x?new Date(x).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):"-"}function I(x){return x?x<1e3?`${x}ms`:x<6e4?`${(x/1e3).toFixed(1)}s`:`${(x/6e4).toFixed(1)}min`:"-"}function S(x){return x?x>=1e3?`${(x/1e3).toFixed(1)}k`:String(x):"0"}let k=null;return Nt(()=>{v(),e.autoRefresh&&e.refreshInterval&&(k=setInterval(v,e.refreshInterval*1e3))}),ae(()=>{k&&(clearInterval(k),k=null)}),(x,T)=>{var b,M;return c(),u("div",jc,[n("div",Uc,[n("div",Vc,[T[0]||(T[0]=n("span",{class:"title"},"🔗 任务执行链路",-1)),a.value?(c(),u("span",Wc,f(a.value.projectId||"当前任务"),1)):R("",!0)]),n("div",Hc,[n("span",{class:nt(["status-badge",`status-${((b=a.value)==null?void 0:b.status)||"empty"}`])},f(r.value),3),n("button",{class:"refresh-btn",onClick:v,disabled:o.value},f(o.value?"加载中...":"🔄 刷新"),9,Bc)])]),o.value&&!a.value?(c(),u("div",Kc,[...T[1]||(T[1]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载链路数据...",-1)])])):!a.value&&s.value.length===0?(c(),u("div",qc,[...T[2]||(T[2]=[n("span",{class:"empty-icon"},"🔗",-1),n("span",null,"暂无任务链路",-1),n("div",{class:"empty-hint"},"当 Main Agent 派发任务给子 Agent 时,这里会显示执行链路",-1)])])):(c(),u("div",Gc,[a.value?(c(),u("div",zc,[T[3]||(T[3]=n("div",{class:"task-label"},"根任务",-1)),n("div",Jc,f(a.value.rootTask),1),n("div",Qc,[a.value.startedAt?(c(),u("span",Yc,"开始: "+f(C(a.value.startedAt)),1)):R("",!0)])])):R("",!0),a.value?(c(),u("div",Xc,[n("div",Zc,[(c(!0),u(Y,null,ct(d.value,(_,w)=>{var K,P;return c(),u(Y,{key:_.agentId},[w>0?(c(),Gt(Nc,{key:0,"from-status":(K=d.value[w-1])==null?void 0:K.status,"to-status":_.status},null,8,["from-status","to-status"])):R("",!0),bt(Ec,{node:_,"is-selected":((P=i.value)==null?void 0:P.agentId)===_.agentId,onClick:N=>p(_)},null,8,["node","is-selected","onClick"])],64)}),128))])])):R("",!0),a.value?(c(),u("div",tu,[n("div",eu,[n("div",{class:"progress-fill",style:St({width:`${a.value.progress*100}%`})},null,4)]),n("div",su,f(Math.round(a.value.progress*100))+"% ("+f(a.value.completedNodes)+"/"+f(a.value.totalNodes)+" 完成) ",1)])):R("",!0),i.value?(c(),u("div",nu,[n("div",lu,[n("span",iu,f(i.value.agentName),1),n("span",{class:nt(["detail-status",`status-${i.value.status}`])},f(((M=rs(yn)[i.value.status])==null?void 0:M.label)||i.value.status),3)]),n("div",ou,[i.value.task?(c(),u("div",au,[T[4]||(T[4]=n("div",{class:"section-label"},"任务",-1)),n("div",ru,f(i.value.task),1)])):R("",!0),n("div",cu,[n("div",uu,[T[5]||(T[5]=n("span",{class:"item-label"},"开始时间",-1)),n("span",du,f(i.value.startedAt?C(i.value.startedAt):"-"),1)]),n("div",fu,[T[6]||(T[6]=n("span",{class:"item-label"},"耗时",-1)),n("span",hu,f(I(i.value.duration)),1)])]),i.value.tokenUsage?(c(),u("div",pu,[n("div",vu,[T[7]||(T[7]=n("span",{class:"item-label"},"Token 输入",-1)),n("span",gu,f(S(i.value.tokenUsage.input)),1)]),n("div",mu,[T[8]||(T[8]=n("span",{class:"item-label"},"Token 输出",-1)),n("span",_u,f(S(i.value.tokenUsage.output)),1)])])):R("",!0),i.value.toolCallCount>0?(c(),u("div",yu,[T[9]||(T[9]=n("div",{class:"section-label"},"工具调用",-1)),n("div",bu,f(i.value.toolCallCount)+" 次",1)])):R("",!0),i.value.artifacts&&i.value.artifacts.length>0?(c(),u("div",$u,[T[10]||(T[10]=n("div",{class:"section-label"},"产出物",-1)),n("div",ku,[(c(!0),u(Y,null,ct(i.value.artifacts,_=>(c(),u("div",{key:_,class:"artifact-item"}," 📄 "+f(_),1))),128))])])):R("",!0)])])):R("",!0)]))])}}}),Cu=Ct(wu,[["__scopeId","data-v-ee8c8661"]]),Tu={class:"agent-config-panel"},Su={class:"header"},xu=["disabled"],Au={key:0,class:"loading-state"},Iu={key:1,class:"error-state"},Mu={key:2,class:"config-content"},Ru={class:"config-section"},Eu={class:"info-grid"},Pu={class:"info-item"},Du={class:"value monospace"},Fu={class:"info-item"},Lu={class:"value"},Ou={class:"info-item full-width"},Nu={class:"value monospace"},ju={class:"info-item"},Uu={class:"config-section"},Vu={class:"model-config"},Wu={class:"model-field"},Hu={class:"model-select-wrapper"},Bu=["disabled"],Ku=["label"],qu=["value"],Gu={key:0,class:"current-model"},zu={class:"model-field"},Ju={class:"fallbacks-list"},Qu=["onUpdate:modelValue","disabled"],Yu=["label"],Xu=["value"],Zu=["onClick","disabled"],td=["disabled"],ed={class:"model-actions"},sd=["disabled"],nd=["disabled"],ld={key:0,class:"config-section"},id={class:"description-text"},od=wt({__name:"AgentConfigPanel",props:{agentId:{}},setup(t){const e=t,s=W(null),l=W([]),i=W(!1),o=W(!1),a=W(""),r=W(""),d=W([]),v=Q(()=>{const M={};for(const _ of l.value)M[_.provider]||(M[_.provider]=[]),M[_.provider].push(_);return Object.entries(M).map(([_,w])=>({provider:_,models:w}))}),p=Q(()=>{var _;if(!((_=s.value)!=null&&_.model))return!1;const M=s.value.model;return r.value!==M.primary||JSON.stringify(d.value.filter(w=>w))!==JSON.stringify(M.fallbacks||[])});function C(M){return{idle:"空闲",working:"工作中",down:"异常"}[M]||M}function I(M){if(!M)return"";const _=M.split("/");return _.length>1?_[_.length-1]:M}async function S(){var M;i.value=!0,a.value="";try{const[_,w]=await Promise.all([fetch(`/api/agent-config/${e.agentId}`),fetch("/api/available-models")]);if(_.ok?(s.value=await _.json(),(M=s.value)!=null&&M.model&&(r.value=s.value.model.primary||"",d.value=[...s.value.model.fallbacks||[]])):a.value="加载配置失败",w.ok){const K=await w.json();l.value=K.models||[]}}catch(_){a.value="加载失败: "+_.message}finally{i.value=!1}}function k(){d.value.length<3&&d.value.push("")}function x(M){d.value.splice(M,1)}function T(){var M;(M=s.value)!=null&&M.model&&(r.value=s.value.model.primary||"",d.value=[...s.value.model.fallbacks||[]])}async function b(){if(p.value){o.value=!0;try{const M=await fetch(`/api/agent-config/${e.agentId}/model`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({primary:r.value||null,fallbacks:d.value.filter(_=>_)||null})});if(M.ok){const _=await M.json();s.value&&_.model&&(s.value.model=_.model),alert("模型配置已保存!重启 Agent 后生效。")}else{const _=await M.json();alert("保存失败: "+(_.detail||"未知错误"))}}catch(M){alert("保存失败: "+M.message)}finally{o.value=!1}}}return Bt(()=>e.agentId,()=>{S()},{immediate:!0}),Nt(()=>{S()}),(M,_)=>{var w;return c(),u("div",Tu,[n("div",Su,[_[1]||(_[1]=n("h3",null,"⚙️ Agent 配置",-1)),n("button",{class:"refresh-btn",onClick:S,disabled:i.value},f(i.value?"加载中...":"刷新"),9,xu)]),i.value&&!s.value?(c(),u("div",Au," 加载配置... ")):a.value?(c(),u("div",Iu,f(a.value),1)):s.value?(c(),u("div",Mu,[n("div",Ru,[_[6]||(_[6]=n("h4",null,"基本信息",-1)),n("div",Eu,[n("div",Pu,[_[2]||(_[2]=n("span",{class:"label"},"ID",-1)),n("span",Du,f(s.value.id),1)]),n("div",Fu,[_[3]||(_[3]=n("span",{class:"label"},"名称",-1)),n("span",Lu,f(s.value.name),1)]),n("div",Ou,[_[4]||(_[4]=n("span",{class:"label"},"工作区",-1)),n("span",Nu,f(s.value.workspace||"未设置"),1)]),n("div",ju,[_[5]||(_[5]=n("span",{class:"label"},"状态",-1)),n("span",{class:nt(["value",`status-${s.value.status}`])},f(C(s.value.status)),3)])])]),n("div",Uu,[_[11]||(_[11]=n("h4",null,"模型配置",-1)),n("div",Vu,[n("div",Wu,[_[8]||(_[8]=n("label",null,"主模型 (Primary)",-1)),n("div",Hu,[Tt(n("select",{"onUpdate:modelValue":_[0]||(_[0]=K=>r.value=K),disabled:o.value,class:"model-select"},[_[7]||(_[7]=n("option",{value:""},"-- 选择模型 --",-1)),(c(!0),u(Y,null,ct(v.value,K=>(c(),u("optgroup",{key:K.provider,label:K.provider},[(c(!0),u(Y,null,ct(K.models,P=>(c(),u("option",{key:P.id,value:P.id},f(P.name),9,qu))),128))],8,Ku))),128))],8,Bu),[[Pe,r.value]]),(w=s.value.model)!=null&&w.primary?(c(),u("span",Gu," 当前: "+f(I(s.value.model.primary)),1)):R("",!0)])]),n("div",zu,[_[10]||(_[10]=n("label",null,"备选模型 (Fallbacks)",-1)),n("div",Ju,[(c(!0),u(Y,null,ct(d.value,(K,P)=>(c(),u("div",{key:P,class:"fallback-item"},[Tt(n("select",{"onUpdate:modelValue":N=>d.value[P]=N,disabled:o.value,class:"model-select small"},[_[9]||(_[9]=n("option",{value:""},"-- 选择 --",-1)),(c(!0),u(Y,null,ct(v.value,N=>(c(),u("optgroup",{key:N.provider,label:N.provider},[(c(!0),u(Y,null,ct(N.models,Z=>(c(),u("option",{key:Z.id,value:Z.id},f(Z.name),9,Xu))),128))],8,Yu))),128))],8,Qu),[[Pe,d.value[P]]]),n("button",{class:"remove-btn",onClick:N=>x(P),disabled:o.value},"×",8,Zu)]))),128)),n("button",{class:"add-fallback-btn",onClick:k,disabled:o.value||d.value.length>=3}," + 添加备选模型 ",8,td)])]),n("div",ed,[n("button",{class:"save-btn",onClick:b,disabled:o.value||!p.value},f(o.value?"保存中...":"保存修改"),9,sd),n("button",{class:"reset-btn",onClick:T,disabled:o.value}," 重置 ",8,nd)])])]),s.value.description?(c(),u("div",ld,[_[12]||(_[12]=n("h4",null,"描述",-1)),n("p",id,f(s.value.description),1)])):R("",!0)])):R("",!0)])}}}),ad=Ct(od,[["__scopeId","data-v-c0a2c245"]]),rd={class:"error-analysis-view"},cd={class:"header"},ud=["disabled"],dd={key:0,class:"agent-summary"},fd={class:"summary-card total"},hd={class:"count"},pd={key:0,class:"summary-card critical"},vd={class:"count"},gd={key:1,class:"summary-card high"},md={class:"count"},_d={key:2,class:"summary-card medium"},yd={class:"count"},bd={key:1,class:"loading-state"},$d={key:2,class:"empty-state"},kd={key:3,class:"errors-list"},wd=["onClick"],Cd={class:"error-header"},Td={class:"error-badges"},Sd={key:0,class:"badge archived",title:"已归档的子任务"},xd={key:1,class:"badge provider"},Ad={key:2,class:"badge model"},Id={class:"error-time"},Md={class:"error-message"},Rd={key:0,class:"error-detail"},Ed={class:"detail-section"},Pd={class:"error-full"},Dd={key:0,class:"detail-section"},Fd={class:"tool-chain"},Ld={class:"tool-index"},Od={class:"tool-name"},Nd={class:"tool-time"},jd={key:1,class:"detail-section"},Ud={class:"suggestions"},Vd={class:"detail-section meta"},Wd={key:4,class:"type-summary"},Hd={class:"type-bars"},Bd={class:"type-label"},Kd={class:"bar-container"},qd={class:"type-count"},Gd=wt({__name:"ErrorAnalysisView",props:{agentId:{}},setup(t){const e=t,s=W([]),l=W(null),i=W(!1),o=W(new Set),a={api_auth:"API 认证",api_rate_limit:"API 限流",api_model:"模型错误",timeout:"超时",permission:"权限错误",tool_error:"工具错误",subagent:"子任务错误",network:"网络错误",unknown:"未知"};function r(S){return a[S]||S}function d(S){return S?new Date(S).toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):""}function v(S,k){return!S||S.length<=k?S||"":S.slice(0,k)+"..."}function p(S,k){return k?Math.round(S/k*100)+"%":"0%"}function C(S){o.value.has(S)?o.value.delete(S):o.value.add(S),o.value=new Set(o.value)}async function I(){if(e.agentId){i.value=!0;try{const S=await fetch(`/api/error-analysis/${e.agentId}?session_limit=5`);if(S.ok){const k=await S.json();s.value=k.errors||[],l.value=k.summary||null}}catch(S){console.error("Failed to load error analysis:",S)}finally{i.value=!1}}}return Bt(()=>e.agentId,()=>{I()},{immediate:!0}),Nt(()=>{I()}),(S,k)=>{var x,T,b,M;return c(),u("div",rd,[n("div",cd,[k[0]||(k[0]=n("h3",null,"🔍 错误分析",-1)),n("button",{class:"refresh-btn",onClick:I,disabled:i.value},f(i.value?"分析中...":"刷新"),9,ud)]),l.value?(c(),u("div",dd,[n("div",fd,[n("span",hd,f(l.value.total||0),1),k[1]||(k[1]=n("span",{class:"label"},"错误数",-1))]),(x=l.value.bySeverity)!=null&&x.critical?(c(),u("div",pd,[n("span",vd,f(l.value.bySeverity.critical),1),k[2]||(k[2]=n("span",{class:"label"},"严重",-1))])):R("",!0),(T=l.value.bySeverity)!=null&&T.high?(c(),u("div",gd,[n("span",md,f(l.value.bySeverity.high),1),k[3]||(k[3]=n("span",{class:"label"},"高",-1))])):R("",!0),(b=l.value.bySeverity)!=null&&b.medium?(c(),u("div",_d,[n("span",yd,f(l.value.bySeverity.medium),1),k[4]||(k[4]=n("span",{class:"label"},"中",-1))])):R("",!0)])):R("",!0),i.value&&!s.value.length?(c(),u("div",bd," 正在分析错误... ")):s.value.length?(c(),u("div",kd,[(c(!0),u(Y,null,ct(s.value,(_,w)=>{var K,P;return c(),u("div",{key:w,class:nt(["error-item",`severity-${_.severity}`]),onClick:N=>C(w)},[n("div",Cd,[n("span",{class:"error-type",style:St({color:_.severityColor})},f(_.severityLabel)+" - "+f(_.errorTypeLabel),5),n("div",Td,[_.isArchived?(c(),u("span",Sd,"📦 归档")):R("",!0),_.provider?(c(),u("span",xd,f(_.provider),1)):R("",!0),_.model?(c(),u("span",Ad,f(_.model),1)):R("",!0)]),n("span",Id,f(d(_.timestamp)),1)]),n("div",Md,f(v(_.rawMessage,150)),1),o.value.has(w)?(c(),u("div",Rd,[n("div",Ed,[k[5]||(k[5]=n("h4",null,"错误信息",-1)),n("pre",Pd,f(_.rawMessage||"无详细信息"),1)]),(K=_.toolChain)!=null&&K.length?(c(),u("div",Dd,[k[6]||(k[6]=n("h4",null,"工具调用链(错误前)",-1)),n("div",Fd,[(c(!0),u(Y,null,ct(_.toolChain,(N,Z)=>(c(),u("div",{key:Z,class:"tool-item"},[n("span",Ld,f(Z+1),1),n("span",Od,f(N.toolName),1),n("span",Nd,f(d(N.timestamp)),1)]))),128))])])):R("",!0),(P=_.suggestions)!=null&&P.length?(c(),u("div",jd,[k[7]||(k[7]=n("h4",null,"修复建议",-1)),n("ul",Ud,[(c(!0),u(Y,null,ct(_.suggestions,(N,Z)=>(c(),u("li",{key:Z},f(N),1))),128))])])):R("",!0),n("div",Vd,[n("span",null,"Session: "+f(_.sessionFile),1),n("span",null,"Turn: "+f(_.turnIndex),1)])])):R("",!0)],10,wd)}),128))])):(c(),u("div",$d," ✅ 暂无错误记录 ")),(M=l.value)!=null&&M.byType&&Object.keys(l.value.byType).length>0?(c(),u("div",Wd,[k[8]||(k[8]=n("h4",null,"错误类型分布",-1)),n("div",Hd,[(c(!0),u(Y,null,ct(l.value.byType,(_,w)=>(c(),u("div",{key:w,class:"type-bar"},[n("span",Bd,f(r(w)),1),n("div",Kd,[n("div",{class:"bar-fill",style:St({width:p(_,l.value.total)})},null,4)]),n("span",qd,f(_),1)]))),128))])])):R("",!0)])}}}),zd=Ct(Gd,[["__scopeId","data-v-bc05715d"]]),Jd={class:"header"},Qd={class:"content"},Yd={class:"section"},Xd={class:"status-info"},Zd={class:"status-text"},tf={key:0,class:"section"},ef={key:1,class:"section"},sf={key:2,class:"section"},nf={class:"error-info"},lf={class:"error-type"},of={class:"error-message"},af={key:3,class:"section"},rf={class:"diagnostic-header"},cf={class:"diagnostic-icon"},uf={class:"diagnostic-title"},df={class:"diagnostic-content"},ff={class:"diagnostic-item"},hf={class:"item-value highlight"},pf={key:0,class:"diagnostic-item"},vf={class:"item-value"},gf={key:1,class:"diagnostic-item"},mf={class:"item-value"},_f={class:"diagnostic-actions"},yf={class:"section"},bf={class:"activity-list"},$f={key:0,class:"activity-item working"},kf={key:1,class:"activity-item idle"},wf={key:2,class:"activity-item down"},Cf={class:"section"},Tf={class:"view-tabs"},Sf={key:0,class:"timeline-container"},xf={key:1,class:"chain-container"},Af={key:2,class:"advanced-container"},If={class:"advanced-section"},Mf={class:"advanced-section"},Rf=5*60*1e3,Ef=15*60*1e3,Pf=wt({__name:"AgentDetailPanel",props:{agent:{}},emits:["close"],setup(t){const e=t,s=W("timeline"),l=W(null),i=W(Date.now());let o=null;const a=Q(()=>({idle:"空闲",working:"工作中",down:"异常"})[e.agent.status]||"未知"),r=Q(()=>{if(e.agent.status!=="working")return null;const T=e.agent.lastActiveAt||0,b=i.value-T;return b>Ef?{isStuck:!0,idleMinutes:Math.floor(b/6e4),severity:"critical",label:"严重卡顿"}:b>Rf?{isStuck:!0,idleMinutes:Math.floor(b/6e4),severity:"warning",label:"可能卡顿"}:null}),d=Q(()=>{var _;if(!((_=l.value)!=null&&_.archiveAtMs))return null;const T=l.value.archiveAtMs-i.value;if(T<=0)return"即将超时";const b=Math.floor(T/6e4),M=Math.floor(T%6e4/1e3);return`${b}分${M}秒`}),v=Q(()=>{if(!p.value.length)return null;const T=p.value[p.value.length-1];if(T.role==="toolResult"){const b=T.content[0];if(b){const M=b.text||b.content||"";return{tool:T.toolName||"未知工具",status:b.status||"completed",result:M.slice(0,100)||"(无输出)"}}}return null}),p=W([]),C=W(!1);async function I(){var T;if((T=e.agent)!=null&&T.id){C.value=!0;try{const b=await fetch(`/api/agents/${e.agent.id}/output?limit=30`);if(b.ok){const M=await b.json();p.value=M.turns||[]}else p.value=[]}catch{p.value=[]}finally{C.value=!1}}}async function S(){if(e.agent.status!=="working"){l.value=null;return}try{const T=await fetch("/api/chains?limit=10");if(T.ok){const M=(await T.json()).activeChain;if(M!=null&&M.nodes){const _=M.nodes.find(w=>w.agentId===e.agent.id);_&&_.status==="running"&&(l.value={runId:M.chainId,status:"running",startedAt:_.startedAt,archiveAtMs:M.archiveAtMs})}}}catch{}}async function k(){var T;if((T=l.value)!=null&&T.runId&&confirm("确定要取消这个任务吗?"))try{alert("取消功能需要 OpenClaw 支持,请使用命令行: openclaw subagents cancel "+l.value.runId)}catch(b){console.error("Cancel failed:",b)}}function x(){I(),S()}return Bt(()=>{var T;return(T=e.agent)==null?void 0:T.id},()=>{I(),S()},{immediate:!0}),Bt(()=>e.agent.status,S),Nt(()=>{o=setInterval(()=>{i.value=Date.now()},1e3)}),ae(()=>{o&&(clearInterval(o),o=null)}),(T,b)=>(c(),u("div",{class:"panel-overlay",onClick:b[5]||(b[5]=M=>T.$emit("close"))},[n("div",{class:"panel",onClick:b[4]||(b[4]=le(()=>{},["stop"]))},[n("div",Jd,[n("h2",null,f(t.agent.name),1),n("button",{class:"close-btn",onClick:b[0]||(b[0]=M=>T.$emit("close"))},"×")]),n("div",Qd,[n("div",Yd,[b[6]||(b[6]=n("h3",null,"状态",-1)),n("div",Xd,[n("span",{class:nt(["status-dot",`status-${t.agent.status}`])},null,2),n("span",Zd,f(a.value),1)])]),t.agent.currentTask?(c(),u("div",tf,[b[7]||(b[7]=n("h3",null,"当前任务",-1)),n("p",null,f(t.agent.currentTask),1)])):R("",!0),t.agent.lastActiveFormatted?(c(),u("div",ef,[b[8]||(b[8]=n("h3",null,"最后活跃",-1)),n("p",null,f(t.agent.lastActiveFormatted),1)])):R("",!0),t.agent.error?(c(),u("div",sf,[b[9]||(b[9]=n("h3",{class:"error-title"},"错误信息",-1)),n("div",nf,[n("div",lf,f(t.agent.error.type),1),n("div",of,f(t.agent.error.message),1)])])):R("",!0),r.value?(c(),u("div",af,[n("div",{class:nt(["diagnostic-panel",`severity-${r.value.severity}`])},[n("div",rf,[n("span",cf,f(r.value.severity==="critical"?"🚨":"⚠️"),1),n("span",uf,f(r.value.label)+"检测",1)]),n("div",df,[n("div",ff,[b[10]||(b[10]=n("span",{class:"item-label"},"无响应时间:",-1)),n("span",hf,f(r.value.idleMinutes)+" 分钟",1)]),v.value?(c(),u("div",pf,[b[11]||(b[11]=n("span",{class:"item-label"},"最后操作:",-1)),n("span",vf,f(v.value.tool)+" → "+f(v.value.result),1)])):R("",!0),d.value?(c(),u("div",gf,[b[12]||(b[12]=n("span",{class:"item-label"},"自动超时:",-1)),n("span",mf,f(d.value),1)])):R("",!0),b[13]||(b[13]=n("div",{class:"diagnostic-hint"},[n("div",{class:"hint-title"},"可能原因:"),n("ul",null,[n("li",null,"LLM API 响应超时"),n("li",null,"网络连接问题"),n("li",null,"API 配额限制")])],-1)),n("div",_f,[l.value?(c(),u("button",{key:0,class:"action-btn primary",onClick:k}," 取消任务 ")):R("",!0),n("button",{class:"action-btn",onClick:x}," 刷新状态 ")])])],2)])):R("",!0),n("div",yf,[b[14]||(b[14]=n("h3",null,"最近活动",-1)),n("div",bf,[t.agent.status==="working"?(c(),u("div",$f," 💼 正在执行任务... ")):t.agent.status==="idle"?(c(),u("div",kf," 😴 空闲中 ")):t.agent.status==="down"?(c(),u("div",wf," ⚠️ 检测到错误 ")):R("",!0)])]),n("div",Cf,[n("div",Tf,[n("button",{class:nt(["tab-btn",{active:s.value==="timeline"}]),onClick:b[1]||(b[1]=M=>s.value="timeline")}," 📊 时序视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="chain"}]),onClick:b[2]||(b[2]=M=>s.value="chain")}," 🔗 链路视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="advanced"}]),onClick:b[3]||(b[3]=M=>s.value="advanced")}," ⚙️ 高级 ",2)]),s.value==="timeline"?(c(),u("div",Sf,[bt(rs(wc),{agentId:t.agent.id,autoRefresh:!0,refreshInterval:3},null,8,["agentId"])])):s.value==="chain"?(c(),u("div",xf,[bt(rs(Cu),{autoRefresh:!0,refreshInterval:10})])):s.value==="advanced"?(c(),u("div",Af,[n("div",If,[b[15]||(b[15]=n("h4",null,"⚙️ 配置",-1)),bt(ad,{agentId:t.agent.id},null,8,["agentId"])]),n("div",Mf,[b[16]||(b[16]=n("h4",null,"🔍 错误分析",-1)),bt(zd,{agentId:t.agent.id},null,8,["agentId"])])])):R("",!0)])])])]))}}),Df=Ct(Pf,[["__scopeId","data-v-cceac268"]]),Ff={class:"settings-panel"},Lf={class:"header"},Of={class:"content"},Nf={class:"setting-item"},jf={class:"setting-item"},Uf={class:"setting-item"},Vf={class:"setting-item"},Wf={class:"setting-item"},Hf={class:"setting-item"},Bf={class:"setting-item"},Kf={class:"setting-item"},qf=wt({__name:"SettingsPanel",emits:["close"],setup(t,{emit:e}){const s=e,l=W(10),i=W(!0),o=W(!0),a=W(!0),r=W(!0),d=W(!1),v=W(100),p=W(!0);function C(){const S=localStorage.getItem("dashboard-settings");if(S)try{const k=JSON.parse(S);l.value=k.refreshInterval||10,i.value=k.autoRefreshEnabled!==!1,o.value=k.showTimestamps!==!1,a.value=k.showTokens!==!1,r.value=k.notifyOnError!==!1,d.value=k.notifyOnComplete||!1,v.value=k.logLines||100,p.value=k.autoScrollLog!==!1}catch(k){console.error("加载设置失败:",k)}}function I(){const S={refreshInterval:l.value,autoRefreshEnabled:i.value,showTimestamps:o.value,showTokens:a.value,notifyOnError:r.value,notifyOnComplete:d.value,logLines:v.value,autoScrollLog:p.value};localStorage.setItem("dashboard-settings",JSON.stringify(S)),s("settings-changed",S)}return Nt(()=>{C()}),(S,k)=>(c(),u("div",Ff,[n("div",Lf,[k[9]||(k[9]=n("h2",null,"设置",-1)),n("button",{class:"close-btn",onClick:k[0]||(k[0]=x=>S.$emit("close"))},"×")]),n("div",Of,[n("section",null,[k[12]||(k[12]=n("h3",null,"自动刷新",-1)),n("div",Nf,[k[10]||(k[10]=n("label",null,"刷新间隔(秒)",-1)),Tt(n("input",{type:"number","onUpdate:modelValue":k[1]||(k[1]=x=>l.value=x),min:"1",max:"300",onChange:I},null,544),[[jn,l.value,void 0,{number:!0}]])]),n("div",jf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[2]||(k[2]=x=>i.value=x),onChange:I},null,544),[[Le,i.value]]),k[11]||(k[11]=At(" 启用自动刷新 ",-1))])])]),n("section",null,[k[15]||(k[15]=n("h3",null,"显示选项",-1)),n("div",Uf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[3]||(k[3]=x=>o.value=x),onChange:I},null,544),[[Le,o.value]]),k[13]||(k[13]=At(" 显示时间戳 ",-1))])]),n("div",Vf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[4]||(k[4]=x=>a.value=x),onChange:I},null,544),[[Le,a.value]]),k[14]||(k[14]=At(" 显示 Token 消耗 ",-1))])])]),n("section",null,[k[18]||(k[18]=n("h3",null,"通知",-1)),n("div",Wf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[5]||(k[5]=x=>r.value=x),onChange:I},null,544),[[Le,r.value]]),k[16]||(k[16]=At(" Agent 异常时通知 ",-1))])]),n("div",Hf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[6]||(k[6]=x=>d.value=x),onChange:I},null,544),[[Le,d.value]]),k[17]||(k[17]=At(" 任务完成时通知 ",-1))])])]),n("section",null,[k[22]||(k[22]=n("h3",null,"日志查看",-1)),n("div",Bf,[k[20]||(k[20]=n("label",null,"日志行数",-1)),Tt(n("select",{"onUpdate:modelValue":k[7]||(k[7]=x=>v.value=x),onChange:I},[...k[19]||(k[19]=[n("option",{value:50},"50 行",-1),n("option",{value:100},"100 行",-1),n("option",{value:200},"200 行",-1),n("option",{value:500},"500 行",-1)])],544),[[Pe,v.value]])]),n("div",Kf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[8]||(k[8]=x=>p.value=x),onChange:I},null,544),[[Le,p.value]]),k[21]||(k[21]=At(" 自动滚动日志 ",-1))])])])])]))}}),Gf=Ct(qf,[["__scopeId","data-v-e5b26232"]]);function zf(t,e=300){const s=W(null);let l=null;const i=(...r)=>{l=r,s.value&&clearTimeout(s.value),s.value=setTimeout(()=>{t(...r),s.value=null,l=null},e)},o=()=>{s.value&&(clearTimeout(s.value),s.value=null,l=null)},a=()=>{s.value&&l&&(clearTimeout(s.value),t(...l),s.value=null,l=null)};return ae(()=>{o()}),{debouncedFn:i,cancel:o,flush:a}}class Jf{constructor(e={}){this.ws=null,this.connectionState={status:"disconnected",reconnectAttempts:0},this.subscribers=new Map,this.reconnectTimer=null,this.pollingTimer=null,this.heartbeatTimer=null,this.stateListeners=new Set,this.options={wsUrl:e.wsUrl||`ws://${window.location.host}/ws`,httpFallback:e.httpFallback??!0,reconnectMaxAttempts:e.reconnectMaxAttempts??5,reconnectDelay:e.reconnectDelay??3e3,pollingInterval:e.pollingInterval??1e4}}connect(){var e;if(((e=this.ws)==null?void 0:e.readyState)!==WebSocket.OPEN){this.updateConnectionState({status:"connecting",reconnectAttempts:this.connectionState.reconnectAttempts});try{this.ws=new WebSocket(this.options.wsUrl),this.ws.onopen=()=>{this.updateConnectionState({status:"connected",lastConnected:Date.now(),reconnectAttempts:0}),this.startHeartbeat(),this.stopPolling()},this.ws.onclose=()=>{this.stopHeartbeat(),this.handleDisconnect()},this.ws.onerror=s=>{console.error("WebSocket error:",s),this.updateConnectionState({status:"error",errorMessage:"WebSocket connection failed"}),this.handleDisconnect()},this.ws.onmessage=s=>{try{const l=JSON.parse(s.data);this.handleMessage(l)}catch(l){console.error("Failed to parse WebSocket message:",l)}}}catch(s){console.error("Failed to create WebSocket:",s),this.handleDisconnect()}}}disconnect(){this.stopHeartbeat(),this.stopReconnect(),this.stopPolling(),this.ws&&(this.ws.close(),this.ws=null),this.updateConnectionState({status:"disconnected",reconnectAttempts:0})}getConnectionState(){return{...this.connectionState}}subscribe(e,s){return this.subscribers.has(e)||this.subscribers.set(e,new Set),this.subscribers.get(e).add(s),()=>{var l;(l=this.subscribers.get(e))==null||l.delete(s)}}onStateChange(e){return this.stateListeners.add(e),()=>{this.stateListeners.delete(e)}}isConnected(){return this.connectionState.status==="connected"}async fetchInitialData(){try{const[e,s,l,i]=await Promise.all([fetch("/api/collaboration").then(o=>o.json()).catch(()=>null),fetch("/api/tasks").then(o=>o.json()).catch(()=>null),fetch("/api/performance?range=20m").then(o=>o.json()).catch(()=>null),fetch("/api/agents").then(o=>o.json()).catch(()=>null)]);e&&this.emit("collaboration",e),s&&this.emit("tasks",s),l&&this.emit("performance",l),i&&this.emit("agents",i)}catch(e){console.error("Failed to fetch initial data:",e)}}handleMessage(e){if(e.type==="ping"){this.send({type:"pong",timestamp:Date.now()});return}if(e.type==="full_state"&&e.data){const s=e.data;s.agents&&this.emit("agents",s.agents),s.subagents&&this.emit("subagents",s.subagents),s.collaboration&&this.emit("collaboration",s.collaboration);const l=Array.isArray(s.tasks)?s.tasks:[];this.emit("tasks",{tasks:l}),s.performance&&this.emit("performance",s.performance);return}if(e.type==="state_update"&&e.data){const s=e.data;s.agents&&this.emit("agents_update",s.agents);return}e.channel&&e.data&&this.emit(e.channel,e.data)}emit(e,s){const l=this.subscribers.get(e);l&&l.forEach(i=>{try{i(s)}catch(o){console.error(`Error in subscriber callback for ${e}:`,o)}})}send(e){var s;((s=this.ws)==null?void 0:s.readyState)===WebSocket.OPEN&&this.ws.send(JSON.stringify(e))}handleDisconnect(){this.connectionState.reconnectAttempts<this.options.reconnectMaxAttempts?this.scheduleReconnect():this.options.httpFallback&&this.startPolling()}scheduleReconnect(){this.stopReconnect();const e=this.options.reconnectDelay*Math.pow(1.5,this.connectionState.reconnectAttempts);this.reconnectTimer=setTimeout(()=>{this.updateConnectionState({status:"connecting",reconnectAttempts:this.connectionState.reconnectAttempts+1}),this.connect()},e)}stopReconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}startHeartbeat(){this.stopHeartbeat(),this.heartbeatTimer=setInterval(()=>{this.send({type:"ping",timestamp:Date.now()})},3e4)}stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null)}startPolling(){this.stopPolling(),this.updateConnectionState({status:"connected",errorMessage:"Using HTTP polling fallback"}),this.fetchInitialData(),this.pollingTimer=setInterval(()=>{this.fetchInitialData()},this.options.pollingInterval)}stopPolling(){this.pollingTimer&&(clearInterval(this.pollingTimer),this.pollingTimer=null)}updateConnectionState(e){this.connectionState={...this.connectionState,...e},this.stateListeners.forEach(s=>{try{s(this.connectionState)}catch(l){console.error("Error in state listener:",l)}})}}let tn=null;function Fi(t){return tn||(tn=new Jf(t)),tn}class Qf{constructor(){this.state=new Map,this.cache=new Map,this.defaultTTL=5e3}getState(e){const s=this.state.get(e);return s==null?void 0:s.value}setState(e,s){const l=this.state.get(e);l?l.value=s:this.state.set(e,W(s))}useStore(e,s){const l=this.state.get(e);if(l)return l;const i=W(s);return this.state.set(e,i),i}getCache(e){const s=this.cache.get(e);if(s){if(Date.now()>s.expiresAt){this.cache.delete(e);return}return s.value}}setCache(e,s,l){this.cache.set(e,{value:s,expiresAt:Date.now()+(l??this.defaultTTL)})}hasValidCache(e){const s=this.cache.get(e);return s?Date.now()<=s.expiresAt:!1}invalidateCache(e){this.cache.delete(e)}batchUpdate(e){Object.entries(e).forEach(([s,l])=>{this.setState(s,l)})}clearAll(){this.state.clear(),this.cache.clear()}clearCache(){this.cache.clear()}}let en=null;function Yf(){return en||(en=new Qf),en}class Xf{constructor(){this.listeners=new Map,this.eventQueue=[],this.isFlushing=!1,this.maxQueueSize=100}emit(e,s){const l=this.listeners.get(e);l&&l.forEach(i=>{try{i(s)}catch(o){console.error(`Error in event handler for ${e}:`,o)}})}on(e,s){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(s),()=>{var l;(l=this.listeners.get(e))==null||l.delete(s)}}once(e,s){const l=i=>{this.off(e,l),s(i)};this.on(e,l)}off(e,s){var l;(l=this.listeners.get(e))==null||l.delete(s)}enqueue(e,s){this.eventQueue.length>=this.maxQueueSize&&(console.warn("Event queue is full, dropping oldest event"),this.eventQueue.shift()),this.eventQueue.push({event:e,payload:s})}flush(){if(!this.isFlushing){this.isFlushing=!0;try{for(;this.eventQueue.length>0;){const{event:e,payload:s}=this.eventQueue.shift();this.emit(e,s)}}finally{this.isFlushing=!1}}}getQueueLength(){return this.eventQueue.length}clearQueue(){this.eventQueue=[]}clearAll(){this.listeners.clear(),this.eventQueue=[]}}let sn=null;function Zf(){return sn||(sn=new Xf),sn}function Li(){const t=Fi(),e=W(t.getConnectionState()),s=W(!1);let l=null;const i=(r,d)=>t.subscribe(r,d),o=()=>{t.connect()},a=()=>{t.disconnect()};return Nt(()=>{l=t.onStateChange(r=>{e.value=r,s.value=r.status==="connected"}),t.isConnected()||t.connect()}),ae(()=>{l&&l()}),{connectionState:e,isConnected:s,subscribe:i,connect:o,disconnect:a}}const th={class:"indicator-icon"},eh={key:0,class:"indicator-count"},sh={class:"card-header"},nh={class:"avatar"},lh={class:"header-info"},ih={class:"name"},oh={class:"status-text"},ah={key:0,class:"main-badge"},rh={class:"card-body"},ch={key:0,class:"model-row"},uh={class:"model-value"},dh=["title"],fh={key:0,class:"fallback-more"},hh={key:1,class:"current-task"},ph=["title"],vh={key:0,class:"task-child-info"},gh={class:"child-name"},mh={key:2,class:"multi-tasks"},_h={class:"tasks-count"},yh={class:"tasks-toggle"},bh=["title"],$h={key:0,class:"task-child-agent"},kh={key:0,class:"tasks-more"},wh={class:"action-icon"},Ch={class:"action-text"},Th={key:4,class:"idle-hint"},Sh={class:"warning-modal"},xh={class:"modal-header"},Ah={class:"modal-icon"},Ih={class:"modal-title"},Mh={class:"modal-body"},Rh={class:"detail-row"},Eh={class:"detail-value error-type-tag"},Ph={class:"detail-row"},Dh={class:"detail-value"},Fh={class:"detail-row"},Lh={class:"detail-value highlight"},Oh={key:0,class:"detail-row"},Nh={class:"detail-value"},jh={key:1,class:"detail-row"},Uh={class:"detail-value"},Vh={key:2,class:"detail-row"},Wh={key:0,class:"waiting-task"},Hh={key:3,class:"stuck-suggestion"},Bh=wt({__name:"AgentCard",props:{agent:{},modelInfo:{},isMain:{type:Boolean},currentTask:{},error:{},stuckWarning:{},hierarchyDepth:{},agentColor:{},subStatus:{},currentAction:{},toolName:{},waitingFor:{},agentTasks:{}},emits:["click","navigate-agent"],setup(t,{emit:e}){const s=t,l=e,i=W(!1),o=W(!1),a=["🤖","👤","📊","🏗️","💻","🧪","🔧","📋","🎯","⚙️"],r=Q(()=>{const P=(s.agent.name||"").toLowerCase();if(P.includes("pm")||P.includes("project")||P.includes("主"))return"👨💼";if(P.includes("analyst")||P.includes("分析"))return"📊";if(P.includes("architect")||P.includes("架构"))return"🏗️";if(P.includes("dev")||P.includes("开发"))return"💻";if(P.includes("qa")||P.includes("test")||P.includes("测试"))return"🧪";if(P.includes("ops")||P.includes("运维"))return"🔧";if(P.includes("frontend")||P.includes("前端"))return"🎨";if(P.includes("backend")||P.includes("后端"))return"⚙️";let N=0;for(let Z=0;Z<P.length;Z++)N=(N<<5)-N+P.charCodeAt(Z);return a[Math.abs(N)%a.length]}),d=Q(()=>({idle:"空闲",working:"工作中",down:"异常"})[s.agent.status]||"未知"),v=Q(()=>{var P;return((P=s.agentTasks)==null?void 0:P.length)||0}),p=Q(()=>s.isMain&&v.value>=2),C=Q(()=>s.agentTasks?s.agentTasks.slice(0,3):[]),I=Q(()=>s.agentTasks?Math.max(0,s.agentTasks.length-3):0),S=Q(()=>s.agentTasks&&s.agentTasks.length===1?s.agentTasks[0].name:s.currentTask),k=Q(()=>{if(s.agentTasks&&s.agentTasks.length===1)return s.agentTasks[0].childAgentId}),x=Q(()=>({thinking:"🧠",tool_executing:"⚙️",waiting_llm:"📡",waiting_child:"⏳"})[s.subStatus||""]||"🔄"),T=Q(()=>{var N;return{"rate-limit":"请求过快","token-limit":"Token 超限",timeout:"请求超时",quota:"余额不足",unknown:"发生错误"}[((N=s.error)==null?void 0:N.type)||"unknown"]||"发生错误"}),b=Q(()=>{var N;return{waiting_for_child:"等待子代理响应",self_busy:"自身处理中",unknown:"原因未明"}[((N=s.stuckWarning)==null?void 0:N.reason)||"unknown"]||"原因未明"}),M=Q(()=>{if(!s.stuckWarning)return null;const P=s.stuckWarning.reason,N=s.stuckWarning.idleSeconds;return P==="waiting_for_child"?N>180?"子代理响应时间过长,建议检查子代理状态或考虑终止任务":"子代理正在执行任务,请耐心等待":P==="self_busy"?N>120?"任务处理时间过长,可能遇到复杂问题或外部资源阻塞":"正在处理复杂任务,请稍候":null});function _(P){const N=P.split("/");return N[N.length-1]||P}function w(){i.value=!0}function K(P){l("navigate-agent",P),i.value=!1}return(P,N)=>{var Z;return c(),u("div",{class:nt(["agent-card",[`status-${t.agent.status}`,{"is-main":t.isMain}]]),onClick:N[4]||(N[4]=F=>P.$emit("click"))},[t.error||t.stuckWarning?(c(),u("div",{key:0,class:nt(["warning-indicator",{"has-error":t.error}]),onClick:le(w,["stop"])},[n("span",th,f(t.error?"⚠️":"⏳"),1),t.stuckWarning?(c(),u("span",eh,f(t.stuckWarning.idleSeconds)+"s",1)):R("",!0)],2)):R("",!0),n("div",sh,[n("div",nh,f(r.value),1),n("div",lh,[n("div",ih,f(t.agent.name),1),n("div",{class:nt(["status-pill",`status-${t.agent.status}`])},[n("span",{class:nt(["status-dot",`status-${t.agent.status}`])},null,2),n("span",oh,f(d.value),1)],2)]),t.isMain?(c(),u("div",ah,"PM")):R("",!0)]),n("div",rh,[t.modelInfo&&t.modelInfo.primary?(c(),u("div",ch,[N[5]||(N[5]=n("span",{class:"model-label"},"模型",-1)),n("span",uh,f(_(t.modelInfo.primary)),1),(Z=t.modelInfo.fallbacks)!=null&&Z.length?(c(),u("span",{key:0,class:"model-fallbacks",title:"备用: "+t.modelInfo.fallbacks.map(_).join(", ")},[(c(!0),u(Y,null,ct(t.modelInfo.fallbacks.slice(0,2),(F,q)=>(c(),u("span",{key:F,class:"fallback-tag"},f(_(F)),1))),128)),t.modelInfo.fallbacks.length>2?(c(),u("span",fh,"+"+f(t.modelInfo.fallbacks.length-2),1)):R("",!0)],8,dh)):R("",!0)])):R("",!0),S.value&&!p.value?(c(),u("div",hh,[N[7]||(N[7]=n("div",{class:"task-header"},[n("span",{class:"task-icon"},"▶"),n("span",{class:"task-label"},"当前任务")],-1)),n("div",{class:"task-name",title:S.value},f(S.value),9,ph),k.value?(c(),u("div",vh,[N[6]||(N[6]=n("span",{class:"child-arrow"},"→",-1)),n("span",gh,f(k.value),1)])):R("",!0)])):R("",!0),p.value?(c(),u("div",mh,[n("div",{class:"tasks-header",onClick:N[0]||(N[0]=le(F=>o.value=!o.value,["stop"]))},[N[8]||(N[8]=n("span",{class:"tasks-icon"},"📋",-1)),N[9]||(N[9]=n("span",{class:"tasks-label"},"并行任务",-1)),n("span",_h,f(v.value),1),n("span",yh,f(o.value?"▲":"▼"),1)]),n("div",{class:nt(["tasks-list",{expanded:o.value}])},[(c(!0),u(Y,null,ct(C.value,F=>(c(),u("div",{key:F.id,class:nt(["task-item",`task-status-${F.status}`])},[N[10]||(N[10]=n("span",{class:"task-status-dot"},null,-1)),n("span",{class:"task-name",title:F.name},f(F.name),9,bh),F.childAgentId?(c(),u("span",$h,"→ "+f(F.childAgentId),1)):R("",!0)],2))),128)),I.value>0?(c(),u("div",kh," +"+f(I.value)+" 更多任务 ",1)):R("",!0)],2)])):R("",!0),t.agent.status==="working"&&t.currentAction?(c(),u("div",{key:3,class:nt(["status-detail",`sub-status-${t.subStatus}`])},[n("span",wh,f(x.value),1),n("span",Ch,f(t.currentAction),1)],2)):t.agent.status==="idle"?(c(),u("div",Th," 空闲中,等待任务... ")):R("",!0)]),(c(),Gt(Po,{to:"body"},[i.value?(c(),u("div",{key:0,class:"warning-modal-overlay",onClick:N[3]||(N[3]=le(F=>i.value=!1,["self"]))},[n("div",Sh,[n("div",xh,[n("span",Ah,f(t.error?"⚠️":"⏳"),1),n("span",Ih,f(t.error?"异常详情":"卡顿分析"),1),n("button",{class:"modal-close",onClick:N[1]||(N[1]=F=>i.value=!1)},"×")]),n("div",Mh,[t.error?(c(),u(Y,{key:0},[n("div",Rh,[N[11]||(N[11]=n("span",{class:"detail-label"},"类型",-1)),n("span",Eh,f(T.value),1)]),n("div",Ph,[N[12]||(N[12]=n("span",{class:"detail-label"},"信息",-1)),n("span",Dh,f(t.error.message),1)])],64)):t.stuckWarning?(c(),u(Y,{key:1},[n("div",Fh,[N[13]||(N[13]=n("span",{class:"detail-label"},"等待时间",-1)),n("span",Lh,f(t.stuckWarning.idleSeconds)+" 秒",1)]),t.stuckWarning.reason?(c(),u("div",Oh,[N[14]||(N[14]=n("span",{class:"detail-label"},"原因",-1)),n("span",Nh,f(b.value),1)])):R("",!0),t.stuckWarning.reasonDetail?(c(),u("div",jh,[N[15]||(N[15]=n("span",{class:"detail-label"},"详情",-1)),n("span",Uh,f(t.stuckWarning.reasonDetail),1)])):R("",!0),t.stuckWarning.waitingFor?(c(),u("div",Vh,[N[16]||(N[16]=n("span",{class:"detail-label"},"等待对象",-1)),n("span",{class:"detail-value agent-link",onClick:N[2]||(N[2]=F=>K(t.stuckWarning.waitingFor.agentId))},[At(f(t.stuckWarning.waitingFor.agentId)+" ",1),t.stuckWarning.waitingFor.task?(c(),u("span",Wh,"("+f(t.stuckWarning.waitingFor.task)+")",1)):R("",!0)])])):R("",!0),M.value?(c(),u("div",Hh,[N[17]||(N[17]=n("span",{class:"suggestion-icon"},"💡",-1)),n("span",null,f(M.value),1)])):R("",!0)],64)):R("",!0)])])])):R("",!0)]))],2)}}}),Kh=Ct(Bh,[["__scopeId","data-v-04c4a970"]]),qh={class:"collaboration-flow-section"},Gh={class:"section-header"},zh={class:"header-right"},Jh={key:0,class:"flow-legend flow-legend-inline"},Qh={class:"legend-name"},Yh={class:"indicator-text"},Xh={class:"flow-container",ref:"flowContainerRef"},Zh={key:0,class:"loading-state"},tp={key:1,class:"error-state"},ep={key:2,class:"empty-state"},sp={key:3,class:"flow-layout"},np={class:"level-header"},lp={class:"level-badge"},ip={class:"level-title"},op={class:"level-cards"},ap=["onClick"],rp=["d"],cp={key:0,r:"5",fill:"url(#lightGradient)"},up={dur:"2s",repeatCount:"1",rotate:"0"},dp=["href"],fp={key:0,class:"model-panel"},hp={class:"model-toggle-icon"},pp={class:"model-panel-body"},vp={class:"model-name"},gp={class:"model-dots"},mp=["title","onClick"],_p={class:"model-count"},yp={class:"call-detail-modal"},bp={class:"call-detail-header"},$p={class:"call-detail-body"},kp={class:"call-detail-row"},wp={class:"value"},Cp={class:"call-detail-row"},Tp={class:"value"},Sp={class:"call-detail-row"},xp={class:"value"},Ap={class:"call-detail-row"},Ip={class:"value"},Mp={class:"call-detail-row trigger"},Rp={class:"value"},Ep=1500,Pp=wt({__name:"CollaborationFlowSection",props:{mainAgent:{},subAgents:{},mainAgentId:{}},emits:["agent-click"],setup(t,{emit:e}){const s=t,l=e,{connectionState:i,subscribe:o}=Li(),a=W([]),r=W([]),d=W([]),v=W({}),p=W([]),C=W(!0),I=W(null),S=W(null),k=W({}),x=W({}),T=W(""),b=W(!0),M=W({}),_=W(null),w=W(null),K=W({});function P(g,m){m&&(K.value[g]=m)}const N=Q(()=>s.mainAgentId?s.mainAgentId:T.value?T.value:"main"),Z=Q(()=>a.value.filter(g=>g.type==="agent")),F=Q(()=>a.value.filter(g=>g.type==="model")),q=Q(()=>r.value.filter(g=>g.type==="delegates")),G=Q(()=>{const g={};for(const O of Z.value){const D=X(O.id);g[D]||(g[D]=[]),g[D].push(O)}const m={};return Object.keys(g).map(Number).sort((O,D)=>O-D).forEach(O=>{m[O]=g[O]}),m});function A(g){return g===0?"主控":g===1?"一级子代理":`${g}级子代理`}const st={"analyst-agent":"#10b981","architect-agent":"#f59e0b","devops-agent":"#8b5cf6","test-agent":"#ec4899","frontend-agent":"#06b6d4","backend-agent":"#f43f5e"};function mt(g){return g===N.value?"#4a9eff":st[g]||"#64748b"}const L=Q(()=>Z.value.map(g=>g.id).filter(Boolean)),U=Q(()=>({connected:"已连接",connecting:"连接中...",disconnected:"未连接",error:"连接错误"})[i.value.status]||"未知");function X(g){return g===N.value?x.value[g]??0:x.value[g]??1}function it(g){const m=Z.value.find(O=>O.id===g);return(m==null?void 0:m.name)||g}function V(g){var D;const m=j=>j==="error"?"down":j,O=g.id===N.value?s.mainAgent:(D=s.subAgents)==null?void 0:D.find(j=>j.id===g.id);if(O&&g.type==="agent"){const j=ot(g.id);let $;const J=g.status==="idle"||g.status==="error";J||((j==null?void 0:j.length)===1?$=j[0].name:j&&j.length>1&&($=`${j.length} 个任务进行中`));const z=J?void 0:O.currentTask;return{name:O.name,status:m(g.status),currentTask:$??z,lastActiveFormatted:O.lastActiveFormatted}}return O?{name:O.name,status:O.status,currentTask:O.currentTask,lastActiveFormatted:O.lastActiveFormatted}:{name:g.name,status:m(g.status)}}function H(g){if(g.type!=="agent")return;const m=v.value[g.id];if(m)return m;const O=g.id.toLowerCase();for(const[D,j]of Object.entries(v.value))if(D.toLowerCase()===O)return j}function ot(g){const m=M.value,O=m[g];if(O!=null&&O.length)return O;const D=g.toLowerCase();for(const[j,$]of Object.entries(m))if(j.toLowerCase()===D&&($!=null&&$.length))return $}function lt(g){if(d.value.includes(g.id))return!0;const m=g.id.toLowerCase();return d.value.some(O=>O.toLowerCase()===m)}function ft(g){const m=d.value,O=D=>m.includes(D)||m.some(j=>j.toLowerCase()===D.toLowerCase());return O(g.source)&&O(g.target)}function tt(g){const m=K.value[g.source],O=K.value[g.target],D=_.value;if(!m||!O||!D)return"";const j=D.getBoundingClientRect(),$=m.getBoundingClientRect(),J=O.getBoundingClientRect(),z=$.left-j.left+$.width/2,et=$.top-j.top+$.height,at=J.left-j.left+J.width/2,dt=J.top-j.top,vt=(et+dt)/2;return`M ${z} ${et} C ${z} ${vt}, ${at} ${vt}, ${at} ${dt}`}function kt(){Me(()=>{if(!_.value||!w.value)return;const g=_.value.getBoundingClientRect();w.value.setAttribute("width",String(g.width)),w.value.setAttribute("height",String(g.height))})}const It=Q(()=>{const g={};for(const m of p.value){const O=m.model||"(unknown)";g[O]||(g[O]=[]),g[O].push(m)}return g});function Dt(g){var D;const m=((D=g.metadata)==null?void 0:D.modelId)||"",O=m.split("/").pop()||m;return It.value[m]||It.value[O]||[]}function _e(g){return Dt(g).length>0}async function ye(){C.value=!0,I.value=null;try{const g=await fetch("/api/collaboration");if(!g.ok)throw new Error("Failed to fetch collaboration data");const m=await g.json();a.value=m.nodes||[],r.value=m.edges||[],d.value=m.activePath||[],v.value=m.agentModels||{},p.value=m.recentCalls||[],m.hierarchy&&(k.value=m.hierarchy),m.depths&&(x.value=m.depths),m.mainAgentId&&(T.value=m.mainAgentId),m.agentActiveTasks&&(M.value=m.agentActiveTasks),Me(kt)}catch(g){I.value=g.message}finally{C.value=!1}}function Qt(){ye()}function Se(g){const m=g;a.value=m.nodes||[],r.value=m.edges||[],d.value=m.activePath||[],v.value=m.agentModels||{},p.value=m.recentCalls||[],m.hierarchy&&(k.value=m.hierarchy),m.depths&&(x.value=m.depths),m.mainAgentId&&(T.value=m.mainAgentId),m.agentActiveTasks&&(M.value=m.agentActiveTasks),Me(kt)}function h(g){d.value=g.activePath||[],p.value=g.recentCalls||[],g.agentActiveTasks&&(M.value=g.agentActiveTasks);const m=a.value.filter($=>$.type==="agent");for(const $ of m){if($.id&&g.agentStatuses&&g.agentStatuses[$.id]!==void 0&&($.status=g.agentStatuses[$.id]),$.id&&g.agentDynamicStatuses&&g.agentDynamicStatuses[$.id]){const J=g.agentDynamicStatuses[$.id];$.subStatus=J.subStatus,$.currentAction=J.currentAction,$.toolName=J.toolName,$.waitingFor=J.waitingFor}if($.id&&g.agentDisplayStatuses&&g.agentDisplayStatuses[$.id]){const J=g.agentDisplayStatuses[$.id];$.currentAction=J.display,$.metadata||($.metadata={}),$.metadata={...$.metadata,duration:J.duration,alert:J.alert},J.alert?$.stuckWarning={isStuck:!0,idleSeconds:J.duration,lastUpdate:Date.now(),reason:"self_busy",reasonDetail:J.display}:$.stuckWarning&&!$.stuckWaitingForChildAgent&&($.stuckWarning=void 0)}}const O=new Set(a.value.filter($=>$.type==="task").map($=>$.id)),D=new Set((g.taskNodes||[]).map($=>$.id));if(O.size!==D.size||[...D].some($=>!O.has($))){const $=a.value.filter(z=>z.type==="model"),J=r.value.filter(z=>z.type==="delegates");a.value=[...m,...g.taskNodes||[],...$],r.value=[...J,...g.taskEdges||[]],Me(kt)}else{const $=new Map((g.taskNodes||[]).map(J=>[J.id,J]));for(const J of a.value.filter(z=>z.type==="task")){const z=$.get(J.id);z&&(J.status=z.status,J.name=z.name,z.timestamp&&(J.timestamp=z.timestamp))}}}async function y(){if(!(C.value||a.value.length===0))try{const g=await fetch("/api/collaboration/dynamic");if(!g.ok)return;const m=await g.json();h(m)}catch{}}let E=null,B=null;return Bt([Z,b],()=>{Me(kt)}),Nt(()=>{ye(),E=o("collaboration",Se),B=setInterval(y,Ep),window.addEventListener("resize",kt)}),ae(()=>{E&&E(),B&&clearInterval(B),window.removeEventListener("resize",kt)}),(g,m)=>{var O;return c(),u("div",qh,[n("div",Gh,[m[4]||(m[4]=n("h2",null,"协作流程",-1)),n("div",zh,[Z.value.length>0?(c(),u("div",Jh,[(c(!0),u(Y,null,ct(L.value,D=>(c(),u("div",{key:D,class:"legend-item"},[n("span",{class:"legend-dot",style:St({background:mt(D)})},null,4),n("span",Qh,f(it(D)),1)]))),128))])):R("",!0),n("div",{class:nt(["connection-indicator",rs(i).status])},[m[3]||(m[3]=n("span",{class:"indicator-dot"},null,-1)),n("span",Yh,f(U.value),1)],2)])]),n("div",Xh,[C.value?(c(),u("div",Zh,[...m[5]||(m[5]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载中...",-1)])])):I.value?(c(),u("div",tp,[m[6]||(m[6]=n("span",{class:"error-icon"},"⚠️",-1)),n("span",null,f(I.value),1),n("button",{onClick:Qt,class:"retry-btn"},"重试")])):a.value.length===0?(c(),u("div",ep,[...m[7]||(m[7]=[n("span",{class:"empty-icon"},"📭",-1),n("span",null,"暂无协作数据",-1)])])):(c(),u("div",sp,[n("div",{class:"agent-area",ref_key:"agentAreaRef",ref:_},[(c(!0),u(Y,null,ct(G.value,(D,j)=>(c(),u("div",{key:j,class:"level-section"},[n("div",np,[n("span",lp,"L"+f(j),1),n("span",ip,f(A(Number(j))),1)]),n("div",op,[(c(!0),u(Y,null,ct(D,$=>(c(),u("div",{key:$.id,class:nt(["agent-card-wrapper",{"main-agent":$.id===N.value,active:lt($),[`status-${$.status}`]:!0}]),style:St({"--agent-color":mt($.id)}),ref_for:!0,ref:J=>P($.id,J),onClick:J=>l("agent-click",$)},[bt(Kh,{agent:V($),"model-info":H($),"is-main":$.id===N.value,"current-task":$.currentTask,error:$.error,"stuck-warning":$.stuckWarning,"hierarchy-depth":X($.id),"agent-color":mt($.id),"sub-status":$.subStatus,"current-action":$.currentAction,"tool-name":$.toolName,"waiting-for":$.waitingFor,"agent-tasks":ot($.id)},null,8,["agent","model-info","is-main","current-task","error","stuck-warning","hierarchy-depth","agent-color","sub-status","current-action","tool-name","waiting-for","agent-tasks"])],14,ap))),128))])]))),128)),(c(),u("svg",{class:"edges-svg",ref_key:"edgesSvgRef",ref:w},[m[8]||(m[8]=n("defs",null,[n("linearGradient",{id:"lightGradient",x1:"0%",y1:"0%",x2:"100%",y2:"0%"},[n("stop",{offset:"0%",style:{"stop-color":"#4a9eff","stop-opacity":"0.2"}}),n("stop",{offset:"50%",style:{"stop-color":"#4a9eff","stop-opacity":"1"}}),n("stop",{offset:"100%",style:{"stop-color":"#4a9eff","stop-opacity":"0.2"}})])],-1)),(c(!0),u(Y,null,ct(q.value,D=>(c(),u("g",{key:D.id},[n("path",{d:tt(D),class:nt(["edge-path",{active:ft(D)}]),stroke:"#4a9eff","stroke-width":"2",fill:"none"},null,10,rp),ft(D)?(c(),u("circle",cp,[n("animateMotion",up,[n("mpath",{href:`#edge-${D.id}`},null,8,dp)])])):R("",!0)]))),128))],512))],512),F.value.length>0?(c(),u("div",fp,[n("div",{class:"model-panel-header",onClick:m[0]||(m[0]=D=>b.value=!b.value)},[m[9]||(m[9]=n("span",{class:"model-panel-title"},"🧠 模型",-1)),n("span",hp,f(b.value?"▼":"▶"),1)]),Tt(n("div",pp,[(c(!0),u(Y,null,ct(F.value,D=>(c(),u("div",{key:D.id,class:nt(["model-card",{active:_e(D)}])},[n("div",vp,f(D.name),1),n("div",gp,[(c(!0),u(Y,null,ct(Dt(D).slice(0,8),j=>(c(),u("span",{key:j.id,class:"model-dot",style:St({background:mt(j.agentId)}),title:`${it(j.agentId)} @ ${j.model||"unknown"}`,onClick:le($=>S.value=j,["stop"])},null,12,mp))),128))]),n("div",_p,f(Dt(D).length),1)],2))),128))],512),[[fs,b.value]])])):R("",!0)]))],512),S.value?(c(),u("div",{key:0,class:"call-detail-overlay",onClick:m[2]||(m[2]=le(D=>S.value=null,["self"]))},[n("div",yp,[n("div",bp,[m[10]||(m[10]=n("h3",null,"调用详情",-1)),n("button",{class:"close-btn",onClick:m[1]||(m[1]=D=>S.value=null)},"×")]),n("div",$p,[n("div",kp,[m[11]||(m[11]=n("span",{class:"label"},"Agent",-1)),n("span",wp,f(S.value.agentId),1)]),n("div",Cp,[m[12]||(m[12]=n("span",{class:"label"},"模型",-1)),n("span",Tp,f(S.value.model),1)]),n("div",Sp,[m[13]||(m[13]=n("span",{class:"label"},"时间",-1)),n("span",xp,f(S.value.time),1)]),n("div",Ap,[m[14]||(m[14]=n("span",{class:"label"},"Tokens",-1)),n("span",Ip,f(S.value.tokens),1)]),n("div",Mp,[m[15]||(m[15]=n("span",{class:"label"},"触发",-1)),n("div",Rp,f((O=S.value.trigger)==null?void 0:O.replace(/^【完成回传】/,"")),1)])])])])):R("",!0)])}}}),Dp=Ct(Pp,[["__scopeId","data-v-50bc0adc"]]),Fp={class:"collaboration-box"},Lp={class:"collaboration-box-body"},Op={class:"collaboration-error-fallback"},Np={class:"fallback-reason"},jp=wt({__name:"CollaborationFlowWrapper",props:{mainAgent:{},subAgents:{},mainAgentId:{}},emits:["agent-click"],setup(t){const e=W(null);return ci(s=>(e.value=s instanceof Error?s.message:String(s),!1)),(s,l)=>(c(),u("div",Fp,[l[3]||(l[3]=n("div",{class:"collaboration-box-header"},[n("h2",null,"协作流程"),n("span",{class:"collaboration-hint"},"展示主 Agent 与子 Agents 的协作关系")],-1)),n("div",Lp,[Tt(bt(Dp,{"main-agent":t.mainAgent,"sub-agents":t.subAgents,"main-agent-id":t.mainAgentId,onAgentClick:l[0]||(l[0]=i=>s.$emit("agent-click",i))},null,8,["main-agent","sub-agents","main-agent-id"]),[[fs,!e.value]]),Tt(n("div",Op,[l[2]||(l[2]=n("p",{class:"fallback-title"},"协作流程加载失败",-1)),n("p",Np,f(e.value),1),n("button",{onClick:l[1]||(l[1]=i=>e.value=null)},"重试")],512),[[fs,e.value]])])]))}}),Up=Ct(jp,[["__scopeId","data-v-ef9f8c73"]]),Vp={class:"task-status-section"},Wp={class:"section-header"},Hp={class:"summary-stats"},Bp={class:"stat total"},Kp={class:"filters-row"},qp={class:"search-box"},Gp={class:"filter-buttons"},zp=["onClick"],Jp={key:0,class:"loading-state"},Qp={key:1,class:"error-state"},Yp={key:2,class:"empty-state"},Xp={class:"task-list"},Zp=["onClick"],tv={class:"task-main"},ev={class:"task-name-short"},sv={key:0,class:"task-agent"},nv={key:1,class:"task-time"},lv={class:"task-detail-modal"},iv={class:"task-detail-header"},ov={class:"task-detail-body"},av={class:"detail-row"},rv={class:"detail-value task-content"},cv={key:0,class:"detail-row"},uv={class:"detail-value"},dv={class:"detail-row"},fv={class:"detail-value"},hv={key:1,class:"detail-row"},pv={class:"detail-value"},vv={key:2,class:"detail-row"},gv={class:"detail-value path-value"},mv={key:3,class:"detail-row"},_v={class:"detail-value"},yv={key:4,class:"detail-row"},bv={class:"detail-progress"},$v={class:"progress-bar"},kv={class:"progress-text"},wv={key:5,class:"detail-row"},Cv={class:"detail-value error"},Tv={key:6,class:"detail-row"},Sv={class:"generated-files-list"},xv={key:7,class:"detail-row"},Av={class:"detail-value output-content"},Iv={key:8,class:"detail-row"},Mv={class:"detail-subtasks"},Rv={key:0,class:"subtask-error-inline"},Ev={key:9,class:"detail-row"},Pv={class:"timeline-container"},Dv={class:"timeline"},Fv={class:"timeline-time"},Lv={class:"timeline-desc"},Ov=wt({__name:"TaskStatusSection",setup(t){const{subscribe:e}=Li(),s=W([]),l=W(!0),i=W(null),o=W(""),a=W([]),r=W(null),d=W(null),v=W([]),p=W(!1),C=[{value:"running",label:"执行中"},{value:"completed",label:"已完成"},{value:"failed",label:"失败"},{value:"pending",label:"待分配"}];zf(L=>{},300);const I=Q(()=>{let L=s.value;if(a.value.length>0&&(L=L.filter(U=>a.value.includes(U.status))),o.value){const U=o.value.toLowerCase();L=L.filter(X=>{var it;return X.name.toLowerCase().includes(U)||((it=X.agentName)==null?void 0:it.toLowerCase().includes(U))})}return L}),S=Q(()=>({total:s.value.length,running:s.value.filter(L=>L.status==="running").length,completed:s.value.filter(L=>L.status==="completed").length,failed:s.value.filter(L=>L.status==="failed").length,pending:s.value.filter(L=>L.status==="pending").length,cancelled:s.value.filter(L=>L.status==="cancelled").length}));function k(L){return{pending:"⏳",running:"🔄",completed:"✅",failed:"❌",cancelled:"🚫"}[L]||"📋"}function x(L){return s.value.filter(U=>U.status===L).length}function T(L){if(!L||!L.trim())return"未知";const U=L.trim().toLowerCase(),X={terminated:"任务被终止(可能是超时或被用户取消)",timeout:"任务执行超时",cancelled:"任务已取消",canceled:"任务已取消",killed:"任务被终止","subagent-error":"子任务执行异常"};for(const[it,V]of Object.entries(X))if(U.includes(it))return V;return L.trim()}function b(L){return!L||typeof L!="string"?"":L.replace(/\*\*/g,"").replace(/`([^`]+)`/g,"$1")}function M(L){if(!L.startTime)return"";const U=new Date(L.startTime).getTime(),X=L.endTime?new Date(L.endTime).getTime():Date.now(),it=Math.floor((X-U)/1e3);return it<60?`${it}s`:it<3600?`${Math.floor(it/60)}m ${it%60}s`:`${Math.floor(it/3600)}h ${Math.floor(it%3600/60)}m`}function _(L){const U=a.value.indexOf(L);U===-1?a.value.push(L):a.value.splice(U,1)}function w(L){a.value.length===1&&a.value[0]===L?a.value=[]:a.value=[L]}function K(L){const X=b(L.task??L.name).split(`
|
|
23
|
+
...`:""),M=Q(()=>s.step.type!=="toolResult"||s.step.toolResultStatus!=="error"?"":s.step.toolResultError?s.step.toolResultError:s.step.toolResult||"工具执行失败"),_=Q(()=>{if(s.step.type!=="toolResult"||s.step.toolResultStatus!=="error")return null;const G=(s.step.toolResultError||s.step.toolResult||"").toLowerCase(),A=(s.step.toolName||"").toLowerCase(),st=[];return(G.includes("enoent")||G.includes("no such file")||G.includes("文件不存在"))&&st.push("检查文件路径是否正确","确认文件是否存在"),(G.includes("eacces")||G.includes("permission")||G.includes("权限"))&&st.push("检查文件/目录权限","确认当前用户有访问权限"),(G.includes("timeout")||G.includes("超时"))&&st.push("增加超时时间","简化任务或检查网络"),A==="read"&&st.length===0&&st.push("检查路径是否在 workspace 内","确认文件编码正确"),A.includes("bash")&&st.length===0&&st.push("检查命令语法","确认依赖已安装","查看退出码"),st.length===0&&st.push("查看原始返回详情","尝试调整参数后重试"),st}),w=Q(()=>s.step.type!=="error"||!s.step.errorType?null:{"rate-limit":["降低调用频率","切换到 fallback model","等待配额恢复"],"token-limit":["减少上下文长度","分段处理任务","使用更大 context 的模型"],timeout:["检查网络连接","简化任务复杂度","增加超时时间"],quota:["充值账户","切换到其他 provider","等待配额重置"]}[s.step.errorType]||null);function K(){if(v.value){const G=s.step.pairedToolCallId||s.step.id,A=s.step.pairedToolResultId||s.step.id;l("highlight-pair",{callId:G,resultId:A})}P()}function P(){S.value&&(i.value=!i.value)}function N(G){return G?new Date(G).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function Z(G){return G?G<1e3?`${G}ms`:G<6e4?`${(G/1e3).toFixed(1)}s`:`${(G/6e4).toFixed(1)}min`:"0ms"}function F(G){try{return JSON.stringify(G,null,2)}catch{return String(G)}}async function q(){if(s.step.toolResult)try{await navigator.clipboard.writeText(s.step.toolResult),alert("已复制到剪贴板")}catch{}}return(G,A)=>(c(),u("div",{class:nt(["timeline-step",[`step-${t.step.type}`,`status-${t.step.status}`,{"is-paired-result":p.value,highlighted:C.value}]])},[n("div",{class:"step-header",onClick:K},[n("div",ir,[n("span",or,f(a.value),1),n("span",ar,f(r.value),1),d.value?(c(),u("span",rr,f(d.value),1)):R("",!0),!i.value&&k.value?(c(),u("span",cr,f(k.value),1)):R("",!0),n("span",ur,f(N(t.step.timestamp)),1),t.step.duration&&t.step.duration>0?(c(),u("span",dr," +"+f(Z(t.step.duration)),1)):R("",!0),t.step.executionTime?(c(),u("span",fr," ⏱ "+f(Z(t.step.executionTime)),1)):R("",!0)]),n("div",hr,[t.step.tokens?(c(),u("span",pr,[A[2]||(A[2]=n("span",{class:"token-label"},"tokens:",-1)),At(" "+f(t.step.tokens.input+t.step.tokens.output),1)])):R("",!0),v.value?(c(),u("span",{key:1,class:"pair-indicator",title:I.value}," 🔗 ",8,vr)):R("",!0),S.value?(c(),u("span",gr,f(i.value?"▼":"▶"),1)):R("",!0)])]),S.value&&i.value?(c(),u("div",mr,[t.step.type==="user"&&t.step.content?(c(),u("div",_r,[n("pre",null,f(t.step.content),1)])):R("",!0),t.step.type==="thinking"&&t.step.thinking?(c(),u("div",yr,[A[3]||(A[3]=n("div",{class:"thinking-label"},"💭 思考过程",-1)),n("pre",null,f(t.step.thinking),1)])):R("",!0),t.step.type==="text"&&t.step.content?(c(),u("div",br,[n("pre",null,f(t.step.content),1)])):R("",!0),t.step.type==="toolCall"?(c(),u("div",$r,[t.step.toolArguments?(c(),u("div",kr,[A[4]||(A[4]=n("div",{class:"section-label"},"参数:",-1)),n("pre",wr,f(F(t.step.toolArguments)),1)])):R("",!0)])):R("",!0),t.step.type==="toolResult"?(c(),u("div",Cr,[n("div",Tr,[n("span",{class:nt(["result-status",t.step.toolResultStatus])},f(t.step.toolResultStatus==="ok"?"✅ 成功":"❌ 工具执行失败"),3),t.step.toolResult?(c(),u("button",{key:0,class:"copy-btn",onClick:q}," 复制 ")):R("",!0)]),t.step.toolResultStatus==="error"?(c(),u(Y,{key:0},[M.value?(c(),u("div",Sr,[n("div",xr,f(M.value),1),_.value?(c(),u("div",Ar,[A[5]||(A[5]=n("span",{class:"suggestion-label"},"💡 建议:",-1)),n("ul",null,[(c(!0),u(Y,null,ct(_.value,(st,mt)=>(c(),u("li",{key:mt},f(st),1))),128))])])):R("",!0)])):R("",!0),t.step.toolResult?(c(),u("div",Ir,[A[6]||(A[6]=n("div",{class:"section-label"},"原始返回:",-1)),n("pre",{class:nt({truncated:!o.value})},f(b.value),3),x.value?(c(),u("button",{key:0,class:"show-more-btn",onClick:A[0]||(A[0]=le(st=>o.value=!o.value,["stop"]))},f(o.value?"收起":`展开全部 (${T.value} 行)`),1)):R("",!0)])):R("",!0)],64)):(c(),u(Y,{key:1},[t.step.toolResult?(c(),u("div",Mr,[n("pre",{class:nt({truncated:!o.value})},f(b.value),3),x.value?(c(),u("button",{key:0,class:"show-more-btn",onClick:A[1]||(A[1]=le(st=>o.value=!o.value,["stop"]))},f(o.value?"收起":`展开全部 (${T.value} 行)`),1)):R("",!0)])):R("",!0)],64))])):R("",!0),t.step.type==="error"?(c(),u("div",Rr,[n("div",Er,f(t.step.errorType||"unknown"),1),n("div",Pr,f(t.step.errorMessage),1),w.value?(c(),u("div",Dr,[A[7]||(A[7]=n("div",{class:"suggestion-label"},"💡 建议:",-1)),n("ul",null,[(c(!0),u(Y,null,ct(w.value,(st,mt)=>(c(),u("li",{key:mt},f(st),1))),128))])])):R("",!0)])):R("",!0)])):R("",!0)],2))}}),Ct=(t,e)=>{const s=t.__vccOpts||t;for(const[l,i]of e)s[l]=i;return s},mn=Ct(Fr,[["__scopeId","data-v-b8bd62e0"]]),Lr={class:"timeline-connector"},Or=wt({__name:"TimelineConnector",setup(t){return(e,s)=>(c(),u("div",Lr,[...s[0]||(s[0]=[n("div",{class:"connector-line"},null,-1),n("div",{class:"connector-arrow"},"▼",-1)])]))}}),_n=Ct(Or,[["__scopeId","data-v-01a6bfe6"]]),Nr={class:"round-header"},jr={class:"round-badge"},Ur={class:"round-trigger"},Vr={key:0,class:"round-stats"},Wr={class:"round-content"},Hr=wt({__name:"TimelineRound",props:{round:{},steps:{},highlightedPair:{}},emits:["highlight-pair"],setup(t){const e=t,s={user_input:"👤 用户输入触发",subagent_result:"↩️ 子代理回传",tool_result:"🔧 工具结果触发",start:"🚀 会话开始"},l=Q(()=>{const o=s[e.round.trigger]||e.round.trigger;return e.round.triggerBy&&e.round.triggerBy!=="用户"?`${o} · ${e.round.triggerBy}`:o});function i(o){const a=e.steps.find(r=>r.id===o);return a||(console.warn(`Step not found: ${o}`),{id:o,type:"text",status:"success",timestamp:0})}return(o,a)=>(c(),u("div",{class:nt(["timeline-round",`trigger-${t.round.trigger}`])},[n("div",Nr,[n("span",jr,"LLM #"+f(t.round.index),1),n("span",Ur,f(l.value),1),t.round.tokens?(c(),u("span",Vr,f(t.round.tokens.input+t.round.tokens.output)+" tokens ",1)):R("",!0)]),n("div",Wr,[(c(!0),u(Y,null,ct(t.round.stepIds,(r,d)=>(c(),u(Y,{key:r},[d>0?(c(),Gt(_n,{key:0})):R("",!0),bt(mn,{step:i(r),prevStep:d>0?i(t.round.stepIds[d-1]):void 0,highlightedPair:t.highlightedPair,onHighlightPair:a[0]||(a[0]=v=>o.$emit("highlight-pair",v))},null,8,["step","prevStep","highlightedPair"])],64))),128))])],2))}}),Br=Ct(Hr,[["__scopeId","data-v-2aa49052"]]),Kr={key:0,class:"link-time"},qr=wt({__name:"TimelineToolLink",props:{isError:{type:Boolean},isActive:{type:Boolean},executionTime:{}},setup(t){function e(s){return s?s<1e3?`${s}ms`:s<6e4?`${(s/1e3).toFixed(1)}s`:`${(s/6e4).toFixed(1)}min`:""}return(s,l)=>(c(),u("div",{class:nt(["tool-link",{"link-error":t.isError,"link-active":t.isActive}])},[l[0]||(l[0]=n("div",{class:"link-line"},[n("span",{class:"link-dot top"}),n("span",{class:"link-connector"}),n("span",{class:"link-dot bottom"})],-1)),t.executionTime?(c(),u("span",Kr,f(e(t.executionTime)),1)):R("",!0)],2))}}),Sl=Ct(qr,[["__scopeId","data-v-d1e21896"]]),Gr={class:"timeline-view"},zr={class:"timeline-header"},Jr={class:"header-left"},Qr={key:0,class:"agent-info"},Yr={key:0,class:"model"},Xr={class:"header-right"},Zr=["disabled"],tc={key:0,class:"loading-state"},ec={key:1,class:"empty-state"},sc={key:0,class:"empty-message"},nc={key:1,class:"empty-message"},lc={key:2},ic={key:3,class:"empty-hint"},oc={key:2,class:"timeline-content"},ac={key:0,class:"session-info"},rc={class:"session-id"},cc={key:0,class:"started-at"},uc={class:"steps-list"},dc={key:0,class:"tool-execution-label"},fc={class:"timeline-footer"},hc={class:"stats-grid"},pc={class:"stat-item"},vc={class:"stat-value"},gc={class:"stat-item"},mc={class:"stat-value"},_c={class:"stat-item"},yc={class:"stat-value"},bc={class:"stat-item"},$c={class:"stat-value"},kc=wt({__name:"TimelineView",props:{agentId:{},sessionKey:{},autoRefresh:{type:Boolean},refreshInterval:{}},setup(t){const e=t,s=W(null),l=W(!1),i=W(null),o=W(null),a=Q(()=>s.value?s.value.status:"empty"),r=Q(()=>({running:"🔄 进行中",completed:"✅ 已完成",error:"❌ 出错",empty:"空",no_sessions:"无会话"})[a.value]||"未知"),d=Q(()=>{var _;return((_=s.value)==null?void 0:_.roundMode)&&s.value.rounds&&s.value.rounds.length>0}),v=Q(()=>{var w;const _=new Map;if(!((w=s.value)!=null&&w.rounds))return _;for(const K of s.value.rounds)for(const P of K.stepIds)_.set(P,K);return _}),p=Q(()=>{if(!s.value||!d.value)return[];const _=[],w=new Set;for(const K of s.value.steps){if(w.has(K.id))continue;const P=v.value.get(K.id);P?(_.push({type:"round",data:P}),P.stepIds.forEach(N=>w.add(N))):(_.push({type:"step",data:K}),w.add(K.id))}return _});async function C(){if(e.agentId){l.value=!0,i.value=null;try{let _=`/api/timeline/${e.agentId}?limit=500`;e.sessionKey&&(_+=`&session_key=${encodeURIComponent(e.sessionKey)}`);const w=await fetch(_);if(!w.ok)throw new Error(`HTTP ${w.status}`);s.value=await w.json()}catch(_){i.value=_ instanceof Error?_.message:"加载失败",console.error("Timeline load error:",_)}finally{l.value=!1}}}function I(_){s.value&&s.value.steps[_]&&(s.value.steps[_].collapsed=!s.value.steps[_].collapsed)}function S(_){if(s.value){const w=s.value.steps.find(K=>K.id===_);w&&(w.collapsed=!w.collapsed)}}function k(_){o.value=_,setTimeout(()=>{o.value=null},3e3)}function x(_){return _?new Date(_).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function T(_){return _?_<1e3?`${_}ms`:_<6e4?`${(_/1e3).toFixed(1)}s`:`${(_/6e4).toFixed(1)}min`:"0ms"}function b(_){return _>=1e3?`${(_/1e3).toFixed(1)}k`:String(_)}Nt(C),Bt(()=>e.agentId,C);let M=null;return Bt([()=>e.autoRefresh,()=>e.refreshInterval],([_,w])=>{M&&(clearInterval(M),M=null),_&&w&&w>0&&(M=setInterval(C,w*1e3))},{immediate:!0}),(_,w)=>{var K,P,N,Z;return c(),u("div",Gr,[n("div",zr,[n("div",Jr,[w[0]||(w[0]=n("span",{class:"title"},"📊 实时执行时序",-1)),s.value?(c(),u("span",Qr,[At(f(s.value.agentName||s.value.agentId)+" ",1),s.value.model?(c(),u("span",Yr,"("+f(s.value.model)+")",1)):R("",!0)])):R("",!0)]),n("div",Xr,[n("span",{class:nt(["status-badge",`status-${a.value}`])},f(r.value),3),n("button",{class:"refresh-btn",onClick:C,disabled:l.value},f(l.value?"加载中...":"🔄 刷新"),9,Zr)])]),l.value&&!s.value?(c(),u("div",tc,[...w[1]||(w[1]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载时序数据...",-1)])])):!s.value||s.value.steps.length===0?(c(),u("div",ec,[w[2]||(w[2]=n("span",{class:"empty-icon"},"📭",-1)),((K=s.value)==null?void 0:K.status)==="no_sessions"&&((P=s.value)!=null&&P.isMainAgent)?(c(),u("span",sc," 主 Agent 暂无会话记录 ")):((N=s.value)==null?void 0:N.status)==="no_sessions"?(c(),u("span",nc," 该 Agent 是子代理,暂无独立会话记录 ")):(c(),u("span",lc,"暂无会话记录")),(Z=s.value)!=null&&Z.message?(c(),u("div",ic,f(s.value.message),1)):R("",!0)])):(c(),u("div",oc,[w[8]||(w[8]=Ii('<div class="timeline-legend" data-v-4917257d><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>👤</span> 用户/回传</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>🧠</span> LLM 思考</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>🤖</span> LLM 回复</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>🔧</span> 工具调用</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>✅</span> 工具成功</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>❌</span> 工具失败</span><span class="legend-item" data-v-4917257d><span class="legend-icon" data-v-4917257d>⚠️</span> 错误</span></div>',1)),s.value.sessionId?(c(),u("div",ac,[n("span",rc,"Session: "+f(s.value.sessionId.slice(0,8))+"...",1),s.value.startedAt?(c(),u("span",cc," 开始: "+f(x(s.value.startedAt)),1)):R("",!0)])):R("",!0),n("div",uc,[d.value?(c(!0),u(Y,{key:0},ct(p.value,(F,q)=>{var G;return c(),u(Y,{key:(F.type==="round",F.data.id)},[q>0?(c(),Gt(_n,{key:0})):R("",!0),F.type==="round"?(c(),Gt(Br,{key:1,round:F.data,steps:s.value.steps,highlightedPair:o.value,onHighlightPair:k},null,8,["round","steps","highlightedPair"])):(c(),u(Y,{key:2},[F.data.type==="toolResult"?(c(),u("div",dc,[...w[3]||(w[3]=[n("span",{class:"label-line"},null,-1),n("span",{class:"label-text"},"⚡ 工具执行",-1),n("span",{class:"label-line"},null,-1)])])):R("",!0),F.data.type==="toolResult"&&F.data.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:F.data.toolResultStatus==="error",isActive:((G=o.value)==null?void 0:G.resultId)===F.data.id,executionTime:F.data.executionTime},null,8,["isError","isActive","executionTime"])):R("",!0),bt(mn,{step:F.data,highlightedPair:o.value,onToggleCollapse:A=>S(F.data.id),onHighlightPair:k},null,8,["step","highlightedPair","onToggleCollapse"])],64))],64)}),128)):(c(!0),u(Y,{key:1},ct(s.value.steps,(F,q)=>{var G;return c(),u(Y,{key:F.id},[q>0?(c(),Gt(_n,{key:0})):R("",!0),F.type==="toolResult"&&F.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:F.toolResultStatus==="error",isActive:((G=o.value)==null?void 0:G.resultId)===F.id,executionTime:F.executionTime},null,8,["isError","isActive","executionTime"])):R("",!0),bt(mn,{step:F,prevStep:s.value.steps[q-1],highlightedPair:o.value,onToggleCollapse:A=>I(q),onHighlightPair:k},null,8,["step","prevStep","highlightedPair","onToggleCollapse"])],64)}),128))]),n("div",fc,[n("div",hc,[n("div",pc,[w[4]||(w[4]=n("span",{class:"stat-label"},"总耗时",-1)),n("span",vc,f(T(s.value.stats.totalDuration)),1)]),n("div",gc,[w[5]||(w[5]=n("span",{class:"stat-label"},"Token",-1)),n("span",mc,f(b(s.value.stats.totalInputTokens))+" / "+f(b(s.value.stats.totalOutputTokens)),1)]),n("div",_c,[w[6]||(w[6]=n("span",{class:"stat-label"},"工具调用",-1)),n("span",yc,f(s.value.stats.toolCallCount)+" 次",1)]),n("div",bc,[w[7]||(w[7]=n("span",{class:"stat-label"},"步骤数",-1)),n("span",$c,f(s.value.stats.stepCount),1)])])])]))])}}}),wc=Ct(kc,[["__scopeId","data-v-4917257d"]]),yn={pending:{icon:"⏳",bgColor:"#f3f4f6",borderColor:"#9ca3af",label:"等待中"},running:{icon:"🔄",bgColor:"#eff6ff",borderColor:"#3b82f6",label:"进行中"},completed:{icon:"✅",bgColor:"#f0fdf4",borderColor:"#22c55e",label:"已完成"},error:{icon:"❌",bgColor:"#fef2f2",borderColor:"#ef4444",label:"失败"}},Cc={class:"node-icon"},Tc={class:"node-info"},Sc={class:"node-name"},xc={class:"node-role"},Ac={class:"node-status"},Ic={key:0,class:"node-time"},Mc={key:1,class:"node-progress"},Rc=wt({__name:"ChainNode",props:{node:{},isSelected:{type:Boolean}},emits:["click"],setup(t){const e=t,s=Q(()=>{var o;return((o=yn[e.node.status])==null?void 0:o.icon)||"📄"}),l=Q(()=>{var o;return((o=yn[e.node.status])==null?void 0:o.label)||e.node.status});function i(o){return o?o<1e3?`${o}ms`:o<6e4?`${(o/1e3).toFixed(1)}s`:`${(o/6e4).toFixed(1)}min`:""}return(o,a)=>(c(),u("div",{class:nt(["chain-node",[`status-${t.node.status}`,{selected:t.isSelected}]]),onClick:a[0]||(a[0]=r=>o.$emit("click"))},[n("div",Cc,f(s.value),1),n("div",Tc,[n("div",Sc,f(t.node.agentName),1),n("div",xc,f(t.node.role),1)]),n("div",Ac,f(l.value),1),t.node.startedAt?(c(),u("div",Ic,f(i(t.node.duration)),1)):R("",!0),t.node.status==="running"?(c(),u("div",Mc,[...a[1]||(a[1]=[n("div",{class:"progress-spinner"},null,-1)])])):R("",!0)],2))}}),Ec=Ct(Rc,[["__scopeId","data-v-973c6755"]]),Pc={width:"60",height:"20",viewBox:"0 0 60 20"},Dc={id:"arrowhead",markerWidth:"10",markerHeight:"7",refX:"9",refY:"3.5",orient:"auto"},Fc=["fill"],Lc=["stroke","stroke-dasharray"],Oc=wt({__name:"ChainEdge",props:{fromStatus:{},toStatus:{}},setup(t){const e=t,s=Q(()=>e.toStatus==="running"?"#3b82f6":e.toStatus==="completed"?"#22c55e":e.toStatus==="error"?"#ef4444":"#9ca3af"),l=Q(()=>s.value),i=Q(()=>e.toStatus==="pending"?"4 4":"none"),o=Q(()=>({"edge-running":e.toStatus==="running","edge-completed":e.toStatus==="completed","edge-error":e.toStatus==="error","edge-pending":e.toStatus==="pending"}));return(a,r)=>(c(),u("div",{class:nt(["chain-edge",o.value])},[(c(),u("svg",Pc,[n("defs",null,[n("marker",Dc,[n("polygon",{points:"0 0, 10 3.5, 0 7",fill:l.value},null,8,Fc)])]),n("line",{x1:"0",y1:"10",x2:"50",y2:"10",stroke:s.value,"stroke-width":"2","stroke-dasharray":i.value,"marker-end":"url(#arrowhead)"},null,8,Lc)]))],2))}}),Nc=Ct(Oc,[["__scopeId","data-v-c94ab96b"]]),jc={class:"chain-view"},Uc={class:"chain-header"},Vc={class:"header-left"},Wc={key:0,class:"project-info"},Hc={class:"header-right"},Bc=["disabled"],Kc={key:0,class:"loading-state"},qc={key:1,class:"empty-state"},Gc={key:2,class:"chain-content"},zc={key:0,class:"root-task"},Jc={class:"task-text"},Qc={class:"task-meta"},Yc={key:0},Xc={key:1,class:"chain-diagram"},Zc={class:"diagram-container"},tu={key:2,class:"chain-progress"},eu={class:"progress-bar"},su={class:"progress-text"},nu={key:3,class:"node-detail"},lu={class:"detail-header"},iu={class:"detail-title"},ou={class:"detail-content"},au={key:0,class:"detail-section"},ru={class:"section-value"},cu={class:"detail-row"},uu={class:"detail-item"},du={class:"item-value"},fu={class:"detail-item"},hu={class:"item-value"},pu={key:1,class:"detail-row"},vu={class:"detail-item"},gu={class:"item-value"},mu={class:"detail-item"},_u={class:"item-value"},yu={key:2,class:"detail-section"},bu={class:"section-value"},$u={key:3,class:"detail-section"},ku={class:"artifacts-list"},wu=wt({__name:"TaskChainView",props:{autoRefresh:{type:Boolean},refreshInterval:{}},setup(t){const e=t,s=W([]),l=W(null),i=W(null),o=W(!1),a=Q(()=>l.value?l.value:s.value.length>0?s.value[0]:null),r=Q(()=>{var T;return{running:"🔄 进行中",completed:"✅ 已完成",error:"❌ 出错",empty:"空"}[((T=a.value)==null?void 0:T.status)||"empty"]||"未知"}),d=Q(()=>{var b;const x=(b=a.value)==null?void 0:b.nodes;if(!x)return[];const T=["main","analyst","architect","devops"];return[...x].sort((M,_)=>{const w=T.findIndex(P=>M.role.includes(P)),K=T.findIndex(P=>_.role.includes(P));return w-K})});async function v(){o.value=!0;try{const x=await fetch("/api/chains?limit=10");if(x.ok){const T=await x.json();s.value=T.chains||[],l.value=T.activeChain||null}}catch(x){console.error("Chain load error:",x)}finally{o.value=!1}}function p(x){var T;i.value=((T=i.value)==null?void 0:T.agentId)===x.agentId?null:x}function C(x){return x?new Date(x).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):"-"}function I(x){return x?x<1e3?`${x}ms`:x<6e4?`${(x/1e3).toFixed(1)}s`:`${(x/6e4).toFixed(1)}min`:"-"}function S(x){return x?x>=1e3?`${(x/1e3).toFixed(1)}k`:String(x):"0"}let k=null;return Nt(()=>{v(),e.autoRefresh&&e.refreshInterval&&(k=setInterval(v,e.refreshInterval*1e3))}),ae(()=>{k&&(clearInterval(k),k=null)}),(x,T)=>{var b,M;return c(),u("div",jc,[n("div",Uc,[n("div",Vc,[T[0]||(T[0]=n("span",{class:"title"},"🔗 任务执行链路",-1)),a.value?(c(),u("span",Wc,f(a.value.projectId||"当前任务"),1)):R("",!0)]),n("div",Hc,[n("span",{class:nt(["status-badge",`status-${((b=a.value)==null?void 0:b.status)||"empty"}`])},f(r.value),3),n("button",{class:"refresh-btn",onClick:v,disabled:o.value},f(o.value?"加载中...":"🔄 刷新"),9,Bc)])]),o.value&&!a.value?(c(),u("div",Kc,[...T[1]||(T[1]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载链路数据...",-1)])])):!a.value&&s.value.length===0?(c(),u("div",qc,[...T[2]||(T[2]=[n("span",{class:"empty-icon"},"🔗",-1),n("span",null,"暂无任务链路",-1),n("div",{class:"empty-hint"},"当 Main Agent 派发任务给子 Agent 时,这里会显示执行链路",-1)])])):(c(),u("div",Gc,[a.value?(c(),u("div",zc,[T[3]||(T[3]=n("div",{class:"task-label"},"根任务",-1)),n("div",Jc,f(a.value.rootTask),1),n("div",Qc,[a.value.startedAt?(c(),u("span",Yc,"开始: "+f(C(a.value.startedAt)),1)):R("",!0)])])):R("",!0),a.value?(c(),u("div",Xc,[n("div",Zc,[(c(!0),u(Y,null,ct(d.value,(_,w)=>{var K,P;return c(),u(Y,{key:_.agentId},[w>0?(c(),Gt(Nc,{key:0,"from-status":(K=d.value[w-1])==null?void 0:K.status,"to-status":_.status},null,8,["from-status","to-status"])):R("",!0),bt(Ec,{node:_,"is-selected":((P=i.value)==null?void 0:P.agentId)===_.agentId,onClick:N=>p(_)},null,8,["node","is-selected","onClick"])],64)}),128))])])):R("",!0),a.value?(c(),u("div",tu,[n("div",eu,[n("div",{class:"progress-fill",style:St({width:`${a.value.progress*100}%`})},null,4)]),n("div",su,f(Math.round(a.value.progress*100))+"% ("+f(a.value.completedNodes)+"/"+f(a.value.totalNodes)+" 完成) ",1)])):R("",!0),i.value?(c(),u("div",nu,[n("div",lu,[n("span",iu,f(i.value.agentName),1),n("span",{class:nt(["detail-status",`status-${i.value.status}`])},f(((M=rs(yn)[i.value.status])==null?void 0:M.label)||i.value.status),3)]),n("div",ou,[i.value.task?(c(),u("div",au,[T[4]||(T[4]=n("div",{class:"section-label"},"任务",-1)),n("div",ru,f(i.value.task),1)])):R("",!0),n("div",cu,[n("div",uu,[T[5]||(T[5]=n("span",{class:"item-label"},"开始时间",-1)),n("span",du,f(i.value.startedAt?C(i.value.startedAt):"-"),1)]),n("div",fu,[T[6]||(T[6]=n("span",{class:"item-label"},"耗时",-1)),n("span",hu,f(I(i.value.duration)),1)])]),i.value.tokenUsage?(c(),u("div",pu,[n("div",vu,[T[7]||(T[7]=n("span",{class:"item-label"},"Token 输入",-1)),n("span",gu,f(S(i.value.tokenUsage.input)),1)]),n("div",mu,[T[8]||(T[8]=n("span",{class:"item-label"},"Token 输出",-1)),n("span",_u,f(S(i.value.tokenUsage.output)),1)])])):R("",!0),i.value.toolCallCount>0?(c(),u("div",yu,[T[9]||(T[9]=n("div",{class:"section-label"},"工具调用",-1)),n("div",bu,f(i.value.toolCallCount)+" 次",1)])):R("",!0),i.value.artifacts&&i.value.artifacts.length>0?(c(),u("div",$u,[T[10]||(T[10]=n("div",{class:"section-label"},"产出物",-1)),n("div",ku,[(c(!0),u(Y,null,ct(i.value.artifacts,_=>(c(),u("div",{key:_,class:"artifact-item"}," 📄 "+f(_),1))),128))])])):R("",!0)])])):R("",!0)]))])}}}),Cu=Ct(wu,[["__scopeId","data-v-ee8c8661"]]),Tu={class:"agent-config-panel"},Su={class:"header"},xu=["disabled"],Au={key:0,class:"loading-state"},Iu={key:1,class:"error-state"},Mu={key:2,class:"config-content"},Ru={class:"config-section"},Eu={class:"info-grid"},Pu={class:"info-item"},Du={class:"value monospace"},Fu={class:"info-item"},Lu={class:"value"},Ou={class:"info-item full-width"},Nu={class:"value monospace"},ju={class:"info-item"},Uu={class:"config-section"},Vu={class:"model-config"},Wu={class:"model-field"},Hu={class:"model-select-wrapper"},Bu=["disabled"],Ku=["label"],qu=["value"],Gu={key:0,class:"current-model"},zu={class:"model-field"},Ju={class:"fallbacks-list"},Qu=["onUpdate:modelValue","disabled"],Yu=["label"],Xu=["value"],Zu=["onClick","disabled"],td=["disabled"],ed={class:"model-actions"},sd=["disabled"],nd=["disabled"],ld={key:0,class:"config-section"},id={class:"description-text"},od=wt({__name:"AgentConfigPanel",props:{agentId:{}},setup(t){const e=t,s=W(null),l=W([]),i=W(!1),o=W(!1),a=W(""),r=W(""),d=W([]),v=Q(()=>{const M={};for(const _ of l.value)M[_.provider]||(M[_.provider]=[]),M[_.provider].push(_);return Object.entries(M).map(([_,w])=>({provider:_,models:w}))}),p=Q(()=>{var _;if(!((_=s.value)!=null&&_.model))return!1;const M=s.value.model;return r.value!==M.primary||JSON.stringify(d.value.filter(w=>w))!==JSON.stringify(M.fallbacks||[])});function C(M){return{idle:"空闲",working:"工作中",down:"异常"}[M]||M}function I(M){if(!M)return"";const _=M.split("/");return _.length>1?_[_.length-1]:M}async function S(){var M;i.value=!0,a.value="";try{const[_,w]=await Promise.all([fetch(`/api/agent-config/${e.agentId}`),fetch("/api/available-models")]);if(_.ok?(s.value=await _.json(),(M=s.value)!=null&&M.model&&(r.value=s.value.model.primary||"",d.value=[...s.value.model.fallbacks||[]])):a.value="加载配置失败",w.ok){const K=await w.json();l.value=K.models||[]}}catch(_){a.value="加载失败: "+_.message}finally{i.value=!1}}function k(){d.value.length<3&&d.value.push("")}function x(M){d.value.splice(M,1)}function T(){var M;(M=s.value)!=null&&M.model&&(r.value=s.value.model.primary||"",d.value=[...s.value.model.fallbacks||[]])}async function b(){if(p.value){o.value=!0;try{const M=await fetch(`/api/agent-config/${e.agentId}/model`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({primary:r.value||null,fallbacks:d.value.filter(_=>_)||null})});if(M.ok){const _=await M.json();s.value&&_.model&&(s.value.model=_.model),alert("模型配置已保存!重启 Agent 后生效。")}else{const _=await M.json();alert("保存失败: "+(_.detail||"未知错误"))}}catch(M){alert("保存失败: "+M.message)}finally{o.value=!1}}}return Bt(()=>e.agentId,()=>{S()},{immediate:!0}),Nt(()=>{S()}),(M,_)=>{var w;return c(),u("div",Tu,[n("div",Su,[_[1]||(_[1]=n("h3",null,"⚙️ Agent 配置",-1)),n("button",{class:"refresh-btn",onClick:S,disabled:i.value},f(i.value?"加载中...":"刷新"),9,xu)]),i.value&&!s.value?(c(),u("div",Au," 加载配置... ")):a.value?(c(),u("div",Iu,f(a.value),1)):s.value?(c(),u("div",Mu,[n("div",Ru,[_[6]||(_[6]=n("h4",null,"基本信息",-1)),n("div",Eu,[n("div",Pu,[_[2]||(_[2]=n("span",{class:"label"},"ID",-1)),n("span",Du,f(s.value.id),1)]),n("div",Fu,[_[3]||(_[3]=n("span",{class:"label"},"名称",-1)),n("span",Lu,f(s.value.name),1)]),n("div",Ou,[_[4]||(_[4]=n("span",{class:"label"},"工作区",-1)),n("span",Nu,f(s.value.workspace||"未设置"),1)]),n("div",ju,[_[5]||(_[5]=n("span",{class:"label"},"状态",-1)),n("span",{class:nt(["value",`status-${s.value.status}`])},f(C(s.value.status)),3)])])]),n("div",Uu,[_[11]||(_[11]=n("h4",null,"模型配置",-1)),n("div",Vu,[n("div",Wu,[_[8]||(_[8]=n("label",null,"主模型 (Primary)",-1)),n("div",Hu,[Tt(n("select",{"onUpdate:modelValue":_[0]||(_[0]=K=>r.value=K),disabled:o.value,class:"model-select"},[_[7]||(_[7]=n("option",{value:""},"-- 选择模型 --",-1)),(c(!0),u(Y,null,ct(v.value,K=>(c(),u("optgroup",{key:K.provider,label:K.provider},[(c(!0),u(Y,null,ct(K.models,P=>(c(),u("option",{key:P.id,value:P.id},f(P.name),9,qu))),128))],8,Ku))),128))],8,Bu),[[Pe,r.value]]),(w=s.value.model)!=null&&w.primary?(c(),u("span",Gu," 当前: "+f(I(s.value.model.primary)),1)):R("",!0)])]),n("div",zu,[_[10]||(_[10]=n("label",null,"备选模型 (Fallbacks)",-1)),n("div",Ju,[(c(!0),u(Y,null,ct(d.value,(K,P)=>(c(),u("div",{key:P,class:"fallback-item"},[Tt(n("select",{"onUpdate:modelValue":N=>d.value[P]=N,disabled:o.value,class:"model-select small"},[_[9]||(_[9]=n("option",{value:""},"-- 选择 --",-1)),(c(!0),u(Y,null,ct(v.value,N=>(c(),u("optgroup",{key:N.provider,label:N.provider},[(c(!0),u(Y,null,ct(N.models,Z=>(c(),u("option",{key:Z.id,value:Z.id},f(Z.name),9,Xu))),128))],8,Yu))),128))],8,Qu),[[Pe,d.value[P]]]),n("button",{class:"remove-btn",onClick:N=>x(P),disabled:o.value},"×",8,Zu)]))),128)),n("button",{class:"add-fallback-btn",onClick:k,disabled:o.value||d.value.length>=3}," + 添加备选模型 ",8,td)])]),n("div",ed,[n("button",{class:"save-btn",onClick:b,disabled:o.value||!p.value},f(o.value?"保存中...":"保存修改"),9,sd),n("button",{class:"reset-btn",onClick:T,disabled:o.value}," 重置 ",8,nd)])])]),s.value.description?(c(),u("div",ld,[_[12]||(_[12]=n("h4",null,"描述",-1)),n("p",id,f(s.value.description),1)])):R("",!0)])):R("",!0)])}}}),ad=Ct(od,[["__scopeId","data-v-c0a2c245"]]),rd={class:"error-analysis-view"},cd={class:"header"},ud=["disabled"],dd={key:0,class:"agent-summary"},fd={class:"summary-card total"},hd={class:"count"},pd={key:0,class:"summary-card critical"},vd={class:"count"},gd={key:1,class:"summary-card high"},md={class:"count"},_d={key:2,class:"summary-card medium"},yd={class:"count"},bd={key:1,class:"loading-state"},$d={key:2,class:"empty-state"},kd={key:3,class:"errors-list"},wd=["onClick"],Cd={class:"error-header"},Td={class:"error-badges"},Sd={key:0,class:"badge archived",title:"已归档的子任务"},xd={key:1,class:"badge provider"},Ad={key:2,class:"badge model"},Id={class:"error-time"},Md={class:"error-message"},Rd={key:0,class:"error-detail"},Ed={class:"detail-section"},Pd={class:"error-full"},Dd={key:0,class:"detail-section"},Fd={class:"tool-chain"},Ld={class:"tool-index"},Od={class:"tool-name"},Nd={class:"tool-time"},jd={key:1,class:"detail-section"},Ud={class:"suggestions"},Vd={class:"detail-section meta"},Wd={key:4,class:"type-summary"},Hd={class:"type-bars"},Bd={class:"type-label"},Kd={class:"bar-container"},qd={class:"type-count"},Gd=wt({__name:"ErrorAnalysisView",props:{agentId:{}},setup(t){const e=t,s=W([]),l=W(null),i=W(!1),o=W(new Set),a={api_auth:"API 认证",api_rate_limit:"API 限流",api_model:"模型错误",timeout:"超时",permission:"权限错误",tool_error:"工具错误",subagent:"子任务错误",network:"网络错误",unknown:"未知"};function r(S){return a[S]||S}function d(S){return S?new Date(S).toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):""}function v(S,k){return!S||S.length<=k?S||"":S.slice(0,k)+"..."}function p(S,k){return k?Math.round(S/k*100)+"%":"0%"}function C(S){o.value.has(S)?o.value.delete(S):o.value.add(S),o.value=new Set(o.value)}async function I(){if(e.agentId){i.value=!0;try{const S=await fetch(`/api/error-analysis/${e.agentId}?session_limit=5`);if(S.ok){const k=await S.json();s.value=k.errors||[],l.value=k.summary||null}}catch(S){console.error("Failed to load error analysis:",S)}finally{i.value=!1}}}return Bt(()=>e.agentId,()=>{I()},{immediate:!0}),Nt(()=>{I()}),(S,k)=>{var x,T,b,M;return c(),u("div",rd,[n("div",cd,[k[0]||(k[0]=n("h3",null,"🔍 错误分析",-1)),n("button",{class:"refresh-btn",onClick:I,disabled:i.value},f(i.value?"分析中...":"刷新"),9,ud)]),l.value?(c(),u("div",dd,[n("div",fd,[n("span",hd,f(l.value.total||0),1),k[1]||(k[1]=n("span",{class:"label"},"错误数",-1))]),(x=l.value.bySeverity)!=null&&x.critical?(c(),u("div",pd,[n("span",vd,f(l.value.bySeverity.critical),1),k[2]||(k[2]=n("span",{class:"label"},"严重",-1))])):R("",!0),(T=l.value.bySeverity)!=null&&T.high?(c(),u("div",gd,[n("span",md,f(l.value.bySeverity.high),1),k[3]||(k[3]=n("span",{class:"label"},"高",-1))])):R("",!0),(b=l.value.bySeverity)!=null&&b.medium?(c(),u("div",_d,[n("span",yd,f(l.value.bySeverity.medium),1),k[4]||(k[4]=n("span",{class:"label"},"中",-1))])):R("",!0)])):R("",!0),i.value&&!s.value.length?(c(),u("div",bd," 正在分析错误... ")):s.value.length?(c(),u("div",kd,[(c(!0),u(Y,null,ct(s.value,(_,w)=>{var K,P;return c(),u("div",{key:w,class:nt(["error-item",`severity-${_.severity}`]),onClick:N=>C(w)},[n("div",Cd,[n("span",{class:"error-type",style:St({color:_.severityColor})},f(_.severityLabel)+" - "+f(_.errorTypeLabel),5),n("div",Td,[_.isArchived?(c(),u("span",Sd,"📦 归档")):R("",!0),_.provider?(c(),u("span",xd,f(_.provider),1)):R("",!0),_.model?(c(),u("span",Ad,f(_.model),1)):R("",!0)]),n("span",Id,f(d(_.timestamp)),1)]),n("div",Md,f(v(_.rawMessage,150)),1),o.value.has(w)?(c(),u("div",Rd,[n("div",Ed,[k[5]||(k[5]=n("h4",null,"错误信息",-1)),n("pre",Pd,f(_.rawMessage||"无详细信息"),1)]),(K=_.toolChain)!=null&&K.length?(c(),u("div",Dd,[k[6]||(k[6]=n("h4",null,"工具调用链(错误前)",-1)),n("div",Fd,[(c(!0),u(Y,null,ct(_.toolChain,(N,Z)=>(c(),u("div",{key:Z,class:"tool-item"},[n("span",Ld,f(Z+1),1),n("span",Od,f(N.toolName),1),n("span",Nd,f(d(N.timestamp)),1)]))),128))])])):R("",!0),(P=_.suggestions)!=null&&P.length?(c(),u("div",jd,[k[7]||(k[7]=n("h4",null,"修复建议",-1)),n("ul",Ud,[(c(!0),u(Y,null,ct(_.suggestions,(N,Z)=>(c(),u("li",{key:Z},f(N),1))),128))])])):R("",!0),n("div",Vd,[n("span",null,"Session: "+f(_.sessionFile),1),n("span",null,"Turn: "+f(_.turnIndex),1)])])):R("",!0)],10,wd)}),128))])):(c(),u("div",$d," ✅ 暂无错误记录 ")),(M=l.value)!=null&&M.byType&&Object.keys(l.value.byType).length>0?(c(),u("div",Wd,[k[8]||(k[8]=n("h4",null,"错误类型分布",-1)),n("div",Hd,[(c(!0),u(Y,null,ct(l.value.byType,(_,w)=>(c(),u("div",{key:w,class:"type-bar"},[n("span",Bd,f(r(w)),1),n("div",Kd,[n("div",{class:"bar-fill",style:St({width:p(_,l.value.total)})},null,4)]),n("span",qd,f(_),1)]))),128))])])):R("",!0)])}}}),zd=Ct(Gd,[["__scopeId","data-v-bc05715d"]]),Jd={class:"header"},Qd={class:"content"},Yd={class:"section"},Xd={class:"status-info"},Zd={class:"status-text"},tf={key:0,class:"section"},ef={key:1,class:"section"},sf={key:2,class:"section"},nf={class:"error-info"},lf={class:"error-type"},of={class:"error-message"},af={key:3,class:"section"},rf={class:"diagnostic-header"},cf={class:"diagnostic-icon"},uf={class:"diagnostic-title"},df={class:"diagnostic-content"},ff={class:"diagnostic-item"},hf={class:"item-value highlight"},pf={key:0,class:"diagnostic-item"},vf={class:"item-value"},gf={key:1,class:"diagnostic-item"},mf={class:"item-value"},_f={class:"diagnostic-actions"},yf={class:"section"},bf={class:"activity-list"},$f={key:0,class:"activity-item working"},kf={key:1,class:"activity-item idle"},wf={key:2,class:"activity-item down"},Cf={class:"section"},Tf={class:"view-tabs"},Sf={key:0,class:"timeline-container"},xf={key:1,class:"chain-container"},Af={key:2,class:"advanced-container"},If={class:"advanced-section"},Mf={class:"advanced-section"},Rf=5*60*1e3,Ef=15*60*1e3,Pf=wt({__name:"AgentDetailPanel",props:{agent:{}},emits:["close"],setup(t){const e=t,s=W("timeline"),l=W(null),i=W(Date.now());let o=null;const a=Q(()=>({idle:"空闲",working:"工作中",down:"异常"})[e.agent.status]||"未知"),r=Q(()=>{if(e.agent.status!=="working")return null;const T=e.agent.lastActiveAt||0,b=i.value-T;return b>Ef?{isStuck:!0,idleMinutes:Math.floor(b/6e4),severity:"critical",label:"严重卡顿"}:b>Rf?{isStuck:!0,idleMinutes:Math.floor(b/6e4),severity:"warning",label:"可能卡顿"}:null}),d=Q(()=>{var _;if(!((_=l.value)!=null&&_.archiveAtMs))return null;const T=l.value.archiveAtMs-i.value;if(T<=0)return"即将超时";const b=Math.floor(T/6e4),M=Math.floor(T%6e4/1e3);return`${b}分${M}秒`}),v=Q(()=>{if(!p.value.length)return null;const T=p.value[p.value.length-1];if(T.role==="toolResult"){const b=T.content[0];if(b){const M=b.text||b.content||"";return{tool:T.toolName||"未知工具",status:b.status||"completed",result:M.slice(0,100)||"(无输出)"}}}return null}),p=W([]),C=W(!1);async function I(){var T;if((T=e.agent)!=null&&T.id){C.value=!0;try{const b=await fetch(`/api/agents/${e.agent.id}/output?limit=30`);if(b.ok){const M=await b.json();p.value=M.turns||[]}else p.value=[]}catch{p.value=[]}finally{C.value=!1}}}async function S(){if(e.agent.status!=="working"){l.value=null;return}try{const T=await fetch("/api/chains?limit=10");if(T.ok){const M=(await T.json()).activeChain;if(M!=null&&M.nodes){const _=M.nodes.find(w=>w.agentId===e.agent.id);_&&_.status==="running"&&(l.value={runId:M.chainId,status:"running",startedAt:_.startedAt,archiveAtMs:M.archiveAtMs})}}}catch{}}async function k(){var T;if((T=l.value)!=null&&T.runId&&confirm("确定要取消这个任务吗?"))try{alert("取消功能需要 OpenClaw 支持,请使用命令行: openclaw subagents cancel "+l.value.runId)}catch(b){console.error("Cancel failed:",b)}}function x(){I(),S()}return Bt(()=>{var T;return(T=e.agent)==null?void 0:T.id},()=>{I(),S()},{immediate:!0}),Bt(()=>e.agent.status,S),Nt(()=>{o=setInterval(()=>{i.value=Date.now()},1e3)}),ae(()=>{o&&(clearInterval(o),o=null)}),(T,b)=>(c(),u("div",{class:"panel-overlay",onClick:b[5]||(b[5]=M=>T.$emit("close"))},[n("div",{class:"panel",onClick:b[4]||(b[4]=le(()=>{},["stop"]))},[n("div",Jd,[n("h2",null,f(t.agent.name),1),n("button",{class:"close-btn",onClick:b[0]||(b[0]=M=>T.$emit("close"))},"×")]),n("div",Qd,[n("div",Yd,[b[6]||(b[6]=n("h3",null,"状态",-1)),n("div",Xd,[n("span",{class:nt(["status-dot",`status-${t.agent.status}`])},null,2),n("span",Zd,f(a.value),1)])]),t.agent.currentTask?(c(),u("div",tf,[b[7]||(b[7]=n("h3",null,"当前任务",-1)),n("p",null,f(t.agent.currentTask),1)])):R("",!0),t.agent.lastActiveFormatted?(c(),u("div",ef,[b[8]||(b[8]=n("h3",null,"最后活跃",-1)),n("p",null,f(t.agent.lastActiveFormatted),1)])):R("",!0),t.agent.error?(c(),u("div",sf,[b[9]||(b[9]=n("h3",{class:"error-title"},"错误信息",-1)),n("div",nf,[n("div",lf,f(t.agent.error.type),1),n("div",of,f(t.agent.error.message),1)])])):R("",!0),r.value?(c(),u("div",af,[n("div",{class:nt(["diagnostic-panel",`severity-${r.value.severity}`])},[n("div",rf,[n("span",cf,f(r.value.severity==="critical"?"🚨":"⚠️"),1),n("span",uf,f(r.value.label)+"检测",1)]),n("div",df,[n("div",ff,[b[10]||(b[10]=n("span",{class:"item-label"},"无响应时间:",-1)),n("span",hf,f(r.value.idleMinutes)+" 分钟",1)]),v.value?(c(),u("div",pf,[b[11]||(b[11]=n("span",{class:"item-label"},"最后操作:",-1)),n("span",vf,f(v.value.tool)+" → "+f(v.value.result),1)])):R("",!0),d.value?(c(),u("div",gf,[b[12]||(b[12]=n("span",{class:"item-label"},"自动超时:",-1)),n("span",mf,f(d.value),1)])):R("",!0),b[13]||(b[13]=n("div",{class:"diagnostic-hint"},[n("div",{class:"hint-title"},"可能原因:"),n("ul",null,[n("li",null,"LLM API 响应超时"),n("li",null,"网络连接问题"),n("li",null,"API 配额限制")])],-1)),n("div",_f,[l.value?(c(),u("button",{key:0,class:"action-btn primary",onClick:k}," 取消任务 ")):R("",!0),n("button",{class:"action-btn",onClick:x}," 刷新状态 ")])])],2)])):R("",!0),n("div",yf,[b[14]||(b[14]=n("h3",null,"最近活动",-1)),n("div",bf,[t.agent.status==="working"?(c(),u("div",$f," 💼 正在执行任务... ")):t.agent.status==="idle"?(c(),u("div",kf," 😴 空闲中 ")):t.agent.status==="down"?(c(),u("div",wf," ⚠️ 检测到错误 ")):R("",!0)])]),n("div",Cf,[n("div",Tf,[n("button",{class:nt(["tab-btn",{active:s.value==="timeline"}]),onClick:b[1]||(b[1]=M=>s.value="timeline")}," 📊 时序视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="chain"}]),onClick:b[2]||(b[2]=M=>s.value="chain")}," 🔗 链路视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="advanced"}]),onClick:b[3]||(b[3]=M=>s.value="advanced")}," ⚙️ 高级 ",2)]),s.value==="timeline"?(c(),u("div",Sf,[bt(rs(wc),{agentId:t.agent.id,autoRefresh:!0,refreshInterval:10},null,8,["agentId"])])):s.value==="chain"?(c(),u("div",xf,[bt(rs(Cu),{autoRefresh:!0,refreshInterval:10})])):s.value==="advanced"?(c(),u("div",Af,[n("div",If,[b[15]||(b[15]=n("h4",null,"⚙️ 配置",-1)),bt(ad,{agentId:t.agent.id},null,8,["agentId"])]),n("div",Mf,[b[16]||(b[16]=n("h4",null,"🔍 错误分析",-1)),bt(zd,{agentId:t.agent.id},null,8,["agentId"])])])):R("",!0)])])])]))}}),Df=Ct(Pf,[["__scopeId","data-v-6fe85cb8"]]),Ff={class:"settings-panel"},Lf={class:"header"},Of={class:"content"},Nf={class:"setting-item"},jf={class:"setting-item"},Uf={class:"setting-item"},Vf={class:"setting-item"},Wf={class:"setting-item"},Hf={class:"setting-item"},Bf={class:"setting-item"},Kf={class:"setting-item"},qf=wt({__name:"SettingsPanel",emits:["close"],setup(t,{emit:e}){const s=e,l=W(10),i=W(!0),o=W(!0),a=W(!0),r=W(!0),d=W(!1),v=W(100),p=W(!0);function C(){const S=localStorage.getItem("dashboard-settings");if(S)try{const k=JSON.parse(S);l.value=k.refreshInterval||10,i.value=k.autoRefreshEnabled!==!1,o.value=k.showTimestamps!==!1,a.value=k.showTokens!==!1,r.value=k.notifyOnError!==!1,d.value=k.notifyOnComplete||!1,v.value=k.logLines||100,p.value=k.autoScrollLog!==!1}catch(k){console.error("加载设置失败:",k)}}function I(){const S={refreshInterval:l.value,autoRefreshEnabled:i.value,showTimestamps:o.value,showTokens:a.value,notifyOnError:r.value,notifyOnComplete:d.value,logLines:v.value,autoScrollLog:p.value};localStorage.setItem("dashboard-settings",JSON.stringify(S)),s("settings-changed",S)}return Nt(()=>{C()}),(S,k)=>(c(),u("div",Ff,[n("div",Lf,[k[9]||(k[9]=n("h2",null,"设置",-1)),n("button",{class:"close-btn",onClick:k[0]||(k[0]=x=>S.$emit("close"))},"×")]),n("div",Of,[n("section",null,[k[12]||(k[12]=n("h3",null,"自动刷新",-1)),n("div",Nf,[k[10]||(k[10]=n("label",null,"刷新间隔(秒)",-1)),Tt(n("input",{type:"number","onUpdate:modelValue":k[1]||(k[1]=x=>l.value=x),min:"1",max:"300",onChange:I},null,544),[[jn,l.value,void 0,{number:!0}]])]),n("div",jf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[2]||(k[2]=x=>i.value=x),onChange:I},null,544),[[Le,i.value]]),k[11]||(k[11]=At(" 启用自动刷新 ",-1))])])]),n("section",null,[k[15]||(k[15]=n("h3",null,"显示选项",-1)),n("div",Uf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[3]||(k[3]=x=>o.value=x),onChange:I},null,544),[[Le,o.value]]),k[13]||(k[13]=At(" 显示时间戳 ",-1))])]),n("div",Vf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[4]||(k[4]=x=>a.value=x),onChange:I},null,544),[[Le,a.value]]),k[14]||(k[14]=At(" 显示 Token 消耗 ",-1))])])]),n("section",null,[k[18]||(k[18]=n("h3",null,"通知",-1)),n("div",Wf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[5]||(k[5]=x=>r.value=x),onChange:I},null,544),[[Le,r.value]]),k[16]||(k[16]=At(" Agent 异常时通知 ",-1))])]),n("div",Hf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[6]||(k[6]=x=>d.value=x),onChange:I},null,544),[[Le,d.value]]),k[17]||(k[17]=At(" 任务完成时通知 ",-1))])])]),n("section",null,[k[22]||(k[22]=n("h3",null,"日志查看",-1)),n("div",Bf,[k[20]||(k[20]=n("label",null,"日志行数",-1)),Tt(n("select",{"onUpdate:modelValue":k[7]||(k[7]=x=>v.value=x),onChange:I},[...k[19]||(k[19]=[n("option",{value:50},"50 行",-1),n("option",{value:100},"100 行",-1),n("option",{value:200},"200 行",-1),n("option",{value:500},"500 行",-1)])],544),[[Pe,v.value]])]),n("div",Kf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":k[8]||(k[8]=x=>p.value=x),onChange:I},null,544),[[Le,p.value]]),k[21]||(k[21]=At(" 自动滚动日志 ",-1))])])])])]))}}),Gf=Ct(qf,[["__scopeId","data-v-e5b26232"]]);function zf(t,e=300){const s=W(null);let l=null;const i=(...r)=>{l=r,s.value&&clearTimeout(s.value),s.value=setTimeout(()=>{t(...r),s.value=null,l=null},e)},o=()=>{s.value&&(clearTimeout(s.value),s.value=null,l=null)},a=()=>{s.value&&l&&(clearTimeout(s.value),t(...l),s.value=null,l=null)};return ae(()=>{o()}),{debouncedFn:i,cancel:o,flush:a}}class Jf{constructor(e={}){this.ws=null,this.connectionState={status:"disconnected",reconnectAttempts:0},this.subscribers=new Map,this.reconnectTimer=null,this.pollingTimer=null,this.heartbeatTimer=null,this.stateListeners=new Set,this.options={wsUrl:e.wsUrl||`ws://${window.location.host}/ws`,httpFallback:e.httpFallback??!0,reconnectMaxAttempts:e.reconnectMaxAttempts??5,reconnectDelay:e.reconnectDelay??3e3,pollingInterval:e.pollingInterval??1e4}}connect(){var e;if(((e=this.ws)==null?void 0:e.readyState)!==WebSocket.OPEN){this.updateConnectionState({status:"connecting",reconnectAttempts:this.connectionState.reconnectAttempts});try{this.ws=new WebSocket(this.options.wsUrl),this.ws.onopen=()=>{this.updateConnectionState({status:"connected",lastConnected:Date.now(),reconnectAttempts:0}),this.startHeartbeat(),this.stopPolling()},this.ws.onclose=()=>{this.stopHeartbeat(),this.handleDisconnect()},this.ws.onerror=s=>{console.error("WebSocket error:",s),this.updateConnectionState({status:"error",errorMessage:"WebSocket connection failed"}),this.handleDisconnect()},this.ws.onmessage=s=>{try{const l=JSON.parse(s.data);this.handleMessage(l)}catch(l){console.error("Failed to parse WebSocket message:",l)}}}catch(s){console.error("Failed to create WebSocket:",s),this.handleDisconnect()}}}disconnect(){this.stopHeartbeat(),this.stopReconnect(),this.stopPolling(),this.ws&&(this.ws.close(),this.ws=null),this.updateConnectionState({status:"disconnected",reconnectAttempts:0})}getConnectionState(){return{...this.connectionState}}subscribe(e,s){return this.subscribers.has(e)||this.subscribers.set(e,new Set),this.subscribers.get(e).add(s),()=>{var l;(l=this.subscribers.get(e))==null||l.delete(s)}}onStateChange(e){return this.stateListeners.add(e),()=>{this.stateListeners.delete(e)}}isConnected(){return this.connectionState.status==="connected"}async fetchInitialData(){try{const[e,s,l,i]=await Promise.all([fetch("/api/collaboration").then(o=>o.json()).catch(()=>null),fetch("/api/tasks").then(o=>o.json()).catch(()=>null),fetch("/api/performance?range=20m").then(o=>o.json()).catch(()=>null),fetch("/api/agents").then(o=>o.json()).catch(()=>null)]);e&&this.emit("collaboration",e),s&&this.emit("tasks",s),l&&this.emit("performance",l),i&&this.emit("agents",i)}catch(e){console.error("Failed to fetch initial data:",e)}}handleMessage(e){if(e.type==="ping"){this.send({type:"pong",timestamp:Date.now()});return}if(e.type==="full_state"&&e.data){const s=e.data;s.agents&&this.emit("agents",s.agents),s.subagents&&this.emit("subagents",s.subagents),s.collaboration&&this.emit("collaboration",s.collaboration);const l=Array.isArray(s.tasks)?s.tasks:[];this.emit("tasks",{tasks:l}),s.performance&&this.emit("performance",s.performance);return}if(e.type==="state_update"&&e.data){const s=e.data;s.agents&&this.emit("agents_update",s.agents);return}e.channel&&e.data&&this.emit(e.channel,e.data)}emit(e,s){const l=this.subscribers.get(e);l&&l.forEach(i=>{try{i(s)}catch(o){console.error(`Error in subscriber callback for ${e}:`,o)}})}send(e){var s;((s=this.ws)==null?void 0:s.readyState)===WebSocket.OPEN&&this.ws.send(JSON.stringify(e))}handleDisconnect(){this.connectionState.reconnectAttempts<this.options.reconnectMaxAttempts?this.scheduleReconnect():this.options.httpFallback&&this.startPolling()}scheduleReconnect(){this.stopReconnect();const e=this.options.reconnectDelay*Math.pow(1.5,this.connectionState.reconnectAttempts);this.reconnectTimer=setTimeout(()=>{this.updateConnectionState({status:"connecting",reconnectAttempts:this.connectionState.reconnectAttempts+1}),this.connect()},e)}stopReconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}startHeartbeat(){this.stopHeartbeat(),this.heartbeatTimer=setInterval(()=>{this.send({type:"ping",timestamp:Date.now()})},3e4)}stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null)}startPolling(){this.stopPolling(),this.updateConnectionState({status:"connected",errorMessage:"Using HTTP polling fallback"}),this.fetchInitialData(),this.pollingTimer=setInterval(()=>{this.fetchInitialData()},this.options.pollingInterval)}stopPolling(){this.pollingTimer&&(clearInterval(this.pollingTimer),this.pollingTimer=null)}updateConnectionState(e){this.connectionState={...this.connectionState,...e},this.stateListeners.forEach(s=>{try{s(this.connectionState)}catch(l){console.error("Error in state listener:",l)}})}}let tn=null;function Fi(t){return tn||(tn=new Jf(t)),tn}class Qf{constructor(){this.state=new Map,this.cache=new Map,this.defaultTTL=5e3}getState(e){const s=this.state.get(e);return s==null?void 0:s.value}setState(e,s){const l=this.state.get(e);l?l.value=s:this.state.set(e,W(s))}useStore(e,s){const l=this.state.get(e);if(l)return l;const i=W(s);return this.state.set(e,i),i}getCache(e){const s=this.cache.get(e);if(s){if(Date.now()>s.expiresAt){this.cache.delete(e);return}return s.value}}setCache(e,s,l){this.cache.set(e,{value:s,expiresAt:Date.now()+(l??this.defaultTTL)})}hasValidCache(e){const s=this.cache.get(e);return s?Date.now()<=s.expiresAt:!1}invalidateCache(e){this.cache.delete(e)}batchUpdate(e){Object.entries(e).forEach(([s,l])=>{this.setState(s,l)})}clearAll(){this.state.clear(),this.cache.clear()}clearCache(){this.cache.clear()}}let en=null;function Yf(){return en||(en=new Qf),en}class Xf{constructor(){this.listeners=new Map,this.eventQueue=[],this.isFlushing=!1,this.maxQueueSize=100}emit(e,s){const l=this.listeners.get(e);l&&l.forEach(i=>{try{i(s)}catch(o){console.error(`Error in event handler for ${e}:`,o)}})}on(e,s){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(s),()=>{var l;(l=this.listeners.get(e))==null||l.delete(s)}}once(e,s){const l=i=>{this.off(e,l),s(i)};this.on(e,l)}off(e,s){var l;(l=this.listeners.get(e))==null||l.delete(s)}enqueue(e,s){this.eventQueue.length>=this.maxQueueSize&&(console.warn("Event queue is full, dropping oldest event"),this.eventQueue.shift()),this.eventQueue.push({event:e,payload:s})}flush(){if(!this.isFlushing){this.isFlushing=!0;try{for(;this.eventQueue.length>0;){const{event:e,payload:s}=this.eventQueue.shift();this.emit(e,s)}}finally{this.isFlushing=!1}}}getQueueLength(){return this.eventQueue.length}clearQueue(){this.eventQueue=[]}clearAll(){this.listeners.clear(),this.eventQueue=[]}}let sn=null;function Zf(){return sn||(sn=new Xf),sn}function Li(){const t=Fi(),e=W(t.getConnectionState()),s=W(!1);let l=null;const i=(r,d)=>t.subscribe(r,d),o=()=>{t.connect()},a=()=>{t.disconnect()};return Nt(()=>{l=t.onStateChange(r=>{e.value=r,s.value=r.status==="connected"}),t.isConnected()||t.connect()}),ae(()=>{l&&l()}),{connectionState:e,isConnected:s,subscribe:i,connect:o,disconnect:a}}const th={class:"indicator-icon"},eh={key:0,class:"indicator-count"},sh={class:"card-header"},nh={class:"avatar"},lh={class:"header-info"},ih={class:"name"},oh={class:"status-text"},ah={key:0,class:"main-badge"},rh={class:"card-body"},ch={key:0,class:"model-row"},uh={class:"model-value"},dh=["title"],fh={key:0,class:"fallback-more"},hh={key:1,class:"current-task"},ph=["title"],vh={key:0,class:"task-child-info"},gh={class:"child-name"},mh={key:2,class:"multi-tasks"},_h={class:"tasks-count"},yh={class:"tasks-toggle"},bh=["title"],$h={key:0,class:"task-child-agent"},kh={key:0,class:"tasks-more"},wh={class:"action-icon"},Ch={class:"action-text"},Th={key:4,class:"idle-hint"},Sh={class:"warning-modal"},xh={class:"modal-header"},Ah={class:"modal-icon"},Ih={class:"modal-title"},Mh={class:"modal-body"},Rh={class:"detail-row"},Eh={class:"detail-value error-type-tag"},Ph={class:"detail-row"},Dh={class:"detail-value"},Fh={class:"detail-row"},Lh={class:"detail-value highlight"},Oh={key:0,class:"detail-row"},Nh={class:"detail-value"},jh={key:1,class:"detail-row"},Uh={class:"detail-value"},Vh={key:2,class:"detail-row"},Wh={key:0,class:"waiting-task"},Hh={key:3,class:"stuck-suggestion"},Bh=wt({__name:"AgentCard",props:{agent:{},modelInfo:{},isMain:{type:Boolean},currentTask:{},error:{},stuckWarning:{},hierarchyDepth:{},agentColor:{},subStatus:{},currentAction:{},toolName:{},waitingFor:{},agentTasks:{}},emits:["click","navigate-agent"],setup(t,{emit:e}){const s=t,l=e,i=W(!1),o=W(!1),a=["🤖","👤","📊","🏗️","💻","🧪","🔧","📋","🎯","⚙️"],r=Q(()=>{const P=(s.agent.name||"").toLowerCase();if(P.includes("pm")||P.includes("project")||P.includes("主"))return"👨💼";if(P.includes("analyst")||P.includes("分析"))return"📊";if(P.includes("architect")||P.includes("架构"))return"🏗️";if(P.includes("dev")||P.includes("开发"))return"💻";if(P.includes("qa")||P.includes("test")||P.includes("测试"))return"🧪";if(P.includes("ops")||P.includes("运维"))return"🔧";if(P.includes("frontend")||P.includes("前端"))return"🎨";if(P.includes("backend")||P.includes("后端"))return"⚙️";let N=0;for(let Z=0;Z<P.length;Z++)N=(N<<5)-N+P.charCodeAt(Z);return a[Math.abs(N)%a.length]}),d=Q(()=>({idle:"空闲",working:"工作中",down:"异常"})[s.agent.status]||"未知"),v=Q(()=>{var P;return((P=s.agentTasks)==null?void 0:P.length)||0}),p=Q(()=>s.isMain&&v.value>=2),C=Q(()=>s.agentTasks?s.agentTasks.slice(0,3):[]),I=Q(()=>s.agentTasks?Math.max(0,s.agentTasks.length-3):0),S=Q(()=>s.agentTasks&&s.agentTasks.length===1?s.agentTasks[0].name:s.currentTask),k=Q(()=>{if(s.agentTasks&&s.agentTasks.length===1)return s.agentTasks[0].childAgentId}),x=Q(()=>({thinking:"🧠",tool_executing:"⚙️",waiting_llm:"📡",waiting_child:"⏳"})[s.subStatus||""]||"🔄"),T=Q(()=>{var N;return{"rate-limit":"请求过快","token-limit":"Token 超限",timeout:"请求超时",quota:"余额不足",unknown:"发生错误"}[((N=s.error)==null?void 0:N.type)||"unknown"]||"发生错误"}),b=Q(()=>{var N;return{waiting_for_child:"等待子代理响应",self_busy:"自身处理中",unknown:"原因未明"}[((N=s.stuckWarning)==null?void 0:N.reason)||"unknown"]||"原因未明"}),M=Q(()=>{if(!s.stuckWarning)return null;const P=s.stuckWarning.reason,N=s.stuckWarning.idleSeconds;return P==="waiting_for_child"?N>180?"子代理响应时间过长,建议检查子代理状态或考虑终止任务":"子代理正在执行任务,请耐心等待":P==="self_busy"?N>120?"任务处理时间过长,可能遇到复杂问题或外部资源阻塞":"正在处理复杂任务,请稍候":null});function _(P){const N=P.split("/");return N[N.length-1]||P}function w(){i.value=!0}function K(P){l("navigate-agent",P),i.value=!1}return(P,N)=>{var Z;return c(),u("div",{class:nt(["agent-card",[`status-${t.agent.status}`,{"is-main":t.isMain}]]),onClick:N[4]||(N[4]=F=>P.$emit("click"))},[t.error||t.stuckWarning?(c(),u("div",{key:0,class:nt(["warning-indicator",{"has-error":t.error}]),onClick:le(w,["stop"])},[n("span",th,f(t.error?"⚠️":"⏳"),1),t.stuckWarning?(c(),u("span",eh,f(t.stuckWarning.idleSeconds)+"s",1)):R("",!0)],2)):R("",!0),n("div",sh,[n("div",nh,f(r.value),1),n("div",lh,[n("div",ih,f(t.agent.name),1),n("div",{class:nt(["status-pill",`status-${t.agent.status}`])},[n("span",{class:nt(["status-dot",`status-${t.agent.status}`])},null,2),n("span",oh,f(d.value),1)],2)]),t.isMain?(c(),u("div",ah,"PM")):R("",!0)]),n("div",rh,[t.modelInfo&&t.modelInfo.primary?(c(),u("div",ch,[N[5]||(N[5]=n("span",{class:"model-label"},"模型",-1)),n("span",uh,f(_(t.modelInfo.primary)),1),(Z=t.modelInfo.fallbacks)!=null&&Z.length?(c(),u("span",{key:0,class:"model-fallbacks",title:"备用: "+t.modelInfo.fallbacks.map(_).join(", ")},[(c(!0),u(Y,null,ct(t.modelInfo.fallbacks.slice(0,2),(F,q)=>(c(),u("span",{key:F,class:"fallback-tag"},f(_(F)),1))),128)),t.modelInfo.fallbacks.length>2?(c(),u("span",fh,"+"+f(t.modelInfo.fallbacks.length-2),1)):R("",!0)],8,dh)):R("",!0)])):R("",!0),S.value&&!p.value?(c(),u("div",hh,[N[7]||(N[7]=n("div",{class:"task-header"},[n("span",{class:"task-icon"},"▶"),n("span",{class:"task-label"},"当前任务")],-1)),n("div",{class:"task-name",title:S.value},f(S.value),9,ph),k.value?(c(),u("div",vh,[N[6]||(N[6]=n("span",{class:"child-arrow"},"→",-1)),n("span",gh,f(k.value),1)])):R("",!0)])):R("",!0),p.value?(c(),u("div",mh,[n("div",{class:"tasks-header",onClick:N[0]||(N[0]=le(F=>o.value=!o.value,["stop"]))},[N[8]||(N[8]=n("span",{class:"tasks-icon"},"📋",-1)),N[9]||(N[9]=n("span",{class:"tasks-label"},"并行任务",-1)),n("span",_h,f(v.value),1),n("span",yh,f(o.value?"▲":"▼"),1)]),n("div",{class:nt(["tasks-list",{expanded:o.value}])},[(c(!0),u(Y,null,ct(C.value,F=>(c(),u("div",{key:F.id,class:nt(["task-item",`task-status-${F.status}`])},[N[10]||(N[10]=n("span",{class:"task-status-dot"},null,-1)),n("span",{class:"task-name",title:F.name},f(F.name),9,bh),F.childAgentId?(c(),u("span",$h,"→ "+f(F.childAgentId),1)):R("",!0)],2))),128)),I.value>0?(c(),u("div",kh," +"+f(I.value)+" 更多任务 ",1)):R("",!0)],2)])):R("",!0),t.agent.status==="working"&&t.currentAction?(c(),u("div",{key:3,class:nt(["status-detail",`sub-status-${t.subStatus}`])},[n("span",wh,f(x.value),1),n("span",Ch,f(t.currentAction),1)],2)):t.agent.status==="idle"?(c(),u("div",Th," 空闲中,等待任务... ")):R("",!0)]),(c(),Gt(Po,{to:"body"},[i.value?(c(),u("div",{key:0,class:"warning-modal-overlay",onClick:N[3]||(N[3]=le(F=>i.value=!1,["self"]))},[n("div",Sh,[n("div",xh,[n("span",Ah,f(t.error?"⚠️":"⏳"),1),n("span",Ih,f(t.error?"异常详情":"卡顿分析"),1),n("button",{class:"modal-close",onClick:N[1]||(N[1]=F=>i.value=!1)},"×")]),n("div",Mh,[t.error?(c(),u(Y,{key:0},[n("div",Rh,[N[11]||(N[11]=n("span",{class:"detail-label"},"类型",-1)),n("span",Eh,f(T.value),1)]),n("div",Ph,[N[12]||(N[12]=n("span",{class:"detail-label"},"信息",-1)),n("span",Dh,f(t.error.message),1)])],64)):t.stuckWarning?(c(),u(Y,{key:1},[n("div",Fh,[N[13]||(N[13]=n("span",{class:"detail-label"},"等待时间",-1)),n("span",Lh,f(t.stuckWarning.idleSeconds)+" 秒",1)]),t.stuckWarning.reason?(c(),u("div",Oh,[N[14]||(N[14]=n("span",{class:"detail-label"},"原因",-1)),n("span",Nh,f(b.value),1)])):R("",!0),t.stuckWarning.reasonDetail?(c(),u("div",jh,[N[15]||(N[15]=n("span",{class:"detail-label"},"详情",-1)),n("span",Uh,f(t.stuckWarning.reasonDetail),1)])):R("",!0),t.stuckWarning.waitingFor?(c(),u("div",Vh,[N[16]||(N[16]=n("span",{class:"detail-label"},"等待对象",-1)),n("span",{class:"detail-value agent-link",onClick:N[2]||(N[2]=F=>K(t.stuckWarning.waitingFor.agentId))},[At(f(t.stuckWarning.waitingFor.agentId)+" ",1),t.stuckWarning.waitingFor.task?(c(),u("span",Wh,"("+f(t.stuckWarning.waitingFor.task)+")",1)):R("",!0)])])):R("",!0),M.value?(c(),u("div",Hh,[N[17]||(N[17]=n("span",{class:"suggestion-icon"},"💡",-1)),n("span",null,f(M.value),1)])):R("",!0)],64)):R("",!0)])])])):R("",!0)]))],2)}}}),Kh=Ct(Bh,[["__scopeId","data-v-04c4a970"]]),qh={class:"collaboration-flow-section"},Gh={class:"section-header"},zh={class:"header-right"},Jh={key:0,class:"flow-legend flow-legend-inline"},Qh={class:"legend-name"},Yh={class:"indicator-text"},Xh={class:"flow-container",ref:"flowContainerRef"},Zh={key:0,class:"loading-state"},tp={key:1,class:"error-state"},ep={key:2,class:"empty-state"},sp={key:3,class:"flow-layout"},np={class:"level-header"},lp={class:"level-badge"},ip={class:"level-title"},op={class:"level-cards"},ap=["onClick"],rp=["d"],cp={key:0,r:"5",fill:"url(#lightGradient)"},up={dur:"2s",repeatCount:"1",rotate:"0"},dp=["href"],fp={key:0,class:"model-panel"},hp={class:"model-toggle-icon"},pp={class:"model-panel-body"},vp={class:"model-name"},gp={class:"model-dots"},mp=["title","onClick"],_p={class:"model-count"},yp={class:"call-detail-modal"},bp={class:"call-detail-header"},$p={class:"call-detail-body"},kp={class:"call-detail-row"},wp={class:"value"},Cp={class:"call-detail-row"},Tp={class:"value"},Sp={class:"call-detail-row"},xp={class:"value"},Ap={class:"call-detail-row"},Ip={class:"value"},Mp={class:"call-detail-row trigger"},Rp={class:"value"},Ep=1500,Pp=wt({__name:"CollaborationFlowSection",props:{mainAgent:{},subAgents:{},mainAgentId:{}},emits:["agent-click"],setup(t,{emit:e}){const s=t,l=e,{connectionState:i,subscribe:o}=Li(),a=W([]),r=W([]),d=W([]),v=W({}),p=W([]),C=W(!0),I=W(null),S=W(null),k=W({}),x=W({}),T=W(""),b=W(!0),M=W({}),_=W(null),w=W(null),K=W({});function P(g,m){m&&(K.value[g]=m)}const N=Q(()=>s.mainAgentId?s.mainAgentId:T.value?T.value:"main"),Z=Q(()=>a.value.filter(g=>g.type==="agent")),F=Q(()=>a.value.filter(g=>g.type==="model")),q=Q(()=>r.value.filter(g=>g.type==="delegates")),G=Q(()=>{const g={};for(const O of Z.value){const D=X(O.id);g[D]||(g[D]=[]),g[D].push(O)}const m={};return Object.keys(g).map(Number).sort((O,D)=>O-D).forEach(O=>{m[O]=g[O]}),m});function A(g){return g===0?"主控":g===1?"一级子代理":`${g}级子代理`}const st={"analyst-agent":"#10b981","architect-agent":"#f59e0b","devops-agent":"#8b5cf6","test-agent":"#ec4899","frontend-agent":"#06b6d4","backend-agent":"#f43f5e"};function mt(g){return g===N.value?"#4a9eff":st[g]||"#64748b"}const L=Q(()=>Z.value.map(g=>g.id).filter(Boolean)),U=Q(()=>({connected:"已连接",connecting:"连接中...",disconnected:"未连接",error:"连接错误"})[i.value.status]||"未知");function X(g){return g===N.value?x.value[g]??0:x.value[g]??1}function it(g){const m=Z.value.find(O=>O.id===g);return(m==null?void 0:m.name)||g}function V(g){var D;const m=j=>j==="error"?"down":j,O=g.id===N.value?s.mainAgent:(D=s.subAgents)==null?void 0:D.find(j=>j.id===g.id);if(O&&g.type==="agent"){const j=ot(g.id);let $;const J=g.status==="idle"||g.status==="error";J||((j==null?void 0:j.length)===1?$=j[0].name:j&&j.length>1&&($=`${j.length} 个任务进行中`));const z=J?void 0:O.currentTask;return{name:O.name,status:m(g.status),currentTask:$??z,lastActiveFormatted:O.lastActiveFormatted}}return O?{name:O.name,status:O.status,currentTask:O.currentTask,lastActiveFormatted:O.lastActiveFormatted}:{name:g.name,status:m(g.status)}}function H(g){if(g.type!=="agent")return;const m=v.value[g.id];if(m)return m;const O=g.id.toLowerCase();for(const[D,j]of Object.entries(v.value))if(D.toLowerCase()===O)return j}function ot(g){const m=M.value,O=m[g];if(O!=null&&O.length)return O;const D=g.toLowerCase();for(const[j,$]of Object.entries(m))if(j.toLowerCase()===D&&($!=null&&$.length))return $}function lt(g){if(d.value.includes(g.id))return!0;const m=g.id.toLowerCase();return d.value.some(O=>O.toLowerCase()===m)}function ft(g){const m=d.value,O=D=>m.includes(D)||m.some(j=>j.toLowerCase()===D.toLowerCase());return O(g.source)&&O(g.target)}function tt(g){const m=K.value[g.source],O=K.value[g.target],D=_.value;if(!m||!O||!D)return"";const j=D.getBoundingClientRect(),$=m.getBoundingClientRect(),J=O.getBoundingClientRect(),z=$.left-j.left+$.width/2,et=$.top-j.top+$.height,at=J.left-j.left+J.width/2,dt=J.top-j.top,vt=(et+dt)/2;return`M ${z} ${et} C ${z} ${vt}, ${at} ${vt}, ${at} ${dt}`}function kt(){Me(()=>{if(!_.value||!w.value)return;const g=_.value.getBoundingClientRect();w.value.setAttribute("width",String(g.width)),w.value.setAttribute("height",String(g.height))})}const It=Q(()=>{const g={};for(const m of p.value){const O=m.model||"(unknown)";g[O]||(g[O]=[]),g[O].push(m)}return g});function Dt(g){var D;const m=((D=g.metadata)==null?void 0:D.modelId)||"",O=m.split("/").pop()||m;return It.value[m]||It.value[O]||[]}function _e(g){return Dt(g).length>0}async function ye(){C.value=!0,I.value=null;try{const g=await fetch("/api/collaboration");if(!g.ok)throw new Error("Failed to fetch collaboration data");const m=await g.json();a.value=m.nodes||[],r.value=m.edges||[],d.value=m.activePath||[],v.value=m.agentModels||{},p.value=m.recentCalls||[],m.hierarchy&&(k.value=m.hierarchy),m.depths&&(x.value=m.depths),m.mainAgentId&&(T.value=m.mainAgentId),m.agentActiveTasks&&(M.value=m.agentActiveTasks),Me(kt)}catch(g){I.value=g.message}finally{C.value=!1}}function Qt(){ye()}function Se(g){const m=g;a.value=m.nodes||[],r.value=m.edges||[],d.value=m.activePath||[],v.value=m.agentModels||{},p.value=m.recentCalls||[],m.hierarchy&&(k.value=m.hierarchy),m.depths&&(x.value=m.depths),m.mainAgentId&&(T.value=m.mainAgentId),m.agentActiveTasks&&(M.value=m.agentActiveTasks),Me(kt)}function h(g){d.value=g.activePath||[],p.value=g.recentCalls||[],g.agentActiveTasks&&(M.value=g.agentActiveTasks);const m=a.value.filter($=>$.type==="agent");for(const $ of m){if($.id&&g.agentStatuses&&g.agentStatuses[$.id]!==void 0&&($.status=g.agentStatuses[$.id]),$.id&&g.agentDynamicStatuses&&g.agentDynamicStatuses[$.id]){const J=g.agentDynamicStatuses[$.id];$.subStatus=J.subStatus,$.currentAction=J.currentAction,$.toolName=J.toolName,$.waitingFor=J.waitingFor}if($.id&&g.agentDisplayStatuses&&g.agentDisplayStatuses[$.id]){const J=g.agentDisplayStatuses[$.id];$.currentAction=J.display,$.metadata||($.metadata={}),$.metadata={...$.metadata,duration:J.duration,alert:J.alert},J.alert?$.stuckWarning={isStuck:!0,idleSeconds:J.duration,lastUpdate:Date.now(),reason:"self_busy",reasonDetail:J.display}:$.stuckWarning&&!$.stuckWaitingForChildAgent&&($.stuckWarning=void 0)}}const O=new Set(a.value.filter($=>$.type==="task").map($=>$.id)),D=new Set((g.taskNodes||[]).map($=>$.id));if(O.size!==D.size||[...D].some($=>!O.has($))){const $=a.value.filter(z=>z.type==="model"),J=r.value.filter(z=>z.type==="delegates");a.value=[...m,...g.taskNodes||[],...$],r.value=[...J,...g.taskEdges||[]],Me(kt)}else{const $=new Map((g.taskNodes||[]).map(J=>[J.id,J]));for(const J of a.value.filter(z=>z.type==="task")){const z=$.get(J.id);z&&(J.status=z.status,J.name=z.name,z.timestamp&&(J.timestamp=z.timestamp))}}}async function y(){if(!(C.value||a.value.length===0))try{const g=await fetch("/api/collaboration/dynamic");if(!g.ok)return;const m=await g.json();h(m)}catch{}}let E=null,B=null;return Bt([Z,b],()=>{Me(kt)}),Nt(()=>{ye(),E=o("collaboration",Se),B=setInterval(y,Ep),window.addEventListener("resize",kt)}),ae(()=>{E&&E(),B&&clearInterval(B),window.removeEventListener("resize",kt)}),(g,m)=>{var O;return c(),u("div",qh,[n("div",Gh,[m[4]||(m[4]=n("h2",null,"协作流程",-1)),n("div",zh,[Z.value.length>0?(c(),u("div",Jh,[(c(!0),u(Y,null,ct(L.value,D=>(c(),u("div",{key:D,class:"legend-item"},[n("span",{class:"legend-dot",style:St({background:mt(D)})},null,4),n("span",Qh,f(it(D)),1)]))),128))])):R("",!0),n("div",{class:nt(["connection-indicator",rs(i).status])},[m[3]||(m[3]=n("span",{class:"indicator-dot"},null,-1)),n("span",Yh,f(U.value),1)],2)])]),n("div",Xh,[C.value?(c(),u("div",Zh,[...m[5]||(m[5]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载中...",-1)])])):I.value?(c(),u("div",tp,[m[6]||(m[6]=n("span",{class:"error-icon"},"⚠️",-1)),n("span",null,f(I.value),1),n("button",{onClick:Qt,class:"retry-btn"},"重试")])):a.value.length===0?(c(),u("div",ep,[...m[7]||(m[7]=[n("span",{class:"empty-icon"},"📭",-1),n("span",null,"暂无协作数据",-1)])])):(c(),u("div",sp,[n("div",{class:"agent-area",ref_key:"agentAreaRef",ref:_},[(c(!0),u(Y,null,ct(G.value,(D,j)=>(c(),u("div",{key:j,class:"level-section"},[n("div",np,[n("span",lp,"L"+f(j),1),n("span",ip,f(A(Number(j))),1)]),n("div",op,[(c(!0),u(Y,null,ct(D,$=>(c(),u("div",{key:$.id,class:nt(["agent-card-wrapper",{"main-agent":$.id===N.value,active:lt($),[`status-${$.status}`]:!0}]),style:St({"--agent-color":mt($.id)}),ref_for:!0,ref:J=>P($.id,J),onClick:J=>l("agent-click",$)},[bt(Kh,{agent:V($),"model-info":H($),"is-main":$.id===N.value,"current-task":$.currentTask,error:$.error,"stuck-warning":$.stuckWarning,"hierarchy-depth":X($.id),"agent-color":mt($.id),"sub-status":$.subStatus,"current-action":$.currentAction,"tool-name":$.toolName,"waiting-for":$.waitingFor,"agent-tasks":ot($.id)},null,8,["agent","model-info","is-main","current-task","error","stuck-warning","hierarchy-depth","agent-color","sub-status","current-action","tool-name","waiting-for","agent-tasks"])],14,ap))),128))])]))),128)),(c(),u("svg",{class:"edges-svg",ref_key:"edgesSvgRef",ref:w},[m[8]||(m[8]=n("defs",null,[n("linearGradient",{id:"lightGradient",x1:"0%",y1:"0%",x2:"100%",y2:"0%"},[n("stop",{offset:"0%",style:{"stop-color":"#4a9eff","stop-opacity":"0.2"}}),n("stop",{offset:"50%",style:{"stop-color":"#4a9eff","stop-opacity":"1"}}),n("stop",{offset:"100%",style:{"stop-color":"#4a9eff","stop-opacity":"0.2"}})])],-1)),(c(!0),u(Y,null,ct(q.value,D=>(c(),u("g",{key:D.id},[n("path",{d:tt(D),class:nt(["edge-path",{active:ft(D)}]),stroke:"#4a9eff","stroke-width":"2",fill:"none"},null,10,rp),ft(D)?(c(),u("circle",cp,[n("animateMotion",up,[n("mpath",{href:`#edge-${D.id}`},null,8,dp)])])):R("",!0)]))),128))],512))],512),F.value.length>0?(c(),u("div",fp,[n("div",{class:"model-panel-header",onClick:m[0]||(m[0]=D=>b.value=!b.value)},[m[9]||(m[9]=n("span",{class:"model-panel-title"},"🧠 模型",-1)),n("span",hp,f(b.value?"▼":"▶"),1)]),Tt(n("div",pp,[(c(!0),u(Y,null,ct(F.value,D=>(c(),u("div",{key:D.id,class:nt(["model-card",{active:_e(D)}])},[n("div",vp,f(D.name),1),n("div",gp,[(c(!0),u(Y,null,ct(Dt(D).slice(0,8),j=>(c(),u("span",{key:j.id,class:"model-dot",style:St({background:mt(j.agentId)}),title:`${it(j.agentId)} @ ${j.model||"unknown"}`,onClick:le($=>S.value=j,["stop"])},null,12,mp))),128))]),n("div",_p,f(Dt(D).length),1)],2))),128))],512),[[fs,b.value]])])):R("",!0)]))],512),S.value?(c(),u("div",{key:0,class:"call-detail-overlay",onClick:m[2]||(m[2]=le(D=>S.value=null,["self"]))},[n("div",yp,[n("div",bp,[m[10]||(m[10]=n("h3",null,"调用详情",-1)),n("button",{class:"close-btn",onClick:m[1]||(m[1]=D=>S.value=null)},"×")]),n("div",$p,[n("div",kp,[m[11]||(m[11]=n("span",{class:"label"},"Agent",-1)),n("span",wp,f(S.value.agentId),1)]),n("div",Cp,[m[12]||(m[12]=n("span",{class:"label"},"模型",-1)),n("span",Tp,f(S.value.model),1)]),n("div",Sp,[m[13]||(m[13]=n("span",{class:"label"},"时间",-1)),n("span",xp,f(S.value.time),1)]),n("div",Ap,[m[14]||(m[14]=n("span",{class:"label"},"Tokens",-1)),n("span",Ip,f(S.value.tokens),1)]),n("div",Mp,[m[15]||(m[15]=n("span",{class:"label"},"触发",-1)),n("div",Rp,f((O=S.value.trigger)==null?void 0:O.replace(/^【完成回传】/,"")),1)])])])])):R("",!0)])}}}),Dp=Ct(Pp,[["__scopeId","data-v-50bc0adc"]]),Fp={class:"collaboration-box"},Lp={class:"collaboration-box-body"},Op={class:"collaboration-error-fallback"},Np={class:"fallback-reason"},jp=wt({__name:"CollaborationFlowWrapper",props:{mainAgent:{},subAgents:{},mainAgentId:{}},emits:["agent-click"],setup(t){const e=W(null);return ci(s=>(e.value=s instanceof Error?s.message:String(s),!1)),(s,l)=>(c(),u("div",Fp,[l[3]||(l[3]=n("div",{class:"collaboration-box-header"},[n("h2",null,"协作流程"),n("span",{class:"collaboration-hint"},"展示主 Agent 与子 Agents 的协作关系")],-1)),n("div",Lp,[Tt(bt(Dp,{"main-agent":t.mainAgent,"sub-agents":t.subAgents,"main-agent-id":t.mainAgentId,onAgentClick:l[0]||(l[0]=i=>s.$emit("agent-click",i))},null,8,["main-agent","sub-agents","main-agent-id"]),[[fs,!e.value]]),Tt(n("div",Op,[l[2]||(l[2]=n("p",{class:"fallback-title"},"协作流程加载失败",-1)),n("p",Np,f(e.value),1),n("button",{onClick:l[1]||(l[1]=i=>e.value=null)},"重试")],512),[[fs,e.value]])])]))}}),Up=Ct(jp,[["__scopeId","data-v-ef9f8c73"]]),Vp={class:"task-status-section"},Wp={class:"section-header"},Hp={class:"summary-stats"},Bp={class:"stat total"},Kp={class:"filters-row"},qp={class:"search-box"},Gp={class:"filter-buttons"},zp=["onClick"],Jp={key:0,class:"loading-state"},Qp={key:1,class:"error-state"},Yp={key:2,class:"empty-state"},Xp={class:"task-list"},Zp=["onClick"],tv={class:"task-main"},ev={class:"task-name-short"},sv={key:0,class:"task-agent"},nv={key:1,class:"task-time"},lv={class:"task-detail-modal"},iv={class:"task-detail-header"},ov={class:"task-detail-body"},av={class:"detail-row"},rv={class:"detail-value task-content"},cv={key:0,class:"detail-row"},uv={class:"detail-value"},dv={class:"detail-row"},fv={class:"detail-value"},hv={key:1,class:"detail-row"},pv={class:"detail-value"},vv={key:2,class:"detail-row"},gv={class:"detail-value path-value"},mv={key:3,class:"detail-row"},_v={class:"detail-value"},yv={key:4,class:"detail-row"},bv={class:"detail-progress"},$v={class:"progress-bar"},kv={class:"progress-text"},wv={key:5,class:"detail-row"},Cv={class:"detail-value error"},Tv={key:6,class:"detail-row"},Sv={class:"generated-files-list"},xv={key:7,class:"detail-row"},Av={class:"detail-value output-content"},Iv={key:8,class:"detail-row"},Mv={class:"detail-subtasks"},Rv={key:0,class:"subtask-error-inline"},Ev={key:9,class:"detail-row"},Pv={class:"timeline-container"},Dv={class:"timeline"},Fv={class:"timeline-time"},Lv={class:"timeline-desc"},Ov=wt({__name:"TaskStatusSection",setup(t){const{subscribe:e}=Li(),s=W([]),l=W(!0),i=W(null),o=W(""),a=W([]),r=W(null),d=W(null),v=W([]),p=W(!1),C=[{value:"running",label:"执行中"},{value:"completed",label:"已完成"},{value:"failed",label:"失败"},{value:"pending",label:"待分配"}];zf(L=>{},300);const I=Q(()=>{let L=s.value;if(a.value.length>0&&(L=L.filter(U=>a.value.includes(U.status))),o.value){const U=o.value.toLowerCase();L=L.filter(X=>{var it;return X.name.toLowerCase().includes(U)||((it=X.agentName)==null?void 0:it.toLowerCase().includes(U))})}return L}),S=Q(()=>({total:s.value.length,running:s.value.filter(L=>L.status==="running").length,completed:s.value.filter(L=>L.status==="completed").length,failed:s.value.filter(L=>L.status==="failed").length,pending:s.value.filter(L=>L.status==="pending").length,cancelled:s.value.filter(L=>L.status==="cancelled").length}));function k(L){return{pending:"⏳",running:"🔄",completed:"✅",failed:"❌",cancelled:"🚫"}[L]||"📋"}function x(L){return s.value.filter(U=>U.status===L).length}function T(L){if(!L||!L.trim())return"未知";const U=L.trim().toLowerCase(),X={terminated:"任务被终止(可能是超时或被用户取消)",timeout:"任务执行超时",cancelled:"任务已取消",canceled:"任务已取消",killed:"任务被终止","subagent-error":"子任务执行异常"};for(const[it,V]of Object.entries(X))if(U.includes(it))return V;return L.trim()}function b(L){return!L||typeof L!="string"?"":L.replace(/\*\*/g,"").replace(/`([^`]+)`/g,"$1")}function M(L){if(!L.startTime)return"";const U=new Date(L.startTime).getTime(),X=L.endTime?new Date(L.endTime).getTime():Date.now(),it=Math.floor((X-U)/1e3);return it<60?`${it}s`:it<3600?`${Math.floor(it/60)}m ${it%60}s`:`${Math.floor(it/3600)}h ${Math.floor(it%3600/60)}m`}function _(L){const U=a.value.indexOf(L);U===-1?a.value.push(L):a.value.splice(U,1)}function w(L){a.value.length===1&&a.value[0]===L?a.value=[]:a.value=[L]}function K(L){const X=b(L.task??L.name).split(`
|
|
24
24
|
`)[0].trim();return X.length<=60?X:X.slice(0,60)+"…"}function P(L){return{pending:"待分配",running:"执行中",completed:"已完成",failed:"失败",cancelled:"已取消"}[L]||L}async function N(){l.value=!0,i.value=null;try{const L=await fetch("/api/tasks");if(!L.ok)throw new Error("Failed to fetch tasks");const U=await L.json();s.value=(U.tasks||[]).map(X=>q(X))}catch(L){i.value=L.message}finally{l.value=!1}}function Z(L){return{pending:"pending",assigning:"pending",running:"running",in_progress:"running",active:"running",completed:"completed",success:"completed",failed:"failed",error:"failed",cancelled:"cancelled"}[L]||"pending"}function F(){N()}function q(L){const U=(L.subtasks||[]).map(X=>({id:X.id||X.name,name:X.name||"Unknown",task:X.task,status:Z(X.status),progress:X.progress??0,startTime:X.startTime,endTime:X.endTime,agentId:X.agentId,agentName:X.agentName,agentWorkspace:X.agentWorkspace,taskPath:X.taskPath,error:X.error,output:X.output,generatedFiles:X.generatedFiles}));return{id:L.id,name:L.name||"Unknown Task",task:L.task,status:Z(L.status),progress:L.progress??0,startTime:L.startTime,endTime:L.endTime,agentId:L.agentId,agentName:L.agentName,agentWorkspace:L.agentWorkspace,taskPath:L.taskPath,error:L.error,output:L.output,generatedFiles:L.generatedFiles,subtasks:U.length?U:void 0}}function G(L){const X=(Array.isArray(L)?L:L&&typeof L=="object"&&"tasks"in L?L.tasks??[]:[]).map(it=>q(it));X.length===0&&s.value.length>0||(s.value=X)}function A(L){return L?new Date(L).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}async function st(L){if(!L){v.value=[];return}p.value=!0;try{const U=await fetch(`/api/tasks/${L}/timeline`);if(U.ok){const X=await U.json();v.value=X.timeline||[]}}catch(U){console.error("Failed to fetch timeline:",U),v.value=[]}finally{p.value=!1}}Bt(r,L=>{L?st(L.id):v.value=[]});let mt=null;return Nt(()=>{N(),mt=e("tasks",G)}),ae(()=>{mt&&mt()}),(L,U)=>{var X,it;return c(),u("div",Vp,[n("div",Wp,[U[6]||(U[6]=n("h2",null,"任务状态",-1)),n("div",Hp,[n("span",{class:nt(["stat running clickable",{active:a.value.includes("running")}]),onClick:U[0]||(U[0]=V=>w("running"))},"执行中: "+f(S.value.running),3),n("span",{class:nt(["stat completed clickable",{active:a.value.includes("completed")}]),onClick:U[1]||(U[1]=V=>w("completed"))},"已完成: "+f(S.value.completed),3),n("span",{class:nt(["stat failed clickable",{active:a.value.includes("failed")}]),onClick:U[2]||(U[2]=V=>w("failed"))},"失败: "+f(S.value.failed),3),n("span",Bp,"总计: "+f(S.value.total),1)])]),n("div",Kp,[n("div",qp,[Tt(n("input",{"onUpdate:modelValue":U[3]||(U[3]=V=>o.value=V),type:"text",placeholder:"搜索任务...",class:"search-input"},null,512),[[jn,o.value]])]),n("div",Gp,[(c(),u(Y,null,ct(C,V=>n("button",{key:V.value,class:nt(["filter-btn",{active:a.value.includes(V.value)}]),onClick:H=>_(V.value)},f(V.label)+" ("+f(x(V.value))+") ",11,zp)),64))])]),l.value?(c(),u("div",Jp,[...U[7]||(U[7]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载任务数据...",-1)])])):i.value?(c(),u("div",Qp,[U[8]||(U[8]=n("span",{class:"error-icon"},"⚠️",-1)),n("span",null,f(i.value),1),n("button",{onClick:F,class:"retry-btn"},"重试")])):I.value.length===0?(c(),u("div",Yp,[U[9]||(U[9]=n("span",{class:"empty-icon"},"📭",-1)),n("span",null,f(o.value?"无匹配任务":"暂无任务数据"),1)])):(c(),u("div",{key:3,class:"task-list-container",ref_key:"containerRef",ref:d},[n("div",Xp,[(c(!0),u(Y,null,ct(I.value,V=>(c(),u("div",{key:V.id,class:"task-item",onClick:H=>r.value=V},[n("span",{class:nt(["task-status-icon",V.status])},f(k(V.status)),3),n("div",tv,[n("div",ev,f(K(V)),1)]),V.agentName?(c(),u("span",sv,f(V.agentName),1)):R("",!0),V.startTime?(c(),u("span",nv,f(M(V)),1)):R("",!0),U[10]||(U[10]=n("span",{class:"task-detail-hint"},"详情 ›",-1))],8,Zp))),128))])],512)),r.value?(c(),u("div",{key:4,class:"task-detail-overlay",onClick:U[5]||(U[5]=le(V=>r.value=null,["self"]))},[n("div",lv,[n("div",iv,[U[11]||(U[11]=n("h3",null,"任务详情",-1)),n("button",{class:"close-btn",onClick:U[4]||(U[4]=V=>r.value=null)},"×")]),n("div",ov,[n("div",av,[U[12]||(U[12]=n("span",{class:"detail-label"},"任务",-1)),n("span",rv,f(b(r.value.task??r.value.name)),1)]),r.value.taskPath?(c(),u("div",cv,[U[13]||(U[13]=n("span",{class:"detail-label"},"项目路径",-1)),n("span",uv,f(b(r.value.taskPath)),1)])):R("",!0),n("div",dv,[U[14]||(U[14]=n("span",{class:"detail-label"},"状态",-1)),n("span",fv,[n("span",{class:nt(["task-status-icon",r.value.status])},f(k(r.value.status)),3),At(" "+f(P(r.value.status)),1)])]),r.value.agentName?(c(),u("div",hv,[U[15]||(U[15]=n("span",{class:"detail-label"},"执行者",-1)),n("span",pv,f(r.value.agentName),1)])):R("",!0),r.value.agentWorkspace?(c(),u("div",vv,[U[16]||(U[16]=n("span",{class:"detail-label"},"Agent 工作区路径",-1)),n("span",gv,f(r.value.agentWorkspace),1)])):R("",!0),r.value.startTime?(c(),u("div",mv,[U[17]||(U[17]=n("span",{class:"detail-label"},"耗时",-1)),n("span",_v,f(M(r.value)),1)])):R("",!0),r.value.status==="running"?(c(),u("div",yv,[U[18]||(U[18]=n("span",{class:"detail-label"},"进度",-1)),n("div",bv,[n("div",$v,[n("div",{class:"progress-fill",style:St({width:`${r.value.progress}%`})},null,4)]),n("span",kv,f(r.value.progress)+"%",1)])])):R("",!0),r.value.status==="failed"?(c(),u("div",wv,[U[19]||(U[19]=n("span",{class:"detail-label"},"失败原因",-1)),n("span",Cv,f(T(r.value.error)),1)])):R("",!0),r.value.status==="completed"&&((X=r.value.generatedFiles)!=null&&X.length)?(c(),u("div",Tv,[U[20]||(U[20]=n("span",{class:"detail-label"},"生成的文件",-1)),n("ul",Sv,[(c(!0),u(Y,null,ct(r.value.generatedFiles,V=>(c(),u("li",{key:V,class:"file-path-item"},f(V),1))),128))])])):R("",!0),r.value.status==="completed"&&r.value.output?(c(),u("div",xv,[U[21]||(U[21]=n("span",{class:"detail-label"},"Agent 输出",-1)),n("div",Av,f(b(r.value.output)),1)])):R("",!0),(it=r.value.subtasks)!=null&&it.length?(c(),u("div",Iv,[U[22]||(U[22]=n("span",{class:"detail-label"},"子任务",-1)),n("div",Mv,[(c(!0),u(Y,null,ct(r.value.subtasks,V=>(c(),u("div",{key:V.id,class:"subtask-row"},[n("span",{class:nt(["task-status-icon",V.status])},f(k(V.status)),3),n("span",null,f(V.name),1),V.status==="failed"?(c(),u("span",Rv,f(T(V.error)),1)):R("",!0)]))),128))])])):R("",!0),v.value.length>0?(c(),u("div",Ev,[U[24]||(U[24]=n("span",{class:"detail-label"},"执行时间线",-1)),n("div",Pv,[n("div",Dv,[(c(!0),u(Y,null,ct(v.value,(V,H)=>(c(),u("div",{key:H,class:nt(["timeline-item",V.type])},[n("span",Fv,f(A(V.time)),1),U[23]||(U[23]=n("span",{class:"timeline-dot"},null,-1)),n("span",Lv,f(V.description),1)],2))),128))])])])):R("",!0)])])])):R("",!0)])}}}),Nv=Ct(Ov,[["__scopeId","data-v-5d944098"]]),jv={class:"performance-section"},Uv={class:"section-header"},Vv={class:"time-range-selector"},Wv=["onClick"],Hv={key:0,class:"loading-state"},Bv={key:1,class:"error-state"},Kv={class:"metrics-grid"},qv={class:"metric-card primary"},Gv={class:"metric-content"},zv={class:"metric-value"},Jv={key:0,class:"metric-alert"},Qv={class:"metric-card"},Yv={class:"metric-content"},Xv={class:"metric-value"},Zv={class:"metric-card highlight"},tg={class:"metric-content"},eg={class:"metric-value"},sg={class:"metric-unit"},ng={class:"metric-card highlight"},lg={class:"metric-content"},ig={class:"metric-value"},og={class:"metric-unit"},ag={class:"charts-stack"},rg={class:"chart-card"},cg={class:"chart-header"},ug={class:"chart-datetime"},dg={class:"chart-container"},fg={class:"chart-bars"},hg=["title","onClick"],pg={class:"bar-value"},vg={class:"bar-time-label"},gg={class:"chart-card"},mg={class:"chart-header"},_g={class:"chart-datetime"},yg={class:"chart-container"},bg={class:"chart-bars rpm"},$g=["title","onClick"],kg={class:"bar-value"},wg={class:"bar-time-label"},Cg={class:"summary-section"},Tg={class:"summary-grid"},Sg={class:"summary-item"},xg={class:"summary-value"},Ag={class:"summary-item"},Ig={class:"summary-value"},Mg={key:0,class:"summary-sub"},Rg={class:"summary-item highlight"},Eg={class:"summary-value"},Pg={class:"detail-modal"},Dg={class:"detail-modal-header"},Fg={class:"detail-modal-body"},Lg={key:0,class:"detail-loading"},Og={key:1,class:"detail-calls"},Ng={class:"detail-summary"},jg={class:"detail-filters"},Ug=["value"],Vg={key:0,class:"detail-call-hint"},Wg={class:"call-header"},Hg={class:"call-agent"},Bg={class:"call-time"},Kg={class:"call-tokens"},qg=["title"],Gg={key:0,class:"call-trigger-badge"},zg={key:0,class:"call-meta"},Jg={key:2,class:"detail-empty"},Qg={key:1,class:"alerts-panel"},Yg={class:"alerts-list"},Xg={class:"alert-message"},Zg={class:"alert-value"},tm={class:"alert-time"},em=["onClick"],sm=wt({__name:"PerformanceSection",setup(t){const e=W(!0),s=W(null),l=W("20m"),i=W([]),o=W(!1),a=W(!1),r=W(null),d=W(""),v=W(""),p=W(""),C=W("tokens_desc"),I=Q(()=>{var H;if(!((H=r.value)!=null&&H.calls))return[];const V=new Set(r.value.calls.map(ot=>ot.agentId));return Array.from(V).sort()}),S=Q(()=>{var H;if(!((H=r.value)!=null&&H.calls))return[];let V=[...r.value.calls];if(v.value){const ot=v.value.toLowerCase();V=V.filter(lt=>{var ft;return(ft=lt.trigger)==null?void 0:ft.toLowerCase().includes(ot)})}switch(p.value&&(V=V.filter(ot=>ot.agentId===p.value)),C.value){case"tokens_desc":V.sort((ot,lt)=>lt.tokens-ot.tokens);break;case"tokens_asc":V.sort((ot,lt)=>ot.tokens-lt.tokens);break;case"time_asc":V.sort((ot,lt)=>ot.time.localeCompare(lt.time));break;case"time_desc":V.sort((ot,lt)=>lt.time.localeCompare(ot.time));break}return V}),k=Q(()=>S.value.reduce((V,H)=>V+H.tokens,0)),x=W({current:{tpm:0,rpm:0,windowTotal:{tokens:0,requests:0}},history:{tpm:[],rpm:[],timestamps:[]},statistics:{avgTpm:0,peakTpm:0,peakTime:""}}),T=[{value:"20m",label:"20分钟"},{value:"1h",label:"1小时"},{value:"24h",label:"24小时"}],b=Q(()=>{const V=T.find(H=>H.value===l.value);return V?`最近 ${V.label}`:""}),M=Q(()=>{switch(l.value){case"20m":return 20;case"1h":return 60;case"24h":return 24;default:return 20}}),_=Q(()=>{const V=x.value.history,H=M.value;if(V.tpm.length===0){const ot=l.value==="24h"?36e5:6e4;return Array.from({length:H},(lt,ft)=>({timestamp:Date.now()-(H-ft-1)*ot,tpm:0,rpm:0}))}return V.tpm.map((ot,lt)=>({timestamp:V.timestamps[lt]||Date.now()-lt*6e4,tpm:ot,rpm:V.rpm[lt]||0}))});function w(V){const H=_.value.map(lt=>lt[V]);return Math.max(...H,1)*1.2}function K(V,H){return Math.max(V/H*100,5)}function P(V){return V>=1e6?(V/1e6).toFixed(1)+"M":V>=1e3?(V/1e3).toFixed(1)+"K":V.toString()}const N=W(Date.now());function Z(V){const H=V??Date.now(),ot=typeof H=="number"?H:Number(H);if(isNaN(ot))return new Date().toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});const lt=ot<1e12?ot*1e3:ot,ft=new Date(lt);return isNaN(ft.getTime())?new Date().toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}):ft.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function F(V){if(V==null)return"--:--";if(typeof V=="string"){const lt=V.split(":").map(Number);if(lt.length>=2){const ft=new Date;return new Date(Date.UTC(ft.getUTCFullYear(),ft.getUTCMonth(),ft.getUTCDate(),lt[0],lt[1],0,0)).toLocaleString("zh-CN",{hour:"2-digit",minute:"2-digit",hour12:!1})}return V}const H=Number(V);if(isNaN(H))return"--:--";const ot=new Date(H);return isNaN(ot.getTime())?"--:--":l.value==="24h"?ot.toLocaleString("zh-CN",{hour:"2-digit",hour12:!1})+":00":ot.toLocaleString("zh-CN",{hour:"2-digit",minute:"2-digit",hour12:!1})}function q(V){return i.value.some(H=>H.type===V&&!H.acknowledged)}function G(V){const H=i.value.find(ot=>ot.id===V);H&&(H.acknowledged=!0)}async function A(){var V,H,ot,lt,ft,tt,kt,It,Dt,_e,ye,Qt;e.value=!0,s.value=null;try{const Se=await fetch(`/api/performance?range=${l.value}`);if(!Se.ok)throw new Error("Failed to fetch performance data");const h=await Se.json();x.value={current:{tpm:((V=h.current)==null?void 0:V.tpm)??0,rpm:((H=h.current)==null?void 0:H.rpm)??0,windowTotal:{tokens:((lt=(ot=h.current)==null?void 0:ot.windowTotal)==null?void 0:lt.tokens)??0,requests:((tt=(ft=h.current)==null?void 0:ft.windowTotal)==null?void 0:tt.requests)??0}},history:{tpm:((kt=h.history)==null?void 0:kt.tpm)??[],rpm:((It=h.history)==null?void 0:It.rpm)??[],timestamps:((Dt=h.history)==null?void 0:Dt.timestamps)??[]},statistics:{avgTpm:((_e=h.statistics)==null?void 0:_e.avgTpm)??0,peakTpm:((ye=h.statistics)==null?void 0:ye.peakTpm)??0,peakTime:((Qt=h.statistics)==null?void 0:Qt.peakTime)??""}},N.value=Date.now(),st()}catch(Se){s.value=Se.message}finally{e.value=!1}}function st(){const{current:V}=x.value;V.tpm>1e5&&i.value.push({id:`high_tpm_${Date.now()}`,type:"high_tpm",message:"TPM 过高",value:V.tpm,threshold:1e5,timestamp:Date.now(),acknowledged:!1}),i.value=i.value.slice(-10)}function mt(){A()}async function L(V){let H;if(typeof V.timestamp=="number")H=V.timestamp<1e12?V.timestamp*1e3:V.timestamp;else if(typeof V.timestamp=="string"){const lt=V.timestamp.split(":").map(Number);if(lt.length>=2){const ft=new Date;let tt=ft.getUTCDate();const kt=lt[0]*60+lt[1],It=ft.getUTCHours()*60+ft.getUTCMinutes();kt>It+10&&(tt-=1),H=new Date(Date.UTC(ft.getUTCFullYear(),ft.getUTCMonth(),tt,lt[0],lt[1],0,0)).getTime()}else return}else return;const ot=l.value==="24h"?"hour":"minute";o.value=!0,d.value=`${F(V.timestamp)} 调用详情`,r.value=null,a.value=!0,v.value="",p.value="",C.value="tokens_desc";try{const lt=await fetch(`/api/performance/details?timestamp=${H}&granularity=${ot}`),ft=await lt.json();lt.ok?(r.value=ft,d.value=`${ft.timeWindow||F(V.timestamp)} 调用详情`):r.value={timeWindow:F(V.timestamp),calls:[],totalCalls:0,totalTokens:0,summary:{avgTokens:0}}}catch{r.value={timeWindow:F(V.timestamp),calls:[],totalCalls:0,totalTokens:0,summary:{avgTokens:0}}}finally{a.value=!1}}let U=null;function X(){it();const V=l.value==="24h"?3e5:3e4;U=setInterval(A,V)}function it(){U&&(clearInterval(U),U=null)}return Nt(()=>{A(),X()}),ae(()=>{it()}),Bt(l,()=>{A(),X()}),(V,H)=>{var ot,lt,ft;return c(),u("div",jv,[n("div",Uv,[H[5]||(H[5]=n("h2",null,"性能数据",-1)),n("div",Vv,[(c(),u(Y,null,ct(T,tt=>n("button",{key:tt.value,class:nt(["range-btn",{active:l.value===tt.value}]),onClick:kt=>l.value=tt.value},f(tt.label),11,Wv)),64))])]),e.value?(c(),u("div",Hv,[...H[6]||(H[6]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载性能数据...",-1)])])):s.value?(c(),u("div",Bv,[H[7]||(H[7]=n("span",{class:"error-icon"},"⚠️",-1)),n("span",null,f(s.value),1),n("button",{onClick:mt,class:"retry-btn"},"重试")])):(c(),u(Y,{key:2},[n("div",Kv,[n("div",qv,[H[10]||(H[10]=n("div",{class:"metric-icon"},"⚡",-1)),n("div",Gv,[H[8]||(H[8]=n("div",{class:"metric-label"},"TPM",-1)),n("div",zv,f(P(x.value.current.tpm)),1),H[9]||(H[9]=n("div",{class:"metric-unit"},"Tokens/分钟",-1))]),q("high_tpm")?(c(),u("div",Jv,"⚠️")):R("",!0)]),n("div",Qv,[H[13]||(H[13]=n("div",{class:"metric-icon"},"🔄",-1)),n("div",Yv,[H[11]||(H[11]=n("div",{class:"metric-label"},"RPM",-1)),n("div",Xv,f(P(x.value.current.rpm)),1),H[12]||(H[12]=n("div",{class:"metric-unit"},"Requests/分钟",-1))])]),n("div",Zv,[H[15]||(H[15]=n("div",{class:"metric-icon"},"📊",-1)),n("div",tg,[H[14]||(H[14]=n("div",{class:"metric-label"},"总 Token",-1)),n("div",eg,f(P(x.value.current.windowTotal.tokens)),1),n("div",sg,f(b.value),1)])]),n("div",ng,[H[17]||(H[17]=n("div",{class:"metric-icon"},"🔢",-1)),n("div",lg,[H[16]||(H[16]=n("div",{class:"metric-label"},"总请求",-1)),n("div",ig,f(P(x.value.current.windowTotal.requests)),1),n("div",og,f(b.value),1)])])]),n("div",ag,[n("div",rg,[n("div",cg,[H[18]||(H[18]=n("h3",null,"TPM 趋势",-1)),n("span",ug,f(Z(N.value)),1)]),n("div",dg,[n("div",fg,[(c(!0),u(Y,null,ct(_.value,(tt,kt)=>(c(),u("div",{key:kt,class:"chart-bar clickable",style:St({height:`${K(tt.tpm,w("tpm"))}%`}),title:`${F(tt.timestamp)}: ${P(tt.tpm)} TPM - 点击查看详情`,onClick:It=>L(tt)},[n("span",pg,f(P(tt.tpm)),1),n("span",vg,f(F(tt.timestamp)),1)],12,hg))),128))])])]),n("div",gg,[n("div",mg,[H[19]||(H[19]=n("h3",null,"RPM 趋势",-1)),n("span",_g,f(Z(N.value)),1)]),n("div",yg,[n("div",bg,[(c(!0),u(Y,null,ct(_.value,(tt,kt)=>(c(),u("div",{key:kt,class:"chart-bar clickable",style:St({height:`${K(tt.rpm,w("rpm"))}%`}),title:`${F(tt.timestamp)}: ${tt.rpm} RPM - 点击查看调用详情`,onClick:It=>L(tt)},[n("span",kg,f(tt.rpm),1),n("span",wg,f(F(tt.timestamp)),1)],12,$g))),128))])])])]),n("div",Cg,[H[23]||(H[23]=n("h3",null,"统计摘要",-1)),n("div",Tg,[n("div",Sg,[H[20]||(H[20]=n("span",{class:"summary-label"},"平均 TPM",-1)),n("span",xg,f(P(x.value.statistics.avgTpm)),1)]),n("div",Ag,[H[21]||(H[21]=n("span",{class:"summary-label"},"峰值 TPM",-1)),n("span",Ig,f(P(x.value.statistics.peakTpm)),1),x.value.statistics.peakTime?(c(),u("span",Mg,"峰值时间: "+f(x.value.statistics.peakTime),1)):R("",!0)]),n("div",Rg,[H[22]||(H[22]=n("span",{class:"summary-label"},"时间窗口",-1)),n("span",Eg,f(b.value),1)])])]),o.value?(c(),u("div",{key:0,class:"detail-modal-overlay",onClick:H[4]||(H[4]=le(tt=>o.value=!1,["self"]))},[n("div",Pg,[n("div",Dg,[n("h3",null,f(d.value),1),n("button",{class:"close-btn",onClick:H[0]||(H[0]=tt=>o.value=!1)},"×")]),n("div",Fg,[a.value?(c(),u("div",Lg,"加载详情...")):(lt=(ot=r.value)==null?void 0:ot.calls)!=null&<.length?(c(),u("div",Og,[n("div",Ng,f(S.value.length)+" / "+f(r.value.totalCalls)+" 次调用 · "+f(P(k.value))+" Tokens · 平均 "+f(P(((ft=r.value.summary)==null?void 0:ft.avgTokens)||0))+" Tokens/调用 ",1),n("div",jg,[Tt(n("input",{"onUpdate:modelValue":H[1]||(H[1]=tt=>v.value=tt),type:"text",class:"search-input",placeholder:"搜索触发内容..."},null,512),[[jn,v.value]]),Tt(n("select",{"onUpdate:modelValue":H[2]||(H[2]=tt=>p.value=tt),class:"agent-filter"},[H[24]||(H[24]=n("option",{value:""},"全部 Agent",-1)),(c(!0),u(Y,null,ct(I.value,tt=>(c(),u("option",{key:tt,value:tt},f(tt),9,Ug))),128))],512),[[Pe,p.value]]),Tt(n("select",{"onUpdate:modelValue":H[3]||(H[3]=tt=>C.value=tt),class:"sort-select"},[...H[25]||(H[25]=[n("option",{value:"tokens_desc"},"Token 降序",-1),n("option",{value:"tokens_asc"},"Token 升序",-1),n("option",{value:"time_asc"},"时间 升序",-1),n("option",{value:"time_desc"},"时间 降序",-1)])],512),[[Pe,C.value]])]),r.value.calls.some(tt=>{var kt;return(kt=tt.trigger)==null?void 0:kt.startsWith("【完成回传】")})?(c(),u("div",Vg,[...H[26]||(H[26]=[n("span",{class:"hint-badge"},"完成回传",-1),n("span",{class:"hint-text"},"此时间戳为子任务完成后的回传时间,不是派发时间",-1)])])):R("",!0),(c(!0),u(Y,null,ct(S.value,(tt,kt)=>{var It,Dt;return c(),u("div",{key:kt,class:"detail-call-item"},[n("div",Wg,[n("span",Hg,f(tt.agentId),1),n("span",Bg,f(tt.time),1),n("span",Kg,f(P(tt.tokens))+" tokens",1)]),n("div",{class:"call-trigger",title:tt.trigger},[(It=tt.trigger)!=null&&It.startsWith("【完成回传】")?(c(),u("span",Gg,"完成回传")):R("",!0),At(" "+f((Dt=tt.trigger)==null?void 0:Dt.replace(/^【完成回传】/,"")),1)],8,qg),tt.model?(c(),u("div",zg,"模型: "+f(tt.model),1)):R("",!0)])}),128))])):(c(),u("div",Jg,"该时段无调用记录"))])])])):R("",!0),i.value.length>0?(c(),u("div",Qg,[H[27]||(H[27]=n("h3",null,"⚠️ 性能告警",-1)),n("div",Yg,[(c(!0),u(Y,null,ct(i.value,tt=>(c(),u("div",{key:tt.id,class:nt(["alert-item",tt.type])},[n("span",Xg,f(tt.message),1),n("span",Zg,f(P(tt.value))+" (阈值: "+f(P(tt.threshold))+")",1),n("span",tm,f(F(tt.timestamp)),1),n("button",{class:"ack-btn",onClick:kt=>G(tt.id)},"确认",8,em)],2))),128))])])):R("",!0)],64))])}}}),nm=Ct(sm,[["__scopeId","data-v-6508c9b4"]]),lm={class:"token-analysis"},im={class:"section-header"},om={class:"time-range-selector"},am=["onClick"],rm={key:0,class:"loading-state"},cm={key:1,class:"error-state"},um={class:"summary-cards"},dm={class:"summary-card"},fm={class:"card-content"},hm={class:"card-value"},pm={class:"summary-card"},vm={class:"card-content"},gm={class:"card-value"},mm={class:"summary-card highlight"},_m={class:"card-content"},ym={class:"card-value"},bm={class:"card-sub"},$m={class:"summary-card"},km={class:"card-content"},wm={class:"card-value"},Cm={class:"summary-card cost"},Tm={class:"card-content"},Sm={class:"card-value"},xm={key:0,class:"card-sub saved"},Am={key:0,class:"trend-section"},Im={class:"trend-chart"},Mm={class:"trend-bars"},Rm={key:0,class:"bar-tooltip"},Em={key:0,class:"bar-tooltip"},Pm={class:"trend-time"},Dm={class:"view-toggle"},Fm={key:1,class:"by-agent-table"},Lm={class:"agent-name"},Om={class:"total-col"},Nm={class:"percent-bar"},jm={class:"percent-text"},Um={class:"total-col"},Vm={key:2,class:"by-agent-chart"},Wm={class:"bar-chart"},Hm={class:"bar-label"},Bm={class:"bar-container"},Km={class:"bar-value"},qm={class:"bar-percent"},Gm=wt({__name:"TokenAnalysisPanel",setup(t){const e=W({summary:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0,cacheHitRate:0},cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0,saved:0,savedPercent:0},byAgent:[],trend:null}),s=W(!1),l=W(""),i=W("table"),o=W("all"),a=[{value:"all",label:"全部"},{value:"24h",label:"24小时"},{value:"1h",label:"1小时"},{value:"20m",label:"20分钟"}],r=Q(()=>o.value!=="all"&&e.value.trend),d=Q(()=>{if(!e.value.trend)return 1;const T=[...e.value.trend.input,...e.value.trend.output];return Math.max(...T,1)}),v=Q(()=>[...e.value.byAgent||[]].sort((T,b)=>b.total-T.total));function p(T,b){return Math.max(T/b*100,2)}function C(T){const b=new Date(T);return o.value==="24h"?b.toLocaleString("zh-CN",{hour:"2-digit",hour12:!1})+":00":b.toLocaleString("zh-CN",{hour:"2-digit",minute:"2-digit",hour12:!1})}function I(T){return T==null?"0":T>=1e6?(T/1e6).toFixed(2)+"M":T>=1e3?(T/1e3).toFixed(1)+"K":T.toLocaleString()}function S(T){return T==null?"0%":(T*100).toFixed(1)+"%"}function k(T){return T==null?"0.00":T>=1?T.toFixed(2):T.toFixed(4)}async function x(){s.value=!0,l.value="";try{const T=await fetch(`/api/tokens/analysis?range=${o.value}`);T.ok?e.value=await T.json():l.value="加载失败"}catch(T){l.value=String(T)}finally{s.value=!1}}return Nt(x),Bt(o,x),(T,b)=>{var M,_,w,K,P,N,Z,F,q,G,A,st,mt;return c(),u("section",lm,[n("div",im,[b[2]||(b[2]=n("h2",null,"Token 分析",-1)),n("div",om,[(c(),u(Y,null,ct(a,L=>n("button",{key:L.value,class:nt(["range-btn",{active:o.value===L.value}]),onClick:U=>o.value=L.value},f(L.label),11,am)),64))])]),s.value?(c(),u("div",rm,[...b[3]||(b[3]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载 Token 数据...",-1)])])):l.value?(c(),u("div",cm,[b[4]||(b[4]=n("span",{class:"error-icon"},"⚠️",-1)),n("span",null,f(l.value),1),n("button",{onClick:x,class:"retry-btn"},"重试")])):(c(),u(Y,{key:2},[n("div",um,[n("div",dm,[b[6]||(b[6]=n("div",{class:"card-icon"},"📥",-1)),n("div",fm,[b[5]||(b[5]=n("div",{class:"card-label"},"Input",-1)),n("div",hm,f(I((M=e.value.summary)==null?void 0:M.input)),1)])]),n("div",pm,[b[8]||(b[8]=n("div",{class:"card-icon"},"📤",-1)),n("div",vm,[b[7]||(b[7]=n("div",{class:"card-label"},"Output",-1)),n("div",gm,f(I((_=e.value.summary)==null?void 0:_.output)),1)])]),n("div",mm,[b[10]||(b[10]=n("div",{class:"card-icon"},"💾",-1)),n("div",_m,[b[9]||(b[9]=n("div",{class:"card-label"},"Cache Read",-1)),n("div",ym,f(I((w=e.value.summary)==null?void 0:w.cacheRead)),1),n("div",bm,"命中率 "+f(S((K=e.value.summary)==null?void 0:K.cacheHitRate)),1)])]),n("div",$m,[b[12]||(b[12]=n("div",{class:"card-icon"},"📝",-1)),n("div",km,[b[11]||(b[11]=n("div",{class:"card-label"},"Cache Write",-1)),n("div",wm,f(I((P=e.value.summary)==null?void 0:P.cacheWrite)),1)])]),n("div",Cm,[b[14]||(b[14]=n("div",{class:"card-icon"},"💰",-1)),n("div",Tm,[b[13]||(b[13]=n("div",{class:"card-label"},"估算成本",-1)),n("div",Sm,"$"+f(k((N=e.value.cost)==null?void 0:N.total)),1),((Z=e.value.cost)==null?void 0:Z.saved)>0?(c(),u("div",xm,"节省 $"+f(k((F=e.value.cost)==null?void 0:F.saved)),1)):R("",!0)])])]),e.value.trend&&r.value?(c(),u("div",Am,[b[16]||(b[16]=n("h3",null,"Token 消耗趋势",-1)),n("div",Im,[n("div",Mm,[(c(!0),u(Y,null,ct(e.value.trend.timestamps,(L,U)=>(c(),u("div",{key:U,class:"trend-bar-group"},[n("div",{class:"trend-bar input",style:St({height:p(e.value.trend.input[U],d.value)+"%"})},[e.value.trend.input[U]>0?(c(),u("span",Rm,"In: "+f(I(e.value.trend.input[U])),1)):R("",!0)],4),n("div",{class:"trend-bar output",style:St({height:p(e.value.trend.output[U],d.value)+"%"})},[e.value.trend.output[U]>0?(c(),u("span",Em,"Out: "+f(I(e.value.trend.output[U])),1)):R("",!0)],4),n("span",Pm,f(C(L)),1)]))),128))]),b[15]||(b[15]=Ii('<div class="trend-legend" data-v-b98a8391><span class="legend-item" data-v-b98a8391><span class="legend-color input" data-v-b98a8391></span> Input</span><span class="legend-item" data-v-b98a8391><span class="legend-color output" data-v-b98a8391></span> Output</span></div>',1))])])):R("",!0),n("div",Dm,[n("button",{class:nt({active:i.value==="table"}),onClick:b[0]||(b[0]=L=>i.value="table")},"📊 表格",2),n("button",{class:nt({active:i.value==="chart"}),onClick:b[1]||(b[1]=L=>i.value="chart")},"📈 图表",2)]),i.value==="table"?(c(),u("div",Fm,[n("table",null,[b[19]||(b[19]=n("thead",null,[n("tr",null,[n("th",null,"Agent"),n("th",null,"Input"),n("th",null,"Output"),n("th",null,"Cache"),n("th",null,"总计"),n("th",null,"占比")])],-1)),n("tbody",null,[(c(!0),u(Y,null,ct(v.value,L=>(c(),u("tr",{key:L.agent},[n("td",Lm,f(L.agent),1),n("td",null,f(I(L.input)),1),n("td",null,f(I(L.output)),1),n("td",null,f(I(L.cacheRead+L.cacheWrite)),1),n("td",Om,f(I(L.total)),1),n("td",null,[n("div",Nm,[n("div",{class:"percent-fill",style:St({width:L.percent*100+"%"})},null,4),n("span",jm,f(S(L.percent)),1)])])]))),128))]),n("tfoot",null,[n("tr",null,[b[17]||(b[17]=n("td",null,[n("strong",null,"合计")],-1)),n("td",null,f(I((q=e.value.summary)==null?void 0:q.input)),1),n("td",null,f(I((G=e.value.summary)==null?void 0:G.output)),1),n("td",null,f(I((((A=e.value.summary)==null?void 0:A.cacheRead)||0)+(((st=e.value.summary)==null?void 0:st.cacheWrite)||0))),1),n("td",Um,[n("strong",null,f(I((mt=e.value.summary)==null?void 0:mt.total)),1)]),b[18]||(b[18]=n("td",null,"100%",-1))])])])])):(c(),u("div",Vm,[b[20]||(b[20]=n("h3",null,"Token 消耗分布",-1)),n("div",Wm,[(c(!0),u(Y,null,ct(v.value,L=>(c(),u("div",{key:L.agent,class:"bar-row"},[n("div",Hm,f(L.agent),1),n("div",Bm,[n("div",{class:"bar",style:St({width:L.percent*100+"%"})},[n("span",Km,f(I(L.total)),1)],4)]),n("div",qm,f(S(L.percent)),1)]))),128))])]))],64))])}}}),zm=Ct(Gm,[["__scopeId","data-v-b98a8391"]]),Jm={class:"performance-panel"},Qm={class:"panel-header"},Ym={class:"tab-switcher"},Xm={class:"panel-content"},Zm=wt({__name:"PerformancePanel",setup(t){const e=W("tpm");return(s,l)=>(c(),u("div",Jm,[n("div",Qm,[l[2]||(l[2]=n("h2",null,"性能监控",-1)),n("div",Ym,[n("button",{class:nt(["tab-btn",{active:e.value==="tpm"}]),onClick:l[0]||(l[0]=i=>e.value="tpm")}," 📊 TPM/RPM ",2),n("button",{class:nt(["tab-btn",{active:e.value==="token"}]),onClick:l[1]||(l[1]=i=>e.value="token")}," 💰 Token 分析 ",2)])]),n("div",Xm,[Tt(bt(nm,null,null,512),[[fs,e.value==="tpm"]]),Tt(bt(zm,null,null,512),[[fs,e.value==="token"]])])]))}}),t1=Ct(Zm,[["__scopeId","data-v-7962ace4"]]),e1={class:"error-center"},s1={class:"header"},n1={class:"header-actions"},l1=["value"],i1=["value"],o1={class:"stats-row"},a1={class:"stat-card total"},r1={class:"stat-value"},c1={class:"stat-card session"},u1={class:"stat-value"},d1={class:"stat-card model"},f1={class:"stat-value"},h1={class:"stat-value"},p1={key:0,class:"trend-section"},v1={class:"trend-chart"},g1=["title"],m1={key:0,class:"bar-label"},_1={class:"trend-labels"},y1={key:1,class:"type-distribution"},b1={class:"type-bars"},$1={class:"type-bar-label"},k1={class:"type-bar-track"},w1={class:"type-count"},C1={key:2,class:"api-status-section"},T1={class:"api-status-grid"},S1={class:"api-header"},x1={class:"api-model"},A1={class:"api-provider"},I1={class:"api-status"},M1={class:"status-text"},R1={key:0,class:"api-last-error"},E1={class:"error-type"},P1={class:"error-time"},D1={key:1,class:"api-error-count"},F1={class:"error-lists"},L1={class:"error-group"},O1={class:"count-badge"},N1={key:0,class:"empty"},j1={key:1,class:"error-list"},U1=["onClick"],V1={class:"error-main"},W1={class:"error-agent"},H1={class:"error-msg"},B1={class:"error-time"},K1={class:"expand-icon"},q1={key:0,class:"error-detail"},G1={class:"detail-row"},z1={class:"detail-row"},J1={class:"detail-message"},Q1={class:"error-group"},Y1={class:"count-badge"},X1={key:0,class:"empty"},Z1={key:1,class:"error-list"},t_=["onClick"],e_={class:"error-main"},s_={class:"error-agent"},n_={class:"error-msg"},l_={class:"error-time"},i_={class:"expand-icon"},o_={key:0,class:"error-detail"},a_={class:"detail-row"},r_={class:"detail-row"},c_={class:"detail-message"},u_=wt({__name:"ErrorCenterPanel",setup(t){const e=W([]),s=W([]),l=W([]),i=W({totalCount:0,sessionErrorCount:0,modelFailureCount:0,byType:{},byAgent:{},hourlyTrend:[]}),o=W(!1),a=W(""),r=W(null),d=W(""),v=W(""),p=W([]),C={"rate-limit":{label:"Rate Limit",color:"#f59e0b"},"token-limit":{label:"Token 超限",color:"#8b5cf6"},timeout:{label:"超时",color:"#ef4444"},auth:{label:"认证失败",color:"#dc2626"},unknown:{label:"未知错误",color:"#6b7280"}},I=Q(()=>l.value.filter(F=>F.status==="healthy").length),S=Q(()=>{var F;return Math.max(...((F=i.value.hourlyTrend)==null?void 0:F.map(q=>q.count))||[1],1)});function k(F){return F/S.value*100}function x(F){const q=i.value.totalCount||1;return F/q*100}function T(F){var q;return((q=C[F])==null?void 0:q.color)||"#6b7280"}function b(F){const q=F.match(/(\d{2}):00/);return q?q[1]+"h":""}function M(F){if(!F)return"-";const G=Date.now()-F,A=Math.floor(G/6e4);if(A<1)return"刚刚";if(A<60)return`${A}分钟前`;const st=Math.floor(A/60);return st<24?`${st}小时前`:`${Math.floor(st/24)}天前`}function _(F,q){return F?F.length>q?F.slice(0,q)+"...":F:"-"}function w(F){return{healthy:"正常",degraded:"降级",down:"异常"}[F]||"未知"}function K(F){const q=p.value.find(G=>G.id===F);return q?q.name:F}function P(F){r.value=r.value===F?null:F}async function N(){try{const F=await fetch("/api/agents");if(F.ok){const q=await F.json();p.value=(Array.isArray(q)?q:[]).map(G=>({id:G.id,name:G.name||G.id}))}}catch(F){console.error("Failed to load agents:",F)}}async function Z(){o.value=!0,a.value="";try{const F=new URLSearchParams;d.value&&F.set("agent",d.value),v.value&&F.set("type",v.value);const[q,G]=await Promise.all([fetch(`/api/errors/summary?${F.toString()}`),fetch("/api/errors/stats")]);if(q.ok){const A=await q.json();e.value=A.sessionErrors||[],s.value=A.modelFailures||[],l.value=A.apiStatus||[]}G.ok&&(i.value=await G.json())}catch(F){a.value=String(F)}finally{o.value=!1}}return Nt(()=>{N(),Z()}),(F,q)=>{var G;return c(),u("section",e1,[n("div",s1,[q[4]||(q[4]=n("h2",null,"错误中心",-1)),n("div",n1,[Tt(n("select",{"onUpdate:modelValue":q[0]||(q[0]=A=>d.value=A),onChange:Z,class:"filter-select"},[q[2]||(q[2]=n("option",{value:""},"全部 Agent",-1)),(c(!0),u(Y,null,ct(p.value,A=>(c(),u("option",{key:A.id,value:A.id},f(A.name),9,l1))),128))],544),[[Pe,d.value]]),Tt(n("select",{"onUpdate:modelValue":q[1]||(q[1]=A=>v.value=A),onChange:Z,class:"filter-select"},[q[3]||(q[3]=n("option",{value:""},"全部类型",-1)),(c(),u(Y,null,ct(C,(A,st)=>n("option",{key:st,value:st},f(A.label),9,i1)),64))],544),[[Pe,v.value]]),n("button",{onClick:Z,class:"refresh-btn"},"刷新")])]),n("div",o1,[n("div",a1,[n("div",r1,f(i.value.totalCount),1),q[5]||(q[5]=n("div",{class:"stat-label"},"总错误数",-1))]),n("div",c1,[n("div",u1,f(i.value.sessionErrorCount),1),q[6]||(q[6]=n("div",{class:"stat-label"},"Session 错误",-1))]),n("div",d1,[n("div",f1,f(i.value.modelFailureCount),1),q[7]||(q[7]=n("div",{class:"stat-label"},"Model 错误",-1))]),n("div",{class:nt(["stat-card",I.value===l.value.length?"healthy":"warning"])},[n("div",h1,f(I.value)+"/"+f(l.value.length),1),q[8]||(q[8]=n("div",{class:"stat-label"},"API 健康",-1))],2)]),(G=i.value.hourlyTrend)!=null&&G.length?(c(),u("div",p1,[q[9]||(q[9]=n("h3",null,"24 小时错误趋势",-1)),n("div",v1,[(c(!0),u(Y,null,ct(i.value.hourlyTrend,(A,st)=>(c(),u("div",{key:st,class:"trend-bar",style:St({height:k(A.count)+"%"}),title:`${A.hour}: ${A.count} 个错误`},[A.count>0?(c(),u("span",m1,f(A.count),1)):R("",!0)],12,g1))),128))]),n("div",_1,[(c(!0),u(Y,null,ct(i.value.hourlyTrend,(A,st)=>(c(),u("span",{key:st,class:"trend-time"},f(st%4===0?b(A.hour):""),1))),128))])])):R("",!0),Object.keys(i.value.byType||{}).length?(c(),u("div",y1,[q[10]||(q[10]=n("h3",null,"错误类型分布",-1)),n("div",b1,[(c(!0),u(Y,null,ct(i.value.byType,(A,st)=>(c(),u("div",{key:st,class:"type-bar-item"},[n("div",$1,[n("span",{class:"type-dot",style:St({background:A.color})},null,4),At(" "+f(A.label),1)]),n("div",k1,[n("div",{class:"type-bar-fill",style:St({width:x(A.count)+"%",background:A.color})},null,4)]),n("span",w1,f(A.count),1)]))),128))])])):R("",!0),l.value.length?(c(),u("div",C1,[q[11]||(q[11]=n("h3",null,"API 状态",-1)),n("div",T1,[(c(!0),u(Y,null,ct(l.value,A=>(c(),u("div",{key:A.model,class:nt(["api-status-card",`status-${A.status}`])},[n("div",S1,[n("span",x1,f(A.model),1),n("span",A1,f(A.provider),1)]),n("div",I1,[n("span",{class:nt(["status-dot",`status-${A.status}`])},null,2),n("span",M1,f(w(A.status)),1)]),A.lastError?(c(),u("div",R1,[n("span",E1,f(A.lastError.type),1),n("span",P1,f(M(A.lastError.timestamp)),1)])):R("",!0),A.errorCount>0?(c(),u("div",D1," 错误: "+f(A.errorCount)+" 次 ",1)):R("",!0)],2))),128))])])):R("",!0),n("div",F1,[n("div",L1,[n("h3",null,[q[12]||(q[12]=At("Session 错误 ",-1)),n("span",O1,f(e.value.length),1)]),e.value.length?(c(),u("div",j1,[(c(!0),u(Y,null,ct(e.value,A=>(c(),u("div",{key:A.id,class:nt(["error-item",`severity-${A.severity}`]),onClick:st=>P(A.id)},[n("div",V1,[n("span",W1,f(K(A.agentId)),1),n("span",{class:"error-type",style:St({color:T(A.type)})},f(A.typeLabel),5),n("span",H1,f(_(A.message,80)),1),n("span",B1,f(M(A.timestamp)),1),n("span",K1,f(r.value===A.id?"▼":"▶"),1)]),r.value===A.id?(c(),u("div",q1,[n("div",G1,[q[13]||(q[13]=n("span",{class:"detail-label"},"时间:",-1)),n("span",null,f(A.datetime),1)]),n("div",z1,[q[14]||(q[14]=n("span",{class:"detail-label"},"完整信息:",-1)),n("span",J1,f(A.fullMessage||A.message),1)])])):R("",!0)],10,U1))),128))])):(c(),u("div",N1,"暂无错误"))]),n("div",Q1,[n("h3",null,[q[15]||(q[15]=At("Model Failures ",-1)),n("span",Y1,f(s.value.length),1)]),s.value.length?(c(),u("div",Z1,[(c(!0),u(Y,null,ct(s.value,A=>(c(),u("div",{key:A.id,class:nt(["error-item",`severity-${A.severity}`]),onClick:st=>P(A.id)},[n("div",e_,[n("span",s_,f(A.model),1),n("span",{class:"error-type",style:St({color:T(A.type)})},f(A.typeLabel),5),n("span",n_,f(_(A.message,80)),1),n("span",l_,f(M(A.timestamp)),1),n("span",i_,f(r.value===A.id?"▼":"▶"),1)]),r.value===A.id?(c(),u("div",o_,[n("div",a_,[q[16]||(q[16]=n("span",{class:"detail-label"},"时间:",-1)),n("span",null,f(A.datetime),1)]),n("div",r_,[q[17]||(q[17]=n("span",{class:"detail-label"},"完整信息:",-1)),n("span",c_,f(A.fullMessage||A.message),1)])])):R("",!0)],10,t_))),128))])):(c(),u("div",X1,"暂无错误"))])])])}}}),d_=Ct(u_,[["__scopeId","data-v-ca874c41"]]),f_={class:"version-display"},h_={key:0,class:"loading-text"},p_={key:1,class:"error-text"},v_={key:0,class:"tooltip"},g_={class:"tooltip-item"},m_={class:"tooltip-item"},__={class:"tooltip-item"},y_={key:0,class:"tooltip-item"},b_={key:1,class:"tooltip-item"},$_=wt({__name:"VersionDisplay",setup(t){const e=W(!0),s=W(!1),l=W({version:"",name:"",description:""}),i=W(!1),o=Q(()=>l.value.name&&l.value.version?`${l.value.name} v${l.value.version}`:l.value.version||"v?"),a=d=>{try{return new Date(d).toLocaleString("zh-CN")}catch{return d}},r=async()=>{try{e.value=!0,s.value=!1;const d=`${window.location.origin}/api/version`,v=await fetch(d,{headers:{Accept:"application/json"},cache:"no-store"});if(!v.ok){const p=await v.text().catch(()=>"");throw new Error(`HTTP ${v.status}${p?`: ${p.slice(0,120)}`:""}`)}l.value=await v.json()}catch(d){console.error("获取版本信息失败:",d),s.value=!0}finally{e.value=!1}};return Nt(()=>{r()}),(d,v)=>(c(),u("div",f_,[e.value?(c(),u("span",h_,"加载中...")):s.value?(c(),u("span",p_,"版本信息获取失败")):(c(),u(Y,{key:2},[n("span",{class:"version-text",onMouseenter:v[0]||(v[0]=p=>i.value=!0),onMouseleave:v[1]||(v[1]=p=>i.value=!1)},f(o.value),33),i.value?(c(),u("div",v_,[n("div",g_,[v[2]||(v[2]=n("strong",null,"名称:",-1)),At(" "+f(l.value.name),1)]),n("div",m_,[v[3]||(v[3]=n("strong",null,"版本:",-1)),At(" "+f(l.value.version),1)]),n("div",__,[v[4]||(v[4]=n("strong",null,"描述:",-1)),At(" "+f(l.value.description),1)]),l.value.build_date?(c(),u("div",y_,[v[5]||(v[5]=n("strong",null,"构建时间:",-1)),At(" "+f(a(l.value.build_date)),1)])):R("",!0),l.value.git_commit?(c(),u("div",b_,[v[6]||(v[6]=n("strong",null,"Git 提交:",-1)),At(" "+f(l.value.git_commit),1)])):R("",!0)])):R("",!0)],64))]))}}),k_=Ct($_,[["__scopeId","data-v-87a575a1"]]),w_={id:"app"},C_={class:"controls"},T_={class:"collaboration-section"},S_={class:"task-status-section"},x_={class:"performance-section"},A_={class:"error-center-section"},I_=wt({__name:"App",setup(t){const e=Fi(),s=Yf(),l=Zf();ks("realtimeManager",e),ks("stateManager",s),ks("eventDispatcher",l);const i=W([]),o=W(null),a=W(!1),r=W({status:"disconnected",reconnectAttempts:0}),d=Q(()=>{switch(r.value.status){case"connected":return"已连接";case"connecting":return"连接中...";case"disconnected":return"未连接";case"error":return"连接错误";default:return"未知"}}),v=W(null),p=W("main"),C=W([]);async function I(){try{const[w,K]=await Promise.all([fetch("/api/agents"),fetch("/api/config").catch(()=>null)]),P=await w.json();if(i.value=Array.isArray(P)?P:[],K!=null&&K.ok){const F=await K.json();p.value=F&&F.mainAgentId||"main"}const N=Array.isArray(i.value)?i.value:[],Z=N.find(F=>F.id===p.value);Z&&(v.value=Z),C.value=N.filter(F=>F.id!==p.value)}catch(w){console.error("刷新数据失败:",w)}}function S(w){o.value=w}function k(w){const K=w.id===p.value?v.value:C.value.find(P=>P.id===w.id);S(K||{id:w.id,name:w.name,role:w.id===p.value?"主 Agent":"子 Agent",status:w.status==="error"?"down":w.status})}function x(w){I()}function T(w){r.value=w}let b=null,M=null,_=null;return Nt(()=>{I(),e.connect(),b=e.onStateChange(T),M=e.subscribe("agents",w=>{if(Array.isArray(w)){i.value=w;const K=w.find(P=>P.id===p.value);v.value=K||null,C.value=w.filter(P=>P.id!==p.value)}}),_=e.subscribe("agents_update",w=>{if(Array.isArray(w)){w.forEach(P=>{const N=i.value.findIndex(Z=>Z.id===P.id);N>=0&&(i.value[N]={...i.value[N],...P})});const K=i.value.find(P=>P.id===p.value);K&&(v.value=K),C.value=i.value.filter(P=>P.id!==p.value)}})}),ae(()=>{b==null||b(),M==null||M(),_==null||_(),e.disconnect()}),(w,K)=>(c(),u("div",w_,[n("header",null,[K[3]||(K[3]=n("h1",null,"OpenClaw Agent Dashboard",-1)),n("div",C_,[bt(k_),n("button",{onClick:I},"刷新"),n("button",{onClick:K[0]||(K[0]=P=>a.value=!0)},"⚙️ 设置"),n("span",{class:nt(["connection-status",r.value.status])},f(d.value),3)])]),n("main",null,[n("section",T_,[bt(Up,{"main-agent":v.value,"sub-agents":C.value,"main-agent-id":p.value,onAgentClick:k},null,8,["main-agent","sub-agents","main-agent-id"])]),n("section",S_,[bt(Nv)]),n("section",x_,[bt(t1)]),n("section",A_,[bt(d_)])]),a.value?(c(),Gt(Gf,{key:0,onClose:K[1]||(K[1]=P=>a.value=!1),onSettingsChanged:x})):R("",!0),o.value?(c(),Gt(Df,{key:1,agent:o.value,onClose:K[2]||(K[2]=P=>o.value=null)},null,8,["agent"])):R("",!0)]))}}),M_=Ct(I_,[["__scopeId","data-v-543ef282"]]);er(M_).mount("#app");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.timeline-step[data-v-b8bd62e0]{border-radius:6px;overflow:hidden;transition:all .2s}.step-header[data-v-b8bd62e0]{display:flex;justify-content:space-between;align-items:center;padding:10px 12px;cursor:pointer;-webkit-user-select:none;user-select:none}.step-header[data-v-b8bd62e0]:hover{filter:brightness(.98)}.header-left[data-v-b8bd62e0]{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.step-icon[data-v-b8bd62e0]{font-size:14px;flex-shrink:0}.step-type[data-v-b8bd62e0]{font-size:12px;font-weight:600;color:#374151;flex-shrink:0}.step-subtitle[data-v-b8bd62e0]{font-size:10px;color:#9ca3af;background:#0000000a;padding:1px 6px;border-radius:3px;flex-shrink:0}.collapse-summary[data-v-b8bd62e0]{font-size:11px;color:#9ca3af;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.step-time[data-v-b8bd62e0]{font-size:11px;color:#9ca3af;flex-shrink:0}.step-duration[data-v-b8bd62e0]{font-size:11px;color:#6b7280;background:#0000000d;padding:2px 6px;border-radius:3px;flex-shrink:0}.header-right[data-v-b8bd62e0]{display:flex;align-items:center;gap:8px;flex-shrink:0}.step-tokens[data-v-b8bd62e0]{font-size:11px;color:#9ca3af}.token-label[data-v-b8bd62e0]{margin-right:4px}.expand-icon[data-v-b8bd62e0]{font-size:10px;color:#9ca3af}.execution-time[data-v-b8bd62e0]{font-size:10px;color:#64748b;background:#f1f5f9;padding:1px 6px;border-radius:3px}.pair-indicator[data-v-b8bd62e0]{font-size:10px;cursor:pointer;opacity:.6;transition:opacity .2s}.pair-indicator[data-v-b8bd62e0]:hover{opacity:1}.step-user .step-header[data-v-b8bd62e0]{background:#f0f9ff;border-left:3px solid #3b82f6}.step-thinking .step-header[data-v-b8bd62e0]{background:#fef3c7;border-left:3px solid #f59e0b}.step-text .step-header[data-v-b8bd62e0]{background:#f0fdf4;border-left:3px solid #22c55e}.step-toolCall .step-header[data-v-b8bd62e0]{background:#f5f3ff;border-left:3px solid #8b5cf6}.step-toolResult .step-header[data-v-b8bd62e0]{background:#ecfdf5;border-left:3px solid #10b981}.step-error .step-header[data-v-b8bd62e0]{background:#fef2f2;border-left:3px solid #dc2626}.step-toolResult.status-error .step-header[data-v-b8bd62e0]{border-left-color:#ef4444}.is-paired-result[data-v-b8bd62e0]{margin-left:20px;border-left:2px dashed #d1d5db!important;border-radius:0 6px 6px 0}.timeline-step.highlighted[data-v-b8bd62e0]{box-shadow:0 0 0 2px #3b82f6;transform:scale(1.01);transition:all .2s ease}.timeline-step.highlighted .step-header[data-v-b8bd62e0]{background:#eff6ff!important}.step-content[data-v-b8bd62e0]{padding:0 12px 12px;margin-top:-4px}.content-block[data-v-b8bd62e0]{margin-top:8px}.content-block pre[data-v-b8bd62e0]{margin:0;padding:10px;background:#00000008;border-radius:4px;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:300px;overflow-y:auto}.content-block pre.truncated[data-v-b8bd62e0]{max-height:200px}.thinking-label[data-v-b8bd62e0]{font-size:11px;color:#92400e;margin-bottom:6px}.thinking-content pre[data-v-b8bd62e0]{background:#fffbeb;color:#78350f}.section-label[data-v-b8bd62e0]{font-size:11px;color:#6b7280;margin-bottom:4px}.code-block[data-v-b8bd62e0]{font-family:Monaco,Menlo,monospace;font-size:11px}.result-header[data-v-b8bd62e0]{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.result-status[data-v-b8bd62e0]{font-size:12px;font-weight:500}.result-status.ok[data-v-b8bd62e0]{color:#059669}.result-status.error[data-v-b8bd62e0]{color:#dc2626}.tool-error-section[data-v-b8bd62e0]{margin-bottom:12px;padding:10px;background:#fef2f2;border-radius:4px;border-left:3px solid #ef4444}.tool-error-message[data-v-b8bd62e0]{font-size:12px;color:#991b1b;line-height:1.5;word-break:break-word}.tool-error-suggestion[data-v-b8bd62e0]{margin-top:8px;padding-top:8px;border-top:1px solid #fecaca}.tool-error-suggestion .suggestion-label[data-v-b8bd62e0]{font-size:11px;color:#374151;margin-bottom:4px}.tool-error-suggestion ul[data-v-b8bd62e0]{margin:0;padding-left:16px;font-size:12px;color:#4b5563}.tool-error-suggestion li[data-v-b8bd62e0]{margin:2px 0}.copy-btn[data-v-b8bd62e0]{font-size:11px;padding:2px 8px;border:1px solid #e5e7eb;border-radius:3px;background:#fff;cursor:pointer}.copy-btn[data-v-b8bd62e0]:hover{background:#f3f4f6}.show-more-btn[data-v-b8bd62e0]{display:block;width:100%;margin-top:8px;padding:6px;font-size:11px;color:#6b7280;background:#00000005;border:none;border-radius:4px;cursor:pointer}.show-more-btn[data-v-b8bd62e0]:hover{background:#0000000d}.error-content[data-v-b8bd62e0]{background:#fef2f2;padding:10px;border-radius:4px}.error-type[data-v-b8bd62e0]{font-size:12px;font-weight:600;color:#dc2626;margin-bottom:6px}.error-message[data-v-b8bd62e0]{font-size:12px;color:#7f1d1d;padding:8px;background:#fee2e2;border-radius:4px;margin-bottom:8px}.error-suggestion[data-v-b8bd62e0]{margin-top:8px;padding:8px;background:#fff;border-radius:4px}.suggestion-label[data-v-b8bd62e0]{font-size:11px;color:#374151;margin-bottom:4px}.error-suggestion ul[data-v-b8bd62e0]{margin:0;padding-left:16px;font-size:12px;color:#4b5563}.error-suggestion li[data-v-b8bd62e0]{margin:4px 0}.timeline-connector[data-v-01a6bfe6]{display:flex;flex-direction:column;align-items:center;padding:4px 0}.connector-line[data-v-01a6bfe6]{width:2px;height:8px;background:#d1d5db}.connector-arrow[data-v-01a6bfe6]{font-size:8px;color:#9ca3af;line-height:1}.timeline-round[data-v-2aa49052]{margin-bottom:16px;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden;background:#fff}.round-header[data-v-2aa49052]{display:flex;align-items:center;gap:12px;padding:8px 12px;background:linear-gradient(135deg,#f8fafc,#f1f5f9);border-bottom:1px solid #e5e7eb}.round-badge[data-v-2aa49052]{font-size:11px;font-weight:600;color:#4338ca;background:#e0e7ff;padding:2px 8px;border-radius:4px}.round-trigger[data-v-2aa49052]{font-size:12px;color:#64748b;flex:1}.round-stats[data-v-2aa49052]{font-size:11px;color:#9ca3af;background:#0000000a;padding:2px 6px;border-radius:3px}.round-content[data-v-2aa49052]{padding:12px}.trigger-user_input .round-header[data-v-2aa49052]{border-left:3px solid #3b82f6}.trigger-subagent_result .round-header[data-v-2aa49052]{border-left:3px solid #10b981}.trigger-tool_result .round-header[data-v-2aa49052]{border-left:3px solid #f59e0b}.trigger-start .round-header[data-v-2aa49052]{border-left:3px solid #8b5cf6}.tool-link[data-v-d1e21896]{display:flex;align-items:center;padding:4px 0 4px 28px;position:relative}.link-line[data-v-d1e21896]{display:flex;flex-direction:column;align-items:center;position:absolute;left:12px;top:0;bottom:0}.link-connector[data-v-d1e21896]{width:2px;flex:1;background:linear-gradient(to bottom,#94a3b8 0%,#94a3b8 50%,transparent 50%);background-size:2px 8px;min-height:20px}.link-dot[data-v-d1e21896]{width:8px;height:8px;border-radius:50%;background:#94a3b8;border:2px solid #fff;box-shadow:0 0 0 1px #e5e7eb}.link-dot.bottom[data-v-d1e21896]{position:absolute;bottom:0}.link-time[data-v-d1e21896]{font-size:10px;color:#64748b;background:#f8fafc;padding:1px 6px;border-radius:3px;margin-left:8px;border:1px solid #e5e7eb}.link-error .link-connector[data-v-d1e21896]{background:linear-gradient(to bottom,#ef4444 0%,#ef4444 50%,transparent 50%);background-size:2px 8px}.link-error .link-dot[data-v-d1e21896]{background:#ef4444}.link-error .link-time[data-v-d1e21896]{color:#dc2626;background:#fef2f2;border-color:#fecaca}.link-active .link-connector[data-v-d1e21896]{background:linear-gradient(to bottom,#3b82f6 0%,#3b82f6 50%,transparent 50%);background-size:2px 8px}.link-active .link-dot[data-v-d1e21896]{background:#3b82f6;box-shadow:0 0 0 2px #3b82f64d}.link-active .link-time[data-v-d1e21896]{color:#2563eb;background:#eff6ff;border-color:#bfdbfe}.timeline-view[data-v-4917257d]{background:#fff;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden}.timeline-header[data-v-4917257d]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#f9fafb;border-bottom:1px solid #e5e7eb}.header-left[data-v-4917257d]{display:flex;align-items:center;gap:12px}.title[data-v-4917257d]{font-weight:600;font-size:14px;color:#374151}.agent-info[data-v-4917257d]{font-size:13px;color:#6b7280}.agent-info .model[data-v-4917257d]{color:#9ca3af}.header-right[data-v-4917257d]{display:flex;align-items:center;gap:12px}.status-badge[data-v-4917257d]{font-size:12px;padding:4px 8px;border-radius:4px}.status-badge.status-running[data-v-4917257d]{background:#fef3c7;color:#92400e}.status-badge.status-completed[data-v-4917257d]{background:#d1fae5;color:#065f46}.status-badge.status-error[data-v-4917257d]{background:#fee2e2;color:#991b1b}.status-badge.status-no_sessions[data-v-4917257d]{background:#f3f4f6;color:#6b7280}.refresh-btn[data-v-4917257d]{font-size:12px;padding:4px 10px;border:1px solid #e5e7eb;border-radius:4px;background:#fff;cursor:pointer;color:#374151}.refresh-btn[data-v-4917257d]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-4917257d]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-4917257d],.empty-state[data-v-4917257d]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:#6b7280;gap:12px}.spinner[data-v-4917257d]{width:24px;height:24px;border:3px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-4917257d 1s linear infinite}@keyframes spin-4917257d{to{transform:rotate(360deg)}}.empty-icon[data-v-4917257d]{font-size:32px}.empty-message[data-v-4917257d]{font-size:14px;color:#374151;font-weight:500}.empty-hint[data-v-4917257d]{margin-top:8px;font-size:12px;color:#9ca3af;text-align:center;max-width:280px;line-height:1.5}.timeline-content[data-v-4917257d]{padding:16px}.timeline-legend[data-v-4917257d]{display:flex;flex-wrap:wrap;gap:12px 20px;font-size:11px;color:#6b7280;margin-bottom:12px;padding:8px 10px;background:#f9fafb;border-radius:6px}.legend-item[data-v-4917257d]{display:inline-flex;align-items:center;gap:4px}.legend-icon[data-v-4917257d]{font-size:12px}.session-info[data-v-4917257d]{display:flex;gap:16px;font-size:12px;color:#9ca3af;margin-bottom:16px;padding-bottom:12px;border-bottom:1px dashed #e5e7eb}.steps-list[data-v-4917257d]{display:flex;flex-direction:column}.tool-execution-label[data-v-4917257d]{display:flex;align-items:center;gap:12px;margin:12px 0;padding:0 4px}.tool-execution-label .label-line[data-v-4917257d]{flex:1;height:1px;background:#e5e7eb}.tool-execution-label .label-text[data-v-4917257d]{font-size:11px;color:#9ca3af;white-space:nowrap}.timeline-footer[data-v-4917257d]{margin-top:16px;padding-top:16px;border-top:1px solid #e5e7eb}.stats-grid[data-v-4917257d]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-item[data-v-4917257d]{display:flex;flex-direction:column;align-items:center;padding:8px;background:#f9fafb;border-radius:6px}.stat-label[data-v-4917257d]{font-size:11px;color:#9ca3af;margin-bottom:4px}.stat-value[data-v-4917257d]{font-size:14px;font-weight:600;color:#374151}.chain-node[data-v-973c6755]{display:flex;flex-direction:column;align-items:center;padding:12px 16px;min-width:120px;background:#fff;border-radius:8px;border:2px solid #e5e7eb;cursor:pointer;transition:all .2s}.chain-node[data-v-973c6755]:hover{transform:translateY(-2px);box-shadow:0 4px 12px #0000001a}.chain-node.selected[data-v-973c6755]{box-shadow:0 0 0 4px #3b82f64d}.chain-node.status-pending[data-v-973c6755]{border-color:#9ca3af;background:#f9fafb}.chain-node.status-running[data-v-973c6755]{border-color:#3b82f6;background:#eff6ff;animation:pulse-973c6755 2s infinite}.chain-node.status-completed[data-v-973c6755]{border-color:#22c55e;background:#f0fdf4}.chain-node.status-error[data-v-973c6755]{border-color:#ef4444;background:#fef2f2}@keyframes pulse-973c6755{0%,to{opacity:1}50%{opacity:.5}to{opacity:1}}.node-icon[data-v-973c6755]{font-size:24px;margin-bottom:8px}.node-info[data-v-973c6755]{text-align:center}.node-name[data-v-973c6755]{font-size:13px;font-weight:600;color:#374151;margin-bottom:4px}.node-role[data-v-973c6755]{font-size:11px;color:#6b7280}.node-status[data-v-973c6755]{font-size:11px;padding:2px 6px;border-radius:4px;margin-top:8px}.status-pending .node-status[data-v-973c6755]{background:#f3f4f6;color:#6b7280}.status-running .node-status[data-v-973c6755]{background:#dbeafe;color:#1e40af}.status-completed .node-status[data-v-973c6755]{background:#d1fae5;color:#065f46}.status-error .node-status[data-v-973c6755]{background:#fee2e2;color:#991b1b}.node-time[data-v-973c6755]{font-size:11px;color:#9ca3af;margin-top:8px}.node-progress[data-v-973c6755]{margin-top:8px}.progress-spinner[data-v-973c6755]{width:16px;height:16px;border:2px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-973c6755 1s linear infinite}@keyframes spin-973c6755{to{transform:rotate(360deg)}}.chain-edge[data-v-c94ab96b]{display:flex;align-items:center;margin:0 4px}.edge-running svg line[data-v-c94ab96b]{animation:pulse-c94ab96b 1.5s infinite}.edge-completed[data-v-c94ab96b]{opacity:1}.edge-pending[data-v-c94ab96b]{opacity:.5}.edge-error[data-v-c94ab96b]{opacity:.8}@keyframes pulse-c94ab96b{0%,to{opacity:1}50%{opacity:.5}}.chain-view[data-v-ee8c8661]{background:#fff;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden}.chain-header[data-v-ee8c8661]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#f9fafb;border-bottom:1px solid #e5e7eb}.header-left[data-v-ee8c8661]{display:flex;align-items:center;gap:12px}.title[data-v-ee8c8661]{font-weight:600;font-size:14px;color:#374151}.project-info[data-v-ee8c8661]{font-size:13px;color:#6b7280}.header-right[data-v-ee8c8661]{display:flex;align-items:center;gap:12px}.status-badge[data-v-ee8c8661]{font-size:12px;padding:4px 8px;border-radius:4px}.status-badge.status-running[data-v-ee8c8661]{background:#fef3c7;color:#92400e}.status-badge.status-completed[data-v-ee8c8661]{background:#d1fae5;color:#065f46}.status-badge.status-error[data-v-ee8c8661]{background:#fee2e2;color:#991b1b}.status-badge.status-empty[data-v-ee8c8661]{background:#f3f4f6;color:#6b7280}.refresh-btn[data-v-ee8c8661]{font-size:12px;padding:4px 10px;border:1px solid #e5e7eb;border-radius:4px;background:#fff;cursor:pointer;color:#374151}.refresh-btn[data-v-ee8c8661]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-ee8c8661]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-ee8c8661],.empty-state[data-v-ee8c8661]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:#6b7280;gap:12px}.spinner[data-v-ee8c8661]{width:24px;height:24px;border:3px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-ee8c8661 1s linear infinite}@keyframes spin-ee8c8661{to{transform:rotate(360deg)}}.empty-icon[data-v-ee8c8661]{font-size:32px}.empty-hint[data-v-ee8c8661]{margin-top:8px;font-size:12px;color:#9ca3af;text-align:center;max-width:280px}.chain-content[data-v-ee8c8661]{padding:16px}.root-task[data-v-ee8c8661]{padding:12px;background:#f9fafb;border-radius:6px;margin-bottom:16px}.task-label[data-v-ee8c8661]{font-size:11px;color:#9ca3af;margin-bottom:4px}.task-text[data-v-ee8c8661]{font-size:14px;color:#374151;font-weight:500}.task-meta[data-v-ee8c8661]{margin-top:8px;font-size:12px;color:#6b7280}.chain-diagram[data-v-ee8c8661]{margin:20px 0}.diagram-container[data-v-ee8c8661]{display:flex;align-items:center;justify-content:center;gap:0;flex-wrap:wrap}.chain-progress[data-v-ee8c8661]{margin-top:16px}.progress-bar[data-v-ee8c8661]{height:8px;background:#e5e7eb;border-radius:4px;overflow:hidden}.progress-fill[data-v-ee8c8661]{height:100%;background:linear-gradient(90deg,#22c55e,#3b82f6);transition:width .3s ease}.progress-text[data-v-ee8c8661]{margin-top:8px;font-size:12px;color:#6b7280;text-align:center}.node-detail[data-v-ee8c8661]{margin-top:16px;padding:16px;background:#f9fafb;border-radius:8px;border:1px solid #e5e7eb}.detail-header[data-v-ee8c8661]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.detail-title[data-v-ee8c8661]{font-size:14px;font-weight:600;color:#374151}.detail-status[data-v-ee8c8661]{font-size:12px;padding:4px 8px;border-radius:4px}.detail-content[data-v-ee8c8661]{display:flex;flex-direction:column;gap:12px}.section-label[data-v-ee8c8661]{font-size:11px;color:#9ca3af;margin-bottom:4px}.section-value[data-v-ee8c8661]{font-size:13px;color:#374151}.detail-row[data-v-ee8c8661]{display:flex;gap:24px}.detail-item[data-v-ee8c8661]{display:flex;flex-direction:column}.item-label[data-v-ee8c8661]{font-size:11px;color:#9ca3af}.item-value[data-v-ee8c8661]{font-size:13px;color:#374151;font-weight:500}.artifacts-list[data-v-ee8c8661]{display:flex;flex-direction:column;gap:4px}.artifact-item[data-v-ee8c8661]{font-size:12px;color:#6b7280;padding:4px 8px;background:#fff;border-radius:4px}.agent-config-panel[data-v-c0a2c245]{padding:12px;max-height:500px;overflow-y:auto}.header[data-v-c0a2c245]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.header h3[data-v-c0a2c245]{margin:0;font-size:14px;color:#374151}.refresh-btn[data-v-c0a2c245]{padding:4px 12px;font-size:12px;border:1px solid #d1d5db;border-radius:4px;background:#fff;cursor:pointer}.refresh-btn[data-v-c0a2c245]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-c0a2c245]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-c0a2c245],.error-state[data-v-c0a2c245]{text-align:center;padding:40px 20px;color:#6b7280}.error-state[data-v-c0a2c245]{color:#dc2626}.config-section[data-v-c0a2c245]{margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid #e5e7eb}.config-section[data-v-c0a2c245]:last-child{border-bottom:none;margin-bottom:0}.config-section h4[data-v-c0a2c245]{margin:0 0 12px;font-size:13px;color:#374151;font-weight:600}.info-grid[data-v-c0a2c245]{display:grid;grid-template-columns:1fr 1fr;gap:8px}.info-item[data-v-c0a2c245]{display:flex;flex-direction:column;gap:2px}.info-item.full-width[data-v-c0a2c245]{grid-column:1 / -1}.info-item .label[data-v-c0a2c245]{font-size:11px;color:#6b7280}.info-item .value[data-v-c0a2c245]{font-size:13px;color:#1f2937}.info-item .value.monospace[data-v-c0a2c245]{font-family:monospace;font-size:12px;word-break:break-all}.info-item .value.status-idle[data-v-c0a2c245]{color:#22c55e}.info-item .value.status-working[data-v-c0a2c245]{color:#f59e0b}.info-item .value.status-down[data-v-c0a2c245]{color:#ef4444}.model-config[data-v-c0a2c245]{display:flex;flex-direction:column;gap:16px}.model-field label[data-v-c0a2c245]{display:block;font-size:12px;color:#374151;margin-bottom:6px;font-weight:500}.model-select-wrapper[data-v-c0a2c245]{display:flex;flex-direction:column;gap:4px}.model-select[data-v-c0a2c245]{width:100%;padding:8px 10px;font-size:13px;border:1px solid #d1d5db;border-radius:6px;background:#fff;cursor:pointer}.model-select[data-v-c0a2c245]:focus{outline:none;border-color:#3b82f6}.model-select[data-v-c0a2c245]:disabled{background:#f3f4f6;cursor:not-allowed}.model-select.small[data-v-c0a2c245]{padding:6px 8px;font-size:12px}.current-model[data-v-c0a2c245]{font-size:11px;color:#6b7280}.fallbacks-list[data-v-c0a2c245]{display:flex;flex-direction:column;gap:8px}.fallback-item[data-v-c0a2c245]{display:flex;gap:8px;align-items:center}.fallback-item .model-select[data-v-c0a2c245]{flex:1}.remove-btn[data-v-c0a2c245]{width:28px;height:28px;border:1px solid #d1d5db;border-radius:4px;background:#fff;cursor:pointer;font-size:16px;color:#6b7280;display:flex;align-items:center;justify-content:center}.remove-btn[data-v-c0a2c245]:hover:not(:disabled){background:#fee2e2;border-color:#fca5a5;color:#dc2626}.add-fallback-btn[data-v-c0a2c245]{padding:6px 12px;font-size:12px;border:1px dashed #d1d5db;border-radius:4px;background:#f9fafb;cursor:pointer;color:#6b7280}.add-fallback-btn[data-v-c0a2c245]:hover:not(:disabled){border-color:#3b82f6;color:#3b82f6}.add-fallback-btn[data-v-c0a2c245]:disabled{opacity:.5;cursor:not-allowed}.model-actions[data-v-c0a2c245]{display:flex;gap:8px;margin-top:8px}.save-btn[data-v-c0a2c245]{padding:8px 16px;font-size:13px;border:none;border-radius:6px;background:#3b82f6;color:#fff;cursor:pointer;font-weight:500}.save-btn[data-v-c0a2c245]:hover:not(:disabled){background:#2563eb}.save-btn[data-v-c0a2c245]:disabled{opacity:.5;cursor:not-allowed}.reset-btn[data-v-c0a2c245]{padding:8px 16px;font-size:13px;border:1px solid #d1d5db;border-radius:6px;background:#fff;cursor:pointer;color:#6b7280}.reset-btn[data-v-c0a2c245]:hover:not(:disabled){background:#f3f4f6}.description-text[data-v-c0a2c245]{margin:0;font-size:13px;color:#4b5563;line-height:1.5;white-space:pre-wrap}.error-analysis-view[data-v-bc05715d]{padding:12px;max-height:600px;overflow-y:auto}.header[data-v-bc05715d]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.header h3[data-v-bc05715d]{margin:0;font-size:14px;color:#374151}.refresh-btn[data-v-bc05715d]{padding:4px 12px;font-size:12px;border:1px solid #d1d5db;border-radius:4px;background:#fff;cursor:pointer}.refresh-btn[data-v-bc05715d]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-bc05715d]:disabled{opacity:.5}.agent-summary[data-v-bc05715d]{display:flex;gap:12px;margin-bottom:16px;flex-wrap:wrap}.summary-card[data-v-bc05715d]{display:flex;flex-direction:column;align-items:center;padding:10px 16px;background:#f9fafb;border-radius:8px;min-width:70px}.summary-card.total[data-v-bc05715d]{background:#eff6ff}.summary-card.total .count[data-v-bc05715d]{color:#3b82f6}.summary-card.critical[data-v-bc05715d]{background:#fef2f2}.summary-card.critical .count[data-v-bc05715d]{color:#dc2626}.summary-card.high[data-v-bc05715d]{background:#fff7ed}.summary-card.high .count[data-v-bc05715d]{color:#f97316}.summary-card.medium[data-v-bc05715d]{background:#fffbeb}.summary-card.medium .count[data-v-bc05715d]{color:#f59e0b}.summary-card .count[data-v-bc05715d]{font-size:20px;font-weight:700}.summary-card .label[data-v-bc05715d]{font-size:10px;color:#6b7280;margin-top:2px}.loading-state[data-v-bc05715d],.empty-state[data-v-bc05715d]{text-align:center;padding:40px 20px;color:#6b7280}.errors-list[data-v-bc05715d]{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}.error-item[data-v-bc05715d]{padding:10px;background:#fff;border-radius:6px;border-left:3px solid #e5e7eb;cursor:pointer}.error-item.severity-critical[data-v-bc05715d]{border-left-color:#dc2626;background:#fef2f2}.error-item.severity-high[data-v-bc05715d]{border-left-color:#f97316;background:#fff7ed}.error-item.severity-medium[data-v-bc05715d]{border-left-color:#f59e0b;background:#fffbeb}.error-item.severity-low[data-v-bc05715d]{border-left-color:#6b7280}.error-header[data-v-bc05715d]{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;flex-wrap:wrap;gap:4px}.error-type[data-v-bc05715d]{font-weight:600;font-size:13px}.error-badges[data-v-bc05715d]{display:flex;gap:4px}.badge[data-v-bc05715d]{font-size:10px;padding:2px 6px;border-radius:3px;background:#e5e7eb;color:#6b7280}.badge.archived[data-v-bc05715d]{background:#fef3c7;color:#92400e}.badge.provider[data-v-bc05715d]{background:#dbeafe;color:#1d4ed8}.badge.model[data-v-bc05715d]{background:#f3e8ff;color:#7c3aed;font-family:monospace}.error-time[data-v-bc05715d]{font-size:11px;color:#9ca3af}.error-message[data-v-bc05715d]{font-size:12px;color:#4b5563;line-height:1.4}.error-detail[data-v-bc05715d]{margin-top:12px;padding-top:12px;border-top:1px solid #e5e7eb}.detail-section[data-v-bc05715d]{margin-bottom:12px}.detail-section[data-v-bc05715d]:last-child{margin-bottom:0}.detail-section h4[data-v-bc05715d]{margin:0 0 8px;font-size:12px;color:#374151}.error-full[data-v-bc05715d]{margin:0;padding:10px;background:#1f2937;color:#e5e7eb;border-radius:6px;font-size:11px;overflow-x:auto;white-space:pre-wrap;word-break:break-all;max-height:150px}.tool-chain[data-v-bc05715d]{display:flex;flex-direction:column;gap:4px}.tool-item[data-v-bc05715d]{display:flex;align-items:center;gap:8px;padding:6px 10px;background:#f3f4f6;border-radius:4px;font-size:12px}.tool-index[data-v-bc05715d]{width:20px;height:20px;background:#3b82f6;color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600}.tool-name[data-v-bc05715d]{flex:1;font-family:monospace;color:#1f2937}.tool-time[data-v-bc05715d]{font-size:10px;color:#9ca3af}.suggestions[data-v-bc05715d]{margin:0;padding-left:18px}.suggestions li[data-v-bc05715d]{margin:6px 0;font-size:12px;color:#4b5563}.detail-section.meta[data-v-bc05715d]{display:flex;gap:16px;font-size:10px;color:#9ca3af;font-family:monospace}.type-summary[data-v-bc05715d]{padding-top:16px;border-top:1px solid #e5e7eb}.type-summary h4[data-v-bc05715d]{margin:0 0 12px;font-size:13px;color:#374151}.type-bars[data-v-bc05715d]{display:flex;flex-direction:column;gap:8px}.type-bar[data-v-bc05715d]{display:flex;align-items:center;gap:8px}.type-label[data-v-bc05715d]{width:80px;font-size:11px;color:#6b7280}.bar-container[data-v-bc05715d]{flex:1;height:8px;background:#e5e7eb;border-radius:4px;overflow:hidden}.bar-fill[data-v-bc05715d]{height:100%;background:#3b82f6;border-radius:4px;transition:width .3s}.type-count[data-v-bc05715d]{width:30px;font-size:11px;color:#374151;text-align:right}.panel-overlay[data-v-cceac268]{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.panel[data-v-cceac268]{width:800px;max-width:92vw;max-height:90vh;background:#fff;border-radius:12px;box-shadow:0 8px 32px #0003;overflow:hidden;display:flex;flex-direction:column}.header[data-v-cceac268]{display:flex;justify-content:space-between;align-items:center;padding:1.5rem;border-bottom:1px solid #e5e7eb}.header h2[data-v-cceac268]{margin:0;font-size:1.5rem;color:#333}.close-btn[data-v-cceac268]{font-size:2rem;line-height:1;background:none;border:none;cursor:pointer;color:#999;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center}.close-btn[data-v-cceac268]:hover{color:#333}.content[data-v-cceac268]{padding:1.5rem;overflow-y:auto}.section[data-v-cceac268]{margin-bottom:1.5rem}.section[data-v-cceac268]:last-child{margin-bottom:0}.section h3[data-v-cceac268]{margin:0 0 .75rem;font-size:1rem;color:#666}.status-info[data-v-cceac268]{display:flex;align-items:center;gap:.5rem}.status-dot[data-v-cceac268]{width:12px;height:12px;border-radius:50%}.status-dot.status-idle[data-v-cceac268]{background:#4ade80}.status-dot.status-working[data-v-cceac268]{background:#fbbf24}.status-dot.status-down[data-v-cceac268]{background:#ef4444}.status-text[data-v-cceac268]{font-size:1.1rem;color:#333;font-weight:500}.error-title[data-v-cceac268]{color:#dc2626}.error-info[data-v-cceac268]{padding:1rem;background:#fef2f2;border-radius:6px;border-left:4px solid #dc2626}.error-type[data-v-cceac268]{font-weight:600;color:#dc2626;margin-bottom:.5rem}.error-message[data-v-cceac268]{font-size:.9rem;color:#666}.activity-list[data-v-cceac268]{display:flex;flex-direction:column;gap:.75rem}.activity-item[data-v-cceac268]{padding:.75rem;border-radius:6px;font-size:.9rem}.activity-item.working[data-v-cceac268]{background:#fef3c7;color:#92400e}.activity-item.idle[data-v-cceac268]{background:#d1fae5;color:#065f46}.activity-item.down[data-v-cceac268]{background:#fee2e2;color:#991b1b}.view-tabs[data-v-cceac268]{display:flex;flex-wrap:wrap;gap:6px 10px;margin-bottom:12px}.tab-btn[data-v-cceac268]{padding:6px 12px;font-size:12px;border:1px solid #e5e7eb;border-radius:6px;background:#fff;cursor:pointer;color:#6b7280;transition:all .2s;flex-shrink:0}.tab-btn[data-v-cceac268]:hover{background:#f9fafb}.tab-btn.active[data-v-cceac268]{background:#3b82f6;color:#fff;border-color:#3b82f6}.timeline-container[data-v-cceac268],.chain-container[data-v-cceac268]{border:1px solid #e5e7eb;border-radius:8px;overflow:hidden}.advanced-container[data-v-cceac268]{display:flex;flex-direction:column;gap:16px}.advanced-section[data-v-cceac268]{border:1px solid #e5e7eb;border-radius:8px;overflow:hidden}.advanced-section h4[data-v-cceac268]{margin:0;padding:10px 14px;background:#f9fafb;border-bottom:1px solid #e5e7eb;font-size:13px;font-weight:600;color:#374151}.diagnostic-panel[data-v-cceac268]{border-radius:8px;overflow:hidden;border:1px solid}.diagnostic-panel.severity-warning[data-v-cceac268]{border-color:#fbbf24;background:#fffbeb}.diagnostic-panel.severity-critical[data-v-cceac268]{border-color:#ef4444;background:#fef2f2}.diagnostic-header[data-v-cceac268]{display:flex;align-items:center;gap:8px;padding:12px 16px;font-weight:600}.severity-warning .diagnostic-header[data-v-cceac268]{background:#fef3c7;color:#92400e}.severity-critical .diagnostic-header[data-v-cceac268]{background:#fee2e2;color:#991b1b}.diagnostic-icon[data-v-cceac268]{font-size:18px}.diagnostic-title[data-v-cceac268]{font-size:14px}.diagnostic-content[data-v-cceac268]{padding:12px 16px}.diagnostic-item[data-v-cceac268]{display:flex;gap:8px;margin-bottom:8px;font-size:13px}.diagnostic-item .item-label[data-v-cceac268]{color:#6b7280;min-width:80px}.diagnostic-item .item-value[data-v-cceac268]{color:#374151}.diagnostic-item .item-value.highlight[data-v-cceac268]{font-weight:600;color:#dc2626}.diagnostic-hint[data-v-cceac268]{margin-top:12px;padding:10px;background:#00000008;border-radius:6px;font-size:12px}.hint-title[data-v-cceac268]{font-weight:600;color:#374151;margin-bottom:6px}.diagnostic-hint ul[data-v-cceac268]{margin:0;padding-left:18px;color:#6b7280}.diagnostic-hint li[data-v-cceac268]{margin:4px 0}.diagnostic-actions[data-v-cceac268]{margin-top:12px;display:flex;gap:8px}.action-btn[data-v-cceac268]{padding:6px 14px;font-size:13px;border-radius:6px;border:1px solid #d1d5db;background:#fff;cursor:pointer;color:#374151;transition:all .2s}.action-btn[data-v-cceac268]:hover{background:#f3f4f6}.action-btn.primary[data-v-cceac268]{background:#ef4444;border-color:#ef4444;color:#fff}.action-btn.primary[data-v-cceac268]:hover{background:#dc2626}@media (max-width: 1280px){.panel[data-v-cceac268]{width:700px}}@media (max-width: 768px){.panel[data-v-cceac268]{width:95vw;max-height:95vh}.header[data-v-cceac268]{padding:1rem}.header h2[data-v-cceac268]{font-size:1.2rem}.content[data-v-cceac268]{padding:1rem}.view-tabs[data-v-cceac268]{gap:4px 8px}.tab-btn[data-v-cceac268]{padding:5px 10px;font-size:11px}}.settings-panel[data-v-e5b26232]{position:fixed;top:0;right:0;bottom:0;width:400px;background:#fff;box-shadow:-4px 0 16px #00000026;display:flex;flex-direction:column;z-index:1000}.header[data-v-e5b26232]{display:flex;justify-content:space-between;align-items:center;padding:1.5rem;border-bottom:1px solid #e5e7eb}.header h2[data-v-e5b26232]{margin:0;font-size:1.5rem;color:#333}.close-btn[data-v-e5b26232]{font-size:2rem;line-height:1;background:none;border:none;cursor:pointer;color:#999;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center}.close-btn[data-v-e5b26232]:hover{color:#333}.content[data-v-e5b26232]{flex:1;padding:1.5rem;overflow-y:auto}section[data-v-e5b26232]{margin-bottom:2rem}section[data-v-e5b26232]:last-child{margin-bottom:0}section h3[data-v-e5b26232]{margin:0 0 1rem;font-size:1.1rem;color:#333}.setting-item[data-v-e5b26232]{display:flex;align-items:center;justify-content:space-between;padding:.75rem 0;border-bottom:1px solid #f3f4f6}.setting-item[data-v-e5b26232]:last-child{border-bottom:none}.setting-item label[data-v-e5b26232]{color:#666;font-size:.95rem}.setting-item input[type=number][data-v-e5b26232],.setting-item select[data-v-e5b26232]{padding:.5rem;border:1px solid #e5e7eb;border-radius:4px;width:100px}.setting-item input[type=checkbox][data-v-e5b26232]{margin-right:.5rem}.agent-card[data-v-04c4a970]{display:flex;flex-direction:column;background:#fff;border-radius:12px;box-shadow:0 2px 8px #00000014;cursor:pointer;transition:transform .2s,box-shadow .2s;overflow:hidden;height:100%}.agent-card[data-v-04c4a970]:hover{transform:translateY(-2px);box-shadow:0 4px 16px #0000001f}.agent-card.is-main[data-v-04c4a970]{border:2px solid #4a9eff;background:linear-gradient(180deg,#fff,#f8fafc)}.agent-card.is-main[data-v-04c4a970]:hover{box-shadow:0 6px 20px #4a9eff33}.agent-card.has-error[data-v-04c4a970]{border:2px solid #ef4444;background:linear-gradient(180deg,#fff,#fef2f2)}.agent-card.is-stuck[data-v-04c4a970]{border:2px solid #f59e0b;background:linear-gradient(180deg,#fff,#fffbeb)}.agent-card.is-main .card-header[data-v-04c4a970]{padding:.85rem 1rem}.agent-card.is-main .avatar[data-v-04c4a970]{font-size:2.2rem;width:48px;height:48px}.agent-card.is-main .name[data-v-04c4a970]{font-size:1rem}.agent-card.is-main .card-body[data-v-04c4a970]{padding:.85rem 1rem}.agent-card.is-main .current-task[data-v-04c4a970]{padding:.6rem .85rem}.agent-card.is-main .current-task .task-name[data-v-04c4a970]{font-size:.85rem;white-space:normal;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.card-header[data-v-04c4a970]{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;background:linear-gradient(135deg,#f8fafc,#f1f5f9);border-bottom:1px solid #e5e7eb}.avatar[data-v-04c4a970]{font-size:2rem;width:44px;height:44px;display:flex;align-items:center;justify-content:center;background:#fff;border-radius:10px;box-shadow:0 2px 4px #0000000f}.header-info[data-v-04c4a970]{flex:1;min-width:0}.name[data-v-04c4a970]{font-size:.95rem;font-weight:600;color:#1e293b;margin-bottom:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status-pill[data-v-04c4a970]{display:inline-flex;align-items:center;gap:.35rem;padding:2px 8px;border-radius:10px;font-size:.7rem;font-weight:500}.status-pill.status-idle[data-v-04c4a970]{background:#dcfce7;color:#166534}.status-pill.status-working[data-v-04c4a970]{background:#dbeafe;color:#1d4ed8}.status-pill.status-down[data-v-04c4a970]{background:#fee2e2;color:#991b1b}.status-dot[data-v-04c4a970]{width:6px;height:6px;border-radius:50%}.status-dot.status-idle[data-v-04c4a970]{background:#22c55e}.status-dot.status-working[data-v-04c4a970]{background:#3b82f6}.status-dot.status-down[data-v-04c4a970]{background:#ef4444}.main-badge[data-v-04c4a970]{font-size:.65rem;font-weight:700;color:#4a9eff;background:#4a9eff1a;padding:3px 8px;border-radius:4px;letter-spacing:.5px}.card-body[data-v-04c4a970]{flex:1;padding:.75rem 1rem;display:flex;flex-direction:column;gap:.6rem;overflow:hidden}.model-row[data-v-04c4a970]{display:flex;align-items:center;flex-wrap:wrap;gap:.4rem;font-size:.75rem}.model-label[data-v-04c4a970]{color:#94a3b8;min-width:36px}.model-value[data-v-04c4a970]{font-family:ui-monospace,Cascadia Code,monospace;font-weight:500;color:#475569}.model-fallbacks[data-v-04c4a970]{display:flex;align-items:center;gap:.25rem;margin-left:.25rem}.fallback-tag[data-v-04c4a970]{font-size:.6rem;color:#64748b;background:#f1f5f9;padding:1px 5px;border-radius:3px;font-family:ui-monospace,monospace}.fallback-more[data-v-04c4a970]{font-size:.55rem;color:#94a3b8}.error-warning[data-v-04c4a970]{background:linear-gradient(135deg,#fef2f2,#fee2e2);border:1px solid #fca5a5;border-radius:8px;padding:.5rem .75rem}.stuck-warning[data-v-04c4a970]{background:linear-gradient(135deg,#fffbeb,#fef3c7);border:1px solid #fcd34d;border-radius:8px;padding:.5rem .75rem}.warning-header[data-v-04c4a970]{display:flex;align-items:center;gap:.35rem;margin-bottom:.2rem}.warning-icon[data-v-04c4a970]{font-size:.75rem}.warning-label[data-v-04c4a970]{font-size:.7rem;font-weight:600;color:#991b1b}.stuck-warning .warning-label[data-v-04c4a970]{color:#92400e}.warning-message[data-v-04c4a970]{font-size:.7rem;color:#7f1d1d;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stuck-warning .warning-message[data-v-04c4a970]{color:#78350f}.current-task[data-v-04c4a970]{background:linear-gradient(135deg,#eff6ff,#dbeafe);border:1px solid #93c5fd;border-radius:8px;padding:.5rem .75rem}.task-header[data-v-04c4a970]{display:flex;align-items:center;gap:.35rem;margin-bottom:.25rem}.task-icon[data-v-04c4a970]{font-size:.65rem;color:#3b82f6}.task-label[data-v-04c4a970]{font-size:.65rem;color:#3b82f6;font-weight:500}.current-task .task-name[data-v-04c4a970]{font-size:.8rem;color:#1e40af;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.task-child-info[data-v-04c4a970]{display:flex;align-items:center;gap:.3rem;margin-top:.35rem;padding-top:.35rem;border-top:1px dashed #bfdbfe}.child-arrow[data-v-04c4a970]{font-size:.7rem;color:#64748b}.child-name[data-v-04c4a970]{font-size:.7rem;color:#64748b;background:#f1f5f9;padding:1px 6px;border-radius:3px}.idle-hint[data-v-04c4a970]{font-size:.75rem;color:#94a3b8;text-align:center;padding:.5rem;font-style:italic}.status-detail[data-v-04c4a970]{display:flex;align-items:center;gap:.4rem;padding:.4rem .6rem;border-radius:6px;font-size:.75rem;animation:pulse-subtle-04c4a970 2s ease-in-out infinite}.status-detail.sub-status-thinking[data-v-04c4a970]{background:linear-gradient(135deg,#fef3c7,#fde68a);border:1px solid #fcd34d;color:#92400e}.status-detail.sub-status-tool_executing[data-v-04c4a970]{background:linear-gradient(135deg,#dbeafe,#bfdbfe);border:1px solid #93c5fd;color:#1e40af}.status-detail.sub-status-waiting_llm[data-v-04c4a970]{background:linear-gradient(135deg,#e0e7ff,#c7d2fe);border:1px solid #a5b4fc;color:#3730a3}.status-detail.sub-status-waiting_child[data-v-04c4a970]{background:linear-gradient(135deg,#fce7f3,#fbcfe8);border:1px solid #f9a8d4;color:#9d174d}.action-icon[data-v-04c4a970]{font-size:.85rem}.action-text[data-v-04c4a970]{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@keyframes pulse-subtle-04c4a970{0%,to{opacity:1}50%{opacity:.7}}.multi-tasks[data-v-04c4a970]{background:linear-gradient(135deg,#eff6ff,#dbeafe);border:1px solid #93c5fd;border-radius:8px;overflow:hidden}.tasks-header[data-v-04c4a970]{display:flex;align-items:center;gap:.35rem;padding:.5rem .75rem;cursor:pointer;-webkit-user-select:none;user-select:none}.tasks-header[data-v-04c4a970]:hover{background:#3b82f61a}.tasks-icon[data-v-04c4a970]{font-size:.75rem}.tasks-label[data-v-04c4a970]{font-size:.7rem;color:#3b82f6;font-weight:500}.tasks-count[data-v-04c4a970]{font-size:.65rem;background:#3b82f6;color:#fff;padding:1px 6px;border-radius:10px;font-weight:600;margin-left:.25rem}.tasks-toggle[data-v-04c4a970]{font-size:.6rem;color:#64748b;margin-left:auto}.tasks-list[data-v-04c4a970]{max-height:0;overflow:hidden;transition:max-height .3s ease}.tasks-list.expanded[data-v-04c4a970]{max-height:200px;overflow-y:auto}.task-item[data-v-04c4a970]{display:flex;align-items:center;gap:.4rem;padding:.4rem .75rem;border-top:1px solid #e0e7ff;font-size:.75rem}.task-item[data-v-04c4a970]:hover{background:#3b82f60d}.task-status-dot[data-v-04c4a970]{width:6px;height:6px;border-radius:50%;flex-shrink:0}.task-item.task-status-working .task-status-dot[data-v-04c4a970]{background:#3b82f6;animation:pulse-dot-04c4a970 1.5s ease-in-out infinite}.task-item.task-status-retrying .task-status-dot[data-v-04c4a970]{background:#f59e0b}.task-item.task-status-failed .task-status-dot[data-v-04c4a970]{background:#ef4444}@keyframes pulse-dot-04c4a970{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(.8)}}.task-item .task-name[data-v-04c4a970]{flex:1;color:#1e40af;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.task-child-agent[data-v-04c4a970]{font-size:.65rem;color:#64748b;background:#f1f5f9;padding:1px 5px;border-radius:3px;flex-shrink:0}.tasks-more[data-v-04c4a970]{padding:.4rem .75rem;font-size:.7rem;color:#64748b;text-align:center;border-top:1px solid #e0e7ff;background:#3b82f608}.collaboration-flow-section[data-v-50bc0adc]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;padding:1.5rem}.section-header[data-v-50bc0adc]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;flex-wrap:wrap;gap:.5rem}.section-header .header-right[data-v-50bc0adc]{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.section-header h2[data-v-50bc0adc]{margin:0;font-size:1.3rem;color:#333}.connection-indicator[data-v-50bc0adc]{display:flex;align-items:center;gap:.4rem;font-size:.8rem;padding:.25rem .6rem;border-radius:12px;background:#f1f5f9}.connection-indicator.connected[data-v-50bc0adc]{background:#dcfce7;color:#166534}.connection-indicator.connecting[data-v-50bc0adc]{background:#fef3c7;color:#92400e}.connection-indicator.disconnected[data-v-50bc0adc],.connection-indicator.error[data-v-50bc0adc]{background:#fee2e2;color:#991b1b}.indicator-dot[data-v-50bc0adc]{width:6px;height:6px;border-radius:50%;background:currentColor}.connection-indicator.connecting .indicator-dot[data-v-50bc0adc]{animation:pulse-50bc0adc 1.5s ease-in-out infinite}@keyframes pulse-50bc0adc{0%,to{opacity:1}50%{opacity:.5}}.flow-container[data-v-50bc0adc]{border:1px solid #e5e7eb;border-radius:6px;background:#fafbfc;min-height:480px;position:relative;overflow:auto}.loading-state[data-v-50bc0adc],.error-state[data-v-50bc0adc],.empty-state[data-v-50bc0adc]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:280px;gap:.75rem;color:#6b7280}.spinner[data-v-50bc0adc]{width:28px;height:28px;border:3px solid #e5e7eb;border-top-color:#4a9eff;border-radius:50%;animation:spin-50bc0adc .8s linear infinite}@keyframes spin-50bc0adc{to{transform:rotate(360deg)}}.retry-btn[data-v-50bc0adc]{padding:.4rem .8rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:.85rem}.flow-layout[data-v-50bc0adc]{display:flex;min-height:460px}.agent-area[data-v-50bc0adc]{flex:1;position:relative;padding:1rem 1rem 2rem .5rem;min-width:300px}.level-section[data-v-50bc0adc]{margin-bottom:1.5rem;position:relative;z-index:1}.level-section[data-v-50bc0adc]:first-child{margin-bottom:2.5rem;z-index:2}.level-header[data-v-50bc0adc]{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem;padding-left:.5rem}.level-badge[data-v-50bc0adc]{display:inline-flex;align-items:center;justify-content:center;width:24px;height:20px;background:#e0e7ff;color:#4338ca;font-size:.65rem;font-weight:700;border-radius:4px}.level-title[data-v-50bc0adc]{font-size:.75rem;color:#64748b;font-weight:500}.level-cards[data-v-50bc0adc]{display:flex;flex-wrap:wrap;gap:16px;justify-content:center;padding:.5rem}.level-section:first-child .level-cards[data-v-50bc0adc]{min-height:auto;padding-bottom:1rem}.level-section:not(:first-child) .level-cards[data-v-50bc0adc]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px;max-width:900px;margin:0 auto}.agent-card-wrapper[data-v-50bc0adc]{cursor:pointer;transition:transform .2s,box-shadow .2s;border-radius:12px;position:relative;z-index:1;overflow:hidden}.level-section:first-child .agent-card-wrapper.main-agent[data-v-50bc0adc]{width:320px;max-width:100%}.agent-card-wrapper[data-v-50bc0adc]:hover{transform:translateY(-2px)}.agent-card-wrapper.active[data-v-50bc0adc]{box-shadow:0 0 0 3px #4a9eff40}.agent-card-wrapper[data-v-50bc0adc]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;border-radius:4px 0 0 4px;background:var(--agent-color, #64748b);z-index:1}.edges-svg[data-v-50bc0adc]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:5}.edge-path[data-v-50bc0adc]{fill:none;stroke:#4a9eff;stroke-width:2}.edge-path.active[data-v-50bc0adc]{stroke-width:2.5;stroke-dasharray:6 4;animation:flowAnim-50bc0adc 1s linear infinite}@keyframes flowAnim-50bc0adc{to{stroke-dashoffset:-10}}.model-panel[data-v-50bc0adc]{width:150px;min-width:120px;border-left:1px solid #e5e7eb;background:#f8fafc;flex-shrink:0;display:flex;flex-direction:column}.model-panel-header[data-v-50bc0adc]{display:flex;justify-content:space-between;align-items:center;padding:.5rem .6rem;background:#f1f5f9;border-bottom:1px solid #e5e7eb;cursor:pointer}.model-panel-title[data-v-50bc0adc]{font-size:.7rem;font-weight:600;color:#475569}.model-toggle-icon[data-v-50bc0adc]{font-size:.6rem;color:#94a3b8}.model-panel-body[data-v-50bc0adc]{flex:1;padding:.4rem;overflow-y:auto}.model-card[data-v-50bc0adc]{background:#fff;border:1px solid #e2e8f0;border-radius:5px;padding:.4rem .5rem;margin-bottom:.4rem}.model-card.active[data-v-50bc0adc]{border-color:#f97316}.model-name[data-v-50bc0adc]{font-size:.65rem;font-weight:600;font-family:ui-monospace,monospace;color:#334155;margin-bottom:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.model-dots[data-v-50bc0adc]{display:flex;flex-wrap:wrap;gap:2px;margin-bottom:.2rem}.model-dot[data-v-50bc0adc]{width:5px;height:5px;border-radius:50%;cursor:pointer}.model-dot[data-v-50bc0adc]:hover{transform:scale(1.3)}.model-count[data-v-50bc0adc]{font-size:.55rem;color:#94a3b8}.flow-legend.flow-legend-inline[data-v-50bc0adc]{position:static;display:flex;flex-wrap:wrap;gap:.5rem;padding:.25rem .5rem;background:#f8fafc;border-radius:6px;border:1px solid #e5e7eb;font-size:.7rem;color:#475569}.legend-item[data-v-50bc0adc]{display:flex;align-items:center;gap:.35rem;padding:2px 6px;border-radius:4px;background:#f8fafc}.legend-dot[data-v-50bc0adc]{width:10px;height:10px;border-radius:3px}.legend-name[data-v-50bc0adc]{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.call-detail-overlay[data-v-50bc0adc]{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000059;display:flex;align-items:center;justify-content:center;z-index:1000}.call-detail-modal[data-v-50bc0adc]{background:#fff;border-radius:10px;box-shadow:0 8px 32px #0003;min-width:300px;max-width:90%}.call-detail-header[data-v-50bc0adc]{display:flex;justify-content:space-between;align-items:center;padding:.6rem .9rem;border-bottom:1px solid #e5e7eb}.call-detail-header h3[data-v-50bc0adc]{margin:0;font-size:.9rem}.close-btn[data-v-50bc0adc]{background:none;border:none;font-size:1.2rem;cursor:pointer;color:#6b7280;line-height:1}.call-detail-body[data-v-50bc0adc]{padding:.6rem .9rem}.call-detail-row[data-v-50bc0adc]{display:flex;gap:.6rem;margin-bottom:.4rem}.call-detail-row .label[data-v-50bc0adc]{color:#6b7280;min-width:45px;font-size:.8rem}.call-detail-row .value[data-v-50bc0adc]{color:#333;font-size:.8rem;word-break:break-word}.call-detail-row.trigger .value[data-v-50bc0adc]{font-size:.75rem}@media (max-width: 1280px){.level-section:first-child .agent-card-wrapper.main-agent[data-v-50bc0adc]{width:280px}.level-section:not(:first-child) .level-cards[data-v-50bc0adc]{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.model-panel[data-v-50bc0adc]{width:130px}}@media (max-width: 1024px){.flow-layout[data-v-50bc0adc]{flex-direction:column}.model-panel[data-v-50bc0adc]{width:100%;border-left:none;border-top:1px solid #e5e7eb;max-height:200px}.model-panel-body[data-v-50bc0adc]{display:flex;flex-wrap:wrap;gap:.5rem}.model-card[data-v-50bc0adc]{flex:1;min-width:120px;margin-bottom:0}}.collaboration-box[data-v-ef9f8c73]{background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 2px 8px #0000001a;overflow:hidden}.collaboration-box-header[data-v-ef9f8c73]{padding:1rem 1.5rem;border-bottom:2px solid #e2e8f0;background:#f8fafc}.collaboration-box-header h2[data-v-ef9f8c73]{margin:0 0 .25rem;font-size:1.3rem;color:#1e293b}.collaboration-hint[data-v-ef9f8c73]{font-size:.85rem;color:#64748b}.collaboration-box-body[data-v-ef9f8c73]{padding:1rem 1.5rem;min-height:600px}.collaboration-error-fallback[data-v-ef9f8c73]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:500px;gap:1rem;color:#64748b}.fallback-title[data-v-ef9f8c73]{margin:0;font-size:1.1rem;color:#334155}.fallback-reason[data-v-ef9f8c73]{margin:0;font-size:.9rem;color:#ef4444;max-width:400px;text-align:center}.collaboration-error-fallback button[data-v-ef9f8c73]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer}.collaboration-error-fallback button[data-v-ef9f8c73]:hover{background:#3a8eef}.task-status-section[data-v-5d944098]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;padding:1.5rem}.section-header[data-v-5d944098]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;flex-wrap:wrap;gap:.5rem}.section-header h2[data-v-5d944098]{margin:0;font-size:1.3rem;color:#333}.summary-stats[data-v-5d944098]{display:flex;gap:1rem;flex-wrap:wrap}.stat[data-v-5d944098]{font-size:.85rem;padding:.25rem .75rem;border-radius:4px;background:#f1f5f9}.stat.running[data-v-5d944098]{background:#dcfce7;color:#166534}.stat.completed[data-v-5d944098]{background:#fef3c7;color:#92400e}.stat.failed[data-v-5d944098]{background:#fee2e2;color:#991b1b}.stat.clickable[data-v-5d944098]{cursor:pointer;transition:all .2s ease}.stat.clickable[data-v-5d944098]:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.stat.clickable.active[data-v-5d944098]{font-weight:600;box-shadow:0 0 0 2px currentColor}.filters-row[data-v-5d944098]{display:flex;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}.search-box[data-v-5d944098]{flex:1;min-width:200px}.search-input[data-v-5d944098]{width:100%;padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;font-size:.9rem;outline:none;transition:border-color .2s}.search-input[data-v-5d944098]:focus{border-color:#4a9eff}.filter-buttons[data-v-5d944098]{display:flex;gap:.5rem;flex-wrap:wrap}.filter-btn[data-v-5d944098]{padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.85rem;cursor:pointer;transition:all .2s}.filter-btn[data-v-5d944098]:hover{border-color:#4a9eff}.filter-btn.active[data-v-5d944098]{background:#4a9eff;color:#fff;border-color:#4a9eff}.loading-state[data-v-5d944098],.error-state[data-v-5d944098],.empty-state[data-v-5d944098]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:200px;gap:1rem;color:#6b7280}.spinner[data-v-5d944098]{width:32px;height:32px;border:3px solid #e5e7eb;border-top-color:#4a9eff;border-radius:50%;animation:spin-5d944098 1s linear infinite}@keyframes spin-5d944098{to{transform:rotate(360deg)}}.retry-btn[data-v-5d944098]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer}.task-list-container[data-v-5d944098]{max-height:600px;overflow-y:auto;border:1px solid #e5e7eb;border-radius:6px;position:relative}.task-list[data-v-5d944098]{display:flex;flex-direction:column}.task-item[data-v-5d944098]{display:flex;align-items:center;gap:.75rem;padding:.6rem 1rem;border-bottom:1px solid #f1f5f9;background:#fff;cursor:pointer;transition:background .15s}.task-item[data-v-5d944098]:hover{background:#f8fafc}.task-item[data-v-5d944098]:last-child{border-bottom:none}.task-status-icon[data-v-5d944098]{font-size:1rem}.task-status-icon.running[data-v-5d944098]{color:#22c55e}.task-status-icon.completed[data-v-5d944098]{color:#f59e0b}.task-status-icon.failed[data-v-5d944098]{color:#ef4444}.task-status-icon.pending[data-v-5d944098]{color:#9ca3af}.task-main[data-v-5d944098]{flex:1;min-width:0}.task-name-short[data-v-5d944098]{font-size:.9rem;font-weight:500;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-detail-hint[data-v-5d944098]{font-size:.75rem;color:#94a3b8;flex-shrink:0}.task-agent[data-v-5d944098]{font-size:.8rem;color:#6b7280;background:#f1f5f9;padding:.125rem .5rem;border-radius:4px}.task-time[data-v-5d944098]{font-size:.8rem;color:#94a3b8}.task-detail-overlay[data-v-5d944098]{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;display:flex;align-items:center;justify-content:center;z-index:1000}.task-detail-modal[data-v-5d944098]{background:#fff;border-radius:12px;box-shadow:0 10px 40px #0003;max-width:560px;width:90%;max-height:85vh;display:flex;flex-direction:column}.task-detail-header[data-v-5d944098]{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.25rem;border-bottom:1px solid #e5e7eb}.task-detail-header h3[data-v-5d944098]{margin:0;font-size:1rem;color:#333}.task-detail-header .close-btn[data-v-5d944098]{background:none;border:none;font-size:1.5rem;cursor:pointer;color:#6b7280;line-height:1;padding:0 .25rem}.task-detail-header .close-btn[data-v-5d944098]:hover{color:#333}.task-detail-body[data-v-5d944098]{padding:1rem 1.25rem;overflow-y:auto}.detail-row[data-v-5d944098]{margin-bottom:1rem}.detail-row[data-v-5d944098]:last-child{margin-bottom:0}.detail-label[data-v-5d944098]{display:block;font-size:.75rem;color:#64748b;margin-bottom:.25rem}.detail-value[data-v-5d944098]{font-size:.9rem;color:#333;word-break:break-word}.detail-value.task-content[data-v-5d944098]{white-space:pre-wrap;line-height:1.5}.detail-value.path-value[data-v-5d944098]{font-family:ui-monospace,monospace;font-size:.85rem;color:#475569}.generated-files-list[data-v-5d944098]{margin:0;padding-left:1.25rem;font-family:ui-monospace,monospace;font-size:.85rem;color:#475569;line-height:1.6}.file-path-item[data-v-5d944098]{word-break:break-all;margin-bottom:.25rem}.detail-value.output-content[data-v-5d944098]{white-space:pre-wrap;line-height:1.6;max-height:400px;overflow-y:auto;background:#f8fafc;padding:.75rem 1rem;border-radius:6px;border:1px solid #e2e8f0;font-size:.85rem}.detail-value.error[data-v-5d944098]{color:#b91c1c;background:#fef2f2;padding:.5rem;border-radius:6px;display:block}.detail-progress[data-v-5d944098]{display:flex;align-items:center;gap:.75rem}.detail-progress .progress-bar[data-v-5d944098]{flex:1;height:6px;background:#e5e7eb;border-radius:3px;overflow:hidden}.detail-progress .progress-fill[data-v-5d944098]{height:100%;background:linear-gradient(90deg,#4a9eff,#6bb9ff);border-radius:3px;transition:width .3s ease}.detail-progress .progress-text[data-v-5d944098]{font-size:.8rem;color:#6b7280;min-width:40px}.detail-subtasks[data-v-5d944098]{display:flex;flex-direction:column;gap:.5rem}.subtask-row[data-v-5d944098]{display:flex;align-items:center;gap:.5rem;font-size:.85rem;padding:.35rem .5rem;background:#f8fafc;border-radius:6px}.subtask-error-inline[data-v-5d944098]{margin-left:auto;font-size:.8rem;color:#b91c1c}.timeline-container[data-v-5d944098]{flex:1;max-height:300px;overflow-y:auto}.timeline[data-v-5d944098]{position:relative;padding-left:20px}.timeline[data-v-5d944098]:before{content:"";position:absolute;left:6px;top:0;bottom:0;width:2px;background:#e5e7eb}.timeline-item[data-v-5d944098]{position:relative;display:flex;align-items:flex-start;gap:12px;padding:8px 0;font-size:.85rem}.timeline-dot[data-v-5d944098]{position:absolute;left:-17px;top:12px;width:10px;height:10px;border-radius:50%;background:#9ca3af;border:2px solid #fff;box-shadow:0 0 0 2px #e5e7eb}.timeline-item.created .timeline-dot[data-v-5d944098]{background:#3b82f6;box-shadow:0 0 0 2px #3b82f6}.timeline-item.completed .timeline-dot[data-v-5d944098]{background:#10b981;box-shadow:0 0 0 2px #10b981}.timeline-item.failed .timeline-dot[data-v-5d944098]{background:#ef4444;box-shadow:0 0 0 2px #ef4444}.timeline-item.tool .timeline-dot[data-v-5d944098]{background:#f59e0b}.timeline-item.start .timeline-dot[data-v-5d944098]{background:#6366f1}.timeline-time[data-v-5d944098]{flex-shrink:0;width:70px;font-size:.75rem;color:#6b7280;font-family:monospace}.timeline-desc[data-v-5d944098]{flex:1;color:#374151}.timeline-item.failed .timeline-desc[data-v-5d944098]{color:#991b1b}@media (max-width: 640px){.section-header[data-v-5d944098]{flex-direction:column;align-items:flex-start}.summary-stats[data-v-5d944098]{font-size:.75rem}.filters-row[data-v-5d944098]{flex-direction:column}.filter-buttons[data-v-5d944098]{width:100%;justify-content:flex-start}.task-agent[data-v-5d944098]{display:none}}.performance-section[data-v-6508c9b4]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;padding:1.5rem}.section-header[data-v-6508c9b4]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;flex-wrap:wrap;gap:1rem}.section-header h2[data-v-6508c9b4]{margin:0;font-size:1.3rem;color:#333}.time-range-selector[data-v-6508c9b4]{display:flex;gap:.5rem}.range-btn[data-v-6508c9b4]{padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.85rem;cursor:pointer;transition:all .2s}.range-btn[data-v-6508c9b4]:hover{border-color:#4a9eff}.range-btn.active[data-v-6508c9b4]{background:#4a9eff;color:#fff;border-color:#4a9eff}.loading-state[data-v-6508c9b4],.error-state[data-v-6508c9b4]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:200px;gap:1rem;color:#6b7280}.spinner[data-v-6508c9b4]{width:32px;height:32px;border:3px solid #e5e7eb;border-top-color:#4a9eff;border-radius:50%;animation:spin-6508c9b4 1s linear infinite}@keyframes spin-6508c9b4{to{transform:rotate(360deg)}}.retry-btn[data-v-6508c9b4]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer}.metrics-grid[data-v-6508c9b4]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem;margin-bottom:2rem}.metric-card[data-v-6508c9b4]{display:flex;align-items:center;gap:1rem;padding:1.25rem;background:#f9fafb;border-radius:8px;border:1px solid #e5e7eb;position:relative}.metric-card.primary[data-v-6508c9b4]{background:linear-gradient(135deg,#eff6ff,#dbeafe);border-color:#93c5fd}.metric-card.highlight[data-v-6508c9b4]{background:#f0fdf4;border-color:#86efac}.metric-icon[data-v-6508c9b4]{font-size:2rem}.metric-content[data-v-6508c9b4]{flex:1}.metric-label[data-v-6508c9b4]{font-size:.8rem;color:#6b7280;margin-bottom:.25rem}.metric-value[data-v-6508c9b4]{font-size:1.75rem;font-weight:600;color:#333}.metric-unit[data-v-6508c9b4]{font-size:.75rem;color:#94a3b8}.metric-alert[data-v-6508c9b4]{position:absolute;top:.5rem;right:.5rem;font-size:1.25rem;animation:pulse-6508c9b4 2s infinite}@keyframes pulse-6508c9b4{0%,to{opacity:1}50%{opacity:.5}}.charts-stack[data-v-6508c9b4]{display:flex;flex-direction:column;gap:1.5rem;margin-bottom:2rem}.chart-card[data-v-6508c9b4]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:1.25rem}.chart-header[data-v-6508c9b4]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.chart-header h3[data-v-6508c9b4]{margin:0;font-size:1rem;color:#666}.chart-datetime[data-v-6508c9b4]{font-size:.8rem;color:#94a3b8}.chart-container[data-v-6508c9b4]{height:200px;display:flex;flex-direction:column}.chart-bars[data-v-6508c9b4]{flex:1;display:flex;align-items:flex-end;gap:4px;padding-bottom:36px;padding-top:28px;overflow-x:auto;min-width:0}.chart-bar[data-v-6508c9b4]{flex:1;min-width:16px;background:linear-gradient(to top,#4a9eff,#6bb9ff);border-radius:3px 3px 0 0;min-height:8px;position:relative;transition:height .3s ease;cursor:pointer;display:flex;flex-direction:column;align-items:center}.chart-bars.rpm .chart-bar[data-v-6508c9b4]{background:linear-gradient(to top,#10b981,#34d399)}.bar-value[data-v-6508c9b4]{position:absolute;top:-22px;left:50%;transform:translate(-50%);font-size:.6rem;color:#6b7280;white-space:nowrap}.bar-time-label[data-v-6508c9b4]{position:absolute;bottom:-30px;left:50%;transform:translate(-50%);font-size:.65rem;color:#6b7280;white-space:nowrap}.summary-section[data-v-6508c9b4]{padding-top:1.5rem;border-top:1px solid #e5e7eb;margin-bottom:1.5rem}.summary-section h3[data-v-6508c9b4]{margin:0 0 1rem;font-size:1rem;color:#666}.summary-grid[data-v-6508c9b4]{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:1rem}.summary-item[data-v-6508c9b4]{display:flex;flex-direction:column;gap:.25rem;padding:1rem;background:#f9fafb;border-radius:6px}.summary-item.highlight[data-v-6508c9b4]{background:#eff6ff;border:1px solid #bfdbfe}.summary-label[data-v-6508c9b4]{font-size:.8rem;color:#6b7280}.summary-value[data-v-6508c9b4]{font-size:1.25rem;font-weight:600;color:#333}.summary-sub[data-v-6508c9b4]{font-size:.75rem;color:#6b7280}.chart-bar.clickable[data-v-6508c9b4]{cursor:pointer}.chart-bar.clickable[data-v-6508c9b4]:hover{opacity:.9}.detail-modal-overlay[data-v-6508c9b4]{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;display:flex;align-items:center;justify-content:center;z-index:1000}.detail-modal[data-v-6508c9b4]{background:#fff;border-radius:12px;box-shadow:0 10px 40px #0003;max-width:560px;width:90%;max-height:80vh;display:flex;flex-direction:column}.detail-modal-header[data-v-6508c9b4]{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.25rem;border-bottom:1px solid #e5e7eb}.detail-modal-header h3[data-v-6508c9b4]{margin:0;font-size:1rem;color:#333}.detail-modal-header .close-btn[data-v-6508c9b4]{background:none;border:none;font-size:1.5rem;cursor:pointer;color:#6b7280;line-height:1;padding:0 .25rem}.detail-modal-header .close-btn[data-v-6508c9b4]:hover{color:#333}.detail-modal-body[data-v-6508c9b4]{padding:1rem 1.25rem;overflow-y:auto}.detail-loading[data-v-6508c9b4]{text-align:center;padding:2rem;color:#6b7280}.detail-summary[data-v-6508c9b4]{font-size:.9rem;color:#6b7280;margin-bottom:1rem}.detail-filters[data-v-6508c9b4]{display:flex;gap:.75rem;margin-bottom:1rem;flex-wrap:wrap}.search-input[data-v-6508c9b4]{flex:1;min-width:150px;padding:.5rem .75rem;border:1px solid #e5e7eb;border-radius:6px;font-size:.85rem;outline:none}.search-input[data-v-6508c9b4]:focus{border-color:#4a9eff}.agent-filter[data-v-6508c9b4],.sort-select[data-v-6508c9b4]{padding:.5rem .75rem;border:1px solid #e5e7eb;border-radius:6px;font-size:.85rem;background:#fff;cursor:pointer;outline:none}.agent-filter[data-v-6508c9b4]:focus,.sort-select[data-v-6508c9b4]:focus{border-color:#4a9eff}.detail-calls[data-v-6508c9b4]{display:flex;flex-direction:column;gap:.75rem}.detail-call-hint[data-v-6508c9b4]{display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;background:#eff6ff;border:1px solid #93c5fd;border-radius:6px;margin-bottom:.75rem}.detail-call-hint .hint-badge[data-v-6508c9b4]{font-size:.8rem;font-weight:600;color:#1d4ed8;padding:.15rem .5rem;background:#dbeafe;border-radius:4px}.detail-call-hint .hint-text[data-v-6508c9b4]{font-size:.8rem;color:#1e40af}.detail-call-item[data-v-6508c9b4]{padding:.75rem 1rem;background:#f9fafb;border-radius:8px;border-left:3px solid #4a9eff}.detail-call-item .call-header[data-v-6508c9b4]{display:flex;align-items:center;gap:.5rem;margin-bottom:.35rem}.detail-call-item .call-agent[data-v-6508c9b4]{font-weight:600;color:#333}.detail-call-item .call-time[data-v-6508c9b4]{font-size:.8rem;color:#6b7280}.detail-call-item .call-tokens[data-v-6508c9b4]{font-size:.8rem;color:#10b981;margin-left:auto}.detail-call-item .call-trigger[data-v-6508c9b4]{font-size:.85rem;color:#555;word-break:break-word;margin-top:.25rem;white-space:pre-wrap}.detail-call-item .call-trigger-badge[data-v-6508c9b4]{display:inline-block;font-size:.75rem;font-weight:600;color:#1d4ed8;padding:.1rem .4rem;background:#dbeafe;border-radius:4px;margin-right:.35rem}.detail-call-item .call-meta[data-v-6508c9b4]{font-size:.75rem;color:#9ca3af;margin-top:.25rem}.detail-empty[data-v-6508c9b4]{text-align:center;padding:2rem;color:#9ca3af}.alerts-panel[data-v-6508c9b4]{background:#fef3c7;border:1px solid #fcd34d;border-radius:8px;padding:1rem}.alerts-panel h3[data-v-6508c9b4]{margin:0 0 .75rem;font-size:.95rem;color:#92400e}.alerts-list[data-v-6508c9b4]{display:flex;flex-direction:column;gap:.5rem}.alert-item[data-v-6508c9b4]{display:flex;align-items:center;gap:1rem;padding:.75rem;background:#fff;border-radius:6px;font-size:.85rem}.alert-message[data-v-6508c9b4]{flex:1;color:#333}.alert-value[data-v-6508c9b4]{color:#6b7280}.alert-time[data-v-6508c9b4]{font-size:.75rem;color:#94a3b8}.ack-btn[data-v-6508c9b4]{padding:.25rem .75rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;font-size:.75rem;cursor:pointer}.ack-btn[data-v-6508c9b4]:hover{background:#3a8eef}@media (max-width: 640px){.section-header[data-v-6508c9b4]{flex-direction:column;align-items:flex-start}.time-range-selector[data-v-6508c9b4]{width:100%;justify-content:space-between}.range-btn[data-v-6508c9b4]{flex:1;text-align:center;padding:.5rem;font-size:.75rem}.metrics-grid[data-v-6508c9b4]{grid-template-columns:1fr 1fr}}.token-analysis[data-v-b98a8391]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;padding:1.5rem}.section-header[data-v-b98a8391]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;flex-wrap:wrap;gap:1rem}.section-header h2[data-v-b98a8391]{margin:0;font-size:1.3rem;color:#333}.time-range-selector[data-v-b98a8391]{display:flex;gap:.5rem}.range-btn[data-v-b98a8391]{padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.85rem;cursor:pointer;transition:all .2s}.range-btn[data-v-b98a8391]:hover{border-color:#4a9eff}.range-btn.active[data-v-b98a8391]{background:#4a9eff;color:#fff;border-color:#4a9eff}.loading-state[data-v-b98a8391],.error-state[data-v-b98a8391]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:200px;gap:1rem;color:#6b7280}.spinner[data-v-b98a8391]{width:32px;height:32px;border:3px solid #e5e7eb;border-top-color:#4a9eff;border-radius:50%;animation:spin-b98a8391 1s linear infinite}@keyframes spin-b98a8391{to{transform:rotate(360deg)}}.retry-btn[data-v-b98a8391]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer}.error-icon[data-v-b98a8391]{font-size:2rem}.summary-cards[data-v-b98a8391]{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:1rem;margin-bottom:1.5rem}.summary-card[data-v-b98a8391]{display:flex;align-items:center;gap:.75rem;padding:1rem;background:#f9fafb;border-radius:8px;border:1px solid #e5e7eb}.summary-card.highlight[data-v-b98a8391]{background:#f0fdf4;border-color:#86efac}.summary-card.cost[data-v-b98a8391]{background:linear-gradient(135deg,#fefce8,#fef9c3);border-color:#fde047}.card-icon[data-v-b98a8391]{font-size:1.5rem}.card-content[data-v-b98a8391]{flex:1}.card-label[data-v-b98a8391]{font-size:.8rem;color:#6b7280;margin-bottom:.25rem}.card-value[data-v-b98a8391]{font-size:1.25rem;font-weight:600;color:#333}.card-sub[data-v-b98a8391]{font-size:.75rem;color:#6b7280;margin-top:.25rem}.card-sub.saved[data-v-b98a8391]{color:#16a34a;font-weight:500}.trend-section[data-v-b98a8391]{margin-bottom:1.5rem;padding:1rem;background:#f9fafb;border-radius:8px;border:1px solid #e5e7eb}.trend-section h3[data-v-b98a8391]{margin:0 0 1rem;font-size:1rem;color:#666}.trend-chart[data-v-b98a8391]{position:relative}.trend-bars[data-v-b98a8391]{display:flex;align-items:flex-end;gap:2px;height:120px;padding-bottom:30px}.trend-bar-group[data-v-b98a8391]{flex:1;display:flex;align-items:flex-end;gap:1px;min-width:20px;position:relative}.trend-bar[data-v-b98a8391]{flex:1;min-width:8px;border-radius:2px 2px 0 0;min-height:2px;position:relative;transition:height .3s ease}.trend-bar.input[data-v-b98a8391]{background:linear-gradient(to top,#4a9eff,#6bb9ff)}.trend-bar.output[data-v-b98a8391]{background:linear-gradient(to top,#f59e0b,#fbbf24)}.bar-tooltip[data-v-b98a8391]{position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:2px 6px;border-radius:4px;font-size:.7rem;white-space:nowrap;opacity:0;transition:opacity .2s;pointer-events:none}.trend-bar:hover .bar-tooltip[data-v-b98a8391]{opacity:1}.trend-time[data-v-b98a8391]{position:absolute;bottom:-25px;left:50%;transform:translate(-50%);font-size:.65rem;color:#6b7280;white-space:nowrap}.trend-legend[data-v-b98a8391]{display:flex;justify-content:center;gap:1.5rem;margin-top:.5rem}.legend-item[data-v-b98a8391]{display:flex;align-items:center;gap:.5rem;font-size:.8rem;color:#6b7280}.legend-color[data-v-b98a8391]{width:12px;height:12px;border-radius:2px}.legend-color.input[data-v-b98a8391]{background:#4a9eff}.legend-color.output[data-v-b98a8391]{background:#f59e0b}.view-toggle[data-v-b98a8391]{display:flex;gap:.5rem;margin-bottom:1rem}.view-toggle button[data-v-b98a8391]{padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.85rem;cursor:pointer;transition:all .2s}.view-toggle button[data-v-b98a8391]:hover{border-color:#4a9eff}.view-toggle button.active[data-v-b98a8391]{background:#4a9eff;color:#fff;border-color:#4a9eff}.by-agent-table[data-v-b98a8391]{overflow-x:auto}.by-agent-table table[data-v-b98a8391]{width:100%;border-collapse:collapse;font-size:.9rem}.by-agent-table th[data-v-b98a8391],.by-agent-table td[data-v-b98a8391]{padding:.75rem;text-align:left;border-bottom:1px solid #e5e7eb}.by-agent-table th[data-v-b98a8391]{background:#f9fafb;font-weight:600;color:#6b7280;font-size:.8rem;text-transform:uppercase}.by-agent-table tfoot td[data-v-b98a8391]{background:#f9fafb;font-weight:500}.agent-name[data-v-b98a8391]{font-weight:500;color:#333}.total-col[data-v-b98a8391]{font-weight:600;color:#4a9eff}.percent-bar[data-v-b98a8391]{display:flex;align-items:center;gap:.5rem}.percent-fill[data-v-b98a8391]{height:8px;background:#4a9eff;border-radius:4px;min-width:4px}.percent-text[data-v-b98a8391]{font-size:.8rem;color:#6b7280;white-space:nowrap}.by-agent-chart h3[data-v-b98a8391]{margin:0 0 1rem;font-size:1rem;color:#666}.bar-chart[data-v-b98a8391]{display:flex;flex-direction:column;gap:.75rem}.bar-row[data-v-b98a8391]{display:flex;align-items:center;gap:1rem}.bar-label[data-v-b98a8391]{width:120px;font-size:.85rem;font-weight:500;color:#333;flex-shrink:0}.bar-container[data-v-b98a8391]{flex:1;height:24px;background:#f3f4f6;border-radius:4px;overflow:hidden}.bar[data-v-b98a8391]{height:100%;background:linear-gradient(90deg,#4a9eff,#6bb9ff);border-radius:4px;display:flex;align-items:center;justify-content:flex-end;padding-right:.5rem;min-width:fit-content}.bar-value[data-v-b98a8391]{font-size:.75rem;color:#fff;font-weight:500;white-space:nowrap}.bar-percent[data-v-b98a8391]{width:50px;font-size:.8rem;color:#6b7280;text-align:right}@media (max-width: 640px){.section-header[data-v-b98a8391]{flex-direction:column;align-items:flex-start}.time-range-selector[data-v-b98a8391]{width:100%;justify-content:space-between}.range-btn[data-v-b98a8391]{flex:1;text-align:center;padding:.5rem;font-size:.75rem}.summary-cards[data-v-b98a8391]{grid-template-columns:1fr 1fr}.bar-label[data-v-b98a8391]{width:80px;font-size:.75rem}.bar-percent[data-v-b98a8391]{width:40px}}.performance-panel[data-v-7962ace4]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;overflow:hidden}.panel-header[data-v-7962ace4]{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.5rem;background:#f9fafb;border-bottom:1px solid #e5e7eb;flex-wrap:wrap;gap:1rem}.panel-header h2[data-v-7962ace4]{margin:0;font-size:1.3rem;color:#333}.tab-switcher[data-v-7962ace4]{display:flex;gap:.5rem}.tab-btn[data-v-7962ace4]{padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.85rem;cursor:pointer;transition:all .2s;display:flex;align-items:center;gap:.5rem}.tab-btn[data-v-7962ace4]:hover{border-color:#4a9eff}.tab-btn.active[data-v-7962ace4]{background:#4a9eff;color:#fff;border-color:#4a9eff}.panel-content[data-v-7962ace4]{padding:0}.panel-content[data-v-7962ace4] .performance-section,.panel-content[data-v-7962ace4] .token-analysis{background:transparent;box-shadow:none;border-radius:0;padding:1.5rem;margin-bottom:0}@media (max-width: 640px){.panel-header[data-v-7962ace4]{flex-direction:column;align-items:flex-start}.tab-switcher[data-v-7962ace4]{width:100%}.tab-btn[data-v-7962ace4]{flex:1;justify-content:center}}.error-center[data-v-ca874c41]{background:#fff;border-radius:8px;padding:1.5rem;box-shadow:0 2px 8px #0000001a}.header[data-v-ca874c41]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;flex-wrap:wrap;gap:1rem}.header h2[data-v-ca874c41]{margin:0;font-size:1.3rem;color:#333}.header-actions[data-v-ca874c41]{display:flex;gap:.75rem;align-items:center}.filter-select[data-v-ca874c41]{padding:.5rem .75rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.9rem;min-width:120px}.refresh-btn[data-v-ca874c41]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:.9rem}.refresh-btn[data-v-ca874c41]:hover{background:#3a8eef}.stats-row[data-v-ca874c41]{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:1rem;margin-bottom:1.5rem}.stat-card[data-v-ca874c41]{background:#f8fafc;border-radius:8px;padding:1rem;text-align:center;border:1px solid #e2e8f0}.stat-card.total[data-v-ca874c41]{background:#fef2f2;border-color:#fecaca}.stat-card.session[data-v-ca874c41]{background:#fef3c7;border-color:#fde68a}.stat-card.model[data-v-ca874c41]{background:#ede9fe;border-color:#ddd6fe}.stat-card.healthy[data-v-ca874c41]{background:#d1fae5;border-color:#a7f3d0}.stat-card.warning[data-v-ca874c41]{background:#fef3c7;border-color:#fde68a}.stat-value[data-v-ca874c41]{font-size:1.8rem;font-weight:700;color:#1e293b}.stat-label[data-v-ca874c41]{font-size:.85rem;color:#64748b;margin-top:.25rem}.trend-section[data-v-ca874c41]{margin-bottom:1.5rem}.trend-section h3[data-v-ca874c41]{margin:0 0 .75rem;font-size:1rem;color:#475569}.trend-chart[data-v-ca874c41]{display:flex;align-items:flex-end;gap:2px;height:80px;background:#f8fafc;border-radius:6px;padding:.5rem}.trend-bar[data-v-ca874c41]{flex:1;background:#cbd5e1;border-radius:2px 2px 0 0;min-height:4px;position:relative;transition:background .2s}.trend-bar[data-v-ca874c41]:hover{background:#ef4444}.bar-label[data-v-ca874c41]{position:absolute;top:-16px;left:50%;transform:translate(-50%);font-size:.7rem;color:#64748b}.trend-labels[data-v-ca874c41]{display:flex;gap:2px;margin-top:.25rem}.trend-time[data-v-ca874c41]{flex:1;text-align:center;font-size:.7rem;color:#94a3b8}.type-distribution[data-v-ca874c41]{margin-bottom:1.5rem}.type-distribution h3[data-v-ca874c41]{margin:0 0 .75rem;font-size:1rem;color:#475569}.type-bars[data-v-ca874c41]{display:flex;flex-direction:column;gap:.5rem}.type-bar-item[data-v-ca874c41]{display:flex;align-items:center;gap:.75rem}.type-bar-label[data-v-ca874c41]{display:flex;align-items:center;gap:.5rem;min-width:100px;font-size:.85rem;color:#475569}.type-dot[data-v-ca874c41]{width:8px;height:8px;border-radius:50%}.type-bar-track[data-v-ca874c41]{flex:1;height:8px;background:#e2e8f0;border-radius:4px;overflow:hidden}.type-bar-fill[data-v-ca874c41]{height:100%;border-radius:4px;transition:width .3s}.type-count[data-v-ca874c41]{min-width:40px;text-align:right;font-size:.85rem;color:#64748b;font-weight:500}.api-status-section[data-v-ca874c41]{margin-bottom:1.5rem}.api-status-section h3[data-v-ca874c41]{margin:0 0 .75rem;font-size:1rem;color:#475569}.api-status-grid[data-v-ca874c41]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.75rem}.api-status-card[data-v-ca874c41]{padding:.75rem;background:#f8fafc;border-radius:6px;border:1px solid #e2e8f0}.api-status-card.status-healthy[data-v-ca874c41]{background:#f0fdf4;border-color:#bbf7d0}.api-status-card.status-degraded[data-v-ca874c41]{background:#fffbeb;border-color:#fde68a}.api-status-card.status-down[data-v-ca874c41]{background:#fef2f2;border-color:#fecaca}.api-header[data-v-ca874c41]{display:flex;justify-content:space-between;margin-bottom:.5rem}.api-model[data-v-ca874c41]{font-weight:600;font-size:.9rem;color:#1e293b}.api-provider[data-v-ca874c41]{font-size:.8rem;color:#94a3b8}.api-status[data-v-ca874c41]{display:flex;align-items:center;gap:.5rem}.status-dot[data-v-ca874c41]{width:8px;height:8px;border-radius:50%}.status-dot.status-healthy[data-v-ca874c41]{background:#22c55e}.status-dot.status-degraded[data-v-ca874c41]{background:#f59e0b}.status-dot.status-down[data-v-ca874c41]{background:#ef4444}.status-text[data-v-ca874c41]{font-size:.85rem;color:#64748b}.api-last-error[data-v-ca874c41]{margin-top:.5rem;font-size:.8rem;color:#dc2626;display:flex;justify-content:space-between}.api-error-count[data-v-ca874c41]{margin-top:.25rem;font-size:.8rem;color:#ef4444}.error-lists[data-v-ca874c41]{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:1.5rem}.error-group h3[data-v-ca874c41]{margin:0 0 .75rem;font-size:1rem;color:#475569;display:flex;align-items:center;gap:.5rem}.count-badge[data-v-ca874c41]{background:#e2e8f0;color:#64748b;font-size:.75rem;padding:.125rem .5rem;border-radius:10px;font-weight:500}.empty[data-v-ca874c41]{color:#94a3b8;font-size:.9rem;padding:1rem;text-align:center;background:#f8fafc;border-radius:6px}.error-list[data-v-ca874c41]{display:flex;flex-direction:column;gap:.5rem}.error-item[data-v-ca874c41]{background:#fef2f2;border-radius:6px;border-left:4px solid #ef4444;cursor:pointer;transition:box-shadow .2s}.error-item[data-v-ca874c41]:hover{box-shadow:0 2px 4px #0000001a}.error-item.severity-warning[data-v-ca874c41]{border-left-color:#f59e0b;background:#fffbeb}.error-item.severity-critical[data-v-ca874c41]{border-left-color:#dc2626;background:#fef2f2}.error-main[data-v-ca874c41]{display:grid;grid-template-columns:80px 80px 1fr 70px 24px;gap:.5rem;align-items:center;padding:.75rem;font-size:.85rem}.error-agent[data-v-ca874c41]{font-weight:500;color:#991b1b}.error-type[data-v-ca874c41]{font-weight:500}.error-msg[data-v-ca874c41]{color:#7f1d1d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.error-time[data-v-ca874c41]{color:#b91c1c;font-size:.8rem;text-align:right}.expand-icon[data-v-ca874c41]{color:#94a3b8;font-size:.7rem;text-align:center}.error-detail[data-v-ca874c41]{padding:.75rem;padding-top:0;border-top:1px solid #fecaca;margin:0 .75rem .75rem}.detail-row[data-v-ca874c41]{display:flex;gap:.5rem;margin-bottom:.5rem;font-size:.85rem}.detail-label[data-v-ca874c41]{color:#64748b;min-width:70px}.detail-message[data-v-ca874c41]{color:#1e293b;word-break:break-word}@media (max-width: 768px){.header[data-v-ca874c41]{flex-direction:column;align-items:flex-start}.error-main[data-v-ca874c41]{grid-template-columns:1fr;gap:.25rem}.error-lists[data-v-ca874c41],.api-status-grid[data-v-ca874c41]{grid-template-columns:1fr}}.version-display[data-v-87a575a1]{font-size:.8rem;color:#ffffffa6;display:inline-block;position:relative;z-index:1000;flex-shrink:0}.loading-text[data-v-87a575a1],.error-text[data-v-87a575a1]{color:#ffffff80}.version-text[data-v-87a575a1]{cursor:pointer;transition:color .2s;-webkit-user-select:none;user-select:none}.version-text[data-v-87a575a1]:hover{color:#fffffff2}.tooltip[data-v-87a575a1]{position:absolute;top:calc(100% + 8px);right:0;background:#fff;border:1px solid #ddd;border-radius:4px;padding:8px 12px;box-shadow:0 2px 8px #00000026;white-space:nowrap;z-index:1001;min-width:200px}.tooltip-item[data-v-87a575a1]{margin:4px 0;font-size:12px;color:#333}.tooltip-item strong[data-v-87a575a1]{color:#666;margin-right:4px}@media (max-width: 640px){.version-display[data-v-87a575a1]{font-size:.7rem}.tooltip[data-v-87a575a1]{min-width:160px;font-size:11px}}:root{--color-primary: #4a9eff;--color-success: #22c55e;--color-warning: #f59e0b;--color-error: #ef4444;--status-idle: #94a3b8;--status-active: #4a9eff;--status-completed: #22c55e;--status-error: #ef4444;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 1.5rem;--spacing-xl: 2rem;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 8px;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .05);--shadow-md: 0 2px 8px rgba(0, 0, 0, .1);--shadow-lg: 0 4px 16px rgba(0, 0, 0, .15)}header[data-v-543ef282]{display:flex;justify-content:space-between;align-items:center;padding:1rem 2rem;background:#1a1a2e;color:#fff;flex-wrap:wrap;gap:1rem}header h1[data-v-543ef282]{margin:0;font-size:1.5rem}.controls[data-v-543ef282]{display:flex;align-items:center;gap:1rem;flex-wrap:wrap}button[data-v-543ef282]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer}button[data-v-543ef282]:hover{background:#3a8eef}.connection-status[data-v-543ef282]{font-size:.85rem;padding:.25rem .75rem;border-radius:20px;background:#2d3748}.connection-status.connected[data-v-543ef282]{background:#22c55e}.connection-status.connecting[data-v-543ef282]{background:#f59e0b}.connection-status.disconnected[data-v-543ef282],.connection-status.error[data-v-543ef282]{background:#ef4444}main[data-v-543ef282]{padding:2rem;max-width:1600px;margin:0 auto}.collaboration-section[data-v-543ef282]{margin-bottom:2rem;min-height:400px}.task-status-section[data-v-543ef282],.performance-section[data-v-543ef282],.error-center-section[data-v-543ef282]{margin-bottom:2rem}h2[data-v-543ef282]{margin-bottom:1rem;color:#333}@media (max-width: 1024px){main[data-v-543ef282]{padding:1rem}header[data-v-543ef282]{padding:1rem}}@media (max-width: 640px){header h1[data-v-543ef282]{font-size:1.2rem}.controls[data-v-543ef282]{width:100%;justify-content:space-between}}
|
|
1
|
+
.timeline-step[data-v-b8bd62e0]{border-radius:6px;overflow:hidden;transition:all .2s}.step-header[data-v-b8bd62e0]{display:flex;justify-content:space-between;align-items:center;padding:10px 12px;cursor:pointer;-webkit-user-select:none;user-select:none}.step-header[data-v-b8bd62e0]:hover{filter:brightness(.98)}.header-left[data-v-b8bd62e0]{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.step-icon[data-v-b8bd62e0]{font-size:14px;flex-shrink:0}.step-type[data-v-b8bd62e0]{font-size:12px;font-weight:600;color:#374151;flex-shrink:0}.step-subtitle[data-v-b8bd62e0]{font-size:10px;color:#9ca3af;background:#0000000a;padding:1px 6px;border-radius:3px;flex-shrink:0}.collapse-summary[data-v-b8bd62e0]{font-size:11px;color:#9ca3af;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.step-time[data-v-b8bd62e0]{font-size:11px;color:#9ca3af;flex-shrink:0}.step-duration[data-v-b8bd62e0]{font-size:11px;color:#6b7280;background:#0000000d;padding:2px 6px;border-radius:3px;flex-shrink:0}.header-right[data-v-b8bd62e0]{display:flex;align-items:center;gap:8px;flex-shrink:0}.step-tokens[data-v-b8bd62e0]{font-size:11px;color:#9ca3af}.token-label[data-v-b8bd62e0]{margin-right:4px}.expand-icon[data-v-b8bd62e0]{font-size:10px;color:#9ca3af}.execution-time[data-v-b8bd62e0]{font-size:10px;color:#64748b;background:#f1f5f9;padding:1px 6px;border-radius:3px}.pair-indicator[data-v-b8bd62e0]{font-size:10px;cursor:pointer;opacity:.6;transition:opacity .2s}.pair-indicator[data-v-b8bd62e0]:hover{opacity:1}.step-user .step-header[data-v-b8bd62e0]{background:#f0f9ff;border-left:3px solid #3b82f6}.step-thinking .step-header[data-v-b8bd62e0]{background:#fef3c7;border-left:3px solid #f59e0b}.step-text .step-header[data-v-b8bd62e0]{background:#f0fdf4;border-left:3px solid #22c55e}.step-toolCall .step-header[data-v-b8bd62e0]{background:#f5f3ff;border-left:3px solid #8b5cf6}.step-toolResult .step-header[data-v-b8bd62e0]{background:#ecfdf5;border-left:3px solid #10b981}.step-error .step-header[data-v-b8bd62e0]{background:#fef2f2;border-left:3px solid #dc2626}.step-toolResult.status-error .step-header[data-v-b8bd62e0]{border-left-color:#ef4444}.is-paired-result[data-v-b8bd62e0]{margin-left:20px;border-left:2px dashed #d1d5db!important;border-radius:0 6px 6px 0}.timeline-step.highlighted[data-v-b8bd62e0]{box-shadow:0 0 0 2px #3b82f6;transform:scale(1.01);transition:all .2s ease}.timeline-step.highlighted .step-header[data-v-b8bd62e0]{background:#eff6ff!important}.step-content[data-v-b8bd62e0]{padding:0 12px 12px;margin-top:-4px}.content-block[data-v-b8bd62e0]{margin-top:8px}.content-block pre[data-v-b8bd62e0]{margin:0;padding:10px;background:#00000008;border-radius:4px;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:300px;overflow-y:auto}.content-block pre.truncated[data-v-b8bd62e0]{max-height:200px}.thinking-label[data-v-b8bd62e0]{font-size:11px;color:#92400e;margin-bottom:6px}.thinking-content pre[data-v-b8bd62e0]{background:#fffbeb;color:#78350f}.section-label[data-v-b8bd62e0]{font-size:11px;color:#6b7280;margin-bottom:4px}.code-block[data-v-b8bd62e0]{font-family:Monaco,Menlo,monospace;font-size:11px}.result-header[data-v-b8bd62e0]{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.result-status[data-v-b8bd62e0]{font-size:12px;font-weight:500}.result-status.ok[data-v-b8bd62e0]{color:#059669}.result-status.error[data-v-b8bd62e0]{color:#dc2626}.tool-error-section[data-v-b8bd62e0]{margin-bottom:12px;padding:10px;background:#fef2f2;border-radius:4px;border-left:3px solid #ef4444}.tool-error-message[data-v-b8bd62e0]{font-size:12px;color:#991b1b;line-height:1.5;word-break:break-word}.tool-error-suggestion[data-v-b8bd62e0]{margin-top:8px;padding-top:8px;border-top:1px solid #fecaca}.tool-error-suggestion .suggestion-label[data-v-b8bd62e0]{font-size:11px;color:#374151;margin-bottom:4px}.tool-error-suggestion ul[data-v-b8bd62e0]{margin:0;padding-left:16px;font-size:12px;color:#4b5563}.tool-error-suggestion li[data-v-b8bd62e0]{margin:2px 0}.copy-btn[data-v-b8bd62e0]{font-size:11px;padding:2px 8px;border:1px solid #e5e7eb;border-radius:3px;background:#fff;cursor:pointer}.copy-btn[data-v-b8bd62e0]:hover{background:#f3f4f6}.show-more-btn[data-v-b8bd62e0]{display:block;width:100%;margin-top:8px;padding:6px;font-size:11px;color:#6b7280;background:#00000005;border:none;border-radius:4px;cursor:pointer}.show-more-btn[data-v-b8bd62e0]:hover{background:#0000000d}.error-content[data-v-b8bd62e0]{background:#fef2f2;padding:10px;border-radius:4px}.error-type[data-v-b8bd62e0]{font-size:12px;font-weight:600;color:#dc2626;margin-bottom:6px}.error-message[data-v-b8bd62e0]{font-size:12px;color:#7f1d1d;padding:8px;background:#fee2e2;border-radius:4px;margin-bottom:8px}.error-suggestion[data-v-b8bd62e0]{margin-top:8px;padding:8px;background:#fff;border-radius:4px}.suggestion-label[data-v-b8bd62e0]{font-size:11px;color:#374151;margin-bottom:4px}.error-suggestion ul[data-v-b8bd62e0]{margin:0;padding-left:16px;font-size:12px;color:#4b5563}.error-suggestion li[data-v-b8bd62e0]{margin:4px 0}.timeline-connector[data-v-01a6bfe6]{display:flex;flex-direction:column;align-items:center;padding:4px 0}.connector-line[data-v-01a6bfe6]{width:2px;height:8px;background:#d1d5db}.connector-arrow[data-v-01a6bfe6]{font-size:8px;color:#9ca3af;line-height:1}.timeline-round[data-v-2aa49052]{margin-bottom:16px;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden;background:#fff}.round-header[data-v-2aa49052]{display:flex;align-items:center;gap:12px;padding:8px 12px;background:linear-gradient(135deg,#f8fafc,#f1f5f9);border-bottom:1px solid #e5e7eb}.round-badge[data-v-2aa49052]{font-size:11px;font-weight:600;color:#4338ca;background:#e0e7ff;padding:2px 8px;border-radius:4px}.round-trigger[data-v-2aa49052]{font-size:12px;color:#64748b;flex:1}.round-stats[data-v-2aa49052]{font-size:11px;color:#9ca3af;background:#0000000a;padding:2px 6px;border-radius:3px}.round-content[data-v-2aa49052]{padding:12px}.trigger-user_input .round-header[data-v-2aa49052]{border-left:3px solid #3b82f6}.trigger-subagent_result .round-header[data-v-2aa49052]{border-left:3px solid #10b981}.trigger-tool_result .round-header[data-v-2aa49052]{border-left:3px solid #f59e0b}.trigger-start .round-header[data-v-2aa49052]{border-left:3px solid #8b5cf6}.tool-link[data-v-d1e21896]{display:flex;align-items:center;padding:4px 0 4px 28px;position:relative}.link-line[data-v-d1e21896]{display:flex;flex-direction:column;align-items:center;position:absolute;left:12px;top:0;bottom:0}.link-connector[data-v-d1e21896]{width:2px;flex:1;background:linear-gradient(to bottom,#94a3b8 0%,#94a3b8 50%,transparent 50%);background-size:2px 8px;min-height:20px}.link-dot[data-v-d1e21896]{width:8px;height:8px;border-radius:50%;background:#94a3b8;border:2px solid #fff;box-shadow:0 0 0 1px #e5e7eb}.link-dot.bottom[data-v-d1e21896]{position:absolute;bottom:0}.link-time[data-v-d1e21896]{font-size:10px;color:#64748b;background:#f8fafc;padding:1px 6px;border-radius:3px;margin-left:8px;border:1px solid #e5e7eb}.link-error .link-connector[data-v-d1e21896]{background:linear-gradient(to bottom,#ef4444 0%,#ef4444 50%,transparent 50%);background-size:2px 8px}.link-error .link-dot[data-v-d1e21896]{background:#ef4444}.link-error .link-time[data-v-d1e21896]{color:#dc2626;background:#fef2f2;border-color:#fecaca}.link-active .link-connector[data-v-d1e21896]{background:linear-gradient(to bottom,#3b82f6 0%,#3b82f6 50%,transparent 50%);background-size:2px 8px}.link-active .link-dot[data-v-d1e21896]{background:#3b82f6;box-shadow:0 0 0 2px #3b82f64d}.link-active .link-time[data-v-d1e21896]{color:#2563eb;background:#eff6ff;border-color:#bfdbfe}.timeline-view[data-v-4917257d]{background:#fff;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden}.timeline-header[data-v-4917257d]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#f9fafb;border-bottom:1px solid #e5e7eb}.header-left[data-v-4917257d]{display:flex;align-items:center;gap:12px}.title[data-v-4917257d]{font-weight:600;font-size:14px;color:#374151}.agent-info[data-v-4917257d]{font-size:13px;color:#6b7280}.agent-info .model[data-v-4917257d]{color:#9ca3af}.header-right[data-v-4917257d]{display:flex;align-items:center;gap:12px}.status-badge[data-v-4917257d]{font-size:12px;padding:4px 8px;border-radius:4px}.status-badge.status-running[data-v-4917257d]{background:#fef3c7;color:#92400e}.status-badge.status-completed[data-v-4917257d]{background:#d1fae5;color:#065f46}.status-badge.status-error[data-v-4917257d]{background:#fee2e2;color:#991b1b}.status-badge.status-no_sessions[data-v-4917257d]{background:#f3f4f6;color:#6b7280}.refresh-btn[data-v-4917257d]{font-size:12px;padding:4px 10px;border:1px solid #e5e7eb;border-radius:4px;background:#fff;cursor:pointer;color:#374151}.refresh-btn[data-v-4917257d]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-4917257d]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-4917257d],.empty-state[data-v-4917257d]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:#6b7280;gap:12px}.spinner[data-v-4917257d]{width:24px;height:24px;border:3px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-4917257d 1s linear infinite}@keyframes spin-4917257d{to{transform:rotate(360deg)}}.empty-icon[data-v-4917257d]{font-size:32px}.empty-message[data-v-4917257d]{font-size:14px;color:#374151;font-weight:500}.empty-hint[data-v-4917257d]{margin-top:8px;font-size:12px;color:#9ca3af;text-align:center;max-width:280px;line-height:1.5}.timeline-content[data-v-4917257d]{padding:16px}.timeline-legend[data-v-4917257d]{display:flex;flex-wrap:wrap;gap:12px 20px;font-size:11px;color:#6b7280;margin-bottom:12px;padding:8px 10px;background:#f9fafb;border-radius:6px}.legend-item[data-v-4917257d]{display:inline-flex;align-items:center;gap:4px}.legend-icon[data-v-4917257d]{font-size:12px}.session-info[data-v-4917257d]{display:flex;gap:16px;font-size:12px;color:#9ca3af;margin-bottom:16px;padding-bottom:12px;border-bottom:1px dashed #e5e7eb}.steps-list[data-v-4917257d]{display:flex;flex-direction:column}.tool-execution-label[data-v-4917257d]{display:flex;align-items:center;gap:12px;margin:12px 0;padding:0 4px}.tool-execution-label .label-line[data-v-4917257d]{flex:1;height:1px;background:#e5e7eb}.tool-execution-label .label-text[data-v-4917257d]{font-size:11px;color:#9ca3af;white-space:nowrap}.timeline-footer[data-v-4917257d]{margin-top:16px;padding-top:16px;border-top:1px solid #e5e7eb}.stats-grid[data-v-4917257d]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-item[data-v-4917257d]{display:flex;flex-direction:column;align-items:center;padding:8px;background:#f9fafb;border-radius:6px}.stat-label[data-v-4917257d]{font-size:11px;color:#9ca3af;margin-bottom:4px}.stat-value[data-v-4917257d]{font-size:14px;font-weight:600;color:#374151}.chain-node[data-v-973c6755]{display:flex;flex-direction:column;align-items:center;padding:12px 16px;min-width:120px;background:#fff;border-radius:8px;border:2px solid #e5e7eb;cursor:pointer;transition:all .2s}.chain-node[data-v-973c6755]:hover{transform:translateY(-2px);box-shadow:0 4px 12px #0000001a}.chain-node.selected[data-v-973c6755]{box-shadow:0 0 0 4px #3b82f64d}.chain-node.status-pending[data-v-973c6755]{border-color:#9ca3af;background:#f9fafb}.chain-node.status-running[data-v-973c6755]{border-color:#3b82f6;background:#eff6ff;animation:pulse-973c6755 2s infinite}.chain-node.status-completed[data-v-973c6755]{border-color:#22c55e;background:#f0fdf4}.chain-node.status-error[data-v-973c6755]{border-color:#ef4444;background:#fef2f2}@keyframes pulse-973c6755{0%,to{opacity:1}50%{opacity:.5}to{opacity:1}}.node-icon[data-v-973c6755]{font-size:24px;margin-bottom:8px}.node-info[data-v-973c6755]{text-align:center}.node-name[data-v-973c6755]{font-size:13px;font-weight:600;color:#374151;margin-bottom:4px}.node-role[data-v-973c6755]{font-size:11px;color:#6b7280}.node-status[data-v-973c6755]{font-size:11px;padding:2px 6px;border-radius:4px;margin-top:8px}.status-pending .node-status[data-v-973c6755]{background:#f3f4f6;color:#6b7280}.status-running .node-status[data-v-973c6755]{background:#dbeafe;color:#1e40af}.status-completed .node-status[data-v-973c6755]{background:#d1fae5;color:#065f46}.status-error .node-status[data-v-973c6755]{background:#fee2e2;color:#991b1b}.node-time[data-v-973c6755]{font-size:11px;color:#9ca3af;margin-top:8px}.node-progress[data-v-973c6755]{margin-top:8px}.progress-spinner[data-v-973c6755]{width:16px;height:16px;border:2px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-973c6755 1s linear infinite}@keyframes spin-973c6755{to{transform:rotate(360deg)}}.chain-edge[data-v-c94ab96b]{display:flex;align-items:center;margin:0 4px}.edge-running svg line[data-v-c94ab96b]{animation:pulse-c94ab96b 1.5s infinite}.edge-completed[data-v-c94ab96b]{opacity:1}.edge-pending[data-v-c94ab96b]{opacity:.5}.edge-error[data-v-c94ab96b]{opacity:.8}@keyframes pulse-c94ab96b{0%,to{opacity:1}50%{opacity:.5}}.chain-view[data-v-ee8c8661]{background:#fff;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden}.chain-header[data-v-ee8c8661]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#f9fafb;border-bottom:1px solid #e5e7eb}.header-left[data-v-ee8c8661]{display:flex;align-items:center;gap:12px}.title[data-v-ee8c8661]{font-weight:600;font-size:14px;color:#374151}.project-info[data-v-ee8c8661]{font-size:13px;color:#6b7280}.header-right[data-v-ee8c8661]{display:flex;align-items:center;gap:12px}.status-badge[data-v-ee8c8661]{font-size:12px;padding:4px 8px;border-radius:4px}.status-badge.status-running[data-v-ee8c8661]{background:#fef3c7;color:#92400e}.status-badge.status-completed[data-v-ee8c8661]{background:#d1fae5;color:#065f46}.status-badge.status-error[data-v-ee8c8661]{background:#fee2e2;color:#991b1b}.status-badge.status-empty[data-v-ee8c8661]{background:#f3f4f6;color:#6b7280}.refresh-btn[data-v-ee8c8661]{font-size:12px;padding:4px 10px;border:1px solid #e5e7eb;border-radius:4px;background:#fff;cursor:pointer;color:#374151}.refresh-btn[data-v-ee8c8661]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-ee8c8661]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-ee8c8661],.empty-state[data-v-ee8c8661]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:#6b7280;gap:12px}.spinner[data-v-ee8c8661]{width:24px;height:24px;border:3px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-ee8c8661 1s linear infinite}@keyframes spin-ee8c8661{to{transform:rotate(360deg)}}.empty-icon[data-v-ee8c8661]{font-size:32px}.empty-hint[data-v-ee8c8661]{margin-top:8px;font-size:12px;color:#9ca3af;text-align:center;max-width:280px}.chain-content[data-v-ee8c8661]{padding:16px}.root-task[data-v-ee8c8661]{padding:12px;background:#f9fafb;border-radius:6px;margin-bottom:16px}.task-label[data-v-ee8c8661]{font-size:11px;color:#9ca3af;margin-bottom:4px}.task-text[data-v-ee8c8661]{font-size:14px;color:#374151;font-weight:500}.task-meta[data-v-ee8c8661]{margin-top:8px;font-size:12px;color:#6b7280}.chain-diagram[data-v-ee8c8661]{margin:20px 0}.diagram-container[data-v-ee8c8661]{display:flex;align-items:center;justify-content:center;gap:0;flex-wrap:wrap}.chain-progress[data-v-ee8c8661]{margin-top:16px}.progress-bar[data-v-ee8c8661]{height:8px;background:#e5e7eb;border-radius:4px;overflow:hidden}.progress-fill[data-v-ee8c8661]{height:100%;background:linear-gradient(90deg,#22c55e,#3b82f6);transition:width .3s ease}.progress-text[data-v-ee8c8661]{margin-top:8px;font-size:12px;color:#6b7280;text-align:center}.node-detail[data-v-ee8c8661]{margin-top:16px;padding:16px;background:#f9fafb;border-radius:8px;border:1px solid #e5e7eb}.detail-header[data-v-ee8c8661]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.detail-title[data-v-ee8c8661]{font-size:14px;font-weight:600;color:#374151}.detail-status[data-v-ee8c8661]{font-size:12px;padding:4px 8px;border-radius:4px}.detail-content[data-v-ee8c8661]{display:flex;flex-direction:column;gap:12px}.section-label[data-v-ee8c8661]{font-size:11px;color:#9ca3af;margin-bottom:4px}.section-value[data-v-ee8c8661]{font-size:13px;color:#374151}.detail-row[data-v-ee8c8661]{display:flex;gap:24px}.detail-item[data-v-ee8c8661]{display:flex;flex-direction:column}.item-label[data-v-ee8c8661]{font-size:11px;color:#9ca3af}.item-value[data-v-ee8c8661]{font-size:13px;color:#374151;font-weight:500}.artifacts-list[data-v-ee8c8661]{display:flex;flex-direction:column;gap:4px}.artifact-item[data-v-ee8c8661]{font-size:12px;color:#6b7280;padding:4px 8px;background:#fff;border-radius:4px}.agent-config-panel[data-v-c0a2c245]{padding:12px;max-height:500px;overflow-y:auto}.header[data-v-c0a2c245]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.header h3[data-v-c0a2c245]{margin:0;font-size:14px;color:#374151}.refresh-btn[data-v-c0a2c245]{padding:4px 12px;font-size:12px;border:1px solid #d1d5db;border-radius:4px;background:#fff;cursor:pointer}.refresh-btn[data-v-c0a2c245]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-c0a2c245]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-c0a2c245],.error-state[data-v-c0a2c245]{text-align:center;padding:40px 20px;color:#6b7280}.error-state[data-v-c0a2c245]{color:#dc2626}.config-section[data-v-c0a2c245]{margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid #e5e7eb}.config-section[data-v-c0a2c245]:last-child{border-bottom:none;margin-bottom:0}.config-section h4[data-v-c0a2c245]{margin:0 0 12px;font-size:13px;color:#374151;font-weight:600}.info-grid[data-v-c0a2c245]{display:grid;grid-template-columns:1fr 1fr;gap:8px}.info-item[data-v-c0a2c245]{display:flex;flex-direction:column;gap:2px}.info-item.full-width[data-v-c0a2c245]{grid-column:1 / -1}.info-item .label[data-v-c0a2c245]{font-size:11px;color:#6b7280}.info-item .value[data-v-c0a2c245]{font-size:13px;color:#1f2937}.info-item .value.monospace[data-v-c0a2c245]{font-family:monospace;font-size:12px;word-break:break-all}.info-item .value.status-idle[data-v-c0a2c245]{color:#22c55e}.info-item .value.status-working[data-v-c0a2c245]{color:#f59e0b}.info-item .value.status-down[data-v-c0a2c245]{color:#ef4444}.model-config[data-v-c0a2c245]{display:flex;flex-direction:column;gap:16px}.model-field label[data-v-c0a2c245]{display:block;font-size:12px;color:#374151;margin-bottom:6px;font-weight:500}.model-select-wrapper[data-v-c0a2c245]{display:flex;flex-direction:column;gap:4px}.model-select[data-v-c0a2c245]{width:100%;padding:8px 10px;font-size:13px;border:1px solid #d1d5db;border-radius:6px;background:#fff;cursor:pointer}.model-select[data-v-c0a2c245]:focus{outline:none;border-color:#3b82f6}.model-select[data-v-c0a2c245]:disabled{background:#f3f4f6;cursor:not-allowed}.model-select.small[data-v-c0a2c245]{padding:6px 8px;font-size:12px}.current-model[data-v-c0a2c245]{font-size:11px;color:#6b7280}.fallbacks-list[data-v-c0a2c245]{display:flex;flex-direction:column;gap:8px}.fallback-item[data-v-c0a2c245]{display:flex;gap:8px;align-items:center}.fallback-item .model-select[data-v-c0a2c245]{flex:1}.remove-btn[data-v-c0a2c245]{width:28px;height:28px;border:1px solid #d1d5db;border-radius:4px;background:#fff;cursor:pointer;font-size:16px;color:#6b7280;display:flex;align-items:center;justify-content:center}.remove-btn[data-v-c0a2c245]:hover:not(:disabled){background:#fee2e2;border-color:#fca5a5;color:#dc2626}.add-fallback-btn[data-v-c0a2c245]{padding:6px 12px;font-size:12px;border:1px dashed #d1d5db;border-radius:4px;background:#f9fafb;cursor:pointer;color:#6b7280}.add-fallback-btn[data-v-c0a2c245]:hover:not(:disabled){border-color:#3b82f6;color:#3b82f6}.add-fallback-btn[data-v-c0a2c245]:disabled{opacity:.5;cursor:not-allowed}.model-actions[data-v-c0a2c245]{display:flex;gap:8px;margin-top:8px}.save-btn[data-v-c0a2c245]{padding:8px 16px;font-size:13px;border:none;border-radius:6px;background:#3b82f6;color:#fff;cursor:pointer;font-weight:500}.save-btn[data-v-c0a2c245]:hover:not(:disabled){background:#2563eb}.save-btn[data-v-c0a2c245]:disabled{opacity:.5;cursor:not-allowed}.reset-btn[data-v-c0a2c245]{padding:8px 16px;font-size:13px;border:1px solid #d1d5db;border-radius:6px;background:#fff;cursor:pointer;color:#6b7280}.reset-btn[data-v-c0a2c245]:hover:not(:disabled){background:#f3f4f6}.description-text[data-v-c0a2c245]{margin:0;font-size:13px;color:#4b5563;line-height:1.5;white-space:pre-wrap}.error-analysis-view[data-v-bc05715d]{padding:12px;max-height:600px;overflow-y:auto}.header[data-v-bc05715d]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.header h3[data-v-bc05715d]{margin:0;font-size:14px;color:#374151}.refresh-btn[data-v-bc05715d]{padding:4px 12px;font-size:12px;border:1px solid #d1d5db;border-radius:4px;background:#fff;cursor:pointer}.refresh-btn[data-v-bc05715d]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-bc05715d]:disabled{opacity:.5}.agent-summary[data-v-bc05715d]{display:flex;gap:12px;margin-bottom:16px;flex-wrap:wrap}.summary-card[data-v-bc05715d]{display:flex;flex-direction:column;align-items:center;padding:10px 16px;background:#f9fafb;border-radius:8px;min-width:70px}.summary-card.total[data-v-bc05715d]{background:#eff6ff}.summary-card.total .count[data-v-bc05715d]{color:#3b82f6}.summary-card.critical[data-v-bc05715d]{background:#fef2f2}.summary-card.critical .count[data-v-bc05715d]{color:#dc2626}.summary-card.high[data-v-bc05715d]{background:#fff7ed}.summary-card.high .count[data-v-bc05715d]{color:#f97316}.summary-card.medium[data-v-bc05715d]{background:#fffbeb}.summary-card.medium .count[data-v-bc05715d]{color:#f59e0b}.summary-card .count[data-v-bc05715d]{font-size:20px;font-weight:700}.summary-card .label[data-v-bc05715d]{font-size:10px;color:#6b7280;margin-top:2px}.loading-state[data-v-bc05715d],.empty-state[data-v-bc05715d]{text-align:center;padding:40px 20px;color:#6b7280}.errors-list[data-v-bc05715d]{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}.error-item[data-v-bc05715d]{padding:10px;background:#fff;border-radius:6px;border-left:3px solid #e5e7eb;cursor:pointer}.error-item.severity-critical[data-v-bc05715d]{border-left-color:#dc2626;background:#fef2f2}.error-item.severity-high[data-v-bc05715d]{border-left-color:#f97316;background:#fff7ed}.error-item.severity-medium[data-v-bc05715d]{border-left-color:#f59e0b;background:#fffbeb}.error-item.severity-low[data-v-bc05715d]{border-left-color:#6b7280}.error-header[data-v-bc05715d]{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;flex-wrap:wrap;gap:4px}.error-type[data-v-bc05715d]{font-weight:600;font-size:13px}.error-badges[data-v-bc05715d]{display:flex;gap:4px}.badge[data-v-bc05715d]{font-size:10px;padding:2px 6px;border-radius:3px;background:#e5e7eb;color:#6b7280}.badge.archived[data-v-bc05715d]{background:#fef3c7;color:#92400e}.badge.provider[data-v-bc05715d]{background:#dbeafe;color:#1d4ed8}.badge.model[data-v-bc05715d]{background:#f3e8ff;color:#7c3aed;font-family:monospace}.error-time[data-v-bc05715d]{font-size:11px;color:#9ca3af}.error-message[data-v-bc05715d]{font-size:12px;color:#4b5563;line-height:1.4}.error-detail[data-v-bc05715d]{margin-top:12px;padding-top:12px;border-top:1px solid #e5e7eb}.detail-section[data-v-bc05715d]{margin-bottom:12px}.detail-section[data-v-bc05715d]:last-child{margin-bottom:0}.detail-section h4[data-v-bc05715d]{margin:0 0 8px;font-size:12px;color:#374151}.error-full[data-v-bc05715d]{margin:0;padding:10px;background:#1f2937;color:#e5e7eb;border-radius:6px;font-size:11px;overflow-x:auto;white-space:pre-wrap;word-break:break-all;max-height:150px}.tool-chain[data-v-bc05715d]{display:flex;flex-direction:column;gap:4px}.tool-item[data-v-bc05715d]{display:flex;align-items:center;gap:8px;padding:6px 10px;background:#f3f4f6;border-radius:4px;font-size:12px}.tool-index[data-v-bc05715d]{width:20px;height:20px;background:#3b82f6;color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600}.tool-name[data-v-bc05715d]{flex:1;font-family:monospace;color:#1f2937}.tool-time[data-v-bc05715d]{font-size:10px;color:#9ca3af}.suggestions[data-v-bc05715d]{margin:0;padding-left:18px}.suggestions li[data-v-bc05715d]{margin:6px 0;font-size:12px;color:#4b5563}.detail-section.meta[data-v-bc05715d]{display:flex;gap:16px;font-size:10px;color:#9ca3af;font-family:monospace}.type-summary[data-v-bc05715d]{padding-top:16px;border-top:1px solid #e5e7eb}.type-summary h4[data-v-bc05715d]{margin:0 0 12px;font-size:13px;color:#374151}.type-bars[data-v-bc05715d]{display:flex;flex-direction:column;gap:8px}.type-bar[data-v-bc05715d]{display:flex;align-items:center;gap:8px}.type-label[data-v-bc05715d]{width:80px;font-size:11px;color:#6b7280}.bar-container[data-v-bc05715d]{flex:1;height:8px;background:#e5e7eb;border-radius:4px;overflow:hidden}.bar-fill[data-v-bc05715d]{height:100%;background:#3b82f6;border-radius:4px;transition:width .3s}.type-count[data-v-bc05715d]{width:30px;font-size:11px;color:#374151;text-align:right}.panel-overlay[data-v-6fe85cb8]{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.panel[data-v-6fe85cb8]{width:800px;max-width:92vw;max-height:90vh;background:#fff;border-radius:12px;box-shadow:0 8px 32px #0003;overflow:hidden;display:flex;flex-direction:column}.header[data-v-6fe85cb8]{display:flex;justify-content:space-between;align-items:center;padding:1.5rem;border-bottom:1px solid #e5e7eb}.header h2[data-v-6fe85cb8]{margin:0;font-size:1.5rem;color:#333}.close-btn[data-v-6fe85cb8]{font-size:2rem;line-height:1;background:none;border:none;cursor:pointer;color:#999;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center}.close-btn[data-v-6fe85cb8]:hover{color:#333}.content[data-v-6fe85cb8]{padding:1.5rem;overflow-y:auto}.section[data-v-6fe85cb8]{margin-bottom:1.5rem}.section[data-v-6fe85cb8]:last-child{margin-bottom:0}.section h3[data-v-6fe85cb8]{margin:0 0 .75rem;font-size:1rem;color:#666}.status-info[data-v-6fe85cb8]{display:flex;align-items:center;gap:.5rem}.status-dot[data-v-6fe85cb8]{width:12px;height:12px;border-radius:50%}.status-dot.status-idle[data-v-6fe85cb8]{background:#4ade80}.status-dot.status-working[data-v-6fe85cb8]{background:#fbbf24}.status-dot.status-down[data-v-6fe85cb8]{background:#ef4444}.status-text[data-v-6fe85cb8]{font-size:1.1rem;color:#333;font-weight:500}.error-title[data-v-6fe85cb8]{color:#dc2626}.error-info[data-v-6fe85cb8]{padding:1rem;background:#fef2f2;border-radius:6px;border-left:4px solid #dc2626}.error-type[data-v-6fe85cb8]{font-weight:600;color:#dc2626;margin-bottom:.5rem}.error-message[data-v-6fe85cb8]{font-size:.9rem;color:#666}.activity-list[data-v-6fe85cb8]{display:flex;flex-direction:column;gap:.75rem}.activity-item[data-v-6fe85cb8]{padding:.75rem;border-radius:6px;font-size:.9rem}.activity-item.working[data-v-6fe85cb8]{background:#fef3c7;color:#92400e}.activity-item.idle[data-v-6fe85cb8]{background:#d1fae5;color:#065f46}.activity-item.down[data-v-6fe85cb8]{background:#fee2e2;color:#991b1b}.view-tabs[data-v-6fe85cb8]{display:flex;flex-wrap:wrap;gap:6px 10px;margin-bottom:12px}.tab-btn[data-v-6fe85cb8]{padding:6px 12px;font-size:12px;border:1px solid #e5e7eb;border-radius:6px;background:#fff;cursor:pointer;color:#6b7280;transition:all .2s;flex-shrink:0}.tab-btn[data-v-6fe85cb8]:hover{background:#f9fafb}.tab-btn.active[data-v-6fe85cb8]{background:#3b82f6;color:#fff;border-color:#3b82f6}.timeline-container[data-v-6fe85cb8],.chain-container[data-v-6fe85cb8]{border:1px solid #e5e7eb;border-radius:8px;overflow:hidden}.advanced-container[data-v-6fe85cb8]{display:flex;flex-direction:column;gap:16px}.advanced-section[data-v-6fe85cb8]{border:1px solid #e5e7eb;border-radius:8px;overflow:hidden}.advanced-section h4[data-v-6fe85cb8]{margin:0;padding:10px 14px;background:#f9fafb;border-bottom:1px solid #e5e7eb;font-size:13px;font-weight:600;color:#374151}.diagnostic-panel[data-v-6fe85cb8]{border-radius:8px;overflow:hidden;border:1px solid}.diagnostic-panel.severity-warning[data-v-6fe85cb8]{border-color:#fbbf24;background:#fffbeb}.diagnostic-panel.severity-critical[data-v-6fe85cb8]{border-color:#ef4444;background:#fef2f2}.diagnostic-header[data-v-6fe85cb8]{display:flex;align-items:center;gap:8px;padding:12px 16px;font-weight:600}.severity-warning .diagnostic-header[data-v-6fe85cb8]{background:#fef3c7;color:#92400e}.severity-critical .diagnostic-header[data-v-6fe85cb8]{background:#fee2e2;color:#991b1b}.diagnostic-icon[data-v-6fe85cb8]{font-size:18px}.diagnostic-title[data-v-6fe85cb8]{font-size:14px}.diagnostic-content[data-v-6fe85cb8]{padding:12px 16px}.diagnostic-item[data-v-6fe85cb8]{display:flex;gap:8px;margin-bottom:8px;font-size:13px}.diagnostic-item .item-label[data-v-6fe85cb8]{color:#6b7280;min-width:80px}.diagnostic-item .item-value[data-v-6fe85cb8]{color:#374151}.diagnostic-item .item-value.highlight[data-v-6fe85cb8]{font-weight:600;color:#dc2626}.diagnostic-hint[data-v-6fe85cb8]{margin-top:12px;padding:10px;background:#00000008;border-radius:6px;font-size:12px}.hint-title[data-v-6fe85cb8]{font-weight:600;color:#374151;margin-bottom:6px}.diagnostic-hint ul[data-v-6fe85cb8]{margin:0;padding-left:18px;color:#6b7280}.diagnostic-hint li[data-v-6fe85cb8]{margin:4px 0}.diagnostic-actions[data-v-6fe85cb8]{margin-top:12px;display:flex;gap:8px}.action-btn[data-v-6fe85cb8]{padding:6px 14px;font-size:13px;border-radius:6px;border:1px solid #d1d5db;background:#fff;cursor:pointer;color:#374151;transition:all .2s}.action-btn[data-v-6fe85cb8]:hover{background:#f3f4f6}.action-btn.primary[data-v-6fe85cb8]{background:#ef4444;border-color:#ef4444;color:#fff}.action-btn.primary[data-v-6fe85cb8]:hover{background:#dc2626}@media (max-width: 1280px){.panel[data-v-6fe85cb8]{width:700px}}@media (max-width: 768px){.panel[data-v-6fe85cb8]{width:95vw;max-height:95vh}.header[data-v-6fe85cb8]{padding:1rem}.header h2[data-v-6fe85cb8]{font-size:1.2rem}.content[data-v-6fe85cb8]{padding:1rem}.view-tabs[data-v-6fe85cb8]{gap:4px 8px}.tab-btn[data-v-6fe85cb8]{padding:5px 10px;font-size:11px}}.settings-panel[data-v-e5b26232]{position:fixed;top:0;right:0;bottom:0;width:400px;background:#fff;box-shadow:-4px 0 16px #00000026;display:flex;flex-direction:column;z-index:1000}.header[data-v-e5b26232]{display:flex;justify-content:space-between;align-items:center;padding:1.5rem;border-bottom:1px solid #e5e7eb}.header h2[data-v-e5b26232]{margin:0;font-size:1.5rem;color:#333}.close-btn[data-v-e5b26232]{font-size:2rem;line-height:1;background:none;border:none;cursor:pointer;color:#999;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center}.close-btn[data-v-e5b26232]:hover{color:#333}.content[data-v-e5b26232]{flex:1;padding:1.5rem;overflow-y:auto}section[data-v-e5b26232]{margin-bottom:2rem}section[data-v-e5b26232]:last-child{margin-bottom:0}section h3[data-v-e5b26232]{margin:0 0 1rem;font-size:1.1rem;color:#333}.setting-item[data-v-e5b26232]{display:flex;align-items:center;justify-content:space-between;padding:.75rem 0;border-bottom:1px solid #f3f4f6}.setting-item[data-v-e5b26232]:last-child{border-bottom:none}.setting-item label[data-v-e5b26232]{color:#666;font-size:.95rem}.setting-item input[type=number][data-v-e5b26232],.setting-item select[data-v-e5b26232]{padding:.5rem;border:1px solid #e5e7eb;border-radius:4px;width:100px}.setting-item input[type=checkbox][data-v-e5b26232]{margin-right:.5rem}.agent-card[data-v-04c4a970]{display:flex;flex-direction:column;background:#fff;border-radius:12px;box-shadow:0 2px 8px #00000014;cursor:pointer;transition:transform .2s,box-shadow .2s;overflow:hidden;height:100%}.agent-card[data-v-04c4a970]:hover{transform:translateY(-2px);box-shadow:0 4px 16px #0000001f}.agent-card.is-main[data-v-04c4a970]{border:2px solid #4a9eff;background:linear-gradient(180deg,#fff,#f8fafc)}.agent-card.is-main[data-v-04c4a970]:hover{box-shadow:0 6px 20px #4a9eff33}.agent-card.has-error[data-v-04c4a970]{border:2px solid #ef4444;background:linear-gradient(180deg,#fff,#fef2f2)}.agent-card.is-stuck[data-v-04c4a970]{border:2px solid #f59e0b;background:linear-gradient(180deg,#fff,#fffbeb)}.agent-card.is-main .card-header[data-v-04c4a970]{padding:.85rem 1rem}.agent-card.is-main .avatar[data-v-04c4a970]{font-size:2.2rem;width:48px;height:48px}.agent-card.is-main .name[data-v-04c4a970]{font-size:1rem}.agent-card.is-main .card-body[data-v-04c4a970]{padding:.85rem 1rem}.agent-card.is-main .current-task[data-v-04c4a970]{padding:.6rem .85rem}.agent-card.is-main .current-task .task-name[data-v-04c4a970]{font-size:.85rem;white-space:normal;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.card-header[data-v-04c4a970]{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;background:linear-gradient(135deg,#f8fafc,#f1f5f9);border-bottom:1px solid #e5e7eb}.avatar[data-v-04c4a970]{font-size:2rem;width:44px;height:44px;display:flex;align-items:center;justify-content:center;background:#fff;border-radius:10px;box-shadow:0 2px 4px #0000000f}.header-info[data-v-04c4a970]{flex:1;min-width:0}.name[data-v-04c4a970]{font-size:.95rem;font-weight:600;color:#1e293b;margin-bottom:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status-pill[data-v-04c4a970]{display:inline-flex;align-items:center;gap:.35rem;padding:2px 8px;border-radius:10px;font-size:.7rem;font-weight:500}.status-pill.status-idle[data-v-04c4a970]{background:#dcfce7;color:#166534}.status-pill.status-working[data-v-04c4a970]{background:#dbeafe;color:#1d4ed8}.status-pill.status-down[data-v-04c4a970]{background:#fee2e2;color:#991b1b}.status-dot[data-v-04c4a970]{width:6px;height:6px;border-radius:50%}.status-dot.status-idle[data-v-04c4a970]{background:#22c55e}.status-dot.status-working[data-v-04c4a970]{background:#3b82f6}.status-dot.status-down[data-v-04c4a970]{background:#ef4444}.main-badge[data-v-04c4a970]{font-size:.65rem;font-weight:700;color:#4a9eff;background:#4a9eff1a;padding:3px 8px;border-radius:4px;letter-spacing:.5px}.card-body[data-v-04c4a970]{flex:1;padding:.75rem 1rem;display:flex;flex-direction:column;gap:.6rem;overflow:hidden}.model-row[data-v-04c4a970]{display:flex;align-items:center;flex-wrap:wrap;gap:.4rem;font-size:.75rem}.model-label[data-v-04c4a970]{color:#94a3b8;min-width:36px}.model-value[data-v-04c4a970]{font-family:ui-monospace,Cascadia Code,monospace;font-weight:500;color:#475569}.model-fallbacks[data-v-04c4a970]{display:flex;align-items:center;gap:.25rem;margin-left:.25rem}.fallback-tag[data-v-04c4a970]{font-size:.6rem;color:#64748b;background:#f1f5f9;padding:1px 5px;border-radius:3px;font-family:ui-monospace,monospace}.fallback-more[data-v-04c4a970]{font-size:.55rem;color:#94a3b8}.error-warning[data-v-04c4a970]{background:linear-gradient(135deg,#fef2f2,#fee2e2);border:1px solid #fca5a5;border-radius:8px;padding:.5rem .75rem}.stuck-warning[data-v-04c4a970]{background:linear-gradient(135deg,#fffbeb,#fef3c7);border:1px solid #fcd34d;border-radius:8px;padding:.5rem .75rem}.warning-header[data-v-04c4a970]{display:flex;align-items:center;gap:.35rem;margin-bottom:.2rem}.warning-icon[data-v-04c4a970]{font-size:.75rem}.warning-label[data-v-04c4a970]{font-size:.7rem;font-weight:600;color:#991b1b}.stuck-warning .warning-label[data-v-04c4a970]{color:#92400e}.warning-message[data-v-04c4a970]{font-size:.7rem;color:#7f1d1d;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stuck-warning .warning-message[data-v-04c4a970]{color:#78350f}.current-task[data-v-04c4a970]{background:linear-gradient(135deg,#eff6ff,#dbeafe);border:1px solid #93c5fd;border-radius:8px;padding:.5rem .75rem}.task-header[data-v-04c4a970]{display:flex;align-items:center;gap:.35rem;margin-bottom:.25rem}.task-icon[data-v-04c4a970]{font-size:.65rem;color:#3b82f6}.task-label[data-v-04c4a970]{font-size:.65rem;color:#3b82f6;font-weight:500}.current-task .task-name[data-v-04c4a970]{font-size:.8rem;color:#1e40af;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.task-child-info[data-v-04c4a970]{display:flex;align-items:center;gap:.3rem;margin-top:.35rem;padding-top:.35rem;border-top:1px dashed #bfdbfe}.child-arrow[data-v-04c4a970]{font-size:.7rem;color:#64748b}.child-name[data-v-04c4a970]{font-size:.7rem;color:#64748b;background:#f1f5f9;padding:1px 6px;border-radius:3px}.idle-hint[data-v-04c4a970]{font-size:.75rem;color:#94a3b8;text-align:center;padding:.5rem;font-style:italic}.status-detail[data-v-04c4a970]{display:flex;align-items:center;gap:.4rem;padding:.4rem .6rem;border-radius:6px;font-size:.75rem;animation:pulse-subtle-04c4a970 2s ease-in-out infinite}.status-detail.sub-status-thinking[data-v-04c4a970]{background:linear-gradient(135deg,#fef3c7,#fde68a);border:1px solid #fcd34d;color:#92400e}.status-detail.sub-status-tool_executing[data-v-04c4a970]{background:linear-gradient(135deg,#dbeafe,#bfdbfe);border:1px solid #93c5fd;color:#1e40af}.status-detail.sub-status-waiting_llm[data-v-04c4a970]{background:linear-gradient(135deg,#e0e7ff,#c7d2fe);border:1px solid #a5b4fc;color:#3730a3}.status-detail.sub-status-waiting_child[data-v-04c4a970]{background:linear-gradient(135deg,#fce7f3,#fbcfe8);border:1px solid #f9a8d4;color:#9d174d}.action-icon[data-v-04c4a970]{font-size:.85rem}.action-text[data-v-04c4a970]{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@keyframes pulse-subtle-04c4a970{0%,to{opacity:1}50%{opacity:.7}}.multi-tasks[data-v-04c4a970]{background:linear-gradient(135deg,#eff6ff,#dbeafe);border:1px solid #93c5fd;border-radius:8px;overflow:hidden}.tasks-header[data-v-04c4a970]{display:flex;align-items:center;gap:.35rem;padding:.5rem .75rem;cursor:pointer;-webkit-user-select:none;user-select:none}.tasks-header[data-v-04c4a970]:hover{background:#3b82f61a}.tasks-icon[data-v-04c4a970]{font-size:.75rem}.tasks-label[data-v-04c4a970]{font-size:.7rem;color:#3b82f6;font-weight:500}.tasks-count[data-v-04c4a970]{font-size:.65rem;background:#3b82f6;color:#fff;padding:1px 6px;border-radius:10px;font-weight:600;margin-left:.25rem}.tasks-toggle[data-v-04c4a970]{font-size:.6rem;color:#64748b;margin-left:auto}.tasks-list[data-v-04c4a970]{max-height:0;overflow:hidden;transition:max-height .3s ease}.tasks-list.expanded[data-v-04c4a970]{max-height:200px;overflow-y:auto}.task-item[data-v-04c4a970]{display:flex;align-items:center;gap:.4rem;padding:.4rem .75rem;border-top:1px solid #e0e7ff;font-size:.75rem}.task-item[data-v-04c4a970]:hover{background:#3b82f60d}.task-status-dot[data-v-04c4a970]{width:6px;height:6px;border-radius:50%;flex-shrink:0}.task-item.task-status-working .task-status-dot[data-v-04c4a970]{background:#3b82f6;animation:pulse-dot-04c4a970 1.5s ease-in-out infinite}.task-item.task-status-retrying .task-status-dot[data-v-04c4a970]{background:#f59e0b}.task-item.task-status-failed .task-status-dot[data-v-04c4a970]{background:#ef4444}@keyframes pulse-dot-04c4a970{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(.8)}}.task-item .task-name[data-v-04c4a970]{flex:1;color:#1e40af;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.task-child-agent[data-v-04c4a970]{font-size:.65rem;color:#64748b;background:#f1f5f9;padding:1px 5px;border-radius:3px;flex-shrink:0}.tasks-more[data-v-04c4a970]{padding:.4rem .75rem;font-size:.7rem;color:#64748b;text-align:center;border-top:1px solid #e0e7ff;background:#3b82f608}.collaboration-flow-section[data-v-50bc0adc]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;padding:1.5rem}.section-header[data-v-50bc0adc]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;flex-wrap:wrap;gap:.5rem}.section-header .header-right[data-v-50bc0adc]{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.section-header h2[data-v-50bc0adc]{margin:0;font-size:1.3rem;color:#333}.connection-indicator[data-v-50bc0adc]{display:flex;align-items:center;gap:.4rem;font-size:.8rem;padding:.25rem .6rem;border-radius:12px;background:#f1f5f9}.connection-indicator.connected[data-v-50bc0adc]{background:#dcfce7;color:#166534}.connection-indicator.connecting[data-v-50bc0adc]{background:#fef3c7;color:#92400e}.connection-indicator.disconnected[data-v-50bc0adc],.connection-indicator.error[data-v-50bc0adc]{background:#fee2e2;color:#991b1b}.indicator-dot[data-v-50bc0adc]{width:6px;height:6px;border-radius:50%;background:currentColor}.connection-indicator.connecting .indicator-dot[data-v-50bc0adc]{animation:pulse-50bc0adc 1.5s ease-in-out infinite}@keyframes pulse-50bc0adc{0%,to{opacity:1}50%{opacity:.5}}.flow-container[data-v-50bc0adc]{border:1px solid #e5e7eb;border-radius:6px;background:#fafbfc;min-height:480px;position:relative;overflow:auto}.loading-state[data-v-50bc0adc],.error-state[data-v-50bc0adc],.empty-state[data-v-50bc0adc]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:280px;gap:.75rem;color:#6b7280}.spinner[data-v-50bc0adc]{width:28px;height:28px;border:3px solid #e5e7eb;border-top-color:#4a9eff;border-radius:50%;animation:spin-50bc0adc .8s linear infinite}@keyframes spin-50bc0adc{to{transform:rotate(360deg)}}.retry-btn[data-v-50bc0adc]{padding:.4rem .8rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:.85rem}.flow-layout[data-v-50bc0adc]{display:flex;min-height:460px}.agent-area[data-v-50bc0adc]{flex:1;position:relative;padding:1rem 1rem 2rem .5rem;min-width:300px}.level-section[data-v-50bc0adc]{margin-bottom:1.5rem;position:relative;z-index:1}.level-section[data-v-50bc0adc]:first-child{margin-bottom:2.5rem;z-index:2}.level-header[data-v-50bc0adc]{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem;padding-left:.5rem}.level-badge[data-v-50bc0adc]{display:inline-flex;align-items:center;justify-content:center;width:24px;height:20px;background:#e0e7ff;color:#4338ca;font-size:.65rem;font-weight:700;border-radius:4px}.level-title[data-v-50bc0adc]{font-size:.75rem;color:#64748b;font-weight:500}.level-cards[data-v-50bc0adc]{display:flex;flex-wrap:wrap;gap:16px;justify-content:center;padding:.5rem}.level-section:first-child .level-cards[data-v-50bc0adc]{min-height:auto;padding-bottom:1rem}.level-section:not(:first-child) .level-cards[data-v-50bc0adc]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px;max-width:900px;margin:0 auto}.agent-card-wrapper[data-v-50bc0adc]{cursor:pointer;transition:transform .2s,box-shadow .2s;border-radius:12px;position:relative;z-index:1;overflow:hidden}.level-section:first-child .agent-card-wrapper.main-agent[data-v-50bc0adc]{width:320px;max-width:100%}.agent-card-wrapper[data-v-50bc0adc]:hover{transform:translateY(-2px)}.agent-card-wrapper.active[data-v-50bc0adc]{box-shadow:0 0 0 3px #4a9eff40}.agent-card-wrapper[data-v-50bc0adc]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;border-radius:4px 0 0 4px;background:var(--agent-color, #64748b);z-index:1}.edges-svg[data-v-50bc0adc]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:5}.edge-path[data-v-50bc0adc]{fill:none;stroke:#4a9eff;stroke-width:2}.edge-path.active[data-v-50bc0adc]{stroke-width:2.5;stroke-dasharray:6 4;animation:flowAnim-50bc0adc 1s linear infinite}@keyframes flowAnim-50bc0adc{to{stroke-dashoffset:-10}}.model-panel[data-v-50bc0adc]{width:150px;min-width:120px;border-left:1px solid #e5e7eb;background:#f8fafc;flex-shrink:0;display:flex;flex-direction:column}.model-panel-header[data-v-50bc0adc]{display:flex;justify-content:space-between;align-items:center;padding:.5rem .6rem;background:#f1f5f9;border-bottom:1px solid #e5e7eb;cursor:pointer}.model-panel-title[data-v-50bc0adc]{font-size:.7rem;font-weight:600;color:#475569}.model-toggle-icon[data-v-50bc0adc]{font-size:.6rem;color:#94a3b8}.model-panel-body[data-v-50bc0adc]{flex:1;padding:.4rem;overflow-y:auto}.model-card[data-v-50bc0adc]{background:#fff;border:1px solid #e2e8f0;border-radius:5px;padding:.4rem .5rem;margin-bottom:.4rem}.model-card.active[data-v-50bc0adc]{border-color:#f97316}.model-name[data-v-50bc0adc]{font-size:.65rem;font-weight:600;font-family:ui-monospace,monospace;color:#334155;margin-bottom:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.model-dots[data-v-50bc0adc]{display:flex;flex-wrap:wrap;gap:2px;margin-bottom:.2rem}.model-dot[data-v-50bc0adc]{width:5px;height:5px;border-radius:50%;cursor:pointer}.model-dot[data-v-50bc0adc]:hover{transform:scale(1.3)}.model-count[data-v-50bc0adc]{font-size:.55rem;color:#94a3b8}.flow-legend.flow-legend-inline[data-v-50bc0adc]{position:static;display:flex;flex-wrap:wrap;gap:.5rem;padding:.25rem .5rem;background:#f8fafc;border-radius:6px;border:1px solid #e5e7eb;font-size:.7rem;color:#475569}.legend-item[data-v-50bc0adc]{display:flex;align-items:center;gap:.35rem;padding:2px 6px;border-radius:4px;background:#f8fafc}.legend-dot[data-v-50bc0adc]{width:10px;height:10px;border-radius:3px}.legend-name[data-v-50bc0adc]{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.call-detail-overlay[data-v-50bc0adc]{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000059;display:flex;align-items:center;justify-content:center;z-index:1000}.call-detail-modal[data-v-50bc0adc]{background:#fff;border-radius:10px;box-shadow:0 8px 32px #0003;min-width:300px;max-width:90%}.call-detail-header[data-v-50bc0adc]{display:flex;justify-content:space-between;align-items:center;padding:.6rem .9rem;border-bottom:1px solid #e5e7eb}.call-detail-header h3[data-v-50bc0adc]{margin:0;font-size:.9rem}.close-btn[data-v-50bc0adc]{background:none;border:none;font-size:1.2rem;cursor:pointer;color:#6b7280;line-height:1}.call-detail-body[data-v-50bc0adc]{padding:.6rem .9rem}.call-detail-row[data-v-50bc0adc]{display:flex;gap:.6rem;margin-bottom:.4rem}.call-detail-row .label[data-v-50bc0adc]{color:#6b7280;min-width:45px;font-size:.8rem}.call-detail-row .value[data-v-50bc0adc]{color:#333;font-size:.8rem;word-break:break-word}.call-detail-row.trigger .value[data-v-50bc0adc]{font-size:.75rem}@media (max-width: 1280px){.level-section:first-child .agent-card-wrapper.main-agent[data-v-50bc0adc]{width:280px}.level-section:not(:first-child) .level-cards[data-v-50bc0adc]{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.model-panel[data-v-50bc0adc]{width:130px}}@media (max-width: 1024px){.flow-layout[data-v-50bc0adc]{flex-direction:column}.model-panel[data-v-50bc0adc]{width:100%;border-left:none;border-top:1px solid #e5e7eb;max-height:200px}.model-panel-body[data-v-50bc0adc]{display:flex;flex-wrap:wrap;gap:.5rem}.model-card[data-v-50bc0adc]{flex:1;min-width:120px;margin-bottom:0}}.collaboration-box[data-v-ef9f8c73]{background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 2px 8px #0000001a;overflow:hidden}.collaboration-box-header[data-v-ef9f8c73]{padding:1rem 1.5rem;border-bottom:2px solid #e2e8f0;background:#f8fafc}.collaboration-box-header h2[data-v-ef9f8c73]{margin:0 0 .25rem;font-size:1.3rem;color:#1e293b}.collaboration-hint[data-v-ef9f8c73]{font-size:.85rem;color:#64748b}.collaboration-box-body[data-v-ef9f8c73]{padding:1rem 1.5rem;min-height:600px}.collaboration-error-fallback[data-v-ef9f8c73]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:500px;gap:1rem;color:#64748b}.fallback-title[data-v-ef9f8c73]{margin:0;font-size:1.1rem;color:#334155}.fallback-reason[data-v-ef9f8c73]{margin:0;font-size:.9rem;color:#ef4444;max-width:400px;text-align:center}.collaboration-error-fallback button[data-v-ef9f8c73]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer}.collaboration-error-fallback button[data-v-ef9f8c73]:hover{background:#3a8eef}.task-status-section[data-v-5d944098]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;padding:1.5rem}.section-header[data-v-5d944098]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;flex-wrap:wrap;gap:.5rem}.section-header h2[data-v-5d944098]{margin:0;font-size:1.3rem;color:#333}.summary-stats[data-v-5d944098]{display:flex;gap:1rem;flex-wrap:wrap}.stat[data-v-5d944098]{font-size:.85rem;padding:.25rem .75rem;border-radius:4px;background:#f1f5f9}.stat.running[data-v-5d944098]{background:#dcfce7;color:#166534}.stat.completed[data-v-5d944098]{background:#fef3c7;color:#92400e}.stat.failed[data-v-5d944098]{background:#fee2e2;color:#991b1b}.stat.clickable[data-v-5d944098]{cursor:pointer;transition:all .2s ease}.stat.clickable[data-v-5d944098]:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.stat.clickable.active[data-v-5d944098]{font-weight:600;box-shadow:0 0 0 2px currentColor}.filters-row[data-v-5d944098]{display:flex;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}.search-box[data-v-5d944098]{flex:1;min-width:200px}.search-input[data-v-5d944098]{width:100%;padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;font-size:.9rem;outline:none;transition:border-color .2s}.search-input[data-v-5d944098]:focus{border-color:#4a9eff}.filter-buttons[data-v-5d944098]{display:flex;gap:.5rem;flex-wrap:wrap}.filter-btn[data-v-5d944098]{padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.85rem;cursor:pointer;transition:all .2s}.filter-btn[data-v-5d944098]:hover{border-color:#4a9eff}.filter-btn.active[data-v-5d944098]{background:#4a9eff;color:#fff;border-color:#4a9eff}.loading-state[data-v-5d944098],.error-state[data-v-5d944098],.empty-state[data-v-5d944098]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:200px;gap:1rem;color:#6b7280}.spinner[data-v-5d944098]{width:32px;height:32px;border:3px solid #e5e7eb;border-top-color:#4a9eff;border-radius:50%;animation:spin-5d944098 1s linear infinite}@keyframes spin-5d944098{to{transform:rotate(360deg)}}.retry-btn[data-v-5d944098]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer}.task-list-container[data-v-5d944098]{max-height:600px;overflow-y:auto;border:1px solid #e5e7eb;border-radius:6px;position:relative}.task-list[data-v-5d944098]{display:flex;flex-direction:column}.task-item[data-v-5d944098]{display:flex;align-items:center;gap:.75rem;padding:.6rem 1rem;border-bottom:1px solid #f1f5f9;background:#fff;cursor:pointer;transition:background .15s}.task-item[data-v-5d944098]:hover{background:#f8fafc}.task-item[data-v-5d944098]:last-child{border-bottom:none}.task-status-icon[data-v-5d944098]{font-size:1rem}.task-status-icon.running[data-v-5d944098]{color:#22c55e}.task-status-icon.completed[data-v-5d944098]{color:#f59e0b}.task-status-icon.failed[data-v-5d944098]{color:#ef4444}.task-status-icon.pending[data-v-5d944098]{color:#9ca3af}.task-main[data-v-5d944098]{flex:1;min-width:0}.task-name-short[data-v-5d944098]{font-size:.9rem;font-weight:500;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-detail-hint[data-v-5d944098]{font-size:.75rem;color:#94a3b8;flex-shrink:0}.task-agent[data-v-5d944098]{font-size:.8rem;color:#6b7280;background:#f1f5f9;padding:.125rem .5rem;border-radius:4px}.task-time[data-v-5d944098]{font-size:.8rem;color:#94a3b8}.task-detail-overlay[data-v-5d944098]{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;display:flex;align-items:center;justify-content:center;z-index:1000}.task-detail-modal[data-v-5d944098]{background:#fff;border-radius:12px;box-shadow:0 10px 40px #0003;max-width:560px;width:90%;max-height:85vh;display:flex;flex-direction:column}.task-detail-header[data-v-5d944098]{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.25rem;border-bottom:1px solid #e5e7eb}.task-detail-header h3[data-v-5d944098]{margin:0;font-size:1rem;color:#333}.task-detail-header .close-btn[data-v-5d944098]{background:none;border:none;font-size:1.5rem;cursor:pointer;color:#6b7280;line-height:1;padding:0 .25rem}.task-detail-header .close-btn[data-v-5d944098]:hover{color:#333}.task-detail-body[data-v-5d944098]{padding:1rem 1.25rem;overflow-y:auto}.detail-row[data-v-5d944098]{margin-bottom:1rem}.detail-row[data-v-5d944098]:last-child{margin-bottom:0}.detail-label[data-v-5d944098]{display:block;font-size:.75rem;color:#64748b;margin-bottom:.25rem}.detail-value[data-v-5d944098]{font-size:.9rem;color:#333;word-break:break-word}.detail-value.task-content[data-v-5d944098]{white-space:pre-wrap;line-height:1.5}.detail-value.path-value[data-v-5d944098]{font-family:ui-monospace,monospace;font-size:.85rem;color:#475569}.generated-files-list[data-v-5d944098]{margin:0;padding-left:1.25rem;font-family:ui-monospace,monospace;font-size:.85rem;color:#475569;line-height:1.6}.file-path-item[data-v-5d944098]{word-break:break-all;margin-bottom:.25rem}.detail-value.output-content[data-v-5d944098]{white-space:pre-wrap;line-height:1.6;max-height:400px;overflow-y:auto;background:#f8fafc;padding:.75rem 1rem;border-radius:6px;border:1px solid #e2e8f0;font-size:.85rem}.detail-value.error[data-v-5d944098]{color:#b91c1c;background:#fef2f2;padding:.5rem;border-radius:6px;display:block}.detail-progress[data-v-5d944098]{display:flex;align-items:center;gap:.75rem}.detail-progress .progress-bar[data-v-5d944098]{flex:1;height:6px;background:#e5e7eb;border-radius:3px;overflow:hidden}.detail-progress .progress-fill[data-v-5d944098]{height:100%;background:linear-gradient(90deg,#4a9eff,#6bb9ff);border-radius:3px;transition:width .3s ease}.detail-progress .progress-text[data-v-5d944098]{font-size:.8rem;color:#6b7280;min-width:40px}.detail-subtasks[data-v-5d944098]{display:flex;flex-direction:column;gap:.5rem}.subtask-row[data-v-5d944098]{display:flex;align-items:center;gap:.5rem;font-size:.85rem;padding:.35rem .5rem;background:#f8fafc;border-radius:6px}.subtask-error-inline[data-v-5d944098]{margin-left:auto;font-size:.8rem;color:#b91c1c}.timeline-container[data-v-5d944098]{flex:1;max-height:300px;overflow-y:auto}.timeline[data-v-5d944098]{position:relative;padding-left:20px}.timeline[data-v-5d944098]:before{content:"";position:absolute;left:6px;top:0;bottom:0;width:2px;background:#e5e7eb}.timeline-item[data-v-5d944098]{position:relative;display:flex;align-items:flex-start;gap:12px;padding:8px 0;font-size:.85rem}.timeline-dot[data-v-5d944098]{position:absolute;left:-17px;top:12px;width:10px;height:10px;border-radius:50%;background:#9ca3af;border:2px solid #fff;box-shadow:0 0 0 2px #e5e7eb}.timeline-item.created .timeline-dot[data-v-5d944098]{background:#3b82f6;box-shadow:0 0 0 2px #3b82f6}.timeline-item.completed .timeline-dot[data-v-5d944098]{background:#10b981;box-shadow:0 0 0 2px #10b981}.timeline-item.failed .timeline-dot[data-v-5d944098]{background:#ef4444;box-shadow:0 0 0 2px #ef4444}.timeline-item.tool .timeline-dot[data-v-5d944098]{background:#f59e0b}.timeline-item.start .timeline-dot[data-v-5d944098]{background:#6366f1}.timeline-time[data-v-5d944098]{flex-shrink:0;width:70px;font-size:.75rem;color:#6b7280;font-family:monospace}.timeline-desc[data-v-5d944098]{flex:1;color:#374151}.timeline-item.failed .timeline-desc[data-v-5d944098]{color:#991b1b}@media (max-width: 640px){.section-header[data-v-5d944098]{flex-direction:column;align-items:flex-start}.summary-stats[data-v-5d944098]{font-size:.75rem}.filters-row[data-v-5d944098]{flex-direction:column}.filter-buttons[data-v-5d944098]{width:100%;justify-content:flex-start}.task-agent[data-v-5d944098]{display:none}}.performance-section[data-v-6508c9b4]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;padding:1.5rem}.section-header[data-v-6508c9b4]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;flex-wrap:wrap;gap:1rem}.section-header h2[data-v-6508c9b4]{margin:0;font-size:1.3rem;color:#333}.time-range-selector[data-v-6508c9b4]{display:flex;gap:.5rem}.range-btn[data-v-6508c9b4]{padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.85rem;cursor:pointer;transition:all .2s}.range-btn[data-v-6508c9b4]:hover{border-color:#4a9eff}.range-btn.active[data-v-6508c9b4]{background:#4a9eff;color:#fff;border-color:#4a9eff}.loading-state[data-v-6508c9b4],.error-state[data-v-6508c9b4]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:200px;gap:1rem;color:#6b7280}.spinner[data-v-6508c9b4]{width:32px;height:32px;border:3px solid #e5e7eb;border-top-color:#4a9eff;border-radius:50%;animation:spin-6508c9b4 1s linear infinite}@keyframes spin-6508c9b4{to{transform:rotate(360deg)}}.retry-btn[data-v-6508c9b4]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer}.metrics-grid[data-v-6508c9b4]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem;margin-bottom:2rem}.metric-card[data-v-6508c9b4]{display:flex;align-items:center;gap:1rem;padding:1.25rem;background:#f9fafb;border-radius:8px;border:1px solid #e5e7eb;position:relative}.metric-card.primary[data-v-6508c9b4]{background:linear-gradient(135deg,#eff6ff,#dbeafe);border-color:#93c5fd}.metric-card.highlight[data-v-6508c9b4]{background:#f0fdf4;border-color:#86efac}.metric-icon[data-v-6508c9b4]{font-size:2rem}.metric-content[data-v-6508c9b4]{flex:1}.metric-label[data-v-6508c9b4]{font-size:.8rem;color:#6b7280;margin-bottom:.25rem}.metric-value[data-v-6508c9b4]{font-size:1.75rem;font-weight:600;color:#333}.metric-unit[data-v-6508c9b4]{font-size:.75rem;color:#94a3b8}.metric-alert[data-v-6508c9b4]{position:absolute;top:.5rem;right:.5rem;font-size:1.25rem;animation:pulse-6508c9b4 2s infinite}@keyframes pulse-6508c9b4{0%,to{opacity:1}50%{opacity:.5}}.charts-stack[data-v-6508c9b4]{display:flex;flex-direction:column;gap:1.5rem;margin-bottom:2rem}.chart-card[data-v-6508c9b4]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:1.25rem}.chart-header[data-v-6508c9b4]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.chart-header h3[data-v-6508c9b4]{margin:0;font-size:1rem;color:#666}.chart-datetime[data-v-6508c9b4]{font-size:.8rem;color:#94a3b8}.chart-container[data-v-6508c9b4]{height:200px;display:flex;flex-direction:column}.chart-bars[data-v-6508c9b4]{flex:1;display:flex;align-items:flex-end;gap:4px;padding-bottom:36px;padding-top:28px;overflow-x:auto;min-width:0}.chart-bar[data-v-6508c9b4]{flex:1;min-width:16px;background:linear-gradient(to top,#4a9eff,#6bb9ff);border-radius:3px 3px 0 0;min-height:8px;position:relative;transition:height .3s ease;cursor:pointer;display:flex;flex-direction:column;align-items:center}.chart-bars.rpm .chart-bar[data-v-6508c9b4]{background:linear-gradient(to top,#10b981,#34d399)}.bar-value[data-v-6508c9b4]{position:absolute;top:-22px;left:50%;transform:translate(-50%);font-size:.6rem;color:#6b7280;white-space:nowrap}.bar-time-label[data-v-6508c9b4]{position:absolute;bottom:-30px;left:50%;transform:translate(-50%);font-size:.65rem;color:#6b7280;white-space:nowrap}.summary-section[data-v-6508c9b4]{padding-top:1.5rem;border-top:1px solid #e5e7eb;margin-bottom:1.5rem}.summary-section h3[data-v-6508c9b4]{margin:0 0 1rem;font-size:1rem;color:#666}.summary-grid[data-v-6508c9b4]{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:1rem}.summary-item[data-v-6508c9b4]{display:flex;flex-direction:column;gap:.25rem;padding:1rem;background:#f9fafb;border-radius:6px}.summary-item.highlight[data-v-6508c9b4]{background:#eff6ff;border:1px solid #bfdbfe}.summary-label[data-v-6508c9b4]{font-size:.8rem;color:#6b7280}.summary-value[data-v-6508c9b4]{font-size:1.25rem;font-weight:600;color:#333}.summary-sub[data-v-6508c9b4]{font-size:.75rem;color:#6b7280}.chart-bar.clickable[data-v-6508c9b4]{cursor:pointer}.chart-bar.clickable[data-v-6508c9b4]:hover{opacity:.9}.detail-modal-overlay[data-v-6508c9b4]{position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;display:flex;align-items:center;justify-content:center;z-index:1000}.detail-modal[data-v-6508c9b4]{background:#fff;border-radius:12px;box-shadow:0 10px 40px #0003;max-width:560px;width:90%;max-height:80vh;display:flex;flex-direction:column}.detail-modal-header[data-v-6508c9b4]{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.25rem;border-bottom:1px solid #e5e7eb}.detail-modal-header h3[data-v-6508c9b4]{margin:0;font-size:1rem;color:#333}.detail-modal-header .close-btn[data-v-6508c9b4]{background:none;border:none;font-size:1.5rem;cursor:pointer;color:#6b7280;line-height:1;padding:0 .25rem}.detail-modal-header .close-btn[data-v-6508c9b4]:hover{color:#333}.detail-modal-body[data-v-6508c9b4]{padding:1rem 1.25rem;overflow-y:auto}.detail-loading[data-v-6508c9b4]{text-align:center;padding:2rem;color:#6b7280}.detail-summary[data-v-6508c9b4]{font-size:.9rem;color:#6b7280;margin-bottom:1rem}.detail-filters[data-v-6508c9b4]{display:flex;gap:.75rem;margin-bottom:1rem;flex-wrap:wrap}.search-input[data-v-6508c9b4]{flex:1;min-width:150px;padding:.5rem .75rem;border:1px solid #e5e7eb;border-radius:6px;font-size:.85rem;outline:none}.search-input[data-v-6508c9b4]:focus{border-color:#4a9eff}.agent-filter[data-v-6508c9b4],.sort-select[data-v-6508c9b4]{padding:.5rem .75rem;border:1px solid #e5e7eb;border-radius:6px;font-size:.85rem;background:#fff;cursor:pointer;outline:none}.agent-filter[data-v-6508c9b4]:focus,.sort-select[data-v-6508c9b4]:focus{border-color:#4a9eff}.detail-calls[data-v-6508c9b4]{display:flex;flex-direction:column;gap:.75rem}.detail-call-hint[data-v-6508c9b4]{display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;background:#eff6ff;border:1px solid #93c5fd;border-radius:6px;margin-bottom:.75rem}.detail-call-hint .hint-badge[data-v-6508c9b4]{font-size:.8rem;font-weight:600;color:#1d4ed8;padding:.15rem .5rem;background:#dbeafe;border-radius:4px}.detail-call-hint .hint-text[data-v-6508c9b4]{font-size:.8rem;color:#1e40af}.detail-call-item[data-v-6508c9b4]{padding:.75rem 1rem;background:#f9fafb;border-radius:8px;border-left:3px solid #4a9eff}.detail-call-item .call-header[data-v-6508c9b4]{display:flex;align-items:center;gap:.5rem;margin-bottom:.35rem}.detail-call-item .call-agent[data-v-6508c9b4]{font-weight:600;color:#333}.detail-call-item .call-time[data-v-6508c9b4]{font-size:.8rem;color:#6b7280}.detail-call-item .call-tokens[data-v-6508c9b4]{font-size:.8rem;color:#10b981;margin-left:auto}.detail-call-item .call-trigger[data-v-6508c9b4]{font-size:.85rem;color:#555;word-break:break-word;margin-top:.25rem;white-space:pre-wrap}.detail-call-item .call-trigger-badge[data-v-6508c9b4]{display:inline-block;font-size:.75rem;font-weight:600;color:#1d4ed8;padding:.1rem .4rem;background:#dbeafe;border-radius:4px;margin-right:.35rem}.detail-call-item .call-meta[data-v-6508c9b4]{font-size:.75rem;color:#9ca3af;margin-top:.25rem}.detail-empty[data-v-6508c9b4]{text-align:center;padding:2rem;color:#9ca3af}.alerts-panel[data-v-6508c9b4]{background:#fef3c7;border:1px solid #fcd34d;border-radius:8px;padding:1rem}.alerts-panel h3[data-v-6508c9b4]{margin:0 0 .75rem;font-size:.95rem;color:#92400e}.alerts-list[data-v-6508c9b4]{display:flex;flex-direction:column;gap:.5rem}.alert-item[data-v-6508c9b4]{display:flex;align-items:center;gap:1rem;padding:.75rem;background:#fff;border-radius:6px;font-size:.85rem}.alert-message[data-v-6508c9b4]{flex:1;color:#333}.alert-value[data-v-6508c9b4]{color:#6b7280}.alert-time[data-v-6508c9b4]{font-size:.75rem;color:#94a3b8}.ack-btn[data-v-6508c9b4]{padding:.25rem .75rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;font-size:.75rem;cursor:pointer}.ack-btn[data-v-6508c9b4]:hover{background:#3a8eef}@media (max-width: 640px){.section-header[data-v-6508c9b4]{flex-direction:column;align-items:flex-start}.time-range-selector[data-v-6508c9b4]{width:100%;justify-content:space-between}.range-btn[data-v-6508c9b4]{flex:1;text-align:center;padding:.5rem;font-size:.75rem}.metrics-grid[data-v-6508c9b4]{grid-template-columns:1fr 1fr}}.token-analysis[data-v-b98a8391]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;padding:1.5rem}.section-header[data-v-b98a8391]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;flex-wrap:wrap;gap:1rem}.section-header h2[data-v-b98a8391]{margin:0;font-size:1.3rem;color:#333}.time-range-selector[data-v-b98a8391]{display:flex;gap:.5rem}.range-btn[data-v-b98a8391]{padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.85rem;cursor:pointer;transition:all .2s}.range-btn[data-v-b98a8391]:hover{border-color:#4a9eff}.range-btn.active[data-v-b98a8391]{background:#4a9eff;color:#fff;border-color:#4a9eff}.loading-state[data-v-b98a8391],.error-state[data-v-b98a8391]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:200px;gap:1rem;color:#6b7280}.spinner[data-v-b98a8391]{width:32px;height:32px;border:3px solid #e5e7eb;border-top-color:#4a9eff;border-radius:50%;animation:spin-b98a8391 1s linear infinite}@keyframes spin-b98a8391{to{transform:rotate(360deg)}}.retry-btn[data-v-b98a8391]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer}.error-icon[data-v-b98a8391]{font-size:2rem}.summary-cards[data-v-b98a8391]{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:1rem;margin-bottom:1.5rem}.summary-card[data-v-b98a8391]{display:flex;align-items:center;gap:.75rem;padding:1rem;background:#f9fafb;border-radius:8px;border:1px solid #e5e7eb}.summary-card.highlight[data-v-b98a8391]{background:#f0fdf4;border-color:#86efac}.summary-card.cost[data-v-b98a8391]{background:linear-gradient(135deg,#fefce8,#fef9c3);border-color:#fde047}.card-icon[data-v-b98a8391]{font-size:1.5rem}.card-content[data-v-b98a8391]{flex:1}.card-label[data-v-b98a8391]{font-size:.8rem;color:#6b7280;margin-bottom:.25rem}.card-value[data-v-b98a8391]{font-size:1.25rem;font-weight:600;color:#333}.card-sub[data-v-b98a8391]{font-size:.75rem;color:#6b7280;margin-top:.25rem}.card-sub.saved[data-v-b98a8391]{color:#16a34a;font-weight:500}.trend-section[data-v-b98a8391]{margin-bottom:1.5rem;padding:1rem;background:#f9fafb;border-radius:8px;border:1px solid #e5e7eb}.trend-section h3[data-v-b98a8391]{margin:0 0 1rem;font-size:1rem;color:#666}.trend-chart[data-v-b98a8391]{position:relative}.trend-bars[data-v-b98a8391]{display:flex;align-items:flex-end;gap:2px;height:120px;padding-bottom:30px}.trend-bar-group[data-v-b98a8391]{flex:1;display:flex;align-items:flex-end;gap:1px;min-width:20px;position:relative}.trend-bar[data-v-b98a8391]{flex:1;min-width:8px;border-radius:2px 2px 0 0;min-height:2px;position:relative;transition:height .3s ease}.trend-bar.input[data-v-b98a8391]{background:linear-gradient(to top,#4a9eff,#6bb9ff)}.trend-bar.output[data-v-b98a8391]{background:linear-gradient(to top,#f59e0b,#fbbf24)}.bar-tooltip[data-v-b98a8391]{position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#333;color:#fff;padding:2px 6px;border-radius:4px;font-size:.7rem;white-space:nowrap;opacity:0;transition:opacity .2s;pointer-events:none}.trend-bar:hover .bar-tooltip[data-v-b98a8391]{opacity:1}.trend-time[data-v-b98a8391]{position:absolute;bottom:-25px;left:50%;transform:translate(-50%);font-size:.65rem;color:#6b7280;white-space:nowrap}.trend-legend[data-v-b98a8391]{display:flex;justify-content:center;gap:1.5rem;margin-top:.5rem}.legend-item[data-v-b98a8391]{display:flex;align-items:center;gap:.5rem;font-size:.8rem;color:#6b7280}.legend-color[data-v-b98a8391]{width:12px;height:12px;border-radius:2px}.legend-color.input[data-v-b98a8391]{background:#4a9eff}.legend-color.output[data-v-b98a8391]{background:#f59e0b}.view-toggle[data-v-b98a8391]{display:flex;gap:.5rem;margin-bottom:1rem}.view-toggle button[data-v-b98a8391]{padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.85rem;cursor:pointer;transition:all .2s}.view-toggle button[data-v-b98a8391]:hover{border-color:#4a9eff}.view-toggle button.active[data-v-b98a8391]{background:#4a9eff;color:#fff;border-color:#4a9eff}.by-agent-table[data-v-b98a8391]{overflow-x:auto}.by-agent-table table[data-v-b98a8391]{width:100%;border-collapse:collapse;font-size:.9rem}.by-agent-table th[data-v-b98a8391],.by-agent-table td[data-v-b98a8391]{padding:.75rem;text-align:left;border-bottom:1px solid #e5e7eb}.by-agent-table th[data-v-b98a8391]{background:#f9fafb;font-weight:600;color:#6b7280;font-size:.8rem;text-transform:uppercase}.by-agent-table tfoot td[data-v-b98a8391]{background:#f9fafb;font-weight:500}.agent-name[data-v-b98a8391]{font-weight:500;color:#333}.total-col[data-v-b98a8391]{font-weight:600;color:#4a9eff}.percent-bar[data-v-b98a8391]{display:flex;align-items:center;gap:.5rem}.percent-fill[data-v-b98a8391]{height:8px;background:#4a9eff;border-radius:4px;min-width:4px}.percent-text[data-v-b98a8391]{font-size:.8rem;color:#6b7280;white-space:nowrap}.by-agent-chart h3[data-v-b98a8391]{margin:0 0 1rem;font-size:1rem;color:#666}.bar-chart[data-v-b98a8391]{display:flex;flex-direction:column;gap:.75rem}.bar-row[data-v-b98a8391]{display:flex;align-items:center;gap:1rem}.bar-label[data-v-b98a8391]{width:120px;font-size:.85rem;font-weight:500;color:#333;flex-shrink:0}.bar-container[data-v-b98a8391]{flex:1;height:24px;background:#f3f4f6;border-radius:4px;overflow:hidden}.bar[data-v-b98a8391]{height:100%;background:linear-gradient(90deg,#4a9eff,#6bb9ff);border-radius:4px;display:flex;align-items:center;justify-content:flex-end;padding-right:.5rem;min-width:fit-content}.bar-value[data-v-b98a8391]{font-size:.75rem;color:#fff;font-weight:500;white-space:nowrap}.bar-percent[data-v-b98a8391]{width:50px;font-size:.8rem;color:#6b7280;text-align:right}@media (max-width: 640px){.section-header[data-v-b98a8391]{flex-direction:column;align-items:flex-start}.time-range-selector[data-v-b98a8391]{width:100%;justify-content:space-between}.range-btn[data-v-b98a8391]{flex:1;text-align:center;padding:.5rem;font-size:.75rem}.summary-cards[data-v-b98a8391]{grid-template-columns:1fr 1fr}.bar-label[data-v-b98a8391]{width:80px;font-size:.75rem}.bar-percent[data-v-b98a8391]{width:40px}}.performance-panel[data-v-7962ace4]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;overflow:hidden}.panel-header[data-v-7962ace4]{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.5rem;background:#f9fafb;border-bottom:1px solid #e5e7eb;flex-wrap:wrap;gap:1rem}.panel-header h2[data-v-7962ace4]{margin:0;font-size:1.3rem;color:#333}.tab-switcher[data-v-7962ace4]{display:flex;gap:.5rem}.tab-btn[data-v-7962ace4]{padding:.5rem 1rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.85rem;cursor:pointer;transition:all .2s;display:flex;align-items:center;gap:.5rem}.tab-btn[data-v-7962ace4]:hover{border-color:#4a9eff}.tab-btn.active[data-v-7962ace4]{background:#4a9eff;color:#fff;border-color:#4a9eff}.panel-content[data-v-7962ace4]{padding:0}.panel-content[data-v-7962ace4] .performance-section,.panel-content[data-v-7962ace4] .token-analysis{background:transparent;box-shadow:none;border-radius:0;padding:1.5rem;margin-bottom:0}@media (max-width: 640px){.panel-header[data-v-7962ace4]{flex-direction:column;align-items:flex-start}.tab-switcher[data-v-7962ace4]{width:100%}.tab-btn[data-v-7962ace4]{flex:1;justify-content:center}}.error-center[data-v-ca874c41]{background:#fff;border-radius:8px;padding:1.5rem;box-shadow:0 2px 8px #0000001a}.header[data-v-ca874c41]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;flex-wrap:wrap;gap:1rem}.header h2[data-v-ca874c41]{margin:0;font-size:1.3rem;color:#333}.header-actions[data-v-ca874c41]{display:flex;gap:.75rem;align-items:center}.filter-select[data-v-ca874c41]{padding:.5rem .75rem;border:1px solid #e5e7eb;border-radius:6px;background:#fff;font-size:.9rem;min-width:120px}.refresh-btn[data-v-ca874c41]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:.9rem}.refresh-btn[data-v-ca874c41]:hover{background:#3a8eef}.stats-row[data-v-ca874c41]{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:1rem;margin-bottom:1.5rem}.stat-card[data-v-ca874c41]{background:#f8fafc;border-radius:8px;padding:1rem;text-align:center;border:1px solid #e2e8f0}.stat-card.total[data-v-ca874c41]{background:#fef2f2;border-color:#fecaca}.stat-card.session[data-v-ca874c41]{background:#fef3c7;border-color:#fde68a}.stat-card.model[data-v-ca874c41]{background:#ede9fe;border-color:#ddd6fe}.stat-card.healthy[data-v-ca874c41]{background:#d1fae5;border-color:#a7f3d0}.stat-card.warning[data-v-ca874c41]{background:#fef3c7;border-color:#fde68a}.stat-value[data-v-ca874c41]{font-size:1.8rem;font-weight:700;color:#1e293b}.stat-label[data-v-ca874c41]{font-size:.85rem;color:#64748b;margin-top:.25rem}.trend-section[data-v-ca874c41]{margin-bottom:1.5rem}.trend-section h3[data-v-ca874c41]{margin:0 0 .75rem;font-size:1rem;color:#475569}.trend-chart[data-v-ca874c41]{display:flex;align-items:flex-end;gap:2px;height:80px;background:#f8fafc;border-radius:6px;padding:.5rem}.trend-bar[data-v-ca874c41]{flex:1;background:#cbd5e1;border-radius:2px 2px 0 0;min-height:4px;position:relative;transition:background .2s}.trend-bar[data-v-ca874c41]:hover{background:#ef4444}.bar-label[data-v-ca874c41]{position:absolute;top:-16px;left:50%;transform:translate(-50%);font-size:.7rem;color:#64748b}.trend-labels[data-v-ca874c41]{display:flex;gap:2px;margin-top:.25rem}.trend-time[data-v-ca874c41]{flex:1;text-align:center;font-size:.7rem;color:#94a3b8}.type-distribution[data-v-ca874c41]{margin-bottom:1.5rem}.type-distribution h3[data-v-ca874c41]{margin:0 0 .75rem;font-size:1rem;color:#475569}.type-bars[data-v-ca874c41]{display:flex;flex-direction:column;gap:.5rem}.type-bar-item[data-v-ca874c41]{display:flex;align-items:center;gap:.75rem}.type-bar-label[data-v-ca874c41]{display:flex;align-items:center;gap:.5rem;min-width:100px;font-size:.85rem;color:#475569}.type-dot[data-v-ca874c41]{width:8px;height:8px;border-radius:50%}.type-bar-track[data-v-ca874c41]{flex:1;height:8px;background:#e2e8f0;border-radius:4px;overflow:hidden}.type-bar-fill[data-v-ca874c41]{height:100%;border-radius:4px;transition:width .3s}.type-count[data-v-ca874c41]{min-width:40px;text-align:right;font-size:.85rem;color:#64748b;font-weight:500}.api-status-section[data-v-ca874c41]{margin-bottom:1.5rem}.api-status-section h3[data-v-ca874c41]{margin:0 0 .75rem;font-size:1rem;color:#475569}.api-status-grid[data-v-ca874c41]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.75rem}.api-status-card[data-v-ca874c41]{padding:.75rem;background:#f8fafc;border-radius:6px;border:1px solid #e2e8f0}.api-status-card.status-healthy[data-v-ca874c41]{background:#f0fdf4;border-color:#bbf7d0}.api-status-card.status-degraded[data-v-ca874c41]{background:#fffbeb;border-color:#fde68a}.api-status-card.status-down[data-v-ca874c41]{background:#fef2f2;border-color:#fecaca}.api-header[data-v-ca874c41]{display:flex;justify-content:space-between;margin-bottom:.5rem}.api-model[data-v-ca874c41]{font-weight:600;font-size:.9rem;color:#1e293b}.api-provider[data-v-ca874c41]{font-size:.8rem;color:#94a3b8}.api-status[data-v-ca874c41]{display:flex;align-items:center;gap:.5rem}.status-dot[data-v-ca874c41]{width:8px;height:8px;border-radius:50%}.status-dot.status-healthy[data-v-ca874c41]{background:#22c55e}.status-dot.status-degraded[data-v-ca874c41]{background:#f59e0b}.status-dot.status-down[data-v-ca874c41]{background:#ef4444}.status-text[data-v-ca874c41]{font-size:.85rem;color:#64748b}.api-last-error[data-v-ca874c41]{margin-top:.5rem;font-size:.8rem;color:#dc2626;display:flex;justify-content:space-between}.api-error-count[data-v-ca874c41]{margin-top:.25rem;font-size:.8rem;color:#ef4444}.error-lists[data-v-ca874c41]{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:1.5rem}.error-group h3[data-v-ca874c41]{margin:0 0 .75rem;font-size:1rem;color:#475569;display:flex;align-items:center;gap:.5rem}.count-badge[data-v-ca874c41]{background:#e2e8f0;color:#64748b;font-size:.75rem;padding:.125rem .5rem;border-radius:10px;font-weight:500}.empty[data-v-ca874c41]{color:#94a3b8;font-size:.9rem;padding:1rem;text-align:center;background:#f8fafc;border-radius:6px}.error-list[data-v-ca874c41]{display:flex;flex-direction:column;gap:.5rem}.error-item[data-v-ca874c41]{background:#fef2f2;border-radius:6px;border-left:4px solid #ef4444;cursor:pointer;transition:box-shadow .2s}.error-item[data-v-ca874c41]:hover{box-shadow:0 2px 4px #0000001a}.error-item.severity-warning[data-v-ca874c41]{border-left-color:#f59e0b;background:#fffbeb}.error-item.severity-critical[data-v-ca874c41]{border-left-color:#dc2626;background:#fef2f2}.error-main[data-v-ca874c41]{display:grid;grid-template-columns:80px 80px 1fr 70px 24px;gap:.5rem;align-items:center;padding:.75rem;font-size:.85rem}.error-agent[data-v-ca874c41]{font-weight:500;color:#991b1b}.error-type[data-v-ca874c41]{font-weight:500}.error-msg[data-v-ca874c41]{color:#7f1d1d;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.error-time[data-v-ca874c41]{color:#b91c1c;font-size:.8rem;text-align:right}.expand-icon[data-v-ca874c41]{color:#94a3b8;font-size:.7rem;text-align:center}.error-detail[data-v-ca874c41]{padding:.75rem;padding-top:0;border-top:1px solid #fecaca;margin:0 .75rem .75rem}.detail-row[data-v-ca874c41]{display:flex;gap:.5rem;margin-bottom:.5rem;font-size:.85rem}.detail-label[data-v-ca874c41]{color:#64748b;min-width:70px}.detail-message[data-v-ca874c41]{color:#1e293b;word-break:break-word}@media (max-width: 768px){.header[data-v-ca874c41]{flex-direction:column;align-items:flex-start}.error-main[data-v-ca874c41]{grid-template-columns:1fr;gap:.25rem}.error-lists[data-v-ca874c41],.api-status-grid[data-v-ca874c41]{grid-template-columns:1fr}}.version-display[data-v-87a575a1]{font-size:.8rem;color:#ffffffa6;display:inline-block;position:relative;z-index:1000;flex-shrink:0}.loading-text[data-v-87a575a1],.error-text[data-v-87a575a1]{color:#ffffff80}.version-text[data-v-87a575a1]{cursor:pointer;transition:color .2s;-webkit-user-select:none;user-select:none}.version-text[data-v-87a575a1]:hover{color:#fffffff2}.tooltip[data-v-87a575a1]{position:absolute;top:calc(100% + 8px);right:0;background:#fff;border:1px solid #ddd;border-radius:4px;padding:8px 12px;box-shadow:0 2px 8px #00000026;white-space:nowrap;z-index:1001;min-width:200px}.tooltip-item[data-v-87a575a1]{margin:4px 0;font-size:12px;color:#333}.tooltip-item strong[data-v-87a575a1]{color:#666;margin-right:4px}@media (max-width: 640px){.version-display[data-v-87a575a1]{font-size:.7rem}.tooltip[data-v-87a575a1]{min-width:160px;font-size:11px}}:root{--color-primary: #4a9eff;--color-success: #22c55e;--color-warning: #f59e0b;--color-error: #ef4444;--status-idle: #94a3b8;--status-active: #4a9eff;--status-completed: #22c55e;--status-error: #ef4444;--spacing-xs: .25rem;--spacing-sm: .5rem;--spacing-md: 1rem;--spacing-lg: 1.5rem;--spacing-xl: 2rem;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 8px;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .05);--shadow-md: 0 2px 8px rgba(0, 0, 0, .1);--shadow-lg: 0 4px 16px rgba(0, 0, 0, .15)}header[data-v-543ef282]{display:flex;justify-content:space-between;align-items:center;padding:1rem 2rem;background:#1a1a2e;color:#fff;flex-wrap:wrap;gap:1rem}header h1[data-v-543ef282]{margin:0;font-size:1.5rem}.controls[data-v-543ef282]{display:flex;align-items:center;gap:1rem;flex-wrap:wrap}button[data-v-543ef282]{padding:.5rem 1rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer}button[data-v-543ef282]:hover{background:#3a8eef}.connection-status[data-v-543ef282]{font-size:.85rem;padding:.25rem .75rem;border-radius:20px;background:#2d3748}.connection-status.connected[data-v-543ef282]{background:#22c55e}.connection-status.connecting[data-v-543ef282]{background:#f59e0b}.connection-status.disconnected[data-v-543ef282],.connection-status.error[data-v-543ef282]{background:#ef4444}main[data-v-543ef282]{padding:2rem;max-width:1600px;margin:0 auto}.collaboration-section[data-v-543ef282]{margin-bottom:2rem;min-height:400px}.task-status-section[data-v-543ef282],.performance-section[data-v-543ef282],.error-center-section[data-v-543ef282]{margin-bottom:2rem}h2[data-v-543ef282]{margin-bottom:1rem;color:#333}@media (max-width: 1024px){main[data-v-543ef282]{padding:1rem}header[data-v-543ef282]{padding:1rem}}@media (max-width: 640px){header h1[data-v-543ef282]{font-size:1.2rem}.controls[data-v-543ef282]{width:100%;justify-content:space-between}}
|
package/frontend-dist/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>OpenClow Agent Dashboard</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-BtN_FdUX.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CrwySDZq.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="app"></div>
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openclaw-agent-dashboard",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.43",
|
|
4
4
|
"description": "多 Agent 可视化看板 - OpenClaw 插件",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"openclaw": {
|
|
@@ -30,4 +30,4 @@
|
|
|
30
30
|
"pack": "node ../scripts/build-plugin.js",
|
|
31
31
|
"prepublishOnly": "npm run pack"
|
|
32
32
|
}
|
|
33
|
-
}
|
|
33
|
+
}
|