ellm-proxy 0.0.2 → 0.0.6

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.
Files changed (58) hide show
  1. package/README.md +60 -60
  2. package/bin/commands/autostart.js +37 -213
  3. package/bin/commands/config.js +8 -8
  4. package/bin/commands/pm2.js +28 -28
  5. package/bin/commands/service.js +107 -107
  6. package/bin/ellm-proxy.js +61 -61
  7. package/dist/server.js +33 -2
  8. package/dist/web-ui/assets/DashboardView-BHG4xIdN.css +1 -0
  9. package/dist/web-ui/assets/{DashboardView-CQdlgirS.js → DashboardView-C3Hw-HpG.js} +1 -1
  10. package/dist/web-ui/assets/LayoutView-BUA8-IzK.css +1 -0
  11. package/dist/web-ui/assets/LayoutView-C9phf7in.js +1 -0
  12. package/dist/web-ui/assets/LoginView-DrhfslIY.css +1 -0
  13. package/dist/web-ui/assets/LoginView-es6pSPgt.js +1 -0
  14. package/dist/web-ui/assets/LogsView-BlXITEJH.js +9 -0
  15. package/dist/web-ui/assets/LogsView-Dl50XQhG.css +1 -0
  16. package/dist/web-ui/assets/{ProcessView-0x_ShSwV.js → ProcessView-Bgf7-MLQ.js} +1 -1
  17. package/dist/web-ui/assets/ProcessView-DK0TvDpR.css +1 -0
  18. package/dist/web-ui/assets/ProvidersView-Dpr8MI-p.css +1 -0
  19. package/dist/web-ui/assets/ProvidersView-f8aZkMdw.js +31 -0
  20. package/dist/web-ui/assets/SettingsView-BkwyoOUb.css +1 -0
  21. package/dist/web-ui/assets/SettingsView-GvAA2vLp.js +1 -0
  22. package/dist/web-ui/assets/config-Cs3_z63C.js +1 -0
  23. package/dist/web-ui/assets/{index-DFlUx18F.js → index-GohB4JDa.js} +2 -2
  24. package/dist/web-ui/assets/{providers-CGEmOxne.js → providers-Djtdy2tv.js} +1 -1
  25. package/dist/web-ui/assets/{useApi-BRPinb_2.js → useApi-D_iJ2Mca.js} +1 -1
  26. package/dist/web-ui/assets/useManagerApi-C1_COxKg.js +1 -0
  27. package/dist/web-ui/assets/{useToast-D7xlwSg6.js → useToast-C0UMTbkx.js} +1 -1
  28. package/dist/web-ui/config.js +10 -10
  29. package/dist/web-ui/index.html +13 -13
  30. package/docs/DESIGN.md +99 -99
  31. package/manager/api/harness/backup.js +20 -20
  32. package/manager/api/harness/claude-code.js +54 -54
  33. package/manager/api/harness/codex.js +123 -123
  34. package/manager/api/harness/dsh.js +175 -175
  35. package/manager/api/harness/index.js +118 -118
  36. package/manager/api/service-settings.js +98 -0
  37. package/manager/api/service.js +3 -13
  38. package/manager/index.js +182 -170
  39. package/package.json +44 -40
  40. package/utils/autostart.js +219 -0
  41. package/utils/interpreter.js +14 -14
  42. package/utils/paths.js +45 -44
  43. package/utils/pm2.js +130 -130
  44. package/utils/service.js +205 -189
  45. package/utils/updater.js +210 -0
  46. package/dist/web-ui/assets/DashboardView-qrQrkgLA.css +0 -1
  47. package/dist/web-ui/assets/LayoutView-BaY4Pz9W.js +0 -1
  48. package/dist/web-ui/assets/LoginView-CPvz1Ylx.js +0 -1
  49. package/dist/web-ui/assets/LoginView-Dg0mB6ok.css +0 -1
  50. package/dist/web-ui/assets/LogsView-B-bIj36j.js +0 -9
  51. package/dist/web-ui/assets/LogsView-Wl3_adHm.css +0 -1
  52. package/dist/web-ui/assets/ProcessView-DzMqBJmd.css +0 -1
  53. package/dist/web-ui/assets/ProvidersView-BxAxDRFH.css +0 -1
  54. package/dist/web-ui/assets/ProvidersView-GQENcvJS.js +0 -31
  55. package/dist/web-ui/assets/SettingsView-BDkymsrS.css +0 -1
  56. package/dist/web-ui/assets/SettingsView-BrAiaskZ.js +0 -1
  57. package/dist/web-ui/assets/config-DNn5cjYY.js +0 -1
  58. package/dist/web-ui/assets/useManagerApi-BDWJz5o6.js +0 -1
@@ -1 +0,0 @@
1
- .login-card[data-v-d5b6a90c]{max-width:400px;width:100%}.login-title[data-v-d5b6a90c]{text-align:center;margin-bottom:24px;color:#3b82f6}
@@ -1,9 +0,0 @@
1
- import{d as he,i as xe,c,a as l,w as a,l as v,r as p,o as d,b as i,F as T,p as we,X as Ce,e as u,n as te,j as C,t as r,k as $,f as De,m as Ve,_ as $e}from"./index-DFlUx18F.js";import{A as J}from"./useApi-BRPinb_2.js";import{u as Se}from"./providers-CGEmOxne.js";import{u as Ie}from"./useToast-D7xlwSg6.js";import"./config-DNn5cjYY.js";const qe={class:"logs-page"},ze={class:"filter-bar"},Ue={class:"table-wrap"},je=["onClick"],Re={key:1},Te={class:"pagination-bar"},Ne={key:0,class:"detail-content"},Me={key:0,class:"ip-link"},Ye={class:"ip-pop"},Ee={class:"ip-pop-row"},Pe={key:0,class:"ip-pop-row"},Fe={key:1,class:"ip-pop-error"},Le={key:2},Be=["href"],Je={key:1},Ke={key:1},Oe={class:"error-text"},Ae={class:"pane-bar"},Ge={class:"json-block"},He={class:"pane-bar"},Xe={class:"json-block"},Qe={class:"pane-bar"},We={class:"json-block"},Ze={class:"pane-bar"},et={class:"json-block"},tt={class:"pane-bar"},lt={class:"json-block"},at={class:"pane-bar"},st={class:"json-block"},ot={class:"pane-bar"},nt={class:"json-block"},rt={class:"pane-bar"},ut={class:"json-block"},it=he({__name:"LogsView",setup(dt){const K=Se(),{toast:N}=Ie(),D=v(""),f=v(null),S=v("2xx"),I=v("model"),q=v(""),z=v(""),M=v([]),O=v(0),U=v(1),j=v(50),Y=v(!1),E=v(!1),s=v(null),P=v("info"),A=t=>{if(!t)return"-";const e=new Date(t),n=w=>String(w).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())} ${n(e.getHours())}:${n(e.getMinutes())}:${n(e.getSeconds())}`},b=t=>t?typeof t=="string"?t:JSON.stringify(t,null,2):"-",le=t=>{if(!t)return"-";try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}},V=t=>t.toLocaleString(),G=t=>t==null||t<=0?"-":t>=1e3?(t/1e3).toFixed(2)+"s":Math.round(t)+"ms",g=async t=>{try{await navigator.clipboard.writeText(t),N("已复制到剪贴板","success")}catch{const e=document.createElement("textarea");e.value=t,e.style.position="fixed",e.style.opacity="0",document.body.appendChild(e),e.select();try{document.execCommand("copy"),N("已复制到剪贴板","success")}catch{N("复制失败","error")}document.body.removeChild(e)}},H=t=>{const e=t.input_tokens||0,n=t.cache_read_tokens||0;return e<=0?"-":(n/e*100).toFixed(1)+"%"},F=v(!1),ae=async t=>{if(!(t._ipInfo||t._ipInfoError)){F.value=!0;try{const e=await J.get(`/api/logs/ipinfo?ip=${encodeURIComponent(t.ip)}`);e.error?t._ipInfoError=e.error:t._ipInfo=e}catch{t._ipInfoError="查询失败"}finally{F.value=!1}}},se=t=>[t.country,t.region,t.city].filter(Boolean).join(" · ")||"-",oe=async t=>{E.value=!0,s.value=null,P.value="info";try{const e=t.id?`?id=${t.id}`:`?_file=${encodeURIComponent(t._file)}`,n=await J.get("/api/logs/detail"+e);n&&n.detail?s.value={...n.detail,...n.meta}:s.value=n}catch(e){console.error(e)}},ne=De(()=>{const t=new Set;for(const e of K.suppliers)for(const n of e.models)t.add(n.modelName);for(const e of M.value)e.model&&t.add(e.model);return[...t].sort()}),X=t=>{const e=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${e(t.getMonth()+1)}-${e(t.getDate())}`},L=t=>{D.value=t;const e=new Date,n=new Date(e);if(t==="today")n.setDate(e.getDate());else if(t==="yesterday")n.setDate(e.getDate()-1),e.setDate(e.getDate()-1);else if(t==="beforeYesterday")n.setDate(e.getDate()-2),e.setDate(e.getDate()-2);else if(t==="last3days")n.setDate(e.getDate()-2);else if(t==="week"){const w=(e.getDay()+6)%7;n.setDate(e.getDate()-w)}else n.setDate(1);f.value=[X(n),X(e)],x()},re=t=>{t?L(t):(D.value="",f.value=null,x())},ue=t=>{D.value="",f.value=t||null,x()},B=async()=>{Y.value=!0;try{const t={page:String(U.value),pageSize:String(j.value),sort:"time",order:"desc"};f.value&&f.value.length===2&&(t.startDate=f.value[0],t.endDate=f.value[1]),S.value&&(t.status=S.value),I.value&&(t.pathGroup=I.value),q.value&&(t.model=q.value),z.value&&(t.keyword=z.value);const e=new URLSearchParams(t).toString(),n=await J.get("/api/logs?"+e);M.value=n.items||[],O.value=n.total||0}catch(t){console.error(t)}finally{Y.value=!1}},x=()=>{U.value=1,B()},ie=()=>{D.value="today",f.value=null,S.value="2xx",I.value="model",q.value="",z.value="",U.value=1,j.value=50,L("today")};return xe(()=>{K.loadProviders(),L("today")}),(t,e)=>{const n=p("el-option"),w=p("el-select"),de=p("el-date-picker"),pe=p("el-input"),m=p("el-button"),Q=p("el-card"),y=p("el-table-column"),W=p("el-tag"),ce=p("el-table"),_e=p("el-pagination"),_=p("el-descriptions-item"),ve=p("el-divider"),me=p("el-popover"),fe=p("el-descriptions"),be=p("el-alert"),h=p("el-tab-pane"),ge=p("el-tabs"),ye=p("el-dialog"),Z=Ve("loading");return d(),c("div",qe,[l(Q,{shadow:"never"},{default:a(()=>[i("div",ze,[l(w,{modelValue:D.value,"onUpdate:modelValue":e[0]||(e[0]=o=>D.value=o),placeholder:"时间范围",clearable:"",style:{width:"130px"},onChange:re},{default:a(()=>[l(n,{label:"今天",value:"today"}),l(n,{label:"昨天",value:"yesterday"}),l(n,{label:"前天",value:"beforeYesterday"}),l(n,{label:"近三天",value:"last3days"}),l(n,{label:"本周",value:"week"}),l(n,{label:"本月",value:"month"})]),_:1},8,["modelValue"]),l(de,{modelValue:f.value,"onUpdate:modelValue":e[1]||(e[1]=o=>f.value=o),type:"daterange","value-format":"YYYY-MM-DD","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",style:{width:"260px"},onChange:ue},null,8,["modelValue"]),l(w,{modelValue:S.value,"onUpdate:modelValue":e[2]||(e[2]=o=>S.value=o),placeholder:"全部状态",clearable:"",style:{width:"120px"},onChange:x},{default:a(()=>[l(n,{label:"成功 (2xx)",value:"2xx"}),l(n,{label:"3xx",value:"3xx"}),l(n,{label:"4xx",value:"4xx"}),l(n,{label:"5xx",value:"5xx"}),l(n,{label:"错误 (4xx+)",value:"err"})]),_:1},8,["modelValue"]),l(w,{modelValue:I.value,"onUpdate:modelValue":e[3]||(e[3]=o=>I.value=o),placeholder:"全部路径",clearable:"",style:{width:"130px"},onChange:x},{default:a(()=>[l(n,{label:"模型接口",value:"model"}),l(n,{label:"其他",value:"other"})]),_:1},8,["modelValue"]),l(w,{modelValue:q.value,"onUpdate:modelValue":e[4]||(e[4]=o=>q.value=o),placeholder:"全部模型",clearable:"",filterable:"",style:{width:"220px"},onChange:x},{default:a(()=>[(d(!0),c(T,null,we(ne.value,o=>(d(),C(n,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),l(pe,{modelValue:z.value,"onUpdate:modelValue":e[5]||(e[5]=o=>z.value=o),class:"keyword-input",placeholder:"关键字搜索(请求/响应内容)",clearable:"",onKeyup:Ce(x,["enter"])},null,8,["modelValue"]),l(m,{type:"primary",class:"push-right",onClick:x},{default:a(()=>[...e[20]||(e[20]=[u("搜索",-1)])]),_:1}),l(m,{onClick:ie},{default:a(()=>[...e[21]||(e[21]=[u("重置",-1)])]),_:1})])]),_:1}),l(Q,{shadow:"never",class:"mt-16 table-card"},{default:a(()=>[i("div",Ue,[te((d(),C(ce,{data:M.value,border:"",stripe:"",height:"100%"},{default:a(()=>[l(y,{prop:"request_id",label:"请求ID","min-width":"140"},{default:a(({row:o})=>[o.request_id?(d(),c("span",{key:0,class:"request-id",title:"点击复制(可用于关联控制台日志与检索)",onClick:R=>g(o.request_id)},r(o.request_id),9,je)):(d(),c("span",Re,"-"))]),_:1}),l(y,{prop:"time",label:"时间",width:"180"},{default:a(({row:o})=>[u(r(A(o.time)),1)]),_:1}),l(y,{prop:"model",label:"模型","min-width":"180"}),l(y,{prop:"status",label:"状态",width:"70",align:"center"},{default:a(({row:o})=>[l(W,{type:o.status>=400?"danger":o.status>=300?"warning":"success"},{default:a(()=>[u(r(o.status),1)]),_:2},1032,["type"])]),_:1}),l(y,{label:"输入",width:"110",align:"center"},{default:a(({row:o})=>[u(r(V(o.input_tokens??0)),1)]),_:1}),l(y,{label:"输出",width:"110",align:"center"},{default:a(({row:o})=>[u(r(V(o.output_tokens??0)),1)]),_:1}),l(y,{label:"缓存读取",width:"90",align:"center"},{default:a(({row:o})=>[u(r(V(o.cache_read_tokens??0)),1)]),_:1}),l(y,{label:"缓存命中率",width:"105",align:"center"},{default:a(({row:o})=>[i("span",null,r(H(o)),1)]),_:1}),l(y,{label:"请求耗时",width:"90",align:"center"},{default:a(({row:o})=>[u(r(G(o.duration)),1)]),_:1}),l(y,{label:"详情",width:"70",align:"center"},{default:a(({row:o})=>[l(m,{link:"",type:"primary",onClick:R=>oe(o)},{default:a(()=>[...e[22]||(e[22]=[u("查看",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[Z,Y.value]])]),i("div",Te,[l(_e,{"current-page":U.value,"onUpdate:currentPage":e[6]||(e[6]=o=>U.value=o),"page-size":j.value,"onUpdate:pageSize":e[7]||(e[7]=o=>j.value=o),total:O.value,"page-sizes":[20,50,100,200],layout:"total, sizes, prev, pager, next",onCurrentChange:B,onSizeChange:B},null,8,["current-page","page-size","total"])])]),_:1}),l(ye,{modelValue:E.value,"onUpdate:modelValue":e[19]||(e[19]=o=>E.value=o),title:"日志详情",width:"80%",top:"5vh","destroy-on-close":""},{default:a(()=>[s.value?(d(),c("div",Ne,[l(ge,{modelValue:P.value,"onUpdate:modelValue":e[18]||(e[18]=o=>P.value=o)},{default:a(()=>{var o,R,ee;return[l(h,{label:"基本信息",name:"info"},{default:a(()=>{var k;return[l(fe,{column:2,border:""},{default:a(()=>[l(_,{label:"时间"},{default:a(()=>[u(r(A(s.value.time)),1)]),_:1}),l(_,{label:"模型"},{default:a(()=>[u(r(s.value.model),1)]),_:1}),l(_,{label:"方法"},{default:a(()=>[u(r(s.value.method),1)]),_:1}),l(_,{label:"路径"},{default:a(()=>[u(r(s.value.path),1)]),_:1}),l(_,{label:"状态码"},{default:a(()=>[u(r(s.value.status),1)]),_:1}),l(_,{label:"流式"},{default:a(()=>[l(W,{type:s.value.stream?"warning":"info"},{default:a(()=>[u(r(s.value.stream?"是":"否"),1)]),_:1},8,["type"])]),_:1}),l(_,{label:"IP"},{default:a(()=>[s.value.ip?(d(),c("span",Me,[l(me,{placement:"right",width:"240",trigger:"click",onShow:e[8]||(e[8]=ke=>ae(s.value))},{reference:a(()=>[i("span",null,r(s.value.ip),1)]),default:a(()=>[te((d(),c("div",Ye,[s.value._ipInfo?(d(),c(T,{key:0},[i("div",Ee,[e[23]||(e[23]=i("span",{class:"ip-pop-label"},"归属地",-1)),i("span",null,r(se(s.value._ipInfo)),1)]),s.value._ipInfo.isp?(d(),c("div",Pe,[e[24]||(e[24]=i("span",{class:"ip-pop-label"},"运营商",-1)),i("span",null,r(s.value._ipInfo.isp),1)])):$("",!0)],64)):s.value._ipInfoError?(d(),c("div",Fe,r(s.value._ipInfoError),1)):(d(),c("span",Le,"查询中...")),l(ve,{style:{margin:"8px 0"}}),i("a",{class:"ip-pop-link",href:`https://m.ip138.com/iplookup.php?ip=${encodeURIComponent(s.value.ip)}`,target:"_blank"},"在 ip138 查看",8,Be)])),[[Z,F.value]])]),_:1})])):(d(),c("span",Je,"-"))]),_:1}),l(_,{label:"Session"},{default:a(()=>[u(r(s.value.session_id||"-"),1)]),_:1}),l(_,{label:"Request ID"},{default:a(()=>[s.value.request_id?(d(),c("span",{key:0,class:"request-id",title:"点击复制(可用于关联控制台日志与检索)",onClick:e[9]||(e[9]=ke=>g(s.value.request_id))},r(s.value.request_id),1)):(d(),c("span",Ke,"-"))]),_:1}),l(_,{label:"输入 Token(含缓存读取)"},{default:a(()=>[u(r(V(s.value.input_tokens??0)),1)]),_:1}),l(_,{label:"输出 Token"},{default:a(()=>[u(r(V(s.value.output_tokens??0)),1)]),_:1}),l(_,{label:"缓存读取"},{default:a(()=>[u(r(V(s.value.cache_read_tokens??0)),1)]),_:1}),l(_,{label:"请求耗时"},{default:a(()=>[u(r(G(s.value.duration)),1)]),_:1}),l(_,{label:"缓存命中率"},{default:a(()=>[u(r(H(s.value)),1)]),_:1}),s.value.error?(d(),C(_,{key:0,label:"错误",span:2},{default:a(()=>[i("span",Oe,r(s.value.error),1)]),_:1})):$("",!0)]),_:1}),(k=s.value.response)!=null&&k.truncated?(d(),C(be,{key:0,class:"mt-16",type:"warning",closable:!1,title:"内容超过单请求捕获上限,已截断"})):$("",!0)]}),_:1}),(o=s.value.response)!=null&&o._capture?(d(),c(T,{key:0},[l(h,{label:"客户端请求",name:"inbound"},{default:a(()=>[i("div",Ae,[l(m,{size:"small",class:"copy-btn",onClick:e[10]||(e[10]=k=>g(b(s.value.response.inbound_request)))},{default:a(()=>[...e[25]||(e[25]=[u(" 复制 ",-1)])]),_:1})]),i("pre",Ge,r(b(s.value.response.inbound_request)),1)]),_:1}),l(h,{label:"转发上游的请求",name:"upstreamReq"},{default:a(()=>[i("div",He,[l(m,{size:"small",class:"copy-btn",onClick:e[11]||(e[11]=k=>g(b(s.value.response.upstream_request)))},{default:a(()=>[...e[26]||(e[26]=[u(" 复制 ",-1)])]),_:1})]),i("pre",Xe,r(b(s.value.response.upstream_request)),1)]),_:1}),s.value.response.upstream_response_text?(d(),C(h,{key:0,label:"上游响应(原始)",name:"upstreamRes"},{default:a(()=>[i("div",Qe,[l(m,{size:"small",class:"copy-btn",onClick:e[12]||(e[12]=k=>g(s.value.response.upstream_response_text))},{default:a(()=>[...e[27]||(e[27]=[u(" 复制 ",-1)])]),_:1})]),i("pre",We,r(le(s.value.response.upstream_response_text)),1)]),_:1})):(R=s.value.response.upstream_stream_frames)!=null&&R.length?(d(),C(h,{key:1,label:`上游响应(原始流,${s.value.response.upstream_stream_frames.length} 帧)`,name:"upstreamStream"},{default:a(()=>[i("div",Ze,[l(m,{size:"small",class:"copy-btn",onClick:e[13]||(e[13]=k=>g(s.value.response.upstream_stream_frames.join(`
2
-
3
- `)))},{default:a(()=>[...e[28]||(e[28]=[u(" 复制 ",-1)])]),_:1})]),i("pre",et,r(s.value.response.upstream_stream_frames.join(`
4
-
5
- `)),1)]),_:1},8,["label"])):$("",!0),s.value.response.client_response!==void 0&&s.value.response.client_response!==null?(d(),C(h,{key:2,label:"回写客户端(转换后)",name:"clientRes"},{default:a(()=>[i("div",tt,[l(m,{size:"small",class:"copy-btn",onClick:e[14]||(e[14]=k=>g(b(s.value.response.client_response)))},{default:a(()=>[...e[29]||(e[29]=[u(" 复制 ",-1)])]),_:1})]),i("pre",lt,r(b(s.value.response.client_response)),1)]),_:1})):(ee=s.value.response.client_stream_frames)!=null&&ee.length?(d(),C(h,{key:3,label:`回写客户端(${s.value.response.client_stream_frames.length} 帧)`,name:"clientStream"},{default:a(()=>[i("div",at,[l(m,{size:"small",class:"copy-btn",onClick:e[15]||(e[15]=k=>g(s.value.response.client_stream_frames.join(`
6
-
7
- `)))},{default:a(()=>[...e[30]||(e[30]=[u(" 复制 ",-1)])]),_:1})]),i("pre",st,r(s.value.response.client_stream_frames.join(`
8
-
9
- `)),1)]),_:1},8,["label"])):$("",!0)],64)):(d(),c(T,{key:1},[l(h,{label:"请求体",name:"request"},{default:a(()=>[i("div",ot,[l(m,{size:"small",class:"copy-btn",onClick:e[16]||(e[16]=k=>g(b(s.value.request)))},{default:a(()=>[...e[31]||(e[31]=[u(" 复制 ",-1)])]),_:1})]),i("pre",nt,r(b(s.value.request)),1)]),_:1}),l(h,{label:"响应体",name:"response"},{default:a(()=>[i("div",rt,[l(m,{size:"small",class:"copy-btn",onClick:e[17]||(e[17]=k=>g(b(s.value.response)))},{default:a(()=>[...e[32]||(e[32]=[u(" 复制 ",-1)])]),_:1})]),i("pre",ut,r(b(s.value.response)),1)]),_:1})],64))]}),_:1},8,["modelValue"])])):$("",!0)]),_:1},8,["modelValue"])])}}}),ft=$e(it,[["__scopeId","data-v-f853bf75"]]);export{ft as default};
@@ -1 +0,0 @@
1
- .logs-page[data-v-f853bf75]{height:calc(100vh - 124px);display:flex;flex-direction:column;overflow:hidden}.request-id[data-v-f853bf75]{cursor:pointer;font-family:ui-monospace,Consolas,monospace;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.request-id[data-v-f853bf75]:hover{color:var(--el-color-primary)}.filter-bar[data-v-f853bf75]{display:flex;gap:12px;align-items:center;flex-wrap:nowrap}.filter-bar .keyword-input[data-v-f853bf75]{flex:1;min-width:160px}.filter-bar .push-right[data-v-f853bf75]{margin-left:auto}.filter-bar[data-v-f853bf75] .el-button+.el-button{margin-left:0}.mt-16[data-v-f853bf75]{margin-top:16px}.table-card[data-v-f853bf75]{flex:1;min-height:0;overflow:hidden}.table-card[data-v-f853bf75] .el-card__body{height:100%;display:flex;flex-direction:column}.table-wrap[data-v-f853bf75]{flex:1;min-height:0}.pagination-bar[data-v-f853bf75]{margin-top:16px;display:flex;justify-content:flex-end;flex-shrink:0}.ip-link[data-v-f853bf75]{color:#409eff;cursor:pointer}.ip-link[data-v-f853bf75]:hover{text-decoration:underline}.ip-pop[data-v-f853bf75]{font-size:13px;min-height:20px}.ip-pop-row[data-v-f853bf75]{display:flex;gap:8px;margin-bottom:4px}.ip-pop-label[data-v-f853bf75]{color:#909399;flex-shrink:0}.ip-pop-error[data-v-f853bf75]{color:#f56c6c}.ip-pop-link[data-v-f853bf75]{color:#409eff;font-size:13px}.session-text[data-v-f853bf75]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;max-width:100%}.error-text[data-v-f853bf75]{color:#f56c6c}.pane-bar[data-v-f853bf75]{display:flex;justify-content:flex-end;margin-bottom:8px;flex-shrink:0}.json-block[data-v-f853bf75]{background:#f5f7fa;border:1px solid #e4e7ed;border-radius:4px;padding:12px;font-size:13px;line-height:1.5;overflow:auto;white-space:pre-wrap;word-break:break-all;flex:1;min-height:0}.detail-content[data-v-f853bf75]{height:78vh;display:flex;flex-direction:column;overflow:hidden}.detail-content[data-v-f853bf75] .el-tabs{flex:1;min-height:0;display:flex;flex-direction:column}.detail-content[data-v-f853bf75] .el-tabs__content{flex:1;min-height:0}.detail-content[data-v-f853bf75] .el-tab-pane{height:100%;display:flex;flex-direction:column;overflow:auto}.copy-btn[data-v-f853bf75]{margin-left:8px;padding:2px 10px;font-size:12px}
@@ -1 +0,0 @@
1
- @charset "UTF-8";.proc-name[data-v-1404bf7a]{display:flex;align-items:center;gap:8px;font-weight:600}.proc-name .proc-sub[data-v-1404bf7a]{font-weight:400;color:var(--el-text-color-secondary);font-size:12px}.status-dot[data-v-1404bf7a]{display:inline-block;width:8px;height:8px;border-radius:50%}.status-dot.running[data-v-1404bf7a]{background:var(--el-color-success);box-shadow:0 0 4px var(--el-color-success)}.status-dot.stopped[data-v-1404bf7a]{background:var(--el-color-info)}.status-dot.abnormal[data-v-1404bf7a]{background:var(--el-color-danger)}.desc-cell[data-v-1404bf7a]{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.desc-full[data-v-1404bf7a]{margin:0;line-height:1.8}.mr-8[data-v-1404bf7a]{margin-right:8px}
@@ -1 +0,0 @@
1
- .dialog-body[data-v-3a42733f]{max-height:80vh;overflow-y:auto;overflow-x:hidden;padding-bottom:100px}.test-ok-text[data-v-3a42733f]{font-size:12px;color:#16a34a;max-width:140px;display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.test-fail-text[data-v-3a42733f]{font-size:12px;color:#dc2626;max-width:140px;display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.model-select-wrap[data-v-3a42733f]{width:400px;flex-shrink:0}.flex-gap-8.full-width[data-v-3a42733f]{width:100%}.key-input[data-v-3a42733f]{flex:1;min-width:0}.key-test-btn[data-v-3a42733f]{flex-shrink:0}.test-result-link[data-v-3a42733f]{font-size:12px}.detail-body[data-v-3a42733f]{max-height:70vh;overflow-y:auto}.detail-head[data-v-3a42733f]{display:flex;align-items:center;gap:12px;margin-bottom:12px}.detail-name[data-v-3a42733f]{font-weight:600;font-size:14px}.detail-pre[data-v-3a42733f]{background:#f5f7fa;border:1px solid #e4e7ed;border-radius:6px;padding:12px;font-size:12px;line-height:1.6;color:#303133;max-height:300px;overflow:auto;margin:0;white-space:pre-wrap;word-break:break-all}.ghost[data-v-7afb29d5]{opacity:.4}.provider-grid[data-v-7afb29d5]{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.provider-card[data-v-7afb29d5]{min-width:0}.provider-card[data-v-7afb29d5] .el-card__body{padding:14px 16px}.provider-card.is-expanded[data-v-7afb29d5]{grid-column:1/-1}.card-header[data-v-7afb29d5]{display:flex;justify-content:space-between;align-items:center;min-width:0}.card-title[data-v-7afb29d5]{min-width:0}.card-title .alias-title[data-v-7afb29d5]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.drag-grip[data-v-7afb29d5]{flex-shrink:0;color:#c0c4cc;cursor:grab;padding:4px}.drag-grip[data-v-7afb29d5]:hover{color:#909399}.card-tags[data-v-7afb29d5]{margin-top:8px}.card-actions[data-v-7afb29d5]{margin-top:12px;padding-top:10px;border-top:1px solid #f0f2f5}.line-ellipsis[data-v-7afb29d5]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rotate-90[data-v-7afb29d5]{transform:rotate(90deg)}.error-tag[data-v-7afb29d5]{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cursor-pointer[data-v-7afb29d5]{cursor:pointer}