Merge branch 'main' into RAGAnything

This commit is contained in:
hzywhite 2025-09-16 17:52:58 +08:00 committed by GitHub
commit 9bc5f1578c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
54 changed files with 3438 additions and 40 deletions

View file

@ -1,5 +1,5 @@
from .lightrag import LightRAG as LightRAG, QueryParam as QueryParam from .lightrag import LightRAG as LightRAG, QueryParam as QueryParam
__version__ = "1.4.8.1" __version__ = "1.4.8.2"
__author__ = "Zirui Guo" __author__ = "Zirui Guo"
__url__ = "https://github.com/HKUDS/LightRAG" __url__ = "https://github.com/HKUDS/LightRAG"

View file

@ -1 +1 @@
__api_version__ = "0222" __api_version__ = "0223"

View file

@ -0,0 +1 @@
import{e as o,c as l,g as b,k as O,h as P,j as p,l as w,m as c,n as v,t as A,o as N}from"./_baseUniq-DkG1DiI3.js";import{a_ as g,aw as _,a$ as $,b0 as E,b1 as F,b2 as x,b3 as M,b4 as y,b5 as B,b6 as T}from"./mermaid-vendor-BOzHoVUU.js";var S=/\s/;function G(n){for(var r=n.length;r--&&S.test(n.charAt(r)););return r}var H=/^\s+/;function L(n){return n&&n.slice(0,G(n)+1).replace(H,"")}var m=NaN,R=/^[-+]0x[0-9a-f]+$/i,q=/^0b[01]+$/i,z=/^0o[0-7]+$/i,C=parseInt;function K(n){if(typeof n=="number")return n;if(o(n))return m;if(g(n)){var r=typeof n.valueOf=="function"?n.valueOf():n;n=g(r)?r+"":r}if(typeof n!="string")return n===0?n:+n;n=L(n);var t=q.test(n);return t||z.test(n)?C(n.slice(2),t?2:8):R.test(n)?m:+n}var W=1/0,X=17976931348623157e292;function Y(n){if(!n)return n===0?n:0;if(n=K(n),n===W||n===-1/0){var r=n<0?-1:1;return r*X}return n===n?n:0}function D(n){var r=Y(n),t=r%1;return r===r?t?r-t:r:0}function fn(n){var r=n==null?0:n.length;return r?l(n):[]}var I=Object.prototype,J=I.hasOwnProperty,dn=_(function(n,r){n=Object(n);var t=-1,e=r.length,i=e>2?r[2]:void 0;for(i&&$(r[0],r[1],i)&&(e=1);++t<e;)for(var f=r[t],a=E(f),s=-1,d=a.length;++s<d;){var u=a[s],h=n[u];(h===void 0||F(h,I[u])&&!J.call(n,u))&&(n[u]=f[u])}return n});function un(n){var r=n==null?0:n.length;return r?n[r-1]:void 0}function Q(n){return function(r,t,e){var i=Object(r);if(!x(r)){var f=b(t);r=O(r),t=function(s){return f(i[s],s,i)}}var a=n(r,t,e);return a>-1?i[f?r[a]:a]:void 0}}var U=Math.max;function Z(n,r,t){var e=n==null?0:n.length;if(!e)return-1;var i=t==null?0:D(t);return i<0&&(i=U(e+i,0)),P(n,b(r),i)}var hn=Q(Z);function V(n,r){var t=-1,e=x(n)?Array(n.length):[];return p(n,function(i,f,a){e[++t]=r(i,f,a)}),e}function gn(n,r){var t=M(n)?w:V;return t(n,b(r))}var j=Object.prototype,k=j.hasOwnProperty;function nn(n,r){return n!=null&&k.call(n,r)}function bn(n,r){return n!=null&&c(n,r,nn)}function rn(n,r){return n<r}function tn(n,r,t){for(var e=-1,i=n.length;++e<i;){var f=n[e],a=r(f);if(a!=null&&(s===void 0?a===a&&!o(a):t(a,s)))var s=a,d=f}return d}function mn(n){return n&&n.length?tn(n,y,rn):void 0}function an(n,r,t,e){if(!g(n))return n;r=v(r,n);for(var i=-1,f=r.length,a=f-1,s=n;s!=null&&++i<f;){var d=A(r[i]),u=t;if(d==="__proto__"||d==="constructor"||d==="prototype")return n;if(i!=a){var h=s[d];u=void 0,u===void 0&&(u=g(h)?h:B(r[i+1])?[]:{})}T(s,d,u),s=s[d]}return n}function on(n,r,t){for(var e=-1,i=r.length,f={};++e<i;){var a=r[e],s=N(n,a);t(s,a)&&an(f,v(a,n),s)}return f}export{rn as a,tn as b,V as c,on as d,mn as e,fn as f,hn as g,bn as h,dn as i,D as j,un as l,gn as m,Y as t};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
import{_ as l}from"./mermaid-vendor-BOzHoVUU.js";function m(e,c){var i,t,o;e.accDescr&&((i=c.setAccDescription)==null||i.call(c,e.accDescr)),e.accTitle&&((t=c.setAccTitle)==null||t.call(c,e.accTitle)),e.title&&((o=c.setDiagramTitle)==null||o.call(c,e.title))}l(m,"populateCommonDb");export{m as p};

View file

@ -0,0 +1 @@
import{_ as n,a2 as x,j as l}from"./mermaid-vendor-BOzHoVUU.js";var c=n((a,t)=>{const e=a.append("rect");if(e.attr("x",t.x),e.attr("y",t.y),e.attr("fill",t.fill),e.attr("stroke",t.stroke),e.attr("width",t.width),e.attr("height",t.height),t.name&&e.attr("name",t.name),t.rx&&e.attr("rx",t.rx),t.ry&&e.attr("ry",t.ry),t.attrs!==void 0)for(const r in t.attrs)e.attr(r,t.attrs[r]);return t.class&&e.attr("class",t.class),e},"drawRect"),d=n((a,t)=>{const e={x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,stroke:t.stroke,class:"rect"};c(a,e).lower()},"drawBackgroundRect"),g=n((a,t)=>{const e=t.text.replace(x," "),r=a.append("text");r.attr("x",t.x),r.attr("y",t.y),r.attr("class","legend"),r.style("text-anchor",t.anchor),t.class&&r.attr("class",t.class);const s=r.append("tspan");return s.attr("x",t.x+t.textMargin*2),s.text(e),r},"drawText"),h=n((a,t,e,r)=>{const s=a.append("image");s.attr("x",t),s.attr("y",e);const i=l.sanitizeUrl(r);s.attr("xlink:href",i)},"drawImage"),m=n((a,t,e,r)=>{const s=a.append("use");s.attr("x",t),s.attr("y",e);const i=l.sanitizeUrl(r);s.attr("xlink:href",`#${i}`)},"drawEmbeddedImage"),y=n(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),p=n(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj");export{d as a,p as b,m as c,c as d,h as e,g as f,y as g};

View file

@ -0,0 +1 @@
import{_ as s}from"./mermaid-vendor-BOzHoVUU.js";var t,e=(t=class{constructor(i){this.init=i,this.records=this.init()}reset(){this.records=this.init()}},s(t,"ImperativeState"),t);export{e as I};

View file

@ -0,0 +1 @@
import{_ as a,d as o}from"./mermaid-vendor-BOzHoVUU.js";var d=a((t,e)=>{let n;return e==="sandbox"&&(n=o("#i"+t)),(e==="sandbox"?o(n.nodes()[0].contentDocument.body):o("body")).select(`[id="${t}"]`)},"getDiagramElement");export{d as g};

View file

@ -0,0 +1,15 @@
import{_ as e}from"./mermaid-vendor-BOzHoVUU.js";var l=e(()=>`
/* Font Awesome icon styling - consolidated */
.label-icon {
display: inline-block;
height: 1em;
overflow: visible;
vertical-align: -0.125em;
}
.node .label-icon path {
fill: currentColor;
stroke: revert;
stroke-width: revert;
}
`,"getIconStyles");export{l as g};

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
import{_ as a,e as w,l as x}from"./mermaid-vendor-BOzHoVUU.js";var d=a((e,t,i,o)=>{e.attr("class",i);const{width:r,height:h,x:n,y:c}=u(e,t);w(e,h,r,o);const s=l(n,c,r,h,t);e.attr("viewBox",s),x.debug(`viewBox configured: ${s} with padding: ${t}`)},"setupViewPortForSVG"),u=a((e,t)=>{var o;const i=((o=e.node())==null?void 0:o.getBBox())||{width:0,height:0,x:0,y:0};return{width:i.width+t*2,height:i.height+t*2,x:i.x,y:i.y}},"calculateDimensionsWithPadding"),l=a((e,t,i,o,r)=>`${e-r} ${t-r} ${i} ${o}`,"createViewBox");export{d as s};

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
import{s as a,c as s,a as e,C as t}from"./chunk-SZ463SBG-CsKBHaWY.js";import{_ as i}from"./mermaid-vendor-BOzHoVUU.js";import"./chunk-E2GYISFI-Bj4t4I37.js";import"./chunk-BFAMUDN2-CmfJj-4x.js";import"./chunk-SKB7J2MH-Bl1qvyQL.js";import"./feature-graph-bahMe5Gt.js";import"./react-vendor-DEwriMA6.js";import"./graph-vendor-B-X5JegA.js";import"./ui-vendor-CeCm8EER.js";import"./utils-vendor-BysuhMZA.js";var c={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{c as diagram};

View file

@ -0,0 +1 @@
import{s as a,c as s,a as e,C as t}from"./chunk-SZ463SBG-CsKBHaWY.js";import{_ as i}from"./mermaid-vendor-BOzHoVUU.js";import"./chunk-E2GYISFI-Bj4t4I37.js";import"./chunk-BFAMUDN2-CmfJj-4x.js";import"./chunk-SKB7J2MH-Bl1qvyQL.js";import"./feature-graph-bahMe5Gt.js";import"./react-vendor-DEwriMA6.js";import"./graph-vendor-B-X5JegA.js";import"./ui-vendor-CeCm8EER.js";import"./utils-vendor-BysuhMZA.js";var c={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{c as diagram};

View file

@ -0,0 +1 @@
import{b as r}from"./_baseUniq-DkG1DiI3.js";var e=4;function a(o){return r(o,e)}export{a as c};

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,24 @@
import{p as y}from"./chunk-353BL4L5-DshwP1ma.js";import{_ as l,s as B,g as S,t as z,q as F,a as P,b as E,F as v,K as W,e as T,z as D,G as _,H as A,l as w}from"./mermaid-vendor-BOzHoVUU.js";import{p as N}from"./treemap-75Q7IDZK-BCGfM6IV.js";import"./feature-graph-bahMe5Gt.js";import"./react-vendor-DEwriMA6.js";import"./graph-vendor-B-X5JegA.js";import"./ui-vendor-CeCm8EER.js";import"./utils-vendor-BysuhMZA.js";import"./_baseUniq-DkG1DiI3.js";import"./_basePickBy-BZlRisJu.js";import"./clone-CXHLa2LR.js";var x={packet:[]},m=structuredClone(x),L=A.packet,Y=l(()=>{const t=v({...L,..._().packet});return t.showBits&&(t.paddingY+=10),t},"getConfig"),G=l(()=>m.packet,"getPacket"),H=l(t=>{t.length>0&&m.packet.push(t)},"pushWord"),I=l(()=>{D(),m=structuredClone(x)},"clear"),u={pushWord:H,getPacket:G,getConfig:Y,clear:I,setAccTitle:E,getAccTitle:P,setDiagramTitle:F,getDiagramTitle:z,getAccDescription:S,setAccDescription:B},K=1e4,M=l(t=>{y(t,u);let e=-1,o=[],n=1;const{bitsPerRow:i}=u.getConfig();for(let{start:a,end:r,bits:c,label:f}of t.blocks){if(a!==void 0&&r!==void 0&&r<a)throw new Error(`Packet block ${a} - ${r} is invalid. End must be greater than start.`);if(a??(a=e+1),a!==e+1)throw new Error(`Packet block ${a} - ${r??a} is not contiguous. It should start from ${e+1}.`);if(c===0)throw new Error(`Packet block ${a} is invalid. Cannot have a zero bit field.`);for(r??(r=a+(c??1)-1),c??(c=r-a+1),e=r,w.debug(`Packet block ${a} - ${e} with label ${f}`);o.length<=i+1&&u.getPacket().length<K;){const[d,p]=O({start:a,end:r,bits:c,label:f},n,i);if(o.push(d),d.end+1===n*i&&(u.pushWord(o),o=[],n++),!p)break;({start:a,end:r,bits:c,label:f}=p)}}u.pushWord(o)},"populate"),O=l((t,e,o)=>{if(t.start===void 0)throw new Error("start should have been set during first phase");if(t.end===void 0)throw new Error("end should have been set during first phase");if(t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);if(t.end+1<=e*o)return[t,void 0];const n=e*o-1,i=e*o;return[{start:t.start,end:n,label:t.label,bits:n-t.start},{start:i,end:t.end,label:t.label,bits:t.end-i}]},"getNextFittingBlock"),q={parse:l(async t=>{const e=await N("packet",t);w.debug(e),M(e)},"parse")},R=l((t,e,o,n)=>{const i=n.db,a=i.getConfig(),{rowHeight:r,paddingY:c,bitWidth:f,bitsPerRow:d}=a,p=i.getPacket(),s=i.getDiagramTitle(),k=r+c,g=k*(p.length+1)-(s?0:r),b=f*d+2,h=W(e);h.attr("viewbox",`0 0 ${b} ${g}`),T(h,g,b,a.useMaxWidth);for(const[C,$]of p.entries())U(h,$,C,a);h.append("text").text(s).attr("x",b/2).attr("y",g-k/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),U=l((t,e,o,{rowHeight:n,paddingX:i,paddingY:a,bitWidth:r,bitsPerRow:c,showBits:f})=>{const d=t.append("g"),p=o*(n+a)+a;for(const s of e){const k=s.start%c*r+1,g=(s.end-s.start+1)*r-i;if(d.append("rect").attr("x",k).attr("y",p).attr("width",g).attr("height",n).attr("class","packetBlock"),d.append("text").attr("x",k+g/2).attr("y",p+n/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(s.label),!f)continue;const b=s.end===s.start,h=p-2;d.append("text").attr("x",k+(b?g/2:0)).attr("y",h).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",b?"middle":"start").text(s.start),b||d.append("text").attr("x",k+g).attr("y",h).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(s.end)}},"drawWord"),X={draw:R},j={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},J=l(({packet:t}={})=>{const e=v(j,t);return`
.packetByte {
font-size: ${e.byteFontSize};
}
.packetByte.start {
fill: ${e.startByteColor};
}
.packetByte.end {
fill: ${e.endByteColor};
}
.packetLabel {
fill: ${e.labelColor};
font-size: ${e.labelFontSize};
}
.packetTitle {
fill: ${e.titleColor};
font-size: ${e.titleFontSize};
}
.packetBlock {
stroke: ${e.blockStrokeColor};
stroke-width: ${e.blockStrokeWidth};
fill: ${e.blockFillColor};
}
`},"styles"),lt={parser:q,db:u,renderer:X,styles:J};export{lt as diagram};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,2 @@
import{_ as e,l as o,K as i,e as n,L as p}from"./mermaid-vendor-BOzHoVUU.js";import{p as m}from"./treemap-75Q7IDZK-BCGfM6IV.js";import"./feature-graph-bahMe5Gt.js";import"./react-vendor-DEwriMA6.js";import"./graph-vendor-B-X5JegA.js";import"./ui-vendor-CeCm8EER.js";import"./utils-vendor-BysuhMZA.js";import"./_baseUniq-DkG1DiI3.js";import"./_basePickBy-BZlRisJu.js";import"./clone-CXHLa2LR.js";var g={parse:e(async r=>{const a=await m("info",r);o.debug(a)},"parse")},v={version:p.version+""},d=e(()=>v.version,"getVersion"),c={getVersion:d},l=e((r,a,s)=>{o.debug(`rendering info diagram
`+r);const t=i(a);n(t,100,400,!0),t.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${s}`)},"draw"),f={draw:l},L={parser:g,db:c,renderer:f};export{L as diagram};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,30 @@
import{p as N}from"./chunk-353BL4L5-DshwP1ma.js";import{_ as i,g as B,s as U,a as q,b as H,t as K,q as V,l as C,c as Z,F as j,K as J,M as Q,N as z,O as X,e as Y,z as tt,P as et,H as at}from"./mermaid-vendor-BOzHoVUU.js";import{p as rt}from"./treemap-75Q7IDZK-BCGfM6IV.js";import"./feature-graph-bahMe5Gt.js";import"./react-vendor-DEwriMA6.js";import"./graph-vendor-B-X5JegA.js";import"./ui-vendor-CeCm8EER.js";import"./utils-vendor-BysuhMZA.js";import"./_baseUniq-DkG1DiI3.js";import"./_basePickBy-BZlRisJu.js";import"./clone-CXHLa2LR.js";var it=at.pie,D={sections:new Map,showData:!1},f=D.sections,w=D.showData,st=structuredClone(it),ot=i(()=>structuredClone(st),"getConfig"),nt=i(()=>{f=new Map,w=D.showData,tt()},"clear"),lt=i(({label:t,value:a})=>{f.has(t)||(f.set(t,a),C.debug(`added new section: ${t}, with value: ${a}`))},"addSection"),ct=i(()=>f,"getSections"),pt=i(t=>{w=t},"setShowData"),dt=i(()=>w,"getShowData"),F={getConfig:ot,clear:nt,setDiagramTitle:V,getDiagramTitle:K,setAccTitle:H,getAccTitle:q,setAccDescription:U,getAccDescription:B,addSection:lt,getSections:ct,setShowData:pt,getShowData:dt},gt=i((t,a)=>{N(t,a),a.setShowData(t.showData),t.sections.map(a.addSection)},"populateDb"),ut={parse:i(async t=>{const a=await rt("pie",t);C.debug(a),gt(a,F)},"parse")},mt=i(t=>`
.pieCircle{
stroke: ${t.pieStrokeColor};
stroke-width : ${t.pieStrokeWidth};
opacity : ${t.pieOpacity};
}
.pieOuterCircle{
stroke: ${t.pieOuterStrokeColor};
stroke-width: ${t.pieOuterStrokeWidth};
fill: none;
}
.pieTitleText {
text-anchor: middle;
font-size: ${t.pieTitleTextSize};
fill: ${t.pieTitleTextColor};
font-family: ${t.fontFamily};
}
.slice {
font-family: ${t.fontFamily};
fill: ${t.pieSectionTextColor};
font-size:${t.pieSectionTextSize};
// fill: white;
}
.legend text {
fill: ${t.pieLegendTextColor};
font-family: ${t.fontFamily};
font-size: ${t.pieLegendTextSize};
}
`,"getStyles"),ft=mt,ht=i(t=>{const a=[...t.entries()].map(s=>({label:s[0],value:s[1]})).sort((s,n)=>n.value-s.value);return et().value(s=>s.value)(a)},"createPieArcs"),St=i((t,a,G,s)=>{C.debug(`rendering pie chart
`+t);const n=s.db,y=Z(),T=j(n.getConfig(),y.pie),$=40,o=18,d=4,c=450,h=c,S=J(a),l=S.append("g");l.attr("transform","translate("+h/2+","+c/2+")");const{themeVariables:r}=y;let[A]=Q(r.pieOuterStrokeWidth);A??(A=2);const _=T.textPosition,g=Math.min(h,c)/2-$,M=z().innerRadius(0).outerRadius(g),O=z().innerRadius(g*_).outerRadius(g*_);l.append("circle").attr("cx",0).attr("cy",0).attr("r",g+A/2).attr("class","pieOuterCircle");const b=n.getSections(),v=ht(b),P=[r.pie1,r.pie2,r.pie3,r.pie4,r.pie5,r.pie6,r.pie7,r.pie8,r.pie9,r.pie10,r.pie11,r.pie12],p=X(P);l.selectAll("mySlices").data(v).enter().append("path").attr("d",M).attr("fill",e=>p(e.data.label)).attr("class","pieCircle");let E=0;b.forEach(e=>{E+=e}),l.selectAll("mySlices").data(v).enter().append("text").text(e=>(e.data.value/E*100).toFixed(0)+"%").attr("transform",e=>"translate("+O.centroid(e)+")").style("text-anchor","middle").attr("class","slice"),l.append("text").text(n.getDiagramTitle()).attr("x",0).attr("y",-400/2).attr("class","pieTitleText");const x=l.selectAll(".legend").data(p.domain()).enter().append("g").attr("class","legend").attr("transform",(e,u)=>{const m=o+d,R=m*p.domain().length/2,I=12*o,L=u*m-R;return"translate("+I+","+L+")"});x.append("rect").attr("width",o).attr("height",o).style("fill",p).style("stroke",p),x.data(v).append("text").attr("x",o+d).attr("y",o-d).text(e=>{const{label:u,value:m}=e.data;return n.getShowData()?`${u} [${m}]`:u});const W=Math.max(...x.selectAll("text").nodes().map(e=>(e==null?void 0:e.getBoundingClientRect().width)??0)),k=h+$+o+d+W;S.attr("viewBox",`0 0 ${k} ${c}`),Y(S,c,k,T.useMaxWidth)},"draw"),vt={draw:St},kt={parser:ut,db:F,renderer:vt,styles:ft};export{kt as diagram};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
import{s as r,b as e,a,S as i}from"./chunk-OW32GOEJ-Cv4eoNWH.js";import{_ as s}from"./mermaid-vendor-BOzHoVUU.js";import"./chunk-BFAMUDN2-CmfJj-4x.js";import"./chunk-SKB7J2MH-Bl1qvyQL.js";import"./feature-graph-bahMe5Gt.js";import"./react-vendor-DEwriMA6.js";import"./graph-vendor-B-X5JegA.js";import"./ui-vendor-CeCm8EER.js";import"./utils-vendor-BysuhMZA.js";var f={parser:a,get db(){return new i(2)},renderer:e,styles:r,init:s(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{f as diagram};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -8,20 +8,21 @@
<link rel="icon" type="image/png" href="favicon.png" /> <link rel="icon" type="image/png" href="favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Lightrag</title> <title>Lightrag</title>
<script type="module" crossorigin src="/webui/assets/index-oYZPo1xP.js"></script> <script type="module" crossorigin src="/webui/assets/index-oYZPo1xP.js"></script>
<link rel="modulepreload" crossorigin href="/webui/assets/react-vendor-DEwriMA6.js"> <link rel="modulepreload" crossorigin href="/webui/assets/react-vendor-DEwriMA6.js">
<link rel="modulepreload" crossorigin href="/webui/assets/ui-vendor-CeCm8EER.js"> <link rel="modulepreload" crossorigin href="/webui/assets/ui-vendor-CeCm8EER.js">
<link rel="modulepreload" crossorigin href="/webui/assets/graph-vendor-B-X5JegA.js"> <link rel="modulepreload" crossorigin href="/webui/assets/graph-vendor-B-X5JegA.js">
<link rel="modulepreload" crossorigin href="/webui/assets/utils-vendor-BysuhMZA.js"> <link rel="modulepreload" crossorigin href="/webui/assets/utils-vendor-BysuhMZA.js">
<link rel="modulepreload" crossorigin href="/webui/assets/feature-graph-xUsMo1iK.js"> <link rel="modulepreload" crossorigin href="/webui/assets/feature-graph-xUsMo1iK.js">
<link rel="modulepreload" crossorigin href="/webui/assets/feature-documents-22OwnQq9.js"> <link rel="modulepreload" crossorigin href="/webui/assets/feature-documents-22OwnQq9.js">
<link rel="modulepreload" crossorigin href="/webui/assets/mermaid-vendor-CpW20EHd.js"> <link rel="modulepreload" crossorigin href="/webui/assets/mermaid-vendor-CpW20EHd.js">
<link rel="modulepreload" crossorigin href="/webui/assets/markdown-vendor-C1oKx5V8.js"> <link rel="modulepreload" crossorigin href="/webui/assets/markdown-vendor-C1oKx5V8.js">
<link rel="modulepreload" crossorigin href="/webui/assets/feature-retrieval-CeceOXFg.js"> <link rel="modulepreload" crossorigin href="/webui/assets/feature-retrieval-CeceOXFg.js">
<link rel="stylesheet" crossorigin href="/webui/assets/feature-graph-BipNuM18.css"> <link rel="stylesheet" crossorigin href="/webui/assets/feature-graph-BipNuM18.css">
<link rel="stylesheet" crossorigin href="/webui/assets/index-CEupRNOQ.css"> <link rel="stylesheet" crossorigin href="/webui/assets/index-CEupRNOQ.css">
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>
</body> </body>
</html> </html>

View file

@ -2207,7 +2207,12 @@ async def extract_entities(
async def _process_with_semaphore(chunk): async def _process_with_semaphore(chunk):
async with semaphore: async with semaphore:
return await _process_single_content(chunk) try:
return await _process_single_content(chunk)
except Exception as e:
chunk_id = chunk[0] # Extract chunk_id from chunk[0]
prefixed_exception = create_prefixed_exception(e, chunk_id)
raise prefixed_exception from e
tasks = [] tasks = []
for c in ordered_chunks: for c in ordered_chunks:
@ -2245,7 +2250,7 @@ async def extract_entities(
await asyncio.wait(pending) await asyncio.wait(pending)
# Add progress prefix to the exception message # Add progress prefix to the exception message
progress_prefix = f"Chunks[{processed_chunks+1}/{total_chunks}]" progress_prefix = f"C[{processed_chunks+1}/{total_chunks}]"
# Re-raise the original exception with a prefix # Re-raise the original exception with a prefix
prefixed_exception = create_prefixed_exception(first_exception, progress_prefix) prefixed_exception = create_prefixed_exception(first_exception, progress_prefix)

View file

@ -244,6 +244,26 @@ export default function DocumentManager() {
const [selectedDocIds, setSelectedDocIds] = useState<string[]>([]) const [selectedDocIds, setSelectedDocIds] = useState<string[]>([])
const isSelectionMode = selectedDocIds.length > 0 const isSelectionMode = selectedDocIds.length > 0
// Add refs to track previous pipelineBusy state and current interval
const prevPipelineBusyRef = useRef<boolean | undefined>(undefined);
const pollingIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);
// Add retry mechanism state
const [retryState, setRetryState] = useState({
count: 0,
lastError: null as Error | null,
isBackingOff: false
});
// Add circuit breaker state
const [circuitBreakerState, setCircuitBreakerState] = useState({
isOpen: false,
failureCount: 0,
lastFailureTime: null as number | null,
nextRetryTime: null as number | null
});
// Handle checkbox change for individual documents // Handle checkbox change for individual documents
const handleDocumentSelect = useCallback((docId: string, checked: boolean) => { const handleDocumentSelect = useCallback((docId: string, checked: boolean) => {
setSelectedDocIds(prev => { setSelectedDocIds(prev => {
@ -533,6 +553,98 @@ export default function DocumentManager() {
setDocs(response.pagination.total_count > 0 ? legacyDocs : null); setDocs(response.pagination.total_count > 0 ? legacyDocs : null);
}, []); }, []);
// Utility function to create timeout wrapper for API calls
const withTimeout = useCallback((
promise: Promise<any>,
timeoutMs: number = 30000,
errorMsg: string = 'Request timeout'
): Promise<any> => {
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => reject(new Error(errorMsg)), timeoutMs)
});
return Promise.race([promise, timeoutPromise]);
}, []);
// Enhanced error classification
const classifyError = useCallback((error: any) => {
if (error.name === 'AbortError') {
return { type: 'cancelled', shouldRetry: false, shouldShowToast: false };
}
if (error.message === 'Request timeout') {
return { type: 'timeout', shouldRetry: true, shouldShowToast: true };
}
if (error.message?.includes('Network Error') || error.code === 'NETWORK_ERROR') {
return { type: 'network', shouldRetry: true, shouldShowToast: true };
}
if (error.status >= 500) {
return { type: 'server', shouldRetry: true, shouldShowToast: true };
}
if (error.status >= 400 && error.status < 500) {
return { type: 'client', shouldRetry: false, shouldShowToast: true };
}
return { type: 'unknown', shouldRetry: true, shouldShowToast: true };
}, []);
// Circuit breaker utility functions
const isCircuitBreakerOpen = useCallback(() => {
if (!circuitBreakerState.isOpen) return false;
const now = Date.now();
if (circuitBreakerState.nextRetryTime && now >= circuitBreakerState.nextRetryTime) {
// Reset circuit breaker to half-open state
setCircuitBreakerState(prev => ({
...prev,
isOpen: false,
failureCount: Math.max(0, prev.failureCount - 1)
}));
return false;
}
return true;
}, [circuitBreakerState]);
const recordFailure = useCallback((error: Error) => {
const now = Date.now();
setCircuitBreakerState(prev => {
const newFailureCount = prev.failureCount + 1;
const shouldOpen = newFailureCount >= 3; // Open after 3 failures
return {
isOpen: shouldOpen,
failureCount: newFailureCount,
lastFailureTime: now,
nextRetryTime: shouldOpen ? now + (Math.pow(2, newFailureCount) * 1000) : null
};
});
setRetryState(prev => ({
count: prev.count + 1,
lastError: error,
isBackingOff: true
}));
}, []);
const recordSuccess = useCallback(() => {
setCircuitBreakerState({
isOpen: false,
failureCount: 0,
lastFailureTime: null,
nextRetryTime: null
});
setRetryState({
count: 0,
lastError: null,
isBackingOff: false
});
}, []);
// Intelligent refresh function: handles all boundary cases // Intelligent refresh function: handles all boundary cases
const handleIntelligentRefresh = useCallback(async ( const handleIntelligentRefresh = useCallback(async (
targetPage?: number, // Optional target page, defaults to current page targetPage?: number, // Optional target page, defaults to current page
@ -554,7 +666,12 @@ export default function DocumentManager() {
sort_direction: sortDirection sort_direction: sortDirection
}; };
const response = await getDocumentsPaginated(request); // Use timeout wrapper for the API call
const response = await withTimeout(
getDocumentsPaginated(request),
30000, // 30 second timeout
'Document fetch timeout'
);
if (!isMountedRef.current) return; if (!isMountedRef.current) return;
@ -570,7 +687,11 @@ export default function DocumentManager() {
page: lastPage page: lastPage
}; };
const lastPageResponse = await getDocumentsPaginated(lastPageRequest); const lastPageResponse = await withTimeout(
getDocumentsPaginated(lastPageRequest),
30000,
'Document fetch timeout'
);
if (!isMountedRef.current) return; if (!isMountedRef.current) return;
@ -589,14 +710,22 @@ export default function DocumentManager() {
} catch (err) { } catch (err) {
if (isMountedRef.current) { if (isMountedRef.current) {
toast.error(t('documentPanel.documentManager.errors.loadFailed', { error: errorMessage(err) })); const errorClassification = classifyError(err);
if (errorClassification.shouldShowToast) {
toast.error(t('documentPanel.documentManager.errors.loadFailed', { error: errorMessage(err) }));
}
if (errorClassification.shouldRetry) {
recordFailure(err as Error);
}
} }
} finally { } finally {
if (isMountedRef.current) { if (isMountedRef.current) {
setIsRefreshing(false); setIsRefreshing(false);
} }
} }
}, [statusFilter, pagination.page, pagination.page_size, sortField, sortDirection, t, updateComponentState]); }, [statusFilter, pagination.page, pagination.page_size, sortField, sortDirection, t, updateComponentState, withTimeout, classifyError, recordFailure]);
// New paginated data fetching function // New paginated data fetching function
const fetchPaginatedDocuments = useCallback(async ( const fetchPaginatedDocuments = useCallback(async (
@ -616,10 +745,6 @@ export default function DocumentManager() {
await fetchPaginatedDocuments(pagination.page, pagination.page_size, statusFilter); await fetchPaginatedDocuments(pagination.page, pagination.page_size, statusFilter);
}, [fetchPaginatedDocuments, pagination.page, pagination.page_size, statusFilter]); }, [fetchPaginatedDocuments, pagination.page, pagination.page_size, statusFilter]);
// Add refs to track previous pipelineBusy state and current interval
const prevPipelineBusyRef = useRef<boolean | undefined>(undefined);
const pollingIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);
// Function to clear current polling interval // Function to clear current polling interval
const clearPollingInterval = useCallback(() => { const clearPollingInterval = useCallback(() => {
if (pollingIntervalRef.current) { if (pollingIntervalRef.current) {
@ -634,18 +759,49 @@ export default function DocumentManager() {
pollingIntervalRef.current = setInterval(async () => { pollingIntervalRef.current = setInterval(async () => {
try { try {
// Check circuit breaker before making request
if (isCircuitBreakerOpen()) {
return; // Skip this polling cycle
}
// Only perform fetch if component is still mounted // Only perform fetch if component is still mounted
if (isMountedRef.current) { if (isMountedRef.current) {
await fetchDocuments() await fetchDocuments();
recordSuccess(); // Record successful operation
} }
} catch (err) { } catch (err) {
// Only show error if component is still mounted // Only handle error if component is still mounted
if (isMountedRef.current) { if (isMountedRef.current) {
toast.error(t('documentPanel.documentManager.errors.scanProgressFailed', { error: errorMessage(err) })) const errorClassification = classifyError(err);
// Always reset isRefreshing state on error
setIsRefreshing(false);
if (errorClassification.shouldShowToast) {
toast.error(t('documentPanel.documentManager.errors.scanProgressFailed', { error: errorMessage(err) }));
}
if (errorClassification.shouldRetry) {
recordFailure(err as Error);
// Implement exponential backoff for retries
const backoffDelay = Math.min(Math.pow(2, retryState.count) * 1000, 30000); // Max 30s
if (retryState.count < 3) { // Max 3 retries
setTimeout(() => {
if (isMountedRef.current) {
setRetryState(prev => ({ ...prev, isBackingOff: false }));
}
}, backoffDelay);
}
} else {
// For non-retryable errors, stop polling
clearPollingInterval();
}
} }
} }
}, intervalMs); }, intervalMs);
}, [fetchDocuments, t, clearPollingInterval]); }, [fetchDocuments, t, clearPollingInterval, isCircuitBreakerOpen, recordSuccess, recordFailure, classifyError, retryState.count]);
const scanDocuments = useCallback(async () => { const scanDocuments = useCallback(async () => {
try { try {

View file

@ -23,12 +23,13 @@ import LegendButton from '@/components/graph/LegendButton'
import { useSettingsStore } from '@/stores/settings' import { useSettingsStore } from '@/stores/settings'
import { useGraphStore } from '@/stores/graph' import { useGraphStore } from '@/stores/graph'
import { labelColorDarkTheme, labelColorLightTheme } from '@/lib/constants'
import '@react-sigma/core/lib/style.css' import '@react-sigma/core/lib/style.css'
import '@react-sigma/graph-search/lib/style.css' import '@react-sigma/graph-search/lib/style.css'
// Sigma settings // Function to create sigma settings based on theme
const defaultSigmaSettings: Partial<SigmaSettings> = { const createSigmaSettings = (isDarkTheme: boolean): Partial<SigmaSettings> => ({
allowInvalidContainer: true, allowInvalidContainer: true,
defaultNodeType: 'default', defaultNodeType: 'default',
defaultEdgeType: 'curvedNoArrow', defaultEdgeType: 'curvedNoArrow',
@ -47,18 +48,18 @@ const defaultSigmaSettings: Partial<SigmaSettings> = {
labelRenderedSizeThreshold: 12, labelRenderedSizeThreshold: 12,
enableEdgeEvents: true, enableEdgeEvents: true,
labelColor: { labelColor: {
color: '#000', color: isDarkTheme ? labelColorDarkTheme : labelColorLightTheme,
attribute: 'labelColor' attribute: 'labelColor'
}, },
edgeLabelColor: { edgeLabelColor: {
color: '#000', color: isDarkTheme ? labelColorDarkTheme : labelColorLightTheme,
attribute: 'labelColor' attribute: 'labelColor'
}, },
edgeLabelSize: 8, edgeLabelSize: 8,
labelSize: 12 labelSize: 12
// minEdgeThickness: 2 // minEdgeThickness: 2
// labelFont: 'Lato, sans-serif' // labelFont: 'Lato, sans-serif'
} })
const GraphEvents = () => { const GraphEvents = () => {
const registerEvents = useRegisterEvents() const registerEvents = useRegisterEvents()
@ -107,7 +108,7 @@ const GraphEvents = () => {
} }
const GraphViewer = () => { const GraphViewer = () => {
const [sigmaSettings, setSigmaSettings] = useState(defaultSigmaSettings) const [sigmaSettings, setSigmaSettings] = useState<Partial<SigmaSettings>>({})
const sigmaRef = useRef<any>(null) const sigmaRef = useRef<any>(null)
const selectedNode = useGraphStore.use.selectedNode() const selectedNode = useGraphStore.use.selectedNode()
@ -119,13 +120,15 @@ const GraphViewer = () => {
const showNodeSearchBar = useSettingsStore.use.showNodeSearchBar() const showNodeSearchBar = useSettingsStore.use.showNodeSearchBar()
const enableNodeDrag = useSettingsStore.use.enableNodeDrag() const enableNodeDrag = useSettingsStore.use.enableNodeDrag()
const showLegend = useSettingsStore.use.showLegend() const showLegend = useSettingsStore.use.showLegend()
const theme = useSettingsStore.use.theme()
// Initialize sigma settings once on component mount // Initialize sigma settings based on theme
// All dynamic settings will be updated in GraphControl using useSetSettings
useEffect(() => { useEffect(() => {
setSigmaSettings(defaultSigmaSettings) const isDarkTheme = theme === 'dark'
console.log('Initialized sigma settings') const settings = createSigmaSettings(isDarkTheme)
}, []) setSigmaSettings(settings)
console.log('Initialized sigma settings for theme:', theme)
}, [theme])
// Clean up sigma instance when component unmounts // Clean up sigma instance when component unmounts
useEffect(() => { useEffect(() => {

View file

@ -6,6 +6,7 @@ export const webuiPrefix = '/webui/'
export const controlButtonVariant: ButtonVariantType = 'ghost' export const controlButtonVariant: ButtonVariantType = 'ghost'
export const labelColorDarkTheme = '#B2EBF2' export const labelColorDarkTheme = '#B2EBF2'
export const labelColorLightTheme = '#000'
export const LabelColorHighlightedDarkTheme = '#000' export const LabelColorHighlightedDarkTheme = '#000'
export const nodeColorDisabled = '#E2E2E2' export const nodeColorDisabled = '#E2E2E2'