@pcircle/memesh 3.2.0 → 4.0.0
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/README.de.md +28 -7
- package/README.es.md +28 -7
- package/README.fr.md +28 -7
- package/README.ja.md +28 -7
- package/README.ko.md +28 -7
- package/README.md +47 -14
- package/README.pt.md +28 -7
- package/README.th.md +28 -7
- package/README.vi.md +28 -7
- package/README.zh-CN.md +28 -7
- package/README.zh-TW.md +28 -7
- package/dashboard/dist/index.html +12 -3
- package/dist/core/auto-tagger.d.ts +5 -0
- package/dist/core/auto-tagger.d.ts.map +1 -0
- package/dist/core/auto-tagger.js +99 -0
- package/dist/core/auto-tagger.js.map +1 -0
- package/dist/core/config.d.ts +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +29 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/embedder.d.ts +1 -0
- package/dist/core/embedder.d.ts.map +1 -1
- package/dist/core/embedder.js +120 -47
- package/dist/core/embedder.js.map +1 -1
- package/dist/core/lifecycle.d.ts +7 -0
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +91 -0
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/operations.d.ts +1 -0
- package/dist/core/operations.d.ts.map +1 -1
- package/dist/core/operations.js +9 -0
- package/dist/core/operations.js.map +1 -1
- package/dist/core/patterns.d.ts +39 -0
- package/dist/core/patterns.d.ts.map +1 -0
- package/dist/core/patterns.js +109 -0
- package/dist/core/patterns.js.map +1 -0
- package/dist/core/schema-export.d.ts.map +1 -1
- package/dist/core/schema-export.js +17 -0
- package/dist/core/schema-export.js.map +1 -1
- package/dist/core/scoring.d.ts +6 -0
- package/dist/core/scoring.d.ts.map +1 -1
- package/dist/core/scoring.js +8 -3
- package/dist/core/scoring.js.map +1 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +29 -2
- package/dist/db.js.map +1 -1
- package/dist/transports/http/server.d.ts.map +1 -1
- package/dist/transports/http/server.js +141 -1
- package/dist/transports/http/server.js.map +1 -1
- package/dist/transports/mcp/handlers.d.ts +17 -0
- package/dist/transports/mcp/handlers.d.ts.map +1 -1
- package/dist/transports/mcp/handlers.js +91 -1
- package/dist/transports/mcp/handlers.js.map +1 -1
- package/dist/transports/schemas.d.ts +10 -0
- package/dist/transports/schemas.d.ts.map +1 -1
- package/dist/transports/schemas.js +4 -0
- package/dist/transports/schemas.js.map +1 -1
- package/hooks/hooks.json +12 -0
- package/package.json +4 -1
- package/plugin.json +1 -1
- package/scripts/hooks/pre-edit-recall.js +163 -0
- package/scripts/hooks/session-start.js +52 -2
- package/scripts/hooks/session-summary.js +44 -1
- package/skills/memesh/SKILL.md +110 -52
- package/skills/memesh-review/SKILL.md +69 -26
|
@@ -6,9 +6,18 @@
|
|
|
6
6
|
<title>MeMesh LLM Memory — Dashboard</title>
|
|
7
7
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
8
8
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
9
|
-
<link href="https://
|
|
10
|
-
<script type="module" crossorigin>(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))a(i);new MutationObserver(i=>{for(const r of i)if(r.type==="childList")for(const o of r.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&a(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const r={};return i.integrity&&(r.integrity=i.integrity),i.referrerPolicy&&(r.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?r.credentials="include":i.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function a(i){if(i.ep)return;i.ep=!0;const r=n(i);fetch(i.href,r)}})();var he,C,je,H,Ee,qe,Ye,ge,ne,X,Ve,xe,pe,fe,oe={},ce=[],ht=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,ue=Array.isArray;function D(e,t){for(var n in t)e[n]=t[n];return e}function ke(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function ut(e,t,n){var a,i,r,o={};for(r in t)r=="key"?a=t[r]:r=="ref"?i=t[r]:o[r]=t[r];if(arguments.length>2&&(o.children=arguments.length>3?he.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(r in e.defaultProps)o[r]===void 0&&(o[r]=e.defaultProps[r]);return re(e,o,a,i,null)}function re(e,t,n,a,i){var r={type:e,props:t,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:i??++je,__i:-1,__u:0};return i==null&&C.vnode!=null&&C.vnode(r),r}function G(e){return e.children}function ie(e,t){this.props=e,this.context=t}function j(e,t){if(t==null)return e.__?j(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type=="function"?j(e):null}function gt(e){if(e.__P&&e.__d){var t=e.__v,n=t.__e,a=[],i=[],r=D({},t);r.__v=t.__v+1,C.vnode&&C.vnode(r),Me(e.__P,r,t,e.__n,e.__P.namespaceURI,32&t.__u?[n]:null,a,n??j(t),!!(32&t.__u),i),r.__v=t.__v,r.__.__k[r.__i]=r,Ze(a,r,i),t.__e=t.__=null,r.__e!=n&&Qe(r)}}function Qe(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),Qe(e)}function Pe(e){(!e.__d&&(e.__d=!0)&&H.push(e)&&!le.__r++||Ee!=C.debounceRendering)&&((Ee=C.debounceRendering)||qe)(le)}function le(){try{for(var e,t=1;H.length;)H.length>t&&H.sort(Ye),e=H.shift(),t=H.length,gt(e)}finally{H.length=le.__r=0}}function Xe(e,t,n,a,i,r,o,d,_,l,m){var c,p,h,b,x,v,k,M=a&&a.__k||ce,y=t.length;for(_=_t(n,t,M,_,y),c=0;c<y;c++)(h=n.__k[c])!=null&&(p=h.__i!=-1&&M[h.__i]||oe,h.__i=c,v=Me(e,h,p,i,r,o,d,_,l,m),b=h.__e,h.ref&&p.ref!=h.ref&&(p.ref&&Le(p.ref,null,h),m.push(h.ref,h.__c||b,h)),x==null&&b!=null&&(x=b),(k=!!(4&h.__u))||p.__k===h.__k?(_=Je(h,_,e,k),k&&p.__e&&(p.__e=null)):typeof h.type=="function"&&v!==void 0?_=v:b&&(_=b.nextSibling),h.__u&=-7);return n.__e=x,_}function _t(e,t,n,a,i){var r,o,d,_,l,m=n.length,c=m,p=0;for(e.__k=new Array(i),r=0;r<i;r++)(o=t[r])!=null&&typeof o!="boolean"&&typeof o!="function"?(typeof o=="string"||typeof o=="number"||typeof o=="bigint"||o.constructor==String?o=e.__k[r]=re(null,o,null,null,null):ue(o)?o=e.__k[r]=re(G,{children:o},null,null,null):o.constructor===void 0&&o.__b>0?o=e.__k[r]=re(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):e.__k[r]=o,_=r+p,o.__=e,o.__b=e.__b+1,d=null,(l=o.__i=mt(o,n,_,c))!=-1&&(c--,(d=n[l])&&(d.__u|=2)),d==null||d.__v==null?(l==-1&&(i>m?p--:i<m&&p++),typeof o.type!="function"&&(o.__u|=4)):l!=_&&(l==_-1?p--:l==_+1?p++:(l>_?p--:p++,o.__u|=4))):e.__k[r]=null;if(c)for(r=0;r<m;r++)(d=n[r])!=null&&(2&d.__u)==0&&(d.__e==a&&(a=j(d)),tt(d,d));return a}function Je(e,t,n,a){var i,r;if(typeof e.type=="function"){for(i=e.__k,r=0;i&&r<i.length;r++)i[r]&&(i[r].__=e,t=Je(i[r],t,n,a));return t}e.__e!=t&&(a&&(t&&e.type&&!t.parentNode&&(t=j(e)),n.insertBefore(e.__e,t||null)),t=e.__e);do t=t&&t.nextSibling;while(t!=null&&t.nodeType==8);return t}function mt(e,t,n,a){var i,r,o,d=e.key,_=e.type,l=t[n],m=l!=null&&(2&l.__u)==0;if(l===null&&d==null||m&&d==l.key&&_==l.type)return n;if(a>(m?1:0)){for(i=n-1,r=n+1;i>=0||r<t.length;)if((l=t[o=i>=0?i--:r++])!=null&&(2&l.__u)==0&&d==l.key&&_==l.type)return o}return-1}function Re(e,t,n){t[0]=="-"?e.setProperty(t,n??""):e[t]=n==null?"":typeof n!="number"||ht.test(t)?n:n+"px"}function se(e,t,n,a,i){var r,o;e:if(t=="style")if(typeof n=="string")e.style.cssText=n;else{if(typeof a=="string"&&(e.style.cssText=a=""),a)for(t in a)n&&t in n||Re(e.style,t,"");if(n)for(t in n)a&&n[t]==a[t]||Re(e.style,t,n[t])}else if(t[0]=="o"&&t[1]=="n")r=t!=(t=t.replace(Ve,"$1")),o=t.toLowerCase(),t=o in e||t=="onFocusOut"||t=="onFocusIn"?o.slice(2):t.slice(2),e.l||(e.l={}),e.l[t+r]=n,n?a?n[X]=a[X]:(n[X]=xe,e.addEventListener(t,r?fe:pe,r)):e.removeEventListener(t,r?fe:pe,r);else{if(i=="http://www.w3.org/2000/svg")t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(t!="width"&&t!="height"&&t!="href"&&t!="list"&&t!="form"&&t!="tabIndex"&&t!="download"&&t!="rowSpan"&&t!="colSpan"&&t!="role"&&t!="popover"&&t in e)try{e[t]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&t[4]!="-"?e.removeAttribute(t):e.setAttribute(t,t=="popover"&&n==1?"":n))}}function Be(e){return function(t){if(this.l){var n=this.l[t.type+e];if(t[ne]==null)t[ne]=xe++;else if(t[ne]<n[X])return;return n(C.event?C.event(t):t)}}}function Me(e,t,n,a,i,r,o,d,_,l){var m,c,p,h,b,x,v,k,M,y,g,w,B,N,A,I=t.type;if(t.constructor!==void 0)return null;128&n.__u&&(_=!!(32&n.__u),r=[d=t.__e=n.__e]),(m=C.__b)&&m(t);e:if(typeof I=="function")try{if(k=t.props,M=I.prototype&&I.prototype.render,y=(m=I.contextType)&&a[m.__c],g=m?y?y.props.value:m.__:a,n.__c?v=(c=t.__c=n.__c).__=c.__E:(M?t.__c=c=new I(k,g):(t.__c=c=new ie(k,g),c.constructor=I,c.render=pt),y&&y.sub(c),c.state||(c.state={}),c.__n=a,p=c.__d=!0,c.__h=[],c._sb=[]),M&&c.__s==null&&(c.__s=c.state),M&&I.getDerivedStateFromProps!=null&&(c.__s==c.state&&(c.__s=D({},c.__s)),D(c.__s,I.getDerivedStateFromProps(k,c.__s))),h=c.props,b=c.state,c.__v=t,p)M&&I.getDerivedStateFromProps==null&&c.componentWillMount!=null&&c.componentWillMount(),M&&c.componentDidMount!=null&&c.__h.push(c.componentDidMount);else{if(M&&I.getDerivedStateFromProps==null&&k!==h&&c.componentWillReceiveProps!=null&&c.componentWillReceiveProps(k,g),t.__v==n.__v||!c.__e&&c.shouldComponentUpdate!=null&&c.shouldComponentUpdate(k,c.__s,g)===!1){t.__v!=n.__v&&(c.props=k,c.state=c.__s,c.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.some(function(z){z&&(z.__=t)}),ce.push.apply(c.__h,c._sb),c._sb=[],c.__h.length&&o.push(c);break e}c.componentWillUpdate!=null&&c.componentWillUpdate(k,c.__s,g),M&&c.componentDidUpdate!=null&&c.__h.push(function(){c.componentDidUpdate(h,b,x)})}if(c.context=g,c.props=k,c.__P=e,c.__e=!1,w=C.__r,B=0,M)c.state=c.__s,c.__d=!1,w&&w(t),m=c.render(c.props,c.state,c.context),ce.push.apply(c.__h,c._sb),c._sb=[];else do c.__d=!1,w&&w(t),m=c.render(c.props,c.state,c.context),c.state=c.__s;while(c.__d&&++B<25);c.state=c.__s,c.getChildContext!=null&&(a=D(D({},a),c.getChildContext())),M&&!p&&c.getSnapshotBeforeUpdate!=null&&(x=c.getSnapshotBeforeUpdate(h,b)),N=m!=null&&m.type===G&&m.key==null?et(m.props.children):m,d=Xe(e,ue(N)?N:[N],t,n,a,i,r,o,d,_,l),c.base=t.__e,t.__u&=-161,c.__h.length&&o.push(c),v&&(c.__E=c.__=null)}catch(z){if(t.__v=null,_||r!=null)if(z.then){for(t.__u|=_?160:128;d&&d.nodeType==8&&d.nextSibling;)d=d.nextSibling;r[r.indexOf(d)]=null,t.__e=d}else{for(A=r.length;A--;)ke(r[A]);be(t)}else t.__e=n.__e,t.__k=n.__k,z.then||be(t);C.__e(z,t,n)}else r==null&&t.__v==n.__v?(t.__k=n.__k,t.__e=n.__e):d=t.__e=vt(n.__e,t,n,a,i,r,o,_,l);return(m=C.diffed)&&m(t),128&t.__u?void 0:d}function be(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(be))}function Ze(e,t,n){for(var a=0;a<n.length;a++)Le(n[a],n[++a],n[++a]);C.__c&&C.__c(t,e),e.some(function(i){try{e=i.__h,i.__h=[],e.some(function(r){r.call(i)})}catch(r){C.__e(r,i.__v)}})}function et(e){return typeof e!="object"||e==null||e.__b>0?e:ue(e)?e.map(et):D({},e)}function vt(e,t,n,a,i,r,o,d,_){var l,m,c,p,h,b,x,v=n.props||oe,k=t.props,M=t.type;if(M=="svg"?i="http://www.w3.org/2000/svg":M=="math"?i="http://www.w3.org/1998/Math/MathML":i||(i="http://www.w3.org/1999/xhtml"),r!=null){for(l=0;l<r.length;l++)if((h=r[l])&&"setAttribute"in h==!!M&&(M?h.localName==M:h.nodeType==3)){e=h,r[l]=null;break}}if(e==null){if(M==null)return document.createTextNode(k);e=document.createElementNS(i,M,k.is&&k),d&&(C.__m&&C.__m(t,r),d=!1),r=null}if(M==null)v===k||d&&e.data==k||(e.data=k);else{if(r=r&&he.call(e.childNodes),!d&&r!=null)for(v={},l=0;l<e.attributes.length;l++)v[(h=e.attributes[l]).name]=h.value;for(l in v)h=v[l],l=="dangerouslySetInnerHTML"?c=h:l=="children"||l in k||l=="value"&&"defaultValue"in k||l=="checked"&&"defaultChecked"in k||se(e,l,null,h,i);for(l in k)h=k[l],l=="children"?p=h:l=="dangerouslySetInnerHTML"?m=h:l=="value"?b=h:l=="checked"?x=h:d&&typeof h!="function"||v[l]===h||se(e,l,h,v[l],i);if(m)d||c&&(m.__html==c.__html||m.__html==e.innerHTML)||(e.innerHTML=m.__html),t.__k=[];else if(c&&(e.innerHTML=""),Xe(t.type=="template"?e.content:e,ue(p)?p:[p],t,n,a,M=="foreignObject"?"http://www.w3.org/1999/xhtml":i,r,o,r?r[0]:n.__k&&j(n,0),d,_),r!=null)for(l=r.length;l--;)ke(r[l]);d||(l="value",M=="progress"&&b==null?e.removeAttribute("value"):b!=null&&(b!==e[l]||M=="progress"&&!b||M=="option"&&b!=v[l])&&se(e,l,b,v[l],i),l="checked",x!=null&&x!=e[l]&&se(e,l,x,v[l],i))}return e}function Le(e,t,n){try{if(typeof e=="function"){var a=typeof e.__u=="function";a&&e.__u(),a&&t==null||(e.__u=e(t))}else e.current=t}catch(i){C.__e(i,n)}}function tt(e,t,n){var a,i;if(C.unmount&&C.unmount(e),(a=e.ref)&&(a.current&&a.current!=e.__e||Le(a,null,t)),(a=e.__c)!=null){if(a.componentWillUnmount)try{a.componentWillUnmount()}catch(r){C.__e(r,t)}a.base=a.__P=null}if(a=e.__k)for(i=0;i<a.length;i++)a[i]&&tt(a[i],t,n||typeof e.type!="function");n||ke(e.__e),e.__c=e.__=e.__e=void 0}function pt(e,t,n){return this.constructor(e,n)}function ft(e,t,n){var a,i,r,o;t==document&&(t=document.documentElement),C.__&&C.__(e,t),i=(a=!1)?null:t.__k,r=[],o=[],Me(t,e=t.__k=ut(G,null,[e]),i||oe,oe,t.namespaceURI,i?null:t.firstChild?he.call(t.childNodes):null,r,i?i.__e:t.firstChild,a,o),Ze(r,e,o)}he=ce.slice,C={__e:function(e,t,n,a){for(var i,r,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((r=i.constructor)&&r.getDerivedStateFromError!=null&&(i.setState(r.getDerivedStateFromError(e)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(e,a||{}),o=i.__d),o)return i.__E=i}catch(d){e=d}throw e}},je=0,ie.prototype.setState=function(e,t){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=D({},this.state),typeof e=="function"&&(e=e(D({},n),this.props)),e&&D(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),Pe(this))},ie.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),Pe(this))},ie.prototype.render=G,H=[],qe=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ye=function(e,t){return e.__v.__b-t.__v.__b},le.__r=0,ge=Math.random().toString(8),ne="__d"+ge,X="__a"+ge,Ve=/(PointerCapture)$|Capture$/i,xe=0,pe=Be(!1),fe=Be(!0);var bt=0;function s(e,t,n,a,i,r){t||(t={});var o,d,_=t;if("ref"in _)for(d in _={},t)d=="ref"?o=t[d]:_[d]=t[d];var l={type:e,props:_,key:n,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--bt,__i:-1,__u:0,__source:i,__self:r};if(typeof e=="function"&&(o=e.defaultProps))for(d in o)_[d]===void 0&&(_[d]=o[d]);return C.vnode&&C.vnode(l),l}var J,P,_e,Ie,Z=0,st=[],R=C,Fe=R.__b,We=R.__r,Ne=R.diffed,$e=R.__c,ze=R.unmount,De=R.__;function Se(e,t){R.__h&&R.__h(P,e,Z||t),Z=0;var n=P.__H||(P.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function S(e){return Z=1,yt(it,e)}function yt(e,t,n){var a=Se(J++,2);if(a.t=e,!a.__c&&(a.__=[it(void 0,t),function(d){var _=a.__N?a.__N[0]:a.__[0],l=a.t(_,d);_!==l&&(a.__N=[l,a.__[1]],a.__c.setState({}))}],a.__c=P,!P.__f)){var i=function(d,_,l){if(!a.__c.__H)return!0;var m=a.__c.__H.__.filter(function(p){return p.__c});if(m.every(function(p){return!p.__N}))return!r||r.call(this,d,_,l);var c=a.__c.props!==d;return m.some(function(p){if(p.__N){var h=p.__[0];p.__=p.__N,p.__N=void 0,h!==p.__[0]&&(c=!0)}}),r&&r.call(this,d,_,l)||c};P.__f=!0;var r=P.shouldComponentUpdate,o=P.componentWillUpdate;P.componentWillUpdate=function(d,_,l){if(this.__e){var m=r;r=void 0,i(d,_,l),r=m}o&&o.call(this,d,_,l)},P.shouldComponentUpdate=i}return a.__N||a.__}function K(e,t){var n=Se(J++,3);!R.__s&&rt(n.__H,t)&&(n.__=e,n.u=t,P.__H.__h.push(n))}function O(e){return Z=5,nt(function(){return{current:e}},[])}function nt(e,t){var n=Se(J++,7);return rt(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function Q(e,t){return Z=8,nt(function(){return e},t)}function wt(){for(var e;e=st.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(ae),t.__h.some(ye),t.__h=[]}catch(n){t.__h=[],R.__e(n,e.__v)}}}R.__b=function(e){P=null,Fe&&Fe(e)},R.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),De&&De(e,t)},R.__r=function(e){We&&We(e),J=0;var t=(P=e.__c).__H;t&&(_e===P?(t.__h=[],P.__h=[],t.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(t.__h.some(ae),t.__h.some(ye),t.__h=[],J=0)),_e=P},R.diffed=function(e){Ne&&Ne(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(st.push(t)!==1&&Ie===R.requestAnimationFrame||((Ie=R.requestAnimationFrame)||xt)(wt)),t.__H.__.some(function(n){n.u&&(n.__H=n.u),n.u=void 0})),_e=P=null},R.__c=function(e,t){t.some(function(n){try{n.__h.some(ae),n.__h=n.__h.filter(function(a){return!a.__||ye(a)})}catch(a){t.some(function(i){i.__h&&(i.__h=[])}),t=[],R.__e(a,n.__v)}}),$e&&$e(e,t)},R.unmount=function(e){ze&&ze(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(a){try{ae(a)}catch(i){t=i}}),n.__H=void 0,t&&R.__e(t,n.__v))};var He=typeof requestAnimationFrame=="function";function xt(e){var t,n=function(){clearTimeout(a),He&&cancelAnimationFrame(t),setTimeout(e)},a=setTimeout(n,35);He&&(t=requestAnimationFrame(n))}function ae(e){var t=P,n=e.__c;typeof n=="function"&&(e.__c=void 0,n()),P=t}function ye(e){var t=P;e.__c=e.__(),P=t}function rt(e,t){return!e||e.length!==t.length||t.some(function(n,a){return n!==e[a]})}function it(e,t){return typeof t=="function"?t(e):t}const de={en:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Connected","header.disconnected":"Disconnected","header.connecting":"Connecting…","header.memories":"memories","tab.search":"Search","tab.browse":"Browse","tab.analytics":"Analytics","tab.manage":"Manage","tab.graph":"Graph","tab.lessons":"Lessons","tab.settings":"Settings","search.title":"Search Memories","search.placeholder":'Search your memories… (e.g., "auth", "database", "bug fix")',"search.button":"Search","search.searching":"Searching…","search.results":"results","search.result":"result","search.noResults":"No results for","search.facts":"facts","browse.title":"All Memories","browse.manage":"Manage Memories","browse.active":"active","browse.archived":"archived","browse.filter":"Filter by content, type, or tag…","browse.refresh":"Refresh","browse.noMemories":"No memories yet","browse.noMatch":"No memories matching","browse.prev":"← Prev","browse.next":"Next →","browse.archive":"Archive","browse.restore":"Restore","browse.confirmArchive":"Archive this memory?","browse.moreArchived":"more archived memories","analytics.totalMemories":"Total Memories","analytics.knowledgeFacts":"Knowledge Facts","analytics.connections":"Connections","analytics.topics":"Topics","analytics.insights":"Insights","analytics.thisWeek":"This week","analytics.new":"new","analytics.stale":"Stale (30+ days unused)","analytics.archivedLabel":"Archived","analytics.mostRecalled":"Most Recalled","settings.capabilities":"Capabilities","settings.smartMode":"Smart Mode","settings.core":"Core","settings.embeddings":"Embeddings","settings.llmProvider":"LLM Provider","settings.apiKey":"API Key","settings.model":"Model (optional)","settings.save":"Save","settings.saving":"Saving…","settings.saved":"Saved! Restart server for LLM changes to take effect.","settings.language":"Language","graph.entities":"Entities","graph.relations":"Relations","lessons.total":"Total Lessons","lessons.critical":"Critical","lessons.empty":"No lessons recorded yet. Use the learn tool or enable Smart Mode.","lessons.error":"Error","lessons.rootCause":"Root Cause","lessons.fix":"Fix","lessons.prevention":"Prevention","feedback.button":"💬 Feedback","common.error":"Error","common.loading":"Loading…"},"zh-TW":{"brand.subtitle":"powered by pcircle.ai","header.connected":"已連線","header.disconnected":"已斷線","header.connecting":"連線中…","header.memories":"筆記憶","tab.search":"搜尋","tab.browse":"瀏覽","tab.analytics":"分析","tab.manage":"管理","tab.graph":"關係圖","tab.lessons":"經驗教訓","tab.settings":"設定","search.title":"搜尋記憶","search.placeholder":"搜尋你的記憶…(例如:「auth」、「資料庫」、「bug 修復」)","search.button":"搜尋","search.searching":"搜尋中…","search.results":"個結果","search.result":"個結果","search.noResults":"找不到符合的結果:","search.facts":"筆事實","browse.title":"所有記憶","browse.manage":"管理記憶","browse.active":"使用中","browse.archived":"已封存","browse.filter":"依內容、類型或標籤篩選…","browse.refresh":"重新整理","browse.noMemories":"尚無記憶","browse.noMatch":"找不到符合的記憶:","browse.prev":"← 上一頁","browse.next":"下一頁 →","browse.archive":"封存","browse.restore":"還原","browse.confirmArchive":"確定要封存此記憶?","browse.moreArchived":"筆已封存的記憶","analytics.totalMemories":"記憶總數","analytics.knowledgeFacts":"知識事實","analytics.connections":"關聯","analytics.topics":"主題","analytics.insights":"洞察","analytics.thisWeek":"本週","analytics.new":"筆新增","analytics.stale":"閒置(30 天以上未使用)","analytics.archivedLabel":"已封存","analytics.mostRecalled":"最常查閱","settings.capabilities":"功能狀態","settings.smartMode":"智慧模式","settings.core":"基礎","settings.embeddings":"嵌入模型","settings.llmProvider":"LLM 提供者","settings.apiKey":"API 金鑰","settings.model":"模型(選填)","settings.save":"儲存","settings.saving":"儲存中…","settings.saved":"已儲存!重啟伺服器以套用 LLM 設定。","settings.language":"語言","graph.entities":"實體","graph.relations":"關聯","lessons.total":"教訓總數","lessons.critical":"嚴重","lessons.empty":"尚無教訓記錄。請使用 learn 工具或啟用智慧模式。","lessons.error":"錯誤","lessons.rootCause":"根本原因","lessons.fix":"修復方式","lessons.prevention":"預防措施","feedback.button":"💬 意見回饋","common.error":"錯誤","common.loading":"載入中…"},"zh-CN":{"brand.subtitle":"powered by pcircle.ai","header.connected":"已连接","header.disconnected":"已断开","header.connecting":"连接中…","header.memories":"条记忆","tab.search":"搜索","tab.browse":"浏览","tab.analytics":"分析","tab.manage":"管理","tab.graph":"关系图","tab.lessons":"经验教训","tab.settings":"设置","search.title":"搜索记忆","search.placeholder":'搜索你的记忆…(例如:"auth"、"数据库"、"bug 修复")',"search.button":"搜索","search.searching":"搜索中…","search.results":"个结果","search.result":"个结果","search.noResults":"没有找到结果:","search.facts":"条事实","browse.title":"所有记忆","browse.manage":"管理记忆","browse.active":"活跃","browse.archived":"已归档","browse.filter":"按内容、类型或标签筛选…","browse.refresh":"刷新","browse.noMemories":"暂无记忆","browse.noMatch":"没有匹配的记忆:","browse.prev":"← 上一页","browse.next":"下一页 →","browse.archive":"归档","browse.restore":"恢复","browse.confirmArchive":"确定要归档此记忆?","browse.moreArchived":"条已归档记忆","analytics.totalMemories":"记忆总数","analytics.knowledgeFacts":"知识事实","analytics.connections":"关联","analytics.topics":"主题","analytics.insights":"洞察","analytics.thisWeek":"本周","analytics.new":"条新增","analytics.stale":"闲置(30 天以上未使用)","analytics.archivedLabel":"已归档","analytics.mostRecalled":"最常查阅","settings.capabilities":"功能状态","settings.smartMode":"智能模式","settings.core":"基础","settings.embeddings":"嵌入模型","settings.llmProvider":"LLM 提供商","settings.apiKey":"API 密钥","settings.model":"模型(选填)","settings.save":"保存","settings.saving":"保存中…","settings.saved":"已保存!重启服务器以应用 LLM 设置。","settings.language":"语言","graph.entities":"实体","graph.relations":"关联","lessons.total":"教训总数","lessons.critical":"严重","lessons.empty":"尚无教训记录。请使用 learn 工具或启用智能模式。","lessons.error":"错误","lessons.rootCause":"根本原因","lessons.fix":"修复方式","lessons.prevention":"预防措施","feedback.button":"💬 反馈","common.error":"错误","common.loading":"加载中…"},ja:{"brand.subtitle":"powered by pcircle.ai","header.connected":"接続中","header.disconnected":"切断","header.connecting":"接続しています…","header.memories":"件のメモリ","tab.search":"検索","tab.browse":"一覧","tab.analytics":"分析","tab.manage":"管理","tab.graph":"グラフ","tab.lessons":"教訓","tab.settings":"設定","search.title":"メモリを検索","search.placeholder":"メモリを検索…(例:「auth」「データベース」「バグ修正」)","search.button":"検索","search.searching":"検索中…","search.results":"件の結果","search.result":"件の結果","search.noResults":"結果が見つかりません:","search.facts":"件の事実","browse.title":"すべてのメモリ","browse.manage":"メモリを管理","browse.active":"アクティブ","browse.archived":"アーカイブ済み","browse.filter":"内容、タイプ、タグで絞り込み…","browse.refresh":"更新","browse.noMemories":"メモリがありません","browse.noMatch":"一致するメモリがありません:","browse.prev":"← 前へ","browse.next":"次へ →","browse.archive":"アーカイブ","browse.restore":"復元","browse.confirmArchive":"このメモリをアーカイブしますか?","browse.moreArchived":"件のアーカイブ済みメモリ","analytics.totalMemories":"メモリ総数","analytics.knowledgeFacts":"知識ファクト","analytics.connections":"接続","analytics.topics":"トピック","analytics.insights":"インサイト","analytics.thisWeek":"今週","analytics.new":"件の新規","analytics.stale":"未使用(30日以上)","analytics.archivedLabel":"アーカイブ済み","analytics.mostRecalled":"よく参照される","settings.capabilities":"機能状態","settings.smartMode":"スマートモード","settings.core":"コア","settings.embeddings":"エンベディング","settings.llmProvider":"LLMプロバイダー","settings.apiKey":"APIキー","settings.model":"モデル(任意)","settings.save":"保存","settings.saving":"保存中…","settings.saved":"保存しました!LLM設定を反映するにはサーバーを再起動してください。","settings.language":"言語","graph.entities":"エンティティ","graph.relations":"リレーション","lessons.total":"教訓の総数","lessons.critical":"重大","lessons.empty":"まだ教訓が記録されていません。learnツールを使用するか、スマートモードを有効にしてください。","lessons.error":"エラー","lessons.rootCause":"根本原因","lessons.fix":"修正方法","lessons.prevention":"予防策","feedback.button":"💬 フィードバック","common.error":"エラー","common.loading":"読み込み中…"},ko:{"brand.subtitle":"powered by pcircle.ai","header.connected":"연결됨","header.disconnected":"연결 끊김","header.connecting":"연결 중…","header.memories":"개의 기억","tab.search":"검색","tab.browse":"둘러보기","tab.analytics":"분석","tab.manage":"관리","tab.graph":"그래프","tab.lessons":"교훈","tab.settings":"설정","search.title":"기억 검색","search.placeholder":'기억 검색… (예: "auth", "데이터베이스", "버그 수정")',"search.button":"검색","search.searching":"검색 중…","search.results":"개의 결과","search.result":"개의 결과","search.noResults":"결과를 찾을 수 없습니다:","search.facts":"개의 사실","browse.title":"모든 기억","browse.manage":"기억 관리","browse.active":"활성","browse.archived":"보관됨","browse.filter":"내용, 유형 또는 태그로 필터링…","browse.refresh":"새로고침","browse.noMemories":"기억이 없습니다","browse.noMatch":"일치하는 기억이 없습니다:","browse.prev":"← 이전","browse.next":"다음 →","browse.archive":"보관","browse.restore":"복원","browse.confirmArchive":"이 기억을 보관하시겠습니까?","browse.moreArchived":"개의 보관된 기억","analytics.totalMemories":"총 기억 수","analytics.knowledgeFacts":"지식 사실","analytics.connections":"연결","analytics.topics":"주제","analytics.insights":"인사이트","analytics.thisWeek":"이번 주","analytics.new":"개 신규","analytics.stale":"비활성 (30일 이상 미사용)","analytics.archivedLabel":"보관됨","analytics.mostRecalled":"가장 많이 조회됨","settings.capabilities":"기능 상태","settings.smartMode":"스마트 모드","settings.core":"기본","settings.embeddings":"임베딩","settings.llmProvider":"LLM 제공자","settings.apiKey":"API 키","settings.model":"모델 (선택)","settings.save":"저장","settings.saving":"저장 중…","settings.saved":"저장되었습니다! LLM 설정을 적용하려면 서버를 재시작하세요.","settings.language":"언어","graph.entities":"엔티티","graph.relations":"관계","lessons.total":"총 교훈","lessons.critical":"심각","lessons.empty":"아직 기록된 교훈이 없습니다. learn 도구를 사용하거나 스마트 모드를 활성화하세요.","lessons.error":"오류","lessons.rootCause":"근본 원인","lessons.fix":"수정 방법","lessons.prevention":"예방 조치","feedback.button":"💬 피드백","common.error":"오류","common.loading":"로딩 중…"},pt:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Conectado","header.disconnected":"Desconectado","header.connecting":"Conectando…","header.memories":"memórias","tab.search":"Buscar","tab.browse":"Explorar","tab.analytics":"Análise","tab.manage":"Gerenciar","tab.graph":"Grafo","tab.lessons":"Lições","tab.settings":"Configurações","search.title":"Buscar Memórias","search.placeholder":'Buscar memórias… (ex.: "auth", "banco de dados", "bug fix")',"search.button":"Buscar","search.searching":"Buscando…","search.results":"resultados","search.result":"resultado","search.noResults":"Nenhum resultado para","search.facts":"fatos","browse.title":"Todas as Memórias","browse.manage":"Gerenciar Memórias","browse.active":"ativas","browse.archived":"arquivadas","browse.filter":"Filtrar por conteúdo, tipo ou tag…","browse.refresh":"Atualizar","browse.noMemories":"Sem memórias ainda","browse.noMatch":"Nenhuma memória corresponde a","browse.prev":"← Anterior","browse.next":"Próximo →","browse.archive":"Arquivar","browse.restore":"Restaurar","browse.confirmArchive":"Arquivar esta memória?","browse.moreArchived":"memórias arquivadas","analytics.totalMemories":"Total de Memórias","analytics.knowledgeFacts":"Fatos","analytics.connections":"Conexões","analytics.topics":"Tópicos","analytics.insights":"Insights","analytics.thisWeek":"Esta semana","analytics.new":"novas","analytics.stale":"Inativas (30+ dias sem uso)","analytics.archivedLabel":"Arquivadas","analytics.mostRecalled":"Mais Consultadas","settings.capabilities":"Capacidades","settings.smartMode":"Modo Inteligente","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Provedor LLM","settings.apiKey":"Chave API","settings.model":"Modelo (opcional)","settings.save":"Salvar","settings.saving":"Salvando…","settings.saved":"Salvo! Reinicie o servidor para aplicar as configurações do LLM.","settings.language":"Idioma","graph.entities":"Entidades","graph.relations":"Relações","lessons.total":"Total de Lições","lessons.critical":"Críticas","lessons.empty":"Nenhuma lição registrada. Use a ferramenta learn ou ative o Modo Inteligente.","lessons.error":"Erro","lessons.rootCause":"Causa Raiz","lessons.fix":"Correção","lessons.prevention":"Prevenção","feedback.button":"💬 Feedback","common.error":"Erro","common.loading":"Carregando…"},fr:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Connecté","header.disconnected":"Déconnecté","header.connecting":"Connexion…","header.memories":"mémoires","tab.search":"Recherche","tab.browse":"Parcourir","tab.analytics":"Analyse","tab.manage":"Gérer","tab.graph":"Graphe","tab.lessons":"Leçons","tab.settings":"Paramètres","search.title":"Rechercher des mémoires","search.placeholder":"Rechercher vos mémoires… (ex. : « auth », « base de données », « bug fix »)","search.button":"Rechercher","search.searching":"Recherche…","search.results":"résultats","search.result":"résultat","search.noResults":"Aucun résultat pour","search.facts":"faits","browse.title":"Toutes les mémoires","browse.manage":"Gérer les mémoires","browse.active":"actives","browse.archived":"archivées","browse.filter":"Filtrer par contenu, type ou tag…","browse.refresh":"Actualiser","browse.noMemories":"Pas encore de mémoires","browse.noMatch":"Aucune mémoire correspondant à","browse.prev":"← Précédent","browse.next":"Suivant →","browse.archive":"Archiver","browse.restore":"Restaurer","browse.confirmArchive":"Archiver cette mémoire ?","browse.moreArchived":"mémoires archivées","analytics.totalMemories":"Total des mémoires","analytics.knowledgeFacts":"Faits de connaissance","analytics.connections":"Connexions","analytics.topics":"Sujets","analytics.insights":"Aperçus","analytics.thisWeek":"Cette semaine","analytics.new":"nouvelles","analytics.stale":"Inactives (30+ jours sans utilisation)","analytics.archivedLabel":"Archivées","analytics.mostRecalled":"Les plus consultées","settings.capabilities":"Capacités","settings.smartMode":"Mode intelligent","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Fournisseur LLM","settings.apiKey":"Clé API","settings.model":"Modèle (optionnel)","settings.save":"Enregistrer","settings.saving":"Enregistrement…","settings.saved":"Enregistré ! Redémarrez le serveur pour appliquer les paramètres LLM.","settings.language":"Langue","graph.entities":"Entités","graph.relations":"Relations","lessons.total":"Total des leçons","lessons.critical":"Critiques","lessons.empty":"Aucune leçon enregistrée. Utilisez l'outil learn ou activez le Mode intelligent.","lessons.error":"Erreur","lessons.rootCause":"Cause racine","lessons.fix":"Correction","lessons.prevention":"Prévention","feedback.button":"💬 Retour","common.error":"Erreur","common.loading":"Chargement…"},de:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Verbunden","header.disconnected":"Getrennt","header.connecting":"Verbinden…","header.memories":"Erinnerungen","tab.search":"Suche","tab.browse":"Durchsuchen","tab.analytics":"Analyse","tab.manage":"Verwalten","tab.graph":"Graph","tab.lessons":"Lektionen","tab.settings":"Einstellungen","search.title":"Erinnerungen suchen","search.placeholder":'Erinnerungen suchen… (z.B. „auth", „Datenbank", „Bug Fix")',"search.button":"Suchen","search.searching":"Suche läuft…","search.results":"Ergebnisse","search.result":"Ergebnis","search.noResults":"Keine Ergebnisse für","search.facts":"Fakten","browse.title":"Alle Erinnerungen","browse.manage":"Erinnerungen verwalten","browse.active":"aktiv","browse.archived":"archiviert","browse.filter":"Nach Inhalt, Typ oder Tag filtern…","browse.refresh":"Aktualisieren","browse.noMemories":"Noch keine Erinnerungen","browse.noMatch":"Keine passenden Erinnerungen:","browse.prev":"← Zurück","browse.next":"Weiter →","browse.archive":"Archivieren","browse.restore":"Wiederherstellen","browse.confirmArchive":"Diese Erinnerung archivieren?","browse.moreArchived":"archivierte Erinnerungen","analytics.totalMemories":"Erinnerungen gesamt","analytics.knowledgeFacts":"Wissensfakten","analytics.connections":"Verbindungen","analytics.topics":"Themen","analytics.insights":"Einblicke","analytics.thisWeek":"Diese Woche","analytics.new":"neue","analytics.stale":"Inaktiv (30+ Tage ungenutzt)","analytics.archivedLabel":"Archiviert","analytics.mostRecalled":"Am häufigsten abgerufen","settings.capabilities":"Fähigkeiten","settings.smartMode":"Smart-Modus","settings.core":"Basis","settings.embeddings":"Embeddings","settings.llmProvider":"LLM-Anbieter","settings.apiKey":"API-Schlüssel","settings.model":"Modell (optional)","settings.save":"Speichern","settings.saving":"Speichern…","settings.saved":"Gespeichert! Server neu starten, um LLM-Einstellungen anzuwenden.","settings.language":"Sprache","graph.entities":"Entitäten","graph.relations":"Beziehungen","lessons.total":"Lektionen gesamt","lessons.critical":"Kritisch","lessons.empty":"Noch keine Lektionen erfasst. Verwenden Sie das Learn-Tool oder aktivieren Sie den Smart-Modus.","lessons.error":"Fehler","lessons.rootCause":"Ursache","lessons.fix":"Lösung","lessons.prevention":"Prävention","feedback.button":"💬 Feedback","common.error":"Fehler","common.loading":"Laden…"},vi:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Đã kết nối","header.disconnected":"Mất kết nối","header.connecting":"Đang kết nối…","header.memories":"ký ức","tab.search":"Tìm kiếm","tab.browse":"Duyệt","tab.analytics":"Phân tích","tab.manage":"Quản lý","tab.graph":"Đồ thị","tab.lessons":"Bài học","tab.settings":"Cài đặt","search.title":"Tìm kiếm ký ức","search.placeholder":'Tìm kiếm ký ức… (ví dụ: "auth", "cơ sở dữ liệu", "sửa lỗi")',"search.button":"Tìm kiếm","search.searching":"Đang tìm…","search.results":"kết quả","search.result":"kết quả","search.noResults":"Không tìm thấy kết quả cho","search.facts":"sự kiện","browse.title":"Tất cả ký ức","browse.manage":"Quản lý ký ức","browse.active":"hoạt động","browse.archived":"đã lưu trữ","browse.filter":"Lọc theo nội dung, loại hoặc thẻ…","browse.refresh":"Làm mới","browse.noMemories":"Chưa có ký ức","browse.noMatch":"Không có ký ức phù hợp:","browse.prev":"← Trước","browse.next":"Tiếp →","browse.archive":"Lưu trữ","browse.restore":"Khôi phục","browse.confirmArchive":"Lưu trữ ký ức này?","browse.moreArchived":"ký ức đã lưu trữ","analytics.totalMemories":"Tổng ký ức","analytics.knowledgeFacts":"Sự kiện tri thức","analytics.connections":"Kết nối","analytics.topics":"Chủ đề","analytics.insights":"Thông tin","analytics.thisWeek":"Tuần này","analytics.new":"mới","analytics.stale":"Không hoạt động (30+ ngày)","analytics.archivedLabel":"Đã lưu trữ","analytics.mostRecalled":"Được truy xuất nhiều nhất","settings.capabilities":"Khả năng","settings.smartMode":"Chế độ thông minh","settings.core":"Cơ bản","settings.embeddings":"Embeddings","settings.llmProvider":"Nhà cung cấp LLM","settings.apiKey":"Khóa API","settings.model":"Mô hình (tùy chọn)","settings.save":"Lưu","settings.saving":"Đang lưu…","settings.saved":"Đã lưu! Khởi động lại server để áp dụng cài đặt LLM.","settings.language":"Ngôn ngữ","graph.entities":"Thực thể","graph.relations":"Quan hệ","lessons.total":"Tổng bài học","lessons.critical":"Nghiêm trọng","lessons.empty":"Chưa có bài học nào được ghi nhận. Sử dụng công cụ learn hoặc bật Chế độ thông minh.","lessons.error":"Lỗi","lessons.rootCause":"Nguyên nhân gốc","lessons.fix":"Cách sửa","lessons.prevention":"Phòng ngừa","feedback.button":"💬 Phản hồi","common.error":"Lỗi","common.loading":"Đang tải…"},es:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Conectado","header.disconnected":"Desconectado","header.connecting":"Conectando…","header.memories":"memorias","tab.search":"Buscar","tab.browse":"Explorar","tab.analytics":"Análisis","tab.manage":"Gestionar","tab.graph":"Grafo","tab.lessons":"Lecciones","tab.settings":"Configuración","search.title":"Buscar memorias","search.placeholder":'Buscar memorias… (ej.: "auth", "base de datos", "corrección")',"search.button":"Buscar","search.searching":"Buscando…","search.results":"resultados","search.result":"resultado","search.noResults":"Sin resultados para","search.facts":"hechos","browse.title":"Todas las memorias","browse.manage":"Gestionar memorias","browse.active":"activas","browse.archived":"archivadas","browse.filter":"Filtrar por contenido, tipo o etiqueta…","browse.refresh":"Actualizar","browse.noMemories":"Aún no hay memorias","browse.noMatch":"No hay memorias que coincidan con","browse.prev":"← Anterior","browse.next":"Siguiente →","browse.archive":"Archivar","browse.restore":"Restaurar","browse.confirmArchive":"¿Archivar esta memoria?","browse.moreArchived":"memorias archivadas","analytics.totalMemories":"Total de memorias","analytics.knowledgeFacts":"Hechos","analytics.connections":"Conexiones","analytics.topics":"Temas","analytics.insights":"Información","analytics.thisWeek":"Esta semana","analytics.new":"nuevas","analytics.stale":"Inactivas (30+ días sin uso)","analytics.archivedLabel":"Archivadas","analytics.mostRecalled":"Más consultadas","settings.capabilities":"Capacidades","settings.smartMode":"Modo inteligente","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Proveedor LLM","settings.apiKey":"Clave API","settings.model":"Modelo (opcional)","settings.save":"Guardar","settings.saving":"Guardando…","settings.saved":"¡Guardado! Reinicie el servidor para aplicar la configuración LLM.","settings.language":"Idioma","graph.entities":"Entidades","graph.relations":"Relaciones","lessons.total":"Total de lecciones","lessons.critical":"Críticas","lessons.empty":"No hay lecciones registradas. Usa la herramienta learn o activa el Modo inteligente.","lessons.error":"Error","lessons.rootCause":"Causa raíz","lessons.fix":"Corrección","lessons.prevention":"Prevención","feedback.button":"💬 Comentarios","common.error":"Error","common.loading":"Cargando…"},th:{"brand.subtitle":"powered by pcircle.ai","header.connected":"เชื่อมต่อแล้ว","header.disconnected":"ไม่ได้เชื่อมต่อ","header.connecting":"กำลังเชื่อมต่อ…","header.memories":"ความทรงจำ","tab.search":"ค้นหา","tab.browse":"เรียกดู","tab.analytics":"วิเคราะห์","tab.manage":"จัดการ","tab.graph":"กราฟ","tab.lessons":"บทเรียน","tab.settings":"ตั้งค่า","search.title":"ค้นหาความทรงจำ","search.placeholder":'ค้นหาความทรงจำ… (เช่น "auth", "ฐานข้อมูล", "แก้บั๊ก")',"search.button":"ค้นหา","search.searching":"กำลังค้นหา…","search.results":"ผลลัพธ์","search.result":"ผลลัพธ์","search.noResults":"ไม่พบผลลัพธ์สำหรับ","search.facts":"ข้อเท็จจริง","browse.title":"ความทรงจำทั้งหมด","browse.manage":"จัดการความทรงจำ","browse.active":"ใช้งานอยู่","browse.archived":"เก็บถาวร","browse.filter":"กรองตามเนื้อหา ประเภท หรือแท็ก…","browse.refresh":"รีเฟรช","browse.noMemories":"ยังไม่มีความทรงจำ","browse.noMatch":"ไม่พบความทรงจำที่ตรงกัน:","browse.prev":"← ก่อนหน้า","browse.next":"ถัดไป →","browse.archive":"เก็บถาวร","browse.restore":"กู้คืน","browse.confirmArchive":"เก็บถาวรความทรงจำนี้?","browse.moreArchived":"ความทรงจำที่เก็บถาวร","analytics.totalMemories":"ความทรงจำทั้งหมด","analytics.knowledgeFacts":"ข้อเท็จจริง","analytics.connections":"การเชื่อมต่อ","analytics.topics":"หัวข้อ","analytics.insights":"ข้อมูลเชิงลึก","analytics.thisWeek":"สัปดาห์นี้","analytics.new":"ใหม่","analytics.stale":"ไม่ได้ใช้งาน (30+ วัน)","analytics.archivedLabel":"เก็บถาวร","analytics.mostRecalled":"ถูกเรียกดูมากที่สุด","settings.capabilities":"ความสามารถ","settings.smartMode":"โหมดอัจฉริยะ","settings.core":"พื้นฐาน","settings.embeddings":"Embeddings","settings.llmProvider":"ผู้ให้บริการ LLM","settings.apiKey":"คีย์ API","settings.model":"โมเดล (ไม่บังคับ)","settings.save":"บันทึก","settings.saving":"กำลังบันทึก…","settings.saved":"บันทึกแล้ว! รีสตาร์ทเซิร์ฟเวอร์เพื่อใช้การตั้งค่า LLM","settings.language":"ภาษา","graph.entities":"เอนทิตี","graph.relations":"ความสัมพันธ์","lessons.total":"บทเรียนทั้งหมด","lessons.critical":"วิกฤต","lessons.empty":"ยังไม่มีบทเรียนที่บันทึกไว้ ใช้เครื่องมือ learn หรือเปิดใช้โหมดอัจฉริยะ","lessons.error":"ข้อผิดพลาด","lessons.rootCause":"สาเหตุหลัก","lessons.fix":"วิธีแก้ไข","lessons.prevention":"การป้องกัน","feedback.button":"💬 ความคิดเห็น","common.error":"ข้อผิดพลาด","common.loading":"กำลังโหลด…"}},kt={en:"English","zh-TW":"繁體中文","zh-CN":"简体中文",ja:"日本語",ko:"한국어",pt:"Português",fr:"Français",de:"Deutsch",vi:"Tiếng Việt",es:"Español",th:"ภาษาไทย"};let ee="en";function Mt(){const e=localStorage.getItem("memesh-locale");if(e&&de[e])return e;const t=navigator.language;if(t.startsWith("zh-TW")||t.startsWith("zh-Hant"))return"zh-TW";if(t.startsWith("zh"))return"zh-CN";const n=t.split("-")[0];return de[n]?n:"en"}function Lt(){return ee=Mt(),ee}function St(e){ee=e,localStorage.setItem("memesh-locale",e)}function u(e){return de[ee]?.[e]||de.en[e]||e}function Ct(){return ee}function At(){return Object.entries(kt).map(([e,t])=>({code:e,name:t}))}function Tt({health:e,error:t}){return s("div",{class:"header",children:[s("div",{class:"header-brand",children:[s("h1",{children:"MeMesh LLM Memory"}),s("small",{children:u("brand.subtitle")})]}),s("div",{class:"header-right",children:s("div",{class:"header-meta",children:e?s(G,{children:[s("span",{children:[s("span",{class:"dot dot-ok"}),u("header.connected")]}),s("span",{class:"badge-version",children:["v",e.version," · ",e.entity_count.toLocaleString()," ",u("header.memories")]})]}):t?s("span",{children:[s("span",{class:"dot dot-err"}),u("header.disconnected")]}):s("span",{style:{color:"var(--text-3)"},children:u("header.connecting")})})})]})}function Et({tabs:e,active:t,onSelect:n}){return s("nav",{class:"nav",children:e.map(({key:a,label:i})=>s("button",{class:`nav-btn ${a===t?"active":""}`,onClick:()=>n(a),children:i},a))})}const Pt=1e4;async function W(e,t,n){const a=new AbortController,i=setTimeout(()=>a.abort(),Pt);try{const r={method:e,headers:{"Content-Type":"application/json"},signal:a.signal};n&&(r.body=JSON.stringify(n));const o=await fetch(t,r);if(!o.ok)throw new Error(`HTTP ${o.status}`);const d=await o.json();if(!d.success)throw new Error(d.error||"Unknown error");return d.data}catch(r){throw r.name==="AbortError"?new Error("Request timed out"):r}finally{clearTimeout(i)}}async function Rt(){return W("GET","/v1/graph")}async function Bt(){const e=await W("POST","/v1/recall",{limit:100});return(Array.isArray(e)?e:e.entities||[]).filter(n=>n.type==="lesson_learned")}function It(e){try{const t=new Date(e);return{date:t.toLocaleDateString(void 0,{month:"short",day:"numeric"}),time:t.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})}}catch{return{date:"—",time:""}}}function Ke(e,t){return e.length>t?e.slice(0,t)+"…":e}function we({entity:e,actions:t,highlight:n}){const a=It(e.created_at),i=e.observations?.[0]||"(no content)",r=e.observations?.length||0,o=e.archived||e.status==="archived";return s("div",{class:"mem-row",style:o?{opacity:.45}:void 0,children:[s("div",{class:"mem-time",children:[s("div",{children:a.date}),s("div",{children:a.time})]}),s("div",{class:"mem-body",children:[s("div",{class:"mem-preview",children:n?s(Ft,{text:Ke(i,140),term:n}):Ke(i,140)}),s("div",{class:"mem-meta",children:[s("span",{class:"badge badge-type",children:e.type}),o&&s("span",{class:"badge badge-archived",children:"archived"}),s("span",{children:e.name}),r>1&&s("span",{children:["· ",r," facts"]}),e.tags?.slice(0,3).map(d=>s("span",{class:"tag",children:d},d)),(e.tags?.length||0)>3&&s("span",{class:"tag",style:{opacity:.5},children:["+",e.tags.length-3]})]})]}),t&&s("div",{class:"mem-actions",children:t})]})}function Ft({text:e,term:t}){if(!t)return s(G,{children:e});const n=[],a=e.toLowerCase(),i=t.toLowerCase();let r=0;for(;r<e.length;){const o=a.indexOf(i,r);if(o===-1){n.push(e.slice(r));break}o>r&&n.push(e.slice(r,o)),n.push(s("mark",{children:e.slice(o,o+i.length)})),r=o+i.length}return s(G,{children:n})}function Wt(){const[e,t]=S(""),[n,a]=S(null),[i,r]=S(!1),[o,d]=S("");async function _(){if(e.trim()){r(!0),d("");try{const l=await W("POST","/v1/recall",{query:e.trim(),limit:30}),m=Array.isArray(l)?l:l.entities||[];a(m)}catch(l){d(l.message)}finally{r(!1)}}}return s("div",{children:s("div",{class:"card",children:[s("div",{class:"card-title",children:u("search.title")}),s("div",{class:"search-bar",children:[s("input",{type:"search",placeholder:u("search.placeholder"),value:e,onInput:l=>t(l.target.value),onKeyDown:l=>l.key==="Enter"&&_()}),s("button",{class:"btn btn-primary",onClick:_,disabled:i,children:u(i?"search.searching":"search.button")})]}),o&&s("div",{class:"error-box",children:o}),i&&s("div",{class:"empty",children:s("div",{class:"loading"})}),!i&&n!==null&&n.length===0&&s("div",{class:"empty",children:[s("span",{class:"empty-icon",children:"🔍"}),u("search.noResults"),' "',e,'"']}),!i&&n&&n.length>0&&s("div",{children:[s("div",{style:{fontSize:12,color:"var(--text-3)",marginBottom:12},children:[n.length," ",n.length!==1?u("search.results"):u("search.result")]}),n.map(l=>s("div",{class:"card",style:{padding:14},children:s(we,{entity:l,highlight:e})},l.id))]})]})})}const me=30;function Oe({manage:e}){const[t,n]=S([]),[a,i]=S(""),[r,o]=S(!0),[d,_]=S(""),[l,m]=S(0);async function c(){o(!0),_("");try{const g=await W("GET","/v1/entities?limit=500&status=all");n(g||[]),m(0)}catch(g){_(g.message)}finally{o(!1)}}K(()=>{c()},[]),K(()=>{m(0)},[a]);const p=a.toLowerCase(),h=t.filter(g=>p?g.name.toLowerCase().includes(p)||g.type.toLowerCase().includes(p)||g.observations?.some(w=>w.toLowerCase().includes(p))||g.tags?.some(w=>w.toLowerCase().includes(p)):!0),b=h.filter(g=>!g.archived&&g.status!=="archived"),x=h.filter(g=>g.archived||g.status==="archived"),v=Math.ceil(b.length/me),k=b.slice(l*me,(l+1)*me);async function M(g){if(confirm(u("browse.confirmArchive")))try{await W("POST","/v1/forget",{name:g}),c()}catch(w){_("Failed to archive: "+w.message)}}async function y(g){try{await W("POST","/v1/remember",{name:g,type:"restored"}),c()}catch(w){_("Failed to restore: "+w.message)}}return s("div",{children:s("div",{class:"card",children:[s("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:16},children:[s("div",{children:[s("div",{class:"card-title",style:{margin:0},children:u(e?"browse.manage":"browse.title")}),!r&&s("div",{style:{fontSize:12,color:"var(--text-3)",marginTop:2},children:[b.length.toLocaleString()," ",u("browse.active"),x.length>0?` · ${x.length} ${u("browse.archived")}`:""]})]}),s("div",{style:{display:"flex",gap:8},children:[s("input",{type:"search",placeholder:u("browse.filter"),value:a,onInput:g=>i(g.target.value),style:{width:260}}),s("button",{class:"btn btn-sm",onClick:c,title:u("browse.refresh"),children:"↻"})]})]}),d&&s("div",{class:"error-box",style:{marginBottom:12},children:d}),r&&s("div",{class:"empty",children:s("div",{class:"loading"})}),!r&&h.length===0&&s("div",{class:"empty",children:[s("span",{class:"empty-icon",children:"📭"}),a?`${u("browse.noMatch")} "${a}"`:u("browse.noMemories")]}),!r&&k.length>0&&s("div",{children:[k.map(g=>s("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"14px 0"},children:s(we,{entity:g,highlight:a,actions:e?s("button",{class:"btn btn-danger btn-sm",onClick:()=>M(g.name),children:u("browse.archive")}):void 0})},g.id)),v>1&&s("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:12,padding:"16px 0",fontSize:13},children:[s("button",{class:"btn btn-sm",disabled:l===0,onClick:()=>m(g=>g-1),children:u("browse.prev")}),s("span",{style:{color:"var(--text-3)",fontFamily:"var(--mono)",fontSize:12},children:[l+1," / ",v]}),s("button",{class:"btn btn-sm",disabled:l>=v-1,onClick:()=>m(g=>g+1),children:u("browse.next")})]})]}),!r&&x.length>0&&s("div",{style:{marginTop:20},children:[s("div",{style:{fontSize:11,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8,paddingBottom:8,borderBottom:"1px solid var(--border)"},children:[u("browse.archived")," (",x.length,")"]}),x.slice(0,10).map(g=>s("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"14px 0"},children:s(we,{entity:g,highlight:a,actions:e?s("button",{class:"btn btn-sm",onClick:()=>y(g.name),children:u("browse.restore")}):void 0})},g.id)),x.length>10&&s("div",{style:{fontSize:12,color:"var(--text-3)",padding:"12px 0",textAlign:"center"},children:["+",x.length-10," ",u("browse.moreArchived")]})]})]})})}function Nt(){const[e,t]=S(null),[n,a]=S([]),[i,r]=S(!0);if(K(()=>{Promise.all([W("GET","/v1/stats"),W("GET","/v1/entities?limit=500&status=all")]).then(([h,b])=>{t(h),a(b||[])}).finally(()=>r(!1))},[]),i)return s("div",{class:"empty",children:s("div",{class:"loading"})});if(!e)return s("div",{class:"error-box",children:[u("common.error"),": Failed to load analytics"]});const o=Date.now(),d=10080*60*1e3,_=720*60*60*1e3,l=n.filter(h=>o-new Date(h.created_at).getTime()<d).length,m=n.filter(h=>h.archived||h.status==="archived"?!1:h.last_accessed_at?o-new Date(h.last_accessed_at).getTime()>_:!0).length,c=n.filter(h=>h.archived||h.status==="archived").length,p=n.filter(h=>(h.access_count||0)>0).sort((h,b)=>(b.access_count||0)-(h.access_count||0)).slice(0,5);return s("div",{children:[s("div",{class:"stats-row",children:[s("div",{class:"stat",children:[s("div",{class:"stat-val",children:e.totalEntities.toLocaleString()}),s("div",{class:"stat-lbl",children:u("analytics.totalMemories")})]}),s("div",{class:"stat",children:[s("div",{class:"stat-val",children:e.totalObservations.toLocaleString()}),s("div",{class:"stat-lbl",children:u("analytics.knowledgeFacts")})]}),s("div",{class:"stat",children:[s("div",{class:"stat-val",children:e.totalRelations.toLocaleString()}),s("div",{class:"stat-lbl",children:u("analytics.connections")})]}),s("div",{class:"stat",children:[s("div",{class:"stat-val",children:e.totalTags.toLocaleString()}),s("div",{class:"stat-lbl",children:u("analytics.topics")})]})]}),s("div",{class:"card",children:[s("div",{class:"card-title",children:u("analytics.insights")}),s("div",{class:"insight",children:[s("span",{class:"insight-icon",children:"📝"}),s("span",{class:"insight-text",children:u("analytics.thisWeek")}),s("span",{class:"insight-val",children:[l," ",u("analytics.new")]})]}),s("div",{class:"insight",children:[s("span",{class:"insight-icon",children:"💤"}),s("span",{class:"insight-text",children:u("analytics.stale")}),s("span",{class:"insight-val",children:m})]}),s("div",{class:"insight",children:[s("span",{class:"insight-icon",children:"📦"}),s("span",{class:"insight-text",children:u("analytics.archivedLabel")}),s("span",{class:"insight-val",children:c})]})]}),p.length>0&&s("div",{class:"card",children:[s("div",{class:"card-title",children:u("analytics.mostRecalled")}),p.map((h,b)=>{const x=["Commit:","[SESSION]","Branch:","Diff stats:","Details:","[WORK]","[FOCUS]","[SUMMARY]","Session edited","Total tool calls","Duration:"],v=(h.observations||[]).find(M=>!x.some(y=>M.startsWith(y))&&M.length>10)||h.observations?.[0]||h.name,k=v.length>80?v.slice(0,80)+"…":v;return s("div",{class:"insight",children:[s("span",{class:"insight-icon",style:{fontSize:14,color:"var(--text-3)"},children:["#",b+1]}),s("span",{class:"insight-text",style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:k}),s("span",{class:"insight-val",children:[h.access_count,"×"]})]},h.id)})]}),(()=>{const h=["auto_saved","auto-tracked","session_end","session:","source:","scope:","date:","urgency:"],b=e.tagDistribution.filter(x=>!h.some(v=>x.tag.startsWith(v))&&!/^\d{4}-\d{2}-\d{2}/.test(x.tag));return b.length>0?s("div",{class:"card",children:[s("div",{class:"card-title",children:u("analytics.topics")}),s("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:b.slice(0,30).map(x=>s("span",{class:"tag",style:{fontSize:Math.max(11,Math.min(15,10+Math.log2(x.count+1)))+"px"},children:[x.tag," ",s("span",{style:{opacity:.5},children:["(",x.count,")"]})]},x.tag))})]}):null})()]})}function Ge(e){return e&&e.charAt(0).toUpperCase()+e.slice(1)}function $t(){const[e,t]=S(null),[n,a]=S(""),[i,r]=S(""),[o,d]=S(""),[_,l]=S(!1),[m,c]=S(""),[p,h]=S(!0);K(()=>{W("GET","/v1/config").then(v=>{t(v),a(v.config.llm?.provider||""),d(v.config.llm?.model||"")}).finally(()=>h(!1))},[]);async function b(){l(!0),c("");try{const v={provider:n};o&&(v.model=o),i&&(v.apiKey=i),await W("POST","/v1/config",{llm:v}),c(u("settings.saved")),r("")}catch(v){c(u("common.error")+": "+v.message)}finally{l(!1)}}if(p)return s("div",{class:"empty",children:s("div",{class:"loading"})});const x=e?.capabilities;return s("div",{children:[s("div",{class:"card",children:[s("div",{class:"card-title",children:u("settings.capabilities")}),s("div",{class:"stats-row",style:{marginBottom:0},children:[s("div",{class:"stat",children:[s("div",{class:"stat-val",style:{fontSize:18},children:["Level ",x?.searchLevel||0]}),s("div",{class:"stat-lbl",children:x?.searchLevel?u("settings.smartMode"):u("settings.core")})]}),s("div",{class:"stat",children:[s("div",{class:"stat-val",style:{fontSize:14},children:Ge(x?.embeddings||"—")}),s("div",{class:"stat-lbl",children:u("settings.embeddings")})]}),s("div",{class:"stat",children:[s("div",{class:"stat-val",style:{fontSize:14},children:Ge(x?.llm?.provider||"None")}),s("div",{class:"stat-lbl",children:u("settings.llmProvider")})]})]})]}),s("div",{class:"card",children:[s("div",{class:"card-title",children:u("settings.llmProvider")}),s("div",{style:{display:"flex",gap:16,marginBottom:14},children:[["anthropic","Anthropic (Claude)"],["openai","OpenAI"],["ollama","Ollama (Local)"]].map(([v,k])=>s("label",{style:{display:"flex",alignItems:"center",gap:5,cursor:"pointer",fontSize:13},children:[s("input",{type:"radio",name:"provider",value:v,checked:n===v,onChange:()=>a(v)}),k]},v))}),n&&n!=="ollama"&&s("div",{style:{marginBottom:12},children:[s("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:u("settings.apiKey")}),s("input",{type:"password",placeholder:n==="anthropic"?"sk-ant-api03-…":"sk-…",value:i,onInput:v=>r(v.target.value)})]}),s("div",{style:{marginBottom:14},children:[s("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:u("settings.model")}),s("input",{type:"text",placeholder:n==="anthropic"?"claude-haiku-4-5":n==="openai"?"gpt-4o-mini":"llama3.2",value:o,onInput:v=>d(v.target.value)})]}),s("div",{style:{display:"flex",gap:10,alignItems:"center"},children:[s("button",{class:"btn btn-primary",onClick:b,disabled:!n||_,children:u(_?"settings.saving":"settings.save")}),m&&s("span",{style:{fontSize:12,color:m.startsWith(u("common.error"))?"var(--danger)":"var(--success)"},children:m})]})]}),s("div",{class:"card",children:[s("div",{class:"card-title",children:u("settings.language")}),s("select",{value:Ct(),onChange:v=>{St(v.target.value),window.location.reload()},style:{fontSize:13,padding:"6px 10px",borderRadius:6,border:"1px solid var(--border)",background:"var(--surface)",color:"var(--text-1)",cursor:"pointer"},children:At().map(v=>s("option",{value:v.code,children:v.name},v.code))})]})]})}const zt={decision:"#3b82f6",pattern:"#22c55e",lesson_learned:"#f97316",commit:"#8b5cf6","session-insight":"#6b7280"},Dt="#94a3b8";function Ue(e){return zt[e]||Dt}function Ht(){const[e,t]=S(null),[n,a]=S(!0),[i,r]=S(""),o=O(null),d=O([]),_=O([]),l=O(0),m=O({node:null,offsetX:0,offsetY:0}),c=O(null),p=O({x:0,y:0,node:null});K(()=>{Rt().then(t).catch(y=>r(y.message)).finally(()=>a(!1))},[]),K(()=>{if(!e)return;const y=o.current;if(!y)return;const g=y.parentElement?.clientWidth||800,w=500;y.width=g*window.devicePixelRatio,y.height=w*window.devicePixelRatio,y.style.width=g+"px",y.style.height=w+"px";const B=new Map;e.entities.forEach(A=>{B.set(A.name,{id:A.name,type:A.type,x:Math.random()*g*.8+g*.1,y:Math.random()*w*.8+w*.1,vx:0,vy:0,radius:6})}),d.current=Array.from(B.values()),_.current=e.relations.filter(A=>B.has(A.from)&&B.has(A.to));const N=()=>{const A=d.current,I=_.current,z=window.devicePixelRatio,L=y.getContext("2d");if(!L)return;const Ce=.85,at=2e3,ot=80,ct=.02,Ae=.005;for(let f=0;f<A.length;f++)for(let T=f+1;T<A.length;T++){const E=A[T].x-A[f].x,F=A[T].y-A[f].y,$=Math.sqrt(E*E+F*F)||1,U=at/($*$),Y=E/$*U,V=F/$*U;A[f].vx-=Y,A[f].vy-=V,A[T].vx+=Y,A[T].vy+=V}const te=new Map(A.map(f=>[f.id,f]));for(const f of I){const T=te.get(f.from),E=te.get(f.to);if(!T||!E)continue;const F=E.x-T.x,$=E.y-T.y,U=Math.sqrt(F*F+$*$)||1,Y=(U-ot)*ct,V=F/U*Y,Te=$/U*Y;T.vx+=V,T.vy+=Te,E.vx-=V,E.vy-=Te}const lt=g/2,dt=w/2;for(const f of A)f.vx+=(lt-f.x)*Ae,f.vy+=(dt-f.y)*Ae;for(const f of A)m.current.node!==f&&(f.vx*=Ce,f.vy*=Ce,f.x+=f.vx,f.y+=f.vy,f.x=Math.max(20,Math.min(g-20,f.x)),f.y=Math.max(20,Math.min(w-20,f.y)));L.setTransform(z,0,0,z,0,0),L.clearRect(0,0,g,w),L.lineWidth=1,L.strokeStyle="rgba(113, 113, 122, 0.3)",L.font="9px system-ui, sans-serif",L.fillStyle="rgba(113, 113, 122, 0.5)";for(const f of I){const T=te.get(f.from),E=te.get(f.to);if(!T||!E)continue;L.beginPath(),L.moveTo(T.x,T.y),L.lineTo(E.x,E.y),L.stroke();const F=(T.x+E.x)/2,$=(T.y+E.y)/2;L.fillText(f.type,F+2,$-2)}for(const f of A){const T=c.current===f,E=T?9:f.radius;L.beginPath(),L.arc(f.x,f.y,E,0,Math.PI*2),L.fillStyle=Ue(f.type),L.fill(),T&&(L.strokeStyle="#fff",L.lineWidth=2,L.stroke()),L.fillStyle="#d4d4d8",L.font="10px system-ui, sans-serif";const F=f.id.length>20?f.id.slice(0,18)+"...":f.id;L.fillText(F,f.x+E+4,f.y+3)}const q=p.current;if(q.node){const f=q.x+12,T=q.y-10,E=`${q.node.id} (${q.node.type})`,F=L.measureText(E).width;L.fillStyle="rgba(15, 15, 18, 0.92)",L.strokeStyle="rgba(59, 130, 246, 0.3)",L.lineWidth=1,L.beginPath(),L.roundRect(f-4,T-12,F+8,18,4),L.fill(),L.stroke(),L.fillStyle="#fafafa",L.font="11px system-ui, sans-serif",L.fillText(E,f,T)}l.current=requestAnimationFrame(N)};return l.current=requestAnimationFrame(N),()=>cancelAnimationFrame(l.current)},[e]);const h=Q((y,g)=>{for(const w of d.current){const B=w.x-y,N=w.y-g;if(B*B+N*N<144)return w}return null},[]),b=Q(y=>{const g=o.current;if(!g)return{x:0,y:0};const w=g.getBoundingClientRect();return{x:y.clientX-w.left,y:y.clientY-w.top}},[]),x=Q(y=>{const g=b(y),w=h(g.x,g.y);w&&(m.current={node:w,offsetX:g.x-w.x,offsetY:g.y-w.y})},[h,b]),v=Q(y=>{const g=b(y);m.current.node&&(m.current.node.x=g.x-m.current.offsetX,m.current.node.y=g.y-m.current.offsetY,m.current.node.vx=0,m.current.node.vy=0);const w=h(g.x,g.y);c.current=w,p.current=w?{x:g.x,y:g.y,node:w}:{x:0,y:0,node:null};const B=o.current;B&&(B.style.cursor=w?"grab":"default")},[h,b]),k=Q(()=>{m.current={node:null,offsetX:0,offsetY:0}},[]);if(n)return s("div",{class:"empty",children:s("div",{class:"loading"})});if(i)return s("div",{class:"error-box",children:[u("common.error"),": ",i]});if(!e)return s("div",{class:"error-box",children:[u("common.error"),": No data"]});const M=new Map;return e.entities.forEach(y=>M.set(y.type,(M.get(y.type)||0)+1)),s("div",{children:[s("div",{class:"stats-row",children:[s("div",{class:"stat",children:[s("div",{class:"stat-val",children:e.entities.length.toLocaleString()}),s("div",{class:"stat-lbl",children:u("graph.entities")})]}),s("div",{class:"stat",children:[s("div",{class:"stat-val",children:e.relations.length.toLocaleString()}),s("div",{class:"stat-lbl",children:u("graph.relations")})]})]}),s("div",{class:"card",style:{padding:12},children:[s("div",{style:{display:"flex",alignItems:"center",gap:16,marginBottom:8,flexWrap:"wrap"},children:[s("span",{class:"card-title",style:{margin:0},children:u("tab.graph")}),Array.from(M.entries()).map(([y,g])=>s("span",{style:{display:"inline-flex",alignItems:"center",gap:4,fontSize:11,color:"var(--text-2)"},children:[s("span",{style:{width:8,height:8,borderRadius:"50%",background:Ue(y),display:"inline-block"}}),y," (",g,")"]},y))]}),s("canvas",{ref:o,style:{width:"100%",height:500,borderRadius:"var(--radius-sm)",background:"var(--bg-0)"},onMouseDown:x,onMouseMove:v,onMouseUp:k,onMouseLeave:k})]})]})}function Kt(e){const t=e.observations||[],n=d=>{const _=t.find(l=>l.startsWith(d));return _?_.slice(d.length).trim():""},a=e.tags||[];let i=null;a.includes("severity:critical")?i="critical":a.includes("severity:major")?i="major":a.includes("severity:minor")&&(i="minor");const r=a.find(d=>d.startsWith("project:")),o=r?r.slice(8):"";return{entity:e,error:n("Error:"),rootCause:n("Root cause:"),fix:n("Fix:"),prevention:n("Prevention:"),severity:i,project:o,confidence:e.confidence??1}}const ve={critical:"#ef4444",major:"#f97316",minor:"#3b82f6"};function Ot(){const[e,t]=S([]),[n,a]=S(!0),[i,r]=S("");return K(()=>{Bt().then(o=>t(o.map(Kt))).catch(o=>r(o.message)).finally(()=>a(!1))},[]),n?s("div",{class:"empty",children:s("div",{class:"loading"})}):i?s("div",{class:"error-box",children:[u("common.error"),": ",i]}):e.length===0?s("div",{class:"empty",children:[s("span",{class:"empty-icon",children:"📝"}),u("lessons.empty")]}):s("div",{children:[s("div",{class:"stats-row",children:[s("div",{class:"stat",children:[s("div",{class:"stat-val",children:e.length}),s("div",{class:"stat-lbl",children:u("lessons.total")})]}),s("div",{class:"stat",children:[s("div",{class:"stat-val",children:e.filter(o=>o.severity==="critical").length}),s("div",{class:"stat-lbl",children:u("lessons.critical")})]})]}),e.map(o=>{const d=o.severity?ve[o.severity]:"var(--border)";return s("div",{class:"card",style:{borderLeft:`3px solid ${d}`},children:[s("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:10},children:[s("div",{class:"card-title",style:{margin:0,flex:1,minWidth:0},children:o.entity.name}),s("div",{style:{display:"flex",gap:6,flexShrink:0},children:[o.project&&s("span",{class:"tag",children:o.project}),o.severity&&s("span",{class:"badge",style:{background:`${ve[o.severity]}18`,color:ve[o.severity]},children:o.severity}),s("span",{class:"badge",style:{background:"var(--accent-soft)",color:"var(--accent-hover)"},children:[Math.round(o.confidence*100),"%"]})]})]}),o.error&&s("div",{style:{marginBottom:8},children:[s("div",{style:{fontSize:11,fontWeight:600,color:"#ef4444",marginBottom:2},children:u("lessons.error")}),s("div",{style:{fontSize:13,color:"var(--text-1)",lineHeight:1.5},children:o.error})]}),o.rootCause&&s("div",{style:{marginBottom:8},children:[s("div",{style:{fontSize:11,fontWeight:600,color:"#f59e0b",marginBottom:2},children:u("lessons.rootCause")}),s("div",{style:{fontSize:13,color:"var(--text-1)",lineHeight:1.5},children:o.rootCause})]}),o.fix&&s("div",{style:{marginBottom:8},children:[s("div",{style:{fontSize:11,fontWeight:600,color:"#22c55e",marginBottom:2},children:u("lessons.fix")}),s("div",{style:{fontSize:13,color:"var(--text-1)",lineHeight:1.5},children:o.fix})]}),o.prevention&&s("div",{style:{marginBottom:8},children:[s("div",{style:{fontSize:11,fontWeight:600,color:"#3b82f6",marginBottom:2},children:u("lessons.prevention")}),s("div",{style:{fontSize:13,color:"var(--text-1)",lineHeight:1.5},children:o.prevention})]})]},o.entity.id)})]})}Lt();const Gt=["Search","Browse","Analytics","Graph","Lessons","Manage","Settings"],Ut={Search:"tab.search",Browse:"tab.browse",Analytics:"tab.analytics",Graph:"tab.graph",Lessons:"tab.lessons",Manage:"tab.manage",Settings:"tab.settings"};function jt(){const[e,t]=S("Browse"),[n,a]=S(null),[i,r]=S("");K(()=>{W("GET","/v1/health").then(a).catch(d=>r(d.message))},[]);const o=Gt.map(d=>({key:d,label:u(Ut[d])}));return s("div",{class:"shell",children:[s(Tt,{health:n,error:i}),s(Et,{tabs:o,active:e,onSelect:d=>t(d)}),s("div",{class:"main",children:[s("div",{class:`panel ${e==="Search"?"active":""}`,children:s(Wt,{})}),s("div",{class:`panel ${e==="Browse"?"active":""}`,children:s(Oe,{})}),s("div",{class:`panel ${e==="Analytics"?"active":""}`,children:s(Nt,{})}),s("div",{class:`panel ${e==="Graph"?"active":""}`,children:e==="Graph"&&s(Ht,{})}),s("div",{class:`panel ${e==="Lessons"?"active":""}`,children:e==="Lessons"&&s(Ot,{})}),s("div",{class:`panel ${e==="Manage"?"active":""}`,children:e==="Manage"&&s(Oe,{manage:!0})}),s("div",{class:`panel ${e==="Settings"?"active":""}`,children:e==="Settings"&&s($t,{})})]}),s("button",{class:"fb-btn",onClick:()=>{const d="https://github.com/PCIRCLE-AI/memesh-llm-memory/issues/new?title="+encodeURIComponent("[Feedback] ")+"&labels=feedback,from-dashboard";window.open(d,"_blank")},children:u("feedback.button")})]})}ft(s(jt,{}),document.getElementById("app"));</script>
|
|
11
|
-
<
|
|
9
|
+
<link rel="preconnect" href="https://api.fontshare.com" crossorigin />
|
|
10
|
+
<link href="https://api.fontshare.com/v2/css?f[]=satoshi@400,500,600,700&display=swap" rel="stylesheet" />
|
|
11
|
+
<link href="https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet" />
|
|
12
|
+
<script type="module" crossorigin>(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))o(l);new MutationObserver(l=>{for(const a of l)if(a.type==="childList")for(const r of a.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&o(r)}).observe(document,{childList:!0,subtree:!0});function n(l){const a={};return l.integrity&&(a.integrity=l.integrity),l.referrerPolicy&&(a.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?a.credentials="include":l.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function o(l){if(l.ep)return;l.ep=!0;const a=n(l);fetch(l.href,a)}})();var Ae,E,kt,te,et,xt,St,Fe,_e,de,Lt,qe,He,De,Se={},Le=[],es=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Te=Array.isArray;function J(e,s){for(var n in s)e[n]=s[n];return e}function je(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function ts(e,s,n){var o,l,a,r={};for(a in s)a=="key"?o=s[a]:a=="ref"?l=s[a]:r[a]=s[a];if(arguments.length>2&&(r.children=arguments.length>3?Ae.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(a in e.defaultProps)r[a]===void 0&&(r[a]=e.defaultProps[a]);return we(e,r,o,l,null)}function we(e,s,n,o,l){var a={type:e,props:s,key:n,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:l??++kt,__i:-1,__u:0};return l==null&&E.vnode!=null&&E.vnode(a),a}function se(e){return e.children}function ke(e,s){this.props=e,this.context=s}function ce(e,s){if(s==null)return e.__?ce(e.__,e.__i+1):null;for(var n;s<e.__k.length;s++)if((n=e.__k[s])!=null&&n.__e!=null)return n.__e;return typeof e.type=="function"?ce(e):null}function ss(e){if(e.__P&&e.__d){var s=e.__v,n=s.__e,o=[],l=[],a=J({},s);a.__v=s.__v+1,E.vnode&&E.vnode(a),Ge(e.__P,a,s,e.__n,e.__P.namespaceURI,32&s.__u?[n]:null,o,n??ce(s),!!(32&s.__u),l),a.__v=s.__v,a.__.__k[a.__i]=a,Tt(o,a,l),s.__e=s.__=null,a.__e!=n&&Mt(a)}}function Mt(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(s){if(s!=null&&s.__e!=null)return e.__e=e.__c.base=s.__e}),Mt(e)}function tt(e){(!e.__d&&(e.__d=!0)&&te.push(e)&&!Me.__r++||et!=E.debounceRendering)&&((et=E.debounceRendering)||xt)(Me)}function Me(){try{for(var e,s=1;te.length;)te.length>s&&te.sort(St),e=te.shift(),s=te.length,ss(e)}finally{te.length=Me.__r=0}}function Ct(e,s,n,o,l,a,r,c,u,d,g){var i,p,v,x,y,b,w,M=o&&o.__k||Le,D=s.length;for(u=ns(n,s,M,u,D),i=0;i<D;i++)(v=n.__k[i])!=null&&(p=v.__i!=-1&&M[v.__i]||Se,v.__i=i,b=Ge(e,v,p,l,a,r,c,u,d,g),x=v.__e,v.ref&&p.ref!=v.ref&&(p.ref&&Oe(p.ref,null,v),g.push(v.ref,v.__c||x,v)),y==null&&x!=null&&(y=x),(w=!!(4&v.__u))||p.__k===v.__k?(u=At(v,u,e,w),w&&p.__e&&(p.__e=null)):typeof v.type=="function"&&b!==void 0?u=b:x&&(u=x.nextSibling),v.__u&=-7);return n.__e=y,u}function ns(e,s,n,o,l){var a,r,c,u,d,g=n.length,i=g,p=0;for(e.__k=new Array(l),a=0;a<l;a++)(r=s[a])!=null&&typeof r!="boolean"&&typeof r!="function"?(typeof r=="string"||typeof r=="number"||typeof r=="bigint"||r.constructor==String?r=e.__k[a]=we(null,r,null,null,null):Te(r)?r=e.__k[a]=we(se,{children:r},null,null,null):r.constructor===void 0&&r.__b>0?r=e.__k[a]=we(r.type,r.props,r.key,r.ref?r.ref:null,r.__v):e.__k[a]=r,u=a+p,r.__=e,r.__b=e.__b+1,c=null,(d=r.__i=as(r,n,u,i))!=-1&&(i--,(c=n[d])&&(c.__u|=2)),c==null||c.__v==null?(d==-1&&(l>g?p--:l<g&&p++),typeof r.type!="function"&&(r.__u|=4)):d!=u&&(d==u-1?p--:d==u+1?p++:(d>u?p--:p++,r.__u|=4))):e.__k[a]=null;if(i)for(a=0;a<g;a++)(c=n[a])!=null&&(2&c.__u)==0&&(c.__e==o&&(o=ce(c)),Rt(c,c));return o}function At(e,s,n,o){var l,a;if(typeof e.type=="function"){for(l=e.__k,a=0;l&&a<l.length;a++)l[a]&&(l[a].__=e,s=At(l[a],s,n,o));return s}e.__e!=s&&(o&&(s&&e.type&&!s.parentNode&&(s=ce(e)),n.insertBefore(e.__e,s||null)),s=e.__e);do s=s&&s.nextSibling;while(s!=null&&s.nodeType==8);return s}function as(e,s,n,o){var l,a,r,c=e.key,u=e.type,d=s[n],g=d!=null&&(2&d.__u)==0;if(d===null&&c==null||g&&c==d.key&&u==d.type)return n;if(o>(g?1:0)){for(l=n-1,a=n+1;l>=0||a<s.length;)if((d=s[r=l>=0?l--:a++])!=null&&(2&d.__u)==0&&c==d.key&&u==d.type)return r}return-1}function st(e,s,n){s[0]=="-"?e.setProperty(s,n??""):e[s]=n==null?"":typeof n!="number"||es.test(s)?n:n+"px"}function ve(e,s,n,o,l){var a,r;e:if(s=="style")if(typeof n=="string")e.style.cssText=n;else{if(typeof o=="string"&&(e.style.cssText=o=""),o)for(s in o)n&&s in n||st(e.style,s,"");if(n)for(s in n)o&&n[s]==o[s]||st(e.style,s,n[s])}else if(s[0]=="o"&&s[1]=="n")a=s!=(s=s.replace(Lt,"$1")),r=s.toLowerCase(),s=r in e||s=="onFocusOut"||s=="onFocusIn"?r.slice(2):s.slice(2),e.l||(e.l={}),e.l[s+a]=n,n?o?n[de]=o[de]:(n[de]=qe,e.addEventListener(s,a?De:He,a)):e.removeEventListener(s,a?De:He,a);else{if(l=="http://www.w3.org/2000/svg")s=s.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(s!="width"&&s!="height"&&s!="href"&&s!="list"&&s!="form"&&s!="tabIndex"&&s!="download"&&s!="rowSpan"&&s!="colSpan"&&s!="role"&&s!="popover"&&s in e)try{e[s]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&s[4]!="-"?e.removeAttribute(s):e.setAttribute(s,s=="popover"&&n==1?"":n))}}function nt(e){return function(s){if(this.l){var n=this.l[s.type+e];if(s[_e]==null)s[_e]=qe++;else if(s[_e]<n[de])return;return n(E.event?E.event(s):s)}}}function Ge(e,s,n,o,l,a,r,c,u,d){var g,i,p,v,x,y,b,w,M,D,_,I,Z,V,Y,K=s.type;if(s.constructor!==void 0)return null;128&n.__u&&(u=!!(32&n.__u),a=[c=s.__e=n.__e]),(g=E.__b)&&g(s);e:if(typeof K=="function")try{if(w=s.props,M=K.prototype&&K.prototype.render,D=(g=K.contextType)&&o[g.__c],_=g?D?D.props.value:g.__:o,n.__c?b=(i=s.__c=n.__c).__=i.__E:(M?s.__c=i=new K(w,_):(s.__c=i=new ke(w,_),i.constructor=K,i.render=is),D&&D.sub(i),i.state||(i.state={}),i.__n=o,p=i.__d=!0,i.__h=[],i._sb=[]),M&&i.__s==null&&(i.__s=i.state),M&&K.getDerivedStateFromProps!=null&&(i.__s==i.state&&(i.__s=J({},i.__s)),J(i.__s,K.getDerivedStateFromProps(w,i.__s))),v=i.props,x=i.state,i.__v=s,p)M&&K.getDerivedStateFromProps==null&&i.componentWillMount!=null&&i.componentWillMount(),M&&i.componentDidMount!=null&&i.__h.push(i.componentDidMount);else{if(M&&K.getDerivedStateFromProps==null&&w!==v&&i.componentWillReceiveProps!=null&&i.componentWillReceiveProps(w,_),s.__v==n.__v||!i.__e&&i.shouldComponentUpdate!=null&&i.shouldComponentUpdate(w,i.__s,_)===!1){s.__v!=n.__v&&(i.props=w,i.state=i.__s,i.__d=!1),s.__e=n.__e,s.__k=n.__k,s.__k.some(function(ee){ee&&(ee.__=s)}),Le.push.apply(i.__h,i._sb),i._sb=[],i.__h.length&&r.push(i);break e}i.componentWillUpdate!=null&&i.componentWillUpdate(w,i.__s,_),M&&i.componentDidUpdate!=null&&i.__h.push(function(){i.componentDidUpdate(v,x,y)})}if(i.context=_,i.props=w,i.__P=e,i.__e=!1,I=E.__r,Z=0,M)i.state=i.__s,i.__d=!1,I&&I(s),g=i.render(i.props,i.state,i.context),Le.push.apply(i.__h,i._sb),i._sb=[];else do i.__d=!1,I&&I(s),g=i.render(i.props,i.state,i.context),i.state=i.__s;while(i.__d&&++Z<25);i.state=i.__s,i.getChildContext!=null&&(o=J(J({},o),i.getChildContext())),M&&!p&&i.getSnapshotBeforeUpdate!=null&&(y=i.getSnapshotBeforeUpdate(v,x)),V=g!=null&&g.type===se&&g.key==null?Et(g.props.children):g,c=Ct(e,Te(V)?V:[V],s,n,o,l,a,r,c,u,d),i.base=s.__e,s.__u&=-161,i.__h.length&&r.push(i),b&&(i.__E=i.__=null)}catch(ee){if(s.__v=null,u||a!=null)if(ee.then){for(s.__u|=u?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;a[a.indexOf(c)]=null,s.__e=c}else{for(Y=a.length;Y--;)je(a[Y]);We(s)}else s.__e=n.__e,s.__k=n.__k,ee.then||We(s);E.__e(ee,s,n)}else a==null&&s.__v==n.__v?(s.__k=n.__k,s.__e=n.__e):c=s.__e=rs(n.__e,s,n,o,l,a,r,u,d);return(g=E.diffed)&&g(s),128&s.__u?void 0:c}function We(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(We))}function Tt(e,s,n){for(var o=0;o<n.length;o++)Oe(n[o],n[++o],n[++o]);E.__c&&E.__c(s,e),e.some(function(l){try{e=l.__h,l.__h=[],e.some(function(a){a.call(l)})}catch(a){E.__e(a,l.__v)}})}function Et(e){return typeof e!="object"||e==null||e.__b>0?e:Te(e)?e.map(Et):J({},e)}function rs(e,s,n,o,l,a,r,c,u){var d,g,i,p,v,x,y,b=n.props||Se,w=s.props,M=s.type;if(M=="svg"?l="http://www.w3.org/2000/svg":M=="math"?l="http://www.w3.org/1998/Math/MathML":l||(l="http://www.w3.org/1999/xhtml"),a!=null){for(d=0;d<a.length;d++)if((v=a[d])&&"setAttribute"in v==!!M&&(M?v.localName==M:v.nodeType==3)){e=v,a[d]=null;break}}if(e==null){if(M==null)return document.createTextNode(w);e=document.createElementNS(l,M,w.is&&w),c&&(E.__m&&E.__m(s,a),c=!1),a=null}if(M==null)b===w||c&&e.data==w||(e.data=w);else{if(a=a&&Ae.call(e.childNodes),!c&&a!=null)for(b={},d=0;d<e.attributes.length;d++)b[(v=e.attributes[d]).name]=v.value;for(d in b)v=b[d],d=="dangerouslySetInnerHTML"?i=v:d=="children"||d in w||d=="value"&&"defaultValue"in w||d=="checked"&&"defaultChecked"in w||ve(e,d,null,v,l);for(d in w)v=w[d],d=="children"?p=v:d=="dangerouslySetInnerHTML"?g=v:d=="value"?x=v:d=="checked"?y=v:c&&typeof v!="function"||b[d]===v||ve(e,d,v,b[d],l);if(g)c||i&&(g.__html==i.__html||g.__html==e.innerHTML)||(e.innerHTML=g.__html),s.__k=[];else if(i&&(e.innerHTML=""),Ct(s.type=="template"?e.content:e,Te(p)?p:[p],s,n,o,M=="foreignObject"?"http://www.w3.org/1999/xhtml":l,a,r,a?a[0]:n.__k&&ce(n,0),c,u),a!=null)for(d=a.length;d--;)je(a[d]);c||(d="value",M=="progress"&&x==null?e.removeAttribute("value"):x!=null&&(x!==e[d]||M=="progress"&&!x||M=="option"&&x!=b[d])&&ve(e,d,x,b[d],l),d="checked",y!=null&&y!=e[d]&&ve(e,d,y,b[d],l))}return e}function Oe(e,s,n){try{if(typeof e=="function"){var o=typeof e.__u=="function";o&&e.__u(),o&&s==null||(e.__u=e(s))}else e.current=s}catch(l){E.__e(l,n)}}function Rt(e,s,n){var o,l;if(E.unmount&&E.unmount(e),(o=e.ref)&&(o.current&&o.current!=e.__e||Oe(o,null,s)),(o=e.__c)!=null){if(o.componentWillUnmount)try{o.componentWillUnmount()}catch(a){E.__e(a,s)}o.base=o.__P=null}if(o=e.__k)for(l=0;l<o.length;l++)o[l]&&Rt(o[l],s,n||typeof e.type!="function");n||je(e.__e),e.__c=e.__=e.__e=void 0}function is(e,s,n){return this.constructor(e,n)}function ls(e,s,n){var o,l,a,r;s==document&&(s=document.documentElement),E.__&&E.__(e,s),l=(o=!1)?null:s.__k,a=[],r=[],Ge(s,e=s.__k=ts(se,null,[e]),l||Se,Se,s.namespaceURI,l?null:s.firstChild?Ae.call(s.childNodes):null,a,l?l.__e:s.firstChild,o,r),Tt(a,e,r)}Ae=Le.slice,E={__e:function(e,s,n,o){for(var l,a,r;s=s.__;)if((l=s.__c)&&!l.__)try{if((a=l.constructor)&&a.getDerivedStateFromError!=null&&(l.setState(a.getDerivedStateFromError(e)),r=l.__d),l.componentDidCatch!=null&&(l.componentDidCatch(e,o||{}),r=l.__d),r)return l.__E=l}catch(c){e=c}throw e}},kt=0,ke.prototype.setState=function(e,s){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=J({},this.state),typeof e=="function"&&(e=e(J({},n),this.props)),e&&J(n,e),e!=null&&this.__v&&(s&&this._sb.push(s),tt(this))},ke.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),tt(this))},ke.prototype.render=se,te=[],xt=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,St=function(e,s){return e.__v.__b-s.__v.__b},Me.__r=0,Fe=Math.random().toString(8),_e="__d"+Fe,de="__a"+Fe,Lt=/(PointerCapture)$|Capture$/i,qe=0,He=nt(!1),De=nt(!0);var os=0;function t(e,s,n,o,l,a){s||(s={});var r,c,u=s;if("ref"in u)for(c in u={},s)c=="ref"?r=s[c]:u[c]=s[c];var d={type:e,props:u,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--os,__i:-1,__u:0,__source:l,__self:a};if(typeof e=="function"&&(r=e.defaultProps))for(c in r)u[c]===void 0&&(u[c]=r[c]);return E.vnode&&E.vnode(d),d}var he,P,Be,at,ue=0,Pt=[],F=E,rt=F.__b,it=F.__r,lt=F.diffed,ot=F.__c,ct=F.unmount,dt=F.__;function Ke(e,s){F.__h&&F.__h(P,e,ue||s),ue=0;var n=P.__H||(P.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function A(e){return ue=1,cs(zt,e)}function cs(e,s,n){var o=Ke(he++,2);if(o.t=e,!o.__c&&(o.__=[zt(void 0,s),function(c){var u=o.__N?o.__N[0]:o.__[0],d=o.t(u,c);u!==d&&(o.__N=[d,o.__[1]],o.__c.setState({}))}],o.__c=P,!P.__f)){var l=function(c,u,d){if(!o.__c.__H)return!0;var g=o.__c.__H.__.filter(function(p){return p.__c});if(g.every(function(p){return!p.__N}))return!a||a.call(this,c,u,d);var i=o.__c.props!==c;return g.some(function(p){if(p.__N){var v=p.__[0];p.__=p.__N,p.__N=void 0,v!==p.__[0]&&(i=!0)}}),a&&a.call(this,c,u,d)||i};P.__f=!0;var a=P.shouldComponentUpdate,r=P.componentWillUpdate;P.componentWillUpdate=function(c,u,d){if(this.__e){var g=a;a=void 0,l(c,u,d),a=g}r&&r.call(this,c,u,d)},P.shouldComponentUpdate=l}return o.__N||o.__}function G(e,s){var n=Ke(he++,3);!F.__s&&Bt(n.__H,s)&&(n.__=e,n.u=s,P.__H.__h.push(n))}function j(e){return ue=5,Ft(function(){return{current:e}},[])}function Ft(e,s){var n=Ke(he++,7);return Bt(n.__H,s)&&(n.__=e(),n.__H=s,n.__h=e),n.__}function le(e,s){return ue=8,Ft(function(){return e},s)}function ds(){for(var e;e=Pt.shift();){var s=e.__H;if(e.__P&&s)try{s.__h.some(xe),s.__h.some($e),s.__h=[]}catch(n){s.__h=[],F.__e(n,e.__v)}}}F.__b=function(e){P=null,rt&&rt(e)},F.__=function(e,s){e&&s.__k&&s.__k.__m&&(e.__m=s.__k.__m),dt&&dt(e,s)},F.__r=function(e){it&&it(e),he=0;var s=(P=e.__c).__H;s&&(Be===P?(s.__h=[],P.__h=[],s.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(s.__h.some(xe),s.__h.some($e),s.__h=[],he=0)),Be=P},F.diffed=function(e){lt&<(e);var s=e.__c;s&&s.__H&&(s.__H.__h.length&&(Pt.push(s)!==1&&at===F.requestAnimationFrame||((at=F.requestAnimationFrame)||hs)(ds)),s.__H.__.some(function(n){n.u&&(n.__H=n.u),n.u=void 0})),Be=P=null},F.__c=function(e,s){s.some(function(n){try{n.__h.some(xe),n.__h=n.__h.filter(function(o){return!o.__||$e(o)})}catch(o){s.some(function(l){l.__h&&(l.__h=[])}),s=[],F.__e(o,n.__v)}}),ot&&ot(e,s)},F.unmount=function(e){ct&&ct(e);var s,n=e.__c;n&&n.__H&&(n.__H.__.some(function(o){try{xe(o)}catch(l){s=l}}),n.__H=void 0,s&&F.__e(s,n.__v))};var ht=typeof requestAnimationFrame=="function";function hs(e){var s,n=function(){clearTimeout(o),ht&&cancelAnimationFrame(s),setTimeout(e)},o=setTimeout(n,35);ht&&(s=requestAnimationFrame(n))}function xe(e){var s=P,n=e.__c;typeof n=="function"&&(e.__c=void 0,n()),P=s}function $e(e){var s=P;e.__c=e.__(),P=s}function Bt(e,s){return!e||e.length!==s.length||s.some(function(n,o){return n!==e[o]})}function zt(e,s){return typeof s=="function"?s(e):s}const Ce={en:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Connected","header.disconnected":"Disconnected","header.connecting":"Connecting…","header.memories":"memories","tab.search":"Search","tab.browse":"Browse","tab.analytics":"Analytics","tab.manage":"Manage","tab.graph":"Graph","tab.lessons":"Lessons","tab.settings":"Settings","search.title":"Search Memories","search.placeholder":'Search your memories… (e.g., "auth", "database", "bug fix")',"search.button":"Search","search.searching":"Searching…","search.results":"results","search.result":"result","search.noResults":"No results for","search.hint":"Search by entity name, observation content, or tags. Supports FTS5 full-text + vector similarity.","search.facts":"facts","browse.title":"All Memories","browse.manage":"Manage Memories","browse.active":"active","browse.archived":"archived","browse.filter":"Filter by content, type, or tag…","browse.refresh":"Refresh","browse.noMemories":"No memories yet","browse.noMatch":"No memories matching","browse.prev":"← Prev","browse.next":"Next →","browse.archive":"Archive","browse.restore":"Restore","browse.confirmArchive":"Archive this memory?","browse.moreArchived":"more archived memories","analytics.totalMemories":"Total Memories","analytics.knowledgeFacts":"Knowledge Facts","analytics.connections":"Connections","analytics.topics":"Topics","analytics.insights":"Insights","analytics.thisWeek":"This week","analytics.new":"new","analytics.stale":"Stale (30+ days unused)","analytics.archivedLabel":"Archived","analytics.mostRecalled":"Most Recalled","health.title":"Memory Health","health.excellent":"Excellent","health.good":"Good","health.fair":"Fair","health.poor":"Poor","health.activity":"Activity","health.quality":"Quality","health.freshness":"Freshness","health.lessons":"Self-Improvement","timeline.title":"Last 30 Days","timeline.created":"Created","timeline.recalled":"Recalled","value.totalRecalls":"Total Recalls","value.lessonsLearned":"Lessons Learned","value.lessonsSaved":"Lessons Applied","value.coverage":"Knowledge Coverage","cleanup.title":"Cleanup Suggestions","cleanup.allClean":"Your memory is clean. No stale or duplicate entities detected.","cleanup.staleLabel":"Low confidence / unused","cleanup.duplicateLabel":"Possible duplicates","cleanup.confidence":"confidence","cleanup.unused":"unused","cleanup.consolidateHint":"Use the consolidate tool to merge similar entities.","settings.capabilities":"Capabilities","settings.smartMode":"Smart Mode","settings.core":"Core","settings.embeddings":"Embeddings","settings.llmProvider":"LLM Provider","settings.apiKey":"API Key","settings.model":"Model (optional)","settings.save":"Save","settings.saving":"Saving…","settings.saved":"Saved! Restart server for LLM changes to take effect.","settings.language":"Language","graph.entities":"Entities","graph.relations":"Relations","graph.orphans":"Orphans","graph.search":"Search nodes…","graph.matches":"matches","graph.focusMode":"Focus","graph.showAll":"Show all","graph.clickHint":"Click a node to focus","lessons.total":"Total Lessons","lessons.critical":"Critical","lessons.empty":"No lessons recorded yet. Use the learn tool or enable Smart Mode.","lessons.error":"Error","lessons.rootCause":"Root Cause","lessons.fix":"Fix","lessons.prevention":"Prevention","feedback.button":"💬 Feedback","feedback.title":"Send Feedback","feedback.bug":"Bug","feedback.feature":"Feature","feedback.question":"Question","feedback.placeholder":"Describe your feedback…","feedback.includeSys":"Include system info","feedback.submit":"Open GitHub Issue","patterns.title":"Your Patterns","patterns.workSchedule":"Work Schedule","patterns.peakHours":"Peak hours","patterns.busiestDays":"Busiest days","patterns.tools":"Top Tools","patterns.workflow":"Workflow","patterns.avgSession":"Avg Session","patterns.commitsPerSession":"Commits/Session","patterns.focus":"Focus Areas","patterns.strengths":"Strengths","patterns.learning":"Learning Areas","recall.effectiveness":"Effectiveness","recall.hits":"Hits","recall.misses":"Misses","recall.tracked":"Tracked","recall.hitRate":"Recall Hit Rate","recall.used":"used","recall.injected":"injected","recall.mostEffective":"Most Effective","recall.leastEffective":"Least Effective","recall.noData":"No recall data yet. Effectiveness tracking starts after your next session.","common.error":"Error","common.loading":"Loading…"},"zh-TW":{"brand.subtitle":"powered by pcircle.ai","header.connected":"已連線","header.disconnected":"已斷線","header.connecting":"連線中…","header.memories":"筆記憶","tab.search":"搜尋","tab.browse":"瀏覽","tab.analytics":"分析","tab.manage":"管理","tab.graph":"關係圖","tab.lessons":"經驗教訓","tab.settings":"設定","search.title":"搜尋記憶","search.placeholder":"搜尋你的記憶…(例如:「auth」、「資料庫」、「bug 修復」)","search.button":"搜尋","search.searching":"搜尋中…","search.results":"個結果","search.result":"個結果","search.noResults":"找不到符合的結果:","search.hint":"可依實體名稱、觀察內容或標籤搜尋。支援 FTS5 全文檢索 + 向量相似度搜尋。","search.facts":"筆事實","browse.title":"所有記憶","browse.manage":"管理記憶","browse.active":"使用中","browse.archived":"已封存","browse.filter":"依內容、類型或標籤篩選…","browse.refresh":"重新整理","browse.noMemories":"尚無記憶","browse.noMatch":"找不到符合的記憶:","browse.prev":"← 上一頁","browse.next":"下一頁 →","browse.archive":"封存","browse.restore":"還原","browse.confirmArchive":"確定要封存此記憶?","browse.moreArchived":"筆已封存的記憶","analytics.totalMemories":"記憶總數","analytics.knowledgeFacts":"知識事實","analytics.connections":"關聯","analytics.topics":"主題","analytics.insights":"洞察","analytics.thisWeek":"本週","analytics.new":"筆新增","analytics.stale":"閒置(30 天以上未使用)","analytics.archivedLabel":"已封存","analytics.mostRecalled":"最常查閱","health.title":"記憶健康度","health.excellent":"優秀","health.good":"良好","health.fair":"普通","health.poor":"不佳","health.activity":"活躍度","health.quality":"品質","health.freshness":"新鮮度","health.lessons":"自我改善","timeline.title":"最近 30 天","timeline.created":"新增","timeline.recalled":"召回","value.totalRecalls":"總召回次數","value.lessonsLearned":"經驗教訓","value.lessonsSaved":"已應用教訓","value.coverage":"知識覆蓋率","cleanup.title":"清理建議","cleanup.allClean":"記憶庫很乾淨,沒有偵測到過時或重複的實體。","cleanup.staleLabel":"低信心度 / 未使用","cleanup.duplicateLabel":"可能重複","cleanup.confidence":"信心度","cleanup.unused":"未使用","cleanup.consolidateHint":"使用 consolidate 工具合併相似的實體。","settings.capabilities":"功能狀態","settings.smartMode":"智慧模式","settings.core":"基礎","settings.embeddings":"嵌入模型","settings.llmProvider":"LLM 提供者","settings.apiKey":"API 金鑰","settings.model":"模型(選填)","settings.save":"儲存","settings.saving":"儲存中…","settings.saved":"已儲存!重啟伺服器以套用 LLM 設定。","settings.language":"語言","graph.entities":"實體","graph.relations":"關聯","graph.orphans":"孤立節點","graph.search":"搜尋節點…","graph.matches":"個符合","graph.focusMode":"聚焦","graph.showAll":"顯示全部","graph.clickHint":"點擊節點以聚焦","lessons.total":"教訓總數","lessons.critical":"嚴重","lessons.empty":"尚無教訓記錄。請使用 learn 工具或啟用智慧模式。","lessons.error":"錯誤","lessons.rootCause":"根本原因","lessons.fix":"修復方式","lessons.prevention":"預防措施","feedback.button":"💬 意見回饋","feedback.title":"傳送意見回饋","feedback.bug":"錯誤","feedback.feature":"功能建議","feedback.question":"問題","feedback.placeholder":"描述你的意見回饋…","feedback.includeSys":"附帶系統資訊","feedback.submit":"開啟 GitHub Issue","patterns.title":"你的模式","patterns.workSchedule":"工作時程","patterns.peakHours":"尖峰時段","patterns.busiestDays":"最忙碌的日子","patterns.tools":"常用工具","patterns.workflow":"工作流程","patterns.avgSession":"平均工作階段","patterns.commitsPerSession":"每次提交數","patterns.focus":"關注領域","patterns.strengths":"強項","patterns.learning":"學習領域","recall.effectiveness":"有效性","recall.hits":"命中","recall.misses":"未命中","recall.tracked":"追蹤中","recall.hitRate":"記憶命中率","recall.used":"已使用","recall.injected":"已注入","recall.mostEffective":"最有效","recall.leastEffective":"最低效","recall.noData":"尚無召回數據。下次會話後開始追蹤有效性。","common.error":"錯誤","common.loading":"載入中…"},"zh-CN":{"brand.subtitle":"powered by pcircle.ai","header.connected":"已连接","header.disconnected":"已断开","header.connecting":"连接中…","header.memories":"条记忆","tab.search":"搜索","tab.browse":"浏览","tab.analytics":"分析","tab.manage":"管理","tab.graph":"关系图","tab.lessons":"经验教训","tab.settings":"设置","search.title":"搜索记忆","search.placeholder":'搜索你的记忆…(例如:"auth"、"数据库"、"bug 修复")',"search.button":"搜索","search.searching":"搜索中…","search.results":"个结果","search.result":"个结果","search.noResults":"没有找到结果:","search.hint":"可按实体名称、观察内容或标签搜索。支持 FTS5 全文检索 + 向量相似度搜索。","search.facts":"条事实","browse.title":"所有记忆","browse.manage":"管理记忆","browse.active":"活跃","browse.archived":"已归档","browse.filter":"按内容、类型或标签筛选…","browse.refresh":"刷新","browse.noMemories":"暂无记忆","browse.noMatch":"没有匹配的记忆:","browse.prev":"← 上一页","browse.next":"下一页 →","browse.archive":"归档","browse.restore":"恢复","browse.confirmArchive":"确定要归档此记忆?","browse.moreArchived":"条已归档记忆","analytics.totalMemories":"记忆总数","analytics.knowledgeFacts":"知识事实","analytics.connections":"关联","analytics.topics":"主题","analytics.insights":"洞察","analytics.thisWeek":"本周","analytics.new":"条新增","analytics.stale":"闲置(30 天以上未使用)","analytics.archivedLabel":"已归档","analytics.mostRecalled":"最常查阅","health.title":"记忆健康度","health.excellent":"优秀","health.good":"良好","health.fair":"一般","health.poor":"较差","health.activity":"活跃度","health.quality":"质量","health.freshness":"新鲜度","health.lessons":"自我改善","timeline.title":"最近 30 天","timeline.created":"新增","timeline.recalled":"召回","value.totalRecalls":"总召回次数","value.lessonsLearned":"经验教训","value.lessonsSaved":"已应用教训","value.coverage":"知识覆盖率","cleanup.title":"清理建议","cleanup.allClean":"记忆库很干净,没有检测到过时或重复的实体。","cleanup.staleLabel":"低置信度 / 未使用","cleanup.duplicateLabel":"可能重复","cleanup.confidence":"置信度","cleanup.unused":"未使用","cleanup.consolidateHint":"使用 consolidate 工具合并相似的实体。","settings.capabilities":"功能状态","settings.smartMode":"智能模式","settings.core":"基础","settings.embeddings":"嵌入模型","settings.llmProvider":"LLM 提供商","settings.apiKey":"API 密钥","settings.model":"模型(选填)","settings.save":"保存","settings.saving":"保存中…","settings.saved":"已保存!重启服务器以应用 LLM 设置。","settings.language":"语言","graph.entities":"实体","graph.relations":"关联","graph.orphans":"孤立节点","graph.search":"搜索节点…","graph.matches":"个匹配","graph.focusMode":"聚焦","graph.showAll":"显示全部","graph.clickHint":"点击节点以聚焦","lessons.total":"教训总数","lessons.critical":"严重","lessons.empty":"尚无教训记录。请使用 learn 工具或启用智能模式。","lessons.error":"错误","lessons.rootCause":"根本原因","lessons.fix":"修复方式","lessons.prevention":"预防措施","feedback.button":"💬 反馈","feedback.title":"发送反馈","feedback.bug":"错误","feedback.feature":"功能建议","feedback.question":"问题","feedback.placeholder":"描述你的反馈…","feedback.includeSys":"附带系统信息","feedback.submit":"打开 GitHub Issue","patterns.title":"你的模式","patterns.workSchedule":"工作时程","patterns.peakHours":"高峰时段","patterns.busiestDays":"最忙碌的日子","patterns.tools":"常用工具","patterns.workflow":"工作流程","patterns.avgSession":"平均工作时长","patterns.commitsPerSession":"每次提交数","patterns.focus":"关注领域","patterns.strengths":"强项","patterns.learning":"学习领域","recall.effectiveness":"有效性","recall.hits":"命中","recall.misses":"未命中","recall.tracked":"追踪中","recall.hitRate":"记忆命中率","recall.used":"已使用","recall.injected":"已注入","recall.mostEffective":"最有效","recall.leastEffective":"最低效","recall.noData":"暂无召回数据。下次会话后开始追踪有效性。","common.error":"错误","common.loading":"加载中…"},ja:{"brand.subtitle":"powered by pcircle.ai","header.connected":"接続中","header.disconnected":"切断","header.connecting":"接続しています…","header.memories":"件のメモリ","tab.search":"検索","tab.browse":"一覧","tab.analytics":"分析","tab.manage":"管理","tab.graph":"グラフ","tab.lessons":"教訓","tab.settings":"設定","search.title":"メモリを検索","search.placeholder":"メモリを検索…(例:「auth」「データベース」「バグ修正」)","search.button":"検索","search.searching":"検索中…","search.results":"件の結果","search.result":"件の結果","search.noResults":"結果が見つかりません:","search.facts":"件の事実","browse.title":"すべてのメモリ","browse.manage":"メモリを管理","browse.active":"アクティブ","browse.archived":"アーカイブ済み","browse.filter":"内容、タイプ、タグで絞り込み…","browse.refresh":"更新","browse.noMemories":"メモリがありません","browse.noMatch":"一致するメモリがありません:","browse.prev":"← 前へ","browse.next":"次へ →","browse.archive":"アーカイブ","browse.restore":"復元","browse.confirmArchive":"このメモリをアーカイブしますか?","browse.moreArchived":"件のアーカイブ済みメモリ","analytics.totalMemories":"メモリ総数","analytics.knowledgeFacts":"知識ファクト","analytics.connections":"接続","analytics.topics":"トピック","analytics.insights":"インサイト","analytics.thisWeek":"今週","analytics.new":"件の新規","analytics.stale":"未使用(30日以上)","analytics.archivedLabel":"アーカイブ済み","analytics.mostRecalled":"よく参照される","health.title":"メモリ健康度","health.excellent":"優秀","health.good":"良好","health.fair":"普通","health.poor":"不良","health.activity":"アクティビティ","health.quality":"品質","health.freshness":"新鮮度","health.lessons":"自己改善","timeline.title":"過去30日間","timeline.created":"作成","timeline.recalled":"呼び出し","value.totalRecalls":"総呼び出し回数","value.lessonsLearned":"学んだ教訓","value.lessonsSaved":"適用済み教訓","value.coverage":"知識カバレッジ","cleanup.title":"クリーンアップ提案","cleanup.allClean":"メモリはきれいです。古いまたは重複したエンティティは検出されませんでした。","cleanup.staleLabel":"低信頼度 / 未使用","cleanup.duplicateLabel":"重複の可能性","cleanup.confidence":"信頼度","cleanup.unused":"未使用","cleanup.consolidateHint":"consolidateツールを使用して類似エンティティを統合してください。","settings.capabilities":"機能状態","settings.smartMode":"スマートモード","settings.core":"コア","settings.embeddings":"エンベディング","settings.llmProvider":"LLMプロバイダー","settings.apiKey":"APIキー","settings.model":"モデル(任意)","settings.save":"保存","settings.saving":"保存中…","settings.saved":"保存しました!LLM設定を反映するにはサーバーを再起動してください。","settings.language":"言語","graph.entities":"エンティティ","graph.relations":"リレーション","graph.orphans":"孤立ノード","graph.search":"ノードを検索…","graph.matches":"件一致","graph.focusMode":"フォーカス","graph.showAll":"すべて表示","graph.clickHint":"ノードをクリックしてフォーカス","lessons.total":"教訓の総数","lessons.critical":"重大","lessons.empty":"まだ教訓が記録されていません。learnツールを使用するか、スマートモードを有効にしてください。","lessons.error":"エラー","lessons.rootCause":"根本原因","lessons.fix":"修正方法","lessons.prevention":"予防策","feedback.button":"💬 フィードバック","feedback.title":"フィードバックを送信","feedback.bug":"バグ","feedback.feature":"機能提案","feedback.question":"質問","feedback.placeholder":"フィードバックを記入…","feedback.includeSys":"システム情報を含める","feedback.submit":"GitHub Issue を作成","patterns.title":"あなたのパターン","patterns.workSchedule":"作業スケジュール","patterns.peakHours":"ピーク時間帯","patterns.busiestDays":"最も忙しい曜日","patterns.tools":"よく使うツール","patterns.workflow":"ワークフロー","patterns.avgSession":"平均セッション","patterns.commitsPerSession":"コミット/セッション","patterns.focus":"フォーカスエリア","patterns.strengths":"強み","patterns.learning":"学習エリア","recall.effectiveness":"有効性","recall.hits":"ヒット","recall.misses":"ミス","recall.tracked":"追跡中","recall.hitRate":"リコール命中率","recall.used":"使用済み","recall.injected":"注入済み","recall.mostEffective":"最も効果的","recall.leastEffective":"最も非効果的","recall.noData":"リコールデータはまだありません。次のセッション後に追跡が開始されます。","common.error":"エラー","common.loading":"読み込み中…"},ko:{"brand.subtitle":"powered by pcircle.ai","header.connected":"연결됨","header.disconnected":"연결 끊김","header.connecting":"연결 중…","header.memories":"개의 기억","tab.search":"검색","tab.browse":"둘러보기","tab.analytics":"분석","tab.manage":"관리","tab.graph":"그래프","tab.lessons":"교훈","tab.settings":"설정","search.title":"기억 검색","search.placeholder":'기억 검색… (예: "auth", "데이터베이스", "버그 수정")',"search.button":"검색","search.searching":"검색 중…","search.results":"개의 결과","search.result":"개의 결과","search.noResults":"결과를 찾을 수 없습니다:","search.facts":"개의 사실","browse.title":"모든 기억","browse.manage":"기억 관리","browse.active":"활성","browse.archived":"보관됨","browse.filter":"내용, 유형 또는 태그로 필터링…","browse.refresh":"새로고침","browse.noMemories":"기억이 없습니다","browse.noMatch":"일치하는 기억이 없습니다:","browse.prev":"← 이전","browse.next":"다음 →","browse.archive":"보관","browse.restore":"복원","browse.confirmArchive":"이 기억을 보관하시겠습니까?","browse.moreArchived":"개의 보관된 기억","analytics.totalMemories":"총 기억 수","analytics.knowledgeFacts":"지식 사실","analytics.connections":"연결","analytics.topics":"주제","analytics.insights":"인사이트","analytics.thisWeek":"이번 주","analytics.new":"개 신규","analytics.stale":"비활성 (30일 이상 미사용)","analytics.archivedLabel":"보관됨","analytics.mostRecalled":"가장 많이 조회됨","health.title":"메모리 건강도","health.excellent":"우수","health.good":"양호","health.fair":"보통","health.poor":"불량","health.activity":"활동","health.quality":"품질","health.freshness":"최신성","health.lessons":"자기 개선","timeline.title":"최근 30일","timeline.created":"생성","timeline.recalled":"호출","value.totalRecalls":"총 호출 횟수","value.lessonsLearned":"학습된 교훈","value.lessonsSaved":"적용된 교훈","value.coverage":"지식 커버리지","cleanup.title":"정리 제안","cleanup.allClean":"메모리가 깨끗합니다. 오래되었거나 중복된 엔티티가 감지되지 않았습니다.","cleanup.staleLabel":"낮은 신뢰도 / 미사용","cleanup.duplicateLabel":"중복 가능성","cleanup.confidence":"신뢰도","cleanup.unused":"미사용","cleanup.consolidateHint":"consolidate 도구를 사용하여 유사 엔티티를 병합하세요.","settings.capabilities":"기능 상태","settings.smartMode":"스마트 모드","settings.core":"기본","settings.embeddings":"임베딩","settings.llmProvider":"LLM 제공자","settings.apiKey":"API 키","settings.model":"모델 (선택)","settings.save":"저장","settings.saving":"저장 중…","settings.saved":"저장되었습니다! LLM 설정을 적용하려면 서버를 재시작하세요.","settings.language":"언어","graph.entities":"엔티티","graph.relations":"관계","graph.orphans":"고립 노드","graph.search":"노드 검색…","graph.matches":"개 일치","graph.focusMode":"포커스","graph.showAll":"모두 표시","graph.clickHint":"노드를 클릭하여 포커스","lessons.total":"총 교훈","lessons.critical":"심각","lessons.empty":"아직 기록된 교훈이 없습니다. learn 도구를 사용하거나 스마트 모드를 활성화하세요.","lessons.error":"오류","lessons.rootCause":"근본 원인","lessons.fix":"수정 방법","lessons.prevention":"예방 조치","feedback.button":"💬 피드백","feedback.title":"피드백 보내기","feedback.bug":"버그","feedback.feature":"기능 제안","feedback.question":"질문","feedback.placeholder":"피드백을 설명해주세요…","feedback.includeSys":"시스템 정보 포함","feedback.submit":"GitHub Issue 열기","patterns.title":"나의 패턴","patterns.workSchedule":"작업 일정","patterns.peakHours":"피크 시간대","patterns.busiestDays":"가장 바쁜 요일","patterns.tools":"자주 쓰는 도구","patterns.workflow":"워크플로우","patterns.avgSession":"평균 세션","patterns.commitsPerSession":"커밋/세션","patterns.focus":"집중 영역","patterns.strengths":"강점","patterns.learning":"학습 영역","recall.effectiveness":"효과","recall.hits":"적중","recall.misses":"미적중","recall.tracked":"추적 중","recall.hitRate":"리콜 적중률","recall.used":"사용됨","recall.injected":"주입됨","recall.mostEffective":"가장 효과적","recall.leastEffective":"가장 비효과적","recall.noData":"아직 리콜 데이터가 없습니다. 다음 세션 후 추적이 시작됩니다.","common.error":"오류","common.loading":"로딩 중…"},pt:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Conectado","header.disconnected":"Desconectado","header.connecting":"Conectando…","header.memories":"memórias","tab.search":"Buscar","tab.browse":"Explorar","tab.analytics":"Análise","tab.manage":"Gerenciar","tab.graph":"Grafo","tab.lessons":"Lições","tab.settings":"Configurações","search.title":"Buscar Memórias","search.placeholder":'Buscar memórias… (ex.: "auth", "banco de dados", "bug fix")',"search.button":"Buscar","search.searching":"Buscando…","search.results":"resultados","search.result":"resultado","search.noResults":"Nenhum resultado para","search.facts":"fatos","browse.title":"Todas as Memórias","browse.manage":"Gerenciar Memórias","browse.active":"ativas","browse.archived":"arquivadas","browse.filter":"Filtrar por conteúdo, tipo ou tag…","browse.refresh":"Atualizar","browse.noMemories":"Sem memórias ainda","browse.noMatch":"Nenhuma memória corresponde a","browse.prev":"← Anterior","browse.next":"Próximo →","browse.archive":"Arquivar","browse.restore":"Restaurar","browse.confirmArchive":"Arquivar esta memória?","browse.moreArchived":"memórias arquivadas","analytics.totalMemories":"Total de Memórias","analytics.knowledgeFacts":"Fatos","analytics.connections":"Conexões","analytics.topics":"Tópicos","analytics.insights":"Insights","analytics.thisWeek":"Esta semana","analytics.new":"novas","analytics.stale":"Inativas (30+ dias sem uso)","analytics.archivedLabel":"Arquivadas","analytics.mostRecalled":"Mais Consultadas","health.title":"Saúde da Memória","health.excellent":"Excelente","health.good":"Bom","health.fair":"Regular","health.poor":"Fraco","health.activity":"Atividade","health.quality":"Qualidade","health.freshness":"Frescor","health.lessons":"Auto-melhoria","timeline.title":"Últimos 30 Dias","timeline.created":"Criadas","timeline.recalled":"Recuperadas","value.totalRecalls":"Total de Recuperações","value.lessonsLearned":"Lições Aprendidas","value.lessonsSaved":"Lições Aplicadas","value.coverage":"Cobertura de Conhecimento","cleanup.title":"Sugestões de Limpeza","cleanup.allClean":"Sua memória está limpa. Nenhuma entidade obsoleta ou duplicada detectada.","cleanup.staleLabel":"Baixa confiança / não usado","cleanup.duplicateLabel":"Possíveis duplicatas","cleanup.confidence":"confiança","cleanup.unused":"não usado","cleanup.consolidateHint":"Use a ferramenta consolidate para mesclar entidades similares.","settings.capabilities":"Capacidades","settings.smartMode":"Modo Inteligente","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Provedor LLM","settings.apiKey":"Chave API","settings.model":"Modelo (opcional)","settings.save":"Salvar","settings.saving":"Salvando…","settings.saved":"Salvo! Reinicie o servidor para aplicar as configurações do LLM.","settings.language":"Idioma","graph.entities":"Entidades","graph.relations":"Relações","graph.orphans":"Orphans","graph.search":"Buscar nós…","graph.matches":"correspondências","graph.focusMode":"Foco","graph.showAll":"Mostrar tudo","graph.clickHint":"Clique em um nó para focar","lessons.total":"Total de Lições","lessons.critical":"Críticas","lessons.empty":"Nenhuma lição registrada. Use a ferramenta learn ou ative o Modo Inteligente.","lessons.error":"Erro","lessons.rootCause":"Causa Raiz","lessons.fix":"Correção","lessons.prevention":"Prevenção","feedback.button":"💬 Feedback","feedback.title":"Enviar Feedback","feedback.bug":"Bug","feedback.feature":"Sugestão","feedback.question":"Pergunta","feedback.placeholder":"Descreva seu feedback…","feedback.includeSys":"Incluir informações do sistema","feedback.submit":"Abrir GitHub Issue","patterns.title":"Seus Padrões","patterns.workSchedule":"Agenda de Trabalho","patterns.peakHours":"Horários de pico","patterns.busiestDays":"Dias mais movimentados","patterns.tools":"Ferramentas Principais","patterns.workflow":"Fluxo de Trabalho","patterns.avgSession":"Sessão Média","patterns.commitsPerSession":"Commits/Sessão","patterns.focus":"Áreas de Foco","patterns.strengths":"Pontos Fortes","patterns.learning":"Áreas de Aprendizado","recall.effectiveness":"Eficácia","recall.hits":"Acertos","recall.misses":"Erros","recall.tracked":"Rastreados","recall.hitRate":"Taxa de Acerto","recall.used":"usadas","recall.injected":"injetadas","recall.mostEffective":"Mais Eficazes","recall.leastEffective":"Menos Eficazes","recall.noData":"Ainda sem dados de recall. O rastreamento começa após a próxima sessão.","common.error":"Erro","common.loading":"Carregando…"},fr:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Connecté","header.disconnected":"Déconnecté","header.connecting":"Connexion…","header.memories":"mémoires","tab.search":"Recherche","tab.browse":"Parcourir","tab.analytics":"Analyse","tab.manage":"Gérer","tab.graph":"Graphe","tab.lessons":"Leçons","tab.settings":"Paramètres","search.title":"Rechercher des mémoires","search.placeholder":"Rechercher vos mémoires… (ex. : « auth », « base de données », « bug fix »)","search.button":"Rechercher","search.searching":"Recherche…","search.results":"résultats","search.result":"résultat","search.noResults":"Aucun résultat pour","search.facts":"faits","browse.title":"Toutes les mémoires","browse.manage":"Gérer les mémoires","browse.active":"actives","browse.archived":"archivées","browse.filter":"Filtrer par contenu, type ou tag…","browse.refresh":"Actualiser","browse.noMemories":"Pas encore de mémoires","browse.noMatch":"Aucune mémoire correspondant à","browse.prev":"← Précédent","browse.next":"Suivant →","browse.archive":"Archiver","browse.restore":"Restaurer","browse.confirmArchive":"Archiver cette mémoire ?","browse.moreArchived":"mémoires archivées","analytics.totalMemories":"Total des mémoires","analytics.knowledgeFacts":"Faits de connaissance","analytics.connections":"Connexions","analytics.topics":"Sujets","analytics.insights":"Aperçus","analytics.thisWeek":"Cette semaine","analytics.new":"nouvelles","analytics.stale":"Inactives (30+ jours sans utilisation)","analytics.archivedLabel":"Archivées","analytics.mostRecalled":"Les plus consultées","health.title":"Santé de la mémoire","health.excellent":"Excellent","health.good":"Bon","health.fair":"Moyen","health.poor":"Faible","health.activity":"Activité","health.quality":"Qualité","health.freshness":"Fraîcheur","health.lessons":"Auto-amélioration","timeline.title":"30 derniers jours","timeline.created":"Créés","timeline.recalled":"Rappelés","value.totalRecalls":"Total des rappels","value.lessonsLearned":"Leçons apprises","value.lessonsSaved":"Leçons appliquées","value.coverage":"Couverture des connaissances","cleanup.title":"Suggestions de nettoyage","cleanup.allClean":"Votre mémoire est propre. Aucune entité obsolète ou en double détectée.","cleanup.staleLabel":"Faible confiance / non utilisé","cleanup.duplicateLabel":"Doublons possibles","cleanup.confidence":"confiance","cleanup.unused":"non utilisé","cleanup.consolidateHint":"Utilisez l'outil consolidate pour fusionner les entités similaires.","settings.capabilities":"Capacités","settings.smartMode":"Mode intelligent","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Fournisseur LLM","settings.apiKey":"Clé API","settings.model":"Modèle (optionnel)","settings.save":"Enregistrer","settings.saving":"Enregistrement…","settings.saved":"Enregistré ! Redémarrez le serveur pour appliquer les paramètres LLM.","settings.language":"Langue","graph.entities":"Entités","graph.relations":"Relations","graph.orphans":"Orphelins","graph.search":"Rechercher des nœuds…","graph.matches":"correspondances","graph.focusMode":"Focus","graph.showAll":"Tout afficher","graph.clickHint":"Cliquez sur un nœud pour le cibler","lessons.total":"Total des leçons","lessons.critical":"Critiques","lessons.empty":"Aucune leçon enregistrée. Utilisez l'outil learn ou activez le Mode intelligent.","lessons.error":"Erreur","lessons.rootCause":"Cause racine","lessons.fix":"Correction","lessons.prevention":"Prévention","feedback.button":"💬 Retour","feedback.title":"Envoyer un retour","feedback.bug":"Bug","feedback.feature":"Suggestion","feedback.question":"Question","feedback.placeholder":"Décrivez votre retour…","feedback.includeSys":"Inclure les infos système","feedback.submit":"Ouvrir un GitHub Issue","patterns.title":"Vos habitudes","patterns.workSchedule":"Planning de travail","patterns.peakHours":"Heures de pointe","patterns.busiestDays":"Jours les plus chargés","patterns.tools":"Outils principaux","patterns.workflow":"Flux de travail","patterns.avgSession":"Session moyenne","patterns.commitsPerSession":"Commits/Session","patterns.focus":"Domaines de focus","patterns.strengths":"Points forts","patterns.learning":"Domaines d'apprentissage","recall.effectiveness":"Efficacité","recall.hits":"Succès","recall.misses":"Échecs","recall.tracked":"Suivis","recall.hitRate":"Taux de succès","recall.used":"utilisées","recall.injected":"injectées","recall.mostEffective":"Plus efficaces","recall.leastEffective":"Moins efficaces","recall.noData":"Pas encore de données. Le suivi commence après la prochaine session.","common.error":"Erreur","common.loading":"Chargement…"},de:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Verbunden","header.disconnected":"Getrennt","header.connecting":"Verbinden…","header.memories":"Erinnerungen","tab.search":"Suche","tab.browse":"Durchsuchen","tab.analytics":"Analyse","tab.manage":"Verwalten","tab.graph":"Graph","tab.lessons":"Lektionen","tab.settings":"Einstellungen","search.title":"Erinnerungen suchen","search.placeholder":'Erinnerungen suchen… (z.B. „auth", „Datenbank", „Bug Fix")',"search.button":"Suchen","search.searching":"Suche läuft…","search.results":"Ergebnisse","search.result":"Ergebnis","search.noResults":"Keine Ergebnisse für","search.facts":"Fakten","browse.title":"Alle Erinnerungen","browse.manage":"Erinnerungen verwalten","browse.active":"aktiv","browse.archived":"archiviert","browse.filter":"Nach Inhalt, Typ oder Tag filtern…","browse.refresh":"Aktualisieren","browse.noMemories":"Noch keine Erinnerungen","browse.noMatch":"Keine passenden Erinnerungen:","browse.prev":"← Zurück","browse.next":"Weiter →","browse.archive":"Archivieren","browse.restore":"Wiederherstellen","browse.confirmArchive":"Diese Erinnerung archivieren?","browse.moreArchived":"archivierte Erinnerungen","analytics.totalMemories":"Erinnerungen gesamt","analytics.knowledgeFacts":"Wissensfakten","analytics.connections":"Verbindungen","analytics.topics":"Themen","analytics.insights":"Einblicke","analytics.thisWeek":"Diese Woche","analytics.new":"neue","analytics.stale":"Inaktiv (30+ Tage ungenutzt)","analytics.archivedLabel":"Archiviert","analytics.mostRecalled":"Am häufigsten abgerufen","health.title":"Speichergesundheit","health.excellent":"Ausgezeichnet","health.good":"Gut","health.fair":"Mittel","health.poor":"Schlecht","health.activity":"Aktivität","health.quality":"Qualität","health.freshness":"Frische","health.lessons":"Selbstverbesserung","timeline.title":"Letzte 30 Tage","timeline.created":"Erstellt","timeline.recalled":"Abgerufen","value.totalRecalls":"Gesamtabrufe","value.lessonsLearned":"Gelernte Lektionen","value.lessonsSaved":"Angewendete Lektionen","value.coverage":"Wissensabdeckung","cleanup.title":"Aufräumvorschläge","cleanup.allClean":"Ihr Speicher ist sauber. Keine veralteten oder doppelten Entitäten erkannt.","cleanup.staleLabel":"Niedrige Konfidenz / ungenutzt","cleanup.duplicateLabel":"Mögliche Duplikate","cleanup.confidence":"Konfidenz","cleanup.unused":"ungenutzt","cleanup.consolidateHint":"Verwenden Sie das Consolidate-Tool um ähnliche Entitäten zusammenzuführen.","settings.capabilities":"Fähigkeiten","settings.smartMode":"Smart-Modus","settings.core":"Basis","settings.embeddings":"Embeddings","settings.llmProvider":"LLM-Anbieter","settings.apiKey":"API-Schlüssel","settings.model":"Modell (optional)","settings.save":"Speichern","settings.saving":"Speichern…","settings.saved":"Gespeichert! Server neu starten, um LLM-Einstellungen anzuwenden.","settings.language":"Sprache","graph.entities":"Entitäten","graph.relations":"Beziehungen","graph.orphans":"Waisen","graph.search":"Knoten suchen…","graph.matches":"Treffer","graph.focusMode":"Fokus","graph.showAll":"Alle anzeigen","graph.clickHint":"Knoten anklicken zum Fokussieren","lessons.total":"Lektionen gesamt","lessons.critical":"Kritisch","lessons.empty":"Noch keine Lektionen erfasst. Verwenden Sie das Learn-Tool oder aktivieren Sie den Smart-Modus.","lessons.error":"Fehler","lessons.rootCause":"Ursache","lessons.fix":"Lösung","lessons.prevention":"Prävention","feedback.button":"💬 Feedback","feedback.title":"Feedback senden","feedback.bug":"Fehler","feedback.feature":"Vorschlag","feedback.question":"Frage","feedback.placeholder":"Beschreiben Sie Ihr Feedback…","feedback.includeSys":"Systeminformationen einschließen","feedback.submit":"GitHub Issue öffnen","patterns.title":"Ihre Muster","patterns.workSchedule":"Arbeitsplan","patterns.peakHours":"Spitzenzeiten","patterns.busiestDays":"Aktivste Tage","patterns.tools":"Top-Werkzeuge","patterns.workflow":"Arbeitsablauf","patterns.avgSession":"Durchschn. Sitzung","patterns.commitsPerSession":"Commits/Sitzung","patterns.focus":"Schwerpunkte","patterns.strengths":"Stärken","patterns.learning":"Lernbereiche","recall.effectiveness":"Effektivität","recall.hits":"Treffer","recall.misses":"Fehltreffer","recall.tracked":"Verfolgt","recall.hitRate":"Trefferquote","recall.used":"verwendet","recall.injected":"injiziert","recall.mostEffective":"Am effektivsten","recall.leastEffective":"Am wenigsten effektiv","recall.noData":"Noch keine Abrufdaten. Die Verfolgung beginnt nach der nächsten Sitzung.","common.error":"Fehler","common.loading":"Laden…"},vi:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Đã kết nối","header.disconnected":"Mất kết nối","header.connecting":"Đang kết nối…","header.memories":"ký ức","tab.search":"Tìm kiếm","tab.browse":"Duyệt","tab.analytics":"Phân tích","tab.manage":"Quản lý","tab.graph":"Đồ thị","tab.lessons":"Bài học","tab.settings":"Cài đặt","search.title":"Tìm kiếm ký ức","search.placeholder":'Tìm kiếm ký ức… (ví dụ: "auth", "cơ sở dữ liệu", "sửa lỗi")',"search.button":"Tìm kiếm","search.searching":"Đang tìm…","search.results":"kết quả","search.result":"kết quả","search.noResults":"Không tìm thấy kết quả cho","search.facts":"sự kiện","browse.title":"Tất cả ký ức","browse.manage":"Quản lý ký ức","browse.active":"hoạt động","browse.archived":"đã lưu trữ","browse.filter":"Lọc theo nội dung, loại hoặc thẻ…","browse.refresh":"Làm mới","browse.noMemories":"Chưa có ký ức","browse.noMatch":"Không có ký ức phù hợp:","browse.prev":"← Trước","browse.next":"Tiếp →","browse.archive":"Lưu trữ","browse.restore":"Khôi phục","browse.confirmArchive":"Lưu trữ ký ức này?","browse.moreArchived":"ký ức đã lưu trữ","analytics.totalMemories":"Tổng ký ức","analytics.knowledgeFacts":"Sự kiện tri thức","analytics.connections":"Kết nối","analytics.topics":"Chủ đề","analytics.insights":"Thông tin","analytics.thisWeek":"Tuần này","analytics.new":"mới","analytics.stale":"Không hoạt động (30+ ngày)","analytics.archivedLabel":"Đã lưu trữ","analytics.mostRecalled":"Được truy xuất nhiều nhất","health.title":"Sức khỏe bộ nhớ","health.excellent":"Xuất sắc","health.good":"Tốt","health.fair":"Trung bình","health.poor":"Kém","health.activity":"Hoạt động","health.quality":"Chất lượng","health.freshness":"Độ mới","health.lessons":"Tự cải thiện","timeline.title":"30 ngày qua","timeline.created":"Đã tạo","timeline.recalled":"Đã gọi lại","value.totalRecalls":"Tổng số lần gọi lại","value.lessonsLearned":"Bài học đã rút ra","value.lessonsSaved":"Bài học đã áp dụng","value.coverage":"Phạm vi kiến thức","cleanup.title":"Gợi ý dọn dẹp","cleanup.allClean":"Bộ nhớ của bạn sạch. Không phát hiện thực thể lỗi thời hoặc trùng lặp.","cleanup.staleLabel":"Độ tin cậy thấp / chưa sử dụng","cleanup.duplicateLabel":"Có thể trùng lặp","cleanup.confidence":"độ tin cậy","cleanup.unused":"chưa sử dụng","cleanup.consolidateHint":"Sử dụng công cụ consolidate để hợp nhất các thực thể tương tự.","settings.capabilities":"Khả năng","settings.smartMode":"Chế độ thông minh","settings.core":"Cơ bản","settings.embeddings":"Embeddings","settings.llmProvider":"Nhà cung cấp LLM","settings.apiKey":"Khóa API","settings.model":"Mô hình (tùy chọn)","settings.save":"Lưu","settings.saving":"Đang lưu…","settings.saved":"Đã lưu! Khởi động lại server để áp dụng cài đặt LLM.","settings.language":"Ngôn ngữ","graph.entities":"Thực thể","graph.relations":"Quan hệ","graph.orphans":"Cô lập","graph.search":"Tìm kiếm nút…","graph.matches":"kết quả","graph.focusMode":"Tập trung","graph.showAll":"Hiển thị tất cả","graph.clickHint":"Nhấp vào nút để tập trung","lessons.total":"Tổng bài học","lessons.critical":"Nghiêm trọng","lessons.empty":"Chưa có bài học nào được ghi nhận. Sử dụng công cụ learn hoặc bật Chế độ thông minh.","lessons.error":"Lỗi","lessons.rootCause":"Nguyên nhân gốc","lessons.fix":"Cách sửa","lessons.prevention":"Phòng ngừa","feedback.button":"💬 Phản hồi","feedback.title":"Gửi phản hồi","feedback.bug":"Lỗi","feedback.feature":"Đề xuất","feedback.question":"Câu hỏi","feedback.placeholder":"Mô tả phản hồi của bạn…","feedback.includeSys":"Kèm thông tin hệ thống","feedback.submit":"Mở GitHub Issue","patterns.title":"Kiểu mẫu của bạn","patterns.workSchedule":"Lịch làm việc","patterns.peakHours":"Giờ cao điểm","patterns.busiestDays":"Ngày bận rộn nhất","patterns.tools":"Công cụ hàng đầu","patterns.workflow":"Quy trình làm việc","patterns.avgSession":"Phiên trung bình","patterns.commitsPerSession":"Commits/Phiên","patterns.focus":"Lĩnh vực tập trung","patterns.strengths":"Điểm mạnh","patterns.learning":"Lĩnh vực học tập","recall.effectiveness":"Hiệu quả","recall.hits":"Trúng","recall.misses":"Trượt","recall.tracked":"Theo dõi","recall.hitRate":"Tỷ lệ trúng","recall.used":"đã dùng","recall.injected":"đã tiêm","recall.mostEffective":"Hiệu quả nhất","recall.leastEffective":"Kém hiệu quả nhất","recall.noData":"Chưa có dữ liệu. Theo dõi sẽ bắt đầu sau phiên tiếp theo.","common.error":"Lỗi","common.loading":"Đang tải…"},es:{"brand.subtitle":"powered by pcircle.ai","header.connected":"Conectado","header.disconnected":"Desconectado","header.connecting":"Conectando…","header.memories":"memorias","tab.search":"Buscar","tab.browse":"Explorar","tab.analytics":"Análisis","tab.manage":"Gestionar","tab.graph":"Grafo","tab.lessons":"Lecciones","tab.settings":"Configuración","search.title":"Buscar memorias","search.placeholder":'Buscar memorias… (ej.: "auth", "base de datos", "corrección")',"search.button":"Buscar","search.searching":"Buscando…","search.results":"resultados","search.result":"resultado","search.noResults":"Sin resultados para","search.facts":"hechos","browse.title":"Todas las memorias","browse.manage":"Gestionar memorias","browse.active":"activas","browse.archived":"archivadas","browse.filter":"Filtrar por contenido, tipo o etiqueta…","browse.refresh":"Actualizar","browse.noMemories":"Aún no hay memorias","browse.noMatch":"No hay memorias que coincidan con","browse.prev":"← Anterior","browse.next":"Siguiente →","browse.archive":"Archivar","browse.restore":"Restaurar","browse.confirmArchive":"¿Archivar esta memoria?","browse.moreArchived":"memorias archivadas","analytics.totalMemories":"Total de memorias","analytics.knowledgeFacts":"Hechos","analytics.connections":"Conexiones","analytics.topics":"Temas","analytics.insights":"Información","analytics.thisWeek":"Esta semana","analytics.new":"nuevas","analytics.stale":"Inactivas (30+ días sin uso)","analytics.archivedLabel":"Archivadas","analytics.mostRecalled":"Más consultadas","health.title":"Salud de la memoria","health.excellent":"Excelente","health.good":"Bueno","health.fair":"Regular","health.poor":"Deficiente","health.activity":"Actividad","health.quality":"Calidad","health.freshness":"Frescura","health.lessons":"Auto-mejora","timeline.title":"Últimos 30 días","timeline.created":"Creados","timeline.recalled":"Recuperados","value.totalRecalls":"Total de recuperaciones","value.lessonsLearned":"Lecciones aprendidas","value.lessonsSaved":"Lecciones aplicadas","value.coverage":"Cobertura de conocimiento","cleanup.title":"Sugerencias de limpieza","cleanup.allClean":"Tu memoria está limpia. No se detectaron entidades obsoletas o duplicadas.","cleanup.staleLabel":"Baja confianza / no usado","cleanup.duplicateLabel":"Posibles duplicados","cleanup.confidence":"confianza","cleanup.unused":"no usado","cleanup.consolidateHint":"Usa la herramienta consolidate para fusionar entidades similares.","settings.capabilities":"Capacidades","settings.smartMode":"Modo inteligente","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Proveedor LLM","settings.apiKey":"Clave API","settings.model":"Modelo (opcional)","settings.save":"Guardar","settings.saving":"Guardando…","settings.saved":"¡Guardado! Reinicie el servidor para aplicar la configuración LLM.","settings.language":"Idioma","graph.entities":"Entidades","graph.relations":"Relaciones","graph.orphans":"Huerfanos","graph.search":"Buscar nodos…","graph.matches":"coincidencias","graph.focusMode":"Enfoque","graph.showAll":"Mostrar todo","graph.clickHint":"Haz clic en un nodo para enfocar","lessons.total":"Total de lecciones","lessons.critical":"Críticas","lessons.empty":"No hay lecciones registradas. Usa la herramienta learn o activa el Modo inteligente.","lessons.error":"Error","lessons.rootCause":"Causa raíz","lessons.fix":"Corrección","lessons.prevention":"Prevención","feedback.button":"💬 Comentarios","feedback.title":"Enviar comentarios","feedback.bug":"Error","feedback.feature":"Sugerencia","feedback.question":"Pregunta","feedback.placeholder":"Describe tu comentario…","feedback.includeSys":"Incluir información del sistema","feedback.submit":"Abrir GitHub Issue","patterns.title":"Tus patrones","patterns.workSchedule":"Horario de trabajo","patterns.peakHours":"Horas pico","patterns.busiestDays":"Días más ocupados","patterns.tools":"Herramientas principales","patterns.workflow":"Flujo de trabajo","patterns.avgSession":"Sesión promedio","patterns.commitsPerSession":"Commits/Sesión","patterns.focus":"Áreas de enfoque","patterns.strengths":"Fortalezas","patterns.learning":"Áreas de aprendizaje","recall.effectiveness":"Eficacia","recall.hits":"Aciertos","recall.misses":"Fallos","recall.tracked":"Rastreados","recall.hitRate":"Tasa de acierto","recall.used":"usadas","recall.injected":"inyectadas","recall.mostEffective":"Más eficaces","recall.leastEffective":"Menos eficaces","recall.noData":"Aún sin datos. El seguimiento comienza después de la próxima sesión.","common.error":"Error","common.loading":"Cargando…"},th:{"brand.subtitle":"powered by pcircle.ai","header.connected":"เชื่อมต่อแล้ว","header.disconnected":"ไม่ได้เชื่อมต่อ","header.connecting":"กำลังเชื่อมต่อ…","header.memories":"ความทรงจำ","tab.search":"ค้นหา","tab.browse":"เรียกดู","tab.analytics":"วิเคราะห์","tab.manage":"จัดการ","tab.graph":"กราฟ","tab.lessons":"บทเรียน","tab.settings":"ตั้งค่า","search.title":"ค้นหาความทรงจำ","search.placeholder":'ค้นหาความทรงจำ… (เช่น "auth", "ฐานข้อมูล", "แก้บั๊ก")',"search.button":"ค้นหา","search.searching":"กำลังค้นหา…","search.results":"ผลลัพธ์","search.result":"ผลลัพธ์","search.noResults":"ไม่พบผลลัพธ์สำหรับ","search.facts":"ข้อเท็จจริง","browse.title":"ความทรงจำทั้งหมด","browse.manage":"จัดการความทรงจำ","browse.active":"ใช้งานอยู่","browse.archived":"เก็บถาวร","browse.filter":"กรองตามเนื้อหา ประเภท หรือแท็ก…","browse.refresh":"รีเฟรช","browse.noMemories":"ยังไม่มีความทรงจำ","browse.noMatch":"ไม่พบความทรงจำที่ตรงกัน:","browse.prev":"← ก่อนหน้า","browse.next":"ถัดไป →","browse.archive":"เก็บถาวร","browse.restore":"กู้คืน","browse.confirmArchive":"เก็บถาวรความทรงจำนี้?","browse.moreArchived":"ความทรงจำที่เก็บถาวร","analytics.totalMemories":"ความทรงจำทั้งหมด","analytics.knowledgeFacts":"ข้อเท็จจริง","analytics.connections":"การเชื่อมต่อ","analytics.topics":"หัวข้อ","analytics.insights":"ข้อมูลเชิงลึก","analytics.thisWeek":"สัปดาห์นี้","analytics.new":"ใหม่","analytics.stale":"ไม่ได้ใช้งาน (30+ วัน)","analytics.archivedLabel":"เก็บถาวร","analytics.mostRecalled":"ถูกเรียกดูมากที่สุด","health.title":"สุขภาพหน่วยความจำ","health.excellent":"ยอดเยี่ยม","health.good":"ดี","health.fair":"พอใช้","health.poor":"ไม่ดี","health.activity":"กิจกรรม","health.quality":"คุณภาพ","health.freshness":"ความสดใหม่","health.lessons":"การพัฒนาตนเอง","timeline.title":"30 วันที่ผ่านมา","timeline.created":"สร้างแล้ว","timeline.recalled":"เรียกคืนแล้ว","value.totalRecalls":"การเรียกคืนทั้งหมด","value.lessonsLearned":"บทเรียนที่เรียนรู้","value.lessonsSaved":"บทเรียนที่นำไปใช้","value.coverage":"ความครอบคลุมความรู้","cleanup.title":"คำแนะนำการทำความสะอาด","cleanup.allClean":"หน่วยความจำของคุณสะอาด ไม่พบเอนทิตีที่ล้าสมัยหรือซ้ำซ้อน","cleanup.staleLabel":"ความเชื่อมั่นต่ำ / ไม่ได้ใช้","cleanup.duplicateLabel":"อาจซ้ำซ้อน","cleanup.confidence":"ความเชื่อมั่น","cleanup.unused":"ไม่ได้ใช้","cleanup.consolidateHint":"ใช้เครื่องมือ consolidate เพื่อรวมเอนทิตีที่คล้ายกัน","settings.capabilities":"ความสามารถ","settings.smartMode":"โหมดอัจฉริยะ","settings.core":"พื้นฐาน","settings.embeddings":"Embeddings","settings.llmProvider":"ผู้ให้บริการ LLM","settings.apiKey":"คีย์ API","settings.model":"โมเดล (ไม่บังคับ)","settings.save":"บันทึก","settings.saving":"กำลังบันทึก…","settings.saved":"บันทึกแล้ว! รีสตาร์ทเซิร์ฟเวอร์เพื่อใช้การตั้งค่า LLM","settings.language":"ภาษา","graph.entities":"เอนทิตี","graph.relations":"ความสัมพันธ์","graph.orphans":"โหนดโดดเดี่ยว","graph.search":"ค้นหาโหนด…","graph.matches":"รายการที่ตรงกัน","graph.focusMode":"โฟกัส","graph.showAll":"แสดงทั้งหมด","graph.clickHint":"คลิกโหนดเพื่อโฟกัส","lessons.total":"บทเรียนทั้งหมด","lessons.critical":"วิกฤต","lessons.empty":"ยังไม่มีบทเรียนที่บันทึกไว้ ใช้เครื่องมือ learn หรือเปิดใช้โหมดอัจฉริยะ","lessons.error":"ข้อผิดพลาด","lessons.rootCause":"สาเหตุหลัก","lessons.fix":"วิธีแก้ไข","lessons.prevention":"การป้องกัน","feedback.button":"💬 ความคิดเห็น","feedback.title":"ส่งความคิดเห็น","feedback.bug":"ข้อผิดพลาด","feedback.feature":"ข้อเสนอแนะ","feedback.question":"คำถาม","feedback.placeholder":"อธิบายความคิดเห็นของคุณ…","feedback.includeSys":"รวมข้อมูลระบบ","feedback.submit":"เปิด GitHub Issue","patterns.title":"รูปแบบของคุณ","patterns.workSchedule":"ตารางการทำงาน","patterns.peakHours":"ช่วงเวลาพีค","patterns.busiestDays":"วันที่ยุ่งที่สุด","patterns.tools":"เครื่องมือยอดนิยม","patterns.workflow":"กระบวนการทำงาน","patterns.avgSession":"เซสชันเฉลี่ย","patterns.commitsPerSession":"คอมมิต/เซสชัน","patterns.focus":"พื้นที่โฟกัส","patterns.strengths":"จุดแข็ง","patterns.learning":"พื้นที่การเรียนรู้","recall.effectiveness":"ประสิทธิผล","recall.hits":"ตรง","recall.misses":"พลาด","recall.tracked":"ติดตาม","recall.hitRate":"อัตราการเรียกคืน","recall.used":"ใช้แล้ว","recall.injected":"ฉีดแล้ว","recall.mostEffective":"มีประสิทธิภาพมากที่สุด","recall.leastEffective":"มีประสิทธิภาพน้อยที่สุด","recall.noData":"ยังไม่มีข้อมูล การติดตามจะเริ่มหลังเซสชันถัดไป","common.error":"ข้อผิดพลาด","common.loading":"กำลังโหลด…"}},us={en:"English","zh-TW":"繁體中文","zh-CN":"简体中文",ja:"日本語",ko:"한국어",pt:"Português",fr:"Français",de:"Deutsch",vi:"Tiếng Việt",es:"Español",th:"ภาษาไทย"};let pe="en";function ps(){const e=localStorage.getItem("memesh-locale");if(e&&Ce[e])return e;const s=navigator.language;if(s.startsWith("zh-TW")||s.startsWith("zh-Hant"))return"zh-TW";if(s.startsWith("zh"))return"zh-CN";const n=s.split("-")[0];return Ce[n]?n:"en"}function gs(){return pe=ps(),pe}function fs(e){pe=e,localStorage.setItem("memesh-locale",e)}function h(e){return Ce[pe]?.[e]||Ce.en[e]||e}function ms(){return pe}function vs(){return Object.entries(us).map(([e,s])=>({code:e,name:s}))}function bs({health:e,error:s}){return t("div",{class:"header",children:[t("div",{class:"header-brand",children:[t("h1",{children:"MeMesh LLM Memory"}),t("small",{children:h("brand.subtitle")})]}),t("div",{class:"header-right",children:t("div",{class:"header-meta",children:e?t(se,{children:[t("span",{children:[t("span",{class:"dot dot-ok"}),h("header.connected")]}),t("span",{class:"badge-version",children:["v",e.version," · ",e.entity_count.toLocaleString()," ",h("header.memories")]})]}):s?t("span",{children:[t("span",{class:"dot dot-err"}),h("header.disconnected")]}):t("span",{style:{color:"var(--text-3)"},children:h("header.connecting")})})})]})}function ys({tabs:e,active:s,onSelect:n}){return t("nav",{class:"nav",children:e.map(({key:o,label:l})=>t("button",{class:`nav-btn ${o===s?"active":""}`,onClick:()=>n(o),children:l},o))})}const _s=1e4;async function O(e,s,n){const o=new AbortController,l=setTimeout(()=>o.abort(),_s);try{const a={method:e,headers:{"Content-Type":"application/json"},signal:o.signal};n&&(a.body=JSON.stringify(n));const r=await fetch(s,a);if(!r.ok)throw new Error(`HTTP ${r.status}`);const c=await r.json();if(!c.success)throw new Error(c.error||"Unknown error");return c.data}catch(a){throw a.name==="AbortError"?new Error("Request timed out"):a}finally{clearTimeout(l)}}async function ws(){return O("GET","/v1/graph")}async function ks(){const e=await O("POST","/v1/recall",{limit:100});return(Array.isArray(e)?e:e.entities||[]).filter(n=>n.type==="lesson_learned")}function xs(e){try{const s=new Date(e);return{date:s.toLocaleDateString(void 0,{month:"short",day:"numeric"}),time:s.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})}}catch{return{date:"—",time:""}}}function ut(e,s){return e.length>s?e.slice(0,s)+"…":e}function Ne({entity:e,actions:s,highlight:n}){const o=xs(e.created_at),l=e.observations?.[0]||"(no content)",a=e.observations?.length||0,r=e.archived||e.status==="archived";return t("div",{class:"mem-row",style:r?{opacity:.45}:void 0,children:[t("div",{class:"mem-time",children:[t("div",{children:o.date}),t("div",{children:o.time})]}),t("div",{class:"mem-body",children:[t("div",{class:"mem-preview",children:n?t(Ss,{text:ut(l,140),term:n}):ut(l,140)}),t("div",{class:"mem-meta",children:[t("span",{class:"badge badge-type",children:e.type}),r&&t("span",{class:"badge badge-archived",children:"archived"}),t("span",{children:e.name}),a>1&&t("span",{children:["· ",a," facts"]}),e.tags?.slice(0,3).map(c=>t("span",{class:"tag",children:c},c)),(e.tags?.length||0)>3&&t("span",{class:"tag",style:{opacity:.5},children:["+",e.tags.length-3]})]})]}),s&&t("div",{class:"mem-actions",children:s})]})}function Ss({text:e,term:s}){if(!s)return t(se,{children:e});const n=[],o=e.toLowerCase(),l=s.toLowerCase();let a=0;for(;a<e.length;){const r=o.indexOf(l,a);if(r===-1){n.push(e.slice(a));break}r>a&&n.push(e.slice(a,r)),n.push(t("mark",{children:e.slice(r,r+l.length)})),a=r+l.length}return t(se,{children:n})}function Ls(){const[e,s]=A(""),[n,o]=A(null),[l,a]=A(!1),[r,c]=A("");async function u(){if(e.trim()){a(!0),c("");try{const d=await O("POST","/v1/recall",{query:e.trim(),limit:30}),g=Array.isArray(d)?d:d.entities||[];o(g)}catch(d){c(d.message)}finally{a(!1)}}}return t("div",{children:t("div",{class:"card",children:[t("div",{class:"card-title",children:h("search.title")}),t("div",{class:"search-bar",children:[t("input",{type:"search",placeholder:h("search.placeholder"),value:e,onInput:d=>s(d.target.value),onKeyDown:d=>d.key==="Enter"&&u()}),t("button",{class:"btn btn-primary",onClick:u,disabled:l,children:h(l?"search.searching":"search.button")})]}),!l&&n===null&&!r&&t("div",{class:"empty",style:{padding:"32px 20px",color:"var(--text-3)"},children:t("div",{style:{fontSize:13,lineHeight:1.6},children:h("search.hint")})}),r&&t("div",{class:"error-box",children:r}),l&&t("div",{class:"empty",children:t("div",{class:"loading"})}),!l&&n!==null&&n.length===0&&t("div",{class:"empty",children:[t("span",{class:"empty-icon",children:"🔍"}),h("search.noResults"),' "',e,'"']}),!l&&n&&n.length>0&&t("div",{children:[t("div",{style:{fontSize:12,color:"var(--text-3)",marginBottom:12},children:[n.length," ",n.length!==1?h("search.results"):h("search.result")]}),n.map(d=>t("div",{class:"card",style:{padding:14},children:t(Ne,{entity:d,highlight:e})},d.id))]})]})})}const ze=30;function pt({manage:e}){const[s,n]=A([]),[o,l]=A(""),[a,r]=A(!0),[c,u]=A(""),[d,g]=A(0);async function i(){r(!0),u("");try{const _=await O("GET","/v1/entities?limit=500&status=all");n(_||[]),g(0)}catch(_){u(_.message)}finally{r(!1)}}G(()=>{i()},[]),G(()=>{g(0)},[o]);const p=o.toLowerCase(),v=s.filter(_=>p?_.name.toLowerCase().includes(p)||_.type.toLowerCase().includes(p)||_.observations?.some(I=>I.toLowerCase().includes(p))||_.tags?.some(I=>I.toLowerCase().includes(p)):!0),x=v.filter(_=>!_.archived&&_.status!=="archived"),y=v.filter(_=>_.archived||_.status==="archived"),b=Math.ceil(x.length/ze),w=x.slice(d*ze,(d+1)*ze);async function M(_){if(confirm(h("browse.confirmArchive")))try{await O("POST","/v1/forget",{name:_}),i()}catch(I){u("Failed to archive: "+I.message)}}async function D(_){try{await O("POST","/v1/remember",{name:_,type:"restored"}),i()}catch(I){u("Failed to restore: "+I.message)}}return t("div",{children:t("div",{class:"card",children:[t("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:16},children:[t("div",{children:[t("div",{class:"card-title",style:{margin:0},children:h(e?"browse.manage":"browse.title")}),!a&&t("div",{style:{fontSize:12,color:"var(--text-3)",marginTop:2},children:[x.length.toLocaleString()," ",h("browse.active"),y.length>0?` · ${y.length} ${h("browse.archived")}`:""]})]}),t("div",{style:{display:"flex",gap:8},children:[t("input",{type:"search",placeholder:h("browse.filter"),value:o,onInput:_=>l(_.target.value),style:{width:260}}),t("button",{class:"btn btn-sm",onClick:i,title:h("browse.refresh"),children:"↻"})]})]}),c&&t("div",{class:"error-box",style:{marginBottom:12},children:c}),a&&t("div",{class:"empty",children:t("div",{class:"loading"})}),!a&&v.length===0&&t("div",{class:"empty",children:[t("span",{class:"empty-icon",children:"📭"}),o?`${h("browse.noMatch")} "${o}"`:h("browse.noMemories")]}),!a&&w.length>0&&t("div",{children:[w.map(_=>t("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"14px 0"},children:t(Ne,{entity:_,highlight:o,actions:e?t("button",{class:"btn btn-danger btn-sm",onClick:()=>M(_.name),children:h("browse.archive")}):void 0})},_.id)),b>1&&t("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:12,padding:"16px 0",fontSize:13},children:[t("button",{class:"btn btn-sm",disabled:d===0,onClick:()=>g(_=>_-1),children:h("browse.prev")}),t("span",{style:{color:"var(--text-3)",fontFamily:"var(--mono)",fontSize:12},children:[d+1," / ",b]}),t("button",{class:"btn btn-sm",disabled:d>=b-1,onClick:()=>g(_=>_+1),children:h("browse.next")})]})]}),!a&&y.length>0&&t("div",{style:{marginTop:20},children:[t("div",{style:{fontSize:11,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8,paddingBottom:8,borderBottom:"1px solid var(--border)"},children:[h("browse.archived")," (",y.length,")"]}),y.slice(0,10).map(_=>t("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"14px 0"},children:t(Ne,{entity:_,highlight:o,actions:e?t("button",{class:"btn btn-sm",onClick:()=>D(_.name),children:h("browse.restore")}):void 0})},_.id)),y.length>10&&t("div",{style:{fontSize:12,color:"var(--text-3)",padding:"12px 0",textAlign:"center"},children:["+",y.length-10," ",h("browse.moreArchived")]})]})]})})}function gt(e){return e>=80?"var(--success)":e>=60?"var(--accent)":e>=40?"var(--warning)":"var(--danger)"}function Ms(e){return e>=80?h("health.excellent"):e>=60?h("health.good"):e>=40?h("health.fair"):h("health.poor")}const Cs=["activity","quality","freshness","lessons"];function As({score:e,factors:s}){const n=gt(e);return t("div",{class:"card",children:[t("div",{class:"card-title",children:h("health.title")}),t("div",{style:{display:"flex",gap:"24px",alignItems:"center"},children:[t("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",flexShrink:0},children:[t("div",{style:{width:"80px",height:"80px",borderRadius:"50%",border:`3px solid ${n}`,display:"flex",alignItems:"center",justifyContent:"center"},children:t("span",{style:{fontFamily:"var(--mono)",fontSize:"24px",fontWeight:700,color:n,letterSpacing:"-0.02em"},children:e})}),t("span",{style:{marginTop:"6px",fontSize:"11px",fontWeight:500,color:"var(--text-2)"},children:Ms(e)})]}),t("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:"10px"},children:Cs.map(o=>{const l=s[o],a=Math.round(l.score/l.weight*100),r=gt(a);return t("div",{children:[t("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"4px"},children:[t("span",{style:{fontSize:"12px",color:"var(--text-2)"},children:h(`health.${o}`)}),t("span",{style:{fontFamily:"var(--mono)",fontSize:"11px",color:"var(--text-3)"},children:[a,"%"]})]}),t("div",{style:{height:"4px",borderRadius:"2px",background:"var(--bg-0)",overflow:"hidden"},children:t("div",{style:{height:"100%",width:`${a}%`,borderRadius:"2px",background:r,transition:"width 600ms ease-out"}})})]},o)})})]})]})}const be=8,Ts=8,Es=20,ye=8,It=120,Ht="rgba(0, 214, 180, 0.3)",Dt="#00D6B4",Rs=1.5,Ps="#4A5260",Fs="9px Satoshi, system-ui, sans-serif";function ft(e,s){const n=window.devicePixelRatio||1,l=e.getBoundingClientRect().width,a=It;e.width=l*n,e.height=a*n,e.style.width=`${l}px`,e.style.height=`${a}px`;const r=e.getContext("2d");if(!r)return;r.scale(n,n);const c=l-ye-Ts,u=a-be-Es;if(s.length===0||c<=0||u<=0)return;const d=Math.max(1,...s.map(y=>y.created)),g=Math.max(1,...s.map(y=>y.recalled)),i=Math.max(d,g),p=s.length,v=1,x=Math.max(1,(c-v*(p-1))/p);r.fillStyle=Ht;for(let y=0;y<p;y++){const w=s[y].created/i*u,M=ye+y*(x+v),D=be+u-w;r.fillRect(M,D,x,w)}r.beginPath(),r.strokeStyle=Dt,r.lineWidth=Rs,r.lineJoin="round",r.lineCap="round";for(let y=0;y<p;y++){const b=s[y],w=ye+y*(x+v)+x/2,M=be+u-b.recalled/i*u;y===0?r.moveTo(w,M):r.lineTo(w,M)}r.stroke(),r.fillStyle=Ps,r.font=Fs,r.textAlign="center",r.textBaseline="top";for(let y=0;y<p;y+=7){const b=s[y],w=b.date.split("-"),M=w.length>=3?`${w[1]}-${w[2]}`:b.date,D=ye+y*(x+v)+x/2,_=be+u+4;r.fillText(M,D,_)}}function Bs({data:e}){const s=j(null);G(()=>{const l=s.current;if(!l)return;ft(l,e);const a=()=>ft(l,e);return window.addEventListener("resize",a),()=>window.removeEventListener("resize",a)},[e]);const n=e.reduce((l,a)=>l+a.created,0),o=e.reduce((l,a)=>l+a.recalled,0);return t("div",{class:"card",children:[t("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:14},children:[t("div",{class:"card-title",style:{marginBottom:0},children:h("timeline.title")}),t("div",{style:{display:"flex",alignItems:"center",gap:12,fontSize:11,color:"var(--text-2)"},children:[t("span",{style:{display:"flex",alignItems:"center",gap:4},children:[t("span",{style:{display:"inline-block",width:10,height:10,borderRadius:2,background:Ht}}),h("timeline.created"),t("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:n})]}),t("span",{style:{display:"flex",alignItems:"center",gap:4},children:[t("span",{style:{display:"inline-block",width:10,height:2,borderRadius:1,background:Dt}}),h("timeline.recalled"),t("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:o})]})]})]}),t("canvas",{ref:s,style:{width:"100%",height:`${It}px`,display:"block"}})]})}function zs({totalRecalls:e,lessonsWithWarnings:s,lessonCount:n,typeDistribution:o}){const l=o.reduce((r,c)=>r+c.count,0),a=o.slice(0,8);return t("div",{children:[t("div",{class:"stats-row",style:{gridTemplateColumns:"repeat(3, 1fr)"},children:[t("div",{class:"stat",children:[t("div",{class:"stat-val",children:e.toLocaleString()}),t("div",{class:"stat-lbl",children:h("value.totalRecalls")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",children:n}),t("div",{class:"stat-lbl",children:h("value.lessonsLearned")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",children:s}),t("div",{class:"stat-lbl",children:h("value.lessonsSaved")})]})]}),a.length>0&&t("div",{class:"card",children:[t("div",{class:"card-title",children:h("value.coverage")}),a.map(r=>{const c=l>0?Math.round(r.count/l*100):0;return t("div",{style:{marginBottom:10},children:[t("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:4},children:[t("span",{style:{fontSize:13,color:"var(--text-1)"},children:r.type}),t("span",{style:{fontFamily:"var(--mono)",fontSize:12,color:"var(--text-3)"},children:[r.count," (",c,"%)"]})]}),t("div",{style:{height:4,borderRadius:2,background:"var(--bg-0)"},children:t("div",{style:{height:"100%",width:`${c}%`,borderRadius:2,background:"rgba(0, 214, 180, 0.6)",transition:"width 600ms ease-out"}})})]},r.type)})]})]})}function Is({overallHitRate:e,totalHits:s,totalMisses:n,trackedEntities:o,topEffective:l,mostIgnored:a}){const r=Math.round(e*100),c=s+n;return t("div",{children:[t("div",{class:"stats-row",style:{gridTemplateColumns:"repeat(4, 1fr)"},children:[t("div",{class:"stat",children:[t("div",{class:"stat-val",style:{color:r>=50?"var(--accent)":"var(--warning, #f59e0b)"},children:[r,"%"]}),t("div",{class:"stat-lbl",children:h("recall.effectiveness")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",children:s}),t("div",{class:"stat-lbl",children:h("recall.hits")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",children:n}),t("div",{class:"stat-lbl",children:h("recall.misses")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",children:o}),t("div",{class:"stat-lbl",children:h("recall.tracked")})]})]}),c>0&&t("div",{class:"card",children:[t("div",{class:"card-title",children:h("recall.hitRate")}),t("div",{style:{marginBottom:16},children:[t("div",{style:{height:6,borderRadius:3,background:"var(--bg-0)",overflow:"hidden"},children:t("div",{style:{height:"100%",width:`${r}%`,borderRadius:3,background:r>=50?"rgba(0, 214, 180, 0.7)":"rgba(245, 158, 11, 0.7)",transition:"width 600ms ease-out"}})}),t("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:4},children:[s," ",h("recall.used")," / ",c," ",h("recall.injected")]})]}),l.length>0&&t("div",{style:{marginBottom:12},children:[t("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:6,fontWeight:500},children:h("recall.mostEffective")}),l.slice(0,3).map(u=>t(mt,{entry:u,color:"rgba(0, 214, 180, 0.6)"},u.name))]}),a.length>0&&a[0].hitRate<.5&&t("div",{children:[t("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:6,fontWeight:500},children:h("recall.leastEffective")}),a.slice(0,3).map(u=>t(mt,{entry:u,color:"rgba(245, 158, 11, 0.5)"},u.name))]})]}),c===0&&t("div",{class:"card",style:{textAlign:"center",padding:"20px 16px"},children:t("div",{style:{fontSize:13,color:"var(--text-3)"},children:h("recall.noData")})})]})}function mt({entry:e,color:s}){const n=Math.round(e.hitRate*100);return t("div",{style:{marginBottom:8},children:[t("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:3},children:[t("span",{style:{fontSize:12,color:"var(--text-1)",maxWidth:"70%",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name}),t("span",{style:{fontFamily:"var(--mono)",fontSize:11,color:"var(--text-3)"},children:[n,"% (",e.hits,"h/",e.misses,"m)"]})]}),t("div",{style:{height:3,borderRadius:2,background:"var(--bg-0)"},children:t("div",{style:{height:"100%",width:`${n}%`,borderRadius:2,background:s,transition:"width 600ms ease-out"}})})]})}function Hs({staleEntities:e,duplicateCandidates:s,onRefresh:n}){const[o,l]=A(()=>new Set);async function a(c){l(u=>new Set(u).add(c.id));try{await O("POST","/v1/forget",{name:c.name}),n()}catch{l(u=>{const d=new Set(u);return d.delete(c.id),d})}}const r=e.length===0&&s.length===0;return t("div",{class:"card",children:[r&&t("div",{class:"empty",style:{padding:"24px 12px"},children:[t("span",{class:"empty-icon",children:"✓"}),h("cleanup.allClean")]}),e.length>0&&t("div",{children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:10},children:h("cleanup.staleLabel")}),e.map(c=>t("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"10px 0",borderBottom:"1px solid var(--border-subtle)"},children:[t("div",{style:{flex:1,minWidth:0},children:[t("div",{style:{fontSize:13,color:"var(--text-1)"},children:c.name}),t("div",{style:{fontSize:11,fontFamily:"var(--mono)",color:"var(--text-3)",marginTop:2},children:[c.type," · confidence ",Math.round(c.confidence*100),"% · ",c.days_unused,"d unused"]})]}),t("button",{class:"btn btn-sm btn-danger",disabled:o.has(c.id),onClick:()=>a(c),style:{flexShrink:0,marginLeft:12},children:o.has(c.id)?"…":h("browse.archive")})]},c.id))]}),s.length>0&&t("div",{style:{marginTop:e.length>0?16:0},children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:10},children:h("cleanup.duplicateLabel")}),s.map((c,u)=>t("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"10px 0",borderBottom:"1px solid var(--border-subtle)",fontSize:13,color:"var(--text-1)"},children:[t("span",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:c.name1}),t("span",{style:{color:"var(--text-3)",flexShrink:0},children:"↔"}),t("span",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:c.name2}),t("span",{class:"badge badge-type",style:{flexShrink:0},children:c.type})]},`${c.name1}-${c.name2}-${u}`)),t("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:10,fontStyle:"italic"},children:h("cleanup.consolidateHint")})]})]})}function Ds({data:e}){const{workSchedule:s,toolPreferences:n,focusAreas:o,workflow:l,strengths:a,learningAreas:r}=e,c=new Map;for(const i of s.hourDistribution)c.set(i.hour,i.count);const u=Math.max(1,...s.hourDistribution.map(i=>i.count)),d=[...s.hourDistribution].sort((i,p)=>p.count-i.count).slice(0,3).map(i=>`${i.hour.toString().padStart(2,"0")}:00`),g=[...s.dayDistribution].sort((i,p)=>p.count-i.count).slice(0,2).map(i=>i.day);return t("div",{class:"card",children:[t("div",{class:"card-title",children:h("patterns.title")}),t("div",{style:{marginBottom:16},children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:h("patterns.workSchedule")}),t("div",{style:{display:"flex",gap:2,flexWrap:"wrap"},children:Array.from({length:24},(i,p)=>{const v=c.get(p)||0,x=v/u;return t("div",{title:`${p.toString().padStart(2,"0")}:00 — ${v}`,style:{width:18,height:18,borderRadius:"var(--radius-xs)",background:x>0?`rgba(0, 214, 180, ${.1+x*.7})`:"var(--bg-0)",border:"1px solid var(--border-subtle)",fontSize:8,display:"flex",alignItems:"center",justifyContent:"center",color:x>.5?"var(--bg-0)":"var(--text-3)",fontFamily:"var(--mono)"},children:p},p)})}),t("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:6,fontFamily:"var(--mono)"},children:[h("patterns.peakHours"),": ",d.join(", "),g.length>0&&t("span",{children:[" · ",h("patterns.busiestDays"),": ",g.join(", ")]})]})]}),n.length>0&&t("div",{style:{marginBottom:16},children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:h("patterns.tools")}),t("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:n.slice(0,10).map(i=>t("span",{class:"tag",style:{fontSize:11,padding:"2px 8px"},children:[i.tool," ",t("span",{style:{opacity:.5},children:["(",i.sessions,")"]})]},i.tool))})]}),t("div",{style:{marginBottom:16},children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:h("patterns.workflow")}),t("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:8},children:[t("div",{class:"stat",style:{padding:12},children:[t("div",{class:"stat-val",style:{fontSize:18},children:l.avgSessionMinutes>0?`${Math.round(l.avgSessionMinutes)}m`:"—"}),t("div",{class:"stat-lbl",children:h("patterns.avgSession")})]}),t("div",{class:"stat",style:{padding:12},children:[t("div",{class:"stat-val",style:{fontSize:18},children:l.totalSessions>0?l.commitsPerSession.toFixed(1):"—"}),t("div",{class:"stat-lbl",children:h("patterns.commitsPerSession")})]})]})]}),o.length>0&&t("div",{style:{marginBottom:16},children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:h("patterns.focus")}),t("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:o.slice(0,12).map(i=>t("span",{class:"tag",style:{fontSize:11,padding:"2px 8px"},children:[i.type," ",t("span",{style:{opacity:.5},children:["(",i.count,")"]})]},i.type))})]}),(a.length>0||r.length>0)&&t("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12},children:[t("div",{children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:h("patterns.strengths")}),a.slice(0,5).map(i=>t("div",{style:{marginBottom:6},children:[t("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:3},children:[t("span",{style:{fontSize:12,color:"var(--text-1)"},children:i.type}),t("span",{style:{fontFamily:"var(--mono)",fontSize:11,color:"var(--accent)"},children:[Math.round(i.avgConfidence*100),"%"]})]}),t("div",{style:{height:3,borderRadius:2,background:"var(--bg-0)"},children:t("div",{style:{height:"100%",width:`${Math.round(i.avgConfidence*100)}%`,borderRadius:2,background:"rgba(0, 214, 180, 0.5)",transition:"width 600ms ease-out"}})})]},i.type)),a.length===0&&t("div",{style:{fontSize:11,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]}),t("div",{children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:h("patterns.learning")}),r.slice(0,5).map(i=>t("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:6,fontSize:12},children:[t("span",{style:{color:"var(--text-1)"},children:i.tag}),t("span",{style:{fontFamily:"var(--mono)",fontSize:11,color:"var(--text-3)"},children:i.count})]},i.tag)),r.length===0&&t("div",{style:{fontSize:11,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]})]})]})}function Ws(){const[e,s]=A(null),[n,o]=A(null),[l,a]=A(null),[r,c]=A(!0),u=le(()=>{c(!0),Promise.all([O("GET","/v1/stats").catch(()=>null),O("GET","/v1/analytics").catch(()=>null),O("GET","/v1/patterns").catch(()=>null)]).then(([d,g,i])=>{s(d),o(g),a(i)}).finally(()=>c(!1))},[]);return G(()=>{u()},[u]),r?t("div",{class:"empty",children:t("div",{class:"loading"})}):!e&&!n?t("div",{class:"error-box",children:[h("common.error"),": Failed to load analytics"]}):t("div",{children:[e&&t("div",{class:"stats-row",children:[t("div",{class:"stat",children:[t("div",{class:"stat-val",children:e.totalEntities.toLocaleString()}),t("div",{class:"stat-lbl",children:h("analytics.totalMemories")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",children:e.totalObservations.toLocaleString()}),t("div",{class:"stat-lbl",children:h("analytics.knowledgeFacts")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",children:e.totalRelations.toLocaleString()}),t("div",{class:"stat-lbl",children:h("analytics.connections")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",children:e.totalTags.toLocaleString()}),t("div",{class:"stat-lbl",children:h("analytics.topics")})]})]}),n&&t(As,{score:n.healthScore,factors:n.healthFactors}),n&&t("div",{style:{marginTop:8},children:t(Bs,{data:n.timeline})}),n&&t("div",{style:{marginTop:8},children:t(zs,{totalRecalls:n.valueMetrics.totalRecalls,lessonsWithWarnings:n.valueMetrics.lessonsWithWarnings,lessonCount:n.valueMetrics.lessonCount,typeDistribution:n.valueMetrics.typeDistribution})}),n?.recallEffectiveness&&t("div",{style:{marginTop:8},children:t(Is,{...n.recallEffectiveness})}),n&&t("div",{style:{marginTop:8},children:t(Hs,{staleEntities:n.cleanup.staleEntities,duplicateCandidates:n.cleanup.duplicateCandidates,onRefresh:u})}),l&&t("div",{style:{marginTop:8},children:t(Ds,{data:l})}),e&&(()=>{const d=["auto_saved","auto-tracked","session_end","session:","source:","scope:","date:","urgency:"],g=e.tagDistribution.filter(i=>!d.some(p=>i.tag.startsWith(p))&&!/^\d{4}-\d{2}-\d{2}/.test(i.tag));return g.length>0?t("div",{class:"card",style:{marginTop:8},children:[t("div",{class:"card-title",children:h("analytics.topics")}),t("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:g.slice(0,30).map(i=>t("span",{class:"tag",style:{fontSize:Math.max(11,Math.min(15,10+Math.log2(i.count+1)))+"px"},children:[i.tag," ",t("span",{style:{opacity:.5},children:["(",i.count,")"]})]},i.tag))})]}):null})()]})}function vt(e){return e&&e.charAt(0).toUpperCase()+e.slice(1)}function $s(){const[e,s]=A(null),[n,o]=A(""),[l,a]=A(""),[r,c]=A(""),[u,d]=A(!1),[g,i]=A(""),[p,v]=A(!0);G(()=>{O("GET","/v1/config").then(b=>{s(b),o(b.config.llm?.provider||""),c(b.config.llm?.model||"")}).finally(()=>v(!1))},[]);async function x(){d(!0),i("");try{const b={provider:n};r&&(b.model=r),l&&(b.apiKey=l),await O("POST","/v1/config",{llm:b}),i(h("settings.saved")),a("")}catch(b){i(h("common.error")+": "+b.message)}finally{d(!1)}}if(p)return t("div",{class:"empty",children:t("div",{class:"loading"})});const y=e?.capabilities;return t("div",{children:[t("div",{class:"card",children:[t("div",{class:"card-title",children:h("settings.capabilities")}),t("div",{class:"stats-row",style:{marginBottom:0},children:[t("div",{class:"stat",children:[t("div",{class:"stat-val",style:{fontSize:18},children:["Level ",y?.searchLevel||0]}),t("div",{class:"stat-lbl",children:y?.searchLevel?h("settings.smartMode"):h("settings.core")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",style:{fontSize:14},children:vt(y?.embeddings||"—")}),t("div",{class:"stat-lbl",children:h("settings.embeddings")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",style:{fontSize:14},children:vt(y?.llm?.provider||"None")}),t("div",{class:"stat-lbl",children:h("settings.llmProvider")})]})]})]}),t("div",{class:"card",children:[t("div",{class:"card-title",children:h("settings.llmProvider")}),t("div",{style:{display:"flex",gap:16,marginBottom:14},children:[["anthropic","Anthropic (Claude)"],["openai","OpenAI"],["ollama","Ollama (Local)"]].map(([b,w])=>t("label",{style:{display:"flex",alignItems:"center",gap:5,cursor:"pointer",fontSize:13},children:[t("input",{type:"radio",name:"provider",value:b,checked:n===b,onChange:()=>o(b)}),w]},b))}),n&&n!=="ollama"&&t("div",{style:{marginBottom:12},children:[t("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:h("settings.apiKey")}),t("input",{type:"password",placeholder:n==="anthropic"?"sk-ant-api03-…":"sk-…",value:l,onInput:b=>a(b.target.value)})]}),t("div",{style:{marginBottom:14},children:[t("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:h("settings.model")}),t("input",{type:"text",placeholder:n==="anthropic"?"claude-haiku-4-5":n==="openai"?"gpt-4o-mini":"llama3.2",value:r,onInput:b=>c(b.target.value)})]}),t("div",{style:{display:"flex",gap:10,alignItems:"center"},children:[t("button",{class:"btn btn-primary",onClick:x,disabled:!n||u,children:h(u?"settings.saving":"settings.save")}),g&&t("span",{style:{fontSize:12,color:g.startsWith(h("common.error"))?"var(--danger)":"var(--success)"},children:g})]})]}),t("div",{class:"card",children:[t("div",{class:"card-title",children:h("settings.language")}),t("select",{value:ms(),onChange:b=>{fs(b.target.value),window.location.reload()},style:{fontSize:13,padding:"6px 10px",borderRadius:6,border:"1px solid var(--border)",background:"var(--surface)",color:"var(--text-1)",cursor:"pointer"},children:vs().map(b=>t("option",{value:b.code,children:b.name},b.code))})]})]})}const Ns={decision:"#00D6B4",pattern:"#60A5FA",lesson_learned:"#FFB84D",commit:"#A78BFA","session-insight":"#7A828E",session_keypoint:"#4ADE80",session_identity:"#F472B6",workflow_checkpoint:"#38BDF8",feature:"#FB923C",bug_fix:"#F87171",concept:"#00D6B4",tool:"#818CF8",person:"#E879F9",note:"#94A3B8"},qs="#B8BEC6";function bt(e){return Ns[e]||qs}function js(e){if(!e)return .15;const s=Date.now()-new Date(e).getTime();return Math.max(.15,1-Math.min(1,s/(30*864e5)))}function Gs(e){const s=Date.now()-new Date(e).getTime(),n=Math.floor(s/864e5);return n<1?"today":n<7?`${n}d ago`:n<30?`${Math.floor(n/7)}w ago`:`${n}d ago`}const yt=500,_t=4;function Os(){const[e,s]=A(null),[n,o]=A(!0),[l,a]=A(""),[r,c]=A({}),[u,d]=A(""),[g,i]=A(null),p=j(null),v=j([]),x=j([]),y=j(0),b=j({node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1}),w=j(null),M=j({x:0,y:0,node:null}),D=j(800),_=j(r),I=j(u),Z=j(g);G(()=>{_.current=r},[r]),G(()=>{I.current=u},[u]),G(()=>{Z.current=g},[g]),G(()=>{ws().then(k=>{s(k);const S={};k.entities.forEach(C=>{S[C.type]=!0}),c(S)}).catch(k=>a(k.message)).finally(()=>o(!1))},[]),G(()=>{if(!e||n)return;const k=p.current;if(!k)return;const S=k.parentElement?.clientWidth||800,C=yt,W=window.devicePixelRatio||1;k.width=S*W,k.height=C*W,k.style.width=S+"px",k.style.height=C+"px",D.current=S;const $=new Set;e.relations.forEach(L=>{$.add(L.from),$.add(L.to)});const q=new Map;e.entities.forEach(L=>{const U=L.last_accessed_at||L.created_at;q.set(L.name,{id:L.name,type:L.type,x:Math.random()*S*.8+S*.1,y:Math.random()*C*.8+C*.1,vx:0,vy:0,radius:6,recency:js(U),isOrphan:!$.has(L.name),lastDate:U})}),v.current=Array.from(q.values()),x.current=e.relations.filter(L=>q.has(L.from)&&q.has(L.to));const N=L=>{if(_.current[L.type]===!1)return!1;const f=Z.current;return f?L.id===f?!0:x.current.some(ae=>ae.from===f&&ae.to===L.id||ae.to===f&&ae.from===L.id):!0},ge=L=>{const U=q.get(L.from),f=q.get(L.to);return!U||!f?!1:N(U)&&N(f)},fe=L=>{const U=I.current.toLowerCase();return U?L.id.toLowerCase().includes(U):!1};let ne=1;const oe=.005,jt=.001,Gt=()=>{ne=.3};window.__graphReheat=Gt;const Ve=()=>{const L=v.current,U=x.current,f=k.getContext("2d");if(!f)return;const Pe=window.devicePixelRatio||1;ne=Math.max(jt,ne-oe);const ae=.85,Ot=2e3*ne,Kt=80,Ut=.02*ne,Ye=.005*ne,Vt=L.length>200;for(let m=0;m<L.length;m++)for(let T=m+1;T<L.length;T++){const R=L[T].x-L[m].x,H=L[T].y-L[m].y,B=R*R+H*H;if(Vt&&B>9e4)continue;const z=Math.sqrt(B)||1,Q=Ot/(z*z),X=R/z*Q,ie=H/z*Q;L[m].vx-=X,L[m].vy-=ie,L[T].vx+=X,L[T].vy+=ie}const me=new Map(L.map(m=>[m.id,m]));for(const m of U){const T=me.get(m.from),R=me.get(m.to);if(!T||!R)continue;const H=R.x-T.x,B=R.y-T.y,z=Math.sqrt(H*H+B*B)||1,Q=(z-Kt)*Ut,X=H/z*Q,ie=B/z*Q;T.vx+=X,T.vy+=ie,R.vx-=X,R.vy-=ie}const Qe=S/2,Xe=C/2;for(const m of L)m.vx+=(Qe-m.x)*Ye,m.vy+=(Xe-m.y)*Ye;for(const m of L)b.current.node!==m&&(m.vx*=ae,m.vy*=ae,Math.abs(m.vx)<.01&&Math.abs(m.vy)<.01&&(m.vx=0,m.vy=0),m.x+=m.vx,m.y+=m.vy,m.x=Math.max(20,Math.min(S-20,m.x)),m.y=Math.max(20,Math.min(C-20,m.y)));const Je=I.current.toLowerCase();if(Je){const m=L.filter(T=>T.id.toLowerCase().includes(Je));if(m.length===1){const T=m[0],R=Qe-T.x,H=Xe-T.y,B=.05;for(const z of L)z.x+=R*B,z.y+=H*B}}f.setTransform(Pe,0,0,Pe,0,0),f.clearRect(0,0,S,C);const Ze=U.filter(ge),Yt=Ze.length<30;for(const m of Ze){const T=me.get(m.from),R=me.get(m.to);if(!T||!R)continue;const H=Math.min(T.recency,R.recency)*.6;if(f.globalAlpha=H,f.strokeStyle="rgba(0, 214, 180, 0.4)",f.lineWidth=1,f.setLineDash([]),f.beginPath(),f.moveTo(T.x,T.y),f.lineTo(R.x,R.y),f.stroke(),Yt){const B=(T.x+R.x)/2,z=(T.y+R.y)/2;f.font="9px Satoshi, system-ui, sans-serif",f.fillStyle="#7A828E",f.fillText(m.type,B+2,z-2)}}f.globalAlpha=1;const Qt=L.filter(N),Xt=w.current;for(const m of Qt){const T=Xt===m,R=fe(m),H=Z.current===m.id,B=H?10:T?9:m.radius,z=T||R?1:m.recency;if(f.globalAlpha=z,f.beginPath(),f.arc(m.x,m.y,B,0,Math.PI*2),f.fillStyle=bt(m.type),f.fill(),m.isOrphan&&(f.setLineDash([3,3]),f.strokeStyle="#4A5260",f.lineWidth=1,f.stroke(),f.setLineDash([])),R&&(f.globalAlpha=1,f.strokeStyle="#00F0CA",f.lineWidth=2,f.beginPath(),f.arc(m.x,m.y,B+3,0,Math.PI*2),f.stroke()),T&&!R&&(f.globalAlpha=1,f.strokeStyle="#fff",f.lineWidth=2,f.beginPath(),f.arc(m.x,m.y,B,0,Math.PI*2),f.stroke()),T||R||H){f.globalAlpha=1,f.fillStyle="#B8BEC6",f.font="10px Satoshi, system-ui, sans-serif";const X=R||H?m.id:m.id.length>20?m.id.slice(0,18)+"...":m.id;f.fillText(X,m.x+B+4,m.y+3)}}f.globalAlpha=1;const re=M.current;if(re.node&&N(re.node)){const m=re.x+12,T=re.y-10,R=re.node.id,H=re.node.type,B=Gs(re.node.lastDate),z=R,Q=`${H} | ${B}`;f.font="11px Satoshi, system-ui, sans-serif";const X=f.measureText(z).width,ie=f.measureText(Q).width,Jt=Math.max(X,ie)+12,Zt=34;f.fillStyle="rgba(13, 16, 20, 0.92)",f.strokeStyle="rgba(0, 214, 180, 0.3)",f.lineWidth=1,f.beginPath(),f.roundRect(m-4,T-18,Jt,Zt,4),f.fill(),f.stroke(),f.fillStyle="#F0F2F4",f.fillText(z,m,T-4),f.fillStyle="#7A828E",f.font="10px Geist Mono, JetBrains Mono, monospace",f.fillText(Q,m,T+10)}y.current=requestAnimationFrame(Ve)};return y.current=requestAnimationFrame(Ve),()=>cancelAnimationFrame(y.current)},[e,n]);const V=le((k,S)=>{const C=v.current,W=_.current,$=Z.current;for(let q=C.length-1;q>=0;q--){const N=C[q];if(W[N.type]===!1||$&&N.id!==$&&!x.current.some(oe=>oe.from===$&&oe.to===N.id||oe.to===$&&oe.from===N.id))continue;const ge=N.x-k,fe=N.y-S;if(ge*ge+fe*fe<144)return N}return null},[]),Y=le(k=>{const S=p.current;if(!S)return{x:0,y:0};const C=S.getBoundingClientRect();return{x:k.clientX-C.left,y:k.clientY-C.top}},[]),K=le(k=>{const S=Y(k),C=V(S.x,S.y);C&&window.__graphReheat?.(),b.current={node:C||null,offsetX:C?S.x-C.x:0,offsetY:C?S.y-C.y:0,startX:S.x,startY:S.y,dragged:!1}},[V,Y]),ee=le(k=>{const S=Y(k),C=b.current;if(C.node){const q=S.x-C.startX,N=S.y-C.startY;q*q+N*N>_t*_t&&(C.dragged=!0),C.node.x=S.x-C.offsetX,C.node.y=S.y-C.offsetY,C.node.vx=0,C.node.vy=0}const W=V(S.x,S.y);w.current=W,M.current=W?{x:S.x,y:S.y,node:W}:{x:0,y:0,node:null};const $=p.current;$&&(W?$.style.cursor=Z.current?"pointer":"grab":$.style.cursor="default")},[V,Y]),Wt=le(k=>{const S=b.current,C=Y(k);S.node&&!S.dragged?i(W=>W===S.node.id?null:S.node.id):!S.node&&!S.dragged&&(V(C.x,C.y)||i(null)),b.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1}},[V,Y]),$t=le(()=>{b.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1},w.current=null,M.current={x:0,y:0,node:null}},[]);if(n)return t("div",{class:"empty",children:t("div",{class:"loading"})});if(l)return t("div",{class:"error-box",children:[h("common.error"),": ",l]});if(!e)return t("div",{class:"error-box",children:[h("common.error"),": No data"]});const Ee=new Map;e.entities.forEach(k=>Ee.set(k.type,(Ee.get(k.type)||0)+1));const Re=new Set;e.relations.forEach(k=>{Re.add(k.from),Re.add(k.to)});const Nt=e.entities.filter(k=>!Re.has(k.name)).length,qt=u?e.entities.filter(k=>k.name.toLowerCase().includes(u.toLowerCase())).length:0,Ue=g?e.entities.find(k=>k.name===g):null;return t("div",{children:[t("div",{class:"stats-row",children:[t("div",{class:"stat",children:[t("div",{class:"stat-val",children:e.entities.length.toLocaleString()}),t("div",{class:"stat-lbl",children:h("graph.entities")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",children:e.relations.length.toLocaleString()}),t("div",{class:"stat-lbl",children:h("graph.relations")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",children:Nt.toLocaleString()}),t("div",{class:"stat-lbl",children:h("graph.orphans")})]})]}),t("div",{class:"card",style:{padding:12},children:[t("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:8,flexWrap:"wrap"},children:[t("span",{class:"card-title",style:{margin:0},children:h("tab.graph")}),Array.from(Ee.entries()).map(([k,S])=>{const C=r[k]!==!1,W=bt(k);return t("label",{style:{display:"inline-flex",alignItems:"center",gap:4,fontSize:11,color:"#B8BEC6",opacity:C?1:.4,cursor:"pointer",userSelect:"none"},children:[t("input",{type:"checkbox",checked:C,onChange:()=>c($=>({...$,[k]:!$[k]})),style:{accentColor:W,width:13,height:13,cursor:"pointer"}}),t("span",{style:{width:8,height:8,borderRadius:"50%",background:W,display:"inline-block",flexShrink:0}}),k," (",S,")"]},k)})]}),t("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8},children:[t("input",{type:"text",placeholder:h("graph.search"),value:u,onInput:k=>d(k.target.value),style:{width:260,padding:"4px 8px",background:"#080A0C",border:"1px solid rgba(0, 214, 180, 0.08)",borderRadius:4,color:"#F0F2F4",fontSize:12,fontFamily:"Satoshi, system-ui, sans-serif",outline:"none"}}),u&&t("span",{style:{fontSize:11,fontFamily:"Geist Mono, JetBrains Mono, monospace",color:"#7A828E"},children:[qt," ",h("graph.matches")]})]}),Ue&&t("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8,padding:"4px 10px",background:"rgba(0, 214, 180, 0.08)",borderRadius:4,fontSize:12},children:[t("span",{style:{color:"#00D6B4",fontWeight:600},children:[h("graph.focusMode"),":"]}),t("span",{style:{color:"#F0F2F4"},children:Ue.name}),t("button",{onClick:()=>i(null),style:{marginLeft:"auto",padding:"2px 8px",background:"rgba(0, 214, 180, 0.12)",border:"1px solid rgba(0, 214, 180, 0.2)",borderRadius:3,color:"#00D6B4",fontSize:11,cursor:"pointer"},children:h("graph.showAll")})]}),!g&&t("div",{style:{fontSize:11,color:"#4A5260",marginBottom:6},children:h("graph.clickHint")}),t("canvas",{ref:p,style:{width:"100%",height:yt,borderRadius:"var(--radius-sm)",background:"#080A0C"},onMouseDown:K,onMouseMove:ee,onMouseUp:Wt,onMouseLeave:$t})]})]})}function Ks(e){const s=e.observations||[],n=c=>{const u=s.find(d=>d.startsWith(c));return u?u.slice(c.length).trim():""},o=e.tags||[];let l=null;o.includes("severity:critical")?l="critical":o.includes("severity:major")?l="major":o.includes("severity:minor")&&(l="minor");const a=o.find(c=>c.startsWith("project:")),r=a?a.slice(8):"";return{entity:e,error:n("Error:"),rootCause:n("Root cause:"),fix:n("Fix:"),prevention:n("Prevention:"),severity:l,project:r,confidence:e.confidence??1}}const Ie={critical:"#FF6B6B",major:"#FFB84D",minor:"#60A5FA"};function Us(){const[e,s]=A([]),[n,o]=A(!0),[l,a]=A("");return G(()=>{ks().then(r=>s(r.map(Ks))).catch(r=>a(r.message)).finally(()=>o(!1))},[]),n?t("div",{class:"empty",children:t("div",{class:"loading"})}):l?t("div",{class:"error-box",children:[h("common.error"),": ",l]}):e.length===0?t("div",{class:"empty",children:[t("span",{class:"empty-icon",children:"📝"}),h("lessons.empty")]}):t("div",{children:[t("div",{class:"stats-row",children:[t("div",{class:"stat",children:[t("div",{class:"stat-val",children:e.length}),t("div",{class:"stat-lbl",children:h("lessons.total")})]}),t("div",{class:"stat",children:[t("div",{class:"stat-val",children:e.filter(r=>r.severity==="critical").length}),t("div",{class:"stat-lbl",children:h("lessons.critical")})]})]}),e.map(r=>{const c=r.severity?Ie[r.severity]:"var(--border)";return t("div",{class:"card",style:{borderLeft:`3px solid ${c}`},children:[t("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:10},children:[t("div",{class:"card-title",style:{margin:0,flex:1,minWidth:0},children:r.entity.name}),t("div",{style:{display:"flex",gap:6,flexShrink:0},children:[r.project&&t("span",{class:"tag",children:r.project}),r.severity&&t("span",{class:"badge",style:{background:`${Ie[r.severity]}18`,color:Ie[r.severity]},children:r.severity}),t("span",{class:"badge",style:{background:"var(--accent-soft)",color:"var(--accent-hover)"},children:[Math.round(r.confidence*100),"%"]})]})]}),r.error&&t("div",{style:{marginBottom:8},children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--danger)",marginBottom:2},children:h("lessons.error")}),t("div",{style:{fontSize:13,color:"var(--text-1)",lineHeight:1.5},children:r.error})]}),r.rootCause&&t("div",{style:{marginBottom:8},children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--warning)",marginBottom:2},children:h("lessons.rootCause")}),t("div",{style:{fontSize:13,color:"var(--text-1)",lineHeight:1.5},children:r.rootCause})]}),r.fix&&t("div",{style:{marginBottom:8},children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--success)",marginBottom:2},children:h("lessons.fix")}),t("div",{style:{fontSize:13,color:"var(--text-1)",lineHeight:1.5},children:r.fix})]}),r.prevention&&t("div",{style:{marginBottom:8},children:[t("div",{style:{fontSize:11,fontWeight:600,color:"var(--info)",marginBottom:2},children:h("lessons.prevention")}),t("div",{style:{fontSize:13,color:"var(--text-1)",lineHeight:1.5},children:r.prevention})]})]},r.entity.id)})]})}const Vs=["bug","feature","question"],wt={bug:"feedback.bug",feature:"feedback.feature",question:"feedback.question"};function Ys({health:e}){const[s,n]=A(!1),[o,l]=A("bug"),[a,r]=A(""),[c,u]=A(!0),d=j(null);G(()=>{if(!s)return;const i=p=>{d.current&&!d.current.contains(p.target)&&n(!1)};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[s]);const g=()=>{if(!a.trim())return;const i=`feedback,from-dashboard,${o}`;let p=a.trim();c&&e&&(p+=`
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
**System Info**
|
|
16
|
+
- Version: ${e.version}
|
|
17
|
+
- Entities: ${e.entity_count}
|
|
18
|
+
- Platform: ${navigator.platform}
|
|
19
|
+
- User Agent: ${navigator.userAgent}`);const v=h(wt[o]),x=`https://github.com/PCIRCLE-AI/memesh-llm-memory/issues/new?title=${encodeURIComponent(`[${v}] `)}&body=${encodeURIComponent(p)}&labels=${encodeURIComponent(i)}`;window.open(x,"_blank"),r(""),n(!1)};return t(se,{children:[t("button",{class:"fb-btn",onClick:()=>n(!s),children:h("feedback.button")}),s&&t("div",{class:"fb-panel",ref:d,children:[t("h3",{class:"fb-title",children:h("feedback.title")}),t("div",{class:"fb-types",children:Vs.map(i=>t("label",{class:`fb-type ${o===i?"selected":""}`,children:[t("input",{type:"radio",name:"fb-type",value:i,checked:o===i,onChange:()=>l(i)}),h(wt[i])]},i))}),t("textarea",{class:"fb-desc",placeholder:h("feedback.placeholder"),value:a,onInput:i=>r(i.target.value)}),t("label",{class:"fb-sys-row",children:[t("input",{type:"checkbox",checked:c,onChange:()=>u(!c)}),h("feedback.includeSys")]}),t("button",{class:"btn btn-primary fb-submit",onClick:g,children:h("feedback.submit")})]})]})}gs();const Qs=["Search","Browse","Analytics","Graph","Lessons","Manage","Settings"],Xs={Search:"tab.search",Browse:"tab.browse",Analytics:"tab.analytics",Graph:"tab.graph",Lessons:"tab.lessons",Manage:"tab.manage",Settings:"tab.settings"};function Js(){const[e,s]=A("Browse"),[n,o]=A(null),[l,a]=A("");G(()=>{O("GET","/v1/health").then(o).catch(c=>a(c.message))},[]);const r=Qs.map(c=>({key:c,label:h(Xs[c])}));return t("div",{class:"shell",children:[t(bs,{health:n,error:l}),t(ys,{tabs:r,active:e,onSelect:c=>s(c)}),t("div",{class:"main",children:[t("div",{class:`panel ${e==="Search"?"active":""}`,children:t(Ls,{})}),t("div",{class:`panel ${e==="Browse"?"active":""}`,children:t(pt,{})}),t("div",{class:`panel ${e==="Analytics"?"active":""}`,children:t(Ws,{})}),t("div",{class:`panel ${e==="Graph"?"active":""}`,children:e==="Graph"&&t(Os,{})}),t("div",{class:`panel ${e==="Lessons"?"active":""}`,children:e==="Lessons"&&t(Us,{})}),t("div",{class:`panel ${e==="Manage"?"active":""}`,children:e==="Manage"&&t(pt,{manage:!0})}),t("div",{class:`panel ${e==="Settings"?"active":""}`,children:e==="Settings"&&t($s,{})})]}),t(Ys,{health:n})]})}ls(t(Js,{}),document.getElementById("app"));</script>
|
|
20
|
+
<style rel="stylesheet" crossorigin>:root{--bg-0: #080A0C;--bg-1: #0D1014;--bg-2: #14181D;--bg-card: rgba(20, 24, 29, .9);--bg-hover: #1A1F26;--bg-input: #0D1014;--border: rgba(0, 214, 180, .08);--border-subtle: rgba(0, 214, 180, .04);--border-focus: #00D6B4;--text-0: #F0F2F4;--text-1: #B8BEC6;--text-2: #7A828E;--text-3: #4A5260;--accent: #00D6B4;--accent-soft: rgba(0, 214, 180, .08);--accent-hover: #00F0CA;--success: #00D6B4;--success-soft: rgba(0, 214, 180, .08);--danger: #FF6B6B;--danger-soft: rgba(255, 107, 107, .08);--warning: #FFB84D;--warning-soft: rgba(255, 184, 77, .08);--info: #60A5FA;--info-soft: rgba(96, 165, 250, .08);--font: "Satoshi", -apple-system, system-ui, sans-serif;--mono: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;--radius: 8px;--radius-sm: 6px;--radius-xs: 4px}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}html{font-size:14px}body{font-family:var(--font);background:var(--bg-0);color:var(--text-1);line-height:1.55;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}.shell{min-height:100vh;display:flex;flex-direction:column}.header{display:flex;align-items:center;justify-content:space-between;padding:12px 24px;background:var(--bg-1);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:100;backdrop-filter:blur(16px) saturate(180%)}.header-brand h1{font-size:15px;font-weight:700;color:var(--text-0);letter-spacing:-.03em;line-height:1.2}.header-brand small{font-size:10px;color:var(--text-3);letter-spacing:.05em;text-transform:uppercase}.header-right{display:flex;align-items:center;gap:10px}.header-meta{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--text-2)}.dot{width:6px;height:6px;border-radius:50%;display:inline-block;margin-right:4px}.dot-ok{background:var(--success);box-shadow:0 0 6px #00d6b466}.dot-err{background:var(--danger)}.badge-version{font-family:var(--mono);font-size:10px;color:var(--text-3);background:var(--bg-2);padding:2px 8px;border-radius:var(--radius-xs)}.theme-btn{background:none;border:1px solid var(--border);border-radius:var(--radius-sm);padding:5px 9px;cursor:pointer;color:var(--text-2);font-size:13px;transition:border-color .15s}.theme-btn:hover{border-color:var(--text-3)}.nav{display:flex;background:var(--bg-0);border-bottom:1px solid var(--border);padding:0 24px;gap:0;overflow-x:auto;scrollbar-width:none}.nav::-webkit-scrollbar{display:none}.nav-btn{padding:14px 16px;border:none;background:none;cursor:pointer;font:500 12px/1 var(--font);color:var(--text-3);border-bottom:2px solid transparent;transition:color .15s,border-color .15s;white-space:nowrap;letter-spacing:.01em;min-height:44px}.nav-btn:hover{color:var(--text-2)}.nav-btn.active{color:var(--accent);border-bottom-color:var(--accent)}.main{flex:1;max-width:1100px;width:100%;margin:0 auto;padding:20px 24px}.panel{display:none}.panel.active{display:block}.card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px 18px;margin-bottom:8px;backdrop-filter:blur(8px);transition:border-color .2s,box-shadow .2s}.card:hover{border-color:#00d6b433;box-shadow:0 4px 20px #00d6b40a}.card-title{font-size:13px;font-weight:600;color:var(--text-0);margin-bottom:14px;letter-spacing:-.01em}input[type=text],input[type=password],input[type=search],textarea{width:100%;padding:9px 14px;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-0);font:13px/1.4 var(--font);outline:none;transition:border-color .15s}input:focus,textarea:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--accent-soft)}input::placeholder,textarea::placeholder{color:var(--text-3)}.btn{display:inline-flex;align-items:center;gap:6px;padding:9px 16px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-2);color:var(--text-1);font:600 12px/1 var(--font);cursor:pointer;transition:all .15s;white-space:nowrap}.btn:hover{border-color:var(--text-3);background:var(--bg-hover)}.btn:disabled{opacity:.35;cursor:not-allowed}.btn-primary{background:var(--accent);border-color:var(--accent);color:#080a0c}.btn-primary:hover{background:var(--accent-hover)}.btn-danger{color:var(--danger);border-color:#ff6b6b33;background:transparent}.btn-danger:hover{background:var(--danger-soft)}.btn-sm{padding:8px 14px;font-size:11px;min-height:36px}.table-wrap{overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius)}table{width:100%;border-collapse:collapse}th{text-align:left;padding:9px 14px;font-size:10px;font-weight:600;color:var(--text-3);text-transform:uppercase;letter-spacing:.08em;background:var(--bg-2);border-bottom:1px solid var(--border);white-space:nowrap}td{padding:10px 14px;border-bottom:1px solid var(--border-subtle);font-size:13px;color:var(--text-1)}tbody tr{transition:background .15s}tbody tr:hover{background:var(--bg-hover)}tbody tr:last-child td{border-bottom:none}.badge{display:inline-block;padding:2px 9px;border-radius:9999px;font-size:11px;font-weight:500;letter-spacing:.01em}.badge-active{background:var(--success-soft);color:var(--accent)}.badge-archived{background:var(--danger-soft);color:var(--danger)}.badge-type{background:var(--accent-soft);color:var(--accent)}.tag{display:inline-block;padding:1px 7px;margin:1px 2px;border-radius:var(--radius-xs);font:400 10px var(--mono);background:var(--bg-2);color:var(--text-2);border:1px solid var(--border)}.stats-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px;margin-bottom:20px}.stat{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:16px;transition:border-color .15s}.stat:hover{border-color:#00d6b433;box-shadow:0 2px 12px #00d6b40a}.stat-val{font:700 24px/1.1 var(--mono);color:var(--accent);letter-spacing:-.02em}.stat-lbl{font:500 10px/1 var(--font);color:var(--text-3);text-transform:uppercase;letter-spacing:.08em;margin-top:4px}.search-bar{display:flex;gap:8px;margin-bottom:16px}.search-bar input{flex:1}.mem-row{display:flex;gap:14px;align-items:flex-start}.mem-time{flex-shrink:0;width:72px;font:400 11px var(--mono);color:var(--text-3);padding-top:2px;line-height:1.4}.mem-body{flex:1;min-width:0}.mem-preview{font-size:13px;line-height:1.5;color:var(--text-1);word-break:break-word}.mem-meta{margin-top:3px;font:400 11px var(--mono);color:var(--text-3);display:flex;flex-wrap:wrap;gap:8px;align-items:center}.mem-actions{flex-shrink:0;display:flex;gap:6px}.insight{display:flex;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--border-subtle)}.insight:last-child{border-bottom:none}.insight-icon{font-size:18px;flex-shrink:0}.insight-text{font-size:13px;color:var(--text-1)}.insight-val{font:600 13px var(--mono);color:var(--accent)}.empty{text-align:center;padding:48px 20px;color:var(--text-3);font-size:13px}.empty-icon{font-size:28px;margin-bottom:8px;display:block}.loading{width:18px;height:18px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .6s linear infinite;margin:0 auto}@keyframes spin{to{transform:rotate(360deg)}}.error-box{background:var(--danger-soft);border:1px solid rgba(255,107,107,.12);border-radius:var(--radius-sm);padding:10px 14px;color:var(--danger);font-size:13px}.fb-btn{position:fixed;bottom:20px;right:20px;background:var(--accent);color:#080a0c;border:none;padding:9px 16px;border-radius:9999px;cursor:pointer;font:600 12px var(--font);box-shadow:0 4px 14px #00d6b440;transition:transform .15s,box-shadow .15s;z-index:50}.fb-btn:hover{transform:translateY(-2px);box-shadow:0 6px 20px #00d6b459}.fb-panel{position:fixed;bottom:64px;right:20px;width:340px;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);padding:18px;box-shadow:0 16px 48px #00000080;z-index:51;animation:fb-slide-up .15s ease-out}@keyframes fb-slide-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.fb-title{font:600 14px var(--font);color:var(--text-0);margin-bottom:14px}.fb-types{display:flex;gap:6px;margin-bottom:12px}.fb-type{display:flex;align-items:center;gap:5px;padding:5px 10px;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;font:500 12px var(--font);color:var(--text-2);transition:border-color .15s,background .15s}.fb-type:hover{border-color:var(--text-3)}.fb-type.selected{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.fb-type input{accent-color:var(--accent)}.fb-desc{width:100%;height:80px;padding:9px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);font:400 13px var(--font);resize:vertical;outline:none;margin-bottom:10px;background:var(--bg-0);color:var(--text-0)}.fb-desc:focus{border-color:var(--accent)}.fb-desc::placeholder{color:var(--text-3)}.fb-sys-row{display:flex;align-items:center;gap:6px;font:400 12px var(--font);color:var(--text-2);margin-bottom:12px;cursor:pointer}.fb-sys-row input{accent-color:var(--accent)}.fb-submit{width:100%;justify-content:center}mark{background:#00d6b426;color:inherit;padding:1px 2px;border-radius:3px}.overlay{position:fixed;inset:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:200}.modal{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);padding:24px;max-width:480px;width:90%;max-height:80vh;overflow-y:auto;box-shadow:0 16px 48px #00000080}.modal h3{font-size:15px;font-weight:600;color:var(--text-0);margin-bottom:14px}@media(max-width:768px){.main{padding:14px}.nav-btn{padding:10px 11px;font-size:11px}.header-brand h1{font-size:14px}.search-bar{flex-direction:column}.stats-row{grid-template-columns:1fr 1fr}.mem-time{width:60px;font-size:10px}}@media(max-width:480px){.nav-btn{flex:1;font-size:11px;padding:9px 5px;text-align:center}.stats-row{grid-template-columns:1fr}.mem-row{flex-direction:column;gap:4px}.mem-time{width:auto}}</style>
|
|
12
21
|
</head>
|
|
13
22
|
<body>
|
|
14
23
|
<div id="app"></div>
|