openclaw-agent-dashboard 1.0.37 → 1.0.38
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/collaboration.py +42 -35
- package/dashboard/data/session_reader.py +21 -14
- package/frontend-dist/assets/{index-CVnP0JTr.js → index-BQRg8Gvl.js} +1 -1
- package/frontend-dist/assets/{index-DsWSoANz.css → index-CghUi6Ys.css} +1 -1
- package/frontend-dist/index.html +2 -2
- package/package.json +1 -1
|
@@ -73,6 +73,23 @@ class ActiveTask(BaseModel):
|
|
|
73
73
|
featureId: Optional[str] = None # FEATURE_ID(如果有)
|
|
74
74
|
|
|
75
75
|
|
|
76
|
+
def _main_agent_status_for_collaboration(main_agent_id: str) -> str:
|
|
77
|
+
"""
|
|
78
|
+
协作流程里 PM 卡片状态:与 delegate 边是否激活同源——只认 subagents/runs.json 的活跃 run
|
|
79
|
+
(is_agent_working)+ 近期会话错误;不使用 calculate_agent_status 里的主会话 solo 启发式
|
|
80
|
+
(thinking / 未完成 tool / sessions 短窗),避免「连线已变实线仍显示工作中」。
|
|
81
|
+
全局 /api/agents 仍用 calculate_agent_status,可继续反映「主会话自己在跑」的语义。
|
|
82
|
+
"""
|
|
83
|
+
from data.session_reader import has_recent_errors
|
|
84
|
+
from data.subagent_reader import is_agent_working
|
|
85
|
+
|
|
86
|
+
if has_recent_errors(main_agent_id, minutes=5):
|
|
87
|
+
return 'error'
|
|
88
|
+
if is_agent_working(main_agent_id):
|
|
89
|
+
return 'working'
|
|
90
|
+
return 'idle'
|
|
91
|
+
|
|
92
|
+
|
|
76
93
|
def _extract_feature_id(task_name: str) -> Optional[str]:
|
|
77
94
|
"""从任务名称中提取 FEATURE_ID"""
|
|
78
95
|
if not task_name:
|
|
@@ -149,6 +166,14 @@ def _build_agent_active_tasks(
|
|
|
149
166
|
if requester_agent_id and not agent_ids_equal(requester_agent_id, child_agent_id):
|
|
150
167
|
task_item['childAgentId'] = child_agent_id
|
|
151
168
|
|
|
169
|
+
# 自派:派发者与执行者为同一 Agent(如 PM 派给自己)时,同一 run 只记一条,否则会显示「2 个并行任务」
|
|
170
|
+
if requester_agent_id and agent_ids_equal(requester_agent_id, child_agent_id):
|
|
171
|
+
if child_agent_id not in agent_active_tasks:
|
|
172
|
+
agent_active_tasks[child_agent_id] = []
|
|
173
|
+
self_task = {k: v for k, v in task_item.items() if k != 'childAgentId'}
|
|
174
|
+
agent_active_tasks[child_agent_id].append(self_task)
|
|
175
|
+
continue
|
|
176
|
+
|
|
152
177
|
# 1. 添加到派发者(如果派发者是某个已知 agent)
|
|
153
178
|
if requester_agent_id:
|
|
154
179
|
if requester_agent_id not in agent_active_tasks:
|
|
@@ -197,8 +222,6 @@ class CollaborationFlow(BaseModel):
|
|
|
197
222
|
depths: Optional[Dict[str, int]] = None # agentId -> 层级深度 (0=主, 1=子, 2=孙...)
|
|
198
223
|
# 多任务并行展示:每个 Agent 的活跃任务列表
|
|
199
224
|
agentActiveTasks: Optional[Dict[str, List[ActiveTask]]] = None
|
|
200
|
-
# 多任务并行展示:每个 Agent 的活跃任务列表
|
|
201
|
-
agentActiveTasks: Optional[Dict[str, List[ActiveTask]]] = None
|
|
202
225
|
|
|
203
226
|
|
|
204
227
|
def _parse_agent_id(session_key: str) -> str:
|
|
@@ -340,30 +363,11 @@ def _enrich_main_agent_active_tasks_if_needed(
|
|
|
340
363
|
main_agent_id: str,
|
|
341
364
|
) -> Dict[str, List[Dict[str, Any]]]:
|
|
342
365
|
"""
|
|
343
|
-
|
|
344
|
-
|
|
366
|
+
PM 协作状态已与 runs 对齐;不再在「无 subagent run」时用 calculate_agent_status
|
|
367
|
+
伪造一条主会话任务,否则会出现徽章已空闲、卡片仍显示「当前任务」的矛盾。
|
|
368
|
+
主会话 solo 执行中的语义由 /api/agents 等入口展示。
|
|
345
369
|
"""
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
if calculate_agent_status(main_agent_id) != 'working':
|
|
349
|
-
return agent_active_tasks
|
|
350
|
-
if agent_active_tasks.get(main_agent_id):
|
|
351
|
-
return agent_active_tasks
|
|
352
|
-
hint = get_current_task(main_agent_id)
|
|
353
|
-
name = _clean_task_name(hint) if hint else ''
|
|
354
|
-
if not name:
|
|
355
|
-
return agent_active_tasks
|
|
356
|
-
merged = dict(agent_active_tasks)
|
|
357
|
-
merged[main_agent_id] = [
|
|
358
|
-
{
|
|
359
|
-
'id': 'task-main-session',
|
|
360
|
-
'name': name,
|
|
361
|
-
'status': 'working',
|
|
362
|
-
'timestamp': None,
|
|
363
|
-
'featureId': None,
|
|
364
|
-
}
|
|
365
|
-
]
|
|
366
|
-
return merged
|
|
370
|
+
return agent_active_tasks
|
|
367
371
|
|
|
368
372
|
|
|
369
373
|
def _get_agent_error_info(agent_id: str) -> Optional[Dict[str, Any]]:
|
|
@@ -574,14 +578,8 @@ async def get_collaboration():
|
|
|
574
578
|
recent_calls = _get_recent_model_calls(30)
|
|
575
579
|
|
|
576
580
|
main_display_name = (main_agent_config.get('name') if main_agent_config else None) or "主 Agent"
|
|
577
|
-
#
|
|
578
|
-
|
|
579
|
-
if main_raw == 'down':
|
|
580
|
-
main_status = 'error'
|
|
581
|
-
elif main_raw == 'working':
|
|
582
|
-
main_status = 'working'
|
|
583
|
-
else:
|
|
584
|
-
main_status = 'idle'
|
|
581
|
+
# PM:与连线 activePath 一致,仅用 runs 活跃 + 会话错误(见 _main_agent_status_for_collaboration)
|
|
582
|
+
main_status = _main_agent_status_for_collaboration(main_agent_id)
|
|
585
583
|
|
|
586
584
|
# 获取主 agent 的当前任务和错误信息
|
|
587
585
|
main_current_task = ''
|
|
@@ -909,8 +907,17 @@ async def get_collaboration_dynamic():
|
|
|
909
907
|
except Exception as e:
|
|
910
908
|
logger.warning(f"Failed to get display status for {aid}: {e}")
|
|
911
909
|
|
|
912
|
-
#
|
|
913
|
-
|
|
910
|
+
# PM:覆盖为与连线同源的状态;并修正 dynamic 文案,避免 calculate_agent_status 的 solo 与卡片矛盾
|
|
911
|
+
main_collab = _main_agent_status_for_collaboration(main_agent_id)
|
|
912
|
+
agent_statuses[main_agent_id] = main_collab
|
|
913
|
+
if main_collab == 'idle':
|
|
914
|
+
agent_dynamic_statuses[main_agent_id] = AgentDisplayStatus(
|
|
915
|
+
status='idle', display='空闲', duration=0, alert=False
|
|
916
|
+
)
|
|
917
|
+
elif main_collab == 'error':
|
|
918
|
+
agent_dynamic_statuses[main_agent_id] = AgentDisplayStatus(
|
|
919
|
+
status='idle', display='检测到错误', duration=0, alert=True
|
|
920
|
+
)
|
|
914
921
|
|
|
915
922
|
# 处理活跃任务(简化:不在流程图中创建任务节点,任务信息由 agentActiveTasks 提供)
|
|
916
923
|
# 任务详情在 Agent 卡片内显示,流程图只显示 Agent 之间的委托关系
|
|
@@ -129,10 +129,9 @@ def get_recent_messages(agent_id: str, limit: int = 10) -> List[Dict[str, Any]]:
|
|
|
129
129
|
data = json.loads(line)
|
|
130
130
|
if data.get('type') == 'message':
|
|
131
131
|
messages.append(data.get('message', {}))
|
|
132
|
-
if len(messages) >= limit:
|
|
133
|
-
break
|
|
134
132
|
except json.JSONDecodeError:
|
|
135
133
|
continue
|
|
134
|
+
# 必须取尾部:原先在扫描到 limit 条就 break,会拿到「窗口内较早」的消息而非最新,导致 tool/ thinking 误判
|
|
136
135
|
return messages[-limit:] if len(messages) > limit else messages
|
|
137
136
|
|
|
138
137
|
|
|
@@ -416,16 +415,26 @@ def get_latest_tool_call(agent_id: str) -> Optional[Dict[str, Any]]:
|
|
|
416
415
|
|
|
417
416
|
|
|
418
417
|
def has_thinking_block(agent_id: str) -> bool:
|
|
419
|
-
"""
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
418
|
+
"""
|
|
419
|
+
是否处于「当前回合的思考阶段」。
|
|
420
|
+
仅看会话中**最后一条**消息:已完成回合的 assistant 往往在 content 里仍保留 thinking 块,
|
|
421
|
+
若仍按「最近任意 assistant 含 thinking」会长期误判为工作中。
|
|
422
|
+
"""
|
|
423
|
+
messages = get_recent_messages(agent_id, limit=24)
|
|
424
|
+
if not messages:
|
|
425
|
+
return False
|
|
426
|
+
last = messages[-1]
|
|
427
|
+
if last.get('role') != 'assistant':
|
|
428
|
+
return False
|
|
429
|
+
# 已结束的一轮通常带 stopReason;此时 content 里的 thinking 只算历史,不算仍在思考
|
|
430
|
+
if last.get('stopReason'):
|
|
431
|
+
return False
|
|
432
|
+
content = last.get('content', [])
|
|
433
|
+
if isinstance(content, str):
|
|
434
|
+
return False
|
|
435
|
+
for c in content:
|
|
436
|
+
if isinstance(c, dict) and c.get('type') == 'thinking':
|
|
437
|
+
return True
|
|
429
438
|
return False
|
|
430
439
|
|
|
431
440
|
|
|
@@ -471,8 +480,6 @@ def get_recent_messages_with_timestamp(agent_id: str, limit: int = 10) -> List[D
|
|
|
471
480
|
'timestamp': msg.get('timestamp', 0),
|
|
472
481
|
'data_timestamp': data.get('timestamp', ''),
|
|
473
482
|
})
|
|
474
|
-
if len(messages) >= limit:
|
|
475
|
-
break
|
|
476
483
|
except json.JSONDecodeError:
|
|
477
484
|
continue
|
|
478
485
|
|
|
@@ -20,5 +20,5 @@
|
|
|
20
20
|
`).length:0),$=Q(()=>s.step.toolResult?o.value||!T.value?s.step.toolResult:s.step.toolResult.split(`
|
|
21
21
|
`).slice(0,10).join(`
|
|
22
22
|
`)+`
|
|
23
|
-
...`:""),x=Q(()=>s.step.type!=="toolResult"||s.step.toolResultStatus!=="error"?"":s.step.toolResultError?s.step.toolResultError:s.step.toolResult||"工具执行失败"),y=Q(()=>{if(s.step.type!=="toolResult"||s.step.toolResultStatus!=="error")return null;const q=(s.step.toolResultError||s.step.toolResult||"").toLowerCase(),A=(s.step.toolName||"").toLowerCase(),st=[];return(q.includes("enoent")||q.includes("no such file")||q.includes("文件不存在"))&&st.push("检查文件路径是否正确","确认文件是否存在"),(q.includes("eacces")||q.includes("permission")||q.includes("权限"))&&st.push("检查文件/目录权限","确认当前用户有访问权限"),(q.includes("timeout")||q.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 G(){if(v.value){const q=s.step.pairedToolCallId||s.step.id,A=s.step.pairedToolResultId||s.step.id;l("highlight-pair",{callId:q,resultId:A})}P()}function P(){S.value&&(i.value=!i.value)}function j(q){return q?new Date(q).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function Z(q){return q?q<1e3?`${q}ms`:q<6e4?`${(q/1e3).toFixed(1)}s`:`${(q/6e4).toFixed(1)}min`:"0ms"}function D(q){try{return JSON.stringify(q,null,2)}catch{return String(q)}}async function K(){if(s.step.toolResult)try{await navigator.clipboard.writeText(s.step.toolResult),alert("已复制到剪贴板")}catch{}}return(q,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:G},[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)):M("",!0),!i.value&&_.value?(c(),u("span",cr,f(_.value),1)):M("",!0),n("span",ur,f(j(t.step.timestamp)),1),t.step.duration&&t.step.duration>0?(c(),u("span",dr," +"+f(Z(t.step.duration)),1)):M("",!0),t.step.executionTime?(c(),u("span",fr," ⏱ "+f(Z(t.step.executionTime)),1)):M("",!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)])):M("",!0),v.value?(c(),u("span",{key:1,class:"pair-indicator",title:I.value}," 🔗 ",8,vr)):M("",!0),S.value?(c(),u("span",gr,f(i.value?"▼":"▶"),1)):M("",!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)])):M("",!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)])):M("",!0),t.step.type==="text"&&t.step.content?(c(),u("div",br,[n("pre",null,f(t.step.content),1)])):M("",!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(D(t.step.toolArguments)),1)])):M("",!0)])):M("",!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:K}," 复制 ")):M("",!0)]),t.step.toolResultStatus==="error"?(c(),u(Y,{key:0},[x.value?(c(),u("div",Sr,[n("div",xr,f(x.value),1),y.value?(c(),u("div",Ar,[A[5]||(A[5]=n("span",{class:"suggestion-label"},"💡 建议:",-1)),n("ul",null,[(c(!0),u(Y,null,ct(y.value,(st,mt)=>(c(),u("li",{key:mt},f(st),1))),128))])])):M("",!0)])):M("",!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($.value),3),T.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?"收起":`展开全部 (${O.value} 行)`),1)):M("",!0)])):M("",!0)],64)):(c(),u(Y,{key:1},[t.step.toolResult?(c(),u("div",Mr,[n("pre",{class:nt({truncated:!o.value})},f($.value),3),T.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?"收起":`展开全部 (${O.value} 行)`),1)):M("",!0)])):M("",!0)],64))])):M("",!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))])])):M("",!0)])):M("",!0)])):M("",!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)):M("",!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})):M("",!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)):M("",!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 y;return((y=s.value)==null?void 0:y.roundMode)&&s.value.rounds&&s.value.rounds.length>0}),v=Q(()=>{var w;const y=new Map;if(!((w=s.value)!=null&&w.rounds))return y;for(const G of s.value.rounds)for(const P of G.stepIds)y.set(P,G);return y}),p=Q(()=>{if(!s.value||!d.value)return[];const y=[],w=new Set;for(const G of s.value.steps){if(w.has(G.id))continue;const P=v.value.get(G.id);P?(y.push({type:"round",data:P}),P.stepIds.forEach(j=>w.add(j))):(y.push({type:"step",data:G}),w.add(G.id))}return y});async function C(){if(e.agentId){l.value=!0,i.value=null;try{let y=`/api/timeline/${e.agentId}?limit=100`;e.sessionKey&&(y+=`&session_key=${encodeURIComponent(e.sessionKey)}`);const w=await fetch(y);if(!w.ok)throw new Error(`HTTP ${w.status}`);s.value=await w.json()}catch(y){i.value=y instanceof Error?y.message:"加载失败",console.error("Timeline load error:",y)}finally{l.value=!1}}}function I(y){s.value&&s.value.steps[y]&&(s.value.steps[y].collapsed=!s.value.steps[y].collapsed)}function S(y){if(s.value){const w=s.value.steps.find(G=>G.id===y);w&&(w.collapsed=!w.collapsed)}}function _(y){o.value=y,setTimeout(()=>{o.value=null},3e3)}function T(y){return y?new Date(y).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function O(y){return y?y<1e3?`${y}ms`:y<6e4?`${(y/1e3).toFixed(1)}s`:`${(y/6e4).toFixed(1)}min`:"0ms"}function $(y){return y>=1e3?`${(y/1e3).toFixed(1)}k`:String(y)}Nt(C),Bt(()=>e.agentId,C);let x=null;return Bt([()=>e.autoRefresh,()=>e.refreshInterval],([y,w])=>{x&&(clearInterval(x),x=null),y&&w&&w>0&&(x=setInterval(C,w*1e3))},{immediate:!0}),(y,w)=>{var G,P,j,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)):M("",!0)])):M("",!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)),((G=s.value)==null?void 0:G.status)==="no_sessions"&&((P=s.value)!=null&&P.isMainAgent)?(c(),u("span",sc," 主 Agent 暂无会话记录 ")):((j=s.value)==null?void 0:j.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)):M("",!0)])):(c(),u("div",oc,[w[8]||(w[8]=Ii('<div class="timeline-legend" data-v-3b17c2f5><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>👤</span> 用户/回传</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>🧠</span> LLM 思考</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>🤖</span> LLM 回复</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>🔧</span> 工具调用</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>✅</span> 工具成功</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>❌</span> 工具失败</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>⚠️</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(T(s.value.startedAt)),1)):M("",!0)])):M("",!0),n("div",uc,[d.value?(c(!0),u(Y,{key:0},ct(p.value,(D,K)=>{var q;return c(),u(Y,{key:(D.type==="round",D.data.id)},[K>0?(c(),Gt(_n,{key:0})):M("",!0),D.type==="round"?(c(),Gt(Br,{key:1,round:D.data,steps:s.value.steps,highlightedPair:o.value,onHighlightPair:_},null,8,["round","steps","highlightedPair"])):(c(),u(Y,{key:2},[D.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)])])):M("",!0),D.data.type==="toolResult"&&D.data.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:D.data.toolResultStatus==="error",isActive:((q=o.value)==null?void 0:q.resultId)===D.data.id,executionTime:D.data.executionTime},null,8,["isError","isActive","executionTime"])):M("",!0),bt(mn,{step:D.data,highlightedPair:o.value,onToggleCollapse:A=>S(D.data.id),onHighlightPair:_},null,8,["step","highlightedPair","onToggleCollapse"])],64))],64)}),128)):(c(!0),u(Y,{key:1},ct(s.value.steps,(D,K)=>{var q;return c(),u(Y,{key:D.id},[K>0?(c(),Gt(_n,{key:0})):M("",!0),D.type==="toolResult"&&D.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:D.toolResultStatus==="error",isActive:((q=o.value)==null?void 0:q.resultId)===D.id,executionTime:D.executionTime},null,8,["isError","isActive","executionTime"])):M("",!0),bt(mn,{step:D,prevStep:s.value.steps[K-1],highlightedPair:o.value,onToggleCollapse:A=>I(K),onHighlightPair:_},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(O(s.value.stats.totalDuration)),1)]),n("div",gc,[w[5]||(w[5]=n("span",{class:"stat-label"},"Token",-1)),n("span",mc,f($(s.value.stats.totalInputTokens))+" / "+f($(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-3b17c2f5"]]),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)):M("",!0),t.node.status==="running"?(c(),u("div",Mc,[...a[1]||(a[1]=[n("div",{class:"progress-spinner"},null,-1)])])):M("",!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(()=>{var T;return{running:"🔄 进行中",completed:"✅ 已完成",error:"❌ 出错",empty:"空"}[((T=l.value)==null?void 0:T.status)||"empty"]||"未知"}),r=Q(()=>{var T;if(!((T=l.value)!=null&&T.nodes))return[];const _=["main","analyst","architect","devops"];return[...l.value.nodes].sort((O,$)=>{const x=_.findIndex(w=>O.role.includes(w)),y=_.findIndex(w=>$.role.includes(w));return x-y})});async function d(){o.value=!0;try{const _=await fetch("/api/chains?limit=10");if(_.ok){const T=await _.json();s.value=T.chains||[],l.value=T.activeChain||null}}catch(_){console.error("Chain load error:",_)}finally{o.value=!1}}function v(_){var T;i.value=((T=i.value)==null?void 0:T.agentId)===_.agentId?null:_}function p(_){return _?new Date(_).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):"-"}function C(_){return _?_<1e3?`${_}ms`:_<6e4?`${(_/1e3).toFixed(1)}s`:`${(_/6e4).toFixed(1)}min`:"-"}function I(_){return _?_>=1e3?`${(_/1e3).toFixed(1)}k`:String(_):"0"}let S=null;return Nt(()=>{d(),e.autoRefresh&&e.refreshInterval&&(S=setInterval(d,e.refreshInterval*1e3))}),ae(()=>{S&&(clearInterval(S),S=null)}),(_,T)=>{var O,$;return c(),u("div",jc,[n("div",Uc,[n("div",Vc,[T[0]||(T[0]=n("span",{class:"title"},"🔗 任务执行链路",-1)),l.value?(c(),u("span",Wc,f(l.value.projectId||"当前任务"),1)):M("",!0)]),n("div",Hc,[n("span",{class:nt(["status-badge",`status-${((O=l.value)==null?void 0:O.status)||"empty"}`])},f(a.value),3),n("button",{class:"refresh-btn",onClick:d,disabled:o.value},f(o.value?"加载中...":"🔄 刷新"),9,Bc)])]),o.value&&!l.value?(c(),u("div",Kc,[...T[1]||(T[1]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载链路数据...",-1)])])):!l.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,[l.value?(c(),u("div",zc,[T[3]||(T[3]=n("div",{class:"task-label"},"根任务",-1)),n("div",Jc,f(l.value.rootTask),1),n("div",Qc,[l.value.startedAt?(c(),u("span",Yc,"开始: "+f(p(l.value.startedAt)),1)):M("",!0)])])):M("",!0),l.value?(c(),u("div",Xc,[n("div",Zc,[(c(!0),u(Y,null,ct(r.value,(x,y)=>{var w,G;return c(),u(Y,{key:x.agentId},[y>0?(c(),Gt(Nc,{key:0,"from-status":(w=r.value[y-1])==null?void 0:w.status,"to-status":x.status},null,8,["from-status","to-status"])):M("",!0),bt(Ec,{node:x,"is-selected":((G=i.value)==null?void 0:G.agentId)===x.agentId,onClick:P=>v(x)},null,8,["node","is-selected","onClick"])],64)}),128))])])):M("",!0),l.value?(c(),u("div",tu,[n("div",eu,[n("div",{class:"progress-fill",style:St({width:`${l.value.progress*100}%`})},null,4)]),n("div",su,f(Math.round(l.value.progress*100))+"% ("+f(l.value.completedNodes)+"/"+f(l.value.totalNodes)+" 完成) ",1)])):M("",!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((($=rs(yn)[i.value.status])==null?void 0:$.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)])):M("",!0),n("div",cu,[n("div",uu,[T[5]||(T[5]=n("span",{class:"item-label"},"开始时间",-1)),n("span",du,f(i.value.startedAt?p(i.value.startedAt):"-"),1)]),n("div",fu,[T[6]||(T[6]=n("span",{class:"item-label"},"耗时",-1)),n("span",hu,f(C(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(I(i.value.tokenUsage.input)),1)]),n("div",mu,[T[8]||(T[8]=n("span",{class:"item-label"},"Token 输出",-1)),n("span",_u,f(I(i.value.tokenUsage.output)),1)])])):M("",!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)])):M("",!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,x=>(c(),u("div",{key:x,class:"artifact-item"}," 📄 "+f(x),1))),128))])])):M("",!0)])])):M("",!0)]))])}}}),Cu=Ct(wu,[["__scopeId","data-v-5e7f751f"]]),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 x={};for(const y of l.value)x[y.provider]||(x[y.provider]=[]),x[y.provider].push(y);return Object.entries(x).map(([y,w])=>({provider:y,models:w}))}),p=Q(()=>{var y;if(!((y=s.value)!=null&&y.model))return!1;const x=s.value.model;return r.value!==x.primary||JSON.stringify(d.value.filter(w=>w))!==JSON.stringify(x.fallbacks||[])});function C(x){return{idle:"空闲",working:"工作中",down:"异常"}[x]||x}function I(x){if(!x)return"";const y=x.split("/");return y.length>1?y[y.length-1]:x}async function S(){var x;i.value=!0,a.value="";try{const[y,w]=await Promise.all([fetch(`/api/agent-config/${e.agentId}`),fetch("/api/available-models")]);if(y.ok?(s.value=await y.json(),(x=s.value)!=null&&x.model&&(r.value=s.value.model.primary||"",d.value=[...s.value.model.fallbacks||[]])):a.value="加载配置失败",w.ok){const G=await w.json();l.value=G.models||[]}}catch(y){a.value="加载失败: "+y.message}finally{i.value=!1}}function _(){d.value.length<3&&d.value.push("")}function T(x){d.value.splice(x,1)}function O(){var x;(x=s.value)!=null&&x.model&&(r.value=s.value.model.primary||"",d.value=[...s.value.model.fallbacks||[]])}async function $(){if(p.value){o.value=!0;try{const x=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(y=>y)||null})});if(x.ok){const y=await x.json();s.value&&y.model&&(s.value.model=y.model),alert("模型配置已保存!重启 Agent 后生效。")}else{const y=await x.json();alert("保存失败: "+(y.detail||"未知错误"))}}catch(x){alert("保存失败: "+x.message)}finally{o.value=!1}}}return Bt(()=>e.agentId,()=>{S()},{immediate:!0}),Nt(()=>{S()}),(x,y)=>{var w;return c(),u("div",Tu,[n("div",Su,[y[1]||(y[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,[y[6]||(y[6]=n("h4",null,"基本信息",-1)),n("div",Eu,[n("div",Pu,[y[2]||(y[2]=n("span",{class:"label"},"ID",-1)),n("span",Du,f(s.value.id),1)]),n("div",Fu,[y[3]||(y[3]=n("span",{class:"label"},"名称",-1)),n("span",Lu,f(s.value.name),1)]),n("div",Ou,[y[4]||(y[4]=n("span",{class:"label"},"工作区",-1)),n("span",Nu,f(s.value.workspace||"未设置"),1)]),n("div",ju,[y[5]||(y[5]=n("span",{class:"label"},"状态",-1)),n("span",{class:nt(["value",`status-${s.value.status}`])},f(C(s.value.status)),3)])])]),n("div",Uu,[y[11]||(y[11]=n("h4",null,"模型配置",-1)),n("div",Vu,[n("div",Wu,[y[8]||(y[8]=n("label",null,"主模型 (Primary)",-1)),n("div",Hu,[Tt(n("select",{"onUpdate:modelValue":y[0]||(y[0]=G=>r.value=G),disabled:o.value,class:"model-select"},[y[7]||(y[7]=n("option",{value:""},"-- 选择模型 --",-1)),(c(!0),u(Y,null,ct(v.value,G=>(c(),u("optgroup",{key:G.provider,label:G.provider},[(c(!0),u(Y,null,ct(G.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)):M("",!0)])]),n("div",zu,[y[10]||(y[10]=n("label",null,"备选模型 (Fallbacks)",-1)),n("div",Ju,[(c(!0),u(Y,null,ct(d.value,(G,P)=>(c(),u("div",{key:P,class:"fallback-item"},[Tt(n("select",{"onUpdate:modelValue":j=>d.value[P]=j,disabled:o.value,class:"model-select small"},[y[9]||(y[9]=n("option",{value:""},"-- 选择 --",-1)),(c(!0),u(Y,null,ct(v.value,j=>(c(),u("optgroup",{key:j.provider,label:j.provider},[(c(!0),u(Y,null,ct(j.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:j=>T(P),disabled:o.value},"×",8,Zu)]))),128)),n("button",{class:"add-fallback-btn",onClick:_,disabled:o.value||d.value.length>=3}," + 添加备选模型 ",8,td)])]),n("div",ed,[n("button",{class:"save-btn",onClick:$,disabled:o.value||!p.value},f(o.value?"保存中...":"保存修改"),9,sd),n("button",{class:"reset-btn",onClick:O,disabled:o.value}," 重置 ",8,nd)])])]),s.value.description?(c(),u("div",ld,[y[12]||(y[12]=n("h4",null,"描述",-1)),n("p",id,f(s.value.description),1)])):M("",!0)])):M("",!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,_){return!S||S.length<=_?S||"":S.slice(0,_)+"..."}function p(S,_){return _?Math.round(S/_*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 _=await S.json();s.value=_.errors||[],l.value=_.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,_)=>{var T,O,$,x;return c(),u("div",rd,[n("div",cd,[_[0]||(_[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),_[1]||(_[1]=n("span",{class:"label"},"错误数",-1))]),(T=l.value.bySeverity)!=null&&T.critical?(c(),u("div",pd,[n("span",vd,f(l.value.bySeverity.critical),1),_[2]||(_[2]=n("span",{class:"label"},"严重",-1))])):M("",!0),(O=l.value.bySeverity)!=null&&O.high?(c(),u("div",gd,[n("span",md,f(l.value.bySeverity.high),1),_[3]||(_[3]=n("span",{class:"label"},"高",-1))])):M("",!0),($=l.value.bySeverity)!=null&&$.medium?(c(),u("div",_d,[n("span",yd,f(l.value.bySeverity.medium),1),_[4]||(_[4]=n("span",{class:"label"},"中",-1))])):M("",!0)])):M("",!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,(y,w)=>{var G,P;return c(),u("div",{key:w,class:nt(["error-item",`severity-${y.severity}`]),onClick:j=>C(w)},[n("div",Cd,[n("span",{class:"error-type",style:St({color:y.severityColor})},f(y.severityLabel)+" - "+f(y.errorTypeLabel),5),n("div",Td,[y.isArchived?(c(),u("span",Sd,"📦 归档")):M("",!0),y.provider?(c(),u("span",xd,f(y.provider),1)):M("",!0),y.model?(c(),u("span",Ad,f(y.model),1)):M("",!0)]),n("span",Id,f(d(y.timestamp)),1)]),n("div",Md,f(v(y.rawMessage,150)),1),o.value.has(w)?(c(),u("div",Rd,[n("div",Ed,[_[5]||(_[5]=n("h4",null,"错误信息",-1)),n("pre",Pd,f(y.rawMessage||"无详细信息"),1)]),(G=y.toolChain)!=null&&G.length?(c(),u("div",Dd,[_[6]||(_[6]=n("h4",null,"工具调用链(错误前)",-1)),n("div",Fd,[(c(!0),u(Y,null,ct(y.toolChain,(j,Z)=>(c(),u("div",{key:Z,class:"tool-item"},[n("span",Ld,f(Z+1),1),n("span",Od,f(j.toolName),1),n("span",Nd,f(d(j.timestamp)),1)]))),128))])])):M("",!0),(P=y.suggestions)!=null&&P.length?(c(),u("div",jd,[_[7]||(_[7]=n("h4",null,"修复建议",-1)),n("ul",Ud,[(c(!0),u(Y,null,ct(y.suggestions,(j,Z)=>(c(),u("li",{key:Z},f(j),1))),128))])])):M("",!0),n("div",Vd,[n("span",null,"Session: "+f(y.sessionFile),1),n("span",null,"Turn: "+f(y.turnIndex),1)])])):M("",!0)],10,wd)}),128))])):(c(),u("div",$d," ✅ 暂无错误记录 ")),(x=l.value)!=null&&x.byType&&Object.keys(l.value.byType).length>0?(c(),u("div",Wd,[_[8]||(_[8]=n("h4",null,"错误类型分布",-1)),n("div",Hd,[(c(!0),u(Y,null,ct(l.value.byType,(y,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(y,l.value.total)})},null,4)]),n("span",qd,f(y),1)]))),128))])])):M("",!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 O=e.agent.lastActiveAt||0,$=i.value-O;return $>Ef?{isStuck:!0,idleMinutes:Math.floor($/6e4),severity:"critical",label:"严重卡顿"}:$>Rf?{isStuck:!0,idleMinutes:Math.floor($/6e4),severity:"warning",label:"可能卡顿"}:null}),d=Q(()=>{var y;if(!((y=l.value)!=null&&y.archiveAtMs))return null;const O=l.value.archiveAtMs-i.value;if(O<=0)return"即将超时";const $=Math.floor(O/6e4),x=Math.floor(O%6e4/1e3);return`${$}分${x}秒`}),v=Q(()=>{if(!p.value.length)return null;const O=p.value[p.value.length-1];if(O.role==="toolResult"){const $=O.content[0];if($){const x=$.text||$.content||"";return{tool:O.toolName||"未知工具",status:$.status||"completed",result:x.slice(0,100)||"(无输出)"}}}return null}),p=W([]),C=W(!1);async function I(){var O;if((O=e.agent)!=null&&O.id){C.value=!0;try{const $=await fetch(`/api/agents/${e.agent.id}/output?limit=30`);if($.ok){const x=await $.json();p.value=x.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 O=await fetch("/api/chains?limit=10");if(O.ok){const x=(await O.json()).activeChain;if(x!=null&&x.nodes){const y=x.nodes.find(w=>w.agentId===e.agent.id);y&&y.status==="running"&&(l.value={runId:x.chainId,status:"running",startedAt:y.startedAt,archiveAtMs:x.archiveAtMs})}}}catch{}}async function _(){var O;if((O=l.value)!=null&&O.runId&&confirm("确定要取消这个任务吗?"))try{alert("取消功能需要 OpenClaw 支持,请使用命令行: openclaw subagents cancel "+l.value.runId)}catch($){console.error("Cancel failed:",$)}}function T(){I(),S()}return Bt(()=>{var O;return(O=e.agent)==null?void 0:O.id},()=>{I(),S()},{immediate:!0}),Bt(()=>e.agent.status,S),Nt(()=>{o=setInterval(()=>{i.value=Date.now()},1e3)}),ae(()=>{o&&(clearInterval(o),o=null)}),(O,$)=>(c(),u("div",{class:"panel-overlay",onClick:$[5]||($[5]=x=>O.$emit("close"))},[n("div",{class:"panel",onClick:$[4]||($[4]=le(()=>{},["stop"]))},[n("div",Jd,[n("h2",null,f(t.agent.name),1),n("button",{class:"close-btn",onClick:$[0]||($[0]=x=>O.$emit("close"))},"×")]),n("div",Qd,[n("div",Yd,[$[6]||($[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,[$[7]||($[7]=n("h3",null,"当前任务",-1)),n("p",null,f(t.agent.currentTask),1)])):M("",!0),t.agent.lastActiveFormatted?(c(),u("div",ef,[$[8]||($[8]=n("h3",null,"最后活跃",-1)),n("p",null,f(t.agent.lastActiveFormatted),1)])):M("",!0),t.agent.error?(c(),u("div",sf,[$[9]||($[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)])])):M("",!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,[$[10]||($[10]=n("span",{class:"item-label"},"无响应时间:",-1)),n("span",hf,f(r.value.idleMinutes)+" 分钟",1)]),v.value?(c(),u("div",pf,[$[11]||($[11]=n("span",{class:"item-label"},"最后操作:",-1)),n("span",vf,f(v.value.tool)+" → "+f(v.value.result),1)])):M("",!0),d.value?(c(),u("div",gf,[$[12]||($[12]=n("span",{class:"item-label"},"自动超时:",-1)),n("span",mf,f(d.value),1)])):M("",!0),$[13]||($[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:_}," 取消任务 ")):M("",!0),n("button",{class:"action-btn",onClick:T}," 刷新状态 ")])])],2)])):M("",!0),n("div",yf,[$[14]||($[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," ⚠️ 检测到错误 ")):M("",!0)])]),n("div",Cf,[n("div",Tf,[n("button",{class:nt(["tab-btn",{active:s.value==="timeline"}]),onClick:$[1]||($[1]=x=>s.value="timeline")}," 📊 时序视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="chain"}]),onClick:$[2]||($[2]=x=>s.value="chain")}," 🔗 链路视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="advanced"}]),onClick:$[3]||($[3]=x=>s.value="advanced")}," ⚙️ 高级 ",2)]),s.value==="timeline"?(c(),u("div",Sf,[bt(rs(wc),{agentId:t.agent.id,autoRefresh:!1},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,[$[15]||($[15]=n("h4",null,"⚙️ 配置",-1)),bt(ad,{agentId:t.agent.id},null,8,["agentId"])]),n("div",Mf,[$[16]||($[16]=n("h4",null,"🔍 错误分析",-1)),bt(zd,{agentId:t.agent.id},null,8,["agentId"])])])):M("",!0)])])])]))}}),Df=Ct(Pf,[["__scopeId","data-v-aec763c1"]]),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 _=JSON.parse(S);l.value=_.refreshInterval||10,i.value=_.autoRefreshEnabled!==!1,o.value=_.showTimestamps!==!1,a.value=_.showTokens!==!1,r.value=_.notifyOnError!==!1,d.value=_.notifyOnComplete||!1,v.value=_.logLines||100,p.value=_.autoScrollLog!==!1}catch(_){console.error("加载设置失败:",_)}}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,_)=>(c(),u("div",Ff,[n("div",Lf,[_[9]||(_[9]=n("h2",null,"设置",-1)),n("button",{class:"close-btn",onClick:_[0]||(_[0]=T=>S.$emit("close"))},"×")]),n("div",Of,[n("section",null,[_[12]||(_[12]=n("h3",null,"自动刷新",-1)),n("div",Nf,[_[10]||(_[10]=n("label",null,"刷新间隔(秒)",-1)),Tt(n("input",{type:"number","onUpdate:modelValue":_[1]||(_[1]=T=>l.value=T),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":_[2]||(_[2]=T=>i.value=T),onChange:I},null,544),[[Le,i.value]]),_[11]||(_[11]=At(" 启用自动刷新 ",-1))])])]),n("section",null,[_[15]||(_[15]=n("h3",null,"显示选项",-1)),n("div",Uf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":_[3]||(_[3]=T=>o.value=T),onChange:I},null,544),[[Le,o.value]]),_[13]||(_[13]=At(" 显示时间戳 ",-1))])]),n("div",Vf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":_[4]||(_[4]=T=>a.value=T),onChange:I},null,544),[[Le,a.value]]),_[14]||(_[14]=At(" 显示 Token 消耗 ",-1))])])]),n("section",null,[_[18]||(_[18]=n("h3",null,"通知",-1)),n("div",Wf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":_[5]||(_[5]=T=>r.value=T),onChange:I},null,544),[[Le,r.value]]),_[16]||(_[16]=At(" Agent 异常时通知 ",-1))])]),n("div",Hf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":_[6]||(_[6]=T=>d.value=T),onChange:I},null,544),[[Le,d.value]]),_[17]||(_[17]=At(" 任务完成时通知 ",-1))])])]),n("section",null,[_[22]||(_[22]=n("h3",null,"日志查看",-1)),n("div",Bf,[_[20]||(_[20]=n("label",null,"日志行数",-1)),Tt(n("select",{"onUpdate:modelValue":_[7]||(_[7]=T=>v.value=T),onChange:I},[..._[19]||(_[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":_[8]||(_[8]=T=>p.value=T),onChange:I},null,544),[[Le,p.value]]),_[21]||(_[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 j=0;for(let Z=0;Z<P.length;Z++)j=(j<<5)-j+P.charCodeAt(Z);return a[Math.abs(j)%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),_=Q(()=>{if(s.agentTasks&&s.agentTasks.length===1)return s.agentTasks[0].childAgentId}),T=Q(()=>({thinking:"🧠",tool_executing:"⚙️",waiting_llm:"📡",waiting_child:"⏳"})[s.subStatus||""]||"🔄"),O=Q(()=>{var j;return{"rate-limit":"请求过快","token-limit":"Token 超限",timeout:"请求超时",quota:"余额不足",unknown:"发生错误"}[((j=s.error)==null?void 0:j.type)||"unknown"]||"发生错误"}),$=Q(()=>{var j;return{waiting_for_child:"等待子代理响应",self_busy:"自身处理中",unknown:"原因未明"}[((j=s.stuckWarning)==null?void 0:j.reason)||"unknown"]||"原因未明"}),x=Q(()=>{if(!s.stuckWarning)return null;const P=s.stuckWarning.reason,j=s.stuckWarning.idleSeconds;return P==="waiting_for_child"?j>180?"子代理响应时间过长,建议检查子代理状态或考虑终止任务":"子代理正在执行任务,请耐心等待":P==="self_busy"?j>120?"任务处理时间过长,可能遇到复杂问题或外部资源阻塞":"正在处理复杂任务,请稍候":null});function y(P){const j=P.split("/");return j[j.length-1]||P}function w(){i.value=!0}function G(P){l("navigate-agent",P),i.value=!1}return(P,j)=>{var Z;return c(),u("div",{class:nt(["agent-card",[`status-${t.agent.status}`,{"is-main":t.isMain}]]),onClick:j[4]||(j[4]=D=>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)):M("",!0)],2)):M("",!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")):M("",!0)]),n("div",rh,[t.modelInfo&&t.modelInfo.primary?(c(),u("div",ch,[j[5]||(j[5]=n("span",{class:"model-label"},"模型",-1)),n("span",uh,f(y(t.modelInfo.primary)),1),(Z=t.modelInfo.fallbacks)!=null&&Z.length?(c(),u("span",{key:0,class:"model-fallbacks",title:"备用: "+t.modelInfo.fallbacks.map(y).join(", ")},[(c(!0),u(Y,null,ct(t.modelInfo.fallbacks.slice(0,2),(D,K)=>(c(),u("span",{key:D,class:"fallback-tag"},f(y(D)),1))),128)),t.modelInfo.fallbacks.length>2?(c(),u("span",fh,"+"+f(t.modelInfo.fallbacks.length-2),1)):M("",!0)],8,dh)):M("",!0)])):M("",!0),S.value&&!p.value?(c(),u("div",hh,[j[7]||(j[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),_.value?(c(),u("div",vh,[j[6]||(j[6]=n("span",{class:"child-arrow"},"→",-1)),n("span",gh,f(_.value),1)])):M("",!0)])):M("",!0),p.value?(c(),u("div",mh,[n("div",{class:"tasks-header",onClick:j[0]||(j[0]=le(D=>o.value=!o.value,["stop"]))},[j[8]||(j[8]=n("span",{class:"tasks-icon"},"📋",-1)),j[9]||(j[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,D=>(c(),u("div",{key:D.id,class:nt(["task-item",`task-status-${D.status}`])},[j[10]||(j[10]=n("span",{class:"task-status-dot"},null,-1)),n("span",{class:"task-name",title:D.name},f(D.name),9,bh),D.childAgentId?(c(),u("span",$h,"→ "+f(D.childAgentId),1)):M("",!0)],2))),128)),I.value>0?(c(),u("div",kh," +"+f(I.value)+" 更多任务 ",1)):M("",!0)],2)])):M("",!0),t.agent.status==="working"&&t.currentAction?(c(),u("div",{key:3,class:nt(["status-detail",`sub-status-${t.subStatus}`])},[n("span",wh,f(T.value),1),n("span",Ch,f(t.currentAction),1)],2)):t.agent.status==="idle"?(c(),u("div",Th," 空闲中,等待任务... ")):M("",!0)]),(c(),Gt(Po,{to:"body"},[i.value?(c(),u("div",{key:0,class:"warning-modal-overlay",onClick:j[3]||(j[3]=le(D=>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:j[1]||(j[1]=D=>i.value=!1)},"×")]),n("div",Mh,[t.error?(c(),u(Y,{key:0},[n("div",Rh,[j[11]||(j[11]=n("span",{class:"detail-label"},"类型",-1)),n("span",Eh,f(O.value),1)]),n("div",Ph,[j[12]||(j[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,[j[13]||(j[13]=n("span",{class:"detail-label"},"等待时间",-1)),n("span",Lh,f(t.stuckWarning.idleSeconds)+" 秒",1)]),t.stuckWarning.reason?(c(),u("div",Oh,[j[14]||(j[14]=n("span",{class:"detail-label"},"原因",-1)),n("span",Nh,f($.value),1)])):M("",!0),t.stuckWarning.reasonDetail?(c(),u("div",jh,[j[15]||(j[15]=n("span",{class:"detail-label"},"详情",-1)),n("span",Uh,f(t.stuckWarning.reasonDetail),1)])):M("",!0),t.stuckWarning.waitingFor?(c(),u("div",Vh,[j[16]||(j[16]=n("span",{class:"detail-label"},"等待对象",-1)),n("span",{class:"detail-value agent-link",onClick:j[2]||(j[2]=D=>G(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)):M("",!0)])])):M("",!0),x.value?(c(),u("div",Hh,[j[17]||(j[17]=n("span",{class:"suggestion-icon"},"💡",-1)),n("span",null,f(x.value),1)])):M("",!0)],64)):M("",!0)])])])):M("",!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),_=W({}),T=W({}),O=W(""),$=W(!0),x=W({}),y=W(null),w=W(null),G=W({});function P(g,m){m&&(G.value[g]=m)}const j=Q(()=>s.mainAgentId?s.mainAgentId:O.value?O.value:"main"),Z=Q(()=>a.value.filter(g=>g.type==="agent")),D=Q(()=>a.value.filter(g=>g.type==="model")),K=Q(()=>r.value.filter(g=>g.type==="delegates")),q=Q(()=>{const g={};for(const L of Z.value){const E=X(L.id);g[E]||(g[E]=[]),g[E].push(L)}const m={};return Object.keys(g).map(Number).sort((L,E)=>L-E).forEach(L=>{m[L]=g[L]}),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===j.value?"#4a9eff":st[g]||"#64748b"}const F=Q(()=>Z.value.map(g=>g.id).filter(Boolean)),U=Q(()=>({connected:"已连接",connecting:"连接中...",disconnected:"未连接",error:"连接错误"})[i.value.status]||"未知");function X(g){return g===j.value?T.value[g]??0:T.value[g]??1}function it(g){const m=Z.value.find(L=>L.id===g);return(m==null?void 0:m.name)||g}function V(g){var E;const m=N=>N==="error"?"down":N,L=g.id===j.value?s.mainAgent:(E=s.subAgents)==null?void 0:E.find(N=>N.id===g.id);if(L&&g.type==="agent"){const N=ot(g.id);let k;const J=g.status==="idle"||g.status==="error";J||((N==null?void 0:N.length)===1?k=N[0].name:N&&N.length>1&&(k=`${N.length} 个任务进行中`));const z=J?void 0:L.currentTask;return{name:L.name,status:m(g.status),currentTask:k??z,lastActiveFormatted:L.lastActiveFormatted}}return L?{name:L.name,status:L.status,currentTask:L.currentTask,lastActiveFormatted:L.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 L=g.id.toLowerCase();for(const[E,N]of Object.entries(v.value))if(E.toLowerCase()===L)return N}function ot(g){const m=x.value,L=m[g];if(L!=null&&L.length)return L;const E=g.toLowerCase();for(const[N,k]of Object.entries(m))if(N.toLowerCase()===E&&(k!=null&&k.length))return k}function lt(g){if(d.value.includes(g.id))return!0;const m=g.id.toLowerCase();return d.value.some(L=>L.toLowerCase()===m)}function ft(g){const m=d.value,L=E=>m.includes(E)||m.some(N=>N.toLowerCase()===E.toLowerCase());return L(g.source)&&L(g.target)}function tt(g){const m=G.value[g.source],L=G.value[g.target],E=y.value;if(!m||!L||!E)return"";const N=E.getBoundingClientRect(),k=m.getBoundingClientRect(),J=L.getBoundingClientRect(),z=k.left-N.left+k.width/2,et=k.top-N.top+k.height,at=J.left-N.left+J.width/2,dt=J.top-N.top,vt=(et+dt)/2;return`M ${z} ${et} C ${z} ${vt}, ${at} ${vt}, ${at} ${dt}`}function kt(){Me(()=>{if(!y.value||!w.value)return;const g=y.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 L=m.model||"(unknown)";g[L]||(g[L]=[]),g[L].push(m)}return g});function Dt(g){var E;const m=((E=g.metadata)==null?void 0:E.modelId)||"",L=m.split("/").pop()||m;return It.value[m]||It.value[L]||[]}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&&(_.value=m.hierarchy),m.depths&&(T.value=m.depths),m.mainAgentId&&(O.value=m.mainAgentId),m.agentActiveTasks&&(x.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&&(_.value=m.hierarchy),m.depths&&(T.value=m.depths),m.mainAgentId&&(O.value=m.mainAgentId),m.agentActiveTasks&&(x.value=m.agentActiveTasks),Me(kt)}function h(g){d.value=g.activePath||[],p.value=g.recentCalls||[],g.agentActiveTasks&&(x.value=g.agentActiveTasks);const m=a.value.filter(k=>k.type==="agent");for(const k of m){if(k.id&&g.agentStatuses&&g.agentStatuses[k.id]!==void 0&&(k.status=g.agentStatuses[k.id]),k.id&&g.agentDynamicStatuses&&g.agentDynamicStatuses[k.id]){const J=g.agentDynamicStatuses[k.id];k.subStatus=J.subStatus,k.currentAction=J.currentAction,k.toolName=J.toolName,k.waitingFor=J.waitingFor}if(k.id&&g.agentDisplayStatuses&&g.agentDisplayStatuses[k.id]){const J=g.agentDisplayStatuses[k.id];k.currentAction=J.display,k.metadata||(k.metadata={}),k.metadata={...k.metadata,duration:J.duration,alert:J.alert},J.alert?k.stuckWarning={isStuck:!0,idleSeconds:J.duration,lastUpdate:Date.now(),reason:"self_busy",reasonDetail:J.display}:k.stuckWarning&&!k.stuckWaitingForChildAgent&&(k.stuckWarning=void 0)}}const L=new Set(a.value.filter(k=>k.type==="task").map(k=>k.id)),E=new Set((g.taskNodes||[]).map(k=>k.id));if(L.size!==E.size||[...E].some(k=>!L.has(k))){const k=a.value.filter(z=>z.type==="model"),J=r.value.filter(z=>z.type==="delegates");a.value=[...m,...g.taskNodes||[],...k],r.value=[...J,...g.taskEdges||[]],Me(kt)}else{const k=new Map((g.taskNodes||[]).map(J=>[J.id,J]));for(const J of a.value.filter(z=>z.type==="task")){const z=k.get(J.id);z&&(J.status=z.status,J.name=z.name,z.timestamp&&(J.timestamp=z.timestamp))}}}async function b(){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 R=null,B=null;return Bt([Z,$],()=>{Me(kt)}),Nt(()=>{ye(),R=o("collaboration",Se),B=setInterval(b,Ep),window.addEventListener("resize",kt)}),ae(()=>{R&&R(),B&&clearInterval(B),window.removeEventListener("resize",kt)}),(g,m)=>{var L;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(F.value,E=>(c(),u("div",{key:E,class:"legend-item"},[n("span",{class:"legend-dot",style:St({background:mt(E)})},null,4),n("span",Qh,f(it(E)),1)]))),128))])):M("",!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:y},[(c(!0),u(Y,null,ct(q.value,(E,N)=>(c(),u("div",{key:N,class:"level-section"},[n("div",np,[n("span",lp,"L"+f(N),1),n("span",ip,f(A(Number(N))),1)]),n("div",op,[(c(!0),u(Y,null,ct(E,k=>(c(),u("div",{key:k.id,class:nt(["agent-card-wrapper",{"main-agent":k.id===j.value,active:lt(k),[`status-${k.status}`]:!0}]),style:St({"--agent-color":mt(k.id)}),ref_for:!0,ref:J=>P(k.id,J),onClick:J=>l("agent-click",k)},[bt(Kh,{agent:V(k),"model-info":H(k),"is-main":k.id===j.value,"current-task":k.currentTask,error:k.error,"stuck-warning":k.stuckWarning,"hierarchy-depth":X(k.id),"agent-color":mt(k.id),"sub-status":k.subStatus,"current-action":k.currentAction,"tool-name":k.toolName,"waiting-for":k.waitingFor,"agent-tasks":ot(k.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(K.value,E=>(c(),u("g",{key:E.id},[n("path",{d:tt(E),class:nt(["edge-path",{active:ft(E)}]),stroke:"#4a9eff","stroke-width":"2",fill:"none"},null,10,rp),ft(E)?(c(),u("circle",cp,[n("animateMotion",up,[n("mpath",{href:`#edge-${E.id}`},null,8,dp)])])):M("",!0)]))),128))],512))],512),D.value.length>0?(c(),u("div",fp,[n("div",{class:"model-panel-header",onClick:m[0]||(m[0]=E=>$.value=!$.value)},[m[9]||(m[9]=n("span",{class:"model-panel-title"},"🧠 模型",-1)),n("span",hp,f($.value?"▼":"▶"),1)]),Tt(n("div",pp,[(c(!0),u(Y,null,ct(D.value,E=>(c(),u("div",{key:E.id,class:nt(["model-card",{active:_e(E)}])},[n("div",vp,f(E.name),1),n("div",gp,[(c(!0),u(Y,null,ct(Dt(E).slice(0,8),N=>(c(),u("span",{key:N.id,class:"model-dot",style:St({background:mt(N.agentId)}),title:`${it(N.agentId)} @ ${N.model||"unknown"}`,onClick:le(k=>S.value=N,["stop"])},null,12,mp))),128))]),n("div",_p,f(Dt(E).length),1)],2))),128))],512),[[fs,$.value]])])):M("",!0)]))],512),S.value?(c(),u("div",{key:0,class:"call-detail-overlay",onClick:m[2]||(m[2]=le(E=>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]=E=>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((L=S.value.trigger)==null?void 0:L.replace(/^【完成回传】/,"")),1)])])])])):M("",!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(F=>{},300);const I=Q(()=>{let F=s.value;if(a.value.length>0&&(F=F.filter(U=>a.value.includes(U.status))),o.value){const U=o.value.toLowerCase();F=F.filter(X=>{var it;return X.name.toLowerCase().includes(U)||((it=X.agentName)==null?void 0:it.toLowerCase().includes(U))})}return F}),S=Q(()=>({total:s.value.length,running:s.value.filter(F=>F.status==="running").length,completed:s.value.filter(F=>F.status==="completed").length,failed:s.value.filter(F=>F.status==="failed").length,pending:s.value.filter(F=>F.status==="pending").length,cancelled:s.value.filter(F=>F.status==="cancelled").length}));function _(F){return{pending:"⏳",running:"🔄",completed:"✅",failed:"❌",cancelled:"🚫"}[F]||"📋"}function T(F){return s.value.filter(U=>U.status===F).length}function O(F){if(!F||!F.trim())return"未知";const U=F.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 F.trim()}function $(F){return!F||typeof F!="string"?"":F.replace(/\*\*/g,"").replace(/`([^`]+)`/g,"$1")}function x(F){if(!F.startTime)return"";const U=new Date(F.startTime).getTime(),X=F.endTime?new Date(F.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 y(F){const U=a.value.indexOf(F);U===-1?a.value.push(F):a.value.splice(U,1)}function w(F){a.value.length===1&&a.value[0]===F?a.value=[]:a.value=[F]}function G(F){const X=$(F.task??F.name).split(`
|
|
23
|
+
...`:""),x=Q(()=>s.step.type!=="toolResult"||s.step.toolResultStatus!=="error"?"":s.step.toolResultError?s.step.toolResultError:s.step.toolResult||"工具执行失败"),y=Q(()=>{if(s.step.type!=="toolResult"||s.step.toolResultStatus!=="error")return null;const q=(s.step.toolResultError||s.step.toolResult||"").toLowerCase(),A=(s.step.toolName||"").toLowerCase(),st=[];return(q.includes("enoent")||q.includes("no such file")||q.includes("文件不存在"))&&st.push("检查文件路径是否正确","确认文件是否存在"),(q.includes("eacces")||q.includes("permission")||q.includes("权限"))&&st.push("检查文件/目录权限","确认当前用户有访问权限"),(q.includes("timeout")||q.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 G(){if(v.value){const q=s.step.pairedToolCallId||s.step.id,A=s.step.pairedToolResultId||s.step.id;l("highlight-pair",{callId:q,resultId:A})}P()}function P(){S.value&&(i.value=!i.value)}function j(q){return q?new Date(q).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function Z(q){return q?q<1e3?`${q}ms`:q<6e4?`${(q/1e3).toFixed(1)}s`:`${(q/6e4).toFixed(1)}min`:"0ms"}function D(q){try{return JSON.stringify(q,null,2)}catch{return String(q)}}async function K(){if(s.step.toolResult)try{await navigator.clipboard.writeText(s.step.toolResult),alert("已复制到剪贴板")}catch{}}return(q,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:G},[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)):M("",!0),!i.value&&_.value?(c(),u("span",cr,f(_.value),1)):M("",!0),n("span",ur,f(j(t.step.timestamp)),1),t.step.duration&&t.step.duration>0?(c(),u("span",dr," +"+f(Z(t.step.duration)),1)):M("",!0),t.step.executionTime?(c(),u("span",fr," ⏱ "+f(Z(t.step.executionTime)),1)):M("",!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)])):M("",!0),v.value?(c(),u("span",{key:1,class:"pair-indicator",title:I.value}," 🔗 ",8,vr)):M("",!0),S.value?(c(),u("span",gr,f(i.value?"▼":"▶"),1)):M("",!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)])):M("",!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)])):M("",!0),t.step.type==="text"&&t.step.content?(c(),u("div",br,[n("pre",null,f(t.step.content),1)])):M("",!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(D(t.step.toolArguments)),1)])):M("",!0)])):M("",!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:K}," 复制 ")):M("",!0)]),t.step.toolResultStatus==="error"?(c(),u(Y,{key:0},[x.value?(c(),u("div",Sr,[n("div",xr,f(x.value),1),y.value?(c(),u("div",Ar,[A[5]||(A[5]=n("span",{class:"suggestion-label"},"💡 建议:",-1)),n("ul",null,[(c(!0),u(Y,null,ct(y.value,(st,mt)=>(c(),u("li",{key:mt},f(st),1))),128))])])):M("",!0)])):M("",!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($.value),3),T.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?"收起":`展开全部 (${O.value} 行)`),1)):M("",!0)])):M("",!0)],64)):(c(),u(Y,{key:1},[t.step.toolResult?(c(),u("div",Mr,[n("pre",{class:nt({truncated:!o.value})},f($.value),3),T.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?"收起":`展开全部 (${O.value} 行)`),1)):M("",!0)])):M("",!0)],64))])):M("",!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))])])):M("",!0)])):M("",!0)])):M("",!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)):M("",!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})):M("",!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)):M("",!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 y;return((y=s.value)==null?void 0:y.roundMode)&&s.value.rounds&&s.value.rounds.length>0}),v=Q(()=>{var w;const y=new Map;if(!((w=s.value)!=null&&w.rounds))return y;for(const G of s.value.rounds)for(const P of G.stepIds)y.set(P,G);return y}),p=Q(()=>{if(!s.value||!d.value)return[];const y=[],w=new Set;for(const G of s.value.steps){if(w.has(G.id))continue;const P=v.value.get(G.id);P?(y.push({type:"round",data:P}),P.stepIds.forEach(j=>w.add(j))):(y.push({type:"step",data:G}),w.add(G.id))}return y});async function C(){if(e.agentId){l.value=!0,i.value=null;try{let y=`/api/timeline/${e.agentId}?limit=100`;e.sessionKey&&(y+=`&session_key=${encodeURIComponent(e.sessionKey)}`);const w=await fetch(y);if(!w.ok)throw new Error(`HTTP ${w.status}`);s.value=await w.json()}catch(y){i.value=y instanceof Error?y.message:"加载失败",console.error("Timeline load error:",y)}finally{l.value=!1}}}function I(y){s.value&&s.value.steps[y]&&(s.value.steps[y].collapsed=!s.value.steps[y].collapsed)}function S(y){if(s.value){const w=s.value.steps.find(G=>G.id===y);w&&(w.collapsed=!w.collapsed)}}function _(y){o.value=y,setTimeout(()=>{o.value=null},3e3)}function T(y){return y?new Date(y).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function O(y){return y?y<1e3?`${y}ms`:y<6e4?`${(y/1e3).toFixed(1)}s`:`${(y/6e4).toFixed(1)}min`:"0ms"}function $(y){return y>=1e3?`${(y/1e3).toFixed(1)}k`:String(y)}Nt(C),Bt(()=>e.agentId,C);let x=null;return Bt([()=>e.autoRefresh,()=>e.refreshInterval],([y,w])=>{x&&(clearInterval(x),x=null),y&&w&&w>0&&(x=setInterval(C,w*1e3))},{immediate:!0}),(y,w)=>{var G,P,j,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)):M("",!0)])):M("",!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)),((G=s.value)==null?void 0:G.status)==="no_sessions"&&((P=s.value)!=null&&P.isMainAgent)?(c(),u("span",sc," 主 Agent 暂无会话记录 ")):((j=s.value)==null?void 0:j.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)):M("",!0)])):(c(),u("div",oc,[w[8]||(w[8]=Ii('<div class="timeline-legend" data-v-3b17c2f5><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>👤</span> 用户/回传</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>🧠</span> LLM 思考</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>🤖</span> LLM 回复</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>🔧</span> 工具调用</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>✅</span> 工具成功</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>❌</span> 工具失败</span><span class="legend-item" data-v-3b17c2f5><span class="legend-icon" data-v-3b17c2f5>⚠️</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(T(s.value.startedAt)),1)):M("",!0)])):M("",!0),n("div",uc,[d.value?(c(!0),u(Y,{key:0},ct(p.value,(D,K)=>{var q;return c(),u(Y,{key:(D.type==="round",D.data.id)},[K>0?(c(),Gt(_n,{key:0})):M("",!0),D.type==="round"?(c(),Gt(Br,{key:1,round:D.data,steps:s.value.steps,highlightedPair:o.value,onHighlightPair:_},null,8,["round","steps","highlightedPair"])):(c(),u(Y,{key:2},[D.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)])])):M("",!0),D.data.type==="toolResult"&&D.data.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:D.data.toolResultStatus==="error",isActive:((q=o.value)==null?void 0:q.resultId)===D.data.id,executionTime:D.data.executionTime},null,8,["isError","isActive","executionTime"])):M("",!0),bt(mn,{step:D.data,highlightedPair:o.value,onToggleCollapse:A=>S(D.data.id),onHighlightPair:_},null,8,["step","highlightedPair","onToggleCollapse"])],64))],64)}),128)):(c(!0),u(Y,{key:1},ct(s.value.steps,(D,K)=>{var q;return c(),u(Y,{key:D.id},[K>0?(c(),Gt(_n,{key:0})):M("",!0),D.type==="toolResult"&&D.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:D.toolResultStatus==="error",isActive:((q=o.value)==null?void 0:q.resultId)===D.id,executionTime:D.executionTime},null,8,["isError","isActive","executionTime"])):M("",!0),bt(mn,{step:D,prevStep:s.value.steps[K-1],highlightedPair:o.value,onToggleCollapse:A=>I(K),onHighlightPair:_},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(O(s.value.stats.totalDuration)),1)]),n("div",gc,[w[5]||(w[5]=n("span",{class:"stat-label"},"Token",-1)),n("span",mc,f($(s.value.stats.totalInputTokens))+" / "+f($(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-3b17c2f5"]]),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)):M("",!0),t.node.status==="running"?(c(),u("div",Mc,[...a[1]||(a[1]=[n("div",{class:"progress-spinner"},null,-1)])])):M("",!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(()=>{var T;return{running:"🔄 进行中",completed:"✅ 已完成",error:"❌ 出错",empty:"空"}[((T=l.value)==null?void 0:T.status)||"empty"]||"未知"}),r=Q(()=>{var T;if(!((T=l.value)!=null&&T.nodes))return[];const _=["main","analyst","architect","devops"];return[...l.value.nodes].sort((O,$)=>{const x=_.findIndex(w=>O.role.includes(w)),y=_.findIndex(w=>$.role.includes(w));return x-y})});async function d(){o.value=!0;try{const _=await fetch("/api/chains?limit=10");if(_.ok){const T=await _.json();s.value=T.chains||[],l.value=T.activeChain||null}}catch(_){console.error("Chain load error:",_)}finally{o.value=!1}}function v(_){var T;i.value=((T=i.value)==null?void 0:T.agentId)===_.agentId?null:_}function p(_){return _?new Date(_).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):"-"}function C(_){return _?_<1e3?`${_}ms`:_<6e4?`${(_/1e3).toFixed(1)}s`:`${(_/6e4).toFixed(1)}min`:"-"}function I(_){return _?_>=1e3?`${(_/1e3).toFixed(1)}k`:String(_):"0"}let S=null;return Nt(()=>{d(),e.autoRefresh&&e.refreshInterval&&(S=setInterval(d,e.refreshInterval*1e3))}),ae(()=>{S&&(clearInterval(S),S=null)}),(_,T)=>{var O,$;return c(),u("div",jc,[n("div",Uc,[n("div",Vc,[T[0]||(T[0]=n("span",{class:"title"},"🔗 任务执行链路",-1)),l.value?(c(),u("span",Wc,f(l.value.projectId||"当前任务"),1)):M("",!0)]),n("div",Hc,[n("span",{class:nt(["status-badge",`status-${((O=l.value)==null?void 0:O.status)||"empty"}`])},f(a.value),3),n("button",{class:"refresh-btn",onClick:d,disabled:o.value},f(o.value?"加载中...":"🔄 刷新"),9,Bc)])]),o.value&&!l.value?(c(),u("div",Kc,[...T[1]||(T[1]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载链路数据...",-1)])])):!l.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,[l.value?(c(),u("div",zc,[T[3]||(T[3]=n("div",{class:"task-label"},"根任务",-1)),n("div",Jc,f(l.value.rootTask),1),n("div",Qc,[l.value.startedAt?(c(),u("span",Yc,"开始: "+f(p(l.value.startedAt)),1)):M("",!0)])])):M("",!0),l.value?(c(),u("div",Xc,[n("div",Zc,[(c(!0),u(Y,null,ct(r.value,(x,y)=>{var w,G;return c(),u(Y,{key:x.agentId},[y>0?(c(),Gt(Nc,{key:0,"from-status":(w=r.value[y-1])==null?void 0:w.status,"to-status":x.status},null,8,["from-status","to-status"])):M("",!0),bt(Ec,{node:x,"is-selected":((G=i.value)==null?void 0:G.agentId)===x.agentId,onClick:P=>v(x)},null,8,["node","is-selected","onClick"])],64)}),128))])])):M("",!0),l.value?(c(),u("div",tu,[n("div",eu,[n("div",{class:"progress-fill",style:St({width:`${l.value.progress*100}%`})},null,4)]),n("div",su,f(Math.round(l.value.progress*100))+"% ("+f(l.value.completedNodes)+"/"+f(l.value.totalNodes)+" 完成) ",1)])):M("",!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((($=rs(yn)[i.value.status])==null?void 0:$.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)])):M("",!0),n("div",cu,[n("div",uu,[T[5]||(T[5]=n("span",{class:"item-label"},"开始时间",-1)),n("span",du,f(i.value.startedAt?p(i.value.startedAt):"-"),1)]),n("div",fu,[T[6]||(T[6]=n("span",{class:"item-label"},"耗时",-1)),n("span",hu,f(C(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(I(i.value.tokenUsage.input)),1)]),n("div",mu,[T[8]||(T[8]=n("span",{class:"item-label"},"Token 输出",-1)),n("span",_u,f(I(i.value.tokenUsage.output)),1)])])):M("",!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)])):M("",!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,x=>(c(),u("div",{key:x,class:"artifact-item"}," 📄 "+f(x),1))),128))])])):M("",!0)])])):M("",!0)]))])}}}),Cu=Ct(wu,[["__scopeId","data-v-5e7f751f"]]),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 x={};for(const y of l.value)x[y.provider]||(x[y.provider]=[]),x[y.provider].push(y);return Object.entries(x).map(([y,w])=>({provider:y,models:w}))}),p=Q(()=>{var y;if(!((y=s.value)!=null&&y.model))return!1;const x=s.value.model;return r.value!==x.primary||JSON.stringify(d.value.filter(w=>w))!==JSON.stringify(x.fallbacks||[])});function C(x){return{idle:"空闲",working:"工作中",down:"异常"}[x]||x}function I(x){if(!x)return"";const y=x.split("/");return y.length>1?y[y.length-1]:x}async function S(){var x;i.value=!0,a.value="";try{const[y,w]=await Promise.all([fetch(`/api/agent-config/${e.agentId}`),fetch("/api/available-models")]);if(y.ok?(s.value=await y.json(),(x=s.value)!=null&&x.model&&(r.value=s.value.model.primary||"",d.value=[...s.value.model.fallbacks||[]])):a.value="加载配置失败",w.ok){const G=await w.json();l.value=G.models||[]}}catch(y){a.value="加载失败: "+y.message}finally{i.value=!1}}function _(){d.value.length<3&&d.value.push("")}function T(x){d.value.splice(x,1)}function O(){var x;(x=s.value)!=null&&x.model&&(r.value=s.value.model.primary||"",d.value=[...s.value.model.fallbacks||[]])}async function $(){if(p.value){o.value=!0;try{const x=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(y=>y)||null})});if(x.ok){const y=await x.json();s.value&&y.model&&(s.value.model=y.model),alert("模型配置已保存!重启 Agent 后生效。")}else{const y=await x.json();alert("保存失败: "+(y.detail||"未知错误"))}}catch(x){alert("保存失败: "+x.message)}finally{o.value=!1}}}return Bt(()=>e.agentId,()=>{S()},{immediate:!0}),Nt(()=>{S()}),(x,y)=>{var w;return c(),u("div",Tu,[n("div",Su,[y[1]||(y[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,[y[6]||(y[6]=n("h4",null,"基本信息",-1)),n("div",Eu,[n("div",Pu,[y[2]||(y[2]=n("span",{class:"label"},"ID",-1)),n("span",Du,f(s.value.id),1)]),n("div",Fu,[y[3]||(y[3]=n("span",{class:"label"},"名称",-1)),n("span",Lu,f(s.value.name),1)]),n("div",Ou,[y[4]||(y[4]=n("span",{class:"label"},"工作区",-1)),n("span",Nu,f(s.value.workspace||"未设置"),1)]),n("div",ju,[y[5]||(y[5]=n("span",{class:"label"},"状态",-1)),n("span",{class:nt(["value",`status-${s.value.status}`])},f(C(s.value.status)),3)])])]),n("div",Uu,[y[11]||(y[11]=n("h4",null,"模型配置",-1)),n("div",Vu,[n("div",Wu,[y[8]||(y[8]=n("label",null,"主模型 (Primary)",-1)),n("div",Hu,[Tt(n("select",{"onUpdate:modelValue":y[0]||(y[0]=G=>r.value=G),disabled:o.value,class:"model-select"},[y[7]||(y[7]=n("option",{value:""},"-- 选择模型 --",-1)),(c(!0),u(Y,null,ct(v.value,G=>(c(),u("optgroup",{key:G.provider,label:G.provider},[(c(!0),u(Y,null,ct(G.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)):M("",!0)])]),n("div",zu,[y[10]||(y[10]=n("label",null,"备选模型 (Fallbacks)",-1)),n("div",Ju,[(c(!0),u(Y,null,ct(d.value,(G,P)=>(c(),u("div",{key:P,class:"fallback-item"},[Tt(n("select",{"onUpdate:modelValue":j=>d.value[P]=j,disabled:o.value,class:"model-select small"},[y[9]||(y[9]=n("option",{value:""},"-- 选择 --",-1)),(c(!0),u(Y,null,ct(v.value,j=>(c(),u("optgroup",{key:j.provider,label:j.provider},[(c(!0),u(Y,null,ct(j.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:j=>T(P),disabled:o.value},"×",8,Zu)]))),128)),n("button",{class:"add-fallback-btn",onClick:_,disabled:o.value||d.value.length>=3}," + 添加备选模型 ",8,td)])]),n("div",ed,[n("button",{class:"save-btn",onClick:$,disabled:o.value||!p.value},f(o.value?"保存中...":"保存修改"),9,sd),n("button",{class:"reset-btn",onClick:O,disabled:o.value}," 重置 ",8,nd)])])]),s.value.description?(c(),u("div",ld,[y[12]||(y[12]=n("h4",null,"描述",-1)),n("p",id,f(s.value.description),1)])):M("",!0)])):M("",!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,_){return!S||S.length<=_?S||"":S.slice(0,_)+"..."}function p(S,_){return _?Math.round(S/_*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 _=await S.json();s.value=_.errors||[],l.value=_.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,_)=>{var T,O,$,x;return c(),u("div",rd,[n("div",cd,[_[0]||(_[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),_[1]||(_[1]=n("span",{class:"label"},"错误数",-1))]),(T=l.value.bySeverity)!=null&&T.critical?(c(),u("div",pd,[n("span",vd,f(l.value.bySeverity.critical),1),_[2]||(_[2]=n("span",{class:"label"},"严重",-1))])):M("",!0),(O=l.value.bySeverity)!=null&&O.high?(c(),u("div",gd,[n("span",md,f(l.value.bySeverity.high),1),_[3]||(_[3]=n("span",{class:"label"},"高",-1))])):M("",!0),($=l.value.bySeverity)!=null&&$.medium?(c(),u("div",_d,[n("span",yd,f(l.value.bySeverity.medium),1),_[4]||(_[4]=n("span",{class:"label"},"中",-1))])):M("",!0)])):M("",!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,(y,w)=>{var G,P;return c(),u("div",{key:w,class:nt(["error-item",`severity-${y.severity}`]),onClick:j=>C(w)},[n("div",Cd,[n("span",{class:"error-type",style:St({color:y.severityColor})},f(y.severityLabel)+" - "+f(y.errorTypeLabel),5),n("div",Td,[y.isArchived?(c(),u("span",Sd,"📦 归档")):M("",!0),y.provider?(c(),u("span",xd,f(y.provider),1)):M("",!0),y.model?(c(),u("span",Ad,f(y.model),1)):M("",!0)]),n("span",Id,f(d(y.timestamp)),1)]),n("div",Md,f(v(y.rawMessage,150)),1),o.value.has(w)?(c(),u("div",Rd,[n("div",Ed,[_[5]||(_[5]=n("h4",null,"错误信息",-1)),n("pre",Pd,f(y.rawMessage||"无详细信息"),1)]),(G=y.toolChain)!=null&&G.length?(c(),u("div",Dd,[_[6]||(_[6]=n("h4",null,"工具调用链(错误前)",-1)),n("div",Fd,[(c(!0),u(Y,null,ct(y.toolChain,(j,Z)=>(c(),u("div",{key:Z,class:"tool-item"},[n("span",Ld,f(Z+1),1),n("span",Od,f(j.toolName),1),n("span",Nd,f(d(j.timestamp)),1)]))),128))])])):M("",!0),(P=y.suggestions)!=null&&P.length?(c(),u("div",jd,[_[7]||(_[7]=n("h4",null,"修复建议",-1)),n("ul",Ud,[(c(!0),u(Y,null,ct(y.suggestions,(j,Z)=>(c(),u("li",{key:Z},f(j),1))),128))])])):M("",!0),n("div",Vd,[n("span",null,"Session: "+f(y.sessionFile),1),n("span",null,"Turn: "+f(y.turnIndex),1)])])):M("",!0)],10,wd)}),128))])):(c(),u("div",$d," ✅ 暂无错误记录 ")),(x=l.value)!=null&&x.byType&&Object.keys(l.value.byType).length>0?(c(),u("div",Wd,[_[8]||(_[8]=n("h4",null,"错误类型分布",-1)),n("div",Hd,[(c(!0),u(Y,null,ct(l.value.byType,(y,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(y,l.value.total)})},null,4)]),n("span",qd,f(y),1)]))),128))])])):M("",!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 O=e.agent.lastActiveAt||0,$=i.value-O;return $>Ef?{isStuck:!0,idleMinutes:Math.floor($/6e4),severity:"critical",label:"严重卡顿"}:$>Rf?{isStuck:!0,idleMinutes:Math.floor($/6e4),severity:"warning",label:"可能卡顿"}:null}),d=Q(()=>{var y;if(!((y=l.value)!=null&&y.archiveAtMs))return null;const O=l.value.archiveAtMs-i.value;if(O<=0)return"即将超时";const $=Math.floor(O/6e4),x=Math.floor(O%6e4/1e3);return`${$}分${x}秒`}),v=Q(()=>{if(!p.value.length)return null;const O=p.value[p.value.length-1];if(O.role==="toolResult"){const $=O.content[0];if($){const x=$.text||$.content||"";return{tool:O.toolName||"未知工具",status:$.status||"completed",result:x.slice(0,100)||"(无输出)"}}}return null}),p=W([]),C=W(!1);async function I(){var O;if((O=e.agent)!=null&&O.id){C.value=!0;try{const $=await fetch(`/api/agents/${e.agent.id}/output?limit=30`);if($.ok){const x=await $.json();p.value=x.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 O=await fetch("/api/chains?limit=10");if(O.ok){const x=(await O.json()).activeChain;if(x!=null&&x.nodes){const y=x.nodes.find(w=>w.agentId===e.agent.id);y&&y.status==="running"&&(l.value={runId:x.chainId,status:"running",startedAt:y.startedAt,archiveAtMs:x.archiveAtMs})}}}catch{}}async function _(){var O;if((O=l.value)!=null&&O.runId&&confirm("确定要取消这个任务吗?"))try{alert("取消功能需要 OpenClaw 支持,请使用命令行: openclaw subagents cancel "+l.value.runId)}catch($){console.error("Cancel failed:",$)}}function T(){I(),S()}return Bt(()=>{var O;return(O=e.agent)==null?void 0:O.id},()=>{I(),S()},{immediate:!0}),Bt(()=>e.agent.status,S),Nt(()=>{o=setInterval(()=>{i.value=Date.now()},1e3)}),ae(()=>{o&&(clearInterval(o),o=null)}),(O,$)=>(c(),u("div",{class:"panel-overlay",onClick:$[5]||($[5]=x=>O.$emit("close"))},[n("div",{class:"panel",onClick:$[4]||($[4]=le(()=>{},["stop"]))},[n("div",Jd,[n("h2",null,f(t.agent.name),1),n("button",{class:"close-btn",onClick:$[0]||($[0]=x=>O.$emit("close"))},"×")]),n("div",Qd,[n("div",Yd,[$[6]||($[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,[$[7]||($[7]=n("h3",null,"当前任务",-1)),n("p",null,f(t.agent.currentTask),1)])):M("",!0),t.agent.lastActiveFormatted?(c(),u("div",ef,[$[8]||($[8]=n("h3",null,"最后活跃",-1)),n("p",null,f(t.agent.lastActiveFormatted),1)])):M("",!0),t.agent.error?(c(),u("div",sf,[$[9]||($[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)])])):M("",!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,[$[10]||($[10]=n("span",{class:"item-label"},"无响应时间:",-1)),n("span",hf,f(r.value.idleMinutes)+" 分钟",1)]),v.value?(c(),u("div",pf,[$[11]||($[11]=n("span",{class:"item-label"},"最后操作:",-1)),n("span",vf,f(v.value.tool)+" → "+f(v.value.result),1)])):M("",!0),d.value?(c(),u("div",gf,[$[12]||($[12]=n("span",{class:"item-label"},"自动超时:",-1)),n("span",mf,f(d.value),1)])):M("",!0),$[13]||($[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:_}," 取消任务 ")):M("",!0),n("button",{class:"action-btn",onClick:T}," 刷新状态 ")])])],2)])):M("",!0),n("div",yf,[$[14]||($[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," ⚠️ 检测到错误 ")):M("",!0)])]),n("div",Cf,[n("div",Tf,[n("button",{class:nt(["tab-btn",{active:s.value==="timeline"}]),onClick:$[1]||($[1]=x=>s.value="timeline")}," 📊 时序视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="chain"}]),onClick:$[2]||($[2]=x=>s.value="chain")}," 🔗 链路视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="advanced"}]),onClick:$[3]||($[3]=x=>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,[$[15]||($[15]=n("h4",null,"⚙️ 配置",-1)),bt(ad,{agentId:t.agent.id},null,8,["agentId"])]),n("div",Mf,[$[16]||($[16]=n("h4",null,"🔍 错误分析",-1)),bt(zd,{agentId:t.agent.id},null,8,["agentId"])])])):M("",!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 _=JSON.parse(S);l.value=_.refreshInterval||10,i.value=_.autoRefreshEnabled!==!1,o.value=_.showTimestamps!==!1,a.value=_.showTokens!==!1,r.value=_.notifyOnError!==!1,d.value=_.notifyOnComplete||!1,v.value=_.logLines||100,p.value=_.autoScrollLog!==!1}catch(_){console.error("加载设置失败:",_)}}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,_)=>(c(),u("div",Ff,[n("div",Lf,[_[9]||(_[9]=n("h2",null,"设置",-1)),n("button",{class:"close-btn",onClick:_[0]||(_[0]=T=>S.$emit("close"))},"×")]),n("div",Of,[n("section",null,[_[12]||(_[12]=n("h3",null,"自动刷新",-1)),n("div",Nf,[_[10]||(_[10]=n("label",null,"刷新间隔(秒)",-1)),Tt(n("input",{type:"number","onUpdate:modelValue":_[1]||(_[1]=T=>l.value=T),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":_[2]||(_[2]=T=>i.value=T),onChange:I},null,544),[[Le,i.value]]),_[11]||(_[11]=At(" 启用自动刷新 ",-1))])])]),n("section",null,[_[15]||(_[15]=n("h3",null,"显示选项",-1)),n("div",Uf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":_[3]||(_[3]=T=>o.value=T),onChange:I},null,544),[[Le,o.value]]),_[13]||(_[13]=At(" 显示时间戳 ",-1))])]),n("div",Vf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":_[4]||(_[4]=T=>a.value=T),onChange:I},null,544),[[Le,a.value]]),_[14]||(_[14]=At(" 显示 Token 消耗 ",-1))])])]),n("section",null,[_[18]||(_[18]=n("h3",null,"通知",-1)),n("div",Wf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":_[5]||(_[5]=T=>r.value=T),onChange:I},null,544),[[Le,r.value]]),_[16]||(_[16]=At(" Agent 异常时通知 ",-1))])]),n("div",Hf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":_[6]||(_[6]=T=>d.value=T),onChange:I},null,544),[[Le,d.value]]),_[17]||(_[17]=At(" 任务完成时通知 ",-1))])])]),n("section",null,[_[22]||(_[22]=n("h3",null,"日志查看",-1)),n("div",Bf,[_[20]||(_[20]=n("label",null,"日志行数",-1)),Tt(n("select",{"onUpdate:modelValue":_[7]||(_[7]=T=>v.value=T),onChange:I},[..._[19]||(_[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":_[8]||(_[8]=T=>p.value=T),onChange:I},null,544),[[Le,p.value]]),_[21]||(_[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 j=0;for(let Z=0;Z<P.length;Z++)j=(j<<5)-j+P.charCodeAt(Z);return a[Math.abs(j)%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),_=Q(()=>{if(s.agentTasks&&s.agentTasks.length===1)return s.agentTasks[0].childAgentId}),T=Q(()=>({thinking:"🧠",tool_executing:"⚙️",waiting_llm:"📡",waiting_child:"⏳"})[s.subStatus||""]||"🔄"),O=Q(()=>{var j;return{"rate-limit":"请求过快","token-limit":"Token 超限",timeout:"请求超时",quota:"余额不足",unknown:"发生错误"}[((j=s.error)==null?void 0:j.type)||"unknown"]||"发生错误"}),$=Q(()=>{var j;return{waiting_for_child:"等待子代理响应",self_busy:"自身处理中",unknown:"原因未明"}[((j=s.stuckWarning)==null?void 0:j.reason)||"unknown"]||"原因未明"}),x=Q(()=>{if(!s.stuckWarning)return null;const P=s.stuckWarning.reason,j=s.stuckWarning.idleSeconds;return P==="waiting_for_child"?j>180?"子代理响应时间过长,建议检查子代理状态或考虑终止任务":"子代理正在执行任务,请耐心等待":P==="self_busy"?j>120?"任务处理时间过长,可能遇到复杂问题或外部资源阻塞":"正在处理复杂任务,请稍候":null});function y(P){const j=P.split("/");return j[j.length-1]||P}function w(){i.value=!0}function G(P){l("navigate-agent",P),i.value=!1}return(P,j)=>{var Z;return c(),u("div",{class:nt(["agent-card",[`status-${t.agent.status}`,{"is-main":t.isMain}]]),onClick:j[4]||(j[4]=D=>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)):M("",!0)],2)):M("",!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")):M("",!0)]),n("div",rh,[t.modelInfo&&t.modelInfo.primary?(c(),u("div",ch,[j[5]||(j[5]=n("span",{class:"model-label"},"模型",-1)),n("span",uh,f(y(t.modelInfo.primary)),1),(Z=t.modelInfo.fallbacks)!=null&&Z.length?(c(),u("span",{key:0,class:"model-fallbacks",title:"备用: "+t.modelInfo.fallbacks.map(y).join(", ")},[(c(!0),u(Y,null,ct(t.modelInfo.fallbacks.slice(0,2),(D,K)=>(c(),u("span",{key:D,class:"fallback-tag"},f(y(D)),1))),128)),t.modelInfo.fallbacks.length>2?(c(),u("span",fh,"+"+f(t.modelInfo.fallbacks.length-2),1)):M("",!0)],8,dh)):M("",!0)])):M("",!0),S.value&&!p.value?(c(),u("div",hh,[j[7]||(j[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),_.value?(c(),u("div",vh,[j[6]||(j[6]=n("span",{class:"child-arrow"},"→",-1)),n("span",gh,f(_.value),1)])):M("",!0)])):M("",!0),p.value?(c(),u("div",mh,[n("div",{class:"tasks-header",onClick:j[0]||(j[0]=le(D=>o.value=!o.value,["stop"]))},[j[8]||(j[8]=n("span",{class:"tasks-icon"},"📋",-1)),j[9]||(j[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,D=>(c(),u("div",{key:D.id,class:nt(["task-item",`task-status-${D.status}`])},[j[10]||(j[10]=n("span",{class:"task-status-dot"},null,-1)),n("span",{class:"task-name",title:D.name},f(D.name),9,bh),D.childAgentId?(c(),u("span",$h,"→ "+f(D.childAgentId),1)):M("",!0)],2))),128)),I.value>0?(c(),u("div",kh," +"+f(I.value)+" 更多任务 ",1)):M("",!0)],2)])):M("",!0),t.agent.status==="working"&&t.currentAction?(c(),u("div",{key:3,class:nt(["status-detail",`sub-status-${t.subStatus}`])},[n("span",wh,f(T.value),1),n("span",Ch,f(t.currentAction),1)],2)):t.agent.status==="idle"?(c(),u("div",Th," 空闲中,等待任务... ")):M("",!0)]),(c(),Gt(Po,{to:"body"},[i.value?(c(),u("div",{key:0,class:"warning-modal-overlay",onClick:j[3]||(j[3]=le(D=>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:j[1]||(j[1]=D=>i.value=!1)},"×")]),n("div",Mh,[t.error?(c(),u(Y,{key:0},[n("div",Rh,[j[11]||(j[11]=n("span",{class:"detail-label"},"类型",-1)),n("span",Eh,f(O.value),1)]),n("div",Ph,[j[12]||(j[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,[j[13]||(j[13]=n("span",{class:"detail-label"},"等待时间",-1)),n("span",Lh,f(t.stuckWarning.idleSeconds)+" 秒",1)]),t.stuckWarning.reason?(c(),u("div",Oh,[j[14]||(j[14]=n("span",{class:"detail-label"},"原因",-1)),n("span",Nh,f($.value),1)])):M("",!0),t.stuckWarning.reasonDetail?(c(),u("div",jh,[j[15]||(j[15]=n("span",{class:"detail-label"},"详情",-1)),n("span",Uh,f(t.stuckWarning.reasonDetail),1)])):M("",!0),t.stuckWarning.waitingFor?(c(),u("div",Vh,[j[16]||(j[16]=n("span",{class:"detail-label"},"等待对象",-1)),n("span",{class:"detail-value agent-link",onClick:j[2]||(j[2]=D=>G(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)):M("",!0)])])):M("",!0),x.value?(c(),u("div",Hh,[j[17]||(j[17]=n("span",{class:"suggestion-icon"},"💡",-1)),n("span",null,f(x.value),1)])):M("",!0)],64)):M("",!0)])])])):M("",!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),_=W({}),T=W({}),O=W(""),$=W(!0),x=W({}),y=W(null),w=W(null),G=W({});function P(g,m){m&&(G.value[g]=m)}const j=Q(()=>s.mainAgentId?s.mainAgentId:O.value?O.value:"main"),Z=Q(()=>a.value.filter(g=>g.type==="agent")),D=Q(()=>a.value.filter(g=>g.type==="model")),K=Q(()=>r.value.filter(g=>g.type==="delegates")),q=Q(()=>{const g={};for(const L of Z.value){const E=X(L.id);g[E]||(g[E]=[]),g[E].push(L)}const m={};return Object.keys(g).map(Number).sort((L,E)=>L-E).forEach(L=>{m[L]=g[L]}),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===j.value?"#4a9eff":st[g]||"#64748b"}const F=Q(()=>Z.value.map(g=>g.id).filter(Boolean)),U=Q(()=>({connected:"已连接",connecting:"连接中...",disconnected:"未连接",error:"连接错误"})[i.value.status]||"未知");function X(g){return g===j.value?T.value[g]??0:T.value[g]??1}function it(g){const m=Z.value.find(L=>L.id===g);return(m==null?void 0:m.name)||g}function V(g){var E;const m=N=>N==="error"?"down":N,L=g.id===j.value?s.mainAgent:(E=s.subAgents)==null?void 0:E.find(N=>N.id===g.id);if(L&&g.type==="agent"){const N=ot(g.id);let k;const J=g.status==="idle"||g.status==="error";J||((N==null?void 0:N.length)===1?k=N[0].name:N&&N.length>1&&(k=`${N.length} 个任务进行中`));const z=J?void 0:L.currentTask;return{name:L.name,status:m(g.status),currentTask:k??z,lastActiveFormatted:L.lastActiveFormatted}}return L?{name:L.name,status:L.status,currentTask:L.currentTask,lastActiveFormatted:L.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 L=g.id.toLowerCase();for(const[E,N]of Object.entries(v.value))if(E.toLowerCase()===L)return N}function ot(g){const m=x.value,L=m[g];if(L!=null&&L.length)return L;const E=g.toLowerCase();for(const[N,k]of Object.entries(m))if(N.toLowerCase()===E&&(k!=null&&k.length))return k}function lt(g){if(d.value.includes(g.id))return!0;const m=g.id.toLowerCase();return d.value.some(L=>L.toLowerCase()===m)}function ft(g){const m=d.value,L=E=>m.includes(E)||m.some(N=>N.toLowerCase()===E.toLowerCase());return L(g.source)&&L(g.target)}function tt(g){const m=G.value[g.source],L=G.value[g.target],E=y.value;if(!m||!L||!E)return"";const N=E.getBoundingClientRect(),k=m.getBoundingClientRect(),J=L.getBoundingClientRect(),z=k.left-N.left+k.width/2,et=k.top-N.top+k.height,at=J.left-N.left+J.width/2,dt=J.top-N.top,vt=(et+dt)/2;return`M ${z} ${et} C ${z} ${vt}, ${at} ${vt}, ${at} ${dt}`}function kt(){Me(()=>{if(!y.value||!w.value)return;const g=y.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 L=m.model||"(unknown)";g[L]||(g[L]=[]),g[L].push(m)}return g});function Dt(g){var E;const m=((E=g.metadata)==null?void 0:E.modelId)||"",L=m.split("/").pop()||m;return It.value[m]||It.value[L]||[]}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&&(_.value=m.hierarchy),m.depths&&(T.value=m.depths),m.mainAgentId&&(O.value=m.mainAgentId),m.agentActiveTasks&&(x.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&&(_.value=m.hierarchy),m.depths&&(T.value=m.depths),m.mainAgentId&&(O.value=m.mainAgentId),m.agentActiveTasks&&(x.value=m.agentActiveTasks),Me(kt)}function h(g){d.value=g.activePath||[],p.value=g.recentCalls||[],g.agentActiveTasks&&(x.value=g.agentActiveTasks);const m=a.value.filter(k=>k.type==="agent");for(const k of m){if(k.id&&g.agentStatuses&&g.agentStatuses[k.id]!==void 0&&(k.status=g.agentStatuses[k.id]),k.id&&g.agentDynamicStatuses&&g.agentDynamicStatuses[k.id]){const J=g.agentDynamicStatuses[k.id];k.subStatus=J.subStatus,k.currentAction=J.currentAction,k.toolName=J.toolName,k.waitingFor=J.waitingFor}if(k.id&&g.agentDisplayStatuses&&g.agentDisplayStatuses[k.id]){const J=g.agentDisplayStatuses[k.id];k.currentAction=J.display,k.metadata||(k.metadata={}),k.metadata={...k.metadata,duration:J.duration,alert:J.alert},J.alert?k.stuckWarning={isStuck:!0,idleSeconds:J.duration,lastUpdate:Date.now(),reason:"self_busy",reasonDetail:J.display}:k.stuckWarning&&!k.stuckWaitingForChildAgent&&(k.stuckWarning=void 0)}}const L=new Set(a.value.filter(k=>k.type==="task").map(k=>k.id)),E=new Set((g.taskNodes||[]).map(k=>k.id));if(L.size!==E.size||[...E].some(k=>!L.has(k))){const k=a.value.filter(z=>z.type==="model"),J=r.value.filter(z=>z.type==="delegates");a.value=[...m,...g.taskNodes||[],...k],r.value=[...J,...g.taskEdges||[]],Me(kt)}else{const k=new Map((g.taskNodes||[]).map(J=>[J.id,J]));for(const J of a.value.filter(z=>z.type==="task")){const z=k.get(J.id);z&&(J.status=z.status,J.name=z.name,z.timestamp&&(J.timestamp=z.timestamp))}}}async function b(){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 R=null,B=null;return Bt([Z,$],()=>{Me(kt)}),Nt(()=>{ye(),R=o("collaboration",Se),B=setInterval(b,Ep),window.addEventListener("resize",kt)}),ae(()=>{R&&R(),B&&clearInterval(B),window.removeEventListener("resize",kt)}),(g,m)=>{var L;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(F.value,E=>(c(),u("div",{key:E,class:"legend-item"},[n("span",{class:"legend-dot",style:St({background:mt(E)})},null,4),n("span",Qh,f(it(E)),1)]))),128))])):M("",!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:y},[(c(!0),u(Y,null,ct(q.value,(E,N)=>(c(),u("div",{key:N,class:"level-section"},[n("div",np,[n("span",lp,"L"+f(N),1),n("span",ip,f(A(Number(N))),1)]),n("div",op,[(c(!0),u(Y,null,ct(E,k=>(c(),u("div",{key:k.id,class:nt(["agent-card-wrapper",{"main-agent":k.id===j.value,active:lt(k),[`status-${k.status}`]:!0}]),style:St({"--agent-color":mt(k.id)}),ref_for:!0,ref:J=>P(k.id,J),onClick:J=>l("agent-click",k)},[bt(Kh,{agent:V(k),"model-info":H(k),"is-main":k.id===j.value,"current-task":k.currentTask,error:k.error,"stuck-warning":k.stuckWarning,"hierarchy-depth":X(k.id),"agent-color":mt(k.id),"sub-status":k.subStatus,"current-action":k.currentAction,"tool-name":k.toolName,"waiting-for":k.waitingFor,"agent-tasks":ot(k.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(K.value,E=>(c(),u("g",{key:E.id},[n("path",{d:tt(E),class:nt(["edge-path",{active:ft(E)}]),stroke:"#4a9eff","stroke-width":"2",fill:"none"},null,10,rp),ft(E)?(c(),u("circle",cp,[n("animateMotion",up,[n("mpath",{href:`#edge-${E.id}`},null,8,dp)])])):M("",!0)]))),128))],512))],512),D.value.length>0?(c(),u("div",fp,[n("div",{class:"model-panel-header",onClick:m[0]||(m[0]=E=>$.value=!$.value)},[m[9]||(m[9]=n("span",{class:"model-panel-title"},"🧠 模型",-1)),n("span",hp,f($.value?"▼":"▶"),1)]),Tt(n("div",pp,[(c(!0),u(Y,null,ct(D.value,E=>(c(),u("div",{key:E.id,class:nt(["model-card",{active:_e(E)}])},[n("div",vp,f(E.name),1),n("div",gp,[(c(!0),u(Y,null,ct(Dt(E).slice(0,8),N=>(c(),u("span",{key:N.id,class:"model-dot",style:St({background:mt(N.agentId)}),title:`${it(N.agentId)} @ ${N.model||"unknown"}`,onClick:le(k=>S.value=N,["stop"])},null,12,mp))),128))]),n("div",_p,f(Dt(E).length),1)],2))),128))],512),[[fs,$.value]])])):M("",!0)]))],512),S.value?(c(),u("div",{key:0,class:"call-detail-overlay",onClick:m[2]||(m[2]=le(E=>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]=E=>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((L=S.value.trigger)==null?void 0:L.replace(/^【完成回传】/,"")),1)])])])])):M("",!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(F=>{},300);const I=Q(()=>{let F=s.value;if(a.value.length>0&&(F=F.filter(U=>a.value.includes(U.status))),o.value){const U=o.value.toLowerCase();F=F.filter(X=>{var it;return X.name.toLowerCase().includes(U)||((it=X.agentName)==null?void 0:it.toLowerCase().includes(U))})}return F}),S=Q(()=>({total:s.value.length,running:s.value.filter(F=>F.status==="running").length,completed:s.value.filter(F=>F.status==="completed").length,failed:s.value.filter(F=>F.status==="failed").length,pending:s.value.filter(F=>F.status==="pending").length,cancelled:s.value.filter(F=>F.status==="cancelled").length}));function _(F){return{pending:"⏳",running:"🔄",completed:"✅",failed:"❌",cancelled:"🚫"}[F]||"📋"}function T(F){return s.value.filter(U=>U.status===F).length}function O(F){if(!F||!F.trim())return"未知";const U=F.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 F.trim()}function $(F){return!F||typeof F!="string"?"":F.replace(/\*\*/g,"").replace(/`([^`]+)`/g,"$1")}function x(F){if(!F.startTime)return"";const U=new Date(F.startTime).getTime(),X=F.endTime?new Date(F.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 y(F){const U=a.value.indexOf(F);U===-1?a.value.push(F):a.value.splice(U,1)}function w(F){a.value.length===1&&a.value[0]===F?a.value=[]:a.value=[F]}function G(F){const X=$(F.task??F.name).split(`
|
|
24
24
|
`)[0].trim();return X.length<=60?X:X.slice(0,60)+"…"}function P(F){return{pending:"待分配",running:"执行中",completed:"已完成",failed:"失败",cancelled:"已取消"}[F]||F}async function j(){l.value=!0,i.value=null;try{const F=await fetch("/api/tasks");if(!F.ok)throw new Error("Failed to fetch tasks");const U=await F.json();s.value=(U.tasks||[]).map(X=>K(X))}catch(F){i.value=F.message}finally{l.value=!1}}function Z(F){return{pending:"pending",assigning:"pending",running:"running",in_progress:"running",active:"running",completed:"completed",success:"completed",failed:"failed",error:"failed",cancelled:"cancelled"}[F]||"pending"}function D(){j()}function K(F){const U=(F.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:F.id,name:F.name||"Unknown Task",task:F.task,status:Z(F.status),progress:F.progress??0,startTime:F.startTime,endTime:F.endTime,agentId:F.agentId,agentName:F.agentName,agentWorkspace:F.agentWorkspace,taskPath:F.taskPath,error:F.error,output:F.output,generatedFiles:F.generatedFiles,subtasks:U.length?U:void 0}}function q(F){const X=(Array.isArray(F)?F:F&&typeof F=="object"&&"tasks"in F?F.tasks??[]:[]).map(it=>K(it));X.length===0&&s.value.length>0||(s.value=X)}function A(F){return F?new Date(F).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}async function st(F){if(!F){v.value=[];return}p.value=!0;try{const U=await fetch(`/api/tasks/${F}/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,F=>{F?st(F.id):v.value=[]});let mt=null;return Nt(()=>{j(),mt=e("tasks",q)}),ae(()=>{mt&&mt()}),(F,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=>y(V.value)},f(V.label)+" ("+f(T(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:D,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(_(V.status)),3),n("div",tv,[n("div",ev,f(G(V)),1)]),V.agentName?(c(),u("span",sv,f(V.agentName),1)):M("",!0),V.startTime?(c(),u("span",nv,f(x(V)),1)):M("",!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($(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($(r.value.taskPath)),1)])):M("",!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(_(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)])):M("",!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)])):M("",!0),r.value.startTime?(c(),u("div",mv,[U[17]||(U[17]=n("span",{class:"detail-label"},"耗时",-1)),n("span",_v,f(x(r.value)),1)])):M("",!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)])])):M("",!0),r.value.status==="failed"?(c(),u("div",wv,[U[19]||(U[19]=n("span",{class:"detail-label"},"失败原因",-1)),n("span",Cv,f(O(r.value.error)),1)])):M("",!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))])])):M("",!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($(r.value.output)),1)])):M("",!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(_(V.status)),3),n("span",null,f(V.name),1),V.status==="failed"?(c(),u("span",Rv,f(O(V.error)),1)):M("",!0)]))),128))])])):M("",!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))])])])):M("",!0)])])])):M("",!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}),_=Q(()=>S.value.reduce((V,H)=>V+H.tokens,0)),T=W({current:{tpm:0,rpm:0,windowTotal:{tokens:0,requests:0}},history:{tpm:[],rpm:[],timestamps:[]},statistics:{avgTpm:0,peakTpm:0,peakTime:""}}),O=[{value:"20m",label:"20分钟"},{value:"1h",label:"1小时"},{value:"24h",label:"24小时"}],$=Q(()=>{const V=O.find(H=>H.value===l.value);return V?`最近 ${V.label}`:""}),x=Q(()=>{switch(l.value){case"20m":return 20;case"1h":return 60;case"24h":return 24;default:return 20}}),y=Q(()=>{const V=T.value.history,H=x.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=y.value.map(lt=>lt[V]);return Math.max(...H,1)*1.2}function G(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 j=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 D(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 K(V){return i.value.some(H=>H.type===V&&!H.acknowledged)}function q(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();T.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)??""}},j.value=Date.now(),st()}catch(Se){s.value=Se.message}finally{e.value=!1}}function st(){const{current:V}=T.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 F(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=`${D(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||D(V.timestamp)} 调用详情`):r.value={timeWindow:D(V.timestamp),calls:[],totalCalls:0,totalTokens:0,summary:{avgTokens:0}}}catch{r.value={timeWindow:D(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(O,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(T.value.current.tpm)),1),H[9]||(H[9]=n("div",{class:"metric-unit"},"Tokens/分钟",-1))]),K("high_tpm")?(c(),u("div",Jv,"⚠️")):M("",!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(T.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(T.value.current.windowTotal.tokens)),1),n("div",sg,f($.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(T.value.current.windowTotal.requests)),1),n("div",og,f($.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(j.value)),1)]),n("div",dg,[n("div",fg,[(c(!0),u(Y,null,ct(y.value,(tt,kt)=>(c(),u("div",{key:kt,class:"chart-bar clickable",style:St({height:`${G(tt.tpm,w("tpm"))}%`}),title:`${D(tt.timestamp)}: ${P(tt.tpm)} TPM - 点击查看详情`,onClick:It=>F(tt)},[n("span",pg,f(P(tt.tpm)),1),n("span",vg,f(D(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(j.value)),1)]),n("div",yg,[n("div",bg,[(c(!0),u(Y,null,ct(y.value,(tt,kt)=>(c(),u("div",{key:kt,class:"chart-bar clickable",style:St({height:`${G(tt.rpm,w("rpm"))}%`}),title:`${D(tt.timestamp)}: ${tt.rpm} RPM - 点击查看调用详情`,onClick:It=>F(tt)},[n("span",kg,f(tt.rpm),1),n("span",wg,f(D(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(T.value.statistics.avgTpm)),1)]),n("div",Ag,[H[21]||(H[21]=n("span",{class:"summary-label"},"峰值 TPM",-1)),n("span",Ig,f(P(T.value.statistics.peakTpm)),1),T.value.statistics.peakTime?(c(),u("span",Mg,"峰值时间: "+f(T.value.statistics.peakTime),1)):M("",!0)]),n("div",Rg,[H[22]||(H[22]=n("span",{class:"summary-label"},"时间窗口",-1)),n("span",Eg,f($.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(_.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)])])):M("",!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,"完成回传")):M("",!0),At(" "+f((Dt=tt.trigger)==null?void 0:Dt.replace(/^【完成回传】/,"")),1)],8,qg),tt.model?(c(),u("div",zg,"模型: "+f(tt.model),1)):M("",!0)])}),128))])):(c(),u("div",Jg,"该时段无调用记录"))])])])):M("",!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(D(tt.timestamp)),1),n("button",{class:"ack-btn",onClick:kt=>q(tt.id)},"确认",8,em)],2))),128))])])):M("",!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 O=[...e.value.trend.input,...e.value.trend.output];return Math.max(...O,1)}),v=Q(()=>[...e.value.byAgent||[]].sort((O,$)=>$.total-O.total));function p(O,$){return Math.max(O/$*100,2)}function C(O){const $=new Date(O);return o.value==="24h"?$.toLocaleString("zh-CN",{hour:"2-digit",hour12:!1})+":00":$.toLocaleString("zh-CN",{hour:"2-digit",minute:"2-digit",hour12:!1})}function I(O){return O==null?"0":O>=1e6?(O/1e6).toFixed(2)+"M":O>=1e3?(O/1e3).toFixed(1)+"K":O.toLocaleString()}function S(O){return O==null?"0%":(O*100).toFixed(1)+"%"}function _(O){return O==null?"0.00":O>=1?O.toFixed(2):O.toFixed(4)}async function T(){s.value=!0,l.value="";try{const O=await fetch(`/api/tokens/analysis?range=${o.value}`);O.ok?e.value=await O.json():l.value="加载失败"}catch(O){l.value=String(O)}finally{s.value=!1}}return Nt(T),Bt(o,T),(O,$)=>{var x,y,w,G,P,j,Z,D,K,q,A,st,mt;return c(),u("section",lm,[n("div",im,[$[2]||($[2]=n("h2",null,"Token 分析",-1)),n("div",om,[(c(),u(Y,null,ct(a,F=>n("button",{key:F.value,class:nt(["range-btn",{active:o.value===F.value}]),onClick:U=>o.value=F.value},f(F.label),11,am)),64))])]),s.value?(c(),u("div",rm,[...$[3]||($[3]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载 Token 数据...",-1)])])):l.value?(c(),u("div",cm,[$[4]||($[4]=n("span",{class:"error-icon"},"⚠️",-1)),n("span",null,f(l.value),1),n("button",{onClick:T,class:"retry-btn"},"重试")])):(c(),u(Y,{key:2},[n("div",um,[n("div",dm,[$[6]||($[6]=n("div",{class:"card-icon"},"📥",-1)),n("div",fm,[$[5]||($[5]=n("div",{class:"card-label"},"Input",-1)),n("div",hm,f(I((x=e.value.summary)==null?void 0:x.input)),1)])]),n("div",pm,[$[8]||($[8]=n("div",{class:"card-icon"},"📤",-1)),n("div",vm,[$[7]||($[7]=n("div",{class:"card-label"},"Output",-1)),n("div",gm,f(I((y=e.value.summary)==null?void 0:y.output)),1)])]),n("div",mm,[$[10]||($[10]=n("div",{class:"card-icon"},"💾",-1)),n("div",_m,[$[9]||($[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((G=e.value.summary)==null?void 0:G.cacheHitRate)),1)])]),n("div",$m,[$[12]||($[12]=n("div",{class:"card-icon"},"📝",-1)),n("div",km,[$[11]||($[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,[$[14]||($[14]=n("div",{class:"card-icon"},"💰",-1)),n("div",Tm,[$[13]||($[13]=n("div",{class:"card-label"},"估算成本",-1)),n("div",Sm,"$"+f(_((j=e.value.cost)==null?void 0:j.total)),1),((Z=e.value.cost)==null?void 0:Z.saved)>0?(c(),u("div",xm,"节省 $"+f(_((D=e.value.cost)==null?void 0:D.saved)),1)):M("",!0)])])]),e.value.trend&&r.value?(c(),u("div",Am,[$[16]||($[16]=n("h3",null,"Token 消耗趋势",-1)),n("div",Im,[n("div",Mm,[(c(!0),u(Y,null,ct(e.value.trend.timestamps,(F,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)):M("",!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)):M("",!0)],4),n("span",Pm,f(C(F)),1)]))),128))]),$[15]||($[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))])])):M("",!0),n("div",Dm,[n("button",{class:nt({active:i.value==="table"}),onClick:$[0]||($[0]=F=>i.value="table")},"📊 表格",2),n("button",{class:nt({active:i.value==="chart"}),onClick:$[1]||($[1]=F=>i.value="chart")},"📈 图表",2)]),i.value==="table"?(c(),u("div",Fm,[n("table",null,[$[19]||($[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,F=>(c(),u("tr",{key:F.agent},[n("td",Lm,f(F.agent),1),n("td",null,f(I(F.input)),1),n("td",null,f(I(F.output)),1),n("td",null,f(I(F.cacheRead+F.cacheWrite)),1),n("td",Om,f(I(F.total)),1),n("td",null,[n("div",Nm,[n("div",{class:"percent-fill",style:St({width:F.percent*100+"%"})},null,4),n("span",jm,f(S(F.percent)),1)])])]))),128))]),n("tfoot",null,[n("tr",null,[$[17]||($[17]=n("td",null,[n("strong",null,"合计")],-1)),n("td",null,f(I((K=e.value.summary)==null?void 0:K.input)),1),n("td",null,f(I((q=e.value.summary)==null?void 0:q.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)]),$[18]||($[18]=n("td",null,"100%",-1))])])])])):(c(),u("div",Vm,[$[20]||($[20]=n("h3",null,"Token 消耗分布",-1)),n("div",Wm,[(c(!0),u(Y,null,ct(v.value,F=>(c(),u("div",{key:F.agent,class:"bar-row"},[n("div",Hm,f(F.agent),1),n("div",Bm,[n("div",{class:"bar",style:St({width:F.percent*100+"%"})},[n("span",Km,f(I(F.total)),1)],4)]),n("div",qm,f(S(F.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(D=>D.status==="healthy").length),S=Q(()=>{var D;return Math.max(...((D=i.value.hourlyTrend)==null?void 0:D.map(K=>K.count))||[1],1)});function _(D){return D/S.value*100}function T(D){const K=i.value.totalCount||1;return D/K*100}function O(D){var K;return((K=C[D])==null?void 0:K.color)||"#6b7280"}function $(D){const K=D.match(/(\d{2}):00/);return K?K[1]+"h":""}function x(D){if(!D)return"-";const q=Date.now()-D,A=Math.floor(q/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 y(D,K){return D?D.length>K?D.slice(0,K)+"...":D:"-"}function w(D){return{healthy:"正常",degraded:"降级",down:"异常"}[D]||"未知"}function G(D){const K=p.value.find(q=>q.id===D);return K?K.name:D}function P(D){r.value=r.value===D?null:D}async function j(){try{const D=await fetch("/api/agents");if(D.ok){const K=await D.json();p.value=(Array.isArray(K)?K:[]).map(q=>({id:q.id,name:q.name||q.id}))}}catch(D){console.error("Failed to load agents:",D)}}async function Z(){o.value=!0,a.value="";try{const D=new URLSearchParams;d.value&&D.set("agent",d.value),v.value&&D.set("type",v.value);const[K,q]=await Promise.all([fetch(`/api/errors/summary?${D.toString()}`),fetch("/api/errors/stats")]);if(K.ok){const A=await K.json();e.value=A.sessionErrors||[],s.value=A.modelFailures||[],l.value=A.apiStatus||[]}q.ok&&(i.value=await q.json())}catch(D){a.value=String(D)}finally{o.value=!1}}return Nt(()=>{j(),Z()}),(D,K)=>{var q;return c(),u("section",e1,[n("div",s1,[K[4]||(K[4]=n("h2",null,"错误中心",-1)),n("div",n1,[Tt(n("select",{"onUpdate:modelValue":K[0]||(K[0]=A=>d.value=A),onChange:Z,class:"filter-select"},[K[2]||(K[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":K[1]||(K[1]=A=>v.value=A),onChange:Z,class:"filter-select"},[K[3]||(K[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),K[5]||(K[5]=n("div",{class:"stat-label"},"总错误数",-1))]),n("div",c1,[n("div",u1,f(i.value.sessionErrorCount),1),K[6]||(K[6]=n("div",{class:"stat-label"},"Session 错误",-1))]),n("div",d1,[n("div",f1,f(i.value.modelFailureCount),1),K[7]||(K[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),K[8]||(K[8]=n("div",{class:"stat-label"},"API 健康",-1))],2)]),(q=i.value.hourlyTrend)!=null&&q.length?(c(),u("div",p1,[K[9]||(K[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:_(A.count)+"%"}),title:`${A.hour}: ${A.count} 个错误`},[A.count>0?(c(),u("span",m1,f(A.count),1)):M("",!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?$(A.hour):""),1))),128))])])):M("",!0),Object.keys(i.value.byType||{}).length?(c(),u("div",y1,[K[10]||(K[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:T(A.count)+"%",background:A.color})},null,4)]),n("span",w1,f(A.count),1)]))),128))])])):M("",!0),l.value.length?(c(),u("div",C1,[K[11]||(K[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(x(A.lastError.timestamp)),1)])):M("",!0),A.errorCount>0?(c(),u("div",D1," 错误: "+f(A.errorCount)+" 次 ",1)):M("",!0)],2))),128))])])):M("",!0),n("div",F1,[n("div",L1,[n("h3",null,[K[12]||(K[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(G(A.agentId)),1),n("span",{class:"error-type",style:St({color:O(A.type)})},f(A.typeLabel),5),n("span",H1,f(y(A.message,80)),1),n("span",B1,f(x(A.timestamp)),1),n("span",K1,f(r.value===A.id?"▼":"▶"),1)]),r.value===A.id?(c(),u("div",q1,[n("div",G1,[K[13]||(K[13]=n("span",{class:"detail-label"},"时间:",-1)),n("span",null,f(A.datetime),1)]),n("div",z1,[K[14]||(K[14]=n("span",{class:"detail-label"},"完整信息:",-1)),n("span",J1,f(A.fullMessage||A.message),1)])])):M("",!0)],10,U1))),128))])):(c(),u("div",N1,"暂无错误"))]),n("div",Q1,[n("h3",null,[K[15]||(K[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:O(A.type)})},f(A.typeLabel),5),n("span",n_,f(y(A.message,80)),1),n("span",l_,f(x(A.timestamp)),1),n("span",i_,f(r.value===A.id?"▼":"▶"),1)]),r.value===A.id?(c(),u("div",o_,[n("div",a_,[K[16]||(K[16]=n("span",{class:"detail-label"},"时间:",-1)),n("span",null,f(A.datetime),1)]),n("div",r_,[K[17]||(K[17]=n("span",{class:"detail-label"},"完整信息:",-1)),n("span",c_,f(A.fullMessage||A.message),1)])])):M("",!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)])):M("",!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)])):M("",!0)])):M("",!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,G]=await Promise.all([fetch("/api/agents"),fetch("/api/config").catch(()=>null)]),P=await w.json();if(i.value=Array.isArray(P)?P:[],G!=null&&G.ok){const D=await G.json();p.value=D&&D.mainAgentId||"main"}const j=Array.isArray(i.value)?i.value:[],Z=j.find(D=>D.id===p.value);Z&&(v.value=Z),C.value=j.filter(D=>D.id!==p.value)}catch(w){console.error("刷新数据失败:",w)}}function S(w){o.value=w}function _(w){const G=w.id===p.value?v.value:C.value.find(P=>P.id===w.id);S(G||{id:w.id,name:w.name,role:w.id===p.value?"主 Agent":"子 Agent",status:w.status==="error"?"down":w.status})}function T(w){I()}function O(w){r.value=w}let $=null,x=null,y=null;return Nt(()=>{I(),e.connect(),$=e.onStateChange(O),x=e.subscribe("agents",w=>{if(Array.isArray(w)){i.value=w;const G=w.find(P=>P.id===p.value);v.value=G||null,C.value=w.filter(P=>P.id!==p.value)}}),y=e.subscribe("agents_update",w=>{if(Array.isArray(w)){w.forEach(P=>{const j=i.value.findIndex(Z=>Z.id===P.id);j>=0&&(i.value[j]={...i.value[j],...P})});const G=i.value.find(P=>P.id===p.value);G&&(v.value=G),C.value=i.value.filter(P=>P.id!==p.value)}})}),ae(()=>{$==null||$(),x==null||x(),y==null||y(),e.disconnect()}),(w,G)=>(c(),u("div",w_,[n("header",null,[G[3]||(G[3]=n("h1",null,"OpenClaw Agent Dashboard",-1)),n("div",C_,[bt(k_),n("button",{onClick:I},"刷新"),n("button",{onClick:G[0]||(G[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:_},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:G[1]||(G[1]=P=>a.value=!1),onSettingsChanged:T})):M("",!0),o.value?(c(),Gt(Df,{key:1,agent:o.value,onClose:G[2]||(G[2]=P=>o.value=null)},null,8,["agent"])):M("",!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-3b17c2f5]{background:#fff;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden}.timeline-header[data-v-3b17c2f5]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#f9fafb;border-bottom:1px solid #e5e7eb}.header-left[data-v-3b17c2f5]{display:flex;align-items:center;gap:12px}.title[data-v-3b17c2f5]{font-weight:600;font-size:14px;color:#374151}.agent-info[data-v-3b17c2f5]{font-size:13px;color:#6b7280}.agent-info .model[data-v-3b17c2f5]{color:#9ca3af}.header-right[data-v-3b17c2f5]{display:flex;align-items:center;gap:12px}.status-badge[data-v-3b17c2f5]{font-size:12px;padding:4px 8px;border-radius:4px}.status-badge.status-running[data-v-3b17c2f5]{background:#fef3c7;color:#92400e}.status-badge.status-completed[data-v-3b17c2f5]{background:#d1fae5;color:#065f46}.status-badge.status-error[data-v-3b17c2f5]{background:#fee2e2;color:#991b1b}.status-badge.status-no_sessions[data-v-3b17c2f5]{background:#f3f4f6;color:#6b7280}.refresh-btn[data-v-3b17c2f5]{font-size:12px;padding:4px 10px;border:1px solid #e5e7eb;border-radius:4px;background:#fff;cursor:pointer;color:#374151}.refresh-btn[data-v-3b17c2f5]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-3b17c2f5]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-3b17c2f5],.empty-state[data-v-3b17c2f5]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:#6b7280;gap:12px}.spinner[data-v-3b17c2f5]{width:24px;height:24px;border:3px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-3b17c2f5 1s linear infinite}@keyframes spin-3b17c2f5{to{transform:rotate(360deg)}}.empty-icon[data-v-3b17c2f5]{font-size:32px}.empty-message[data-v-3b17c2f5]{font-size:14px;color:#374151;font-weight:500}.empty-hint[data-v-3b17c2f5]{margin-top:8px;font-size:12px;color:#9ca3af;text-align:center;max-width:280px;line-height:1.5}.timeline-content[data-v-3b17c2f5]{padding:16px}.timeline-legend[data-v-3b17c2f5]{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-3b17c2f5]{display:inline-flex;align-items:center;gap:4px}.legend-icon[data-v-3b17c2f5]{font-size:12px}.session-info[data-v-3b17c2f5]{display:flex;gap:16px;font-size:12px;color:#9ca3af;margin-bottom:16px;padding-bottom:12px;border-bottom:1px dashed #e5e7eb}.steps-list[data-v-3b17c2f5]{display:flex;flex-direction:column}.tool-execution-label[data-v-3b17c2f5]{display:flex;align-items:center;gap:12px;margin:12px 0;padding:0 4px}.tool-execution-label .label-line[data-v-3b17c2f5]{flex:1;height:1px;background:#e5e7eb}.tool-execution-label .label-text[data-v-3b17c2f5]{font-size:11px;color:#9ca3af;white-space:nowrap}.timeline-footer[data-v-3b17c2f5]{margin-top:16px;padding-top:16px;border-top:1px solid #e5e7eb}.stats-grid[data-v-3b17c2f5]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-item[data-v-3b17c2f5]{display:flex;flex-direction:column;align-items:center;padding:8px;background:#f9fafb;border-radius:6px}.stat-label[data-v-3b17c2f5]{font-size:11px;color:#9ca3af;margin-bottom:4px}.stat-value[data-v-3b17c2f5]{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-5e7f751f]{background:#fff;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden}.chain-header[data-v-5e7f751f]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#f9fafb;border-bottom:1px solid #e5e7eb}.header-left[data-v-5e7f751f]{display:flex;align-items:center;gap:12px}.title[data-v-5e7f751f]{font-weight:600;font-size:14px;color:#374151}.project-info[data-v-5e7f751f]{font-size:13px;color:#6b7280}.header-right[data-v-5e7f751f]{display:flex;align-items:center;gap:12px}.status-badge[data-v-5e7f751f]{font-size:12px;padding:4px 8px;border-radius:4px}.status-badge.status-running[data-v-5e7f751f]{background:#fef3c7;color:#92400e}.status-badge.status-completed[data-v-5e7f751f]{background:#d1fae5;color:#065f46}.status-badge.status-error[data-v-5e7f751f]{background:#fee2e2;color:#991b1b}.status-badge.status-empty[data-v-5e7f751f]{background:#f3f4f6;color:#6b7280}.refresh-btn[data-v-5e7f751f]{font-size:12px;padding:4px 10px;border:1px solid #e5e7eb;border-radius:4px;background:#fff;cursor:pointer;color:#374151}.refresh-btn[data-v-5e7f751f]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-5e7f751f]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-5e7f751f],.empty-state[data-v-5e7f751f]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:#6b7280;gap:12px}.spinner[data-v-5e7f751f]{width:24px;height:24px;border:3px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-5e7f751f 1s linear infinite}@keyframes spin-5e7f751f{to{transform:rotate(360deg)}}.empty-icon[data-v-5e7f751f]{font-size:32px}.empty-hint[data-v-5e7f751f]{margin-top:8px;font-size:12px;color:#9ca3af;text-align:center;max-width:280px}.chain-content[data-v-5e7f751f]{padding:16px}.root-task[data-v-5e7f751f]{padding:12px;background:#f9fafb;border-radius:6px;margin-bottom:16px}.task-label[data-v-5e7f751f]{font-size:11px;color:#9ca3af;margin-bottom:4px}.task-text[data-v-5e7f751f]{font-size:14px;color:#374151;font-weight:500}.task-meta[data-v-5e7f751f]{margin-top:8px;font-size:12px;color:#6b7280}.chain-diagram[data-v-5e7f751f]{margin:20px 0}.diagram-container[data-v-5e7f751f]{display:flex;align-items:center;justify-content:center;gap:0;flex-wrap:wrap}.chain-progress[data-v-5e7f751f]{margin-top:16px}.progress-bar[data-v-5e7f751f]{height:8px;background:#e5e7eb;border-radius:4px;overflow:hidden}.progress-fill[data-v-5e7f751f]{height:100%;background:linear-gradient(90deg,#22c55e,#3b82f6);transition:width .3s ease}.progress-text[data-v-5e7f751f]{margin-top:8px;font-size:12px;color:#6b7280;text-align:center}.node-detail[data-v-5e7f751f]{margin-top:16px;padding:16px;background:#f9fafb;border-radius:8px;border:1px solid #e5e7eb}.detail-header[data-v-5e7f751f]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.detail-title[data-v-5e7f751f]{font-size:14px;font-weight:600;color:#374151}.detail-status[data-v-5e7f751f]{font-size:12px;padding:4px 8px;border-radius:4px}.detail-content[data-v-5e7f751f]{display:flex;flex-direction:column;gap:12px}.section-label[data-v-5e7f751f]{font-size:11px;color:#9ca3af;margin-bottom:4px}.section-value[data-v-5e7f751f]{font-size:13px;color:#374151}.detail-row[data-v-5e7f751f]{display:flex;gap:24px}.detail-item[data-v-5e7f751f]{display:flex;flex-direction:column}.item-label[data-v-5e7f751f]{font-size:11px;color:#9ca3af}.item-value[data-v-5e7f751f]{font-size:13px;color:#374151;font-weight:500}.artifacts-list[data-v-5e7f751f]{display:flex;flex-direction:column;gap:4px}.artifact-item[data-v-5e7f751f]{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-aec763c1]{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-aec763c1]{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-aec763c1]{display:flex;justify-content:space-between;align-items:center;padding:1.5rem;border-bottom:1px solid #e5e7eb}.header h2[data-v-aec763c1]{margin:0;font-size:1.5rem;color:#333}.close-btn[data-v-aec763c1]{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-aec763c1]:hover{color:#333}.content[data-v-aec763c1]{padding:1.5rem;overflow-y:auto}.section[data-v-aec763c1]{margin-bottom:1.5rem}.section[data-v-aec763c1]:last-child{margin-bottom:0}.section h3[data-v-aec763c1]{margin:0 0 .75rem;font-size:1rem;color:#666}.status-info[data-v-aec763c1]{display:flex;align-items:center;gap:.5rem}.status-dot[data-v-aec763c1]{width:12px;height:12px;border-radius:50%}.status-dot.status-idle[data-v-aec763c1]{background:#4ade80}.status-dot.status-working[data-v-aec763c1]{background:#fbbf24}.status-dot.status-down[data-v-aec763c1]{background:#ef4444}.status-text[data-v-aec763c1]{font-size:1.1rem;color:#333;font-weight:500}.error-title[data-v-aec763c1]{color:#dc2626}.error-info[data-v-aec763c1]{padding:1rem;background:#fef2f2;border-radius:6px;border-left:4px solid #dc2626}.error-type[data-v-aec763c1]{font-weight:600;color:#dc2626;margin-bottom:.5rem}.error-message[data-v-aec763c1]{font-size:.9rem;color:#666}.activity-list[data-v-aec763c1]{display:flex;flex-direction:column;gap:.75rem}.activity-item[data-v-aec763c1]{padding:.75rem;border-radius:6px;font-size:.9rem}.activity-item.working[data-v-aec763c1]{background:#fef3c7;color:#92400e}.activity-item.idle[data-v-aec763c1]{background:#d1fae5;color:#065f46}.activity-item.down[data-v-aec763c1]{background:#fee2e2;color:#991b1b}.view-tabs[data-v-aec763c1]{display:flex;flex-wrap:wrap;gap:6px 10px;margin-bottom:12px}.tab-btn[data-v-aec763c1]{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-aec763c1]:hover{background:#f9fafb}.tab-btn.active[data-v-aec763c1]{background:#3b82f6;color:#fff;border-color:#3b82f6}.timeline-container[data-v-aec763c1],.chain-container[data-v-aec763c1]{border:1px solid #e5e7eb;border-radius:8px;overflow:hidden}.advanced-container[data-v-aec763c1]{display:flex;flex-direction:column;gap:16px}.advanced-section[data-v-aec763c1]{border:1px solid #e5e7eb;border-radius:8px;overflow:hidden}.advanced-section h4[data-v-aec763c1]{margin:0;padding:10px 14px;background:#f9fafb;border-bottom:1px solid #e5e7eb;font-size:13px;font-weight:600;color:#374151}.diagnostic-panel[data-v-aec763c1]{border-radius:8px;overflow:hidden;border:1px solid}.diagnostic-panel.severity-warning[data-v-aec763c1]{border-color:#fbbf24;background:#fffbeb}.diagnostic-panel.severity-critical[data-v-aec763c1]{border-color:#ef4444;background:#fef2f2}.diagnostic-header[data-v-aec763c1]{display:flex;align-items:center;gap:8px;padding:12px 16px;font-weight:600}.severity-warning .diagnostic-header[data-v-aec763c1]{background:#fef3c7;color:#92400e}.severity-critical .diagnostic-header[data-v-aec763c1]{background:#fee2e2;color:#991b1b}.diagnostic-icon[data-v-aec763c1]{font-size:18px}.diagnostic-title[data-v-aec763c1]{font-size:14px}.diagnostic-content[data-v-aec763c1]{padding:12px 16px}.diagnostic-item[data-v-aec763c1]{display:flex;gap:8px;margin-bottom:8px;font-size:13px}.diagnostic-item .item-label[data-v-aec763c1]{color:#6b7280;min-width:80px}.diagnostic-item .item-value[data-v-aec763c1]{color:#374151}.diagnostic-item .item-value.highlight[data-v-aec763c1]{font-weight:600;color:#dc2626}.diagnostic-hint[data-v-aec763c1]{margin-top:12px;padding:10px;background:#00000008;border-radius:6px;font-size:12px}.hint-title[data-v-aec763c1]{font-weight:600;color:#374151;margin-bottom:6px}.diagnostic-hint ul[data-v-aec763c1]{margin:0;padding-left:18px;color:#6b7280}.diagnostic-hint li[data-v-aec763c1]{margin:4px 0}.diagnostic-actions[data-v-aec763c1]{margin-top:12px;display:flex;gap:8px}.action-btn[data-v-aec763c1]{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-aec763c1]:hover{background:#f3f4f6}.action-btn.primary[data-v-aec763c1]{background:#ef4444;border-color:#ef4444;color:#fff}.action-btn.primary[data-v-aec763c1]:hover{background:#dc2626}@media (max-width: 1280px){.panel[data-v-aec763c1]{width:700px}}@media (max-width: 768px){.panel[data-v-aec763c1]{width:95vw;max-height:95vh}.header[data-v-aec763c1]{padding:1rem}.header h2[data-v-aec763c1]{font-size:1.2rem}.content[data-v-aec763c1]{padding:1rem}.view-tabs[data-v-aec763c1]{gap:4px 8px}.tab-btn[data-v-aec763c1]{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-3b17c2f5]{background:#fff;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden}.timeline-header[data-v-3b17c2f5]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#f9fafb;border-bottom:1px solid #e5e7eb}.header-left[data-v-3b17c2f5]{display:flex;align-items:center;gap:12px}.title[data-v-3b17c2f5]{font-weight:600;font-size:14px;color:#374151}.agent-info[data-v-3b17c2f5]{font-size:13px;color:#6b7280}.agent-info .model[data-v-3b17c2f5]{color:#9ca3af}.header-right[data-v-3b17c2f5]{display:flex;align-items:center;gap:12px}.status-badge[data-v-3b17c2f5]{font-size:12px;padding:4px 8px;border-radius:4px}.status-badge.status-running[data-v-3b17c2f5]{background:#fef3c7;color:#92400e}.status-badge.status-completed[data-v-3b17c2f5]{background:#d1fae5;color:#065f46}.status-badge.status-error[data-v-3b17c2f5]{background:#fee2e2;color:#991b1b}.status-badge.status-no_sessions[data-v-3b17c2f5]{background:#f3f4f6;color:#6b7280}.refresh-btn[data-v-3b17c2f5]{font-size:12px;padding:4px 10px;border:1px solid #e5e7eb;border-radius:4px;background:#fff;cursor:pointer;color:#374151}.refresh-btn[data-v-3b17c2f5]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-3b17c2f5]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-3b17c2f5],.empty-state[data-v-3b17c2f5]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:#6b7280;gap:12px}.spinner[data-v-3b17c2f5]{width:24px;height:24px;border:3px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-3b17c2f5 1s linear infinite}@keyframes spin-3b17c2f5{to{transform:rotate(360deg)}}.empty-icon[data-v-3b17c2f5]{font-size:32px}.empty-message[data-v-3b17c2f5]{font-size:14px;color:#374151;font-weight:500}.empty-hint[data-v-3b17c2f5]{margin-top:8px;font-size:12px;color:#9ca3af;text-align:center;max-width:280px;line-height:1.5}.timeline-content[data-v-3b17c2f5]{padding:16px}.timeline-legend[data-v-3b17c2f5]{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-3b17c2f5]{display:inline-flex;align-items:center;gap:4px}.legend-icon[data-v-3b17c2f5]{font-size:12px}.session-info[data-v-3b17c2f5]{display:flex;gap:16px;font-size:12px;color:#9ca3af;margin-bottom:16px;padding-bottom:12px;border-bottom:1px dashed #e5e7eb}.steps-list[data-v-3b17c2f5]{display:flex;flex-direction:column}.tool-execution-label[data-v-3b17c2f5]{display:flex;align-items:center;gap:12px;margin:12px 0;padding:0 4px}.tool-execution-label .label-line[data-v-3b17c2f5]{flex:1;height:1px;background:#e5e7eb}.tool-execution-label .label-text[data-v-3b17c2f5]{font-size:11px;color:#9ca3af;white-space:nowrap}.timeline-footer[data-v-3b17c2f5]{margin-top:16px;padding-top:16px;border-top:1px solid #e5e7eb}.stats-grid[data-v-3b17c2f5]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-item[data-v-3b17c2f5]{display:flex;flex-direction:column;align-items:center;padding:8px;background:#f9fafb;border-radius:6px}.stat-label[data-v-3b17c2f5]{font-size:11px;color:#9ca3af;margin-bottom:4px}.stat-value[data-v-3b17c2f5]{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-5e7f751f]{background:#fff;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden}.chain-header[data-v-5e7f751f]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#f9fafb;border-bottom:1px solid #e5e7eb}.header-left[data-v-5e7f751f]{display:flex;align-items:center;gap:12px}.title[data-v-5e7f751f]{font-weight:600;font-size:14px;color:#374151}.project-info[data-v-5e7f751f]{font-size:13px;color:#6b7280}.header-right[data-v-5e7f751f]{display:flex;align-items:center;gap:12px}.status-badge[data-v-5e7f751f]{font-size:12px;padding:4px 8px;border-radius:4px}.status-badge.status-running[data-v-5e7f751f]{background:#fef3c7;color:#92400e}.status-badge.status-completed[data-v-5e7f751f]{background:#d1fae5;color:#065f46}.status-badge.status-error[data-v-5e7f751f]{background:#fee2e2;color:#991b1b}.status-badge.status-empty[data-v-5e7f751f]{background:#f3f4f6;color:#6b7280}.refresh-btn[data-v-5e7f751f]{font-size:12px;padding:4px 10px;border:1px solid #e5e7eb;border-radius:4px;background:#fff;cursor:pointer;color:#374151}.refresh-btn[data-v-5e7f751f]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-5e7f751f]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-5e7f751f],.empty-state[data-v-5e7f751f]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:#6b7280;gap:12px}.spinner[data-v-5e7f751f]{width:24px;height:24px;border:3px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-5e7f751f 1s linear infinite}@keyframes spin-5e7f751f{to{transform:rotate(360deg)}}.empty-icon[data-v-5e7f751f]{font-size:32px}.empty-hint[data-v-5e7f751f]{margin-top:8px;font-size:12px;color:#9ca3af;text-align:center;max-width:280px}.chain-content[data-v-5e7f751f]{padding:16px}.root-task[data-v-5e7f751f]{padding:12px;background:#f9fafb;border-radius:6px;margin-bottom:16px}.task-label[data-v-5e7f751f]{font-size:11px;color:#9ca3af;margin-bottom:4px}.task-text[data-v-5e7f751f]{font-size:14px;color:#374151;font-weight:500}.task-meta[data-v-5e7f751f]{margin-top:8px;font-size:12px;color:#6b7280}.chain-diagram[data-v-5e7f751f]{margin:20px 0}.diagram-container[data-v-5e7f751f]{display:flex;align-items:center;justify-content:center;gap:0;flex-wrap:wrap}.chain-progress[data-v-5e7f751f]{margin-top:16px}.progress-bar[data-v-5e7f751f]{height:8px;background:#e5e7eb;border-radius:4px;overflow:hidden}.progress-fill[data-v-5e7f751f]{height:100%;background:linear-gradient(90deg,#22c55e,#3b82f6);transition:width .3s ease}.progress-text[data-v-5e7f751f]{margin-top:8px;font-size:12px;color:#6b7280;text-align:center}.node-detail[data-v-5e7f751f]{margin-top:16px;padding:16px;background:#f9fafb;border-radius:8px;border:1px solid #e5e7eb}.detail-header[data-v-5e7f751f]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.detail-title[data-v-5e7f751f]{font-size:14px;font-weight:600;color:#374151}.detail-status[data-v-5e7f751f]{font-size:12px;padding:4px 8px;border-radius:4px}.detail-content[data-v-5e7f751f]{display:flex;flex-direction:column;gap:12px}.section-label[data-v-5e7f751f]{font-size:11px;color:#9ca3af;margin-bottom:4px}.section-value[data-v-5e7f751f]{font-size:13px;color:#374151}.detail-row[data-v-5e7f751f]{display:flex;gap:24px}.detail-item[data-v-5e7f751f]{display:flex;flex-direction:column}.item-label[data-v-5e7f751f]{font-size:11px;color:#9ca3af}.item-value[data-v-5e7f751f]{font-size:13px;color:#374151;font-weight:500}.artifacts-list[data-v-5e7f751f]{display:flex;flex-direction:column;gap:4px}.artifact-item[data-v-5e7f751f]{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}}
|
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-BQRg8Gvl.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CghUi6Ys.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="app"></div>
|