-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathweb_module.js
More file actions
1 lines (1 loc) · 20.7 KB
/
Copy pathweb_module.js
File metadata and controls
1 lines (1 loc) · 20.7 KB
1
import{useCallback as Y,useEffect as C,useRef as S,useState as l}from"react";import{createRoot as ie}from"react-dom/client";import{Fragment as ae,jsx as t,jsxs as n}from"react/jsx-runtime";var J=null;async function h(e,s){if(!J)throw new Error("Observe 工作台面板未激活");let a=await J(e,s),i=await a.json();if(!a.ok)throw new Error(String(i.detail??i.message??`HTTP ${a.status}`));return i}var re=[{key:"24h",label:"24 小时"},{key:"7d",label:"7 天"},{key:"30d",label:"30 天"},{key:"all",label:"全部"}],le={log:"主动日志",uncaught:"未捕获异常",asyncio:"asyncio 任务",thread:"子线程"},Z={active:{label:"活跃",tone:"warning"},acknowledged:{label:"已确认",tone:"muted"},ignored:{label:"已忽略",tone:"success"}},ce={danger:"bg-danger",warning:"bg-warning",success:"bg-success",accent:"bg-accent",muted:"bg-subtle"};function ee(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(Math.round(e))}function te(e){return typeof e=="number"?`${(e*100).toFixed(1)}%`:"—"}function ne(e){if(e.includes("T"))return`${e.slice(11,13)}:00`;let[,s,a]=e.split("-");return s&&a?`${Number(s)}-${a}`:e}function j(e){if(!e)return"—";let s=new Date(e);return Number.isNaN(s.getTime())?e||"—":`${s.getMonth()+1}-${String(s.getDate()).padStart(2,"0")} ${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}`}function de(e){if(e.length<2)return null;let s=e[e.length-1],a=e[e.length-2];return a?(s-a)/a*100:null}function ue(e){if(!Number.isFinite(e)||e<0)return"刚刚";let s=Math.floor(e/1e3);if(s<3)return"刚刚";if(s<60)return`${s}s 前`;let a=Math.floor(s/60);return a<60?`${a}m 前`:`${Math.floor(a/60)}h 前`}function se(e,s){return s||e>=20?"danger":e>=5?"warning":"muted"}function U({title:e,children:s,bodyClass:a,style:i}){return n("div",{className:"flex flex-col overflow-hidden border border-border bg-surface",style:i,children:[t("div",{className:"flex items-center justify-between border-b border-border px-4 py-2.5",children:t("h3",{className:"text-[12px] font-medium text-muted",children:e})}),t("div",{className:a??"p-4",children:s})]})}function be({portalRef:e,fallbackRef:s,range:a,onClose:i,ui:b}){let f=S(null),c=S(null),[g,v]=l(null),[k,L]=l("type"),[R,p]=l(""),[T,u]=l([]),[x,q]=l(null),[A,F]=l(null),[H,$]=l(null),[W,y]=l(null),[B,P]=l(!1),[G,D]=l("trace"),[I,K]=l(0),O=S(null),_=S(null),z=Y(async()=>{O.current?.abort();let r=new AbortController;O.current=r,$(null);try{let[o,d]=await Promise.all([h(`/api/dashboard/observe/global_errors/overview?range=${a}`,{signal:r.signal}),h(`/api/dashboard/observe/global_errors?range=${a}&facet=${k}&q=${encodeURIComponent(R)}`,{signal:r.signal})]);if(r.signal.aborted)return;v(o),u(d.sections??[]);let m=(d.sections??[]).flatMap(E=>E.items);q(E=>E&&m.some(oe=>oe.fingerprint===E)?E:m[0]?.fingerprint??null)}catch(o){r.signal.aborted||$(o instanceof Error?o.message:"错误列表读取失败")}finally{O.current===r&&(O.current=null)}},[a,k,R]);C(()=>(z(),()=>O.current?.abort()),[z]),C(()=>{if(!x){F(null),y(null);return}let r=new AbortController;return y(null),h(`/api/dashboard/observe/global_errors/${x}?range=${a}`,{signal:r.signal}).then(o=>{r.signal.aborted||(F(o),K(0),D("trace"))},o=>{r.signal.aborted||y(o instanceof Error?o.message:"错误详情读取失败")}),()=>r.abort()},[x,a]);let w=Y(()=>{i()},[i]);C(()=>(c.current?.focus(),()=>{_.current?.abort(),(e.current??s.current)?.focus()}),[s,e]),C(()=>{let r=o=>{if(o.key==="Escape"&&w(),o.key!=="Tab")return;let d=Array.from(f.current?.querySelectorAll('button:not([disabled]), input:not([disabled]), select:not([disabled]), [href], [tabindex]:not([tabindex="-1"])')??[]);if(d.length===0)return;let m=d[0],E=d[d.length-1];o.shiftKey&&document.activeElement===m?(o.preventDefault(),E.focus()):!o.shiftKey&&document.activeElement===E&&(o.preventDefault(),m.focus())};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[w]);let M=async r=>{if(!A||_.current)return;let o=A.fingerprint,d=new AbortController;_.current=d,P(!0),y(null);try{if(await h(`/api/dashboard/observe/global_errors/${o}/status?value=${r}`,{method:"POST",signal:d.signal}),d.signal.aborted)return;F(m=>m?.fingerprint===o?{...m,status:r}:m)}catch(m){d.signal.aborted||y(m instanceof Error?m.message:"错误状态更新失败")}finally{_.current===d&&(_.current=null,d.signal.aborted||P(!1))}},N=r=>{window.dispatchEvent(new CustomEvent("akashic:goto-session",{detail:r})),w()};return n(ae,{children:[t("div",{"aria-hidden":"true",className:"fixed inset-0 z-30 bg-black/55",onClick:w}),n("div",{ref:f,role:"dialog","aria-modal":"true","aria-labelledby":"observe-error-dialog-title",className:"fixed z-40 flex flex-col overflow-hidden rounded-md border border-border-strong bg-surface",style:{width:"min(1180px, 94vw)",height:"min(84vh, 760px)",left:"50%",top:"50%",marginLeft:"calc(min(1180px, 94vw) / -2)",marginTop:"calc(min(84vh, 760px) / -2)"},children:[n("div",{className:"flex flex-shrink-0 items-center gap-4 border-b border-border px-5 py-4",children:[t("button",{ref:c,type:"button",onClick:w,className:"grid h-10 w-10 place-items-center rounded-md border border-border-strong bg-surface-2 text-[18px] text-muted transition-colors hover:text-fg","aria-label":"关闭错误分析",title:"返回 (Esc)",children:"‹"}),t("span",{className:"font-mono text-[26px] font-semibold tabular-nums text-danger",children:g?.total??"—"}),n("div",{className:"min-w-0",children:[n("div",{id:"observe-error-dialog-title",className:"text-sm font-semibold",children:["错误 · ",re.find(r=>r.key===a)?.label??a]}),n("div",{className:"mt-0.5 flex items-center gap-3 text-[11px] text-muted",children:[n("span",{children:[g?.types??0," 个类型"]}),(g?.new_types??0)>0&&n("span",{children:[g?.new_types," 个新类型"]}),(g?.spiking_types??0)>0&&n("span",{className:"font-semibold text-danger",children:[g?.spiking_types," 个正在爆发"]})]})]})]}),n("div",{className:"flex flex-shrink-0 items-center gap-3 border-b border-border px-4 py-2.5",children:[t("div",{className:"flex gap-1 rounded-md border border-border bg-bg p-0.5",children:[{k:"type",l:"按类型"},{k:"source",l:"按来源"},{k:"channel",l:"按通道"}].map(r=>t("button",{type:"button",onClick:()=>L(r.k),className:`rounded-[4px] px-2.5 py-1 text-[11px] transition-colors ${k===r.k?"bg-surface-3 text-fg":"text-muted hover:text-fg"}`,children:r.l},r.k))}),t("input",{value:R,onChange:r=>p(r.target.value),"aria-label":"搜索错误",placeholder:"按消息 / 模块过滤…",className:"w-[280px] rounded-md border border-border bg-bg px-3 py-1.5 text-[11.5px] text-fg outline-none focus:border-accent-deep"})]}),n("div",{className:"grid min-h-0 flex-1 grid-cols-[340px_1fr]",children:[n("div",{className:"overflow-auto border-r border-border p-1.5",children:[H&&t("div",{className:"p-4 text-[12px] text-danger",role:"alert",children:H}),T.map(r=>n("div",{children:[r.label&&n("div",{className:"flex items-center justify-between px-2.5 pb-1 pt-3 text-[11px] font-medium text-muted",children:[t("span",{children:r.label}),n("span",{children:[r.count," 次"]})]}),r.items.map(o=>t(me,{g:o,active:o.fingerprint===x,onClick:()=>q(o.fingerprint),ui:b},o.fingerprint))]},r.key)),!H&&T.length===0&&t("div",{className:"p-6 text-[12.5px] text-muted",children:"所选区间内没有错误。"})]}),W?t("div",{className:"grid place-items-center p-6 text-[13px] text-danger",role:"alert",children:W}):A?t(pe,{detail:A,tab:G,setTab:D,variant:I,setVariant:K,savingStatus:B,onStatus:M,onGoto:N,ui:b}):t("div",{className:"grid place-items-center text-[13px] text-muted",children:"选择左侧一个错误查看现场"})]})]})]})}function me({g:e,active:s,onClick:a,ui:i}){let b=se(e.count,e.is_spiking),f=e.spark??[],c=i.Sparkline;return n("button",{type:"button",onClick:a,className:`grid w-full grid-cols-[9px_1fr_auto] items-center gap-2.5 border-b border-border px-3 py-2.5 text-left transition-colors duration-150 ${s?"bg-accent-soft":"hover:bg-surface-2"}`,children:[t("span",{className:"relative flex h-2 w-2","aria-hidden":"true",children:t("span",{className:`relative inline-flex h-2 w-2 rounded-full ${ce[b]}`})}),n("div",{className:"min-w-0",children:[n("div",{className:"flex items-center gap-1.5 font-mono text-[12.5px]",children:[t("span",{className:"truncate",children:e.error_type}),e.is_new&&t("span",{className:"text-[9px] font-semibold text-accent",children:"新"}),e.is_spiking&&t("span",{className:"text-[9px] font-semibold text-danger",children:"爆发"})]}),t("div",{className:"mt-0.5 truncate font-mono text-[10px] text-subtle",children:e.logger_name}),n("div",{className:"mt-1 flex gap-2.5 text-[10px] text-muted",children:[n("span",{children:[t("b",{className:"font-semibold text-fg",children:e.count})," 次"]}),n("span",{children:[t("b",{className:"font-semibold text-fg",children:e.sessions})," session"]})]})]}),n("div",{className:"flex flex-col items-end gap-1.5",children:[t("div",{className:"h-[22px] w-[62px]",children:f.length>1&&t(c,{data:f,tone:b,height:22})}),t("span",{className:"font-mono text-[10px] text-subtle",children:j(e.last_ts)})]})]})}function pe({detail:e,tab:s,setTab:a,variant:i,setVariant:b,savingStatus:f,onStatus:c,onGoto:g,ui:v}){let k=Z[e.status]??Z.active,L=se(e.count,!1),R=e.variants[i]??e.variants[0],{Chip:p,TrendChart:T}=v;return n("div",{className:"flex min-h-0 flex-col",children:[n("div",{className:"border-b border-border px-5 py-4",children:[t("div",{className:"font-mono text-[19px] font-semibold",children:e.error_type}),t("div",{className:"mt-1.5 font-mono text-[12px] leading-relaxed text-danger",children:e.message}),n("div",{className:"mt-3 flex flex-wrap gap-1.5",children:[t(p,{children:e.logger_name}),n(p,{children:["来源 · ",le[e.source]??e.source]}),t(p,{children:e.channel}),t(p,{tone:"danger",children:e.level}),t(p,{tone:k.tone,children:k.label})]})]}),n("div",{className:"grid grid-cols-4 gap-px border-b border-border bg-border",children:[t(Q,{label:"累计次数",value:String(e.count)}),t(Q,{label:"独立 session",value:String(e.sessions)}),t(Q,{label:"首次",value:j(e.first_ts),small:!0}),t(Q,{label:"最近",value:j(e.last_ts),small:!0})]}),n("div",{className:"flex gap-1 border-b border-border px-5 pt-3",children:[t(X,{active:s==="trend",onClick:()=>a("trend"),children:"趋势"}),n(X,{active:s==="trace",onClick:()=>a("trace"),children:["Traceback",e.variants.length>1?` · ${e.variants.length} 变体`:""]}),n(X,{active:s==="occ",onClick:()=>a("occ"),children:["现场 · ",e.occurrences.length]})]}),n("div",{className:"min-h-0 flex-1 overflow-auto px-5 py-4",children:[s==="trend"&&t(T,{data:e.trend.map(u=>({label:ne(u.bucket),value:u.count})),kind:"bar",tone:L,valueFmt:u=>String(u),empty:"区间内无发作"}),s==="trace"&&n("div",{children:[e.variants.length>1&&t("div",{className:"mb-3 flex gap-2",children:e.variants.map((u,x)=>n("button",{type:"button",onClick:()=>b(x),className:`rounded border px-2.5 py-1.5 text-left text-[10.5px] ${x===i?"border-accent-deep bg-accent-soft text-fg":"border-border bg-bg text-muted"}`,children:[t("b",{className:"text-fg",children:u.count})," 次 · 变体 ",x+1]},u.fingerprint))}),t("pre",{className:"m-0 max-h-[280px] overflow-auto rounded border border-border bg-bg p-4 font-mono text-[11px] leading-relaxed text-muted",children:R?.traceback_text||e.traceback_text})]}),s==="occ"&&n("div",{className:"flex flex-col gap-2",children:[e.occurrences.length===0&&t("div",{className:"text-[12px] text-muted",children:"无可关联的 session 现场。"}),e.occurrences.map(u=>n("div",{className:"grid grid-cols-[auto_1fr_auto] items-center gap-3.5 border-b border-border bg-bg px-3.5 py-2.5",children:[t("span",{className:"font-mono text-[11px] text-accent",children:j(u.ts)}),n("div",{className:"min-w-0",children:[t("div",{className:"truncate text-[12px]",children:u.user_preview||"(无用户消息)"}),n("div",{className:"mt-0.5 font-mono text-[10px] text-subtle",children:["session ",u.session_key]})]}),t("button",{type:"button",onClick:()=>g(u.session_key),className:"whitespace-nowrap rounded border border-accent-deep bg-accent-soft px-2.5 py-1.5 text-[10.5px] text-accent-ink",children:"查看对话"})]},u.session_key))]})]}),n("div",{className:"flex flex-shrink-0 gap-2 border-t border-border px-5 py-3",children:[t("button",{type:"button",onClick:()=>e.occurrences[0]&&g(e.occurrences[0].session_key),disabled:e.occurrences.length===0,className:"rounded border border-accent-deep bg-accent-soft px-3 py-2 text-[11px] text-accent-ink transition-colors disabled:opacity-40",children:"查看最近对话"}),t("button",{type:"button",onClick:()=>void navigator.clipboard?.writeText(e.traceback_text),className:"rounded border border-border-strong bg-surface-2 px-3 py-2 text-[11px] text-muted transition-colors hover:text-fg",children:"复制 Traceback"}),t("div",{className:"flex-1"}),t("button",{type:"button",disabled:f,onClick:()=>c("acknowledged"),className:"rounded border border-border-strong bg-surface-2 px-3 py-2 text-[11px] text-muted transition-colors hover:text-fg disabled:opacity-40",children:"标记已确认"}),t("button",{type:"button",disabled:f,onClick:()=>c("ignored"),className:"rounded border border-border-strong bg-surface-2 px-3 py-2 text-[11px] text-muted transition-colors hover:border-danger/40 hover:text-danger disabled:opacity-40",children:"忽略此类型"})]})]})}function Q({label:e,value:s,small:a}){return n("div",{className:"bg-surface px-4 py-3",children:[t("div",{className:"text-[10px] text-subtle",children:e}),t("div",{className:`mt-1.5 font-mono font-semibold tabular-nums ${a?"text-[12.5px]":"text-[18px]"}`,children:s})]})}function X({active:e,onClick:s,children:a}){return t("button",{type:"button",onClick:s,className:`-mb-px border-b-2 px-3 py-2 text-[11.5px] transition-colors ${e?"border-accent text-fg":"border-transparent text-muted hover:text-fg"}`,children:a})}function V({className:e}){return t("div",{className:`relative overflow-hidden rounded border border-border bg-surface-2 ${e}`})}function ge(){return n("div",{className:"flex flex-col gap-4 p-6",children:[n("div",{className:"flex items-end justify-between",children:[n("div",{className:"flex flex-col gap-2",children:[t(V,{className:"h-7 w-48"}),t(V,{className:"h-3 w-64 rounded"})]}),t(V,{className:"h-9 w-56"})]}),t("div",{className:"grid grid-cols-4 gap-4",children:[0,1,2,3].map(e=>t(V,{className:"h-[132px]"},e))}),t("div",{className:"grid grid-cols-2 gap-4",children:[0,1,2,3].map(e=>t(V,{className:"h-[218px]"},e))})]})}function ve({dispatch:e}){let{Grid:s,MetricTile:a,TrendChart:i}=e.ui,[b,f]=l("24h"),[c,g]=l(null),[v,k]=l([]),[L,R]=l(null),[p,T]=l(!1),[u,x]=l(0),[q,A]=l(()=>Date.now()),[F,H]=l(!1),[$,W]=l(null),y=S(null),B=S(null),P=S(null),G=S(null),D=Y(async()=>{G.current?.abort();let r=new AbortController;G.current=r,H(!0),W(null);try{let[o,d,m]=await Promise.all([h(`/api/dashboard/observe/overview?range=${b}`,{signal:r.signal}),h(`/api/dashboard/observe/timeseries?range=${b}`,{signal:r.signal}),h(`/api/dashboard/observe/global_errors/overview?range=${b}`,{signal:r.signal})]);if(r.signal.aborted)return;g(o),k(d.points??[]),R(m),x(Date.now())}catch(o){r.signal.aborted||W(o instanceof Error?o.message:"监测数据读取失败")}finally{G.current===r&&(G.current=null,r.signal.aborted||H(!1))}},[b]);if(C(()=>{D();let r=window.setInterval(()=>void D(),15e3);return()=>{window.clearInterval(r),G.current?.abort()}},[D]),C(()=>{if(!F||window.matchMedia("(prefers-reduced-motion: reduce)").matches)return;let r=B.current?.animate([{transform:"rotate(0deg)"},{transform:"rotate(360deg)"}],{duration:1e3,iterations:1/0});return()=>r?.cancel()},[F]),C(()=>{let r=window.setInterval(()=>A(Date.now()),1e3);return()=>window.clearInterval(r)},[]),C(()=>{P.current&&(P.current.inert=p)},[p]),!c)return $?t("div",{className:"grid min-h-full place-items-center p-6 text-danger",role:"alert",children:$}):t(ge,{});let I=v.map(r=>r.turns),K=v.map(r=>r.errors),O=v.map(r=>r.input_tokens),_=v.map(r=>(r.passive_cache_hit_rate??0)*100),z=v.map(r=>(r.proactive_cache_hit_rate??0)*100),w=v.map(r=>r.avg_iteration??0),M=r=>v.map((o,d)=>({label:ne(o.bucket),value:r[d]})),N=L?.total??c.errors;return n(ae,{children:[n("div",{ref:P,"aria-hidden":p||void 0,className:"flex flex-col gap-5 p-6 transition-opacity duration-150",style:p?{opacity:.35,pointerEvents:"none"}:void 0,children:[n("div",{className:"flex items-end justify-between",children:[n("div",{children:[n("div",{className:"flex items-center gap-2.5",children:[t("span",{className:"detail-title",children:"Observe · 监测"}),t("span",{className:"text-[11px] font-medium text-success",children:"实时更新"})]}),n("div",{className:"detail-subtext",children:["Agent 主循环遥测 · Token / 迭代 / 错误",n("span",{className:"ml-2 font-mono text-[11px] text-subtle",children:["更新于 ",ue(q-u)]})]})]}),n("div",{className:"flex items-center gap-2",children:[t("button",{ref:B,type:"button",onClick:()=>void D(),className:"grid h-10 w-10 place-items-center rounded-md border border-border bg-surface-2 text-muted transition-colors hover:border-border-strong hover:text-fg","aria-label":"刷新监测数据",title:"刷新",children:"↻"}),t("div",{className:"flex gap-1 rounded-md border border-border bg-surface-2 p-1",children:re.map(r=>t("button",{type:"button",onClick:()=>f(r.key),className:`min-h-10 rounded-[4px] px-2.5 py-1 text-[11px] transition-colors ${b===r.key?"bg-accent text-accent-ink":"text-muted hover:bg-surface-3 hover:text-fg"}`,"aria-pressed":b===r.key,children:r.label},r.key))})]})]}),$&&t("div",{className:"border border-danger/40 bg-danger/10 px-4 py-3 text-[12px] text-danger",role:"alert",children:$}),n("section",{className:`flex min-h-16 items-center justify-between gap-4 border px-4 py-3 ${N>0?"border-danger/40 bg-danger/10":"border-success/35 bg-success/10"}`,"aria-label":"运行状态",children:[n("div",{className:"min-w-0",children:[t("div",{className:`text-[13px] font-semibold ${N>0?"text-danger":"text-success"}`,children:N>0?`${N} 条错误需要查看`:"当前区间没有采集到错误"}),t("p",{className:"mt-1 text-[11.5px] text-muted",children:N>0?`${L?.types??0} 个错误类型,先查看爆发和新出现的类型。`:"主循环遥测持续更新,缓存与迭代指标见下方。"})]}),N>0&&t("button",{type:"button",ref:y,onClick:()=>T(!0),className:"min-h-10 flex-shrink-0 rounded-md border border-danger/40 bg-surface px-3 text-[12px] font-semibold text-danger hover:bg-danger/10 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",children:"查看错误分析"})]}),n(s,{columns:3,children:[t("div",{children:t(a,{label:"对话轮数",value:ee(c.turns),delta:de(I),sub:c.last_ts?`最近 ${j(c.last_ts)}`:"无记录",tone:"accent",spark:I})}),t("div",{children:t(a,{label:"被动 KV 命中率",value:te(c.passive_cache_hit_rate),sub:`主动 ${te(c.proactive_cache_hit_rate)}`,tone:"success",spark:_})}),t("div",{children:t(a,{label:"平均迭代",value:c.avg_iteration!=null?c.avg_iteration.toFixed(1):"—",unit:`峰 ${c.max_iteration}`,sub:"每轮 LLM 调用次数",tone:"warning",spark:w})})]}),n(s,{columns:2,children:[t(U,{title:"输入 Token 趋势",children:t(i,{data:M(O),kind:"area",tone:"accent",valueFmt:ee})}),t(U,{title:"平均迭代趋势",children:t(i,{data:M(w),kind:"area",tone:"warning",valueFmt:r=>r.toFixed(1)})})]}),n("details",{className:"border-t border-border pt-1",children:[t("summary",{className:"min-h-11 cursor-pointer py-3 text-[12px] font-semibold text-fg focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",children:"查看缓存命中与错误趋势"}),n(s,{columns:2,children:[t(U,{title:"全局被动链路命中率趋势",children:t(i,{data:M(_),kind:"area",tone:"success",valueFmt:r=>`${r.toFixed(0)}%`})}),t(U,{title:"全局主动链路命中率趋势",children:t(i,{data:M(z),kind:"area",tone:"accent",valueFmt:r=>`${r.toFixed(0)}%`})}),t(U,{title:"错误趋势",children:t(i,{data:M(K),kind:"bar",tone:"danger",valueFmt:r=>String(r),empty:"所选区间内没有错误"})})]})]})]}),p&&t(be,{portalRef:y,fallbackRef:B,range:b,onClose:()=>T(!1),ui:e.ui})]})}var fe={id:"observe",label:"运行监测",viewLabel:"运行监测",order:60,layout:"workbench",pageSize:30,rowKey:"id",countTitle(e){return`${e} 轮遥测`},columns:[{key:"session_key",label:"会话",width:120,cellClass:"mono cell-session",rawTitle:!0},{key:"ts",label:"时间",width:96,fmt:"mono-time",cellClass:"mono cell-time",rawTitle:!0},{key:"error",label:"错误",flex:!0,cellClass:"content-preview"}],async getCount({signal:e}){try{return(await h("/api/dashboard/observe/overview?range=all",{signal:e})).turns||0}catch(s){if(e.aborted)throw s;return null}},async fetchPage({page:e,pageSize:s,signal:a}){let i=await h(`/api/dashboard/observe/errors?range=all&page=${e}&page_size=${s}`,{signal:a});return{items:i.items||[],total:i.total||0}},renderMain(e,s){let a=ie(e);return a.render(t(ve,{dispatch:s})),()=>a.unmount()}};function ke(e){J=e.http.request;let s=e.ui.inject("workbench.panels.v2",a=>a.register(fe));return()=>{s(),J=null}}export{ke as activate};