openclaw-agent-dashboard 1.0.32 → 1.0.33
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 +8 -1
- package/dashboard/status/status_calculator.py +12 -8
- package/frontend-dist/assets/{index-BjYtbHr_.js → index-xwKb2VFi.js} +1 -1
- package/frontend-dist/assets/{index-BMB2j2An.css → index-zZLJo64M.css} +1 -1
- package/frontend-dist/index.html +2 -2
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -591,6 +591,10 @@ async def get_collaboration():
|
|
|
591
591
|
main_error = _get_agent_error_info(main_agent_id)
|
|
592
592
|
main_stuck = _check_agent_stuck(main_agent_id)
|
|
593
593
|
|
|
594
|
+
main_ct = main_current_task if main_current_task else None
|
|
595
|
+
if main_status == 'idle':
|
|
596
|
+
main_ct = None
|
|
597
|
+
|
|
594
598
|
main_agent = CollaborationNode(
|
|
595
599
|
id=main_agent_id,
|
|
596
600
|
type="agent",
|
|
@@ -598,7 +602,7 @@ async def get_collaboration():
|
|
|
598
602
|
status=main_status,
|
|
599
603
|
timestamp=int(__import__('time').time() * 1000),
|
|
600
604
|
metadata=agent_models.get(main_agent_id),
|
|
601
|
-
currentTask=
|
|
605
|
+
currentTask=main_ct,
|
|
602
606
|
error=main_error,
|
|
603
607
|
stuckWarning=main_stuck
|
|
604
608
|
)
|
|
@@ -624,6 +628,9 @@ async def get_collaboration():
|
|
|
624
628
|
current_task = _clean_task_name(run.get('task', ''))
|
|
625
629
|
break
|
|
626
630
|
|
|
631
|
+
if status == 'idle':
|
|
632
|
+
current_task = ''
|
|
633
|
+
|
|
627
634
|
# 获取错误和卡顿信息
|
|
628
635
|
error_info = _get_agent_error_info(agent_id)
|
|
629
636
|
stuck_info = _check_agent_stuck(agent_id)
|
|
@@ -8,7 +8,7 @@ sys.path.append(str(Path(__file__).parent.parent))
|
|
|
8
8
|
|
|
9
9
|
import logging
|
|
10
10
|
import time
|
|
11
|
-
from typing import Literal, Dict, Any, List
|
|
11
|
+
from typing import Literal, Dict, Any, List
|
|
12
12
|
from data.config_reader import get_agents_list, get_agent_config, get_main_agent_id
|
|
13
13
|
from data.subagent_reader import is_agent_working, get_agent_runs
|
|
14
14
|
from data.session_reader import (
|
|
@@ -108,8 +108,10 @@ def get_agents_with_status() -> list:
|
|
|
108
108
|
agent_id = agent.get('id')
|
|
109
109
|
status = calculate_agent_status(agent_id)
|
|
110
110
|
|
|
111
|
-
#
|
|
111
|
+
# 获取当前任务(仅工作中展示;空闲时不应残留已结束 run 的文案)
|
|
112
112
|
current_task = get_current_task(agent_id)
|
|
113
|
+
if status == 'idle':
|
|
114
|
+
current_task = ''
|
|
113
115
|
|
|
114
116
|
# 获取最后活跃时间
|
|
115
117
|
last_active = get_last_active_time(agent_id)
|
|
@@ -133,13 +135,13 @@ def get_agents_with_status() -> list:
|
|
|
133
135
|
def get_current_task(agent_id: str) -> str:
|
|
134
136
|
"""
|
|
135
137
|
获取 Agent 当前任务描述。
|
|
136
|
-
|
|
137
|
-
子 Agent 任务仅来自 runs(业务上不存在「仅有会话、无 run」的工作态)。
|
|
138
|
-
主 Agent 无 run 时不从会话摘 user 文案(user 提示常驻会话尾部,易被当成「当前任务」)。
|
|
138
|
+
仅从未结束的 run(endedAt 为空)读取;已结束的 run 只代表历史,不应在空闲时仍当「当前任务」展示。
|
|
139
139
|
"""
|
|
140
|
-
runs = get_agent_runs(agent_id, limit=
|
|
141
|
-
|
|
142
|
-
|
|
140
|
+
runs = get_agent_runs(agent_id, limit=40)
|
|
141
|
+
for run in runs:
|
|
142
|
+
if run.get('endedAt') is not None:
|
|
143
|
+
continue
|
|
144
|
+
task = run.get('task', '') or ''
|
|
143
145
|
if len(task) > 60:
|
|
144
146
|
task = task[:57] + '...'
|
|
145
147
|
return task
|
|
@@ -376,6 +378,8 @@ async def get_changed_agents() -> List[Dict[str, Any]]:
|
|
|
376
378
|
# 计算状态(会使用缓存)
|
|
377
379
|
status = calculate_agent_status(agent_id)
|
|
378
380
|
current_task = get_current_task(agent_id)
|
|
381
|
+
if status == 'idle':
|
|
382
|
+
current_task = ''
|
|
379
383
|
last_active = get_last_active_time(agent_id)
|
|
380
384
|
last_error = get_last_error(agent_id) if status == 'down' else None
|
|
381
385
|
|
|
@@ -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
|
-
...`:""),k=Q(()=>s.step.type!=="toolResult"||s.step.toolResultStatus!=="error"?"":s.step.toolResultError?s.step.toolResultError:s.step.toolResult||"工具执行失败"),b=Q(()=>{if(s.step.type!=="toolResult"||s.step.toolResultStatus!=="error")return null;const G=(s.step.toolResultError||s.step.toolResult||"").toLowerCase(),I=(s.step.toolName||"").toLowerCase(),st=[];return(G.includes("enoent")||G.includes("no such file")||G.includes("文件不存在"))&&st.push("检查文件路径是否正确","确认文件是否存在"),(G.includes("eacces")||G.includes("permission")||G.includes("权限"))&&st.push("检查文件/目录权限","确认当前用户有访问权限"),(G.includes("timeout")||G.includes("超时"))&&st.push("增加超时时间","简化任务或检查网络"),I==="read"&&st.length===0&&st.push("检查路径是否在 workspace 内","确认文件编码正确"),I.includes("bash")&&st.length===0&&st.push("检查命令语法","确认依赖已安装","查看退出码"),st.length===0&&st.push("查看原始返回详情","尝试调整参数后重试"),st}),R=Q(()=>s.step.type!=="error"||!s.step.errorType?null:{"rate-limit":["降低调用频率","切换到 fallback model","等待配额恢复"],"token-limit":["减少上下文长度","分段处理任务","使用更大 context 的模型"],timeout:["检查网络连接","简化任务复杂度","增加超时时间"],quota:["充值账户","切换到其他 provider","等待配额重置"]}[s.step.errorType]||null);function K(){if(v.value){const G=s.step.pairedToolCallId||s.step.id,I=s.step.pairedToolResultId||s.step.id;l("highlight-pair",{callId:G,resultId:I})}x()}function x(){S.value&&(i.value=!i.value)}function F(G){return G?new Date(G).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function X(G){return G?G<1e3?`${G}ms`:G<6e4?`${(G/1e3).toFixed(1)}s`:`${(G/6e4).toFixed(1)}min`:"0ms"}function H(G){try{return JSON.stringify(G,null,2)}catch{return String(G)}}async function q(){if(s.step.toolResult)try{await navigator.clipboard.writeText(s.step.toolResult),alert("已复制到剪贴板")}catch{}}return(G,I)=>(c(),d("div",{class:nt(["timeline-step",[`step-${t.step.type}`,`status-${t.step.status}`,{"is-paired-result":p.value,highlighted:C.value}]])},[n("div",{class:"step-header",onClick:K},[n("div",ir,[n("span",or,f(a.value),1),n("span",ar,f(r.value),1),u.value?(c(),d("span",rr,f(u.value),1)):M("",!0),!i.value&&m.value?(c(),d("span",cr,f(m.value),1)):M("",!0),n("span",ur,f(F(t.step.timestamp)),1),t.step.duration&&t.step.duration>0?(c(),d("span",dr," +"+f(X(t.step.duration)),1)):M("",!0),t.step.executionTime?(c(),d("span",fr," ⏱ "+f(X(t.step.executionTime)),1)):M("",!0)]),n("div",hr,[t.step.tokens?(c(),d("span",pr,[I[2]||(I[2]=n("span",{class:"token-label"},"tokens:",-1)),At(" "+f(t.step.tokens.input+t.step.tokens.output),1)])):M("",!0),v.value?(c(),d("span",{key:1,class:"pair-indicator",title:A.value}," 🔗 ",8,vr)):M("",!0),S.value?(c(),d("span",gr,f(i.value?"▼":"▶"),1)):M("",!0)])]),S.value&&i.value?(c(),d("div",mr,[t.step.type==="user"&&t.step.content?(c(),d("div",_r,[n("pre",null,f(t.step.content),1)])):M("",!0),t.step.type==="thinking"&&t.step.thinking?(c(),d("div",yr,[I[3]||(I[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(),d("div",br,[n("pre",null,f(t.step.content),1)])):M("",!0),t.step.type==="toolCall"?(c(),d("div",$r,[t.step.toolArguments?(c(),d("div",kr,[I[4]||(I[4]=n("div",{class:"section-label"},"参数:",-1)),n("pre",wr,f(H(t.step.toolArguments)),1)])):M("",!0)])):M("",!0),t.step.type==="toolResult"?(c(),d("div",Cr,[n("div",Tr,[n("span",{class:nt(["result-status",t.step.toolResultStatus])},f(t.step.toolResultStatus==="ok"?"✅ 成功":"❌ 工具执行失败"),3),t.step.toolResult?(c(),d("button",{key:0,class:"copy-btn",onClick:q}," 复制 ")):M("",!0)]),t.step.toolResultStatus==="error"?(c(),d(Y,{key:0},[k.value?(c(),d("div",Sr,[n("div",xr,f(k.value),1),b.value?(c(),d("div",Ar,[I[5]||(I[5]=n("span",{class:"suggestion-label"},"💡 建议:",-1)),n("ul",null,[(c(!0),d(Y,null,ct(b.value,(st,mt)=>(c(),d("li",{key:mt},f(st),1))),128))])])):M("",!0)])):M("",!0),t.step.toolResult?(c(),d("div",Ir,[I[6]||(I[6]=n("div",{class:"section-label"},"原始返回:",-1)),n("pre",{class:nt({truncated:!o.value})},f($.value),3),T.value?(c(),d("button",{key:0,class:"show-more-btn",onClick:I[0]||(I[0]=le(st=>o.value=!o.value,["stop"]))},f(o.value?"收起":`展开全部 (${D.value} 行)`),1)):M("",!0)])):M("",!0)],64)):(c(),d(Y,{key:1},[t.step.toolResult?(c(),d("div",Mr,[n("pre",{class:nt({truncated:!o.value})},f($.value),3),T.value?(c(),d("button",{key:0,class:"show-more-btn",onClick:I[1]||(I[1]=le(st=>o.value=!o.value,["stop"]))},f(o.value?"收起":`展开全部 (${D.value} 行)`),1)):M("",!0)])):M("",!0)],64))])):M("",!0),t.step.type==="error"?(c(),d("div",Rr,[n("div",Er,f(t.step.errorType||"unknown"),1),n("div",Pr,f(t.step.errorMessage),1),R.value?(c(),d("div",Dr,[I[7]||(I[7]=n("div",{class:"suggestion-label"},"💡 建议:",-1)),n("ul",null,[(c(!0),d(Y,null,ct(R.value,(st,mt)=>(c(),d("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"]]),Or={class:"timeline-connector"},Lr=wt({__name:"TimelineConnector",setup(t){return(e,s)=>(c(),d("div",Or,[...s[0]||(s[0]=[n("div",{class:"connector-line"},null,-1),n("div",{class:"connector-arrow"},"▼",-1)])]))}}),_n=Ct(Lr,[["__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(),d("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(),d("span",Vr,f(t.round.tokens.input+t.round.tokens.output)+" tokens ",1)):M("",!0)]),n("div",Wr,[(c(!0),d(Y,null,ct(t.round.stepIds,(r,u)=>(c(),d(Y,{key:r},[u>0?(c(),Gt(_n,{key:0})):M("",!0),bt(mn,{step:i(r),prevStep:u>0?i(t.round.stepIds[u-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(),d("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(),d("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},lc={key:2,class:"empty-hint"},ic={key:2,class:"timeline-content"},oc={key:0,class:"session-info"},ac={class:"session-id"},rc={key:0,class:"started-at"},cc={class:"steps-list"},uc={key:0,class:"tool-execution-label"},dc={class:"timeline-footer"},fc={class:"stats-grid"},hc={class:"stat-item"},pc={class:"stat-value"},vc={class:"stat-item"},gc={class:"stat-value"},mc={class:"stat-item"},_c={class:"stat-value"},yc={class:"stat-item"},bc={class:"stat-value"},$c=wt({__name:"TimelineView",props:{agentId:{},sessionKey:{},autoRefresh:{type:Boolean},refreshInterval:{}},setup(t){const e=t,s=V(null),l=V(!1),i=V(null),o=V(null),a=Q(()=>s.value?s.value.status:"empty"),r=Q(()=>({running:"🔄 进行中",completed:"✅ 已完成",error:"❌ 出错",empty:"空",no_sessions:"无会话"})[a.value]||"未知"),u=Q(()=>{var k;return((k=s.value)==null?void 0:k.roundMode)&&s.value.rounds&&s.value.rounds.length>0}),v=Q(()=>{var R;if(!s.value||!u.value)return[];const k=[],b=new Set;for(const K of s.value.steps){if(b.has(K.id))continue;const x=(R=s.value.rounds)==null?void 0:R.find(F=>F.stepIds.includes(K.id));x?(k.push({type:"round",data:x}),x.stepIds.forEach(F=>b.add(F))):(k.push({type:"step",data:K}),b.add(K.id))}return k});async function p(){if(e.agentId){l.value=!0,i.value=null;try{let k=`/api/timeline/${e.agentId}?limit=100`;e.sessionKey&&(k+=`&session_key=${encodeURIComponent(e.sessionKey)}`);const b=await fetch(k);if(!b.ok)throw new Error(`HTTP ${b.status}`);s.value=await b.json()}catch(k){i.value=k instanceof Error?k.message:"加载失败",console.error("Timeline load error:",k)}finally{l.value=!1}}}function C(k){s.value&&s.value.steps[k]&&(s.value.steps[k].collapsed=!s.value.steps[k].collapsed)}function A(k){if(s.value){const b=s.value.steps.find(R=>R.id===k);b&&(b.collapsed=!b.collapsed)}}function S(k){o.value=k,setTimeout(()=>{o.value=null},3e3)}function m(k){return k?new Date(k).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function T(k){return k?k<1e3?`${k}ms`:k<6e4?`${(k/1e3).toFixed(1)}s`:`${(k/6e4).toFixed(1)}min`:"0ms"}function D(k){return k>=1e3?`${(k/1e3).toFixed(1)}k`:String(k)}Nt(p),Bt(()=>e.agentId,p);let $=null;return Bt([()=>e.autoRefresh,()=>e.refreshInterval],([k,b])=>{$&&(clearInterval($),$=null),k&&b&&b>0&&($=setInterval(p,b*1e3))},{immediate:!0}),(k,b)=>{var R,K;return c(),d("div",Gr,[n("div",zr,[n("div",Jr,[b[0]||(b[0]=n("span",{class:"title"},"📊 实时执行时序",-1)),s.value?(c(),d("span",Qr,[At(f(s.value.agentName||s.value.agentId)+" ",1),s.value.model?(c(),d("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:p,disabled:l.value},f(l.value?"加载中...":"🔄 刷新"),9,Zr)])]),l.value&&!s.value?(c(),d("div",tc,[...b[1]||(b[1]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载时序数据...",-1)])])):!s.value||s.value.steps.length===0?(c(),d("div",ec,[b[2]||(b[2]=n("span",{class:"empty-icon"},"📭",-1)),((R=s.value)==null?void 0:R.status)==="no_sessions"?(c(),d("span",sc," 该 Agent 是子代理,暂无独立会话记录 ")):(c(),d("span",nc,"暂无会话记录")),(K=s.value)!=null&&K.message?(c(),d("div",lc,f(s.value.message),1)):M("",!0)])):(c(),d("div",ic,[b[8]||(b[8]=Ii('<div class="timeline-legend" data-v-4ac4b073><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>👤</span> 用户/回传</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>🧠</span> LLM 思考</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>🤖</span> LLM 回复</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>🔧</span> 工具调用</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>✅</span> 工具成功</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>❌</span> 工具失败</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>⚠️</span> 错误</span></div>',1)),s.value.sessionId?(c(),d("div",oc,[n("span",ac,"Session: "+f(s.value.sessionId.slice(0,8))+"...",1),s.value.startedAt?(c(),d("span",rc," 开始: "+f(m(s.value.startedAt)),1)):M("",!0)])):M("",!0),n("div",cc,[u.value?(c(!0),d(Y,{key:0},ct(v.value,(x,F)=>{var X;return c(),d(Y,{key:(x.type==="round",x.data.id)},[F>0?(c(),Gt(_n,{key:0})):M("",!0),x.type==="round"?(c(),Gt(Br,{key:1,round:x.data,steps:s.value.steps,highlightedPair:o.value,onHighlightPair:S},null,8,["round","steps","highlightedPair"])):(c(),d(Y,{key:2},[x.data.type==="toolResult"?(c(),d("div",uc,[...b[3]||(b[3]=[n("span",{class:"label-line"},null,-1),n("span",{class:"label-text"},"⚡ 工具执行",-1),n("span",{class:"label-line"},null,-1)])])):M("",!0),x.data.type==="toolResult"&&x.data.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:x.data.toolResultStatus==="error",isActive:((X=o.value)==null?void 0:X.resultId)===x.data.id,executionTime:x.data.executionTime},null,8,["isError","isActive","executionTime"])):M("",!0),bt(mn,{step:x.data,highlightedPair:o.value,onToggleCollapse:H=>A(x.data.id),onHighlightPair:S},null,8,["step","highlightedPair","onToggleCollapse"])],64))],64)}),128)):(c(!0),d(Y,{key:1},ct(s.value.steps,(x,F)=>{var X;return c(),d(Y,{key:x.id},[F>0?(c(),Gt(_n,{key:0})):M("",!0),x.type==="toolResult"&&x.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:x.toolResultStatus==="error",isActive:((X=o.value)==null?void 0:X.resultId)===x.id,executionTime:x.executionTime},null,8,["isError","isActive","executionTime"])):M("",!0),bt(mn,{step:x,prevStep:s.value.steps[F-1],highlightedPair:o.value,onToggleCollapse:H=>C(F),onHighlightPair:S},null,8,["step","prevStep","highlightedPair","onToggleCollapse"])],64)}),128))]),n("div",dc,[n("div",fc,[n("div",hc,[b[4]||(b[4]=n("span",{class:"stat-label"},"总耗时",-1)),n("span",pc,f(T(s.value.stats.totalDuration)),1)]),n("div",vc,[b[5]||(b[5]=n("span",{class:"stat-label"},"Token",-1)),n("span",gc,f(D(s.value.stats.totalInputTokens))+" / "+f(D(s.value.stats.totalOutputTokens)),1)]),n("div",mc,[b[6]||(b[6]=n("span",{class:"stat-label"},"工具调用",-1)),n("span",_c,f(s.value.stats.toolCallCount)+" 次",1)]),n("div",yc,[b[7]||(b[7]=n("span",{class:"stat-label"},"步骤数",-1)),n("span",bc,f(s.value.stats.stepCount),1)])])])]))])}}}),kc=Ct($c,[["__scopeId","data-v-4ac4b073"]]),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:"失败"}},wc={class:"node-icon"},Cc={class:"node-info"},Tc={class:"node-name"},Sc={class:"node-role"},xc={class:"node-status"},Ac={key:0,class:"node-time"},Ic={key:1,class:"node-progress"},Mc=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(),d("div",{class:nt(["chain-node",[`status-${t.node.status}`,{selected:t.isSelected}]]),onClick:a[0]||(a[0]=r=>o.$emit("click"))},[n("div",wc,f(s.value),1),n("div",Cc,[n("div",Tc,f(t.node.agentName),1),n("div",Sc,f(t.node.role),1)]),n("div",xc,f(l.value),1),t.node.startedAt?(c(),d("div",Ac,f(i(t.node.duration)),1)):M("",!0),t.node.status==="running"?(c(),d("div",Ic,[...a[1]||(a[1]=[n("div",{class:"progress-spinner"},null,-1)])])):M("",!0)],2))}}),Rc=Ct(Mc,[["__scopeId","data-v-973c6755"]]),Ec={width:"60",height:"20",viewBox:"0 0 60 20"},Pc={id:"arrowhead",markerWidth:"10",markerHeight:"7",refX:"9",refY:"3.5",orient:"auto"},Dc=["fill"],Fc=["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(),d("div",{class:nt(["chain-edge",o.value])},[(c(),d("svg",Ec,[n("defs",null,[n("marker",Pc,[n("polygon",{points:"0 0, 10 3.5, 0 7",fill:l.value},null,8,Dc)])]),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,Fc)]))],2))}}),Lc=Ct(Oc,[["__scopeId","data-v-c94ab96b"]]),Nc={class:"chain-view"},jc={class:"chain-header"},Uc={class:"header-left"},Vc={key:0,class:"project-info"},Wc={class:"header-right"},Hc=["disabled"],Bc={key:0,class:"loading-state"},Kc={key:1,class:"empty-state"},qc={key:2,class:"chain-content"},Gc={key:0,class:"root-task"},zc={class:"task-text"},Jc={class:"task-meta"},Qc={key:0},Yc={key:1,class:"chain-diagram"},Xc={class:"diagram-container"},Zc={key:2,class:"chain-progress"},tu={class:"progress-bar"},eu={class:"progress-text"},su={key:3,class:"node-detail"},nu={class:"detail-header"},lu={class:"detail-title"},iu={class:"detail-content"},ou={key:0,class:"detail-section"},au={class:"section-value"},ru={class:"detail-row"},cu={class:"detail-item"},uu={class:"item-value"},du={class:"detail-item"},fu={class:"item-value"},hu={key:1,class:"detail-row"},pu={class:"detail-item"},vu={class:"item-value"},gu={class:"detail-item"},mu={class:"item-value"},_u={key:2,class:"detail-section"},yu={class:"section-value"},bu={key:3,class:"detail-section"},$u={class:"artifacts-list"},ku=wt({__name:"TaskChainView",props:{autoRefresh:{type:Boolean},refreshInterval:{}},setup(t){const e=t,s=V([]),l=V(null),i=V(null),o=V(!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 m=["main","analyst","architect","devops"];return[...l.value.nodes].sort((D,$)=>{const k=m.findIndex(R=>D.role.includes(R)),b=m.findIndex(R=>$.role.includes(R));return k-b})});async function u(){o.value=!0;try{const m=await fetch("/api/chains?limit=10");if(m.ok){const T=await m.json();s.value=T.chains||[],l.value=T.activeChain||null}}catch(m){console.error("Chain load error:",m)}finally{o.value=!1}}function v(m){var T;i.value=((T=i.value)==null?void 0:T.agentId)===m.agentId?null:m}function p(m){return m?new Date(m).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):"-"}function C(m){return m?m<1e3?`${m}ms`:m<6e4?`${(m/1e3).toFixed(1)}s`:`${(m/6e4).toFixed(1)}min`:"-"}function A(m){return m?m>=1e3?`${(m/1e3).toFixed(1)}k`:String(m):"0"}let S=null;return Nt(()=>{u(),e.autoRefresh&&e.refreshInterval&&(S=setInterval(u,e.refreshInterval*1e3))}),ae(()=>{S&&(clearInterval(S),S=null)}),(m,T)=>{var D,$;return c(),d("div",Nc,[n("div",jc,[n("div",Uc,[T[0]||(T[0]=n("span",{class:"title"},"🔗 任务执行链路",-1)),l.value?(c(),d("span",Vc,f(l.value.projectId||"当前任务"),1)):M("",!0)]),n("div",Wc,[n("span",{class:nt(["status-badge",`status-${((D=l.value)==null?void 0:D.status)||"empty"}`])},f(a.value),3),n("button",{class:"refresh-btn",onClick:u,disabled:o.value},f(o.value?"加载中...":"🔄 刷新"),9,Hc)])]),o.value&&!l.value?(c(),d("div",Bc,[...T[1]||(T[1]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载链路数据...",-1)])])):!l.value&&s.value.length===0?(c(),d("div",Kc,[...T[2]||(T[2]=[n("span",{class:"empty-icon"},"🔗",-1),n("span",null,"暂无任务链路",-1),n("div",{class:"empty-hint"},"当 Main Agent 派发任务给子 Agent 时,这里会显示执行链路",-1)])])):(c(),d("div",qc,[l.value?(c(),d("div",Gc,[T[3]||(T[3]=n("div",{class:"task-label"},"根任务",-1)),n("div",zc,f(l.value.rootTask),1),n("div",Jc,[l.value.startedAt?(c(),d("span",Qc,"开始: "+f(p(l.value.startedAt)),1)):M("",!0)])])):M("",!0),l.value?(c(),d("div",Yc,[n("div",Xc,[(c(!0),d(Y,null,ct(r.value,(k,b)=>{var R,K;return c(),d(Y,{key:k.agentId},[b>0?(c(),Gt(Lc,{key:0,"from-status":(R=r.value[b-1])==null?void 0:R.status,"to-status":k.status},null,8,["from-status","to-status"])):M("",!0),bt(Rc,{node:k,"is-selected":((K=i.value)==null?void 0:K.agentId)===k.agentId,onClick:x=>v(k)},null,8,["node","is-selected","onClick"])],64)}),128))])])):M("",!0),l.value?(c(),d("div",Zc,[n("div",tu,[n("div",{class:"progress-fill",style:St({width:`${l.value.progress*100}%`})},null,4)]),n("div",eu,f(Math.round(l.value.progress*100))+"% ("+f(l.value.completedNodes)+"/"+f(l.value.totalNodes)+" 完成) ",1)])):M("",!0),i.value?(c(),d("div",su,[n("div",nu,[n("span",lu,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",iu,[i.value.task?(c(),d("div",ou,[T[4]||(T[4]=n("div",{class:"section-label"},"任务",-1)),n("div",au,f(i.value.task),1)])):M("",!0),n("div",ru,[n("div",cu,[T[5]||(T[5]=n("span",{class:"item-label"},"开始时间",-1)),n("span",uu,f(i.value.startedAt?p(i.value.startedAt):"-"),1)]),n("div",du,[T[6]||(T[6]=n("span",{class:"item-label"},"耗时",-1)),n("span",fu,f(C(i.value.duration)),1)])]),i.value.tokenUsage?(c(),d("div",hu,[n("div",pu,[T[7]||(T[7]=n("span",{class:"item-label"},"Token 输入",-1)),n("span",vu,f(A(i.value.tokenUsage.input)),1)]),n("div",gu,[T[8]||(T[8]=n("span",{class:"item-label"},"Token 输出",-1)),n("span",mu,f(A(i.value.tokenUsage.output)),1)])])):M("",!0),i.value.toolCallCount>0?(c(),d("div",_u,[T[9]||(T[9]=n("div",{class:"section-label"},"工具调用",-1)),n("div",yu,f(i.value.toolCallCount)+" 次",1)])):M("",!0),i.value.artifacts&&i.value.artifacts.length>0?(c(),d("div",bu,[T[10]||(T[10]=n("div",{class:"section-label"},"产出物",-1)),n("div",$u,[(c(!0),d(Y,null,ct(i.value.artifacts,k=>(c(),d("div",{key:k,class:"artifact-item"}," 📄 "+f(k),1))),128))])])):M("",!0)])])):M("",!0)]))])}}}),wu=Ct(ku,[["__scopeId","data-v-5e7f751f"]]),Cu={class:"agent-config-panel"},Tu={class:"header"},Su=["disabled"],xu={key:0,class:"loading-state"},Au={key:1,class:"error-state"},Iu={key:2,class:"config-content"},Mu={class:"config-section"},Ru={class:"info-grid"},Eu={class:"info-item"},Pu={class:"value monospace"},Du={class:"info-item"},Fu={class:"value"},Ou={class:"info-item full-width"},Lu={class:"value monospace"},Nu={class:"info-item"},ju={class:"config-section"},Uu={class:"model-config"},Vu={class:"model-field"},Wu={class:"model-select-wrapper"},Hu=["disabled"],Bu=["label"],Ku=["value"],qu={key:0,class:"current-model"},Gu={class:"model-field"},zu={class:"fallbacks-list"},Ju=["onUpdate:modelValue","disabled"],Qu=["label"],Yu=["value"],Xu=["onClick","disabled"],Zu=["disabled"],td={class:"model-actions"},ed=["disabled"],sd=["disabled"],nd={key:0,class:"config-section"},ld={class:"description-text"},id=wt({__name:"AgentConfigPanel",props:{agentId:{}},setup(t){const e=t,s=V(null),l=V([]),i=V(!1),o=V(!1),a=V(""),r=V(""),u=V([]),v=Q(()=>{const k={};for(const b of l.value)k[b.provider]||(k[b.provider]=[]),k[b.provider].push(b);return Object.entries(k).map(([b,R])=>({provider:b,models:R}))}),p=Q(()=>{var b;if(!((b=s.value)!=null&&b.model))return!1;const k=s.value.model;return r.value!==k.primary||JSON.stringify(u.value.filter(R=>R))!==JSON.stringify(k.fallbacks||[])});function C(k){return{idle:"空闲",working:"工作中",down:"异常"}[k]||k}function A(k){if(!k)return"";const b=k.split("/");return b.length>1?b[b.length-1]:k}async function S(){var k;i.value=!0,a.value="";try{const[b,R]=await Promise.all([fetch(`/api/agent-config/${e.agentId}`),fetch("/api/available-models")]);if(b.ok?(s.value=await b.json(),(k=s.value)!=null&&k.model&&(r.value=s.value.model.primary||"",u.value=[...s.value.model.fallbacks||[]])):a.value="加载配置失败",R.ok){const K=await R.json();l.value=K.models||[]}}catch(b){a.value="加载失败: "+b.message}finally{i.value=!1}}function m(){u.value.length<3&&u.value.push("")}function T(k){u.value.splice(k,1)}function D(){var k;(k=s.value)!=null&&k.model&&(r.value=s.value.model.primary||"",u.value=[...s.value.model.fallbacks||[]])}async function $(){if(p.value){o.value=!0;try{const k=await fetch(`/api/agent-config/${e.agentId}/model`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({primary:r.value||null,fallbacks:u.value.filter(b=>b)||null})});if(k.ok){const b=await k.json();s.value&&b.model&&(s.value.model=b.model),alert("模型配置已保存!重启 Agent 后生效。")}else{const b=await k.json();alert("保存失败: "+(b.detail||"未知错误"))}}catch(k){alert("保存失败: "+k.message)}finally{o.value=!1}}}return Bt(()=>e.agentId,()=>{S()},{immediate:!0}),Nt(()=>{S()}),(k,b)=>{var R;return c(),d("div",Cu,[n("div",Tu,[b[1]||(b[1]=n("h3",null,"⚙️ Agent 配置",-1)),n("button",{class:"refresh-btn",onClick:S,disabled:i.value},f(i.value?"加载中...":"刷新"),9,Su)]),i.value&&!s.value?(c(),d("div",xu," 加载配置... ")):a.value?(c(),d("div",Au,f(a.value),1)):s.value?(c(),d("div",Iu,[n("div",Mu,[b[6]||(b[6]=n("h4",null,"基本信息",-1)),n("div",Ru,[n("div",Eu,[b[2]||(b[2]=n("span",{class:"label"},"ID",-1)),n("span",Pu,f(s.value.id),1)]),n("div",Du,[b[3]||(b[3]=n("span",{class:"label"},"名称",-1)),n("span",Fu,f(s.value.name),1)]),n("div",Ou,[b[4]||(b[4]=n("span",{class:"label"},"工作区",-1)),n("span",Lu,f(s.value.workspace||"未设置"),1)]),n("div",Nu,[b[5]||(b[5]=n("span",{class:"label"},"状态",-1)),n("span",{class:nt(["value",`status-${s.value.status}`])},f(C(s.value.status)),3)])])]),n("div",ju,[b[11]||(b[11]=n("h4",null,"模型配置",-1)),n("div",Uu,[n("div",Vu,[b[8]||(b[8]=n("label",null,"主模型 (Primary)",-1)),n("div",Wu,[Tt(n("select",{"onUpdate:modelValue":b[0]||(b[0]=K=>r.value=K),disabled:o.value,class:"model-select"},[b[7]||(b[7]=n("option",{value:""},"-- 选择模型 --",-1)),(c(!0),d(Y,null,ct(v.value,K=>(c(),d("optgroup",{key:K.provider,label:K.provider},[(c(!0),d(Y,null,ct(K.models,x=>(c(),d("option",{key:x.id,value:x.id},f(x.name),9,Ku))),128))],8,Bu))),128))],8,Hu),[[Pe,r.value]]),(R=s.value.model)!=null&&R.primary?(c(),d("span",qu," 当前: "+f(A(s.value.model.primary)),1)):M("",!0)])]),n("div",Gu,[b[10]||(b[10]=n("label",null,"备选模型 (Fallbacks)",-1)),n("div",zu,[(c(!0),d(Y,null,ct(u.value,(K,x)=>(c(),d("div",{key:x,class:"fallback-item"},[Tt(n("select",{"onUpdate:modelValue":F=>u.value[x]=F,disabled:o.value,class:"model-select small"},[b[9]||(b[9]=n("option",{value:""},"-- 选择 --",-1)),(c(!0),d(Y,null,ct(v.value,F=>(c(),d("optgroup",{key:F.provider,label:F.provider},[(c(!0),d(Y,null,ct(F.models,X=>(c(),d("option",{key:X.id,value:X.id},f(X.name),9,Yu))),128))],8,Qu))),128))],8,Ju),[[Pe,u.value[x]]]),n("button",{class:"remove-btn",onClick:F=>T(x),disabled:o.value},"×",8,Xu)]))),128)),n("button",{class:"add-fallback-btn",onClick:m,disabled:o.value||u.value.length>=3}," + 添加备选模型 ",8,Zu)])]),n("div",td,[n("button",{class:"save-btn",onClick:$,disabled:o.value||!p.value},f(o.value?"保存中...":"保存修改"),9,ed),n("button",{class:"reset-btn",onClick:D,disabled:o.value}," 重置 ",8,sd)])])]),s.value.description?(c(),d("div",nd,[b[12]||(b[12]=n("h4",null,"描述",-1)),n("p",ld,f(s.value.description),1)])):M("",!0)])):M("",!0)])}}}),od=Ct(id,[["__scopeId","data-v-c0a2c245"]]),ad={class:"error-analysis-view"},rd={class:"header"},cd=["disabled"],ud={key:0,class:"agent-summary"},dd={class:"summary-card total"},fd={class:"count"},hd={key:0,class:"summary-card critical"},pd={class:"count"},vd={key:1,class:"summary-card high"},gd={class:"count"},md={key:2,class:"summary-card medium"},_d={class:"count"},yd={key:1,class:"loading-state"},bd={key:2,class:"empty-state"},$d={key:3,class:"errors-list"},kd=["onClick"],wd={class:"error-header"},Cd={class:"error-badges"},Td={key:0,class:"badge archived",title:"已归档的子任务"},Sd={key:1,class:"badge provider"},xd={key:2,class:"badge model"},Ad={class:"error-time"},Id={class:"error-message"},Md={key:0,class:"error-detail"},Rd={class:"detail-section"},Ed={class:"error-full"},Pd={key:0,class:"detail-section"},Dd={class:"tool-chain"},Fd={class:"tool-index"},Od={class:"tool-name"},Ld={class:"tool-time"},Nd={key:1,class:"detail-section"},jd={class:"suggestions"},Ud={class:"detail-section meta"},Vd={key:4,class:"type-summary"},Wd={class:"type-bars"},Hd={class:"type-label"},Bd={class:"bar-container"},Kd={class:"type-count"},qd=wt({__name:"ErrorAnalysisView",props:{agentId:{}},setup(t){const e=t,s=V([]),l=V(null),i=V(!1),o=V(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 u(S){return S?new Date(S).toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):""}function v(S,m){return!S||S.length<=m?S||"":S.slice(0,m)+"..."}function p(S,m){return m?Math.round(S/m*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 A(){if(e.agentId){i.value=!0;try{const S=await fetch(`/api/error-analysis/${e.agentId}?session_limit=5`);if(S.ok){const m=await S.json();s.value=m.errors||[],l.value=m.summary||null}}catch(S){console.error("Failed to load error analysis:",S)}finally{i.value=!1}}}return Bt(()=>e.agentId,()=>{A()},{immediate:!0}),Nt(()=>{A()}),(S,m)=>{var T,D,$,k;return c(),d("div",ad,[n("div",rd,[m[0]||(m[0]=n("h3",null,"🔍 错误分析",-1)),n("button",{class:"refresh-btn",onClick:A,disabled:i.value},f(i.value?"分析中...":"刷新"),9,cd)]),l.value?(c(),d("div",ud,[n("div",dd,[n("span",fd,f(l.value.total||0),1),m[1]||(m[1]=n("span",{class:"label"},"错误数",-1))]),(T=l.value.bySeverity)!=null&&T.critical?(c(),d("div",hd,[n("span",pd,f(l.value.bySeverity.critical),1),m[2]||(m[2]=n("span",{class:"label"},"严重",-1))])):M("",!0),(D=l.value.bySeverity)!=null&&D.high?(c(),d("div",vd,[n("span",gd,f(l.value.bySeverity.high),1),m[3]||(m[3]=n("span",{class:"label"},"高",-1))])):M("",!0),($=l.value.bySeverity)!=null&&$.medium?(c(),d("div",md,[n("span",_d,f(l.value.bySeverity.medium),1),m[4]||(m[4]=n("span",{class:"label"},"中",-1))])):M("",!0)])):M("",!0),i.value&&!s.value.length?(c(),d("div",yd," 正在分析错误... ")):s.value.length?(c(),d("div",$d,[(c(!0),d(Y,null,ct(s.value,(b,R)=>{var K,x;return c(),d("div",{key:R,class:nt(["error-item",`severity-${b.severity}`]),onClick:F=>C(R)},[n("div",wd,[n("span",{class:"error-type",style:St({color:b.severityColor})},f(b.severityLabel)+" - "+f(b.errorTypeLabel),5),n("div",Cd,[b.isArchived?(c(),d("span",Td,"📦 归档")):M("",!0),b.provider?(c(),d("span",Sd,f(b.provider),1)):M("",!0),b.model?(c(),d("span",xd,f(b.model),1)):M("",!0)]),n("span",Ad,f(u(b.timestamp)),1)]),n("div",Id,f(v(b.rawMessage,150)),1),o.value.has(R)?(c(),d("div",Md,[n("div",Rd,[m[5]||(m[5]=n("h4",null,"错误信息",-1)),n("pre",Ed,f(b.rawMessage||"无详细信息"),1)]),(K=b.toolChain)!=null&&K.length?(c(),d("div",Pd,[m[6]||(m[6]=n("h4",null,"工具调用链(错误前)",-1)),n("div",Dd,[(c(!0),d(Y,null,ct(b.toolChain,(F,X)=>(c(),d("div",{key:X,class:"tool-item"},[n("span",Fd,f(X+1),1),n("span",Od,f(F.toolName),1),n("span",Ld,f(u(F.timestamp)),1)]))),128))])])):M("",!0),(x=b.suggestions)!=null&&x.length?(c(),d("div",Nd,[m[7]||(m[7]=n("h4",null,"修复建议",-1)),n("ul",jd,[(c(!0),d(Y,null,ct(b.suggestions,(F,X)=>(c(),d("li",{key:X},f(F),1))),128))])])):M("",!0),n("div",Ud,[n("span",null,"Session: "+f(b.sessionFile),1),n("span",null,"Turn: "+f(b.turnIndex),1)])])):M("",!0)],10,kd)}),128))])):(c(),d("div",bd," ✅ 暂无错误记录 ")),(k=l.value)!=null&&k.byType&&Object.keys(l.value.byType).length>0?(c(),d("div",Vd,[m[8]||(m[8]=n("h4",null,"错误类型分布",-1)),n("div",Wd,[(c(!0),d(Y,null,ct(l.value.byType,(b,R)=>(c(),d("div",{key:R,class:"type-bar"},[n("span",Hd,f(r(R)),1),n("div",Bd,[n("div",{class:"bar-fill",style:St({width:p(b,l.value.total)})},null,4)]),n("span",Kd,f(b),1)]))),128))])])):M("",!0)])}}}),Gd=Ct(qd,[["__scopeId","data-v-bc05715d"]]),zd={class:"header"},Jd={class:"content"},Qd={class:"section"},Yd={class:"status-info"},Xd={class:"status-text"},Zd={key:0,class:"section"},tf={key:1,class:"section"},ef={key:2,class:"section"},sf={class:"error-info"},nf={class:"error-type"},lf={class:"error-message"},of={key:3,class:"section"},af={class:"diagnostic-header"},rf={class:"diagnostic-icon"},cf={class:"diagnostic-title"},uf={class:"diagnostic-content"},df={class:"diagnostic-item"},ff={class:"item-value highlight"},hf={key:0,class:"diagnostic-item"},pf={class:"item-value"},vf={key:1,class:"diagnostic-item"},gf={class:"item-value"},mf={class:"diagnostic-actions"},_f={class:"section"},yf={class:"activity-list"},bf={key:0,class:"activity-item working"},$f={key:1,class:"activity-item idle"},kf={key:2,class:"activity-item down"},wf={class:"section"},Cf={class:"view-tabs"},Tf={key:0,class:"timeline-container"},Sf={key:1,class:"chain-container"},xf={key:2,class:"advanced-container"},Af={class:"advanced-section"},If={class:"advanced-section"},Mf=5*60*1e3,Rf=15*60*1e3,Ef=wt({__name:"AgentDetailPanel",props:{agent:{}},emits:["close"],setup(t){const e=t,s=V("timeline"),l=V(null),i=V(Date.now());let o=null;const a=Q(()=>({idle:"空闲",working:"工作中",down:"异常"})[e.agent.status]||"未知"),r=Q(()=>{if(e.agent.status!=="working")return null;const D=e.agent.lastActiveAt||0,$=i.value-D;return $>Rf?{isStuck:!0,idleMinutes:Math.floor($/6e4),severity:"critical",label:"严重卡顿"}:$>Mf?{isStuck:!0,idleMinutes:Math.floor($/6e4),severity:"warning",label:"可能卡顿"}:null}),u=Q(()=>{var b;if(!((b=l.value)!=null&&b.archiveAtMs))return null;const D=l.value.archiveAtMs-i.value;if(D<=0)return"即将超时";const $=Math.floor(D/6e4),k=Math.floor(D%6e4/1e3);return`${$}分${k}秒`}),v=Q(()=>{if(!p.value.length)return null;const D=p.value[p.value.length-1];if(D.role==="toolResult"){const $=D.content[0];if($){const k=$.text||$.content||"";return{tool:D.toolName||"未知工具",status:$.status||"completed",result:k.slice(0,100)||"(无输出)"}}}return null}),p=V([]),C=V(!1);async function A(){var D;if((D=e.agent)!=null&&D.id){C.value=!0;try{const $=await fetch(`/api/agents/${e.agent.id}/output?limit=30`);if($.ok){const k=await $.json();p.value=k.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 D=await fetch("/api/chains?limit=10");if(D.ok){const k=(await D.json()).activeChain;if(k!=null&&k.nodes){const b=k.nodes.find(R=>R.agentId===e.agent.id);b&&b.status==="running"&&(l.value={runId:k.chainId,status:"running",startedAt:b.startedAt,archiveAtMs:k.archiveAtMs})}}}catch{}}async function m(){var D;if((D=l.value)!=null&&D.runId&&confirm("确定要取消这个任务吗?"))try{alert("取消功能需要 OpenClaw 支持,请使用命令行: openclaw subagents cancel "+l.value.runId)}catch($){console.error("Cancel failed:",$)}}function T(){A(),S()}return Bt(()=>{var D;return(D=e.agent)==null?void 0:D.id},()=>{A(),S()},{immediate:!0}),Bt(()=>e.agent.status,S),Nt(()=>{o=setInterval(()=>{i.value=Date.now()},1e3)}),ae(()=>{o&&(clearInterval(o),o=null)}),(D,$)=>(c(),d("div",{class:"panel-overlay",onClick:$[5]||($[5]=k=>D.$emit("close"))},[n("div",{class:"panel",onClick:$[4]||($[4]=le(()=>{},["stop"]))},[n("div",zd,[n("h2",null,f(t.agent.name),1),n("button",{class:"close-btn",onClick:$[0]||($[0]=k=>D.$emit("close"))},"×")]),n("div",Jd,[n("div",Qd,[$[6]||($[6]=n("h3",null,"状态",-1)),n("div",Yd,[n("span",{class:nt(["status-dot",`status-${t.agent.status}`])},null,2),n("span",Xd,f(a.value),1)])]),t.agent.currentTask?(c(),d("div",Zd,[$[7]||($[7]=n("h3",null,"当前任务",-1)),n("p",null,f(t.agent.currentTask),1)])):M("",!0),t.agent.lastActiveFormatted?(c(),d("div",tf,[$[8]||($[8]=n("h3",null,"最后活跃",-1)),n("p",null,f(t.agent.lastActiveFormatted),1)])):M("",!0),t.agent.error?(c(),d("div",ef,[$[9]||($[9]=n("h3",{class:"error-title"},"错误信息",-1)),n("div",sf,[n("div",nf,f(t.agent.error.type),1),n("div",lf,f(t.agent.error.message),1)])])):M("",!0),r.value?(c(),d("div",of,[n("div",{class:nt(["diagnostic-panel",`severity-${r.value.severity}`])},[n("div",af,[n("span",rf,f(r.value.severity==="critical"?"🚨":"⚠️"),1),n("span",cf,f(r.value.label)+"检测",1)]),n("div",uf,[n("div",df,[$[10]||($[10]=n("span",{class:"item-label"},"无响应时间:",-1)),n("span",ff,f(r.value.idleMinutes)+" 分钟",1)]),v.value?(c(),d("div",hf,[$[11]||($[11]=n("span",{class:"item-label"},"最后操作:",-1)),n("span",pf,f(v.value.tool)+" → "+f(v.value.result),1)])):M("",!0),u.value?(c(),d("div",vf,[$[12]||($[12]=n("span",{class:"item-label"},"自动超时:",-1)),n("span",gf,f(u.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",mf,[l.value?(c(),d("button",{key:0,class:"action-btn primary",onClick:m}," 取消任务 ")):M("",!0),n("button",{class:"action-btn",onClick:T}," 刷新状态 ")])])],2)])):M("",!0),n("div",_f,[$[14]||($[14]=n("h3",null,"最近活动",-1)),n("div",yf,[t.agent.status==="working"?(c(),d("div",bf," 💼 正在执行任务... ")):t.agent.status==="idle"?(c(),d("div",$f," 😴 空闲中 ")):t.agent.status==="down"?(c(),d("div",kf," ⚠️ 检测到错误 ")):M("",!0)])]),n("div",wf,[n("div",Cf,[n("button",{class:nt(["tab-btn",{active:s.value==="timeline"}]),onClick:$[1]||($[1]=k=>s.value="timeline")}," 📊 时序视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="chain"}]),onClick:$[2]||($[2]=k=>s.value="chain")}," 🔗 链路视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="advanced"}]),onClick:$[3]||($[3]=k=>s.value="advanced")}," ⚙️ 高级 ",2)]),s.value==="timeline"?(c(),d("div",Tf,[bt(rs(kc),{agentId:t.agent.id,autoRefresh:!1},null,8,["agentId"])])):s.value==="chain"?(c(),d("div",Sf,[bt(rs(wu),{autoRefresh:!0,refreshInterval:10})])):s.value==="advanced"?(c(),d("div",xf,[n("div",Af,[$[15]||($[15]=n("h4",null,"⚙️ 配置",-1)),bt(od,{agentId:t.agent.id},null,8,["agentId"])]),n("div",If,[$[16]||($[16]=n("h4",null,"🔍 错误分析",-1)),bt(Gd,{agentId:t.agent.id},null,8,["agentId"])])])):M("",!0)])])])]))}}),Pf=Ct(Ef,[["__scopeId","data-v-aec763c1"]]),Df={class:"settings-panel"},Ff={class:"header"},Of={class:"content"},Lf={class:"setting-item"},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=wt({__name:"SettingsPanel",emits:["close"],setup(t,{emit:e}){const s=e,l=V(10),i=V(!0),o=V(!0),a=V(!0),r=V(!0),u=V(!1),v=V(100),p=V(!0);function C(){const S=localStorage.getItem("dashboard-settings");if(S)try{const m=JSON.parse(S);l.value=m.refreshInterval||10,i.value=m.autoRefreshEnabled!==!1,o.value=m.showTimestamps!==!1,a.value=m.showTokens!==!1,r.value=m.notifyOnError!==!1,u.value=m.notifyOnComplete||!1,v.value=m.logLines||100,p.value=m.autoScrollLog!==!1}catch(m){console.error("加载设置失败:",m)}}function A(){const S={refreshInterval:l.value,autoRefreshEnabled:i.value,showTimestamps:o.value,showTokens:a.value,notifyOnError:r.value,notifyOnComplete:u.value,logLines:v.value,autoScrollLog:p.value};localStorage.setItem("dashboard-settings",JSON.stringify(S)),s("settings-changed",S)}return Nt(()=>{C()}),(S,m)=>(c(),d("div",Df,[n("div",Ff,[m[9]||(m[9]=n("h2",null,"设置",-1)),n("button",{class:"close-btn",onClick:m[0]||(m[0]=T=>S.$emit("close"))},"×")]),n("div",Of,[n("section",null,[m[12]||(m[12]=n("h3",null,"自动刷新",-1)),n("div",Lf,[m[10]||(m[10]=n("label",null,"刷新间隔(秒)",-1)),Tt(n("input",{type:"number","onUpdate:modelValue":m[1]||(m[1]=T=>l.value=T),min:"1",max:"300",onChange:A},null,544),[[jn,l.value,void 0,{number:!0}]])]),n("div",Nf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[2]||(m[2]=T=>i.value=T),onChange:A},null,544),[[Oe,i.value]]),m[11]||(m[11]=At(" 启用自动刷新 ",-1))])])]),n("section",null,[m[15]||(m[15]=n("h3",null,"显示选项",-1)),n("div",jf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[3]||(m[3]=T=>o.value=T),onChange:A},null,544),[[Oe,o.value]]),m[13]||(m[13]=At(" 显示时间戳 ",-1))])]),n("div",Uf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[4]||(m[4]=T=>a.value=T),onChange:A},null,544),[[Oe,a.value]]),m[14]||(m[14]=At(" 显示 Token 消耗 ",-1))])])]),n("section",null,[m[18]||(m[18]=n("h3",null,"通知",-1)),n("div",Vf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[5]||(m[5]=T=>r.value=T),onChange:A},null,544),[[Oe,r.value]]),m[16]||(m[16]=At(" Agent 异常时通知 ",-1))])]),n("div",Wf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[6]||(m[6]=T=>u.value=T),onChange:A},null,544),[[Oe,u.value]]),m[17]||(m[17]=At(" 任务完成时通知 ",-1))])])]),n("section",null,[m[22]||(m[22]=n("h3",null,"日志查看",-1)),n("div",Hf,[m[20]||(m[20]=n("label",null,"日志行数",-1)),Tt(n("select",{"onUpdate:modelValue":m[7]||(m[7]=T=>v.value=T),onChange:A},[...m[19]||(m[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",Bf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[8]||(m[8]=T=>p.value=T),onChange:A},null,544),[[Oe,p.value]]),m[21]||(m[21]=At(" 自动滚动日志 ",-1))])])])])]))}}),qf=Ct(Kf,[["__scopeId","data-v-e5b26232"]]);function Gf(t,e=300){const s=V(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 zf{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 zf(t)),tn}class Jf{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,V(s))}useStore(e,s){const l=this.state.get(e);if(l)return l;const i=V(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 Qf(){return en||(en=new Jf),en}class Yf{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 Xf(){return sn||(sn=new Yf),sn}function Oi(){const t=Fi(),e=V(t.getConnectionState()),s=V(!1);let l=null;const i=(r,u)=>t.subscribe(r,u),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 Zf={class:"indicator-icon"},th={key:0,class:"indicator-count"},eh={class:"card-header"},sh={class:"avatar"},nh={class:"header-info"},lh={class:"name"},ih={class:"status-text"},oh={key:0,class:"main-badge"},ah={class:"card-body"},rh={key:0,class:"model-row"},ch={class:"model-value"},uh=["title"],dh={key:0,class:"fallback-more"},fh={key:1,class:"current-task"},hh=["title"],ph={key:0,class:"task-child-info"},vh={class:"child-name"},gh={key:2,class:"multi-tasks"},mh={class:"tasks-count"},_h={class:"tasks-toggle"},yh=["title"],bh={key:0,class:"task-child-agent"},$h={key:0,class:"tasks-more"},kh={class:"action-icon"},wh={class:"action-text"},Ch={key:4,class:"idle-hint"},Th={class:"warning-modal"},Sh={class:"modal-header"},xh={class:"modal-icon"},Ah={class:"modal-title"},Ih={class:"modal-body"},Mh={class:"detail-row"},Rh={class:"detail-value error-type-tag"},Eh={class:"detail-row"},Ph={class:"detail-value"},Dh={class:"detail-row"},Fh={class:"detail-value highlight"},Oh={key:0,class:"detail-row"},Lh={class:"detail-value"},Nh={key:1,class:"detail-row"},jh={class:"detail-value"},Uh={key:2,class:"detail-row"},Vh={key:0,class:"waiting-task"},Wh={key:3,class:"stuck-suggestion"},Hh=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=V(!1),o=V(!1),a=["🤖","👤","📊","🏗️","💻","🧪","🔧","📋","🎯","⚙️"],r=Q(()=>{const x=(s.agent.name||"").toLowerCase();if(x.includes("pm")||x.includes("project")||x.includes("主"))return"👨💼";if(x.includes("analyst")||x.includes("分析"))return"📊";if(x.includes("architect")||x.includes("架构"))return"🏗️";if(x.includes("dev")||x.includes("开发"))return"💻";if(x.includes("qa")||x.includes("test")||x.includes("测试"))return"🧪";if(x.includes("ops")||x.includes("运维"))return"🔧";if(x.includes("frontend")||x.includes("前端"))return"🎨";if(x.includes("backend")||x.includes("后端"))return"⚙️";let F=0;for(let X=0;X<x.length;X++)F=(F<<5)-F+x.charCodeAt(X);return a[Math.abs(F)%a.length]}),u=Q(()=>({idle:"空闲",working:"工作中",down:"异常"})[s.agent.status]||"未知"),v=Q(()=>{var x;return((x=s.agentTasks)==null?void 0:x.length)||0}),p=Q(()=>s.isMain&&v.value>=2),C=Q(()=>s.agentTasks?s.agentTasks.slice(0,3):[]),A=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),m=Q(()=>{if(s.agentTasks&&s.agentTasks.length===1)return s.agentTasks[0].childAgentId}),T=Q(()=>({thinking:"🧠",tool_executing:"⚙️",waiting_llm:"📡",waiting_child:"⏳"})[s.subStatus||""]||"🔄"),D=Q(()=>{var F;return{"rate-limit":"请求过快","token-limit":"Token 超限",timeout:"请求超时",quota:"余额不足",unknown:"发生错误"}[((F=s.error)==null?void 0:F.type)||"unknown"]||"发生错误"}),$=Q(()=>{var F;return{waiting_for_child:"等待子代理响应",self_busy:"自身处理中",unknown:"原因未明"}[((F=s.stuckWarning)==null?void 0:F.reason)||"unknown"]||"原因未明"}),k=Q(()=>{if(!s.stuckWarning)return null;const x=s.stuckWarning.reason,F=s.stuckWarning.idleSeconds;return x==="waiting_for_child"?F>180?"子代理响应时间过长,建议检查子代理状态或考虑终止任务":"子代理正在执行任务,请耐心等待":x==="self_busy"?F>120?"任务处理时间过长,可能遇到复杂问题或外部资源阻塞":"正在处理复杂任务,请稍候":null});function b(x){const F=x.split("/");return F[F.length-1]||x}function R(){i.value=!0}function K(x){l("navigate-agent",x),i.value=!1}return(x,F)=>{var X;return c(),d("div",{class:nt(["agent-card",[`status-${t.agent.status}`,{"is-main":t.isMain}]]),onClick:F[4]||(F[4]=H=>x.$emit("click"))},[t.error||t.stuckWarning?(c(),d("div",{key:0,class:nt(["warning-indicator",{"has-error":t.error}]),onClick:le(R,["stop"])},[n("span",Zf,f(t.error?"⚠️":"⏳"),1),t.stuckWarning?(c(),d("span",th,f(t.stuckWarning.idleSeconds)+"s",1)):M("",!0)],2)):M("",!0),n("div",eh,[n("div",sh,f(r.value),1),n("div",nh,[n("div",lh,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",ih,f(u.value),1)],2)]),t.isMain?(c(),d("div",oh,"PM")):M("",!0)]),n("div",ah,[t.modelInfo&&t.modelInfo.primary?(c(),d("div",rh,[F[5]||(F[5]=n("span",{class:"model-label"},"模型",-1)),n("span",ch,f(b(t.modelInfo.primary)),1),(X=t.modelInfo.fallbacks)!=null&&X.length?(c(),d("span",{key:0,class:"model-fallbacks",title:"备用: "+t.modelInfo.fallbacks.map(b).join(", ")},[(c(!0),d(Y,null,ct(t.modelInfo.fallbacks.slice(0,2),(H,q)=>(c(),d("span",{key:H,class:"fallback-tag"},f(b(H)),1))),128)),t.modelInfo.fallbacks.length>2?(c(),d("span",dh,"+"+f(t.modelInfo.fallbacks.length-2),1)):M("",!0)],8,uh)):M("",!0)])):M("",!0),S.value&&!p.value?(c(),d("div",fh,[F[7]||(F[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,hh),m.value?(c(),d("div",ph,[F[6]||(F[6]=n("span",{class:"child-arrow"},"→",-1)),n("span",vh,f(m.value),1)])):M("",!0)])):M("",!0),p.value?(c(),d("div",gh,[n("div",{class:"tasks-header",onClick:F[0]||(F[0]=le(H=>o.value=!o.value,["stop"]))},[F[8]||(F[8]=n("span",{class:"tasks-icon"},"📋",-1)),F[9]||(F[9]=n("span",{class:"tasks-label"},"并行任务",-1)),n("span",mh,f(v.value),1),n("span",_h,f(o.value?"▲":"▼"),1)]),n("div",{class:nt(["tasks-list",{expanded:o.value}])},[(c(!0),d(Y,null,ct(C.value,H=>(c(),d("div",{key:H.id,class:nt(["task-item",`task-status-${H.status}`])},[F[10]||(F[10]=n("span",{class:"task-status-dot"},null,-1)),n("span",{class:"task-name",title:H.name},f(H.name),9,yh),H.childAgentId?(c(),d("span",bh,"→ "+f(H.childAgentId),1)):M("",!0)],2))),128)),A.value>0?(c(),d("div",$h," +"+f(A.value)+" 更多任务 ",1)):M("",!0)],2)])):M("",!0),t.agent.status==="working"&&t.currentAction?(c(),d("div",{key:3,class:nt(["status-detail",`sub-status-${t.subStatus}`])},[n("span",kh,f(T.value),1),n("span",wh,f(t.currentAction),1)],2)):t.agent.status==="idle"?(c(),d("div",Ch," 空闲中,等待任务... ")):M("",!0)]),(c(),Gt(Po,{to:"body"},[i.value?(c(),d("div",{key:0,class:"warning-modal-overlay",onClick:F[3]||(F[3]=le(H=>i.value=!1,["self"]))},[n("div",Th,[n("div",Sh,[n("span",xh,f(t.error?"⚠️":"⏳"),1),n("span",Ah,f(t.error?"异常详情":"卡顿分析"),1),n("button",{class:"modal-close",onClick:F[1]||(F[1]=H=>i.value=!1)},"×")]),n("div",Ih,[t.error?(c(),d(Y,{key:0},[n("div",Mh,[F[11]||(F[11]=n("span",{class:"detail-label"},"类型",-1)),n("span",Rh,f(D.value),1)]),n("div",Eh,[F[12]||(F[12]=n("span",{class:"detail-label"},"信息",-1)),n("span",Ph,f(t.error.message),1)])],64)):t.stuckWarning?(c(),d(Y,{key:1},[n("div",Dh,[F[13]||(F[13]=n("span",{class:"detail-label"},"等待时间",-1)),n("span",Fh,f(t.stuckWarning.idleSeconds)+" 秒",1)]),t.stuckWarning.reason?(c(),d("div",Oh,[F[14]||(F[14]=n("span",{class:"detail-label"},"原因",-1)),n("span",Lh,f($.value),1)])):M("",!0),t.stuckWarning.reasonDetail?(c(),d("div",Nh,[F[15]||(F[15]=n("span",{class:"detail-label"},"详情",-1)),n("span",jh,f(t.stuckWarning.reasonDetail),1)])):M("",!0),t.stuckWarning.waitingFor?(c(),d("div",Uh,[F[16]||(F[16]=n("span",{class:"detail-label"},"等待对象",-1)),n("span",{class:"detail-value agent-link",onClick:F[2]||(F[2]=H=>K(t.stuckWarning.waitingFor.agentId))},[At(f(t.stuckWarning.waitingFor.agentId)+" ",1),t.stuckWarning.waitingFor.task?(c(),d("span",Vh,"("+f(t.stuckWarning.waitingFor.task)+")",1)):M("",!0)])])):M("",!0),k.value?(c(),d("div",Wh,[F[17]||(F[17]=n("span",{class:"suggestion-icon"},"💡",-1)),n("span",null,f(k.value),1)])):M("",!0)],64)):M("",!0)])])])):M("",!0)]))],2)}}}),Bh=Ct(Hh,[["__scopeId","data-v-04c4a970"]]),Kh={class:"collaboration-flow-section"},qh={class:"section-header"},Gh={class:"header-right"},zh={key:0,class:"flow-legend flow-legend-inline"},Jh={class:"legend-name"},Qh={class:"indicator-text"},Yh={class:"flow-container",ref:"flowContainerRef"},Xh={key:0,class:"loading-state"},Zh={key:1,class:"error-state"},tp={key:2,class:"empty-state"},ep={key:3,class:"flow-layout"},sp={class:"level-header"},np={class:"level-badge"},lp={class:"level-title"},ip={class:"level-cards"},op=["onClick"],ap=["d"],rp={key:0,r:"5",fill:"url(#lightGradient)"},cp={dur:"2s",repeatCount:"1",rotate:"0"},up=["href"],dp={key:0,class:"model-panel"},fp={class:"model-toggle-icon"},hp={class:"model-panel-body"},pp={class:"model-name"},vp={class:"model-dots"},gp=["title","onClick"],mp={class:"model-count"},_p={class:"call-detail-modal"},yp={class:"call-detail-header"},bp={class:"call-detail-body"},$p={class:"call-detail-row"},kp={class:"value"},wp={class:"call-detail-row"},Cp={class:"value"},Tp={class:"call-detail-row"},Sp={class:"value"},xp={class:"call-detail-row"},Ap={class:"value"},Ip={class:"call-detail-row trigger"},Mp={class:"value"},Rp=1500,Ep=wt({__name:"CollaborationFlowSection",props:{mainAgent:{},subAgents:{},mainAgentId:{}},emits:["agent-click"],setup(t,{emit:e}){const s=t,l=e,{connectionState:i,subscribe:o}=Oi(),a=V([]),r=V([]),u=V([]),v=V({}),p=V([]),C=V(!0),A=V(null),S=V(null),m=V({}),T=V({}),D=V(""),$=V(!0),k=V({}),b=V(null),R=V(null),K=V({});function x(g,_){_&&(K.value[g]=_)}const F=Q(()=>s.mainAgentId?s.mainAgentId:D.value?D.value:"main"),X=Q(()=>a.value.filter(g=>g.type==="agent")),H=Q(()=>a.value.filter(g=>g.type==="model")),q=Q(()=>r.value.filter(g=>g.type==="delegates")),G=Q(()=>{const g={};for(const U of X.value){const O=Z(U.id);g[O]||(g[O]=[]),g[O].push(U)}const _={};return Object.keys(g).map(Number).sort((U,O)=>U-O).forEach(U=>{_[U]=g[U]}),_});function I(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===F.value?"#4a9eff":st[g]||"#64748b"}const P=Q(()=>X.value.map(g=>g.id).filter(Boolean)),L=Q(()=>({connected:"已连接",connecting:"连接中...",disconnected:"未连接",error:"连接错误"})[i.value.status]||"未知");function Z(g){return g===F.value?T.value[g]??0:T.value[g]??1}function it(g){const _=X.value.find(U=>U.id===g);return(_==null?void 0:_.name)||g}function N(g){var O;const _=j=>j==="error"?"down":j,U=g.id===F.value?s.mainAgent:(O=s.subAgents)==null?void 0:O.find(j=>j.id===g.id);if(U&&g.type==="agent"){const j=ot(g.id);let w;return(j==null?void 0:j.length)===1?w=j[0].name:j&&j.length>1&&(w=`${j.length} 个任务进行中`),{name:U.name,status:_(g.status),currentTask:w??U.currentTask,lastActiveFormatted:U.lastActiveFormatted}}return U?{name:U.name,status:U.status,currentTask:U.currentTask,lastActiveFormatted:U.lastActiveFormatted}:{name:g.name,status:_(g.status)}}function W(g){if(g.type==="agent")return v.value[g.id]}function ot(g){return k.value[g]}function lt(g){return u.value.includes(g.id)}function ft(g){return u.value.includes(g.source)&&u.value.includes(g.target)}function tt(g){const _=K.value[g.source],U=K.value[g.target],O=b.value;if(!_||!U||!O)return"";const j=O.getBoundingClientRect(),w=_.getBoundingClientRect(),J=U.getBoundingClientRect(),z=w.left-j.left+w.width/2,et=w.top-j.top+w.height,at=J.left-j.left+J.width/2,dt=J.top-j.top,vt=(et+dt)/2;return`M ${z} ${et} C ${z} ${vt}, ${at} ${vt}, ${at} ${dt}`}function kt(){Me(()=>{if(!b.value||!R.value)return;const g=b.value.getBoundingClientRect();R.value.setAttribute("width",String(g.width)),R.value.setAttribute("height",String(g.height))})}const It=Q(()=>{const g={};for(const _ of p.value){const U=_.model||"(unknown)";g[U]||(g[U]=[]),g[U].push(_)}return g});function Dt(g){var O;const _=((O=g.metadata)==null?void 0:O.modelId)||"",U=_.split("/").pop()||_;return It.value[_]||It.value[U]||[]}function _e(g){return Dt(g).length>0}async function ye(){C.value=!0,A.value=null;try{const g=await fetch("/api/collaboration");if(!g.ok)throw new Error("Failed to fetch collaboration data");const _=await g.json();a.value=_.nodes||[],r.value=_.edges||[],u.value=_.activePath||[],v.value=_.agentModels||{},p.value=_.recentCalls||[],_.hierarchy&&(m.value=_.hierarchy),_.depths&&(T.value=_.depths),_.mainAgentId&&(D.value=_.mainAgentId),_.agentActiveTasks&&(k.value=_.agentActiveTasks),Me(kt)}catch(g){A.value=g.message}finally{C.value=!1}}function Qt(){ye()}function Se(g){const _=g;a.value=_.nodes||[],r.value=_.edges||[],u.value=_.activePath||[],v.value=_.agentModels||{},p.value=_.recentCalls||[],_.hierarchy&&(m.value=_.hierarchy),_.depths&&(T.value=_.depths),_.mainAgentId&&(D.value=_.mainAgentId),_.agentActiveTasks&&(k.value=_.agentActiveTasks),Me(kt)}function h(g){u.value=g.activePath||[],p.value=g.recentCalls||[],g.agentActiveTasks&&(k.value=g.agentActiveTasks);const _=a.value.filter(w=>w.type==="agent");for(const w of _){if(w.id&&g.agentStatuses&&g.agentStatuses[w.id]!==void 0&&(w.status=g.agentStatuses[w.id]),w.id&&g.agentDynamicStatuses&&g.agentDynamicStatuses[w.id]){const J=g.agentDynamicStatuses[w.id];w.subStatus=J.subStatus,w.currentAction=J.currentAction,w.toolName=J.toolName,w.waitingFor=J.waitingFor}if(w.id&&g.agentDisplayStatuses&&g.agentDisplayStatuses[w.id]){const J=g.agentDisplayStatuses[w.id];w.currentAction=J.display,w.metadata||(w.metadata={}),w.metadata={...w.metadata,duration:J.duration,alert:J.alert},J.alert?w.stuckWarning={isStuck:!0,idleSeconds:J.duration,lastUpdate:Date.now(),reason:"self_busy",reasonDetail:J.display}:w.stuckWarning&&!w.stuckWaitingForChildAgent&&(w.stuckWarning=void 0)}}const U=new Set(a.value.filter(w=>w.type==="task").map(w=>w.id)),O=new Set((g.taskNodes||[]).map(w=>w.id));if(U.size!==O.size||[...O].some(w=>!U.has(w))){const w=a.value.filter(z=>z.type==="model"),J=r.value.filter(z=>z.type==="delegates");a.value=[..._,...g.taskNodes||[],...w],r.value=[...J,...g.taskEdges||[]],Me(kt)}else{const w=new Map((g.taskNodes||[]).map(J=>[J.id,J]));for(const J of a.value.filter(z=>z.type==="task")){const z=w.get(J.id);z&&(J.status=z.status,J.name=z.name,z.timestamp&&(J.timestamp=z.timestamp))}}}async function y(){if(!(C.value||a.value.length===0))try{const g=await fetch("/api/collaboration/dynamic");if(!g.ok)return;const _=await g.json();h(_)}catch{}}let E=null,B=null;return Bt([X,$],()=>{Me(kt)}),Nt(()=>{ye(),E=o("collaboration",Se),B=setInterval(y,Rp),window.addEventListener("resize",kt)}),ae(()=>{E&&E(),B&&clearInterval(B),window.removeEventListener("resize",kt)}),(g,_)=>{var U;return c(),d("div",Kh,[n("div",qh,[_[4]||(_[4]=n("h2",null,"协作流程",-1)),n("div",Gh,[X.value.length>0?(c(),d("div",zh,[(c(!0),d(Y,null,ct(P.value,O=>(c(),d("div",{key:O,class:"legend-item"},[n("span",{class:"legend-dot",style:St({background:mt(O)})},null,4),n("span",Jh,f(it(O)),1)]))),128))])):M("",!0),n("div",{class:nt(["connection-indicator",rs(i).status])},[_[3]||(_[3]=n("span",{class:"indicator-dot"},null,-1)),n("span",Qh,f(L.value),1)],2)])]),n("div",Yh,[C.value?(c(),d("div",Xh,[..._[5]||(_[5]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载中...",-1)])])):A.value?(c(),d("div",Zh,[_[6]||(_[6]=n("span",{class:"error-icon"},"⚠️",-1)),n("span",null,f(A.value),1),n("button",{onClick:Qt,class:"retry-btn"},"重试")])):a.value.length===0?(c(),d("div",tp,[..._[7]||(_[7]=[n("span",{class:"empty-icon"},"📭",-1),n("span",null,"暂无协作数据",-1)])])):(c(),d("div",ep,[n("div",{class:"agent-area",ref_key:"agentAreaRef",ref:b},[(c(!0),d(Y,null,ct(G.value,(O,j)=>(c(),d("div",{key:j,class:"level-section"},[n("div",sp,[n("span",np,"L"+f(j),1),n("span",lp,f(I(Number(j))),1)]),n("div",ip,[(c(!0),d(Y,null,ct(O,w=>(c(),d("div",{key:w.id,class:nt(["agent-card-wrapper",{"main-agent":w.id===F.value,active:lt(w),[`status-${w.status}`]:!0}]),style:St({"--agent-color":mt(w.id)}),ref_for:!0,ref:J=>x(w.id,J),onClick:J=>l("agent-click",w)},[bt(Bh,{agent:N(w),"model-info":W(w),"is-main":w.id===F.value,"current-task":w.currentTask,error:w.error,"stuck-warning":w.stuckWarning,"hierarchy-depth":Z(w.id),"agent-color":mt(w.id),"sub-status":w.subStatus,"current-action":w.currentAction,"tool-name":w.toolName,"waiting-for":w.waitingFor,"agent-tasks":ot(w.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,op))),128))])]))),128)),(c(),d("svg",{class:"edges-svg",ref_key:"edgesSvgRef",ref:R},[_[8]||(_[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),d(Y,null,ct(q.value,O=>(c(),d("g",{key:O.id},[n("path",{d:tt(O),class:nt(["edge-path",{active:ft(O)}]),stroke:"#4a9eff","stroke-width":"2",fill:"none"},null,10,ap),ft(O)?(c(),d("circle",rp,[n("animateMotion",cp,[n("mpath",{href:`#edge-${O.id}`},null,8,up)])])):M("",!0)]))),128))],512))],512),H.value.length>0?(c(),d("div",dp,[n("div",{class:"model-panel-header",onClick:_[0]||(_[0]=O=>$.value=!$.value)},[_[9]||(_[9]=n("span",{class:"model-panel-title"},"🧠 模型",-1)),n("span",fp,f($.value?"▼":"▶"),1)]),Tt(n("div",hp,[(c(!0),d(Y,null,ct(H.value,O=>(c(),d("div",{key:O.id,class:nt(["model-card",{active:_e(O)}])},[n("div",pp,f(O.name),1),n("div",vp,[(c(!0),d(Y,null,ct(Dt(O).slice(0,8),j=>(c(),d("span",{key:j.id,class:"model-dot",style:St({background:mt(j.agentId)}),title:`${it(j.agentId)} @ ${j.model||"unknown"}`,onClick:le(w=>S.value=j,["stop"])},null,12,gp))),128))]),n("div",mp,f(Dt(O).length),1)],2))),128))],512),[[fs,$.value]])])):M("",!0)]))],512),S.value?(c(),d("div",{key:0,class:"call-detail-overlay",onClick:_[2]||(_[2]=le(O=>S.value=null,["self"]))},[n("div",_p,[n("div",yp,[_[10]||(_[10]=n("h3",null,"调用详情",-1)),n("button",{class:"close-btn",onClick:_[1]||(_[1]=O=>S.value=null)},"×")]),n("div",bp,[n("div",$p,[_[11]||(_[11]=n("span",{class:"label"},"Agent",-1)),n("span",kp,f(S.value.agentId),1)]),n("div",wp,[_[12]||(_[12]=n("span",{class:"label"},"模型",-1)),n("span",Cp,f(S.value.model),1)]),n("div",Tp,[_[13]||(_[13]=n("span",{class:"label"},"时间",-1)),n("span",Sp,f(S.value.time),1)]),n("div",xp,[_[14]||(_[14]=n("span",{class:"label"},"Tokens",-1)),n("span",Ap,f(S.value.tokens),1)]),n("div",Ip,[_[15]||(_[15]=n("span",{class:"label"},"触发",-1)),n("div",Mp,f((U=S.value.trigger)==null?void 0:U.replace(/^【完成回传】/,"")),1)])])])])):M("",!0)])}}}),Pp=Ct(Ep,[["__scopeId","data-v-1a91db2f"]]),Dp={class:"collaboration-box"},Fp={class:"collaboration-box-body"},Op={class:"collaboration-error-fallback"},Lp={class:"fallback-reason"},Np=wt({__name:"CollaborationFlowWrapper",props:{mainAgent:{},subAgents:{},mainAgentId:{}},emits:["agent-click"],setup(t){const e=V(null);return ci(s=>(e.value=s instanceof Error?s.message:String(s),!1)),(s,l)=>(c(),d("div",Dp,[l[3]||(l[3]=n("div",{class:"collaboration-box-header"},[n("h2",null,"协作流程"),n("span",{class:"collaboration-hint"},"展示主 Agent 与子 Agents 的协作关系")],-1)),n("div",Fp,[Tt(bt(Pp,{"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",Lp,f(e.value),1),n("button",{onClick:l[1]||(l[1]=i=>e.value=null)},"重试")],512),[[fs,e.value]])])]))}}),jp=Ct(Np,[["__scopeId","data-v-ef9f8c73"]]),Up={class:"task-status-section"},Vp={class:"section-header"},Wp={class:"summary-stats"},Hp={class:"stat total"},Bp={class:"filters-row"},Kp={class:"search-box"},qp={class:"filter-buttons"},Gp=["onClick"],zp={key:0,class:"loading-state"},Jp={key:1,class:"error-state"},Qp={key:2,class:"empty-state"},Yp={class:"task-list"},Xp=["onClick"],Zp={class:"task-main"},tv={class:"task-name-short"},ev={key:0,class:"task-agent"},sv={key:1,class:"task-time"},nv={class:"task-detail-modal"},lv={class:"task-detail-header"},iv={class:"task-detail-body"},ov={class:"detail-row"},av={class:"detail-value task-content"},rv={key:0,class:"detail-row"},cv={class:"detail-value"},uv={class:"detail-row"},dv={class:"detail-value"},fv={key:1,class:"detail-row"},hv={class:"detail-value"},pv={key:2,class:"detail-row"},vv={class:"detail-value path-value"},gv={key:3,class:"detail-row"},mv={class:"detail-value"},_v={key:4,class:"detail-row"},yv={class:"detail-progress"},bv={class:"progress-bar"},$v={class:"progress-text"},kv={key:5,class:"detail-row"},wv={class:"detail-value error"},Cv={key:6,class:"detail-row"},Tv={class:"generated-files-list"},Sv={key:7,class:"detail-row"},xv={class:"detail-value output-content"},Av={key:8,class:"detail-row"},Iv={class:"detail-subtasks"},Mv={key:0,class:"subtask-error-inline"},Rv={key:9,class:"detail-row"},Ev={class:"timeline-container"},Pv={class:"timeline"},Dv={class:"timeline-time"},Fv={class:"timeline-desc"},Ov=wt({__name:"TaskStatusSection",setup(t){const{subscribe:e}=Oi(),s=V([]),l=V(!0),i=V(null),o=V(""),a=V([]),r=V(null),u=V(null),v=V([]),p=V(!1),C=[{value:"running",label:"执行中"},{value:"completed",label:"已完成"},{value:"failed",label:"失败"},{value:"pending",label:"待分配"}];Gf(P=>{},300);const A=Q(()=>{let P=s.value;if(a.value.length>0&&(P=P.filter(L=>a.value.includes(L.status))),o.value){const L=o.value.toLowerCase();P=P.filter(Z=>{var it;return Z.name.toLowerCase().includes(L)||((it=Z.agentName)==null?void 0:it.toLowerCase().includes(L))})}return P}),S=Q(()=>({total:s.value.length,running:s.value.filter(P=>P.status==="running").length,completed:s.value.filter(P=>P.status==="completed").length,failed:s.value.filter(P=>P.status==="failed").length,pending:s.value.filter(P=>P.status==="pending").length,cancelled:s.value.filter(P=>P.status==="cancelled").length}));function m(P){return{pending:"⏳",running:"🔄",completed:"✅",failed:"❌",cancelled:"🚫"}[P]||"📋"}function T(P){return s.value.filter(L=>L.status===P).length}function D(P){if(!P||!P.trim())return"未知";const L=P.trim().toLowerCase(),Z={terminated:"任务被终止(可能是超时或被用户取消)",timeout:"任务执行超时",cancelled:"任务已取消",canceled:"任务已取消",killed:"任务被终止","subagent-error":"子任务执行异常"};for(const[it,N]of Object.entries(Z))if(L.includes(it))return N;return P.trim()}function $(P){return!P||typeof P!="string"?"":P.replace(/\*\*/g,"").replace(/`([^`]+)`/g,"$1")}function k(P){if(!P.startTime)return"";const L=new Date(P.startTime).getTime(),Z=P.endTime?new Date(P.endTime).getTime():Date.now(),it=Math.floor((Z-L)/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 b(P){const L=a.value.indexOf(P);L===-1?a.value.push(P):a.value.splice(L,1)}function R(P){a.value.length===1&&a.value[0]===P?a.value=[]:a.value=[P]}function K(P){const Z=$(P.task??P.name).split(`
|
|
23
|
+
...`:""),k=Q(()=>s.step.type!=="toolResult"||s.step.toolResultStatus!=="error"?"":s.step.toolResultError?s.step.toolResultError:s.step.toolResult||"工具执行失败"),b=Q(()=>{if(s.step.type!=="toolResult"||s.step.toolResultStatus!=="error")return null;const G=(s.step.toolResultError||s.step.toolResult||"").toLowerCase(),I=(s.step.toolName||"").toLowerCase(),st=[];return(G.includes("enoent")||G.includes("no such file")||G.includes("文件不存在"))&&st.push("检查文件路径是否正确","确认文件是否存在"),(G.includes("eacces")||G.includes("permission")||G.includes("权限"))&&st.push("检查文件/目录权限","确认当前用户有访问权限"),(G.includes("timeout")||G.includes("超时"))&&st.push("增加超时时间","简化任务或检查网络"),I==="read"&&st.length===0&&st.push("检查路径是否在 workspace 内","确认文件编码正确"),I.includes("bash")&&st.length===0&&st.push("检查命令语法","确认依赖已安装","查看退出码"),st.length===0&&st.push("查看原始返回详情","尝试调整参数后重试"),st}),R=Q(()=>s.step.type!=="error"||!s.step.errorType?null:{"rate-limit":["降低调用频率","切换到 fallback model","等待配额恢复"],"token-limit":["减少上下文长度","分段处理任务","使用更大 context 的模型"],timeout:["检查网络连接","简化任务复杂度","增加超时时间"],quota:["充值账户","切换到其他 provider","等待配额重置"]}[s.step.errorType]||null);function K(){if(v.value){const G=s.step.pairedToolCallId||s.step.id,I=s.step.pairedToolResultId||s.step.id;l("highlight-pair",{callId:G,resultId:I})}x()}function x(){S.value&&(i.value=!i.value)}function F(G){return G?new Date(G).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function X(G){return G?G<1e3?`${G}ms`:G<6e4?`${(G/1e3).toFixed(1)}s`:`${(G/6e4).toFixed(1)}min`:"0ms"}function H(G){try{return JSON.stringify(G,null,2)}catch{return String(G)}}async function q(){if(s.step.toolResult)try{await navigator.clipboard.writeText(s.step.toolResult),alert("已复制到剪贴板")}catch{}}return(G,I)=>(c(),d("div",{class:nt(["timeline-step",[`step-${t.step.type}`,`status-${t.step.status}`,{"is-paired-result":p.value,highlighted:C.value}]])},[n("div",{class:"step-header",onClick:K},[n("div",ir,[n("span",or,f(a.value),1),n("span",ar,f(r.value),1),u.value?(c(),d("span",rr,f(u.value),1)):M("",!0),!i.value&&m.value?(c(),d("span",cr,f(m.value),1)):M("",!0),n("span",ur,f(F(t.step.timestamp)),1),t.step.duration&&t.step.duration>0?(c(),d("span",dr," +"+f(X(t.step.duration)),1)):M("",!0),t.step.executionTime?(c(),d("span",fr," ⏱ "+f(X(t.step.executionTime)),1)):M("",!0)]),n("div",hr,[t.step.tokens?(c(),d("span",pr,[I[2]||(I[2]=n("span",{class:"token-label"},"tokens:",-1)),At(" "+f(t.step.tokens.input+t.step.tokens.output),1)])):M("",!0),v.value?(c(),d("span",{key:1,class:"pair-indicator",title:A.value}," 🔗 ",8,vr)):M("",!0),S.value?(c(),d("span",gr,f(i.value?"▼":"▶"),1)):M("",!0)])]),S.value&&i.value?(c(),d("div",mr,[t.step.type==="user"&&t.step.content?(c(),d("div",_r,[n("pre",null,f(t.step.content),1)])):M("",!0),t.step.type==="thinking"&&t.step.thinking?(c(),d("div",yr,[I[3]||(I[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(),d("div",br,[n("pre",null,f(t.step.content),1)])):M("",!0),t.step.type==="toolCall"?(c(),d("div",$r,[t.step.toolArguments?(c(),d("div",kr,[I[4]||(I[4]=n("div",{class:"section-label"},"参数:",-1)),n("pre",wr,f(H(t.step.toolArguments)),1)])):M("",!0)])):M("",!0),t.step.type==="toolResult"?(c(),d("div",Cr,[n("div",Tr,[n("span",{class:nt(["result-status",t.step.toolResultStatus])},f(t.step.toolResultStatus==="ok"?"✅ 成功":"❌ 工具执行失败"),3),t.step.toolResult?(c(),d("button",{key:0,class:"copy-btn",onClick:q}," 复制 ")):M("",!0)]),t.step.toolResultStatus==="error"?(c(),d(Y,{key:0},[k.value?(c(),d("div",Sr,[n("div",xr,f(k.value),1),b.value?(c(),d("div",Ar,[I[5]||(I[5]=n("span",{class:"suggestion-label"},"💡 建议:",-1)),n("ul",null,[(c(!0),d(Y,null,ct(b.value,(st,mt)=>(c(),d("li",{key:mt},f(st),1))),128))])])):M("",!0)])):M("",!0),t.step.toolResult?(c(),d("div",Ir,[I[6]||(I[6]=n("div",{class:"section-label"},"原始返回:",-1)),n("pre",{class:nt({truncated:!o.value})},f($.value),3),T.value?(c(),d("button",{key:0,class:"show-more-btn",onClick:I[0]||(I[0]=le(st=>o.value=!o.value,["stop"]))},f(o.value?"收起":`展开全部 (${D.value} 行)`),1)):M("",!0)])):M("",!0)],64)):(c(),d(Y,{key:1},[t.step.toolResult?(c(),d("div",Mr,[n("pre",{class:nt({truncated:!o.value})},f($.value),3),T.value?(c(),d("button",{key:0,class:"show-more-btn",onClick:I[1]||(I[1]=le(st=>o.value=!o.value,["stop"]))},f(o.value?"收起":`展开全部 (${D.value} 行)`),1)):M("",!0)])):M("",!0)],64))])):M("",!0),t.step.type==="error"?(c(),d("div",Rr,[n("div",Er,f(t.step.errorType||"unknown"),1),n("div",Pr,f(t.step.errorMessage),1),R.value?(c(),d("div",Dr,[I[7]||(I[7]=n("div",{class:"suggestion-label"},"💡 建议:",-1)),n("ul",null,[(c(!0),d(Y,null,ct(R.value,(st,mt)=>(c(),d("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"]]),Or={class:"timeline-connector"},Lr=wt({__name:"TimelineConnector",setup(t){return(e,s)=>(c(),d("div",Or,[...s[0]||(s[0]=[n("div",{class:"connector-line"},null,-1),n("div",{class:"connector-arrow"},"▼",-1)])]))}}),_n=Ct(Lr,[["__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(),d("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(),d("span",Vr,f(t.round.tokens.input+t.round.tokens.output)+" tokens ",1)):M("",!0)]),n("div",Wr,[(c(!0),d(Y,null,ct(t.round.stepIds,(r,u)=>(c(),d(Y,{key:r},[u>0?(c(),Gt(_n,{key:0})):M("",!0),bt(mn,{step:i(r),prevStep:u>0?i(t.round.stepIds[u-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(),d("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(),d("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},lc={key:2,class:"empty-hint"},ic={key:2,class:"timeline-content"},oc={key:0,class:"session-info"},ac={class:"session-id"},rc={key:0,class:"started-at"},cc={class:"steps-list"},uc={key:0,class:"tool-execution-label"},dc={class:"timeline-footer"},fc={class:"stats-grid"},hc={class:"stat-item"},pc={class:"stat-value"},vc={class:"stat-item"},gc={class:"stat-value"},mc={class:"stat-item"},_c={class:"stat-value"},yc={class:"stat-item"},bc={class:"stat-value"},$c=wt({__name:"TimelineView",props:{agentId:{},sessionKey:{},autoRefresh:{type:Boolean},refreshInterval:{}},setup(t){const e=t,s=V(null),l=V(!1),i=V(null),o=V(null),a=Q(()=>s.value?s.value.status:"empty"),r=Q(()=>({running:"🔄 进行中",completed:"✅ 已完成",error:"❌ 出错",empty:"空",no_sessions:"无会话"})[a.value]||"未知"),u=Q(()=>{var k;return((k=s.value)==null?void 0:k.roundMode)&&s.value.rounds&&s.value.rounds.length>0}),v=Q(()=>{var R;if(!s.value||!u.value)return[];const k=[],b=new Set;for(const K of s.value.steps){if(b.has(K.id))continue;const x=(R=s.value.rounds)==null?void 0:R.find(F=>F.stepIds.includes(K.id));x?(k.push({type:"round",data:x}),x.stepIds.forEach(F=>b.add(F))):(k.push({type:"step",data:K}),b.add(K.id))}return k});async function p(){if(e.agentId){l.value=!0,i.value=null;try{let k=`/api/timeline/${e.agentId}?limit=100`;e.sessionKey&&(k+=`&session_key=${encodeURIComponent(e.sessionKey)}`);const b=await fetch(k);if(!b.ok)throw new Error(`HTTP ${b.status}`);s.value=await b.json()}catch(k){i.value=k instanceof Error?k.message:"加载失败",console.error("Timeline load error:",k)}finally{l.value=!1}}}function C(k){s.value&&s.value.steps[k]&&(s.value.steps[k].collapsed=!s.value.steps[k].collapsed)}function A(k){if(s.value){const b=s.value.steps.find(R=>R.id===k);b&&(b.collapsed=!b.collapsed)}}function S(k){o.value=k,setTimeout(()=>{o.value=null},3e3)}function m(k){return k?new Date(k).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}function T(k){return k?k<1e3?`${k}ms`:k<6e4?`${(k/1e3).toFixed(1)}s`:`${(k/6e4).toFixed(1)}min`:"0ms"}function D(k){return k>=1e3?`${(k/1e3).toFixed(1)}k`:String(k)}Nt(p),Bt(()=>e.agentId,p);let $=null;return Bt([()=>e.autoRefresh,()=>e.refreshInterval],([k,b])=>{$&&(clearInterval($),$=null),k&&b&&b>0&&($=setInterval(p,b*1e3))},{immediate:!0}),(k,b)=>{var R,K;return c(),d("div",Gr,[n("div",zr,[n("div",Jr,[b[0]||(b[0]=n("span",{class:"title"},"📊 实时执行时序",-1)),s.value?(c(),d("span",Qr,[At(f(s.value.agentName||s.value.agentId)+" ",1),s.value.model?(c(),d("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:p,disabled:l.value},f(l.value?"加载中...":"🔄 刷新"),9,Zr)])]),l.value&&!s.value?(c(),d("div",tc,[...b[1]||(b[1]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载时序数据...",-1)])])):!s.value||s.value.steps.length===0?(c(),d("div",ec,[b[2]||(b[2]=n("span",{class:"empty-icon"},"📭",-1)),((R=s.value)==null?void 0:R.status)==="no_sessions"?(c(),d("span",sc," 该 Agent 是子代理,暂无独立会话记录 ")):(c(),d("span",nc,"暂无会话记录")),(K=s.value)!=null&&K.message?(c(),d("div",lc,f(s.value.message),1)):M("",!0)])):(c(),d("div",ic,[b[8]||(b[8]=Ii('<div class="timeline-legend" data-v-4ac4b073><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>👤</span> 用户/回传</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>🧠</span> LLM 思考</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>🤖</span> LLM 回复</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>🔧</span> 工具调用</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>✅</span> 工具成功</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>❌</span> 工具失败</span><span class="legend-item" data-v-4ac4b073><span class="legend-icon" data-v-4ac4b073>⚠️</span> 错误</span></div>',1)),s.value.sessionId?(c(),d("div",oc,[n("span",ac,"Session: "+f(s.value.sessionId.slice(0,8))+"...",1),s.value.startedAt?(c(),d("span",rc," 开始: "+f(m(s.value.startedAt)),1)):M("",!0)])):M("",!0),n("div",cc,[u.value?(c(!0),d(Y,{key:0},ct(v.value,(x,F)=>{var X;return c(),d(Y,{key:(x.type==="round",x.data.id)},[F>0?(c(),Gt(_n,{key:0})):M("",!0),x.type==="round"?(c(),Gt(Br,{key:1,round:x.data,steps:s.value.steps,highlightedPair:o.value,onHighlightPair:S},null,8,["round","steps","highlightedPair"])):(c(),d(Y,{key:2},[x.data.type==="toolResult"?(c(),d("div",uc,[...b[3]||(b[3]=[n("span",{class:"label-line"},null,-1),n("span",{class:"label-text"},"⚡ 工具执行",-1),n("span",{class:"label-line"},null,-1)])])):M("",!0),x.data.type==="toolResult"&&x.data.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:x.data.toolResultStatus==="error",isActive:((X=o.value)==null?void 0:X.resultId)===x.data.id,executionTime:x.data.executionTime},null,8,["isError","isActive","executionTime"])):M("",!0),bt(mn,{step:x.data,highlightedPair:o.value,onToggleCollapse:H=>A(x.data.id),onHighlightPair:S},null,8,["step","highlightedPair","onToggleCollapse"])],64))],64)}),128)):(c(!0),d(Y,{key:1},ct(s.value.steps,(x,F)=>{var X;return c(),d(Y,{key:x.id},[F>0?(c(),Gt(_n,{key:0})):M("",!0),x.type==="toolResult"&&x.pairedToolCallId?(c(),Gt(Sl,{key:1,isError:x.toolResultStatus==="error",isActive:((X=o.value)==null?void 0:X.resultId)===x.id,executionTime:x.executionTime},null,8,["isError","isActive","executionTime"])):M("",!0),bt(mn,{step:x,prevStep:s.value.steps[F-1],highlightedPair:o.value,onToggleCollapse:H=>C(F),onHighlightPair:S},null,8,["step","prevStep","highlightedPair","onToggleCollapse"])],64)}),128))]),n("div",dc,[n("div",fc,[n("div",hc,[b[4]||(b[4]=n("span",{class:"stat-label"},"总耗时",-1)),n("span",pc,f(T(s.value.stats.totalDuration)),1)]),n("div",vc,[b[5]||(b[5]=n("span",{class:"stat-label"},"Token",-1)),n("span",gc,f(D(s.value.stats.totalInputTokens))+" / "+f(D(s.value.stats.totalOutputTokens)),1)]),n("div",mc,[b[6]||(b[6]=n("span",{class:"stat-label"},"工具调用",-1)),n("span",_c,f(s.value.stats.toolCallCount)+" 次",1)]),n("div",yc,[b[7]||(b[7]=n("span",{class:"stat-label"},"步骤数",-1)),n("span",bc,f(s.value.stats.stepCount),1)])])])]))])}}}),kc=Ct($c,[["__scopeId","data-v-4ac4b073"]]),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:"失败"}},wc={class:"node-icon"},Cc={class:"node-info"},Tc={class:"node-name"},Sc={class:"node-role"},xc={class:"node-status"},Ac={key:0,class:"node-time"},Ic={key:1,class:"node-progress"},Mc=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(),d("div",{class:nt(["chain-node",[`status-${t.node.status}`,{selected:t.isSelected}]]),onClick:a[0]||(a[0]=r=>o.$emit("click"))},[n("div",wc,f(s.value),1),n("div",Cc,[n("div",Tc,f(t.node.agentName),1),n("div",Sc,f(t.node.role),1)]),n("div",xc,f(l.value),1),t.node.startedAt?(c(),d("div",Ac,f(i(t.node.duration)),1)):M("",!0),t.node.status==="running"?(c(),d("div",Ic,[...a[1]||(a[1]=[n("div",{class:"progress-spinner"},null,-1)])])):M("",!0)],2))}}),Rc=Ct(Mc,[["__scopeId","data-v-973c6755"]]),Ec={width:"60",height:"20",viewBox:"0 0 60 20"},Pc={id:"arrowhead",markerWidth:"10",markerHeight:"7",refX:"9",refY:"3.5",orient:"auto"},Dc=["fill"],Fc=["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(),d("div",{class:nt(["chain-edge",o.value])},[(c(),d("svg",Ec,[n("defs",null,[n("marker",Pc,[n("polygon",{points:"0 0, 10 3.5, 0 7",fill:l.value},null,8,Dc)])]),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,Fc)]))],2))}}),Lc=Ct(Oc,[["__scopeId","data-v-c94ab96b"]]),Nc={class:"chain-view"},jc={class:"chain-header"},Uc={class:"header-left"},Vc={key:0,class:"project-info"},Wc={class:"header-right"},Hc=["disabled"],Bc={key:0,class:"loading-state"},Kc={key:1,class:"empty-state"},qc={key:2,class:"chain-content"},Gc={key:0,class:"root-task"},zc={class:"task-text"},Jc={class:"task-meta"},Qc={key:0},Yc={key:1,class:"chain-diagram"},Xc={class:"diagram-container"},Zc={key:2,class:"chain-progress"},tu={class:"progress-bar"},eu={class:"progress-text"},su={key:3,class:"node-detail"},nu={class:"detail-header"},lu={class:"detail-title"},iu={class:"detail-content"},ou={key:0,class:"detail-section"},au={class:"section-value"},ru={class:"detail-row"},cu={class:"detail-item"},uu={class:"item-value"},du={class:"detail-item"},fu={class:"item-value"},hu={key:1,class:"detail-row"},pu={class:"detail-item"},vu={class:"item-value"},gu={class:"detail-item"},mu={class:"item-value"},_u={key:2,class:"detail-section"},yu={class:"section-value"},bu={key:3,class:"detail-section"},$u={class:"artifacts-list"},ku=wt({__name:"TaskChainView",props:{autoRefresh:{type:Boolean},refreshInterval:{}},setup(t){const e=t,s=V([]),l=V(null),i=V(null),o=V(!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 m=["main","analyst","architect","devops"];return[...l.value.nodes].sort((D,$)=>{const k=m.findIndex(R=>D.role.includes(R)),b=m.findIndex(R=>$.role.includes(R));return k-b})});async function u(){o.value=!0;try{const m=await fetch("/api/chains?limit=10");if(m.ok){const T=await m.json();s.value=T.chains||[],l.value=T.activeChain||null}}catch(m){console.error("Chain load error:",m)}finally{o.value=!1}}function v(m){var T;i.value=((T=i.value)==null?void 0:T.agentId)===m.agentId?null:m}function p(m){return m?new Date(m).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):"-"}function C(m){return m?m<1e3?`${m}ms`:m<6e4?`${(m/1e3).toFixed(1)}s`:`${(m/6e4).toFixed(1)}min`:"-"}function A(m){return m?m>=1e3?`${(m/1e3).toFixed(1)}k`:String(m):"0"}let S=null;return Nt(()=>{u(),e.autoRefresh&&e.refreshInterval&&(S=setInterval(u,e.refreshInterval*1e3))}),ae(()=>{S&&(clearInterval(S),S=null)}),(m,T)=>{var D,$;return c(),d("div",Nc,[n("div",jc,[n("div",Uc,[T[0]||(T[0]=n("span",{class:"title"},"🔗 任务执行链路",-1)),l.value?(c(),d("span",Vc,f(l.value.projectId||"当前任务"),1)):M("",!0)]),n("div",Wc,[n("span",{class:nt(["status-badge",`status-${((D=l.value)==null?void 0:D.status)||"empty"}`])},f(a.value),3),n("button",{class:"refresh-btn",onClick:u,disabled:o.value},f(o.value?"加载中...":"🔄 刷新"),9,Hc)])]),o.value&&!l.value?(c(),d("div",Bc,[...T[1]||(T[1]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载链路数据...",-1)])])):!l.value&&s.value.length===0?(c(),d("div",Kc,[...T[2]||(T[2]=[n("span",{class:"empty-icon"},"🔗",-1),n("span",null,"暂无任务链路",-1),n("div",{class:"empty-hint"},"当 Main Agent 派发任务给子 Agent 时,这里会显示执行链路",-1)])])):(c(),d("div",qc,[l.value?(c(),d("div",Gc,[T[3]||(T[3]=n("div",{class:"task-label"},"根任务",-1)),n("div",zc,f(l.value.rootTask),1),n("div",Jc,[l.value.startedAt?(c(),d("span",Qc,"开始: "+f(p(l.value.startedAt)),1)):M("",!0)])])):M("",!0),l.value?(c(),d("div",Yc,[n("div",Xc,[(c(!0),d(Y,null,ct(r.value,(k,b)=>{var R,K;return c(),d(Y,{key:k.agentId},[b>0?(c(),Gt(Lc,{key:0,"from-status":(R=r.value[b-1])==null?void 0:R.status,"to-status":k.status},null,8,["from-status","to-status"])):M("",!0),bt(Rc,{node:k,"is-selected":((K=i.value)==null?void 0:K.agentId)===k.agentId,onClick:x=>v(k)},null,8,["node","is-selected","onClick"])],64)}),128))])])):M("",!0),l.value?(c(),d("div",Zc,[n("div",tu,[n("div",{class:"progress-fill",style:St({width:`${l.value.progress*100}%`})},null,4)]),n("div",eu,f(Math.round(l.value.progress*100))+"% ("+f(l.value.completedNodes)+"/"+f(l.value.totalNodes)+" 完成) ",1)])):M("",!0),i.value?(c(),d("div",su,[n("div",nu,[n("span",lu,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",iu,[i.value.task?(c(),d("div",ou,[T[4]||(T[4]=n("div",{class:"section-label"},"任务",-1)),n("div",au,f(i.value.task),1)])):M("",!0),n("div",ru,[n("div",cu,[T[5]||(T[5]=n("span",{class:"item-label"},"开始时间",-1)),n("span",uu,f(i.value.startedAt?p(i.value.startedAt):"-"),1)]),n("div",du,[T[6]||(T[6]=n("span",{class:"item-label"},"耗时",-1)),n("span",fu,f(C(i.value.duration)),1)])]),i.value.tokenUsage?(c(),d("div",hu,[n("div",pu,[T[7]||(T[7]=n("span",{class:"item-label"},"Token 输入",-1)),n("span",vu,f(A(i.value.tokenUsage.input)),1)]),n("div",gu,[T[8]||(T[8]=n("span",{class:"item-label"},"Token 输出",-1)),n("span",mu,f(A(i.value.tokenUsage.output)),1)])])):M("",!0),i.value.toolCallCount>0?(c(),d("div",_u,[T[9]||(T[9]=n("div",{class:"section-label"},"工具调用",-1)),n("div",yu,f(i.value.toolCallCount)+" 次",1)])):M("",!0),i.value.artifacts&&i.value.artifacts.length>0?(c(),d("div",bu,[T[10]||(T[10]=n("div",{class:"section-label"},"产出物",-1)),n("div",$u,[(c(!0),d(Y,null,ct(i.value.artifacts,k=>(c(),d("div",{key:k,class:"artifact-item"}," 📄 "+f(k),1))),128))])])):M("",!0)])])):M("",!0)]))])}}}),wu=Ct(ku,[["__scopeId","data-v-5e7f751f"]]),Cu={class:"agent-config-panel"},Tu={class:"header"},Su=["disabled"],xu={key:0,class:"loading-state"},Au={key:1,class:"error-state"},Iu={key:2,class:"config-content"},Mu={class:"config-section"},Ru={class:"info-grid"},Eu={class:"info-item"},Pu={class:"value monospace"},Du={class:"info-item"},Fu={class:"value"},Ou={class:"info-item full-width"},Lu={class:"value monospace"},Nu={class:"info-item"},ju={class:"config-section"},Uu={class:"model-config"},Vu={class:"model-field"},Wu={class:"model-select-wrapper"},Hu=["disabled"],Bu=["label"],Ku=["value"],qu={key:0,class:"current-model"},Gu={class:"model-field"},zu={class:"fallbacks-list"},Ju=["onUpdate:modelValue","disabled"],Qu=["label"],Yu=["value"],Xu=["onClick","disabled"],Zu=["disabled"],td={class:"model-actions"},ed=["disabled"],sd=["disabled"],nd={key:0,class:"config-section"},ld={class:"description-text"},id=wt({__name:"AgentConfigPanel",props:{agentId:{}},setup(t){const e=t,s=V(null),l=V([]),i=V(!1),o=V(!1),a=V(""),r=V(""),u=V([]),v=Q(()=>{const k={};for(const b of l.value)k[b.provider]||(k[b.provider]=[]),k[b.provider].push(b);return Object.entries(k).map(([b,R])=>({provider:b,models:R}))}),p=Q(()=>{var b;if(!((b=s.value)!=null&&b.model))return!1;const k=s.value.model;return r.value!==k.primary||JSON.stringify(u.value.filter(R=>R))!==JSON.stringify(k.fallbacks||[])});function C(k){return{idle:"空闲",working:"工作中",down:"异常"}[k]||k}function A(k){if(!k)return"";const b=k.split("/");return b.length>1?b[b.length-1]:k}async function S(){var k;i.value=!0,a.value="";try{const[b,R]=await Promise.all([fetch(`/api/agent-config/${e.agentId}`),fetch("/api/available-models")]);if(b.ok?(s.value=await b.json(),(k=s.value)!=null&&k.model&&(r.value=s.value.model.primary||"",u.value=[...s.value.model.fallbacks||[]])):a.value="加载配置失败",R.ok){const K=await R.json();l.value=K.models||[]}}catch(b){a.value="加载失败: "+b.message}finally{i.value=!1}}function m(){u.value.length<3&&u.value.push("")}function T(k){u.value.splice(k,1)}function D(){var k;(k=s.value)!=null&&k.model&&(r.value=s.value.model.primary||"",u.value=[...s.value.model.fallbacks||[]])}async function $(){if(p.value){o.value=!0;try{const k=await fetch(`/api/agent-config/${e.agentId}/model`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({primary:r.value||null,fallbacks:u.value.filter(b=>b)||null})});if(k.ok){const b=await k.json();s.value&&b.model&&(s.value.model=b.model),alert("模型配置已保存!重启 Agent 后生效。")}else{const b=await k.json();alert("保存失败: "+(b.detail||"未知错误"))}}catch(k){alert("保存失败: "+k.message)}finally{o.value=!1}}}return Bt(()=>e.agentId,()=>{S()},{immediate:!0}),Nt(()=>{S()}),(k,b)=>{var R;return c(),d("div",Cu,[n("div",Tu,[b[1]||(b[1]=n("h3",null,"⚙️ Agent 配置",-1)),n("button",{class:"refresh-btn",onClick:S,disabled:i.value},f(i.value?"加载中...":"刷新"),9,Su)]),i.value&&!s.value?(c(),d("div",xu," 加载配置... ")):a.value?(c(),d("div",Au,f(a.value),1)):s.value?(c(),d("div",Iu,[n("div",Mu,[b[6]||(b[6]=n("h4",null,"基本信息",-1)),n("div",Ru,[n("div",Eu,[b[2]||(b[2]=n("span",{class:"label"},"ID",-1)),n("span",Pu,f(s.value.id),1)]),n("div",Du,[b[3]||(b[3]=n("span",{class:"label"},"名称",-1)),n("span",Fu,f(s.value.name),1)]),n("div",Ou,[b[4]||(b[4]=n("span",{class:"label"},"工作区",-1)),n("span",Lu,f(s.value.workspace||"未设置"),1)]),n("div",Nu,[b[5]||(b[5]=n("span",{class:"label"},"状态",-1)),n("span",{class:nt(["value",`status-${s.value.status}`])},f(C(s.value.status)),3)])])]),n("div",ju,[b[11]||(b[11]=n("h4",null,"模型配置",-1)),n("div",Uu,[n("div",Vu,[b[8]||(b[8]=n("label",null,"主模型 (Primary)",-1)),n("div",Wu,[Tt(n("select",{"onUpdate:modelValue":b[0]||(b[0]=K=>r.value=K),disabled:o.value,class:"model-select"},[b[7]||(b[7]=n("option",{value:""},"-- 选择模型 --",-1)),(c(!0),d(Y,null,ct(v.value,K=>(c(),d("optgroup",{key:K.provider,label:K.provider},[(c(!0),d(Y,null,ct(K.models,x=>(c(),d("option",{key:x.id,value:x.id},f(x.name),9,Ku))),128))],8,Bu))),128))],8,Hu),[[Pe,r.value]]),(R=s.value.model)!=null&&R.primary?(c(),d("span",qu," 当前: "+f(A(s.value.model.primary)),1)):M("",!0)])]),n("div",Gu,[b[10]||(b[10]=n("label",null,"备选模型 (Fallbacks)",-1)),n("div",zu,[(c(!0),d(Y,null,ct(u.value,(K,x)=>(c(),d("div",{key:x,class:"fallback-item"},[Tt(n("select",{"onUpdate:modelValue":F=>u.value[x]=F,disabled:o.value,class:"model-select small"},[b[9]||(b[9]=n("option",{value:""},"-- 选择 --",-1)),(c(!0),d(Y,null,ct(v.value,F=>(c(),d("optgroup",{key:F.provider,label:F.provider},[(c(!0),d(Y,null,ct(F.models,X=>(c(),d("option",{key:X.id,value:X.id},f(X.name),9,Yu))),128))],8,Qu))),128))],8,Ju),[[Pe,u.value[x]]]),n("button",{class:"remove-btn",onClick:F=>T(x),disabled:o.value},"×",8,Xu)]))),128)),n("button",{class:"add-fallback-btn",onClick:m,disabled:o.value||u.value.length>=3}," + 添加备选模型 ",8,Zu)])]),n("div",td,[n("button",{class:"save-btn",onClick:$,disabled:o.value||!p.value},f(o.value?"保存中...":"保存修改"),9,ed),n("button",{class:"reset-btn",onClick:D,disabled:o.value}," 重置 ",8,sd)])])]),s.value.description?(c(),d("div",nd,[b[12]||(b[12]=n("h4",null,"描述",-1)),n("p",ld,f(s.value.description),1)])):M("",!0)])):M("",!0)])}}}),od=Ct(id,[["__scopeId","data-v-c0a2c245"]]),ad={class:"error-analysis-view"},rd={class:"header"},cd=["disabled"],ud={key:0,class:"agent-summary"},dd={class:"summary-card total"},fd={class:"count"},hd={key:0,class:"summary-card critical"},pd={class:"count"},vd={key:1,class:"summary-card high"},gd={class:"count"},md={key:2,class:"summary-card medium"},_d={class:"count"},yd={key:1,class:"loading-state"},bd={key:2,class:"empty-state"},$d={key:3,class:"errors-list"},kd=["onClick"],wd={class:"error-header"},Cd={class:"error-badges"},Td={key:0,class:"badge archived",title:"已归档的子任务"},Sd={key:1,class:"badge provider"},xd={key:2,class:"badge model"},Ad={class:"error-time"},Id={class:"error-message"},Md={key:0,class:"error-detail"},Rd={class:"detail-section"},Ed={class:"error-full"},Pd={key:0,class:"detail-section"},Dd={class:"tool-chain"},Fd={class:"tool-index"},Od={class:"tool-name"},Ld={class:"tool-time"},Nd={key:1,class:"detail-section"},jd={class:"suggestions"},Ud={class:"detail-section meta"},Vd={key:4,class:"type-summary"},Wd={class:"type-bars"},Hd={class:"type-label"},Bd={class:"bar-container"},Kd={class:"type-count"},qd=wt({__name:"ErrorAnalysisView",props:{agentId:{}},setup(t){const e=t,s=V([]),l=V(null),i=V(!1),o=V(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 u(S){return S?new Date(S).toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):""}function v(S,m){return!S||S.length<=m?S||"":S.slice(0,m)+"..."}function p(S,m){return m?Math.round(S/m*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 A(){if(e.agentId){i.value=!0;try{const S=await fetch(`/api/error-analysis/${e.agentId}?session_limit=5`);if(S.ok){const m=await S.json();s.value=m.errors||[],l.value=m.summary||null}}catch(S){console.error("Failed to load error analysis:",S)}finally{i.value=!1}}}return Bt(()=>e.agentId,()=>{A()},{immediate:!0}),Nt(()=>{A()}),(S,m)=>{var T,D,$,k;return c(),d("div",ad,[n("div",rd,[m[0]||(m[0]=n("h3",null,"🔍 错误分析",-1)),n("button",{class:"refresh-btn",onClick:A,disabled:i.value},f(i.value?"分析中...":"刷新"),9,cd)]),l.value?(c(),d("div",ud,[n("div",dd,[n("span",fd,f(l.value.total||0),1),m[1]||(m[1]=n("span",{class:"label"},"错误数",-1))]),(T=l.value.bySeverity)!=null&&T.critical?(c(),d("div",hd,[n("span",pd,f(l.value.bySeverity.critical),1),m[2]||(m[2]=n("span",{class:"label"},"严重",-1))])):M("",!0),(D=l.value.bySeverity)!=null&&D.high?(c(),d("div",vd,[n("span",gd,f(l.value.bySeverity.high),1),m[3]||(m[3]=n("span",{class:"label"},"高",-1))])):M("",!0),($=l.value.bySeverity)!=null&&$.medium?(c(),d("div",md,[n("span",_d,f(l.value.bySeverity.medium),1),m[4]||(m[4]=n("span",{class:"label"},"中",-1))])):M("",!0)])):M("",!0),i.value&&!s.value.length?(c(),d("div",yd," 正在分析错误... ")):s.value.length?(c(),d("div",$d,[(c(!0),d(Y,null,ct(s.value,(b,R)=>{var K,x;return c(),d("div",{key:R,class:nt(["error-item",`severity-${b.severity}`]),onClick:F=>C(R)},[n("div",wd,[n("span",{class:"error-type",style:St({color:b.severityColor})},f(b.severityLabel)+" - "+f(b.errorTypeLabel),5),n("div",Cd,[b.isArchived?(c(),d("span",Td,"📦 归档")):M("",!0),b.provider?(c(),d("span",Sd,f(b.provider),1)):M("",!0),b.model?(c(),d("span",xd,f(b.model),1)):M("",!0)]),n("span",Ad,f(u(b.timestamp)),1)]),n("div",Id,f(v(b.rawMessage,150)),1),o.value.has(R)?(c(),d("div",Md,[n("div",Rd,[m[5]||(m[5]=n("h4",null,"错误信息",-1)),n("pre",Ed,f(b.rawMessage||"无详细信息"),1)]),(K=b.toolChain)!=null&&K.length?(c(),d("div",Pd,[m[6]||(m[6]=n("h4",null,"工具调用链(错误前)",-1)),n("div",Dd,[(c(!0),d(Y,null,ct(b.toolChain,(F,X)=>(c(),d("div",{key:X,class:"tool-item"},[n("span",Fd,f(X+1),1),n("span",Od,f(F.toolName),1),n("span",Ld,f(u(F.timestamp)),1)]))),128))])])):M("",!0),(x=b.suggestions)!=null&&x.length?(c(),d("div",Nd,[m[7]||(m[7]=n("h4",null,"修复建议",-1)),n("ul",jd,[(c(!0),d(Y,null,ct(b.suggestions,(F,X)=>(c(),d("li",{key:X},f(F),1))),128))])])):M("",!0),n("div",Ud,[n("span",null,"Session: "+f(b.sessionFile),1),n("span",null,"Turn: "+f(b.turnIndex),1)])])):M("",!0)],10,kd)}),128))])):(c(),d("div",bd," ✅ 暂无错误记录 ")),(k=l.value)!=null&&k.byType&&Object.keys(l.value.byType).length>0?(c(),d("div",Vd,[m[8]||(m[8]=n("h4",null,"错误类型分布",-1)),n("div",Wd,[(c(!0),d(Y,null,ct(l.value.byType,(b,R)=>(c(),d("div",{key:R,class:"type-bar"},[n("span",Hd,f(r(R)),1),n("div",Bd,[n("div",{class:"bar-fill",style:St({width:p(b,l.value.total)})},null,4)]),n("span",Kd,f(b),1)]))),128))])])):M("",!0)])}}}),Gd=Ct(qd,[["__scopeId","data-v-bc05715d"]]),zd={class:"header"},Jd={class:"content"},Qd={class:"section"},Yd={class:"status-info"},Xd={class:"status-text"},Zd={key:0,class:"section"},tf={key:1,class:"section"},ef={key:2,class:"section"},sf={class:"error-info"},nf={class:"error-type"},lf={class:"error-message"},of={key:3,class:"section"},af={class:"diagnostic-header"},rf={class:"diagnostic-icon"},cf={class:"diagnostic-title"},uf={class:"diagnostic-content"},df={class:"diagnostic-item"},ff={class:"item-value highlight"},hf={key:0,class:"diagnostic-item"},pf={class:"item-value"},vf={key:1,class:"diagnostic-item"},gf={class:"item-value"},mf={class:"diagnostic-actions"},_f={class:"section"},yf={class:"activity-list"},bf={key:0,class:"activity-item working"},$f={key:1,class:"activity-item idle"},kf={key:2,class:"activity-item down"},wf={class:"section"},Cf={class:"view-tabs"},Tf={key:0,class:"timeline-container"},Sf={key:1,class:"chain-container"},xf={key:2,class:"advanced-container"},Af={class:"advanced-section"},If={class:"advanced-section"},Mf=5*60*1e3,Rf=15*60*1e3,Ef=wt({__name:"AgentDetailPanel",props:{agent:{}},emits:["close"],setup(t){const e=t,s=V("timeline"),l=V(null),i=V(Date.now());let o=null;const a=Q(()=>({idle:"空闲",working:"工作中",down:"异常"})[e.agent.status]||"未知"),r=Q(()=>{if(e.agent.status!=="working")return null;const D=e.agent.lastActiveAt||0,$=i.value-D;return $>Rf?{isStuck:!0,idleMinutes:Math.floor($/6e4),severity:"critical",label:"严重卡顿"}:$>Mf?{isStuck:!0,idleMinutes:Math.floor($/6e4),severity:"warning",label:"可能卡顿"}:null}),u=Q(()=>{var b;if(!((b=l.value)!=null&&b.archiveAtMs))return null;const D=l.value.archiveAtMs-i.value;if(D<=0)return"即将超时";const $=Math.floor(D/6e4),k=Math.floor(D%6e4/1e3);return`${$}分${k}秒`}),v=Q(()=>{if(!p.value.length)return null;const D=p.value[p.value.length-1];if(D.role==="toolResult"){const $=D.content[0];if($){const k=$.text||$.content||"";return{tool:D.toolName||"未知工具",status:$.status||"completed",result:k.slice(0,100)||"(无输出)"}}}return null}),p=V([]),C=V(!1);async function A(){var D;if((D=e.agent)!=null&&D.id){C.value=!0;try{const $=await fetch(`/api/agents/${e.agent.id}/output?limit=30`);if($.ok){const k=await $.json();p.value=k.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 D=await fetch("/api/chains?limit=10");if(D.ok){const k=(await D.json()).activeChain;if(k!=null&&k.nodes){const b=k.nodes.find(R=>R.agentId===e.agent.id);b&&b.status==="running"&&(l.value={runId:k.chainId,status:"running",startedAt:b.startedAt,archiveAtMs:k.archiveAtMs})}}}catch{}}async function m(){var D;if((D=l.value)!=null&&D.runId&&confirm("确定要取消这个任务吗?"))try{alert("取消功能需要 OpenClaw 支持,请使用命令行: openclaw subagents cancel "+l.value.runId)}catch($){console.error("Cancel failed:",$)}}function T(){A(),S()}return Bt(()=>{var D;return(D=e.agent)==null?void 0:D.id},()=>{A(),S()},{immediate:!0}),Bt(()=>e.agent.status,S),Nt(()=>{o=setInterval(()=>{i.value=Date.now()},1e3)}),ae(()=>{o&&(clearInterval(o),o=null)}),(D,$)=>(c(),d("div",{class:"panel-overlay",onClick:$[5]||($[5]=k=>D.$emit("close"))},[n("div",{class:"panel",onClick:$[4]||($[4]=le(()=>{},["stop"]))},[n("div",zd,[n("h2",null,f(t.agent.name),1),n("button",{class:"close-btn",onClick:$[0]||($[0]=k=>D.$emit("close"))},"×")]),n("div",Jd,[n("div",Qd,[$[6]||($[6]=n("h3",null,"状态",-1)),n("div",Yd,[n("span",{class:nt(["status-dot",`status-${t.agent.status}`])},null,2),n("span",Xd,f(a.value),1)])]),t.agent.currentTask?(c(),d("div",Zd,[$[7]||($[7]=n("h3",null,"当前任务",-1)),n("p",null,f(t.agent.currentTask),1)])):M("",!0),t.agent.lastActiveFormatted?(c(),d("div",tf,[$[8]||($[8]=n("h3",null,"最后活跃",-1)),n("p",null,f(t.agent.lastActiveFormatted),1)])):M("",!0),t.agent.error?(c(),d("div",ef,[$[9]||($[9]=n("h3",{class:"error-title"},"错误信息",-1)),n("div",sf,[n("div",nf,f(t.agent.error.type),1),n("div",lf,f(t.agent.error.message),1)])])):M("",!0),r.value?(c(),d("div",of,[n("div",{class:nt(["diagnostic-panel",`severity-${r.value.severity}`])},[n("div",af,[n("span",rf,f(r.value.severity==="critical"?"🚨":"⚠️"),1),n("span",cf,f(r.value.label)+"检测",1)]),n("div",uf,[n("div",df,[$[10]||($[10]=n("span",{class:"item-label"},"无响应时间:",-1)),n("span",ff,f(r.value.idleMinutes)+" 分钟",1)]),v.value?(c(),d("div",hf,[$[11]||($[11]=n("span",{class:"item-label"},"最后操作:",-1)),n("span",pf,f(v.value.tool)+" → "+f(v.value.result),1)])):M("",!0),u.value?(c(),d("div",vf,[$[12]||($[12]=n("span",{class:"item-label"},"自动超时:",-1)),n("span",gf,f(u.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",mf,[l.value?(c(),d("button",{key:0,class:"action-btn primary",onClick:m}," 取消任务 ")):M("",!0),n("button",{class:"action-btn",onClick:T}," 刷新状态 ")])])],2)])):M("",!0),n("div",_f,[$[14]||($[14]=n("h3",null,"最近活动",-1)),n("div",yf,[t.agent.status==="working"?(c(),d("div",bf," 💼 正在执行任务... ")):t.agent.status==="idle"?(c(),d("div",$f," 😴 空闲中 ")):t.agent.status==="down"?(c(),d("div",kf," ⚠️ 检测到错误 ")):M("",!0)])]),n("div",wf,[n("div",Cf,[n("button",{class:nt(["tab-btn",{active:s.value==="timeline"}]),onClick:$[1]||($[1]=k=>s.value="timeline")}," 📊 时序视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="chain"}]),onClick:$[2]||($[2]=k=>s.value="chain")}," 🔗 链路视图 ",2),n("button",{class:nt(["tab-btn",{active:s.value==="advanced"}]),onClick:$[3]||($[3]=k=>s.value="advanced")}," ⚙️ 高级 ",2)]),s.value==="timeline"?(c(),d("div",Tf,[bt(rs(kc),{agentId:t.agent.id,autoRefresh:!1},null,8,["agentId"])])):s.value==="chain"?(c(),d("div",Sf,[bt(rs(wu),{autoRefresh:!0,refreshInterval:10})])):s.value==="advanced"?(c(),d("div",xf,[n("div",Af,[$[15]||($[15]=n("h4",null,"⚙️ 配置",-1)),bt(od,{agentId:t.agent.id},null,8,["agentId"])]),n("div",If,[$[16]||($[16]=n("h4",null,"🔍 错误分析",-1)),bt(Gd,{agentId:t.agent.id},null,8,["agentId"])])])):M("",!0)])])])]))}}),Pf=Ct(Ef,[["__scopeId","data-v-aec763c1"]]),Df={class:"settings-panel"},Ff={class:"header"},Of={class:"content"},Lf={class:"setting-item"},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=wt({__name:"SettingsPanel",emits:["close"],setup(t,{emit:e}){const s=e,l=V(10),i=V(!0),o=V(!0),a=V(!0),r=V(!0),u=V(!1),v=V(100),p=V(!0);function C(){const S=localStorage.getItem("dashboard-settings");if(S)try{const m=JSON.parse(S);l.value=m.refreshInterval||10,i.value=m.autoRefreshEnabled!==!1,o.value=m.showTimestamps!==!1,a.value=m.showTokens!==!1,r.value=m.notifyOnError!==!1,u.value=m.notifyOnComplete||!1,v.value=m.logLines||100,p.value=m.autoScrollLog!==!1}catch(m){console.error("加载设置失败:",m)}}function A(){const S={refreshInterval:l.value,autoRefreshEnabled:i.value,showTimestamps:o.value,showTokens:a.value,notifyOnError:r.value,notifyOnComplete:u.value,logLines:v.value,autoScrollLog:p.value};localStorage.setItem("dashboard-settings",JSON.stringify(S)),s("settings-changed",S)}return Nt(()=>{C()}),(S,m)=>(c(),d("div",Df,[n("div",Ff,[m[9]||(m[9]=n("h2",null,"设置",-1)),n("button",{class:"close-btn",onClick:m[0]||(m[0]=T=>S.$emit("close"))},"×")]),n("div",Of,[n("section",null,[m[12]||(m[12]=n("h3",null,"自动刷新",-1)),n("div",Lf,[m[10]||(m[10]=n("label",null,"刷新间隔(秒)",-1)),Tt(n("input",{type:"number","onUpdate:modelValue":m[1]||(m[1]=T=>l.value=T),min:"1",max:"300",onChange:A},null,544),[[jn,l.value,void 0,{number:!0}]])]),n("div",Nf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[2]||(m[2]=T=>i.value=T),onChange:A},null,544),[[Oe,i.value]]),m[11]||(m[11]=At(" 启用自动刷新 ",-1))])])]),n("section",null,[m[15]||(m[15]=n("h3",null,"显示选项",-1)),n("div",jf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[3]||(m[3]=T=>o.value=T),onChange:A},null,544),[[Oe,o.value]]),m[13]||(m[13]=At(" 显示时间戳 ",-1))])]),n("div",Uf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[4]||(m[4]=T=>a.value=T),onChange:A},null,544),[[Oe,a.value]]),m[14]||(m[14]=At(" 显示 Token 消耗 ",-1))])])]),n("section",null,[m[18]||(m[18]=n("h3",null,"通知",-1)),n("div",Vf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[5]||(m[5]=T=>r.value=T),onChange:A},null,544),[[Oe,r.value]]),m[16]||(m[16]=At(" Agent 异常时通知 ",-1))])]),n("div",Wf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[6]||(m[6]=T=>u.value=T),onChange:A},null,544),[[Oe,u.value]]),m[17]||(m[17]=At(" 任务完成时通知 ",-1))])])]),n("section",null,[m[22]||(m[22]=n("h3",null,"日志查看",-1)),n("div",Hf,[m[20]||(m[20]=n("label",null,"日志行数",-1)),Tt(n("select",{"onUpdate:modelValue":m[7]||(m[7]=T=>v.value=T),onChange:A},[...m[19]||(m[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",Bf,[n("label",null,[Tt(n("input",{type:"checkbox","onUpdate:modelValue":m[8]||(m[8]=T=>p.value=T),onChange:A},null,544),[[Oe,p.value]]),m[21]||(m[21]=At(" 自动滚动日志 ",-1))])])])])]))}}),qf=Ct(Kf,[["__scopeId","data-v-e5b26232"]]);function Gf(t,e=300){const s=V(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 zf{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 zf(t)),tn}class Jf{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,V(s))}useStore(e,s){const l=this.state.get(e);if(l)return l;const i=V(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 Qf(){return en||(en=new Jf),en}class Yf{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 Xf(){return sn||(sn=new Yf),sn}function Oi(){const t=Fi(),e=V(t.getConnectionState()),s=V(!1);let l=null;const i=(r,u)=>t.subscribe(r,u),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 Zf={class:"indicator-icon"},th={key:0,class:"indicator-count"},eh={class:"card-header"},sh={class:"avatar"},nh={class:"header-info"},lh={class:"name"},ih={class:"status-text"},oh={key:0,class:"main-badge"},ah={class:"card-body"},rh={key:0,class:"model-row"},ch={class:"model-value"},uh=["title"],dh={key:0,class:"fallback-more"},fh={key:1,class:"current-task"},hh=["title"],ph={key:0,class:"task-child-info"},vh={class:"child-name"},gh={key:2,class:"multi-tasks"},mh={class:"tasks-count"},_h={class:"tasks-toggle"},yh=["title"],bh={key:0,class:"task-child-agent"},$h={key:0,class:"tasks-more"},kh={class:"action-icon"},wh={class:"action-text"},Ch={key:4,class:"idle-hint"},Th={class:"warning-modal"},Sh={class:"modal-header"},xh={class:"modal-icon"},Ah={class:"modal-title"},Ih={class:"modal-body"},Mh={class:"detail-row"},Rh={class:"detail-value error-type-tag"},Eh={class:"detail-row"},Ph={class:"detail-value"},Dh={class:"detail-row"},Fh={class:"detail-value highlight"},Oh={key:0,class:"detail-row"},Lh={class:"detail-value"},Nh={key:1,class:"detail-row"},jh={class:"detail-value"},Uh={key:2,class:"detail-row"},Vh={key:0,class:"waiting-task"},Wh={key:3,class:"stuck-suggestion"},Hh=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=V(!1),o=V(!1),a=["🤖","👤","📊","🏗️","💻","🧪","🔧","📋","🎯","⚙️"],r=Q(()=>{const x=(s.agent.name||"").toLowerCase();if(x.includes("pm")||x.includes("project")||x.includes("主"))return"👨💼";if(x.includes("analyst")||x.includes("分析"))return"📊";if(x.includes("architect")||x.includes("架构"))return"🏗️";if(x.includes("dev")||x.includes("开发"))return"💻";if(x.includes("qa")||x.includes("test")||x.includes("测试"))return"🧪";if(x.includes("ops")||x.includes("运维"))return"🔧";if(x.includes("frontend")||x.includes("前端"))return"🎨";if(x.includes("backend")||x.includes("后端"))return"⚙️";let F=0;for(let X=0;X<x.length;X++)F=(F<<5)-F+x.charCodeAt(X);return a[Math.abs(F)%a.length]}),u=Q(()=>({idle:"空闲",working:"工作中",down:"异常"})[s.agent.status]||"未知"),v=Q(()=>{var x;return((x=s.agentTasks)==null?void 0:x.length)||0}),p=Q(()=>s.isMain&&v.value>=2),C=Q(()=>s.agentTasks?s.agentTasks.slice(0,3):[]),A=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),m=Q(()=>{if(s.agentTasks&&s.agentTasks.length===1)return s.agentTasks[0].childAgentId}),T=Q(()=>({thinking:"🧠",tool_executing:"⚙️",waiting_llm:"📡",waiting_child:"⏳"})[s.subStatus||""]||"🔄"),D=Q(()=>{var F;return{"rate-limit":"请求过快","token-limit":"Token 超限",timeout:"请求超时",quota:"余额不足",unknown:"发生错误"}[((F=s.error)==null?void 0:F.type)||"unknown"]||"发生错误"}),$=Q(()=>{var F;return{waiting_for_child:"等待子代理响应",self_busy:"自身处理中",unknown:"原因未明"}[((F=s.stuckWarning)==null?void 0:F.reason)||"unknown"]||"原因未明"}),k=Q(()=>{if(!s.stuckWarning)return null;const x=s.stuckWarning.reason,F=s.stuckWarning.idleSeconds;return x==="waiting_for_child"?F>180?"子代理响应时间过长,建议检查子代理状态或考虑终止任务":"子代理正在执行任务,请耐心等待":x==="self_busy"?F>120?"任务处理时间过长,可能遇到复杂问题或外部资源阻塞":"正在处理复杂任务,请稍候":null});function b(x){const F=x.split("/");return F[F.length-1]||x}function R(){i.value=!0}function K(x){l("navigate-agent",x),i.value=!1}return(x,F)=>{var X;return c(),d("div",{class:nt(["agent-card",[`status-${t.agent.status}`,{"is-main":t.isMain}]]),onClick:F[4]||(F[4]=H=>x.$emit("click"))},[t.error||t.stuckWarning?(c(),d("div",{key:0,class:nt(["warning-indicator",{"has-error":t.error}]),onClick:le(R,["stop"])},[n("span",Zf,f(t.error?"⚠️":"⏳"),1),t.stuckWarning?(c(),d("span",th,f(t.stuckWarning.idleSeconds)+"s",1)):M("",!0)],2)):M("",!0),n("div",eh,[n("div",sh,f(r.value),1),n("div",nh,[n("div",lh,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",ih,f(u.value),1)],2)]),t.isMain?(c(),d("div",oh,"PM")):M("",!0)]),n("div",ah,[t.modelInfo&&t.modelInfo.primary?(c(),d("div",rh,[F[5]||(F[5]=n("span",{class:"model-label"},"模型",-1)),n("span",ch,f(b(t.modelInfo.primary)),1),(X=t.modelInfo.fallbacks)!=null&&X.length?(c(),d("span",{key:0,class:"model-fallbacks",title:"备用: "+t.modelInfo.fallbacks.map(b).join(", ")},[(c(!0),d(Y,null,ct(t.modelInfo.fallbacks.slice(0,2),(H,q)=>(c(),d("span",{key:H,class:"fallback-tag"},f(b(H)),1))),128)),t.modelInfo.fallbacks.length>2?(c(),d("span",dh,"+"+f(t.modelInfo.fallbacks.length-2),1)):M("",!0)],8,uh)):M("",!0)])):M("",!0),S.value&&!p.value?(c(),d("div",fh,[F[7]||(F[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,hh),m.value?(c(),d("div",ph,[F[6]||(F[6]=n("span",{class:"child-arrow"},"→",-1)),n("span",vh,f(m.value),1)])):M("",!0)])):M("",!0),p.value?(c(),d("div",gh,[n("div",{class:"tasks-header",onClick:F[0]||(F[0]=le(H=>o.value=!o.value,["stop"]))},[F[8]||(F[8]=n("span",{class:"tasks-icon"},"📋",-1)),F[9]||(F[9]=n("span",{class:"tasks-label"},"并行任务",-1)),n("span",mh,f(v.value),1),n("span",_h,f(o.value?"▲":"▼"),1)]),n("div",{class:nt(["tasks-list",{expanded:o.value}])},[(c(!0),d(Y,null,ct(C.value,H=>(c(),d("div",{key:H.id,class:nt(["task-item",`task-status-${H.status}`])},[F[10]||(F[10]=n("span",{class:"task-status-dot"},null,-1)),n("span",{class:"task-name",title:H.name},f(H.name),9,yh),H.childAgentId?(c(),d("span",bh,"→ "+f(H.childAgentId),1)):M("",!0)],2))),128)),A.value>0?(c(),d("div",$h," +"+f(A.value)+" 更多任务 ",1)):M("",!0)],2)])):M("",!0),t.agent.status==="working"&&t.currentAction?(c(),d("div",{key:3,class:nt(["status-detail",`sub-status-${t.subStatus}`])},[n("span",kh,f(T.value),1),n("span",wh,f(t.currentAction),1)],2)):t.agent.status==="idle"?(c(),d("div",Ch," 空闲中,等待任务... ")):M("",!0)]),(c(),Gt(Po,{to:"body"},[i.value?(c(),d("div",{key:0,class:"warning-modal-overlay",onClick:F[3]||(F[3]=le(H=>i.value=!1,["self"]))},[n("div",Th,[n("div",Sh,[n("span",xh,f(t.error?"⚠️":"⏳"),1),n("span",Ah,f(t.error?"异常详情":"卡顿分析"),1),n("button",{class:"modal-close",onClick:F[1]||(F[1]=H=>i.value=!1)},"×")]),n("div",Ih,[t.error?(c(),d(Y,{key:0},[n("div",Mh,[F[11]||(F[11]=n("span",{class:"detail-label"},"类型",-1)),n("span",Rh,f(D.value),1)]),n("div",Eh,[F[12]||(F[12]=n("span",{class:"detail-label"},"信息",-1)),n("span",Ph,f(t.error.message),1)])],64)):t.stuckWarning?(c(),d(Y,{key:1},[n("div",Dh,[F[13]||(F[13]=n("span",{class:"detail-label"},"等待时间",-1)),n("span",Fh,f(t.stuckWarning.idleSeconds)+" 秒",1)]),t.stuckWarning.reason?(c(),d("div",Oh,[F[14]||(F[14]=n("span",{class:"detail-label"},"原因",-1)),n("span",Lh,f($.value),1)])):M("",!0),t.stuckWarning.reasonDetail?(c(),d("div",Nh,[F[15]||(F[15]=n("span",{class:"detail-label"},"详情",-1)),n("span",jh,f(t.stuckWarning.reasonDetail),1)])):M("",!0),t.stuckWarning.waitingFor?(c(),d("div",Uh,[F[16]||(F[16]=n("span",{class:"detail-label"},"等待对象",-1)),n("span",{class:"detail-value agent-link",onClick:F[2]||(F[2]=H=>K(t.stuckWarning.waitingFor.agentId))},[At(f(t.stuckWarning.waitingFor.agentId)+" ",1),t.stuckWarning.waitingFor.task?(c(),d("span",Vh,"("+f(t.stuckWarning.waitingFor.task)+")",1)):M("",!0)])])):M("",!0),k.value?(c(),d("div",Wh,[F[17]||(F[17]=n("span",{class:"suggestion-icon"},"💡",-1)),n("span",null,f(k.value),1)])):M("",!0)],64)):M("",!0)])])])):M("",!0)]))],2)}}}),Bh=Ct(Hh,[["__scopeId","data-v-04c4a970"]]),Kh={class:"collaboration-flow-section"},qh={class:"section-header"},Gh={class:"header-right"},zh={key:0,class:"flow-legend flow-legend-inline"},Jh={class:"legend-name"},Qh={class:"indicator-text"},Yh={class:"flow-container",ref:"flowContainerRef"},Xh={key:0,class:"loading-state"},Zh={key:1,class:"error-state"},tp={key:2,class:"empty-state"},ep={key:3,class:"flow-layout"},sp={class:"level-header"},np={class:"level-badge"},lp={class:"level-title"},ip={class:"level-cards"},op=["onClick"],ap=["d"],rp={key:0,r:"5",fill:"url(#lightGradient)"},cp={dur:"2s",repeatCount:"1",rotate:"0"},up=["href"],dp={key:0,class:"model-panel"},fp={class:"model-toggle-icon"},hp={class:"model-panel-body"},pp={class:"model-name"},vp={class:"model-dots"},gp=["title","onClick"],mp={class:"model-count"},_p={class:"call-detail-modal"},yp={class:"call-detail-header"},bp={class:"call-detail-body"},$p={class:"call-detail-row"},kp={class:"value"},wp={class:"call-detail-row"},Cp={class:"value"},Tp={class:"call-detail-row"},Sp={class:"value"},xp={class:"call-detail-row"},Ap={class:"value"},Ip={class:"call-detail-row trigger"},Mp={class:"value"},Rp=1500,Ep=wt({__name:"CollaborationFlowSection",props:{mainAgent:{},subAgents:{},mainAgentId:{}},emits:["agent-click"],setup(t,{emit:e}){const s=t,l=e,{connectionState:i,subscribe:o}=Oi(),a=V([]),r=V([]),u=V([]),v=V({}),p=V([]),C=V(!0),A=V(null),S=V(null),m=V({}),T=V({}),D=V(""),$=V(!0),k=V({}),b=V(null),R=V(null),K=V({});function x(g,_){_&&(K.value[g]=_)}const F=Q(()=>s.mainAgentId?s.mainAgentId:D.value?D.value:"main"),X=Q(()=>a.value.filter(g=>g.type==="agent")),H=Q(()=>a.value.filter(g=>g.type==="model")),q=Q(()=>r.value.filter(g=>g.type==="delegates")),G=Q(()=>{const g={};for(const U of X.value){const O=Z(U.id);g[O]||(g[O]=[]),g[O].push(U)}const _={};return Object.keys(g).map(Number).sort((U,O)=>U-O).forEach(U=>{_[U]=g[U]}),_});function I(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===F.value?"#4a9eff":st[g]||"#64748b"}const P=Q(()=>X.value.map(g=>g.id).filter(Boolean)),L=Q(()=>({connected:"已连接",connecting:"连接中...",disconnected:"未连接",error:"连接错误"})[i.value.status]||"未知");function Z(g){return g===F.value?T.value[g]??0:T.value[g]??1}function it(g){const _=X.value.find(U=>U.id===g);return(_==null?void 0:_.name)||g}function N(g){var O;const _=j=>j==="error"?"down":j,U=g.id===F.value?s.mainAgent:(O=s.subAgents)==null?void 0:O.find(j=>j.id===g.id);if(U&&g.type==="agent"){const j=ot(g.id);let w;const J=g.status==="idle"||g.status==="error";J||((j==null?void 0:j.length)===1?w=j[0].name:j&&j.length>1&&(w=`${j.length} 个任务进行中`));const z=J?void 0:U.currentTask;return{name:U.name,status:_(g.status),currentTask:w??z,lastActiveFormatted:U.lastActiveFormatted}}return U?{name:U.name,status:U.status,currentTask:U.currentTask,lastActiveFormatted:U.lastActiveFormatted}:{name:g.name,status:_(g.status)}}function W(g){if(g.type==="agent")return v.value[g.id]}function ot(g){return k.value[g]}function lt(g){return u.value.includes(g.id)}function ft(g){return u.value.includes(g.source)&&u.value.includes(g.target)}function tt(g){const _=K.value[g.source],U=K.value[g.target],O=b.value;if(!_||!U||!O)return"";const j=O.getBoundingClientRect(),w=_.getBoundingClientRect(),J=U.getBoundingClientRect(),z=w.left-j.left+w.width/2,et=w.top-j.top+w.height,at=J.left-j.left+J.width/2,dt=J.top-j.top,vt=(et+dt)/2;return`M ${z} ${et} C ${z} ${vt}, ${at} ${vt}, ${at} ${dt}`}function kt(){Me(()=>{if(!b.value||!R.value)return;const g=b.value.getBoundingClientRect();R.value.setAttribute("width",String(g.width)),R.value.setAttribute("height",String(g.height))})}const It=Q(()=>{const g={};for(const _ of p.value){const U=_.model||"(unknown)";g[U]||(g[U]=[]),g[U].push(_)}return g});function Dt(g){var O;const _=((O=g.metadata)==null?void 0:O.modelId)||"",U=_.split("/").pop()||_;return It.value[_]||It.value[U]||[]}function _e(g){return Dt(g).length>0}async function ye(){C.value=!0,A.value=null;try{const g=await fetch("/api/collaboration");if(!g.ok)throw new Error("Failed to fetch collaboration data");const _=await g.json();a.value=_.nodes||[],r.value=_.edges||[],u.value=_.activePath||[],v.value=_.agentModels||{},p.value=_.recentCalls||[],_.hierarchy&&(m.value=_.hierarchy),_.depths&&(T.value=_.depths),_.mainAgentId&&(D.value=_.mainAgentId),_.agentActiveTasks&&(k.value=_.agentActiveTasks),Me(kt)}catch(g){A.value=g.message}finally{C.value=!1}}function Qt(){ye()}function Se(g){const _=g;a.value=_.nodes||[],r.value=_.edges||[],u.value=_.activePath||[],v.value=_.agentModels||{},p.value=_.recentCalls||[],_.hierarchy&&(m.value=_.hierarchy),_.depths&&(T.value=_.depths),_.mainAgentId&&(D.value=_.mainAgentId),_.agentActiveTasks&&(k.value=_.agentActiveTasks),Me(kt)}function h(g){u.value=g.activePath||[],p.value=g.recentCalls||[],g.agentActiveTasks&&(k.value=g.agentActiveTasks);const _=a.value.filter(w=>w.type==="agent");for(const w of _){if(w.id&&g.agentStatuses&&g.agentStatuses[w.id]!==void 0&&(w.status=g.agentStatuses[w.id]),w.id&&g.agentDynamicStatuses&&g.agentDynamicStatuses[w.id]){const J=g.agentDynamicStatuses[w.id];w.subStatus=J.subStatus,w.currentAction=J.currentAction,w.toolName=J.toolName,w.waitingFor=J.waitingFor}if(w.id&&g.agentDisplayStatuses&&g.agentDisplayStatuses[w.id]){const J=g.agentDisplayStatuses[w.id];w.currentAction=J.display,w.metadata||(w.metadata={}),w.metadata={...w.metadata,duration:J.duration,alert:J.alert},J.alert?w.stuckWarning={isStuck:!0,idleSeconds:J.duration,lastUpdate:Date.now(),reason:"self_busy",reasonDetail:J.display}:w.stuckWarning&&!w.stuckWaitingForChildAgent&&(w.stuckWarning=void 0)}}const U=new Set(a.value.filter(w=>w.type==="task").map(w=>w.id)),O=new Set((g.taskNodes||[]).map(w=>w.id));if(U.size!==O.size||[...O].some(w=>!U.has(w))){const w=a.value.filter(z=>z.type==="model"),J=r.value.filter(z=>z.type==="delegates");a.value=[..._,...g.taskNodes||[],...w],r.value=[...J,...g.taskEdges||[]],Me(kt)}else{const w=new Map((g.taskNodes||[]).map(J=>[J.id,J]));for(const J of a.value.filter(z=>z.type==="task")){const z=w.get(J.id);z&&(J.status=z.status,J.name=z.name,z.timestamp&&(J.timestamp=z.timestamp))}}}async function y(){if(!(C.value||a.value.length===0))try{const g=await fetch("/api/collaboration/dynamic");if(!g.ok)return;const _=await g.json();h(_)}catch{}}let E=null,B=null;return Bt([X,$],()=>{Me(kt)}),Nt(()=>{ye(),E=o("collaboration",Se),B=setInterval(y,Rp),window.addEventListener("resize",kt)}),ae(()=>{E&&E(),B&&clearInterval(B),window.removeEventListener("resize",kt)}),(g,_)=>{var U;return c(),d("div",Kh,[n("div",qh,[_[4]||(_[4]=n("h2",null,"协作流程",-1)),n("div",Gh,[X.value.length>0?(c(),d("div",zh,[(c(!0),d(Y,null,ct(P.value,O=>(c(),d("div",{key:O,class:"legend-item"},[n("span",{class:"legend-dot",style:St({background:mt(O)})},null,4),n("span",Jh,f(it(O)),1)]))),128))])):M("",!0),n("div",{class:nt(["connection-indicator",rs(i).status])},[_[3]||(_[3]=n("span",{class:"indicator-dot"},null,-1)),n("span",Qh,f(L.value),1)],2)])]),n("div",Yh,[C.value?(c(),d("div",Xh,[..._[5]||(_[5]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载中...",-1)])])):A.value?(c(),d("div",Zh,[_[6]||(_[6]=n("span",{class:"error-icon"},"⚠️",-1)),n("span",null,f(A.value),1),n("button",{onClick:Qt,class:"retry-btn"},"重试")])):a.value.length===0?(c(),d("div",tp,[..._[7]||(_[7]=[n("span",{class:"empty-icon"},"📭",-1),n("span",null,"暂无协作数据",-1)])])):(c(),d("div",ep,[n("div",{class:"agent-area",ref_key:"agentAreaRef",ref:b},[(c(!0),d(Y,null,ct(G.value,(O,j)=>(c(),d("div",{key:j,class:"level-section"},[n("div",sp,[n("span",np,"L"+f(j),1),n("span",lp,f(I(Number(j))),1)]),n("div",ip,[(c(!0),d(Y,null,ct(O,w=>(c(),d("div",{key:w.id,class:nt(["agent-card-wrapper",{"main-agent":w.id===F.value,active:lt(w),[`status-${w.status}`]:!0}]),style:St({"--agent-color":mt(w.id)}),ref_for:!0,ref:J=>x(w.id,J),onClick:J=>l("agent-click",w)},[bt(Bh,{agent:N(w),"model-info":W(w),"is-main":w.id===F.value,"current-task":w.currentTask,error:w.error,"stuck-warning":w.stuckWarning,"hierarchy-depth":Z(w.id),"agent-color":mt(w.id),"sub-status":w.subStatus,"current-action":w.currentAction,"tool-name":w.toolName,"waiting-for":w.waitingFor,"agent-tasks":ot(w.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,op))),128))])]))),128)),(c(),d("svg",{class:"edges-svg",ref_key:"edgesSvgRef",ref:R},[_[8]||(_[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),d(Y,null,ct(q.value,O=>(c(),d("g",{key:O.id},[n("path",{d:tt(O),class:nt(["edge-path",{active:ft(O)}]),stroke:"#4a9eff","stroke-width":"2",fill:"none"},null,10,ap),ft(O)?(c(),d("circle",rp,[n("animateMotion",cp,[n("mpath",{href:`#edge-${O.id}`},null,8,up)])])):M("",!0)]))),128))],512))],512),H.value.length>0?(c(),d("div",dp,[n("div",{class:"model-panel-header",onClick:_[0]||(_[0]=O=>$.value=!$.value)},[_[9]||(_[9]=n("span",{class:"model-panel-title"},"🧠 模型",-1)),n("span",fp,f($.value?"▼":"▶"),1)]),Tt(n("div",hp,[(c(!0),d(Y,null,ct(H.value,O=>(c(),d("div",{key:O.id,class:nt(["model-card",{active:_e(O)}])},[n("div",pp,f(O.name),1),n("div",vp,[(c(!0),d(Y,null,ct(Dt(O).slice(0,8),j=>(c(),d("span",{key:j.id,class:"model-dot",style:St({background:mt(j.agentId)}),title:`${it(j.agentId)} @ ${j.model||"unknown"}`,onClick:le(w=>S.value=j,["stop"])},null,12,gp))),128))]),n("div",mp,f(Dt(O).length),1)],2))),128))],512),[[fs,$.value]])])):M("",!0)]))],512),S.value?(c(),d("div",{key:0,class:"call-detail-overlay",onClick:_[2]||(_[2]=le(O=>S.value=null,["self"]))},[n("div",_p,[n("div",yp,[_[10]||(_[10]=n("h3",null,"调用详情",-1)),n("button",{class:"close-btn",onClick:_[1]||(_[1]=O=>S.value=null)},"×")]),n("div",bp,[n("div",$p,[_[11]||(_[11]=n("span",{class:"label"},"Agent",-1)),n("span",kp,f(S.value.agentId),1)]),n("div",wp,[_[12]||(_[12]=n("span",{class:"label"},"模型",-1)),n("span",Cp,f(S.value.model),1)]),n("div",Tp,[_[13]||(_[13]=n("span",{class:"label"},"时间",-1)),n("span",Sp,f(S.value.time),1)]),n("div",xp,[_[14]||(_[14]=n("span",{class:"label"},"Tokens",-1)),n("span",Ap,f(S.value.tokens),1)]),n("div",Ip,[_[15]||(_[15]=n("span",{class:"label"},"触发",-1)),n("div",Mp,f((U=S.value.trigger)==null?void 0:U.replace(/^【完成回传】/,"")),1)])])])])):M("",!0)])}}}),Pp=Ct(Ep,[["__scopeId","data-v-4b9cd3f2"]]),Dp={class:"collaboration-box"},Fp={class:"collaboration-box-body"},Op={class:"collaboration-error-fallback"},Lp={class:"fallback-reason"},Np=wt({__name:"CollaborationFlowWrapper",props:{mainAgent:{},subAgents:{},mainAgentId:{}},emits:["agent-click"],setup(t){const e=V(null);return ci(s=>(e.value=s instanceof Error?s.message:String(s),!1)),(s,l)=>(c(),d("div",Dp,[l[3]||(l[3]=n("div",{class:"collaboration-box-header"},[n("h2",null,"协作流程"),n("span",{class:"collaboration-hint"},"展示主 Agent 与子 Agents 的协作关系")],-1)),n("div",Fp,[Tt(bt(Pp,{"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",Lp,f(e.value),1),n("button",{onClick:l[1]||(l[1]=i=>e.value=null)},"重试")],512),[[fs,e.value]])])]))}}),jp=Ct(Np,[["__scopeId","data-v-ef9f8c73"]]),Up={class:"task-status-section"},Vp={class:"section-header"},Wp={class:"summary-stats"},Hp={class:"stat total"},Bp={class:"filters-row"},Kp={class:"search-box"},qp={class:"filter-buttons"},Gp=["onClick"],zp={key:0,class:"loading-state"},Jp={key:1,class:"error-state"},Qp={key:2,class:"empty-state"},Yp={class:"task-list"},Xp=["onClick"],Zp={class:"task-main"},tv={class:"task-name-short"},ev={key:0,class:"task-agent"},sv={key:1,class:"task-time"},nv={class:"task-detail-modal"},lv={class:"task-detail-header"},iv={class:"task-detail-body"},ov={class:"detail-row"},av={class:"detail-value task-content"},rv={key:0,class:"detail-row"},cv={class:"detail-value"},uv={class:"detail-row"},dv={class:"detail-value"},fv={key:1,class:"detail-row"},hv={class:"detail-value"},pv={key:2,class:"detail-row"},vv={class:"detail-value path-value"},gv={key:3,class:"detail-row"},mv={class:"detail-value"},_v={key:4,class:"detail-row"},yv={class:"detail-progress"},bv={class:"progress-bar"},$v={class:"progress-text"},kv={key:5,class:"detail-row"},wv={class:"detail-value error"},Cv={key:6,class:"detail-row"},Tv={class:"generated-files-list"},Sv={key:7,class:"detail-row"},xv={class:"detail-value output-content"},Av={key:8,class:"detail-row"},Iv={class:"detail-subtasks"},Mv={key:0,class:"subtask-error-inline"},Rv={key:9,class:"detail-row"},Ev={class:"timeline-container"},Pv={class:"timeline"},Dv={class:"timeline-time"},Fv={class:"timeline-desc"},Ov=wt({__name:"TaskStatusSection",setup(t){const{subscribe:e}=Oi(),s=V([]),l=V(!0),i=V(null),o=V(""),a=V([]),r=V(null),u=V(null),v=V([]),p=V(!1),C=[{value:"running",label:"执行中"},{value:"completed",label:"已完成"},{value:"failed",label:"失败"},{value:"pending",label:"待分配"}];Gf(P=>{},300);const A=Q(()=>{let P=s.value;if(a.value.length>0&&(P=P.filter(L=>a.value.includes(L.status))),o.value){const L=o.value.toLowerCase();P=P.filter(Z=>{var it;return Z.name.toLowerCase().includes(L)||((it=Z.agentName)==null?void 0:it.toLowerCase().includes(L))})}return P}),S=Q(()=>({total:s.value.length,running:s.value.filter(P=>P.status==="running").length,completed:s.value.filter(P=>P.status==="completed").length,failed:s.value.filter(P=>P.status==="failed").length,pending:s.value.filter(P=>P.status==="pending").length,cancelled:s.value.filter(P=>P.status==="cancelled").length}));function m(P){return{pending:"⏳",running:"🔄",completed:"✅",failed:"❌",cancelled:"🚫"}[P]||"📋"}function T(P){return s.value.filter(L=>L.status===P).length}function D(P){if(!P||!P.trim())return"未知";const L=P.trim().toLowerCase(),Z={terminated:"任务被终止(可能是超时或被用户取消)",timeout:"任务执行超时",cancelled:"任务已取消",canceled:"任务已取消",killed:"任务被终止","subagent-error":"子任务执行异常"};for(const[it,N]of Object.entries(Z))if(L.includes(it))return N;return P.trim()}function $(P){return!P||typeof P!="string"?"":P.replace(/\*\*/g,"").replace(/`([^`]+)`/g,"$1")}function k(P){if(!P.startTime)return"";const L=new Date(P.startTime).getTime(),Z=P.endTime?new Date(P.endTime).getTime():Date.now(),it=Math.floor((Z-L)/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 b(P){const L=a.value.indexOf(P);L===-1?a.value.push(P):a.value.splice(L,1)}function R(P){a.value.length===1&&a.value[0]===P?a.value=[]:a.value=[P]}function K(P){const Z=$(P.task??P.name).split(`
|
|
24
24
|
`)[0].trim();return Z.length<=60?Z:Z.slice(0,60)+"…"}function x(P){return{pending:"待分配",running:"执行中",completed:"已完成",failed:"失败",cancelled:"已取消"}[P]||P}async function F(){l.value=!0,i.value=null;try{const P=await fetch("/api/tasks");if(!P.ok)throw new Error("Failed to fetch tasks");const L=await P.json();s.value=(L.tasks||[]).map(Z=>q(Z))}catch(P){i.value=P.message}finally{l.value=!1}}function X(P){return{pending:"pending",assigning:"pending",running:"running",in_progress:"running",active:"running",completed:"completed",success:"completed",failed:"failed",error:"failed",cancelled:"cancelled"}[P]||"pending"}function H(){F()}function q(P){const L=(P.subtasks||[]).map(Z=>({id:Z.id||Z.name,name:Z.name||"Unknown",task:Z.task,status:X(Z.status),progress:Z.progress??0,startTime:Z.startTime,endTime:Z.endTime,agentId:Z.agentId,agentName:Z.agentName,agentWorkspace:Z.agentWorkspace,taskPath:Z.taskPath,error:Z.error,output:Z.output,generatedFiles:Z.generatedFiles}));return{id:P.id,name:P.name||"Unknown Task",task:P.task,status:X(P.status),progress:P.progress??0,startTime:P.startTime,endTime:P.endTime,agentId:P.agentId,agentName:P.agentName,agentWorkspace:P.agentWorkspace,taskPath:P.taskPath,error:P.error,output:P.output,generatedFiles:P.generatedFiles,subtasks:L.length?L:void 0}}function G(P){const Z=(Array.isArray(P)?P:P&&typeof P=="object"&&"tasks"in P?P.tasks??[]:[]).map(it=>q(it));Z.length===0&&s.value.length>0||(s.value=Z)}function I(P){return P?new Date(P).toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"}):""}async function st(P){if(!P){v.value=[];return}p.value=!0;try{const L=await fetch(`/api/tasks/${P}/timeline`);if(L.ok){const Z=await L.json();v.value=Z.timeline||[]}}catch(L){console.error("Failed to fetch timeline:",L),v.value=[]}finally{p.value=!1}}Bt(r,P=>{P?st(P.id):v.value=[]});let mt=null;return Nt(()=>{F(),mt=e("tasks",G)}),ae(()=>{mt&&mt()}),(P,L)=>{var Z,it;return c(),d("div",Up,[n("div",Vp,[L[6]||(L[6]=n("h2",null,"任务状态",-1)),n("div",Wp,[n("span",{class:nt(["stat running clickable",{active:a.value.includes("running")}]),onClick:L[0]||(L[0]=N=>R("running"))},"执行中: "+f(S.value.running),3),n("span",{class:nt(["stat completed clickable",{active:a.value.includes("completed")}]),onClick:L[1]||(L[1]=N=>R("completed"))},"已完成: "+f(S.value.completed),3),n("span",{class:nt(["stat failed clickable",{active:a.value.includes("failed")}]),onClick:L[2]||(L[2]=N=>R("failed"))},"失败: "+f(S.value.failed),3),n("span",Hp,"总计: "+f(S.value.total),1)])]),n("div",Bp,[n("div",Kp,[Tt(n("input",{"onUpdate:modelValue":L[3]||(L[3]=N=>o.value=N),type:"text",placeholder:"搜索任务...",class:"search-input"},null,512),[[jn,o.value]])]),n("div",qp,[(c(),d(Y,null,ct(C,N=>n("button",{key:N.value,class:nt(["filter-btn",{active:a.value.includes(N.value)}]),onClick:W=>b(N.value)},f(N.label)+" ("+f(T(N.value))+") ",11,Gp)),64))])]),l.value?(c(),d("div",zp,[...L[7]||(L[7]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载任务数据...",-1)])])):i.value?(c(),d("div",Jp,[L[8]||(L[8]=n("span",{class:"error-icon"},"⚠️",-1)),n("span",null,f(i.value),1),n("button",{onClick:H,class:"retry-btn"},"重试")])):A.value.length===0?(c(),d("div",Qp,[L[9]||(L[9]=n("span",{class:"empty-icon"},"📭",-1)),n("span",null,f(o.value?"无匹配任务":"暂无任务数据"),1)])):(c(),d("div",{key:3,class:"task-list-container",ref_key:"containerRef",ref:u},[n("div",Yp,[(c(!0),d(Y,null,ct(A.value,N=>(c(),d("div",{key:N.id,class:"task-item",onClick:W=>r.value=N},[n("span",{class:nt(["task-status-icon",N.status])},f(m(N.status)),3),n("div",Zp,[n("div",tv,f(K(N)),1)]),N.agentName?(c(),d("span",ev,f(N.agentName),1)):M("",!0),N.startTime?(c(),d("span",sv,f(k(N)),1)):M("",!0),L[10]||(L[10]=n("span",{class:"task-detail-hint"},"详情 ›",-1))],8,Xp))),128))])],512)),r.value?(c(),d("div",{key:4,class:"task-detail-overlay",onClick:L[5]||(L[5]=le(N=>r.value=null,["self"]))},[n("div",nv,[n("div",lv,[L[11]||(L[11]=n("h3",null,"任务详情",-1)),n("button",{class:"close-btn",onClick:L[4]||(L[4]=N=>r.value=null)},"×")]),n("div",iv,[n("div",ov,[L[12]||(L[12]=n("span",{class:"detail-label"},"任务",-1)),n("span",av,f($(r.value.task??r.value.name)),1)]),r.value.taskPath?(c(),d("div",rv,[L[13]||(L[13]=n("span",{class:"detail-label"},"项目路径",-1)),n("span",cv,f($(r.value.taskPath)),1)])):M("",!0),n("div",uv,[L[14]||(L[14]=n("span",{class:"detail-label"},"状态",-1)),n("span",dv,[n("span",{class:nt(["task-status-icon",r.value.status])},f(m(r.value.status)),3),At(" "+f(x(r.value.status)),1)])]),r.value.agentName?(c(),d("div",fv,[L[15]||(L[15]=n("span",{class:"detail-label"},"执行者",-1)),n("span",hv,f(r.value.agentName),1)])):M("",!0),r.value.agentWorkspace?(c(),d("div",pv,[L[16]||(L[16]=n("span",{class:"detail-label"},"Agent 工作区路径",-1)),n("span",vv,f(r.value.agentWorkspace),1)])):M("",!0),r.value.startTime?(c(),d("div",gv,[L[17]||(L[17]=n("span",{class:"detail-label"},"耗时",-1)),n("span",mv,f(k(r.value)),1)])):M("",!0),r.value.status==="running"?(c(),d("div",_v,[L[18]||(L[18]=n("span",{class:"detail-label"},"进度",-1)),n("div",yv,[n("div",bv,[n("div",{class:"progress-fill",style:St({width:`${r.value.progress}%`})},null,4)]),n("span",$v,f(r.value.progress)+"%",1)])])):M("",!0),r.value.status==="failed"?(c(),d("div",kv,[L[19]||(L[19]=n("span",{class:"detail-label"},"失败原因",-1)),n("span",wv,f(D(r.value.error)),1)])):M("",!0),r.value.status==="completed"&&((Z=r.value.generatedFiles)!=null&&Z.length)?(c(),d("div",Cv,[L[20]||(L[20]=n("span",{class:"detail-label"},"生成的文件",-1)),n("ul",Tv,[(c(!0),d(Y,null,ct(r.value.generatedFiles,N=>(c(),d("li",{key:N,class:"file-path-item"},f(N),1))),128))])])):M("",!0),r.value.status==="completed"&&r.value.output?(c(),d("div",Sv,[L[21]||(L[21]=n("span",{class:"detail-label"},"Agent 输出",-1)),n("div",xv,f($(r.value.output)),1)])):M("",!0),(it=r.value.subtasks)!=null&&it.length?(c(),d("div",Av,[L[22]||(L[22]=n("span",{class:"detail-label"},"子任务",-1)),n("div",Iv,[(c(!0),d(Y,null,ct(r.value.subtasks,N=>(c(),d("div",{key:N.id,class:"subtask-row"},[n("span",{class:nt(["task-status-icon",N.status])},f(m(N.status)),3),n("span",null,f(N.name),1),N.status==="failed"?(c(),d("span",Mv,f(D(N.error)),1)):M("",!0)]))),128))])])):M("",!0),v.value.length>0?(c(),d("div",Rv,[L[24]||(L[24]=n("span",{class:"detail-label"},"执行时间线",-1)),n("div",Ev,[n("div",Pv,[(c(!0),d(Y,null,ct(v.value,(N,W)=>(c(),d("div",{key:W,class:nt(["timeline-item",N.type])},[n("span",Dv,f(I(N.time)),1),L[23]||(L[23]=n("span",{class:"timeline-dot"},null,-1)),n("span",Fv,f(N.description),1)],2))),128))])])])):M("",!0)])])])):M("",!0)])}}}),Lv=Ct(Ov,[["__scopeId","data-v-5d944098"]]),Nv={class:"performance-section"},jv={class:"section-header"},Uv={class:"time-range-selector"},Vv=["onClick"],Wv={key:0,class:"loading-state"},Hv={key:1,class:"error-state"},Bv={class:"metrics-grid"},Kv={class:"metric-card primary"},qv={class:"metric-content"},Gv={class:"metric-value"},zv={key:0,class:"metric-alert"},Jv={class:"metric-card"},Qv={class:"metric-content"},Yv={class:"metric-value"},Xv={class:"metric-card highlight"},Zv={class:"metric-content"},tg={class:"metric-value"},eg={class:"metric-unit"},sg={class:"metric-card highlight"},ng={class:"metric-content"},lg={class:"metric-value"},ig={class:"metric-unit"},og={class:"charts-stack"},ag={class:"chart-card"},rg={class:"chart-header"},cg={class:"chart-datetime"},ug={class:"chart-container"},dg={class:"chart-bars"},fg=["title","onClick"],hg={class:"bar-value"},pg={class:"bar-time-label"},vg={class:"chart-card"},gg={class:"chart-header"},mg={class:"chart-datetime"},_g={class:"chart-container"},yg={class:"chart-bars rpm"},bg=["title","onClick"],$g={class:"bar-value"},kg={class:"bar-time-label"},wg={class:"summary-section"},Cg={class:"summary-grid"},Tg={class:"summary-item"},Sg={class:"summary-value"},xg={class:"summary-item"},Ag={class:"summary-value"},Ig={key:0,class:"summary-sub"},Mg={class:"summary-item highlight"},Rg={class:"summary-value"},Eg={class:"detail-modal"},Pg={class:"detail-modal-header"},Dg={class:"detail-modal-body"},Fg={key:0,class:"detail-loading"},Og={key:1,class:"detail-calls"},Lg={class:"detail-summary"},Ng={class:"detail-filters"},jg=["value"],Ug={key:0,class:"detail-call-hint"},Vg={class:"call-header"},Wg={class:"call-agent"},Hg={class:"call-time"},Bg={class:"call-tokens"},Kg=["title"],qg={key:0,class:"call-trigger-badge"},Gg={key:0,class:"call-meta"},zg={key:2,class:"detail-empty"},Jg={key:1,class:"alerts-panel"},Qg={class:"alerts-list"},Yg={class:"alert-message"},Xg={class:"alert-value"},Zg={class:"alert-time"},tm=["onClick"],em=wt({__name:"PerformanceSection",setup(t){const e=V(!0),s=V(null),l=V("20m"),i=V([]),o=V(!1),a=V(!1),r=V(null),u=V(""),v=V(""),p=V(""),C=V("tokens_desc"),A=Q(()=>{var W;if(!((W=r.value)!=null&&W.calls))return[];const N=new Set(r.value.calls.map(ot=>ot.agentId));return Array.from(N).sort()}),S=Q(()=>{var W;if(!((W=r.value)!=null&&W.calls))return[];let N=[...r.value.calls];if(v.value){const ot=v.value.toLowerCase();N=N.filter(lt=>{var ft;return(ft=lt.trigger)==null?void 0:ft.toLowerCase().includes(ot)})}switch(p.value&&(N=N.filter(ot=>ot.agentId===p.value)),C.value){case"tokens_desc":N.sort((ot,lt)=>lt.tokens-ot.tokens);break;case"tokens_asc":N.sort((ot,lt)=>ot.tokens-lt.tokens);break;case"time_asc":N.sort((ot,lt)=>ot.time.localeCompare(lt.time));break;case"time_desc":N.sort((ot,lt)=>lt.time.localeCompare(ot.time));break}return N}),m=Q(()=>S.value.reduce((N,W)=>N+W.tokens,0)),T=V({current:{tpm:0,rpm:0,windowTotal:{tokens:0,requests:0}},history:{tpm:[],rpm:[],timestamps:[]},statistics:{avgTpm:0,peakTpm:0,peakTime:""}}),D=[{value:"20m",label:"20分钟"},{value:"1h",label:"1小时"},{value:"24h",label:"24小时"}],$=Q(()=>{const N=D.find(W=>W.value===l.value);return N?`最近 ${N.label}`:""}),k=Q(()=>{switch(l.value){case"20m":return 20;case"1h":return 60;case"24h":return 24;default:return 20}}),b=Q(()=>{const N=T.value.history,W=k.value;if(N.tpm.length===0){const ot=l.value==="24h"?36e5:6e4;return Array.from({length:W},(lt,ft)=>({timestamp:Date.now()-(W-ft-1)*ot,tpm:0,rpm:0}))}return N.tpm.map((ot,lt)=>({timestamp:N.timestamps[lt]||Date.now()-lt*6e4,tpm:ot,rpm:N.rpm[lt]||0}))});function R(N){const W=b.value.map(lt=>lt[N]);return Math.max(...W,1)*1.2}function K(N,W){return Math.max(N/W*100,5)}function x(N){return N>=1e6?(N/1e6).toFixed(1)+"M":N>=1e3?(N/1e3).toFixed(1)+"K":N.toString()}const F=V(Date.now());function X(N){const W=N??Date.now(),ot=typeof W=="number"?W:Number(W);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 H(N){if(N==null)return"--:--";if(typeof N=="string"){const lt=N.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 N}const W=Number(N);if(isNaN(W))return"--:--";const ot=new Date(W);return isNaN(ot.getTime())?"--:--":l.value==="24h"?ot.toLocaleString("zh-CN",{hour:"2-digit",hour12:!1})+":00":ot.toLocaleString("zh-CN",{hour:"2-digit",minute:"2-digit",hour12:!1})}function q(N){return i.value.some(W=>W.type===N&&!W.acknowledged)}function G(N){const W=i.value.find(ot=>ot.id===N);W&&(W.acknowledged=!0)}async function I(){var N,W,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:((N=h.current)==null?void 0:N.tpm)??0,rpm:((W=h.current)==null?void 0:W.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)??""}},F.value=Date.now(),st()}catch(Se){s.value=Se.message}finally{e.value=!1}}function st(){const{current:N}=T.value;N.tpm>1e5&&i.value.push({id:`high_tpm_${Date.now()}`,type:"high_tpm",message:"TPM 过高",value:N.tpm,threshold:1e5,timestamp:Date.now(),acknowledged:!1}),i.value=i.value.slice(-10)}function mt(){I()}async function P(N){let W;if(typeof N.timestamp=="number")W=N.timestamp<1e12?N.timestamp*1e3:N.timestamp;else if(typeof N.timestamp=="string"){const lt=N.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),W=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,u.value=`${H(N.timestamp)} 调用详情`,r.value=null,a.value=!0,v.value="",p.value="",C.value="tokens_desc";try{const lt=await fetch(`/api/performance/details?timestamp=${W}&granularity=${ot}`),ft=await lt.json();lt.ok?(r.value=ft,u.value=`${ft.timeWindow||H(N.timestamp)} 调用详情`):r.value={timeWindow:H(N.timestamp),calls:[],totalCalls:0,totalTokens:0,summary:{avgTokens:0}}}catch{r.value={timeWindow:H(N.timestamp),calls:[],totalCalls:0,totalTokens:0,summary:{avgTokens:0}}}finally{a.value=!1}}let L=null;function Z(){it();const N=l.value==="24h"?3e5:3e4;L=setInterval(I,N)}function it(){L&&(clearInterval(L),L=null)}return Nt(()=>{I(),Z()}),ae(()=>{it()}),Bt(l,()=>{I(),Z()}),(N,W)=>{var ot,lt,ft;return c(),d("div",Nv,[n("div",jv,[W[5]||(W[5]=n("h2",null,"性能数据",-1)),n("div",Uv,[(c(),d(Y,null,ct(D,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,Vv)),64))])]),e.value?(c(),d("div",Wv,[...W[6]||(W[6]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载性能数据...",-1)])])):s.value?(c(),d("div",Hv,[W[7]||(W[7]=n("span",{class:"error-icon"},"⚠️",-1)),n("span",null,f(s.value),1),n("button",{onClick:mt,class:"retry-btn"},"重试")])):(c(),d(Y,{key:2},[n("div",Bv,[n("div",Kv,[W[10]||(W[10]=n("div",{class:"metric-icon"},"⚡",-1)),n("div",qv,[W[8]||(W[8]=n("div",{class:"metric-label"},"TPM",-1)),n("div",Gv,f(x(T.value.current.tpm)),1),W[9]||(W[9]=n("div",{class:"metric-unit"},"Tokens/分钟",-1))]),q("high_tpm")?(c(),d("div",zv,"⚠️")):M("",!0)]),n("div",Jv,[W[13]||(W[13]=n("div",{class:"metric-icon"},"🔄",-1)),n("div",Qv,[W[11]||(W[11]=n("div",{class:"metric-label"},"RPM",-1)),n("div",Yv,f(x(T.value.current.rpm)),1),W[12]||(W[12]=n("div",{class:"metric-unit"},"Requests/分钟",-1))])]),n("div",Xv,[W[15]||(W[15]=n("div",{class:"metric-icon"},"📊",-1)),n("div",Zv,[W[14]||(W[14]=n("div",{class:"metric-label"},"总 Token",-1)),n("div",tg,f(x(T.value.current.windowTotal.tokens)),1),n("div",eg,f($.value),1)])]),n("div",sg,[W[17]||(W[17]=n("div",{class:"metric-icon"},"🔢",-1)),n("div",ng,[W[16]||(W[16]=n("div",{class:"metric-label"},"总请求",-1)),n("div",lg,f(x(T.value.current.windowTotal.requests)),1),n("div",ig,f($.value),1)])])]),n("div",og,[n("div",ag,[n("div",rg,[W[18]||(W[18]=n("h3",null,"TPM 趋势",-1)),n("span",cg,f(X(F.value)),1)]),n("div",ug,[n("div",dg,[(c(!0),d(Y,null,ct(b.value,(tt,kt)=>(c(),d("div",{key:kt,class:"chart-bar clickable",style:St({height:`${K(tt.tpm,R("tpm"))}%`}),title:`${H(tt.timestamp)}: ${x(tt.tpm)} TPM - 点击查看详情`,onClick:It=>P(tt)},[n("span",hg,f(x(tt.tpm)),1),n("span",pg,f(H(tt.timestamp)),1)],12,fg))),128))])])]),n("div",vg,[n("div",gg,[W[19]||(W[19]=n("h3",null,"RPM 趋势",-1)),n("span",mg,f(X(F.value)),1)]),n("div",_g,[n("div",yg,[(c(!0),d(Y,null,ct(b.value,(tt,kt)=>(c(),d("div",{key:kt,class:"chart-bar clickable",style:St({height:`${K(tt.rpm,R("rpm"))}%`}),title:`${H(tt.timestamp)}: ${tt.rpm} RPM - 点击查看调用详情`,onClick:It=>P(tt)},[n("span",$g,f(tt.rpm),1),n("span",kg,f(H(tt.timestamp)),1)],12,bg))),128))])])])]),n("div",wg,[W[23]||(W[23]=n("h3",null,"统计摘要",-1)),n("div",Cg,[n("div",Tg,[W[20]||(W[20]=n("span",{class:"summary-label"},"平均 TPM",-1)),n("span",Sg,f(x(T.value.statistics.avgTpm)),1)]),n("div",xg,[W[21]||(W[21]=n("span",{class:"summary-label"},"峰值 TPM",-1)),n("span",Ag,f(x(T.value.statistics.peakTpm)),1),T.value.statistics.peakTime?(c(),d("span",Ig,"峰值时间: "+f(T.value.statistics.peakTime),1)):M("",!0)]),n("div",Mg,[W[22]||(W[22]=n("span",{class:"summary-label"},"时间窗口",-1)),n("span",Rg,f($.value),1)])])]),o.value?(c(),d("div",{key:0,class:"detail-modal-overlay",onClick:W[4]||(W[4]=le(tt=>o.value=!1,["self"]))},[n("div",Eg,[n("div",Pg,[n("h3",null,f(u.value),1),n("button",{class:"close-btn",onClick:W[0]||(W[0]=tt=>o.value=!1)},"×")]),n("div",Dg,[a.value?(c(),d("div",Fg,"加载详情...")):(lt=(ot=r.value)==null?void 0:ot.calls)!=null&<.length?(c(),d("div",Og,[n("div",Lg,f(S.value.length)+" / "+f(r.value.totalCalls)+" 次调用 · "+f(x(m.value))+" Tokens · 平均 "+f(x(((ft=r.value.summary)==null?void 0:ft.avgTokens)||0))+" Tokens/调用 ",1),n("div",Ng,[Tt(n("input",{"onUpdate:modelValue":W[1]||(W[1]=tt=>v.value=tt),type:"text",class:"search-input",placeholder:"搜索触发内容..."},null,512),[[jn,v.value]]),Tt(n("select",{"onUpdate:modelValue":W[2]||(W[2]=tt=>p.value=tt),class:"agent-filter"},[W[24]||(W[24]=n("option",{value:""},"全部 Agent",-1)),(c(!0),d(Y,null,ct(A.value,tt=>(c(),d("option",{key:tt,value:tt},f(tt),9,jg))),128))],512),[[Pe,p.value]]),Tt(n("select",{"onUpdate:modelValue":W[3]||(W[3]=tt=>C.value=tt),class:"sort-select"},[...W[25]||(W[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(),d("div",Ug,[...W[26]||(W[26]=[n("span",{class:"hint-badge"},"完成回传",-1),n("span",{class:"hint-text"},"此时间戳为子任务完成后的回传时间,不是派发时间",-1)])])):M("",!0),(c(!0),d(Y,null,ct(S.value,(tt,kt)=>{var It,Dt;return c(),d("div",{key:kt,class:"detail-call-item"},[n("div",Vg,[n("span",Wg,f(tt.agentId),1),n("span",Hg,f(tt.time),1),n("span",Bg,f(x(tt.tokens))+" tokens",1)]),n("div",{class:"call-trigger",title:tt.trigger},[(It=tt.trigger)!=null&&It.startsWith("【完成回传】")?(c(),d("span",qg,"完成回传")):M("",!0),At(" "+f((Dt=tt.trigger)==null?void 0:Dt.replace(/^【完成回传】/,"")),1)],8,Kg),tt.model?(c(),d("div",Gg,"模型: "+f(tt.model),1)):M("",!0)])}),128))])):(c(),d("div",zg,"该时段无调用记录"))])])])):M("",!0),i.value.length>0?(c(),d("div",Jg,[W[27]||(W[27]=n("h3",null,"⚠️ 性能告警",-1)),n("div",Qg,[(c(!0),d(Y,null,ct(i.value,tt=>(c(),d("div",{key:tt.id,class:nt(["alert-item",tt.type])},[n("span",Yg,f(tt.message),1),n("span",Xg,f(x(tt.value))+" (阈值: "+f(x(tt.threshold))+")",1),n("span",Zg,f(H(tt.timestamp)),1),n("button",{class:"ack-btn",onClick:kt=>G(tt.id)},"确认",8,tm)],2))),128))])])):M("",!0)],64))])}}}),sm=Ct(em,[["__scopeId","data-v-6508c9b4"]]),nm={class:"token-analysis"},lm={class:"section-header"},im={class:"time-range-selector"},om=["onClick"],am={key:0,class:"loading-state"},rm={key:1,class:"error-state"},cm={class:"summary-cards"},um={class:"summary-card"},dm={class:"card-content"},fm={class:"card-value"},hm={class:"summary-card"},pm={class:"card-content"},vm={class:"card-value"},gm={class:"summary-card highlight"},mm={class:"card-content"},_m={class:"card-value"},ym={class:"card-sub"},bm={class:"summary-card"},$m={class:"card-content"},km={class:"card-value"},wm={class:"summary-card cost"},Cm={class:"card-content"},Tm={class:"card-value"},Sm={key:0,class:"card-sub saved"},xm={key:0,class:"trend-section"},Am={class:"trend-chart"},Im={class:"trend-bars"},Mm={key:0,class:"bar-tooltip"},Rm={key:0,class:"bar-tooltip"},Em={class:"trend-time"},Pm={class:"view-toggle"},Dm={key:1,class:"by-agent-table"},Fm={class:"agent-name"},Om={class:"total-col"},Lm={class:"percent-bar"},Nm={class:"percent-text"},jm={class:"total-col"},Um={key:2,class:"by-agent-chart"},Vm={class:"bar-chart"},Wm={class:"bar-label"},Hm={class:"bar-container"},Bm={class:"bar-value"},Km={class:"bar-percent"},qm=wt({__name:"TokenAnalysisPanel",setup(t){const e=V({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=V(!1),l=V(""),i=V("table"),o=V("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),u=Q(()=>{if(!e.value.trend)return 1;const D=[...e.value.trend.input,...e.value.trend.output];return Math.max(...D,1)}),v=Q(()=>[...e.value.byAgent||[]].sort((D,$)=>$.total-D.total));function p(D,$){return Math.max(D/$*100,2)}function C(D){const $=new Date(D);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 A(D){return D==null?"0":D>=1e6?(D/1e6).toFixed(2)+"M":D>=1e3?(D/1e3).toFixed(1)+"K":D.toLocaleString()}function S(D){return D==null?"0%":(D*100).toFixed(1)+"%"}function m(D){return D==null?"0.00":D>=1?D.toFixed(2):D.toFixed(4)}async function T(){s.value=!0,l.value="";try{const D=await fetch(`/api/tokens/analysis?range=${o.value}`);D.ok?e.value=await D.json():l.value="加载失败"}catch(D){l.value=String(D)}finally{s.value=!1}}return Nt(T),Bt(o,T),(D,$)=>{var k,b,R,K,x,F,X,H,q,G,I,st,mt;return c(),d("section",nm,[n("div",lm,[$[2]||($[2]=n("h2",null,"Token 分析",-1)),n("div",im,[(c(),d(Y,null,ct(a,P=>n("button",{key:P.value,class:nt(["range-btn",{active:o.value===P.value}]),onClick:L=>o.value=P.value},f(P.label),11,om)),64))])]),s.value?(c(),d("div",am,[...$[3]||($[3]=[n("div",{class:"spinner"},null,-1),n("span",null,"加载 Token 数据...",-1)])])):l.value?(c(),d("div",rm,[$[4]||($[4]=n("span",{class:"error-icon"},"⚠️",-1)),n("span",null,f(l.value),1),n("button",{onClick:T,class:"retry-btn"},"重试")])):(c(),d(Y,{key:2},[n("div",cm,[n("div",um,[$[6]||($[6]=n("div",{class:"card-icon"},"📥",-1)),n("div",dm,[$[5]||($[5]=n("div",{class:"card-label"},"Input",-1)),n("div",fm,f(A((k=e.value.summary)==null?void 0:k.input)),1)])]),n("div",hm,[$[8]||($[8]=n("div",{class:"card-icon"},"📤",-1)),n("div",pm,[$[7]||($[7]=n("div",{class:"card-label"},"Output",-1)),n("div",vm,f(A((b=e.value.summary)==null?void 0:b.output)),1)])]),n("div",gm,[$[10]||($[10]=n("div",{class:"card-icon"},"💾",-1)),n("div",mm,[$[9]||($[9]=n("div",{class:"card-label"},"Cache Read",-1)),n("div",_m,f(A((R=e.value.summary)==null?void 0:R.cacheRead)),1),n("div",ym,"命中率 "+f(S((K=e.value.summary)==null?void 0:K.cacheHitRate)),1)])]),n("div",bm,[$[12]||($[12]=n("div",{class:"card-icon"},"📝",-1)),n("div",$m,[$[11]||($[11]=n("div",{class:"card-label"},"Cache Write",-1)),n("div",km,f(A((x=e.value.summary)==null?void 0:x.cacheWrite)),1)])]),n("div",wm,[$[14]||($[14]=n("div",{class:"card-icon"},"💰",-1)),n("div",Cm,[$[13]||($[13]=n("div",{class:"card-label"},"估算成本",-1)),n("div",Tm,"$"+f(m((F=e.value.cost)==null?void 0:F.total)),1),((X=e.value.cost)==null?void 0:X.saved)>0?(c(),d("div",Sm,"节省 $"+f(m((H=e.value.cost)==null?void 0:H.saved)),1)):M("",!0)])])]),e.value.trend&&r.value?(c(),d("div",xm,[$[16]||($[16]=n("h3",null,"Token 消耗趋势",-1)),n("div",Am,[n("div",Im,[(c(!0),d(Y,null,ct(e.value.trend.timestamps,(P,L)=>(c(),d("div",{key:L,class:"trend-bar-group"},[n("div",{class:"trend-bar input",style:St({height:p(e.value.trend.input[L],u.value)+"%"})},[e.value.trend.input[L]>0?(c(),d("span",Mm,"In: "+f(A(e.value.trend.input[L])),1)):M("",!0)],4),n("div",{class:"trend-bar output",style:St({height:p(e.value.trend.output[L],u.value)+"%"})},[e.value.trend.output[L]>0?(c(),d("span",Rm,"Out: "+f(A(e.value.trend.output[L])),1)):M("",!0)],4),n("span",Em,f(C(P)),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",Pm,[n("button",{class:nt({active:i.value==="table"}),onClick:$[0]||($[0]=P=>i.value="table")},"📊 表格",2),n("button",{class:nt({active:i.value==="chart"}),onClick:$[1]||($[1]=P=>i.value="chart")},"📈 图表",2)]),i.value==="table"?(c(),d("div",Dm,[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),d(Y,null,ct(v.value,P=>(c(),d("tr",{key:P.agent},[n("td",Fm,f(P.agent),1),n("td",null,f(A(P.input)),1),n("td",null,f(A(P.output)),1),n("td",null,f(A(P.cacheRead+P.cacheWrite)),1),n("td",Om,f(A(P.total)),1),n("td",null,[n("div",Lm,[n("div",{class:"percent-fill",style:St({width:P.percent*100+"%"})},null,4),n("span",Nm,f(S(P.percent)),1)])])]))),128))]),n("tfoot",null,[n("tr",null,[$[17]||($[17]=n("td",null,[n("strong",null,"合计")],-1)),n("td",null,f(A((q=e.value.summary)==null?void 0:q.input)),1),n("td",null,f(A((G=e.value.summary)==null?void 0:G.output)),1),n("td",null,f(A((((I=e.value.summary)==null?void 0:I.cacheRead)||0)+(((st=e.value.summary)==null?void 0:st.cacheWrite)||0))),1),n("td",jm,[n("strong",null,f(A((mt=e.value.summary)==null?void 0:mt.total)),1)]),$[18]||($[18]=n("td",null,"100%",-1))])])])])):(c(),d("div",Um,[$[20]||($[20]=n("h3",null,"Token 消耗分布",-1)),n("div",Vm,[(c(!0),d(Y,null,ct(v.value,P=>(c(),d("div",{key:P.agent,class:"bar-row"},[n("div",Wm,f(P.agent),1),n("div",Hm,[n("div",{class:"bar",style:St({width:P.percent*100+"%"})},[n("span",Bm,f(A(P.total)),1)],4)]),n("div",Km,f(S(P.percent)),1)]))),128))])]))],64))])}}}),Gm=Ct(qm,[["__scopeId","data-v-b98a8391"]]),zm={class:"performance-panel"},Jm={class:"panel-header"},Qm={class:"tab-switcher"},Ym={class:"panel-content"},Xm=wt({__name:"PerformancePanel",setup(t){const e=V("tpm");return(s,l)=>(c(),d("div",zm,[n("div",Jm,[l[2]||(l[2]=n("h2",null,"性能监控",-1)),n("div",Qm,[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",Ym,[Tt(bt(sm,null,null,512),[[fs,e.value==="tpm"]]),Tt(bt(Gm,null,null,512),[[fs,e.value==="token"]])])]))}}),Zm=Ct(Xm,[["__scopeId","data-v-7962ace4"]]),t1={class:"error-center"},e1={class:"header"},s1={class:"header-actions"},n1=["value"],l1=["value"],i1={class:"stats-row"},o1={class:"stat-card total"},a1={class:"stat-value"},r1={class:"stat-card session"},c1={class:"stat-value"},u1={class:"stat-card model"},d1={class:"stat-value"},f1={class:"stat-value"},h1={key:0,class:"trend-section"},p1={class:"trend-chart"},v1=["title"],g1={key:0,class:"bar-label"},m1={class:"trend-labels"},_1={key:1,class:"type-distribution"},y1={class:"type-bars"},b1={class:"type-bar-label"},$1={class:"type-bar-track"},k1={class:"type-count"},w1={key:2,class:"api-status-section"},C1={class:"api-status-grid"},T1={class:"api-header"},S1={class:"api-model"},x1={class:"api-provider"},A1={class:"api-status"},I1={class:"status-text"},M1={key:0,class:"api-last-error"},R1={class:"error-type"},E1={class:"error-time"},P1={key:1,class:"api-error-count"},D1={class:"error-lists"},F1={class:"error-group"},O1={class:"count-badge"},L1={key:0,class:"empty"},N1={key:1,class:"error-list"},j1=["onClick"],U1={class:"error-main"},V1={class:"error-agent"},W1={class:"error-msg"},H1={class:"error-time"},B1={class:"expand-icon"},K1={key:0,class:"error-detail"},q1={class:"detail-row"},G1={class:"detail-row"},z1={class:"detail-message"},J1={class:"error-group"},Q1={class:"count-badge"},Y1={key:0,class:"empty"},X1={key:1,class:"error-list"},Z1=["onClick"],t_={class:"error-main"},e_={class:"error-agent"},s_={class:"error-msg"},n_={class:"error-time"},l_={class:"expand-icon"},i_={key:0,class:"error-detail"},o_={class:"detail-row"},a_={class:"detail-row"},r_={class:"detail-message"},c_=wt({__name:"ErrorCenterPanel",setup(t){const e=V([]),s=V([]),l=V([]),i=V({totalCount:0,sessionErrorCount:0,modelFailureCount:0,byType:{},byAgent:{},hourlyTrend:[]}),o=V(!1),a=V(""),r=V(null),u=V(""),v=V(""),p=V([]),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"}},A=Q(()=>l.value.filter(H=>H.status==="healthy").length),S=Q(()=>{var H;return Math.max(...((H=i.value.hourlyTrend)==null?void 0:H.map(q=>q.count))||[1],1)});function m(H){return H/S.value*100}function T(H){const q=i.value.totalCount||1;return H/q*100}function D(H){var q;return((q=C[H])==null?void 0:q.color)||"#6b7280"}function $(H){const q=H.match(/(\d{2}):00/);return q?q[1]+"h":""}function k(H){if(!H)return"-";const G=Date.now()-H,I=Math.floor(G/6e4);if(I<1)return"刚刚";if(I<60)return`${I}分钟前`;const st=Math.floor(I/60);return st<24?`${st}小时前`:`${Math.floor(st/24)}天前`}function b(H,q){return H?H.length>q?H.slice(0,q)+"...":H:"-"}function R(H){return{healthy:"正常",degraded:"降级",down:"异常"}[H]||"未知"}function K(H){const q=p.value.find(G=>G.id===H);return q?q.name:H}function x(H){r.value=r.value===H?null:H}async function F(){try{const H=await fetch("/api/agents");if(H.ok){const q=await H.json();p.value=(Array.isArray(q)?q:[]).map(G=>({id:G.id,name:G.name||G.id}))}}catch(H){console.error("Failed to load agents:",H)}}async function X(){o.value=!0,a.value="";try{const H=new URLSearchParams;u.value&&H.set("agent",u.value),v.value&&H.set("type",v.value);const[q,G]=await Promise.all([fetch(`/api/errors/summary?${H.toString()}`),fetch("/api/errors/stats")]);if(q.ok){const I=await q.json();e.value=I.sessionErrors||[],s.value=I.modelFailures||[],l.value=I.apiStatus||[]}G.ok&&(i.value=await G.json())}catch(H){a.value=String(H)}finally{o.value=!1}}return Nt(()=>{F(),X()}),(H,q)=>{var G;return c(),d("section",t1,[n("div",e1,[q[4]||(q[4]=n("h2",null,"错误中心",-1)),n("div",s1,[Tt(n("select",{"onUpdate:modelValue":q[0]||(q[0]=I=>u.value=I),onChange:X,class:"filter-select"},[q[2]||(q[2]=n("option",{value:""},"全部 Agent",-1)),(c(!0),d(Y,null,ct(p.value,I=>(c(),d("option",{key:I.id,value:I.id},f(I.name),9,n1))),128))],544),[[Pe,u.value]]),Tt(n("select",{"onUpdate:modelValue":q[1]||(q[1]=I=>v.value=I),onChange:X,class:"filter-select"},[q[3]||(q[3]=n("option",{value:""},"全部类型",-1)),(c(),d(Y,null,ct(C,(I,st)=>n("option",{key:st,value:st},f(I.label),9,l1)),64))],544),[[Pe,v.value]]),n("button",{onClick:X,class:"refresh-btn"},"刷新")])]),n("div",i1,[n("div",o1,[n("div",a1,f(i.value.totalCount),1),q[5]||(q[5]=n("div",{class:"stat-label"},"总错误数",-1))]),n("div",r1,[n("div",c1,f(i.value.sessionErrorCount),1),q[6]||(q[6]=n("div",{class:"stat-label"},"Session 错误",-1))]),n("div",u1,[n("div",d1,f(i.value.modelFailureCount),1),q[7]||(q[7]=n("div",{class:"stat-label"},"Model 错误",-1))]),n("div",{class:nt(["stat-card",A.value===l.value.length?"healthy":"warning"])},[n("div",f1,f(A.value)+"/"+f(l.value.length),1),q[8]||(q[8]=n("div",{class:"stat-label"},"API 健康",-1))],2)]),(G=i.value.hourlyTrend)!=null&&G.length?(c(),d("div",h1,[q[9]||(q[9]=n("h3",null,"24 小时错误趋势",-1)),n("div",p1,[(c(!0),d(Y,null,ct(i.value.hourlyTrend,(I,st)=>(c(),d("div",{key:st,class:"trend-bar",style:St({height:m(I.count)+"%"}),title:`${I.hour}: ${I.count} 个错误`},[I.count>0?(c(),d("span",g1,f(I.count),1)):M("",!0)],12,v1))),128))]),n("div",m1,[(c(!0),d(Y,null,ct(i.value.hourlyTrend,(I,st)=>(c(),d("span",{key:st,class:"trend-time"},f(st%4===0?$(I.hour):""),1))),128))])])):M("",!0),Object.keys(i.value.byType||{}).length?(c(),d("div",_1,[q[10]||(q[10]=n("h3",null,"错误类型分布",-1)),n("div",y1,[(c(!0),d(Y,null,ct(i.value.byType,(I,st)=>(c(),d("div",{key:st,class:"type-bar-item"},[n("div",b1,[n("span",{class:"type-dot",style:St({background:I.color})},null,4),At(" "+f(I.label),1)]),n("div",$1,[n("div",{class:"type-bar-fill",style:St({width:T(I.count)+"%",background:I.color})},null,4)]),n("span",k1,f(I.count),1)]))),128))])])):M("",!0),l.value.length?(c(),d("div",w1,[q[11]||(q[11]=n("h3",null,"API 状态",-1)),n("div",C1,[(c(!0),d(Y,null,ct(l.value,I=>(c(),d("div",{key:I.model,class:nt(["api-status-card",`status-${I.status}`])},[n("div",T1,[n("span",S1,f(I.model),1),n("span",x1,f(I.provider),1)]),n("div",A1,[n("span",{class:nt(["status-dot",`status-${I.status}`])},null,2),n("span",I1,f(R(I.status)),1)]),I.lastError?(c(),d("div",M1,[n("span",R1,f(I.lastError.type),1),n("span",E1,f(k(I.lastError.timestamp)),1)])):M("",!0),I.errorCount>0?(c(),d("div",P1," 错误: "+f(I.errorCount)+" 次 ",1)):M("",!0)],2))),128))])])):M("",!0),n("div",D1,[n("div",F1,[n("h3",null,[q[12]||(q[12]=At("Session 错误 ",-1)),n("span",O1,f(e.value.length),1)]),e.value.length?(c(),d("div",N1,[(c(!0),d(Y,null,ct(e.value,I=>(c(),d("div",{key:I.id,class:nt(["error-item",`severity-${I.severity}`]),onClick:st=>x(I.id)},[n("div",U1,[n("span",V1,f(K(I.agentId)),1),n("span",{class:"error-type",style:St({color:D(I.type)})},f(I.typeLabel),5),n("span",W1,f(b(I.message,80)),1),n("span",H1,f(k(I.timestamp)),1),n("span",B1,f(r.value===I.id?"▼":"▶"),1)]),r.value===I.id?(c(),d("div",K1,[n("div",q1,[q[13]||(q[13]=n("span",{class:"detail-label"},"时间:",-1)),n("span",null,f(I.datetime),1)]),n("div",G1,[q[14]||(q[14]=n("span",{class:"detail-label"},"完整信息:",-1)),n("span",z1,f(I.fullMessage||I.message),1)])])):M("",!0)],10,j1))),128))])):(c(),d("div",L1,"暂无错误"))]),n("div",J1,[n("h3",null,[q[15]||(q[15]=At("Model Failures ",-1)),n("span",Q1,f(s.value.length),1)]),s.value.length?(c(),d("div",X1,[(c(!0),d(Y,null,ct(s.value,I=>(c(),d("div",{key:I.id,class:nt(["error-item",`severity-${I.severity}`]),onClick:st=>x(I.id)},[n("div",t_,[n("span",e_,f(I.model),1),n("span",{class:"error-type",style:St({color:D(I.type)})},f(I.typeLabel),5),n("span",s_,f(b(I.message,80)),1),n("span",n_,f(k(I.timestamp)),1),n("span",l_,f(r.value===I.id?"▼":"▶"),1)]),r.value===I.id?(c(),d("div",i_,[n("div",o_,[q[16]||(q[16]=n("span",{class:"detail-label"},"时间:",-1)),n("span",null,f(I.datetime),1)]),n("div",a_,[q[17]||(q[17]=n("span",{class:"detail-label"},"完整信息:",-1)),n("span",r_,f(I.fullMessage||I.message),1)])])):M("",!0)],10,Z1))),128))])):(c(),d("div",Y1,"暂无错误"))])])])}}}),u_=Ct(c_,[["__scopeId","data-v-ca874c41"]]),d_={class:"version-display"},f_={key:0,class:"loading-text"},h_={key:1,class:"error-text"},p_={key:0,class:"tooltip"},v_={class:"tooltip-item"},g_={class:"tooltip-item"},m_={class:"tooltip-item"},__={key:0,class:"tooltip-item"},y_={key:1,class:"tooltip-item"},b_=wt({__name:"VersionDisplay",setup(t){const e=V(!0),s=V(!1),l=V({version:"",name:"",description:""}),i=V(!1),o=Q(()=>l.value.name&&l.value.version?`${l.value.name} v${l.value.version}`:l.value.version||"v?"),a=u=>{try{return new Date(u).toLocaleString("zh-CN")}catch{return u}},r=async()=>{try{e.value=!0,s.value=!1;const u=`${window.location.origin}/api/version`,v=await fetch(u,{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(u){console.error("获取版本信息失败:",u),s.value=!0}finally{e.value=!1}};return Nt(()=>{r()}),(u,v)=>(c(),d("div",d_,[e.value?(c(),d("span",f_,"加载中...")):s.value?(c(),d("span",h_,"版本信息获取失败")):(c(),d(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(),d("div",p_,[n("div",v_,[v[2]||(v[2]=n("strong",null,"名称:",-1)),At(" "+f(l.value.name),1)]),n("div",g_,[v[3]||(v[3]=n("strong",null,"版本:",-1)),At(" "+f(l.value.version),1)]),n("div",m_,[v[4]||(v[4]=n("strong",null,"描述:",-1)),At(" "+f(l.value.description),1)]),l.value.build_date?(c(),d("div",__,[v[5]||(v[5]=n("strong",null,"构建时间:",-1)),At(" "+f(a(l.value.build_date)),1)])):M("",!0),l.value.git_commit?(c(),d("div",y_,[v[6]||(v[6]=n("strong",null,"Git 提交:",-1)),At(" "+f(l.value.git_commit),1)])):M("",!0)])):M("",!0)],64))]))}}),$_=Ct(b_,[["__scopeId","data-v-87a575a1"]]),k_={id:"app"},w_={class:"controls"},C_={class:"collaboration-section"},T_={class:"task-status-section"},S_={class:"performance-section"},x_={class:"error-center-section"},A_=wt({__name:"App",setup(t){const e=Fi(),s=Qf(),l=Xf();ks("realtimeManager",e),ks("stateManager",s),ks("eventDispatcher",l);const i=V([]),o=V(null),a=V(!1),r=V({status:"disconnected",reconnectAttempts:0}),u=Q(()=>{switch(r.value.status){case"connected":return"已连接";case"connecting":return"连接中...";case"disconnected":return"未连接";case"error":return"连接错误";default:return"未知"}}),v=V(null),p=V("main"),C=V([]);async function A(){try{const[R,K]=await Promise.all([fetch("/api/agents"),fetch("/api/config").catch(()=>null)]),x=await R.json();if(i.value=Array.isArray(x)?x:[],K!=null&&K.ok){const H=await K.json();p.value=H&&H.mainAgentId||"main"}const F=Array.isArray(i.value)?i.value:[],X=F.find(H=>H.id===p.value);X&&(v.value=X),C.value=F.filter(H=>H.id!==p.value)}catch(R){console.error("刷新数据失败:",R)}}function S(R){o.value=R}function m(R){const K=R.id===p.value?v.value:C.value.find(x=>x.id===R.id);S(K||{id:R.id,name:R.name,role:R.id===p.value?"主 Agent":"子 Agent",status:R.status==="error"?"down":R.status})}function T(R){A()}function D(R){r.value=R}let $=null,k=null,b=null;return Nt(()=>{A(),e.connect(),$=e.onStateChange(D),k=e.subscribe("agents",R=>{if(Array.isArray(R)){i.value=R;const K=R.find(x=>x.id===p.value);v.value=K||null,C.value=R.filter(x=>x.id!==p.value)}}),b=e.subscribe("agents_update",R=>{if(Array.isArray(R)){R.forEach(x=>{const F=i.value.findIndex(X=>X.id===x.id);F>=0&&(i.value[F]={...i.value[F],...x})});const K=i.value.find(x=>x.id===p.value);K&&(v.value=K),C.value=i.value.filter(x=>x.id!==p.value)}})}),ae(()=>{$==null||$(),k==null||k(),b==null||b(),e.disconnect()}),(R,K)=>(c(),d("div",k_,[n("header",null,[K[3]||(K[3]=n("h1",null,"OpenClaw Agent Dashboard",-1)),n("div",w_,[bt($_),n("button",{onClick:A},"刷新"),n("button",{onClick:K[0]||(K[0]=x=>a.value=!0)},"⚙️ 设置"),n("span",{class:nt(["connection-status",r.value.status])},f(u.value),3)])]),n("main",null,[n("section",C_,[bt(jp,{"main-agent":v.value,"sub-agents":C.value,"main-agent-id":p.value,onAgentClick:m},null,8,["main-agent","sub-agents","main-agent-id"])]),n("section",T_,[bt(Lv)]),n("section",S_,[bt(Zm)]),n("section",x_,[bt(u_)])]),a.value?(c(),Gt(qf,{key:0,onClose:K[1]||(K[1]=x=>a.value=!1),onSettingsChanged:T})):M("",!0),o.value?(c(),Gt(Pf,{key:1,agent:o.value,onClose:K[2]||(K[2]=x=>o.value=null)},null,8,["agent"])):M("",!0)]))}}),I_=Ct(A_,[["__scopeId","data-v-543ef282"]]);er(I_).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-4ac4b073]{background:#fff;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden}.timeline-header[data-v-4ac4b073]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#f9fafb;border-bottom:1px solid #e5e7eb}.header-left[data-v-4ac4b073]{display:flex;align-items:center;gap:12px}.title[data-v-4ac4b073]{font-weight:600;font-size:14px;color:#374151}.agent-info[data-v-4ac4b073]{font-size:13px;color:#6b7280}.agent-info .model[data-v-4ac4b073]{color:#9ca3af}.header-right[data-v-4ac4b073]{display:flex;align-items:center;gap:12px}.status-badge[data-v-4ac4b073]{font-size:12px;padding:4px 8px;border-radius:4px}.status-badge.status-running[data-v-4ac4b073]{background:#fef3c7;color:#92400e}.status-badge.status-completed[data-v-4ac4b073]{background:#d1fae5;color:#065f46}.status-badge.status-error[data-v-4ac4b073]{background:#fee2e2;color:#991b1b}.status-badge.status-no_sessions[data-v-4ac4b073]{background:#f3f4f6;color:#6b7280}.refresh-btn[data-v-4ac4b073]{font-size:12px;padding:4px 10px;border:1px solid #e5e7eb;border-radius:4px;background:#fff;cursor:pointer;color:#374151}.refresh-btn[data-v-4ac4b073]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-4ac4b073]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-4ac4b073],.empty-state[data-v-4ac4b073]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:#6b7280;gap:12px}.spinner[data-v-4ac4b073]{width:24px;height:24px;border:3px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-4ac4b073 1s linear infinite}@keyframes spin-4ac4b073{to{transform:rotate(360deg)}}.empty-icon[data-v-4ac4b073]{font-size:32px}.empty-message[data-v-4ac4b073]{font-size:14px;color:#374151;font-weight:500}.empty-hint[data-v-4ac4b073]{margin-top:8px;font-size:12px;color:#9ca3af;text-align:center;max-width:280px;line-height:1.5}.timeline-content[data-v-4ac4b073]{padding:16px}.timeline-legend[data-v-4ac4b073]{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-4ac4b073]{display:inline-flex;align-items:center;gap:4px}.legend-icon[data-v-4ac4b073]{font-size:12px}.session-info[data-v-4ac4b073]{display:flex;gap:16px;font-size:12px;color:#9ca3af;margin-bottom:16px;padding-bottom:12px;border-bottom:1px dashed #e5e7eb}.steps-list[data-v-4ac4b073]{display:flex;flex-direction:column}.tool-execution-label[data-v-4ac4b073]{display:flex;align-items:center;gap:12px;margin:12px 0;padding:0 4px}.tool-execution-label .label-line[data-v-4ac4b073]{flex:1;height:1px;background:#e5e7eb}.tool-execution-label .label-text[data-v-4ac4b073]{font-size:11px;color:#9ca3af;white-space:nowrap}.timeline-footer[data-v-4ac4b073]{margin-top:16px;padding-top:16px;border-top:1px solid #e5e7eb}.stats-grid[data-v-4ac4b073]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-item[data-v-4ac4b073]{display:flex;flex-direction:column;align-items:center;padding:8px;background:#f9fafb;border-radius:6px}.stat-label[data-v-4ac4b073]{font-size:11px;color:#9ca3af;margin-bottom:4px}.stat-value[data-v-4ac4b073]{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-1a91db2f]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;padding:1.5rem}.section-header[data-v-1a91db2f]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;flex-wrap:wrap;gap:.5rem}.section-header .header-right[data-v-1a91db2f]{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.section-header h2[data-v-1a91db2f]{margin:0;font-size:1.3rem;color:#333}.connection-indicator[data-v-1a91db2f]{display:flex;align-items:center;gap:.4rem;font-size:.8rem;padding:.25rem .6rem;border-radius:12px;background:#f1f5f9}.connection-indicator.connected[data-v-1a91db2f]{background:#dcfce7;color:#166534}.connection-indicator.connecting[data-v-1a91db2f]{background:#fef3c7;color:#92400e}.connection-indicator.disconnected[data-v-1a91db2f],.connection-indicator.error[data-v-1a91db2f]{background:#fee2e2;color:#991b1b}.indicator-dot[data-v-1a91db2f]{width:6px;height:6px;border-radius:50%;background:currentColor}.connection-indicator.connecting .indicator-dot[data-v-1a91db2f]{animation:pulse-1a91db2f 1.5s ease-in-out infinite}@keyframes pulse-1a91db2f{0%,to{opacity:1}50%{opacity:.5}}.flow-container[data-v-1a91db2f]{border:1px solid #e5e7eb;border-radius:6px;background:#fafbfc;min-height:480px;position:relative;overflow:auto}.loading-state[data-v-1a91db2f],.error-state[data-v-1a91db2f],.empty-state[data-v-1a91db2f]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:280px;gap:.75rem;color:#6b7280}.spinner[data-v-1a91db2f]{width:28px;height:28px;border:3px solid #e5e7eb;border-top-color:#4a9eff;border-radius:50%;animation:spin-1a91db2f .8s linear infinite}@keyframes spin-1a91db2f{to{transform:rotate(360deg)}}.retry-btn[data-v-1a91db2f]{padding:.4rem .8rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:.85rem}.flow-layout[data-v-1a91db2f]{display:flex;min-height:460px}.agent-area[data-v-1a91db2f]{flex:1;position:relative;padding:1rem 1rem 2rem .5rem;min-width:300px}.level-section[data-v-1a91db2f]{margin-bottom:1.5rem;position:relative;z-index:1}.level-section[data-v-1a91db2f]:first-child{margin-bottom:2.5rem;z-index:2}.level-header[data-v-1a91db2f]{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem;padding-left:.5rem}.level-badge[data-v-1a91db2f]{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-1a91db2f]{font-size:.75rem;color:#64748b;font-weight:500}.level-cards[data-v-1a91db2f]{display:flex;flex-wrap:wrap;gap:16px;justify-content:center;padding:.5rem}.level-section:first-child .level-cards[data-v-1a91db2f]{min-height:auto;padding-bottom:1rem}.level-section:not(:first-child) .level-cards[data-v-1a91db2f]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px;max-width:900px;margin:0 auto}.agent-card-wrapper[data-v-1a91db2f]{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-1a91db2f]{width:320px;max-width:100%}.agent-card-wrapper[data-v-1a91db2f]:hover{transform:translateY(-2px)}.agent-card-wrapper.active[data-v-1a91db2f]{box-shadow:0 0 0 3px #4a9eff40}.agent-card-wrapper[data-v-1a91db2f]: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-1a91db2f]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:5}.edge-path[data-v-1a91db2f]{fill:none;stroke:#4a9eff;stroke-width:2}.edge-path.active[data-v-1a91db2f]{stroke-width:2.5;stroke-dasharray:6 4;animation:flowAnim-1a91db2f 1s linear infinite}@keyframes flowAnim-1a91db2f{to{stroke-dashoffset:-10}}.model-panel[data-v-1a91db2f]{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-1a91db2f]{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-1a91db2f]{font-size:.7rem;font-weight:600;color:#475569}.model-toggle-icon[data-v-1a91db2f]{font-size:.6rem;color:#94a3b8}.model-panel-body[data-v-1a91db2f]{flex:1;padding:.4rem;overflow-y:auto}.model-card[data-v-1a91db2f]{background:#fff;border:1px solid #e2e8f0;border-radius:5px;padding:.4rem .5rem;margin-bottom:.4rem}.model-card.active[data-v-1a91db2f]{border-color:#f97316}.model-name[data-v-1a91db2f]{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-1a91db2f]{display:flex;flex-wrap:wrap;gap:2px;margin-bottom:.2rem}.model-dot[data-v-1a91db2f]{width:5px;height:5px;border-radius:50%;cursor:pointer}.model-dot[data-v-1a91db2f]:hover{transform:scale(1.3)}.model-count[data-v-1a91db2f]{font-size:.55rem;color:#94a3b8}.flow-legend.flow-legend-inline[data-v-1a91db2f]{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-1a91db2f]{display:flex;align-items:center;gap:.35rem;padding:2px 6px;border-radius:4px;background:#f8fafc}.legend-dot[data-v-1a91db2f]{width:10px;height:10px;border-radius:3px}.legend-name[data-v-1a91db2f]{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.call-detail-overlay[data-v-1a91db2f]{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-1a91db2f]{background:#fff;border-radius:10px;box-shadow:0 8px 32px #0003;min-width:300px;max-width:90%}.call-detail-header[data-v-1a91db2f]{display:flex;justify-content:space-between;align-items:center;padding:.6rem .9rem;border-bottom:1px solid #e5e7eb}.call-detail-header h3[data-v-1a91db2f]{margin:0;font-size:.9rem}.close-btn[data-v-1a91db2f]{background:none;border:none;font-size:1.2rem;cursor:pointer;color:#6b7280;line-height:1}.call-detail-body[data-v-1a91db2f]{padding:.6rem .9rem}.call-detail-row[data-v-1a91db2f]{display:flex;gap:.6rem;margin-bottom:.4rem}.call-detail-row .label[data-v-1a91db2f]{color:#6b7280;min-width:45px;font-size:.8rem}.call-detail-row .value[data-v-1a91db2f]{color:#333;font-size:.8rem;word-break:break-word}.call-detail-row.trigger .value[data-v-1a91db2f]{font-size:.75rem}@media (max-width: 1280px){.level-section:first-child .agent-card-wrapper.main-agent[data-v-1a91db2f]{width:280px}.level-section:not(:first-child) .level-cards[data-v-1a91db2f]{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.model-panel[data-v-1a91db2f]{width:130px}}@media (max-width: 1024px){.flow-layout[data-v-1a91db2f]{flex-direction:column}.model-panel[data-v-1a91db2f]{width:100%;border-left:none;border-top:1px solid #e5e7eb;max-height:200px}.model-panel-body[data-v-1a91db2f]{display:flex;flex-wrap:wrap;gap:.5rem}.model-card[data-v-1a91db2f]{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-4ac4b073]{background:#fff;border-radius:8px;border:1px solid #e5e7eb;overflow:hidden}.timeline-header[data-v-4ac4b073]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#f9fafb;border-bottom:1px solid #e5e7eb}.header-left[data-v-4ac4b073]{display:flex;align-items:center;gap:12px}.title[data-v-4ac4b073]{font-weight:600;font-size:14px;color:#374151}.agent-info[data-v-4ac4b073]{font-size:13px;color:#6b7280}.agent-info .model[data-v-4ac4b073]{color:#9ca3af}.header-right[data-v-4ac4b073]{display:flex;align-items:center;gap:12px}.status-badge[data-v-4ac4b073]{font-size:12px;padding:4px 8px;border-radius:4px}.status-badge.status-running[data-v-4ac4b073]{background:#fef3c7;color:#92400e}.status-badge.status-completed[data-v-4ac4b073]{background:#d1fae5;color:#065f46}.status-badge.status-error[data-v-4ac4b073]{background:#fee2e2;color:#991b1b}.status-badge.status-no_sessions[data-v-4ac4b073]{background:#f3f4f6;color:#6b7280}.refresh-btn[data-v-4ac4b073]{font-size:12px;padding:4px 10px;border:1px solid #e5e7eb;border-radius:4px;background:#fff;cursor:pointer;color:#374151}.refresh-btn[data-v-4ac4b073]:hover:not(:disabled){background:#f3f4f6}.refresh-btn[data-v-4ac4b073]:disabled{opacity:.5;cursor:not-allowed}.loading-state[data-v-4ac4b073],.empty-state[data-v-4ac4b073]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:#6b7280;gap:12px}.spinner[data-v-4ac4b073]{width:24px;height:24px;border:3px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:spin-4ac4b073 1s linear infinite}@keyframes spin-4ac4b073{to{transform:rotate(360deg)}}.empty-icon[data-v-4ac4b073]{font-size:32px}.empty-message[data-v-4ac4b073]{font-size:14px;color:#374151;font-weight:500}.empty-hint[data-v-4ac4b073]{margin-top:8px;font-size:12px;color:#9ca3af;text-align:center;max-width:280px;line-height:1.5}.timeline-content[data-v-4ac4b073]{padding:16px}.timeline-legend[data-v-4ac4b073]{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-4ac4b073]{display:inline-flex;align-items:center;gap:4px}.legend-icon[data-v-4ac4b073]{font-size:12px}.session-info[data-v-4ac4b073]{display:flex;gap:16px;font-size:12px;color:#9ca3af;margin-bottom:16px;padding-bottom:12px;border-bottom:1px dashed #e5e7eb}.steps-list[data-v-4ac4b073]{display:flex;flex-direction:column}.tool-execution-label[data-v-4ac4b073]{display:flex;align-items:center;gap:12px;margin:12px 0;padding:0 4px}.tool-execution-label .label-line[data-v-4ac4b073]{flex:1;height:1px;background:#e5e7eb}.tool-execution-label .label-text[data-v-4ac4b073]{font-size:11px;color:#9ca3af;white-space:nowrap}.timeline-footer[data-v-4ac4b073]{margin-top:16px;padding-top:16px;border-top:1px solid #e5e7eb}.stats-grid[data-v-4ac4b073]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-item[data-v-4ac4b073]{display:flex;flex-direction:column;align-items:center;padding:8px;background:#f9fafb;border-radius:6px}.stat-label[data-v-4ac4b073]{font-size:11px;color:#9ca3af;margin-bottom:4px}.stat-value[data-v-4ac4b073]{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-4b9cd3f2]{background:#fff;border-radius:8px;box-shadow:0 2px 8px #0000001a;padding:1.5rem}.section-header[data-v-4b9cd3f2]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;flex-wrap:wrap;gap:.5rem}.section-header .header-right[data-v-4b9cd3f2]{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.section-header h2[data-v-4b9cd3f2]{margin:0;font-size:1.3rem;color:#333}.connection-indicator[data-v-4b9cd3f2]{display:flex;align-items:center;gap:.4rem;font-size:.8rem;padding:.25rem .6rem;border-radius:12px;background:#f1f5f9}.connection-indicator.connected[data-v-4b9cd3f2]{background:#dcfce7;color:#166534}.connection-indicator.connecting[data-v-4b9cd3f2]{background:#fef3c7;color:#92400e}.connection-indicator.disconnected[data-v-4b9cd3f2],.connection-indicator.error[data-v-4b9cd3f2]{background:#fee2e2;color:#991b1b}.indicator-dot[data-v-4b9cd3f2]{width:6px;height:6px;border-radius:50%;background:currentColor}.connection-indicator.connecting .indicator-dot[data-v-4b9cd3f2]{animation:pulse-4b9cd3f2 1.5s ease-in-out infinite}@keyframes pulse-4b9cd3f2{0%,to{opacity:1}50%{opacity:.5}}.flow-container[data-v-4b9cd3f2]{border:1px solid #e5e7eb;border-radius:6px;background:#fafbfc;min-height:480px;position:relative;overflow:auto}.loading-state[data-v-4b9cd3f2],.error-state[data-v-4b9cd3f2],.empty-state[data-v-4b9cd3f2]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:280px;gap:.75rem;color:#6b7280}.spinner[data-v-4b9cd3f2]{width:28px;height:28px;border:3px solid #e5e7eb;border-top-color:#4a9eff;border-radius:50%;animation:spin-4b9cd3f2 .8s linear infinite}@keyframes spin-4b9cd3f2{to{transform:rotate(360deg)}}.retry-btn[data-v-4b9cd3f2]{padding:.4rem .8rem;background:#4a9eff;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:.85rem}.flow-layout[data-v-4b9cd3f2]{display:flex;min-height:460px}.agent-area[data-v-4b9cd3f2]{flex:1;position:relative;padding:1rem 1rem 2rem .5rem;min-width:300px}.level-section[data-v-4b9cd3f2]{margin-bottom:1.5rem;position:relative;z-index:1}.level-section[data-v-4b9cd3f2]:first-child{margin-bottom:2.5rem;z-index:2}.level-header[data-v-4b9cd3f2]{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem;padding-left:.5rem}.level-badge[data-v-4b9cd3f2]{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-4b9cd3f2]{font-size:.75rem;color:#64748b;font-weight:500}.level-cards[data-v-4b9cd3f2]{display:flex;flex-wrap:wrap;gap:16px;justify-content:center;padding:.5rem}.level-section:first-child .level-cards[data-v-4b9cd3f2]{min-height:auto;padding-bottom:1rem}.level-section:not(:first-child) .level-cards[data-v-4b9cd3f2]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px;max-width:900px;margin:0 auto}.agent-card-wrapper[data-v-4b9cd3f2]{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-4b9cd3f2]{width:320px;max-width:100%}.agent-card-wrapper[data-v-4b9cd3f2]:hover{transform:translateY(-2px)}.agent-card-wrapper.active[data-v-4b9cd3f2]{box-shadow:0 0 0 3px #4a9eff40}.agent-card-wrapper[data-v-4b9cd3f2]: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-4b9cd3f2]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:5}.edge-path[data-v-4b9cd3f2]{fill:none;stroke:#4a9eff;stroke-width:2}.edge-path.active[data-v-4b9cd3f2]{stroke-width:2.5;stroke-dasharray:6 4;animation:flowAnim-4b9cd3f2 1s linear infinite}@keyframes flowAnim-4b9cd3f2{to{stroke-dashoffset:-10}}.model-panel[data-v-4b9cd3f2]{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-4b9cd3f2]{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-4b9cd3f2]{font-size:.7rem;font-weight:600;color:#475569}.model-toggle-icon[data-v-4b9cd3f2]{font-size:.6rem;color:#94a3b8}.model-panel-body[data-v-4b9cd3f2]{flex:1;padding:.4rem;overflow-y:auto}.model-card[data-v-4b9cd3f2]{background:#fff;border:1px solid #e2e8f0;border-radius:5px;padding:.4rem .5rem;margin-bottom:.4rem}.model-card.active[data-v-4b9cd3f2]{border-color:#f97316}.model-name[data-v-4b9cd3f2]{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-4b9cd3f2]{display:flex;flex-wrap:wrap;gap:2px;margin-bottom:.2rem}.model-dot[data-v-4b9cd3f2]{width:5px;height:5px;border-radius:50%;cursor:pointer}.model-dot[data-v-4b9cd3f2]:hover{transform:scale(1.3)}.model-count[data-v-4b9cd3f2]{font-size:.55rem;color:#94a3b8}.flow-legend.flow-legend-inline[data-v-4b9cd3f2]{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-4b9cd3f2]{display:flex;align-items:center;gap:.35rem;padding:2px 6px;border-radius:4px;background:#f8fafc}.legend-dot[data-v-4b9cd3f2]{width:10px;height:10px;border-radius:3px}.legend-name[data-v-4b9cd3f2]{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.call-detail-overlay[data-v-4b9cd3f2]{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-4b9cd3f2]{background:#fff;border-radius:10px;box-shadow:0 8px 32px #0003;min-width:300px;max-width:90%}.call-detail-header[data-v-4b9cd3f2]{display:flex;justify-content:space-between;align-items:center;padding:.6rem .9rem;border-bottom:1px solid #e5e7eb}.call-detail-header h3[data-v-4b9cd3f2]{margin:0;font-size:.9rem}.close-btn[data-v-4b9cd3f2]{background:none;border:none;font-size:1.2rem;cursor:pointer;color:#6b7280;line-height:1}.call-detail-body[data-v-4b9cd3f2]{padding:.6rem .9rem}.call-detail-row[data-v-4b9cd3f2]{display:flex;gap:.6rem;margin-bottom:.4rem}.call-detail-row .label[data-v-4b9cd3f2]{color:#6b7280;min-width:45px;font-size:.8rem}.call-detail-row .value[data-v-4b9cd3f2]{color:#333;font-size:.8rem;word-break:break-word}.call-detail-row.trigger .value[data-v-4b9cd3f2]{font-size:.75rem}@media (max-width: 1280px){.level-section:first-child .agent-card-wrapper.main-agent[data-v-4b9cd3f2]{width:280px}.level-section:not(:first-child) .level-cards[data-v-4b9cd3f2]{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.model-panel[data-v-4b9cd3f2]{width:130px}}@media (max-width: 1024px){.flow-layout[data-v-4b9cd3f2]{flex-direction:column}.model-panel[data-v-4b9cd3f2]{width:100%;border-left:none;border-top:1px solid #e5e7eb;max-height:200px}.model-panel-body[data-v-4b9cd3f2]{display:flex;flex-wrap:wrap;gap:.5rem}.model-card[data-v-4b9cd3f2]{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-xwKb2VFi.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-zZLJo64M.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="app"></div>
|
package/openclaw.plugin.json
CHANGED