@pcircle/memesh 4.6.0 → 4.6.2
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +21 -0
- package/README.de.md +12 -13
- package/README.md +12 -14
- package/README.zh-TW.md +12 -13
- package/dashboard/dist/index.html +14 -13
- package/dist/core/analytics.d.ts +9 -0
- package/dist/core/analytics.d.ts.map +1 -1
- package/dist/core/analytics.js +36 -18
- package/dist/core/analytics.js.map +1 -1
- package/dist/core/briefing.d.ts.map +1 -1
- package/dist/core/briefing.js +1 -0
- package/dist/core/briefing.js.map +1 -1
- package/dist/core/config.d.ts +0 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/demo.d.ts.map +1 -1
- package/dist/core/demo.js +1 -1
- package/dist/core/demo.js.map +1 -1
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +25 -6
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/dreamer.d.ts +2 -2
- package/dist/core/dreamer.d.ts.map +1 -1
- package/dist/core/dreamer.js +221 -0
- package/dist/core/dreamer.js.map +1 -1
- package/dist/core/embedder.d.ts +4 -1
- package/dist/core/embedder.d.ts.map +1 -1
- package/dist/core/embedder.js +67 -17
- package/dist/core/embedder.js.map +1 -1
- package/dist/core/graph.d.ts +12 -0
- package/dist/core/graph.d.ts.map +1 -1
- package/dist/core/graph.js +56 -1
- package/dist/core/graph.js.map +1 -1
- package/dist/core/guards.d.ts +20 -0
- package/dist/core/guards.d.ts.map +1 -0
- package/dist/core/guards.js +103 -0
- package/dist/core/guards.js.map +1 -0
- package/dist/core/kg-backfill.d.ts +5 -1
- package/dist/core/kg-backfill.d.ts.map +1 -1
- package/dist/core/kg-backfill.js +155 -2
- package/dist/core/kg-backfill.js.map +1 -1
- package/dist/core/operations.d.ts +13 -2
- package/dist/core/operations.d.ts.map +1 -1
- package/dist/core/operations.js +93 -15
- package/dist/core/operations.js.map +1 -1
- package/dist/core/serializer.d.ts.map +1 -1
- package/dist/core/serializer.js +8 -0
- package/dist/core/serializer.js.map +1 -1
- package/dist/core/types.d.ts +1 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/why.d.ts +54 -0
- package/dist/core/why.d.ts.map +1 -0
- package/dist/core/why.js +168 -0
- package/dist/core/why.js.map +1 -0
- package/dist/core/work-topology.d.ts +3 -0
- package/dist/core/work-topology.d.ts.map +1 -1
- package/dist/core/work-topology.js +11 -2
- package/dist/core/work-topology.js.map +1 -1
- package/dist/db.d.ts +31 -4
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +163 -31
- package/dist/db.js.map +1 -1
- package/dist/skills-manifest.json +29 -19
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +1 -1
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/transports/cli/cli.js +198 -61
- package/dist/transports/cli/cli.js.map +1 -1
- package/dist/transports/http/server.d.ts.map +1 -1
- package/dist/transports/http/server.js +43 -5
- package/dist/transports/http/server.js.map +1 -1
- package/dist/transports/mcp/handlers.d.ts.map +1 -1
- package/dist/transports/mcp/handlers.js +2 -2
- package/dist/transports/mcp/handlers.js.map +1 -1
- package/dist/transports/schemas.d.ts +8 -0
- package/dist/transports/schemas.d.ts.map +1 -1
- package/dist/transports/schemas.js +7 -0
- package/dist/transports/schemas.js.map +1 -1
- package/hooks/hooks.json +10 -0
- package/package.json +3 -2
- package/scripts/hooks/_generated/guards.js +110 -0
- package/scripts/hooks/_generated/sqlite.js +1 -1
- package/scripts/hooks/_generated/work-topology.js +11 -2
- package/scripts/hooks/_shared.js +77 -4
- package/scripts/hooks/guard-check.js +76 -0
- package/scripts/hooks/post-commit.js +27 -0
- package/scripts/hooks/pre-edit-recall.js +157 -121
- package/scripts/hooks/session-start.js +34 -23
- package/scripts/hooks/session-summary.js +43 -90
- package/skills/memesh/SKILL.md +11 -0
|
@@ -6,27 +6,28 @@
|
|
|
6
6
|
<title>MeMesh — Dashboard</title>
|
|
7
7
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
8
8
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
<script type="module" crossorigin>(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))r(a);new MutationObserver(a=>{for(const i of a)if(i.type==="childList")for(const u of i.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&r(u)}).observe(document,{childList:!0,subtree:!0});function o(a){const i={};return a.integrity&&(i.integrity=a.integrity),a.referrerPolicy&&(i.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?i.credentials="include":a.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(a){if(a.ep)return;a.ep=!0;const i=o(a);fetch(a.href,i)}})();var Ft,re,go,Qe,Es,po,fo,$t,Pt,mt,yo,us,as,rs,It={},Dt=[],Xo=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Bt=Array.isArray;function Ve(t,s){for(var o in s)t[o]=s[o];return t}function hs(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function Jo(t,s,o){var r,a,i,u={};for(i in s)i=="key"?r=s[i]:i=="ref"?a=s[i]:u[i]=s[i];if(arguments.length>2&&(u.children=arguments.length>3?Ft.call(arguments,2):o),typeof t=="function"&&t.defaultProps!=null)for(i in t.defaultProps)u[i]===void 0&&(u[i]=t.defaultProps[i]);return Rt(t,u,r,a,null)}function Rt(t,s,o,r,a){var i={type:t,props:s,key:o,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:a??++go,__i:-1,__u:0};return a==null&&re.vnode!=null&&re.vnode(i),i}function ie(t){return t.children}function jt(t,s){this.props=t,this.context=s}function at(t,s){if(s==null)return t.__?at(t.__,t.__i+1):null;for(var o;s<t.__k.length;s++)if((o=t.__k[s])!=null&&o.__e!=null)return o.__e;return typeof t.type=="function"?at(t):null}function Qo(t){if(t.__P&&t.__d){var s=t.__v,o=s.__e,r=[],a=[],i=Ve({},s);i.__v=s.__v+1,re.vnode&&re.vnode(i),gs(t.__P,i,s,t.__n,t.__P.namespaceURI,32&s.__u?[o]:null,r,o??at(s),!!(32&s.__u),a),i.__v=s.__v,i.__.__k[i.__i]=i,wo(r,i,a),s.__e=s.__=null,i.__e!=o&&bo(i)}}function bo(t){if((t=t.__)!=null&&t.__c!=null)return t.__e=t.__c.base=null,t.__k.some(function(s){if(s!=null&&s.__e!=null)return t.__e=t.__c.base=s.__e}),bo(t)}function Ls(t){(!t.__d&&(t.__d=!0)&&Qe.push(t)&&!Nt.__r++||Es!=re.debounceRendering)&&((Es=re.debounceRendering)||po)(Nt)}function Nt(){try{for(var t,s=1;Qe.length;)Qe.length>s&&Qe.sort(fo),t=Qe.shift(),s=Qe.length,Qo(t)}finally{Qe.length=Nt.__r=0}}function vo(t,s,o,r,a,i,u,m,d,l,h){var c,y,b,g,p,_,f,C=r&&r.__k||Dt,k=s.length;for(d=Zo(o,s,C,d,k),c=0;c<k;c++)(b=o.__k[c])!=null&&(y=b.__i!=-1&&C[b.__i]||It,b.__i=c,_=gs(t,b,y,a,i,u,m,d,l,h),g=b.__e,b.ref&&y.ref!=b.ref&&(y.ref&&ps(y.ref,null,b),h.push(b.ref,b.__c||g,b)),p==null&&g!=null&&(p=g),(f=!!(4&b.__u))||y.__k===b.__k?(d=ko(b,d,t,f),f&&y.__e&&(y.__e=null)):typeof b.type=="function"&&_!==void 0?d=_:g&&(d=g.nextSibling),b.__u&=-7);return o.__e=p,d}function Zo(t,s,o,r,a){var i,u,m,d,l,h=o.length,c=h,y=0;for(t.__k=new Array(a),i=0;i<a;i++)(u=s[i])!=null&&typeof u!="boolean"&&typeof u!="function"?(typeof u=="string"||typeof u=="number"||typeof u=="bigint"||u.constructor==String?u=t.__k[i]=Rt(null,u,null,null,null):Bt(u)?u=t.__k[i]=Rt(ie,{children:u},null,null,null):u.constructor===void 0&&u.__b>0?u=t.__k[i]=Rt(u.type,u.props,u.key,u.ref?u.ref:null,u.__v):t.__k[i]=u,d=i+y,u.__=t,u.__b=t.__b+1,m=null,(l=u.__i=en(u,o,d,c))!=-1&&(c--,(m=o[l])&&(m.__u|=2)),m==null||m.__v==null?(l==-1&&(a>h?y--:a<h&&y++),typeof u.type!="function"&&(u.__u|=4)):l!=d&&(l==d-1?y--:l==d+1?y++:(l>d?y--:y++,u.__u|=4))):t.__k[i]=null;if(c)for(i=0;i<h;i++)(m=o[i])!=null&&(2&m.__u)==0&&(m.__e==r&&(r=at(m)),_o(m,m));return r}function ko(t,s,o,r){var a,i;if(typeof t.type=="function"){for(a=t.__k,i=0;a&&i<a.length;i++)a[i]&&(a[i].__=t,s=ko(a[i],s,o,r));return s}t.__e!=s&&(r&&(s&&t.type&&!s.parentNode&&(s=at(t)),o.insertBefore(t.__e,s||null)),s=t.__e);do s=s&&s.nextSibling;while(s!=null&&s.nodeType==8);return s}function en(t,s,o,r){var a,i,u,m=t.key,d=t.type,l=s[o],h=l!=null&&(2&l.__u)==0;if(l===null&&m==null||h&&m==l.key&&d==l.type)return o;if(r>(h?1:0)){for(a=o-1,i=o+1;a>=0||i<s.length;)if((l=s[u=a>=0?a--:i++])!=null&&(2&l.__u)==0&&m==l.key&&d==l.type)return u}return-1}function Ts(t,s,o){s[0]=="-"?t.setProperty(s,o??""):t[s]=o==null?"":typeof o!="number"||Xo.test(s)?o:o+"px"}function Mt(t,s,o,r,a){var i,u;e:if(s=="style")if(typeof o=="string")t.style.cssText=o;else{if(typeof r=="string"&&(t.style.cssText=r=""),r)for(s in r)o&&s in o||Ts(t.style,s,"");if(o)for(s in o)r&&o[s]==r[s]||Ts(t.style,s,o[s])}else if(s[0]=="o"&&s[1]=="n")i=s!=(s=s.replace(yo,"$1")),u=s.toLowerCase(),s=u in t||s=="onFocusOut"||s=="onFocusIn"?u.slice(2):s.slice(2),t.l||(t.l={}),t.l[s+i]=o,o?r?o[mt]=r[mt]:(o[mt]=us,t.addEventListener(s,i?rs:as,i)):t.removeEventListener(s,i?rs:as,i);else{if(a=="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 t)try{t[s]=o??"";break e}catch{}typeof o=="function"||(o==null||o===!1&&s[4]!="-"?t.removeAttribute(s):t.setAttribute(s,s=="popover"&&o==1?"":o))}}function Ps(t){return function(s){if(this.l){var o=this.l[s.type+t];if(s[Pt]==null)s[Pt]=us++;else if(s[Pt]<o[mt])return;return o(re.event?re.event(s):s)}}}function gs(t,s,o,r,a,i,u,m,d,l){var h,c,y,b,g,p,_,f,C,k,I,T,F,H,X,ee=s.type;if(s.constructor!==void 0)return null;128&o.__u&&(d=!!(32&o.__u),i=[m=s.__e=o.__e]),(h=re.__b)&&h(s);e:if(typeof ee=="function")try{if(f=s.props,C=ee.prototype&&ee.prototype.render,k=(h=ee.contextType)&&r[h.__c],I=h?k?k.props.value:h.__:r,o.__c?_=(c=s.__c=o.__c).__=c.__E:(C?s.__c=c=new ee(f,I):(s.__c=c=new jt(f,I),c.constructor=ee,c.render=sn),k&&k.sub(c),c.state||(c.state={}),c.__n=r,y=c.__d=!0,c.__h=[],c._sb=[]),C&&c.__s==null&&(c.__s=c.state),C&&ee.getDerivedStateFromProps!=null&&(c.__s==c.state&&(c.__s=Ve({},c.__s)),Ve(c.__s,ee.getDerivedStateFromProps(f,c.__s))),b=c.props,g=c.state,c.__v=s,y)C&&ee.getDerivedStateFromProps==null&&c.componentWillMount!=null&&c.componentWillMount(),C&&c.componentDidMount!=null&&c.__h.push(c.componentDidMount);else{if(C&&ee.getDerivedStateFromProps==null&&f!==b&&c.componentWillReceiveProps!=null&&c.componentWillReceiveProps(f,I),s.__v==o.__v||!c.__e&&c.shouldComponentUpdate!=null&&c.shouldComponentUpdate(f,c.__s,I)===!1){s.__v!=o.__v&&(c.props=f,c.state=c.__s,c.__d=!1),s.__e=o.__e,s.__k=o.__k,s.__k.some(function(pe){pe&&(pe.__=s)}),Dt.push.apply(c.__h,c._sb),c._sb=[],c.__h.length&&u.push(c);break e}c.componentWillUpdate!=null&&c.componentWillUpdate(f,c.__s,I),C&&c.componentDidUpdate!=null&&c.__h.push(function(){c.componentDidUpdate(b,g,p)})}if(c.context=I,c.props=f,c.__P=t,c.__e=!1,T=re.__r,F=0,C)c.state=c.__s,c.__d=!1,T&&T(s),h=c.render(c.props,c.state,c.context),Dt.push.apply(c.__h,c._sb),c._sb=[];else do c.__d=!1,T&&T(s),h=c.render(c.props,c.state,c.context),c.state=c.__s;while(c.__d&&++F<25);c.state=c.__s,c.getChildContext!=null&&(r=Ve(Ve({},r),c.getChildContext())),C&&!y&&c.getSnapshotBeforeUpdate!=null&&(p=c.getSnapshotBeforeUpdate(b,g)),H=h!=null&&h.type===ie&&h.key==null?xo(h.props.children):h,m=vo(t,Bt(H)?H:[H],s,o,r,a,i,u,m,d,l),c.base=s.__e,s.__u&=-161,c.__h.length&&u.push(c),_&&(c.__E=c.__=null)}catch(pe){if(s.__v=null,d||i!=null)if(pe.then){for(s.__u|=d?160:128;m&&m.nodeType==8&&m.nextSibling;)m=m.nextSibling;i[i.indexOf(m)]=null,s.__e=m}else{for(X=i.length;X--;)hs(i[X]);is(s)}else s.__e=o.__e,s.__k=o.__k,pe.then||is(s);re.__e(pe,s,o)}else i==null&&s.__v==o.__v?(s.__k=o.__k,s.__e=o.__e):m=s.__e=tn(o.__e,s,o,r,a,i,u,d,l);return(h=re.diffed)&&h(s),128&s.__u?void 0:m}function is(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(is))}function wo(t,s,o){for(var r=0;r<o.length;r++)ps(o[r],o[++r],o[++r]);re.__c&&re.__c(s,t),t.some(function(a){try{t=a.__h,a.__h=[],t.some(function(i){i.call(a)})}catch(i){re.__e(i,a.__v)}})}function xo(t){return typeof t!="object"||t==null||t.__b>0?t:Bt(t)?t.map(xo):Ve({},t)}function tn(t,s,o,r,a,i,u,m,d){var l,h,c,y,b,g,p,_=o.props||It,f=s.props,C=s.type;if(C=="svg"?a="http://www.w3.org/2000/svg":C=="math"?a="http://www.w3.org/1998/Math/MathML":a||(a="http://www.w3.org/1999/xhtml"),i!=null){for(l=0;l<i.length;l++)if((b=i[l])&&"setAttribute"in b==!!C&&(C?b.localName==C:b.nodeType==3)){t=b,i[l]=null;break}}if(t==null){if(C==null)return document.createTextNode(f);t=document.createElementNS(a,C,f.is&&f),m&&(re.__m&&re.__m(s,i),m=!1),i=null}if(C==null)_===f||m&&t.data==f||(t.data=f);else{if(i=i&&Ft.call(t.childNodes),!m&&i!=null)for(_={},l=0;l<t.attributes.length;l++)_[(b=t.attributes[l]).name]=b.value;for(l in _)b=_[l],l=="dangerouslySetInnerHTML"?c=b:l=="children"||l in f||l=="value"&&"defaultValue"in f||l=="checked"&&"defaultChecked"in f||Mt(t,l,null,b,a);for(l in f)b=f[l],l=="children"?y=b:l=="dangerouslySetInnerHTML"?h=b:l=="value"?g=b:l=="checked"?p=b:m&&typeof b!="function"||_[l]===b||Mt(t,l,b,_[l],a);if(h)m||c&&(h.__html==c.__html||h.__html==t.innerHTML)||(t.innerHTML=h.__html),s.__k=[];else if(c&&(t.innerHTML=""),vo(s.type=="template"?t.content:t,Bt(y)?y:[y],s,o,r,C=="foreignObject"?"http://www.w3.org/1999/xhtml":a,i,u,i?i[0]:o.__k&&at(o,0),m,d),i!=null)for(l=i.length;l--;)hs(i[l]);m||(l="value",C=="progress"&&g==null?t.removeAttribute("value"):g!=null&&(g!==t[l]||C=="progress"&&!g||C=="option"&&g!=_[l])&&Mt(t,l,g,_[l],a),l="checked",p!=null&&p!=t[l]&&Mt(t,l,p,_[l],a))}return t}function ps(t,s,o){try{if(typeof t=="function"){var r=typeof t.__u=="function";r&&t.__u(),r&&s==null||(t.__u=t(s))}else t.current=s}catch(a){re.__e(a,o)}}function _o(t,s,o){var r,a;if(re.unmount&&re.unmount(t),(r=t.ref)&&(r.current&&r.current!=t.__e||ps(r,null,s)),(r=t.__c)!=null){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(i){re.__e(i,s)}r.base=r.__P=null}if(r=t.__k)for(a=0;a<r.length;a++)r[a]&&_o(r[a],s,o||typeof t.type!="function");o||hs(t.__e),t.__c=t.__=t.__e=void 0}function sn(t,s,o){return this.constructor(t,o)}function on(t,s,o){var r,a,i,u;s==document&&(s=document.documentElement),re.__&&re.__(t,s),a=(r=!1)?null:s.__k,i=[],u=[],gs(s,t=s.__k=Jo(ie,null,[t]),a||It,It,s.namespaceURI,a?null:s.firstChild?Ft.call(s.childNodes):null,i,a?a.__e:s.firstChild,r,u),wo(i,t,u)}Ft=Dt.slice,re={__e:function(t,s,o,r){for(var a,i,u;s=s.__;)if((a=s.__c)&&!a.__)try{if((i=a.constructor)&&i.getDerivedStateFromError!=null&&(a.setState(i.getDerivedStateFromError(t)),u=a.__d),a.componentDidCatch!=null&&(a.componentDidCatch(t,r||{}),u=a.__d),u)return a.__E=a}catch(m){t=m}throw t}},go=0,jt.prototype.setState=function(t,s){var o;o=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=Ve({},this.state),typeof t=="function"&&(t=t(Ve({},o),this.props)),t&&Ve(o,t),t!=null&&this.__v&&(s&&this._sb.push(s),Ls(this))},jt.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),Ls(this))},jt.prototype.render=ie,Qe=[],po=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,fo=function(t,s){return t.__v.__b-s.__v.__b},Nt.__r=0,$t=Math.random().toString(8),Pt="__d"+$t,mt="__a"+$t,yo=/(PointerCapture)$|Capture$/i,us=0,as=Ps(!1),rs=Ps(!0);var nn=0;function e(t,s,o,r,a,i){s||(s={});var u,m,d=s;if("ref"in d)for(m in d={},s)m=="ref"?u=s[m]:d[m]=s[m];var l={type:t,props:d,key:o,ref:u,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--nn,__i:-1,__u:0,__source:a,__self:i};if(typeof t=="function"&&(u=t.defaultProps))for(m in u)d[m]===void 0&&(d[m]=u[m]);return re.vnode&&re.vnode(l),l}var ut,ge,Yt,Rs,ht=0,Mo=[],ke=re,js=ke.__b,zs=ke.__r,Is=ke.diffed,Ds=ke.__c,Ns=ke.unmount,Hs=ke.__;function fs(t,s){ke.__h&&ke.__h(ge,t,ht||s),ht=0;var o=ge.__H||(ge.__H={__:[],__h:[]});return t>=o.__.length&&o.__.push({}),o.__[t]}function x(t){return ht=1,an(So,t)}function an(t,s,o){var r=fs(ut++,2);if(r.t=t,!r.__c&&(r.__=[So(void 0,s),function(m){var d=r.__N?r.__N[0]:r.__[0],l=r.t(d,m);d!==l&&(r.__N=[l,r.__[1]],r.__c.setState({}))}],r.__c=ge,!ge.__f)){var a=function(m,d,l){if(!r.__c.__H)return!0;var h=r.__c.__H.__.filter(function(y){return y.__c});if(h.every(function(y){return!y.__N}))return!i||i.call(this,m,d,l);var c=r.__c.props!==m;return h.some(function(y){if(y.__N){var b=y.__[0];y.__=y.__N,y.__N=void 0,b!==y.__[0]&&(c=!0)}}),i&&i.call(this,m,d,l)||c};ge.__f=!0;var i=ge.shouldComponentUpdate,u=ge.componentWillUpdate;ge.componentWillUpdate=function(m,d,l){if(this.__e){var h=i;i=void 0,a(m,d,l),i=h}u&&u.call(this,m,d,l)},ge.shouldComponentUpdate=a}return r.__N||r.__}function te(t,s){var o=fs(ut++,3);!ke.__s&&Co(o.__H,s)&&(o.__=t,o.u=s,ge.__H.__h.push(o))}function ne(t){return ht=5,je(function(){return{current:t}},[])}function je(t,s){var o=fs(ut++,7);return Co(o.__H,s)&&(o.__=t(),o.__H=s,o.__h=t),o.__}function Me(t,s){return ht=8,je(function(){return t},s)}function rn(){for(var t;t=Mo.shift();){var s=t.__H;if(t.__P&&s)try{s.__h.some(zt),s.__h.some(ls),s.__h=[]}catch(o){s.__h=[],ke.__e(o,t.__v)}}}ke.__b=function(t){ge=null,js&&js(t)},ke.__=function(t,s){t&&s.__k&&s.__k.__m&&(t.__m=s.__k.__m),Hs&&Hs(t,s)},ke.__r=function(t){zs&&zs(t),ut=0;var s=(ge=t.__c).__H;s&&(Yt===ge?(s.__h=[],ge.__h=[],s.__.some(function(o){o.__N&&(o.__=o.__N),o.u=o.__N=void 0})):(s.__h.some(zt),s.__h.some(ls),s.__h=[],ut=0)),Yt=ge},ke.diffed=function(t){Is&&Is(t);var s=t.__c;s&&s.__H&&(s.__H.__h.length&&(Mo.push(s)!==1&&Rs===ke.requestAnimationFrame||((Rs=ke.requestAnimationFrame)||ln)(rn)),s.__H.__.some(function(o){o.u&&(o.__H=o.u),o.u=void 0})),Yt=ge=null},ke.__c=function(t,s){s.some(function(o){try{o.__h.some(zt),o.__h=o.__h.filter(function(r){return!r.__||ls(r)})}catch(r){s.some(function(a){a.__h&&(a.__h=[])}),s=[],ke.__e(r,o.__v)}}),Ds&&Ds(t,s)},ke.unmount=function(t){Ns&&Ns(t);var s,o=t.__c;o&&o.__H&&(o.__H.__.some(function(r){try{zt(r)}catch(a){s=a}}),o.__H=void 0,s&&ke.__e(s,o.__v))};var Os=typeof requestAnimationFrame=="function";function ln(t){var s,o=function(){clearTimeout(r),Os&&cancelAnimationFrame(s),setTimeout(t)},r=setTimeout(o,35);Os&&(s=requestAnimationFrame(o))}function zt(t){var s=ge,o=t.__c;typeof o=="function"&&(t.__c=void 0,o()),ge=s}function ls(t){var s=ge;t.__c=t.__(),ge=s}function Co(t,s){return!t||t.length!==s.length||s.some(function(o,r){return o!==t[r]})}function So(t,s){return typeof s=="function"?s(t):s}const Ht={en:{"auth.title":"Authentication required","auth.intro":"This dashboard is protected by a bearer token. Paste the value of MEMESH_REMOTE_TOKEN (or the contents of <memeshDir>/remote-token) below.","auth.tokenLabel":"Token","auth.empty":"Token cannot be empty.","auth.invalid":"That token was not accepted. Check it and try again.","auth.submit":"Unlock dashboard","auth.tokenPlaceholder":"paste token here","brand.subtitle":"powered by pcircle.com","header.connected":"Connected","header.disconnected":"Disconnected","header.connecting":"Connecting…","header.memories":"memories","tab.insights":"Insights","telemetry.title":"LLM activity","telemetry.lastNDays":"last {n}d","telemetry.loading":"loading…","telemetry.empty":"No AI activity in this period yet. Rows appear automatically once the background AI features (like weekly summaries and auto-tagging) run.","telemetry.callsCount":"{n} calls","telemetry.attemptsCount":"{n} attempts","telemetry.successRate":"success","telemetry.medianLatency":"median latency","telemetry.fallbackUsed":"fallback used {n}× ({pct} of calls)","telemetry.byProvider":"by provider","telemetry.byModel":"by model","telemetry.byProject":"by project","telemetry.errors":"errors","tab.search":"Search","tab.browse":"Browse","tab.analytics":"Analytics","tab.manage":"Manage","tab.graph":"Knowledge Graph","tab.lessons":"Lessons","tab.settings":"Settings","insights.title":"Memory insights","insights.subtitle":"auto-generated weekly recaps and patterns waiting for review","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"All","insights.refresh":"Refresh","insights.loading":"loading…","insights.emptyPending":"No pending insights. Run `memesh dream run` to generate weekly recaps.","insights.emptyNoLlm":"Configure an LLM provider in Settings to enable weekly recaps and pattern detection.","insights.emptyOther":"Nothing here.","insights.sources":"sources","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"View detail","insights.collapse":"Collapse","insights.accept":"Accept","insights.applying":"Applying…","insights.reject":"Reject","insights.generatedBy":"Generated by","insights.promptVersion":"Prompt version","insights.observations":"Summary observations","insights.tags":"Tags","insights.sourceIds":"Sources","insights.validationWarnings":"Flagged claims (LLM validator)","insights.validationClaim":"Claim","insights.validationReason":"Reason","insights.runDream":"Run weekly recap","insights.runDreamWithValidate":"Run with validator (slower, higher quality)","banner.pendingInsights":"{n} new insight{s} waiting for your review →","banner.dismiss":"Dismiss","banner.viewAll":"View all","pattern.title":"Pattern","pattern.evidenceCount":"{n} evidence","pattern.severity":"Severity","pattern.severity.high":"high","pattern.severity.medium":"medium","pattern.severity.low":"low","pattern.description":"Pattern description","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 name, content, or tags. Finds both exact words and close meanings.","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","browse.archiveFailed":"Could not archive memory: {message}","browse.restoreFailed":"Could not restore memory: {message}","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.entityMeta":"{type} · {confidence}% confidence · {days}d unused","settings.capabilities":"Capabilities","settings.smartMode":"Smart Mode","settings.core":"Core","settings.embeddings":"Embeddings","settings.llmProvider":"LLM Provider","settings.llmOptional.title":"LLM is optional","settings.llmOptional.body":"memesh works without an LLM. The default Core mode covers full-text recall, manual remember/recall, the dashboard, and session capture via hooks.","settings.llmOptional.coreLabel":"Without LLM (Core mode)","settings.llmOptional.coreFeatures":"FTS5 keyword search, manual remember/recall, dashboard, hooks-based session capture","settings.llmOptional.smartLabel":"With LLM (Smart mode)","settings.llmOptional.smartFeatures":"auto lesson_learned from session failures, auto-tagging of new entities, weekly recap + pattern detection","settings.apiKey":"API Key","settings.fallbacks.title":"Fallback providers","settings.fallbacks.explainer":"If your main provider is unavailable, memesh tries these in order until one works.","settings.fallbacks.privacyTitle":"Privacy note","settings.fallbacks.privacyBody":"Adding a cloud provider (OpenAI or Anthropic) means that when your main provider is down, your memory content — which can be private — is sent to that cloud provider. If you run a local provider for privacy, add a cloud fallback only if you accept this.","settings.fallbacks.empty":"No fallback providers yet.","settings.fallbacks.add":"Add fallback provider","settings.fallbacks.providerLabel":"Provider","settings.fallbacks.modelLabel":"Model (optional)","settings.fallbacks.modelPlaceholder":"e.g. gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"A key is saved. Leave blank to keep it.","settings.fallbacks.remove":"Remove","settings.fallbacks.moveUp":"Move up","settings.fallbacks.moveDown":"Move down","settings.fallbacks.priority":"Priority {n}","settings.fallbacks.save":"Save fallback chain","settings.fallbacks.needsKey":"Enter an API key, or this cloud fallback cannot be used.","settings.model":"Model (optional)","settings.save":"Save","settings.saving":"Saving…","settings.saved":"Saved.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Test","settings.testing":"Testing…","settings.testPassed":"✓ Connection OK · {count} models available","settings.testFailed":"Connection test failed","settings.suggested":"suggested","settings.testRequired":"Test connection before saving","settings.language":"Language","settings.searchMode":"Search Mode","settings.none":"None","settings.updates":"Updates","settings.updateChecking":"Checking for updates…","settings.updateUnavailable":"Could not check for updates right now","settings.updateNoSuccessfulChecks":"No successful update checks yet","settings.upToDate":"Up to date","settings.updateAvailable":"Update available","settings.updateStale":"Cached status may be outdated","settings.updateCachedFallback":"Using the last successful cached result","settings.updateDeprecatedNoTarget":"Deprecated — no upgrade target yet","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} is DEPRECATED by maintainers.","settings.updatePartialTitle":"⚠️ Update check partial","settings.updatePartialDescription":"{message}. Deprecation status is unknown for this session — re-run the check while online.","settings.updatePartialSummary":"Partial — deprecation status unknown","settings.updateDeprecatedTargetUnknown":"Deprecated — checking for upgrade target","settings.currentVersion":"Current version","settings.latestVersion":"Latest version","settings.lastChecked":"Last checked","settings.lastAttempted":"Last attempted check","settings.lastSuccessful":"Last successful check","settings.updateSourceFresh":"Fresh check","settings.updateSourceCached":"Using cached result","settings.updateSourceStale":"Using stale cached result","settings.updateSourceUnavailable":"No cached result","settings.updateCommand":"Update command","settings.checkNow":"Check now","settings.updateLastError":"Last check error: {message}","settings.installMethod":"Install method","settings.installNpmGlobal":"npm global install","settings.installNpmLocal":"project-local package install","settings.installSourceCheckout":"source checkout","settings.installUnknown":"unknown","settings.updateGuidanceNpmGlobal":"This install can be updated directly from MeMesh.","settings.updateGuidanceNpmLocal":"Update this install from the project package manager that installed MeMesh.","settings.updateGuidanceSourceCheckout":"Update this source checkout from its repository and rebuild it.","settings.updateGuidanceUnknown":"Update this installation from the tool or workflow that installed MeMesh.","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","graph.interactHint":"Click a node to focus · drag empty area to pan · scroll to zoom","graph.resetView":"Reset view","graph.resetViewHint":"Reset zoom and pan","graph.ageToday":"today","graph.ageDaysAgo":"{count}d ago","graph.ageWeeksAgo":"{count}w ago","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","feedback.submitting":"Gathering diagnostics…","doctorBanner.warnTitleSoft":"memesh has setup notes","doctorBanner.failTitle":"memesh setup is incomplete","doctorBanner.dismiss":"Dismiss","doctorBanner.getHelp":"Get help","doctorBanner.helpHint":"Opens a GitHub issue with the diagnostics pre-filled","doctorBanner.preambleForIssue":"memesh doctor reported the following on my install:","doctorBanner.moreCount":"…and {n} more — run `memesh doctor` for the full list","doctor.label.readme_locale_parity":"README translations","doctor.label.config":"Config file","doctor.label.mcp-config":"MCP connection file","doctor.label.hooks-config":"Hook definitions","doctor.label.hook-scripts":"Hook scripts","doctor.label.hook-wiring":"Connection to Claude Code","doctor.label.hook-activity":"Auto-capture","doctor.label.node-runtime":"Node.js version","doctor.label.native-binding":"SQLite and vector search","doctor.label.shell-cli":"Terminal command","doctor.label.dashboard":"Dashboard files","doctor.label.update-status":"Updates","doctor.label.http-probe":"Local server","doctor.label.skills-manifest":"Bundled files","doctor.label.config_parse":"Config file","doctor.label.embeddings_probe":"Meaning-based search","doctor.label.llm_probe":"AI provider","doctor.label.install-channel":"Install method","doctor.label.fts_segmentation":"Keyword index","doctor.label.vector_index":"Search index","doctor.label.database":"Database","doctor.msg.readme-parity.unreadable.summary":"Could not read README.md: {detail}","doctor.msg.readme-parity.drift.summary":"Some translated READMEs drifted from the English one: {detail}","doctor.msg.readme-parity.drift.fix":"Re-sync the listed READMEs with README.md.","doctor.msg.config.invalid-json.summary":"The config file at {path} is not valid JSON, so it is being ignored.","doctor.msg.config.invalid-json.fix":"Fix or delete {path}, then run `memesh config list` to confirm it loads.","doctor.msg.mcp-config.missing.summary":"The file that connects memesh to Claude Code (.mcp.json) is missing.","doctor.msg.mcp-config.missing.fix":"Reinstall MeMesh to restore it.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json is damaged (not valid JSON), so Claude Code cannot read it.","doctor.msg.mcp-config.invalid-json.fix":"Fix {path} or reinstall MeMesh.","doctor.msg.mcp-config.no-entry.summary":".mcp.json no longer contains the memesh server entry.","doctor.msg.mcp-config.no-entry.fix":"Reinstall MeMesh to restore it.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` starts a file that is not in this install, so every memesh tool inside Claude Code fails to start.","doctor.msg.mcp-config.entry-missing.fix":"Reinstall MeMesh. If you edited `.mcp.json` by hand, point it back at `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json is missing, so automatic memory capture cannot run.","doctor.msg.hooks-config.missing.fix":"Reinstall MeMesh to restore it.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json is damaged (not valid JSON).","doctor.msg.hooks-config.invalid-json.fix":"Fix {path} or reinstall MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json is missing these hook types: {types}. Some automatic capture will not run.","doctor.msg.hooks-config.missing-types.fix":"Restore the shipped hook configuration or reinstall MeMesh.","doctor.msg.hook-scripts.none.summary":"The hook configuration contains no scripts, so nothing can be captured automatically.","doctor.msg.hook-scripts.none.fix":"Reinstall MeMesh.","doctor.msg.hook-scripts.missing.summary":"These hook scripts are missing: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstall MeMesh to restore them.","doctor.msg.hook-scripts.not-executable.summary":"These hook scripts exist but are not allowed to run: {files}","doctor.msg.hook-scripts.not-executable.fix":"Run `chmod +x scripts/hooks/*.js`, or `npm run build` in a source checkout.","doctor.msg.hook-wiring.no-marker.summary":"memesh is not connected to Claude Code yet, so nothing gets remembered automatically.","doctor.msg.hook-wiring.no-marker.fix":"Run `memesh install-hooks` once, then `memesh doctor` to confirm.","doctor.msg.hook-wiring.script-missing.summary":"A wired memesh hook points at {path}, which no longer exists — the agent invokes a missing file on every matching event. Usually residue from an upgrade that retired the hook.","doctor.msg.hook-wiring.script-missing.fix":"Run `memesh install-hooks` to re-wire (it removes retired entries), then restart your agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"The connection record at {path} cannot be read.","doctor.msg.hook-wiring.marker-unreadable.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.marker-malformed.summary":"The connection record is damaged.","doctor.msg.hook-wiring.marker-malformed.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.settings-missing.summary":"The Claude Code settings file ({path}) is gone, so the connection is broken.","doctor.msg.hook-wiring.settings-missing.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} is damaged (not valid JSON).","doctor.msg.hook-wiring.settings-invalid.fix":"Restore it from a backup, or run `memesh install-hooks` to recreate it.","doctor.msg.hook-wiring.entries-removed.summary":"The memesh entries were removed from {path}, so the connection is broken.","doctor.msg.hook-wiring.entries-removed.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.root-moved.summary":"The connection points at {path}, which no longer exists (memesh probably moved).","doctor.msg.hook-wiring.root-moved.fix":"Run `memesh install-hooks` to refresh it.","doctor.msg.hook-activity.never-ran.summary":"No capture hook has run in the {hours} hours since tracking began, even though hook wiring is in place — nothing is being remembered.","doctor.msg.hook-activity.never-ran.fix":"Finish one work session, then run `memesh doctor` again. If it still says no hook has run, run `memesh install-hooks` and restart your agent.","doctor.msg.hook-activity.stale.summary":"The last capture hook ran about {hours} hours ago ({hook}). If you have worked since then, capture has stopped and nothing from those sessions was saved.","doctor.msg.hook-activity.stale.fix":"Restart your agent, end one session, then run `memesh doctor` again. If it does not recover, run `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"The session-summary hook last ran about {hours} hours ago, and no Claude Code writes landed in the last 3 days either. If this machine has moved to another agent (Codex / Gemini), this is expected; if you still use Claude Code here, capture has stopped.","doctor.msg.hook-activity.stale-unconfirmed.fix":"If you still use Claude Code on this machine: restart it, end one session, and re-run `memesh doctor`. If it does not recover, run `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Could not read hook activity from the database: {detail}. Capture health is unknown, which is not the same as healthy.","doctor.msg.hook-activity.query-failed.fix":"Run `memesh doctor --verbose` for the full error, and check that ~/.memesh is readable and not out of disk.","doctor.msg.hook-activity.stale-unknown.summary":"The {hook} hook's last-run timestamp cannot be read (corrupt, or stamped by a machine with a wrong clock). Capture health is unknown, which is not the same as healthy.","doctor.msg.hook-activity.stale-unknown.fix":"End one work session, then run `memesh doctor` again — a fresh run overwrites the bad timestamp.","doctor.msg.hook-activity.disabled.summary":"Automatic capture is turned off (MEMESH_AUTO_CAPTURE or config autoCapture) — deliberately, so hook silence is expected. Re-enable it to resume capturing sessions.","doctor.msg.hook-activity.disabled-env.summary":"Automatic capture is turned off by MEMESH_AUTO_CAPTURE=false in this shell's environment. Doctor can only see its own environment — if your agent runs without this variable, capture there is unaffected.","doctor.msg.hook-activity.not-wired.summary":"No capture hook has ever run — and no capture hook (Stop / PostToolUse / PreCompact) is confirmed wired on this machine, so there is nothing to run.","doctor.msg.hook-activity.not-wired.fix":"If you want automatic capture, run `memesh install-hooks`. If this install is MCP-only (Codex / Gemini), this is expected and safe to ignore.","doctor.msg.hook-activity.stop-silent.summary":"The {hook} hook is stamping, but the session-summary hook has never run once in the {hours} hours since tracking began — session capture may be broken while commit capture hides it.","doctor.msg.hook-activity.stop-silent.fix":"End one work session and run `memesh doctor` again. If session-summary still has not run, run `memesh install-hooks` and restart your agent.","doctor.msg.hook-activity.never-ran-legacy.summary":"No hook has stamped the heartbeat, but {captured} auto-capture memories landed since tracking began — hooks from a version before heartbeat tracking are probably still running.","doctor.msg.hook-activity.never-ran-legacy.fix":"Update the memesh hooks to the current version (plugin installs: `/plugin update memesh`; npm installs: `memesh install-hooks`), then restart your agent.","doctor.msg.node-runtime.too-old.summary":"Your Node.js is older than this package supports. {detail}","doctor.msg.node-runtime.too-old.fix":"Upgrade Node.js to {required} or newer, then run `memesh doctor` again.","doctor.msg.native-binding.node-too-old.summary":"The SQLite built into this version of Node is too old for memesh — it cannot load the part that searches by meaning. The complete version arrived in Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Upgrade Node to 22.13 or newer, then run `memesh doctor` again.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec is not installed. Memories are still saved and found by keyword — only search by meaning is off.","doctor.msg.native-binding.not-installed.fix":"Run `npm install` in the folder that uses @pcircle/memesh.","doctor.msg.native-binding.load-failed.summary":"sqlite-vec could not load: {detail}. Search falls back to keywords only.","doctor.msg.native-binding.load-failed.fix":'Run: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"The `memesh` command is not available in your terminal. Claude Code features still work — this only affects typing `memesh` yourself.","doctor.msg.shell-cli.not-on-path.fix":"Run `npm install -g @pcircle/memesh` to add it. Both installs share the same memory.","doctor.msg.dashboard.missing.summary":"The dashboard files are missing.","doctor.msg.dashboard.missing.fix":"Build them with `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"memesh has not been able to check for newer versions yet.","doctor.msg.update-status.no-cache.fix":"Run `memesh status` once while online — that stores the answer and this notice goes away.","doctor.msg.update-status.deprecated.summary":"Version {version} has been withdrawn by its maintainers: {detail}","doctor.msg.update-status.deprecated.fix":"Update now — run `memesh update` (or follow your install method).","doctor.msg.update-status.deprecation-unknown.summary":"Could not confirm whether version {version} is still safe to use: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Run `memesh status` while online to retry.","doctor.msg.update-status.update-available.summary":"A newer version is available: {latest} (you have {current}).","doctor.msg.update-status.update-available.fix":"Run `memesh update` to upgrade.","doctor.msg.update-status.stale.summary":"Version {version} is current, but the update info is old.","doctor.msg.update-status.stale.fix":"Run `memesh status` while online to refresh it.","doctor.msg.http-probe.bad-status.summary":"The local server at {url} answered with an error (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Restart it with `memesh serve` and check the logs.","doctor.msg.http-probe.no-server.summary":"No local server is running at {url}.","doctor.msg.http-probe.no-server.fix":"Start one with `memesh serve` if you want the dashboard.","doctor.msg.skills-manifest.missing-dev.summary":"No file-integrity manifest found (normal when running from source code).","doctor.msg.skills-manifest.missing-dev.fix":"Run `npm run build` to generate it.","doctor.msg.skills-manifest.unreadable.summary":"The file-integrity manifest cannot be read ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Reinstall: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"The file-integrity manifest is empty.","doctor.msg.skills-manifest.empty.fix":"Reinstall: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Some bundled files do not match what was shipped: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Reinstall: `npm install -g @pcircle/memesh`. If it happens again on a fresh install, report it as a security issue.","doctor.msg.config-parse.not-object.summary":"The config file at {path} is not in the expected format, so every setting is being ignored.","doctor.msg.config-parse.not-object.fix":"Fix or delete {path}, then run `memesh doctor` again.","doctor.msg.config-parse.unreadable.summary":"The config file at {path} cannot be read ({detail}), so every setting is being ignored.","doctor.msg.config-parse.unreadable.fix":"Fix the file, or set it aside: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'Meaning-based search is set to "{provider}" but produced nothing in a test. Keyword search still works.',"doctor.msg.embeddings.empty.fix":"Run `memesh doctor --probe` for detail, or check the provider connection.","doctor.msg.embeddings.threw.summary":'Meaning-based search is set to "{provider}" but failed in a test: {detail}. Keyword search still works.',"doctor.msg.embeddings.threw.fix":"Check the embedding provider is reachable (e.g. run `ollama serve`), or remove embedder config to use keyword-only search.","doctor.msg.llm.unreachable.summary":"The AI provider ({provider}) did not answer: {detail}. AI features are silently doing nothing.","doctor.msg.llm.unreachable.fix":"Check the API key and connection, then run `memesh doctor --probe` again.","doctor.msg.llm.threw.summary":"Testing the AI provider ({provider}) failed: {detail}. AI features are silently doing nothing.","doctor.msg.llm.threw.fix":"Check the API key and connection, then run `memesh doctor --probe` again.","doctor.msg.install-channel.unknown.summary":"Could not tell how memesh was installed.","doctor.msg.install-channel.unknown.fix":"If this is a source checkout, run from the repo root; otherwise reinstall with `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"The keyword index has {count} entries in an old format — some memories only match their exact full text.","doctor.msg.fts.unsegmented.fix":"Run `memesh reindex --fts` to rebuild the index.","doctor.msg.vector-index.stale.summary":"The search index needs a rebuild (the search settings changed).","doctor.msg.vector-index.stale.fix":"Run `memesh reindex` to rebuild it.","doctor.msg.database.broken.summary":"The database is not usable: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"{used} used / {total} injected","analytics.loadFailed":"Could not load analytics.","memory.noContent":"(no content)","memory.archivedBadge":"archived","memory.factsCount":"{count} facts","common.error":"Error","common.serverUnreachable":"Could not reach the memesh server.","common.serverUnreachableAction":"Check that `memesh serve` is still running, then reload this page.","common.responseUnreadable":"The server answered, but this page could not read the reply — the dashboard and server may be out of sync.","common.responseUnreadableAction":"Reload the page. If this keeps happening, run `memesh doctor`.","pm.title":"PM Metrics","pm.decisionsPerWeek":"decisions/week","pm.openDecisions":"open decisions (>14d)","pm.orphanRate":"Unlinked memories","pm.relationsTotal":"relations total","pm.stalePlans":"{count} plan(s) not reviewed in 30+ days","common.loading":"Loading…","common.noData":"No data","errors.unknown":"Unknown error","insights.noPreview":"This proposal has no summary text","httpError.auth.missing-bearer":"This server needs an access token. Enter your token to continue.","httpError.auth.invalid-token":"The access token was not accepted. Check it and try again.","httpError.auth.not-configured":"The server has no access token set up. Restart `memesh serve` and check its output.","httpError.validation.bad-body":"The page sent a request the server could not read. Reload the page and try again.","httpError.validation.bad-param":"Part of the request was not valid. Reload the page and try again.","httpError.route.retired":"The server no longer supports this action — the page and server may be different versions. Reload the page.","httpError.route.not-found":"The server does not know this request — the page and server may be different versions. Reload the page.","httpError.resource.not-found":"That item no longer exists on the server. Refresh the list.","httpError.payload.too-large":"The data sent was too large (over 1 MB). Try a smaller batch.","httpError.operation.failed":"The server could not complete this action.","httpError.llm.not-configured":"No AI provider is set up. Add one in Settings first.","httpError.rate.limited":"Too many requests in a short time. Wait a moment and try again.","httpError.server.internal":"The server hit an unexpected error.","settings.testError.auth":"The API key was rejected. Check the key and try again.","settings.testError.network":"Could not reach the provider. Check your internet connection.","settings.testError.no_models":"The provider answered but returned no usable models.","settings.testError.bad_host":"The Ollama address must be on this machine (localhost).","settings.testError.http":"The provider returned an error (HTTP {status}).","settings.testError.unknown":"The test failed for an unknown reason.","time.justNow":"Just now","time.hoursAgo":"{count}h ago","time.today":"Today","time.yesterday":"Yesterday","time.daysAgo":"{count}d ago","time.lastWeek":"Last week","time.weeksAgo":"{count}w ago","time.lastMonth":"Last month","time.monthsAgo":"{count}mo ago","memory.access.frequent":"Frequent · {count} recalls","memory.access.recalls":"{count} recalls","memory.access.never":"Never recalled","cluster.knowledge":"Knowledge","cluster.activity":"Activity","cluster.session":"Sessions","cluster.reference":"Reference","cluster.all":"All","browse.filterCategory":"Category","browse.filterTime":"Time","browse.filterValue":"Value","browse.filterProject":"Project","browse.filterSort":"Sort","browse.timeToday":"Today","browse.timeWeek":"This week","browse.timeMonth":"This month","browse.timeOlder":"Older","browse.valueRecalled":"✓ Used","browse.valueNever":"Never recalled","browse.sortMostRecalled":"Most recalled","browse.sortRecent":"Recently used","browse.sortCreated":"Created","browse.emptyFilter":"No memories in this category — try a different filter","lessons.tabFailure":"Failure lessons","lessons.tabPlan":"Plan records","lessons.tabFreeform":"Notes","lessons.totalRecalls":"Total recalls","lessons.stepsLabel":"steps","lessons.commitsCount":"{count} commits","lessons.unstructured":"(No structured fields — see raw memory)","lessons.searchPlaceholder":"Search error / root cause / fix / name…","lessons.allProjects":"All projects","lessons.showing":"Showing {visible} / {total}","lessons.noMatch":'No memories matching "{query}"',"lessons.emptyCategory":"No memories in this category","lessons.moreItems":"+{count} more","roadmap.title":"Project Roadmap","roadmap.summary":"{count} memories · {first} → {last}","roadmap.switchToList":"↩ List view","roadmap.switchToRoadmap":"🗺️ Roadmap view","roadmap.emptyProject":"No memories in this project yet.","loop.label":"Memory loop","loop.subtitleHas":"knowledge memories reused in the past 7 days","loop.subtitleNone":"No knowledge memories reused this week — try recalling a lesson","loop.approxNote":"Approximation — full tracking starts after upgrade.","loop.sparkLabel":"Last 30 days","roadmap.milestones":"Milestones","roadmap.keyLessons":"Key lessons","radar.title":"Knowledge coverage radar","radar.caption":"Active knowledge memories (session and commit excluded)","radar.axis.lessons":"Lessons","radar.axis.decisions":"Decisions","radar.axis.patterns":"Patterns","radar.axis.bugs":"Bug fixes","radar.axis.processes":"Processes","radar.axis.architecture":"Architecture","ageMatrix.title":"Memory age distribution","ageMatrix.low":"Low","ageMatrix.high":"High","ageMatrix.legend":"colour depth = memory density","ageMatrix.typeColumn":"Type","header.signalModeOn":"Signal","header.signalModeOff":"All","header.signalModeOnHint":"Hiding session and commit noise. Click to show everything.","header.signalModeOffHint":"Showing all memories including session and commit noise. Click to hide noise.","roadmap.phases":"Phases","onboarding.title":"Welcome to MeMesh","onboarding.body":"Your memory store is empty. Start with a curated 30-entity tour or stash your first lesson.","onboarding.llmHint":"No LLM required. Everything below works on FTS5 alone. An LLM is optional for auto-lesson generation — configure later in Settings.","onboarding.seedButton":"Try the demo tour","onboarding.seedingButton":"Seeding…","onboarding.seedHint":"Adds 30 memories you can wipe later — no terminal needed","onboarding.cliReference":"Prefer the CLI?","onboarding.hintDemo":"Seeds 30 demo memories you can wipe later","onboarding.hintReset":"Removes everything tagged metadata.demo","onboarding.resetButton":"Reset demo","onboarding.resettingButton":"Resetting…","onboarding.resetConfirm":"Remove all demo memories? Real entries you saved will be kept.","onboarding.dismiss":"Dismiss","common.serverError":"The server reported an error (HTTP {status}). Try again — if it keeps happening, run `memesh doctor`.","emptyLibrary.title":"Your memory is empty","emptyLibrary.body":"Nothing is stored here yet. Load the 30-entry demo tour to see how MeMesh works — you can wipe it later with one click.","browse.truncated":"showing the first {shown} of {total} memories — use search or filters to reach the rest","lessons.capNote":"showing the first {limit} lessons — the counts above cover only these","lessons.emptyGuide":"No lessons yet. In Smart Mode memesh saves one automatically when a session failure is analyzed — or ask your assistant to remember one.","graph.cappedNote":"Showing the top {shown} of {total} entities (most recalled first) so the graph stays responsive.","settings.testStoredKeyHint":"Leave the field empty to test the key that is already saved.","ageMatrix.bucket.week":"This week","ageMatrix.bucket.month":"This month","ageMatrix.bucket.quarter":"This quarter","ageMatrix.bucket.older":"Older","settings.behaviourTitle":"Behaviour","settings.autoUpdateLabel":"Auto-update policy","settings.autoUpdateOff":"Off — manual only","settings.autoUpdatePatch":"Patch — auto-apply X.Y.Z+1","settings.autoUpdateMinor":"Minor — auto-apply X.Y+1.0","settings.autoUpdateMajor":"Major — auto-apply any bump","settings.autoUpdateHint":"Triggered after every session ends. Env MEMESH_AUTO_UPDATE wins when set.","errors.timeout":"Request timed out","type.lesson_learned":"Lesson","type.lesson":"Lesson","type.mistake":"Mistake","type.decision":"Decision","type.architecture_decision":"Arch decision","type.design_decision":"Design decision","type.pattern":"Pattern","type.technical_pattern":"Tech pattern","type.best_practice":"Best practice","type.bug_fix":"Bug fix","type.verification_result":"Verification","type.test_result":"Test result","type.process":"Process","type.architecture":"Architecture","type.infrastructure":"Infrastructure","type.feature":"Feature","type.release":"Release","type.refactoring":"Refactoring","type.commit":"Commit","type.session_keypoint":"Session keypoint","type.session_identity":"Session identity","type.session-insight":"Session insight","type.session-summary":"Session summary","type.session-identity":"Session identity","type.weekly_summary":"Weekly summary","type.weekly-summary":"Weekly summary","type.note":"Note","type.plan":"Plan","type.knowledge":"Knowledge","type.workflow_checkpoint":"Workflow milestone","type.concept":"Concept","type.tool":"Tool","type.person":"Person","relation.relates_to":"relates to","relation.related-to":"related to","relation.depends_on":"depends on","relation.implements":"implements","relation.learned_from":"learned from","relation.supersedes":"supersedes","relation.contradicts":"contradicts","relation.follows":"follows","relation.belongs-to-project":"belongs to project","relation.co-created":"co-created","relation.shares-name-tokens":"shares name tokens","patterns.day.0":"Sunday","patterns.day.1":"Monday","patterns.day.2":"Tuesday","patterns.day.3":"Wednesday","patterns.day.4":"Thursday","patterns.day.5":"Friday","patterns.day.6":"Saturday","telemetry.flow.dreamer":"Weekly recap (dreamer)","telemetry.flow.pattern_detector":"Pattern detector","telemetry.flow.digest_validator":"Digest validator","telemetry.flow.auto_tagger":"Auto-tagger","telemetry.flow.failure_analyzer":"Failure analyzer","telemetry.flow.transcript_extractor":"Transcript miner","telemetry.flow.conflict_judge":"Conflict judge","telemetry.errorClass.auth":"auth rejected","telemetry.errorClass.rate_limit":"rate limited","telemetry.errorClass.upstream":"provider outage","telemetry.errorClass.bad_request":"bad request","telemetry.errorClass.network":"network","telemetry.errorClass.parse":"unreadable reply","telemetry.errorClass.unknown":"unknown","lessons.severity.critical":"Critical","lessons.severity.major":"Major","lessons.severity.minor":"Minor","memory.tooltip.project":"Project","memory.tooltip.recalled":"Recalled {count} times","memory.tooltip.hasRelations":"Linked to {count} other memories","memory.tooltip.createdAt":"Created {date}","graph.drift":"Drift","graph.driftHint":"Colour nodes by age: red = stale, green = recently used","common.unknown":"unknown","insights.entitiesCount":"{n} entities","roadmap.viewToggle":"Roadmap view","roadmap.viewTree":"Tree","roadmap.viewMindmap":"Mindmap","roadmap.mindmapNeedsPhases":"The mindmap needs at least 3 memories within a 7-day window.","roadmap.activePhase":"active","roadmap.entryCount":"{count} entry","roadmap.entriesCount":"{count} entries","roadmap.otherGroup":"Other ({count})","roadmap.lowSignalHidden":"({count} low-signal hidden)","roadmap.resetHint":"Reset zoom and pan (double-clicking the background also resets)","roadmap.zoomHint":"scroll to zoom · drag to pan · {pct}%","roadmap.moreEntities":"+{count} more","nav.ariaLabel":"Dashboard sections","feedback.descLabel":"Feedback description","graph.canvasA11y":"Knowledge graph, drawn on a canvas: {entities} entities, {relations} relations, {orphans} unconnected. Use the type filters and search above for a non-visual view."},"zh-TW":{"auth.title":"需要驗證","auth.intro":"此儀表板受 bearer token 保護。請在下方貼上 MEMESH_REMOTE_TOKEN 的值(或 <memeshDir>/remote-token 檔案的內容)。","auth.tokenLabel":"Token","auth.empty":"Token 不能為空。","auth.invalid":"這個權杖沒有被接受,請檢查後再試一次。","auth.submit":"解鎖儀表板","auth.tokenPlaceholder":"在這裡貼上 token","brand.subtitle":"powered by pcircle.com","header.connected":"已連線","header.disconnected":"已斷線","header.connecting":"連線中…","header.memories":"筆記憶","tab.insights":"洞察","telemetry.title":"LLM 活動","telemetry.lastNDays":"近 {n} 天","telemetry.loading":"載入中…","telemetry.empty":"這段期間還沒有 AI 活動。當背景 AI 功能(例如每週摘要、自動標記)執行後,這裡會自動出現紀錄。","telemetry.callsCount":"{n} 次呼叫","telemetry.attemptsCount":"{n} 次嘗試","telemetry.successRate":"成功率","telemetry.medianLatency":"延遲中位數","telemetry.fallbackUsed":"啟用備援 {n} 次(佔呼叫的 {pct})","telemetry.byProvider":"依供應商","telemetry.byModel":"依模型","telemetry.byProject":"依專案","telemetry.errors":"錯誤","tab.search":"搜尋","insights.title":"memesh 為你做了什麼","insights.subtitle":"自動產生的週報整理與發現的模式,等你審閱","insights.statPending":"待審","insights.statApplied":"已採用","insights.statRejected":"已拒絕","insights.filter.pending":"待審","insights.filter.applied":"已採用","insights.filter.rejected":"已拒絕","insights.filter.all":"全部","insights.refresh":"重新整理","insights.loading":"讀取中…","insights.emptyPending":"目前沒有待審 insight。可執行 `memesh dream run` 產生週報整理。","insights.emptyNoLlm":"到設定頁設定 LLM 服務,就能開啟每週整理和模式偵測。","insights.emptyOther":"沒有資料。","insights.sources":"來源","insights.status.pending":"待審","insights.status.applied":"已採用","insights.status.rejected":"已拒絕","insights.viewDetail":"查看詳情","insights.collapse":"收合","insights.accept":"採用","insights.applying":"套用中…","insights.reject":"拒絕","insights.generatedBy":"產生模型","insights.promptVersion":"Prompt 版本","insights.observations":"摘要觀察","insights.tags":"標籤","insights.sourceIds":"來源實體","insights.validationWarnings":"可疑陳述(LLM 驗證器)","insights.validationClaim":"陳述","insights.validationReason":"原因","insights.runDream":"執行週報","insights.runDreamWithValidate":"執行(含驗證器,較慢但品質更高)","banner.pendingInsights":"有 {n} 則新洞察等你審閱 →","banner.dismiss":"關閉","banner.viewAll":"查看全部","pattern.title":"模式","pattern.evidenceCount":"{n} 個證據","pattern.severity":"嚴重度","pattern.severity.high":"高","pattern.severity.medium":"中","pattern.severity.low":"低","pattern.description":"模式說明","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":"可依名稱、內容或標籤搜尋。同時比對完全相符的字詞與意思相近的內容。","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":"筆已封存的記憶","browse.archiveFailed":"封存失敗:{message}","browse.restoreFailed":"還原失敗:{message}","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.entityMeta":"{type} · 信心度 {confidence}% · 已閒置 {days} 天","settings.capabilities":"功能狀態","settings.smartMode":"智慧模式","settings.core":"基礎","settings.embeddings":"嵌入模型","settings.llmProvider":"LLM 提供者","settings.llmOptional.title":"LLM 是選用的","settings.llmOptional.body":"memesh 不需要 LLM 也能運作。預設的核心模式已涵蓋全文回憶、手動 remember/recall、儀表板,以及透過 hook 自動捕捉 session。","settings.llmOptional.coreLabel":"沒有 LLM(核心模式)","settings.llmOptional.coreFeatures":"FTS5 關鍵字搜尋、手動 remember/recall、儀表板、hook 自動捕捉 session","settings.llmOptional.smartLabel":"有 LLM(智慧模式)","settings.llmOptional.smartFeatures":"自動從 session 失敗萃取 lesson_learned、新 entity 自動標籤、週報整理 + 模式發現","settings.apiKey":"API 金鑰","settings.fallbacks.title":"備援供應商","settings.fallbacks.explainer":"當主要供應商無法使用時,memesh 會依序嘗試這些供應商,直到其中一個成功。","settings.fallbacks.privacyTitle":"隱私提醒","settings.fallbacks.privacyBody":"加入雲端供應商(OpenAI 或 Anthropic)代表:當主要供應商無法使用時,你的記憶內容(可能是私密的)會被送到該雲端供應商。如果你為了隱私而使用本機供應商,請在接受這個取捨後再加入雲端備援。","settings.fallbacks.empty":"尚未設定備援供應商。","settings.fallbacks.add":"新增備援供應商","settings.fallbacks.providerLabel":"供應商","settings.fallbacks.modelLabel":"模型(選填)","settings.fallbacks.modelPlaceholder":"例如 gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"已儲存金鑰。留空即可保留。","settings.fallbacks.remove":"移除","settings.fallbacks.moveUp":"上移","settings.fallbacks.moveDown":"下移","settings.fallbacks.priority":"優先順序 {n}","settings.fallbacks.save":"儲存備援順序","settings.fallbacks.needsKey":"請輸入 API 金鑰,否則此雲端備援無法使用。","settings.model":"模型(選填)","settings.save":"儲存","settings.saving":"儲存中…","settings.saved":"已儲存","settings.removeProvider":"移除 LLM 設定","settings.removeProviderHint":"移除 apiKey 和 model 設定。將回退到環境變數自動偵測或 Core Mode(無 LLM)。","settings.removeProviderConfirm":"確定要移除已配置的 LLM provider?這會清除已儲存的 API key 和 model 設定。memesh 將回退到環境變數自動偵測(ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST)或在沒有任何憑證時以 Core Mode 運作。","settings.providerRemoved":"已移除 provider。memesh 現以 Core Mode 或環境變數自動偵測運作。","settings.test":"測試連線","settings.testing":"測試中…","settings.testPassed":"✓ 連線成功 · 找到 {count} 個可用模型","settings.testFailed":"連線測試失敗","settings.suggested":"推薦","settings.testRequired":"請先測試連線後再儲存","settings.language":"語言","settings.searchMode":"搜尋模式","settings.none":"無","settings.updates":"更新","settings.updateChecking":"正在檢查更新…","settings.updateUnavailable":"目前無法檢查更新","settings.updateNoSuccessfulChecks":"目前還沒有成功的更新檢查紀錄","settings.upToDate":"已是最新版本","settings.updateAvailable":"有可用更新","settings.updateStale":"目前顯示的是可能過期的快取狀態","settings.updateCachedFallback":"目前使用上次成功的快取結果","settings.updateDeprecatedNoTarget":"已停用 — 暫無可升級目標","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} 已被維護者標示為停用 (DEPRECATED)。","settings.updatePartialTitle":"⚠️ 更新檢查未完整","settings.updatePartialDescription":"{message}。本次無法確認停用狀態 — 待網路恢復後請重新檢查。","settings.updatePartialSummary":"部分檢查 — 停用狀態未確認","settings.updateDeprecatedTargetUnknown":"已停用 — 升級目標查詢中","settings.currentVersion":"目前版本","settings.latestVersion":"最新版本","settings.lastChecked":"上次檢查","settings.lastAttempted":"上次嘗試檢查","settings.lastSuccessful":"上次成功檢查","settings.updateSourceFresh":"即時檢查","settings.updateSourceCached":"使用快取結果","settings.updateSourceStale":"使用過期快取結果","settings.updateSourceUnavailable":"沒有可用快取","settings.updateCommand":"更新指令","settings.checkNow":"立即檢查","settings.updateLastError":"上次檢查錯誤:{message}","settings.installMethod":"安裝方式","settings.installNpmGlobal":"npm 全域安裝","settings.installNpmLocal":"專案內套件安裝","settings.installSourceCheckout":"原始碼工作目錄","settings.installUnknown":"未知","settings.updateGuidanceNpmGlobal":"這個安裝可直接透過 MeMesh 更新。","settings.updateGuidanceNpmLocal":"請用安裝此套件的專案套件管理工具來更新。","settings.updateGuidanceSourceCheckout":"請從原始碼儲存庫更新這份工作目錄並重新建置。","settings.updateGuidanceUnknown":"請使用安裝 MeMesh 時的工具或工作流程來更新這個安裝。","graph.entities":"實體","graph.relations":"關聯","graph.orphans":"孤立節點","graph.search":"搜尋節點…","graph.matches":"個符合","graph.focusMode":"聚焦","graph.showAll":"顯示全部","graph.clickHint":"點擊節點以聚焦","graph.interactHint":"點擊節點聚焦 · 拖曳空白處平移 · 滾輪縮放","graph.resetView":"重設視圖","graph.resetViewHint":"重設縮放與位置","graph.ageToday":"今天","graph.ageDaysAgo":"{count} 天前","graph.ageWeeksAgo":"{count} 週前","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","feedback.submitting":"收集診斷資訊中…","doctorBanner.warnTitleSoft":"memesh 有幾條設定提醒","doctorBanner.failTitle":"memesh 設定不完整","doctorBanner.dismiss":"關閉","doctorBanner.getHelp":"取得協助","doctorBanner.helpHint":"會開啟一個已填好診斷資訊的 GitHub issue","doctorBanner.preambleForIssue":"memesh doctor 在我的安裝上回報以下狀況:","doctorBanner.moreCount":"…還有 {n} 條——執行 `memesh doctor` 看完整清單","doctor.label.readme_locale_parity":"README 翻譯同步","doctor.label.config":"設定檔","doctor.label.mcp-config":"MCP 連線設定檔","doctor.label.hooks-config":"Hook 定義檔","doctor.label.hook-scripts":"Hook 腳本","doctor.label.hook-wiring":"與 Claude Code 的連接","doctor.label.hook-activity":"自動記錄","doctor.label.node-runtime":"Node.js 版本","doctor.label.native-binding":"SQLite 與向量搜尋","doctor.label.shell-cli":"終端機指令","doctor.label.dashboard":"儀表板檔案","doctor.label.update-status":"版本更新","doctor.label.http-probe":"本機伺服器","doctor.label.skills-manifest":"內附檔案","doctor.label.config_parse":"設定檔","doctor.label.embeddings_probe":"語意搜尋","doctor.label.llm_probe":"AI 服務","doctor.label.install-channel":"安裝方式","doctor.label.fts_segmentation":"關鍵字索引","doctor.label.vector_index":"搜尋索引","doctor.label.database":"資料庫","doctor.msg.readme-parity.unreadable.summary":"讀不到 README.md:{detail}","doctor.msg.readme-parity.drift.summary":"部分翻譯版 README 跟英文版結構不同步:{detail}","doctor.msg.readme-parity.drift.fix":"把列出的 README 跟 README.md 重新對齊。","doctor.msg.config.invalid-json.summary":"{path} 的設定檔不是有效的 JSON,目前整份被忽略。","doctor.msg.config.invalid-json.fix":"修好或刪掉 {path},再執行 `memesh config list` 確認能載入。","doctor.msg.mcp-config.missing.summary":"把 memesh 接上 Claude Code 的檔案(.mcp.json)不見了。","doctor.msg.mcp-config.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.mcp-config.invalid-json.summary":".mcp.json 壞掉了(不是有效的 JSON),Claude Code 讀不到它。","doctor.msg.mcp-config.invalid-json.fix":"修好 {path},或重新安裝 MeMesh。","doctor.msg.mcp-config.no-entry.summary":".mcp.json 裡的 memesh 伺服器設定不見了。","doctor.msg.mcp-config.no-entry.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` 要啟動的檔案不在這份安裝裡,所以 Claude Code 裡的每個 memesh 工具都起不來。","doctor.msg.mcp-config.entry-missing.fix":"重新安裝 MeMesh。如果你手動改過 `.mcp.json`,把它指回 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json 不見了,自動記憶功能跑不起來。","doctor.msg.hooks-config.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json 壞掉了(不是有效的 JSON)。","doctor.msg.hooks-config.invalid-json.fix":"修好 {path},或重新安裝 MeMesh。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json 少了這些 hook 類型:{types}。部分自動記錄不會執行。","doctor.msg.hooks-config.missing-types.fix":"還原出廠的 hook 設定,或重新安裝 MeMesh。","doctor.msg.hook-scripts.none.summary":"Hook 設定裡沒有任何腳本,什麼都不會被自動記錄。","doctor.msg.hook-scripts.none.fix":"重新安裝 MeMesh。","doctor.msg.hook-scripts.missing.summary":"這些 hook 腳本不見了:{files}","doctor.msg.hook-scripts.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.hook-scripts.not-executable.summary":"這些 hook 腳本存在但沒有執行權限:{files}","doctor.msg.hook-scripts.not-executable.fix":"執行 `chmod +x scripts/hooks/*.js`;原始碼安裝則跑 `npm run build`。","doctor.msg.hook-wiring.no-marker.summary":"memesh 還沒接上 Claude Code,所以不會自動記住任何東西。","doctor.msg.hook-wiring.no-marker.fix":"執行一次 `memesh install-hooks` 完成連接,再用 `memesh doctor` 確認。","doctor.msg.hook-wiring.script-missing.summary":"已接線的 memesh hook 指向 {path},但這個檔案已不存在——agent 每次觸發對應事件都會呼叫一個不存在的檔案。通常是升級移除某個 hook 後留下的殘留。","doctor.msg.hook-wiring.script-missing.fix":"執行 `memesh install-hooks` 重新接線(它會移除已退役的項目),然後重啟你的 agent。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} 的連接紀錄讀不到。","doctor.msg.hook-wiring.marker-unreadable.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.marker-malformed.summary":"連接紀錄壞掉了。","doctor.msg.hook-wiring.marker-malformed.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 的設定檔({path})不見了,連接已中斷。","doctor.msg.hook-wiring.settings-missing.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} 壞掉了(不是有效的 JSON)。","doctor.msg.hook-wiring.settings-invalid.fix":"從備份還原,或用 `memesh install-hooks` 重建。","doctor.msg.hook-wiring.entries-removed.summary":"{path} 裡的 memesh 設定被移除了,連接已中斷。","doctor.msg.hook-wiring.entries-removed.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.root-moved.summary":"連接指向的 {path} 已經不存在(memesh 可能被搬走了)。","doctor.msg.hook-wiring.root-moved.fix":"執行 `memesh install-hooks` 更新路徑。","doctor.msg.hook-activity.never-ran.summary":"從開始追蹤到現在 {hours} 小時,沒有任何擷取 hook 跑過——而 hook 接線是好的,代表它們該跑卻沒跑,沒有任何東西被記下來。","doctor.msg.hook-activity.never-ran.fix":"完整用一次工作階段,再跑 `memesh doctor`。如果還是說沒有 hook 跑過,執行 `memesh install-hooks` 然後重啟 agent。","doctor.msg.hook-activity.stale.summary":"最後一次擷取 hook 是大約 {hours} 小時前跑的({hook})。如果你這段時間有在工作,代表擷取已經停了,那些工作階段的內容都沒被存下來。","doctor.msg.hook-activity.stale.fix":"重啟 agent,結束一次工作階段,再跑 `memesh doctor`。如果沒恢復,執行 `memesh install-hooks`。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary hook 上次執行大約在 {hours} 小時前,而且過去 3 天也沒有任何 Claude Code 的寫入。如果這台機器已改用其他 agent(Codex / Gemini),這是正常的;如果你在這裡仍使用 Claude Code,擷取已經停了。","doctor.msg.hook-activity.stale-unconfirmed.fix":"如果這台機器仍在使用 Claude Code:重啟它、結束一個 session,再執行一次 `memesh doctor`。若仍未恢復,執行 `memesh install-hooks`。","doctor.msg.hook-activity.query-failed.summary":"讀不到 hook 活動紀錄:{detail}。擷取狀態現在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.query-failed.fix":"用 `memesh doctor --verbose` 看完整錯誤,並確認 ~/.memesh 讀得到、磁碟沒滿。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} hook 的最後執行時間讀不出來(資料壞了,或是被時鐘不準的機器蓋的章)。擷取狀態現在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.stale-unknown.fix":"結束一次工作階段後再跑 `memesh doctor`——新的一次執行會把壞掉的時間蓋掉。","doctor.msg.hook-activity.disabled.summary":"自動擷取已關閉(MEMESH_AUTO_CAPTURE 或設定檔的 autoCapture)——這是刻意設定,hook 沒動靜是預期中的。想恢復擷取就把它打開。","doctor.msg.hook-activity.disabled-env.summary":"自動擷取被這個 shell 環境中的 MEMESH_AUTO_CAPTURE=false 關閉了。doctor 只能看到自己所在的環境——如果你的 agent 執行時沒有這個變數,那邊的擷取不受影響。","doctor.msg.hook-activity.not-wired.summary":"從來沒有任何擷取 hook 執行過——而且這台機器上沒有確認接好任何擷取 hook(Stop / PostToolUse / PreCompact),所以本來就沒有東西可以執行。","doctor.msg.hook-activity.not-wired.fix":"想要自動擷取就執行 `memesh install-hooks`。如果這個安裝只走 MCP(Codex / Gemini),這是正常狀態,可以放心忽略。","doctor.msg.hook-activity.stop-silent.summary":"{hook} hook 有在蓋章,但從開始追蹤到現在 {hours} 小時,session-summary hook 一次都沒跑過——session 擷取可能壞了,只是被 commit 擷取蓋住看不見。","doctor.msg.hook-activity.stop-silent.fix":"完整結束一次工作階段再跑 `memesh doctor`。如果 session-summary 還是沒跑過,執行 `memesh install-hooks` 然後重啟 agent。","doctor.msg.hook-activity.never-ran-legacy.summary":"沒有任何 hook 蓋過心跳章,但追蹤開始以來已存入 {captured} 筆自動擷取的記憶——很可能是心跳追蹤之前版本的 hook 還在執行。","doctor.msg.hook-activity.never-ran-legacy.fix":"把 memesh hooks 更新到目前版本(plugin 安裝:`/plugin update memesh`;npm 安裝:`memesh install-hooks`),然後重啟 agent。","doctor.msg.node-runtime.too-old.summary":"你的 Node.js 版本比這個套件支援的還舊。{detail}","doctor.msg.node-runtime.too-old.fix":"把 Node.js 升級到 {required} 以上,再執行 `memesh doctor`。","doctor.msg.native-binding.node-too-old.summary":"這個版本的 Node 內建的 SQLite 對 memesh 來說太舊,載不動「用意思搜尋」那一塊。完整版本是 Node 22.13 才有的。","doctor.msg.native-binding.node-too-old.fix":"把 Node 升到 22.13 以上,再執行一次 `memesh doctor`。","doctor.msg.native-binding.not-installed.summary":"sqlite-vec 沒有安裝。記憶還是會存、也還找得到,只是不能用「意思相近」來搜尋。","doctor.msg.native-binding.not-installed.fix":"在使用 @pcircle/memesh 的資料夾執行 `npm install`。","doctor.msg.native-binding.load-failed.summary":"sqlite-vec 載入失敗:{detail}。搜尋只能用關鍵字。","doctor.msg.native-binding.load-failed.fix":'執行:cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"終端機裡打 `memesh` 找不到指令。Claude Code 的功能不受影響——只影響你自己在終端機操作。","doctor.msg.shell-cli.not-on-path.fix":"執行 `npm install -g @pcircle/memesh` 補上。兩種安裝共用同一份記憶。","doctor.msg.dashboard.missing.summary":"儀表板的檔案不見了。","doctor.msg.dashboard.missing.fix":"用 `cd dashboard && npm install && npm run build` 重建。","doctor.msg.update-status.no-cache.summary":"memesh 還沒成功查過有沒有新版本,所以無法告訴你要不要更新。","doctor.msg.update-status.no-cache.fix":"連網時執行一次 `memesh status`,查到結果後這則提醒就會消失。","doctor.msg.update-status.deprecated.summary":"你裝的 {version} 已被官方下架:{detail}","doctor.msg.update-status.deprecated.fix":"請立刻更新——執行 `memesh update`(或依你的安裝方式升級)。","doctor.msg.update-status.deprecation-unknown.summary":"無法確認 {version} 這個版本是否仍然安全:{detail}","doctor.msg.update-status.deprecation-unknown.fix":"連網時執行 `memesh status` 重試。","doctor.msg.update-status.update-available.summary":"有新版本:{latest}(目前是 {current})。","doctor.msg.update-status.update-available.fix":"執行 `memesh update` 升級。","doctor.msg.update-status.stale.summary":"{version} 已是最新,但更新資訊有點舊了。","doctor.msg.update-status.stale.fix":"連網時執行 `memesh status` 更新一下。","doctor.msg.http-probe.bad-status.summary":"{url} 的本機伺服器回了錯誤(HTTP {status})。","doctor.msg.http-probe.bad-status.fix":"用 `memesh serve` 重啟並查看記錄。","doctor.msg.http-probe.no-server.summary":"{url} 沒有本機伺服器在跑。","doctor.msg.http-probe.no-server.fix":"想用儀表板的話,用 `memesh serve` 啟動一個。","doctor.msg.skills-manifest.missing-dev.summary":"找不到檔案完整性清單(從原始碼執行時屬正常)。","doctor.msg.skills-manifest.missing-dev.fix":"執行 `npm run build` 產生。","doctor.msg.skills-manifest.unreadable.summary":"檔案完整性清單讀不到({detail})。","doctor.msg.skills-manifest.unreadable.fix":"重新安裝:`npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.empty.summary":"檔案完整性清單是空的。","doctor.msg.skills-manifest.empty.fix":"重新安裝:`npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.verify-failed.summary":"部分內附檔案跟出廠內容不一致:{detail}","doctor.msg.skills-manifest.verify-failed.fix":"重新安裝:`npm install -g @pcircle/memesh`。全新安裝仍出現的話,請當成安全問題回報。","doctor.msg.config-parse.not-object.summary":"{path} 的設定檔格式不對,所有設定目前都被忽略。","doctor.msg.config-parse.not-object.fix":"修好或刪掉 {path},再執行 `memesh doctor`。","doctor.msg.config-parse.unreadable.summary":"{path} 的設定檔讀不到({detail}),所有設定目前都被忽略。","doctor.msg.config-parse.unreadable.fix":"修好檔案,或先移開:mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":"語意搜尋設定為「{provider}」,但測試時沒有產生任何結果。關鍵字搜尋不受影響。","doctor.msg.embeddings.empty.fix":"執行 `memesh doctor --probe` 看細節,或檢查該服務的連線。","doctor.msg.embeddings.threw.summary":"語意搜尋設定為「{provider}」,但測試失敗:{detail}。關鍵字搜尋不受影響。","doctor.msg.embeddings.threw.fix":"確認 embedding 服務可連線(例如執行 `ollama serve`),或移除 embedder 設定以改用純關鍵字搜尋。","doctor.msg.llm.unreachable.summary":"AI 服務({provider})沒有回應:{detail}。AI 相關功能目前默默停擺。","doctor.msg.llm.unreachable.fix":"檢查 API key 和連線,再執行 `memesh doctor --probe`。","doctor.msg.llm.threw.summary":"測試 AI 服務({provider})失敗:{detail}。AI 相關功能目前默默停擺。","doctor.msg.llm.threw.fix":"檢查 API key 和連線,再執行 `memesh doctor --probe`。","doctor.msg.install-channel.unknown.summary":"看不出 memesh 是怎麼安裝的。","doctor.msg.install-channel.unknown.fix":"原始碼安裝請在 repo 根目錄執行;套件安裝請用 `npm install -g @pcircle/memesh` 重裝。","doctor.msg.fts.unsegmented.summary":"關鍵字索引有 {count} 筆是舊格式——部分記憶只有完整原文才搜得到。","doctor.msg.fts.unsegmented.fix":"執行 `memesh reindex --fts` 重建索引。","doctor.msg.vector-index.stale.summary":"搜尋索引需要重建(搜尋設定變更過)。","doctor.msg.vector-index.stale.fix":"執行 `memesh reindex` 重建。","doctor.msg.database.broken.summary":"資料庫無法使用:{detail}","doctor.update_status.prerelease":"正在使用預發布版本({current}),npm 最新版為 {latest}","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":"尚無召回數據。下次會話後開始追蹤有效性。","recall.summary":"已使用 {used} / 已注入 {total}","analytics.loadFailed":"載入分析資料失敗。","memory.noContent":"(無內容)","memory.archivedBadge":"已封存","memory.factsCount":"{count} 筆事實","common.error":"錯誤","common.serverUnreachable":"連不上 memesh 伺服器。","common.serverUnreachableAction":"請確認 `memesh serve` 還在執行,然後重新整理這個頁面。","common.responseUnreadable":"伺服器有回應,但這個頁面看不懂它的內容——儀表板和伺服器的版本可能不同步。","common.responseUnreadableAction":"請重新整理頁面;若持續發生,執行 `memesh doctor`。","pm.title":"PM 指標","pm.decisionsPerWeek":"決策/週","pm.openDecisions":"未結決策(>14 天)","pm.orphanRate":"未連結的記憶","pm.relationsTotal":"關聯總數","pm.stalePlans":"{count} 個計畫超過 30 天未回顧","common.loading":"載入中…","common.noData":"沒有資料","errors.unknown":"發生未知錯誤","insights.noPreview":"這筆提案沒有摘要內容","httpError.auth.missing-bearer":"這台伺服器需要存取權杖,請輸入權杖後繼續。","httpError.auth.invalid-token":"存取權杖不正確,請檢查後再試一次。","httpError.auth.not-configured":"伺服器尚未設定存取權杖。請重新啟動 `memesh serve` 並查看它的輸出。","httpError.validation.bad-body":"頁面送出的請求伺服器讀不懂。請重新整理頁面後再試。","httpError.validation.bad-param":"請求中有欄位不正確。請重新整理頁面後再試。","httpError.route.retired":"伺服器已不支援這個動作——頁面和伺服器版本可能不一致。請重新整理頁面。","httpError.route.not-found":"伺服器不認得這個請求——頁面和伺服器版本可能不一致。請重新整理頁面。","httpError.resource.not-found":"這個項目已不存在,請重新整理清單。","httpError.payload.too-large":"送出的資料太大(超過 1 MB),請分成較小的批次。","httpError.operation.failed":"伺服器無法完成這個動作。","httpError.llm.not-configured":"尚未設定 AI 供應商,請先到「設定」新增。","httpError.rate.limited":"短時間內送出太多請求。請稍候片刻再試一次。","httpError.server.internal":"伺服器發生預期外的錯誤。","settings.testError.auth":"API 金鑰被拒絕,請檢查金鑰後再試一次。","settings.testError.network":"連不上供應商,請檢查網路連線。","settings.testError.no_models":"供應商有回應,但沒有回傳可用的模型。","settings.testError.bad_host":"Ollama 位址必須在這台機器上(localhost)。","settings.testError.http":"供應商回傳錯誤(HTTP {status})。","settings.testError.unknown":"測試失敗,原因不明。","time.justNow":"剛剛","time.hoursAgo":"{count} 小時前","time.today":"今天","time.yesterday":"昨天","time.daysAgo":"{count} 天前","time.lastWeek":"上週","time.weeksAgo":"{count} 週前","time.lastMonth":"上個月","time.monthsAgo":"{count} 個月前","memory.access.frequent":"常用 · {count} 次","memory.access.recalls":"{count} 次回憶","memory.access.never":"從未回憶","cluster.knowledge":"知識","cluster.activity":"活動","cluster.session":"工作記錄","cluster.reference":"參考","cluster.all":"全部","browse.filterCategory":"類別","browse.filterTime":"時間","browse.filterValue":"價值","browse.filterProject":"專案","browse.filterSort":"排序","browse.timeToday":"今天","browse.timeWeek":"本週","browse.timeMonth":"本月","browse.timeOlder":"更早","browse.valueRecalled":"✓ 用過","browse.valueNever":"從未回憶","browse.sortMostRecalled":"最常回憶","browse.sortRecent":"最近使用","browse.sortCreated":"建立時間","browse.emptyFilter":"此分類沒有記憶 — 試試切換類別或時間","lessons.tabFailure":"失敗教訓","lessons.tabPlan":"計畫紀錄","lessons.tabFreeform":"筆記","lessons.totalRecalls":"總回憶次數","lessons.stepsLabel":"步驟","lessons.commitsCount":"{count} 個 commit","lessons.unstructured":"(此教訓沒有結構化欄位,請查看原始記憶)","lessons.searchPlaceholder":"搜尋 error / root cause / fix / 名稱…","lessons.allProjects":"全部專案","lessons.showing":"顯示 {visible} / {total} 筆","lessons.noMatch":"無符合「{query}」的記憶","lessons.emptyCategory":"此類別沒有記憶","lessons.moreItems":"+{count} 條","roadmap.title":"專案路線圖","roadmap.summary":"{count} 筆記憶 · {first} → {last}","roadmap.switchToList":"↩ 清單檢視","roadmap.switchToRoadmap":"🗺️ 路線圖檢視","roadmap.emptyProject":"此專案尚無記憶。","loop.label":"記憶循環","loop.subtitleHas":"本週被回憶的知識類型記憶","loop.subtitleNone":"本週尚無知識被回憶 — 試試喚起一則教訓","loop.approxNote":"近似值 — 完整追蹤從升級後開始累積","loop.sparkLabel":"最近 30 天","roadmap.milestones":"里程碑","roadmap.keyLessons":"重要教訓","radar.title":"知識覆蓋雷達","radar.caption":"顯示有效知識記憶 (排除 session 和 commit)","radar.axis.lessons":"教訓","radar.axis.decisions":"決策","radar.axis.patterns":"模式","radar.axis.bugs":"問題修復","radar.axis.processes":"流程","radar.axis.architecture":"架構","ageMatrix.title":"記憶年齡分佈","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"顏色深度 = 記憶密度","ageMatrix.typeColumn":"類型","header.signalModeOn":"訊號","header.signalModeOff":"全部","header.signalModeOnHint":"已隱藏 session 與 commit 等雜訊。點擊顯示全部。","header.signalModeOffHint":"顯示包含 session 與 commit 在內的所有記憶。點擊隱藏雜訊。","roadmap.phases":"階段","onboarding.title":"歡迎使用 MeMesh","onboarding.body":"你的記憶庫還是空的。從 30 筆精選範例開始體驗,或直接存下你的第一則教訓。","onboarding.llmHint":"不需要 LLM。所有功能都靠 FTS5 運作。LLM 只用在自動產生教訓,可以之後再到設定頁開啟。","onboarding.seedButton":"一鍵載入示範資料","onboarding.seedingButton":"載入中…","onboarding.seedHint":"直接在這裡載入 30 筆,之後可一鍵清除,不用切到終端機","onboarding.cliReference":"習慣 CLI?","onboarding.hintDemo":"植入 30 筆示範記憶,之後可一鍵清除","onboarding.hintReset":"移除所有 metadata.demo 標記的記憶","onboarding.resetButton":"清除示範資料","onboarding.resettingButton":"清除中…","onboarding.resetConfirm":"確定要移除所有示範記憶?你自己存的內容會保留。","onboarding.dismiss":"關閉","common.serverError":"伺服器回報錯誤(HTTP {status})。請再試一次;若持續發生,請執行 `memesh doctor`。","emptyLibrary.title":"你的記憶庫是空的","emptyLibrary.body":"這裡還沒有任何記憶。載入 30 筆示範資料,馬上看到 MeMesh 的完整功能——之後可一鍵清除。","browse.truncated":"目前顯示前 {shown} 筆(共 {total} 筆)——用搜尋或篩選找到其餘的記憶","lessons.capNote":"只載入前 {limit} 筆教訓——上方統計只涵蓋這些","lessons.emptyGuide":"還沒有任何教訓。Smart Mode 會在分析工作階段失敗時自動記錄——也可以請你的 AI 助手幫你記一筆。","graph.cappedNote":"只顯示前 {shown} 個節點(共 {total} 個,依回想次數排序),讓圖表保持流暢。","settings.testStoredKeyHint":"欄位留空即測試已儲存的金鑰。","ageMatrix.bucket.week":"本週","ageMatrix.bucket.month":"本月","ageMatrix.bucket.quarter":"本季","ageMatrix.bucket.older":"更早","settings.behaviourTitle":"行為設定","settings.autoUpdateLabel":"自動更新策略","settings.autoUpdateOff":"關閉 — 僅手動","settings.autoUpdatePatch":"Patch — 自動套用 X.Y.Z+1","settings.autoUpdateMinor":"Minor — 自動套用 X.Y+1.0","settings.autoUpdateMajor":"Major — 自動套用任何版本升級","settings.autoUpdateHint":"每次 session 結束後觸發。MEMESH_AUTO_UPDATE 環境變數優先。","errors.timeout":"請求逾時","type.lesson_learned":"教訓","type.lesson":"教訓","type.mistake":"錯誤","type.decision":"決策","type.architecture_decision":"架構決策","type.design_decision":"設計決策","type.pattern":"模式","type.technical_pattern":"技術模式","type.best_practice":"最佳實踐","type.bug_fix":"問題修復","type.verification_result":"驗證結果","type.test_result":"測試結果","type.process":"流程","type.architecture":"架構","type.infrastructure":"基礎設施","type.feature":"功能","type.release":"版本發佈","type.refactoring":"重構","type.commit":"提交","type.session_keypoint":"工作階段重點","type.session_identity":"工作階段身分","type.session-insight":"工作階段洞察","type.session-summary":"工作階段摘要","type.session-identity":"工作階段身分","type.weekly_summary":"週摘要","type.weekly-summary":"週摘要","type.note":"筆記","type.plan":"計畫","type.knowledge":"知識","type.workflow_checkpoint":"流程里程碑","type.concept":"概念","type.tool":"工具","type.person":"人物","relation.relates_to":"相關","relation.related-to":"相關","relation.depends_on":"依賴","relation.implements":"實作","relation.learned_from":"學習自","relation.supersedes":"取代","relation.contradicts":"矛盾","relation.follows":"接續","relation.belongs-to-project":"屬於專案","relation.co-created":"共同建立","relation.shares-name-tokens":"名稱相似","patterns.day.0":"週日","patterns.day.1":"週一","patterns.day.2":"週二","patterns.day.3":"週三","patterns.day.4":"週四","patterns.day.5":"週五","patterns.day.6":"週六","telemetry.flow.dreamer":"週報整理(dreamer)","telemetry.flow.pattern_detector":"模式偵測","telemetry.flow.digest_validator":"摘要驗證","telemetry.flow.auto_tagger":"自動標籤","telemetry.flow.failure_analyzer":"失敗分析","telemetry.flow.transcript_extractor":"對話記錄挖掘","telemetry.flow.conflict_judge":"衝突判定","telemetry.errorClass.auth":"憑證被拒","telemetry.errorClass.rate_limit":"額度限制","telemetry.errorClass.upstream":"供應商故障","telemetry.errorClass.bad_request":"請求無效","telemetry.errorClass.network":"網路","telemetry.errorClass.parse":"回應無法解析","telemetry.errorClass.unknown":"未知","lessons.severity.critical":"嚴重","lessons.severity.major":"重大","lessons.severity.minor":"輕微","memory.tooltip.project":"專案","memory.tooltip.recalled":"已被回憶 {count} 次","memory.tooltip.hasRelations":"與 {count} 筆記憶相連","memory.tooltip.createdAt":"建立於 {date}","graph.drift":"時效","graph.driftHint":"依新舊上色:紅=久未使用,綠=最近使用","common.unknown":"未知","insights.entitiesCount":"{n} 筆實體","roadmap.viewToggle":"路線圖檢視","roadmap.viewTree":"樹狀","roadmap.viewMindmap":"心智圖","roadmap.mindmapNeedsPhases":"心智圖需要 7 天內至少 3 筆記憶。","roadmap.activePhase":"進行中","roadmap.entryCount":"{count} 筆","roadmap.entriesCount":"{count} 筆","roadmap.otherGroup":"其他({count})","roadmap.lowSignalHidden":"(已隱藏 {count} 筆低訊號)","roadmap.resetHint":"重設縮放與位置(雙擊背景也可重設)","roadmap.zoomHint":"滾輪縮放 · 拖曳平移 · {pct}%","roadmap.moreEntities":"還有 {count} 筆","nav.ariaLabel":"儀表板分頁","feedback.descLabel":"意見內容","graph.canvasA11y":"知識圖譜(畫布繪製):{entities} 個實體、{relations} 條關係、{orphans} 個未連結。上方的類型篩選與搜尋提供非視覺瀏覽方式。"},"zh-CN":{"auth.title":"需要验证","auth.intro":"此仪表板受 bearer token 保护。请在下方粘贴 MEMESH_REMOTE_TOKEN 的值(或 <memeshDir>/remote-token 文件的内容)。","auth.tokenLabel":"Token","auth.empty":"Token 不能为空。","auth.invalid":"这个令牌未被接受,请检查后重试。","auth.submit":"解锁仪表板","auth.tokenPlaceholder":"在这里粘贴 token","brand.subtitle":"powered by pcircle.com","header.connected":"已连接","header.disconnected":"已断开","header.connecting":"连接中…","header.memories":"条记忆","tab.insights":"洞察","telemetry.title":"LLM 活动","telemetry.lastNDays":"近 {n} 天","telemetry.loading":"加载中…","telemetry.empty":"这段时间还没有 AI 活动。当后台 AI 功能(例如每周摘要、自动标记)运行后,这里会自动出现记录。","telemetry.callsCount":"{n} 次调用","telemetry.attemptsCount":"{n} 次尝试","telemetry.successRate":"成功率","telemetry.medianLatency":"延迟中位数","telemetry.fallbackUsed":"启用备用 {n} 次(占调用的 {pct})","telemetry.byProvider":"按服务商","telemetry.byModel":"按模型","telemetry.byProject":"按项目","telemetry.errors":"错误","tab.search":"搜索","insights.title":"memesh 为你做了什么","insights.subtitle":"自动生成的周报整理与发现的模式,等你审阅","insights.statPending":"待审","insights.statApplied":"已采用","insights.statRejected":"已拒绝","insights.filter.pending":"待审","insights.filter.applied":"已采用","insights.filter.rejected":"已拒绝","insights.filter.all":"全部","insights.refresh":"刷新","insights.loading":"读取中…","insights.emptyPending":"目前没有待审 insight。可执行 `memesh dream run` 生成周报整理。","insights.emptyNoLlm":"到设置页配置 LLM 服务,即可开启每周整理和模式检测。","insights.emptyOther":"没有数据。","insights.sources":"来源","insights.status.pending":"待审","insights.status.applied":"已采用","insights.status.rejected":"已拒绝","insights.viewDetail":"查看详情","insights.collapse":"收起","insights.accept":"采用","insights.applying":"应用中…","insights.reject":"拒绝","insights.generatedBy":"生成模型","insights.promptVersion":"Prompt 版本","insights.observations":"摘要观察","insights.tags":"标签","insights.sourceIds":"来源实体","insights.validationWarnings":"可疑陈述(LLM 验证器)","insights.validationClaim":"陈述","insights.validationReason":"原因","insights.runDream":"执行周报","insights.runDreamWithValidate":"执行(含验证器,较慢但质量更高)","banner.pendingInsights":"有 {n} 则新洞察等你审阅 →","banner.dismiss":"关闭","banner.viewAll":"查看全部","pattern.title":"模式","pattern.evidenceCount":"{n} 个证据","pattern.severity":"严重度","pattern.severity.high":"高","pattern.severity.medium":"中","pattern.severity.low":"低","pattern.description":"模式说明","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":"可按名称、内容或标签搜索。同时匹配完全相符的词语与意思相近的内容。","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":"条已归档记忆","browse.archiveFailed":"归档失败:{message}","browse.restoreFailed":"恢复失败:{message}","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.entityMeta":"{type} · 置信度 {confidence}% · 已闲置 {days} 天","settings.capabilities":"功能状态","settings.smartMode":"智能模式","settings.core":"基础","settings.embeddings":"嵌入模型","settings.llmProvider":"LLM 提供商","settings.llmOptional.title":"LLM 是可选的","settings.llmOptional.body":"memesh 不需要 LLM 也能运作。默认的核心模式已涵盖全文回忆、手动 remember/recall、仪表板,以及通过 hook 自动捕捉 session。","settings.llmOptional.coreLabel":"没有 LLM(核心模式)","settings.llmOptional.coreFeatures":"FTS5 关键字搜索、手动 remember/recall、仪表板、hook 自动捕捉 session","settings.llmOptional.smartLabel":"有 LLM(智能模式)","settings.llmOptional.smartFeatures":"自动从 session 失败萃取 lesson_learned、新 entity 自动标签、周报整理 + 模式发现","settings.apiKey":"API 密钥","settings.fallbacks.title":"备用提供商","settings.fallbacks.explainer":"当主要提供商不可用时,memesh 会按顺序尝试这些提供商,直到有一个成功。","settings.fallbacks.privacyTitle":"隐私提示","settings.fallbacks.privacyBody":"添加云端提供商(OpenAI 或 Anthropic)意味着:当主要提供商不可用时,你的记忆内容(可能是私密的)会被发送到该云端提供商。如果你为了隐私使用本地提供商,请在接受这一权衡后再添加云端备用。","settings.fallbacks.empty":"尚未设置备用提供商。","settings.fallbacks.add":"添加备用提供商","settings.fallbacks.providerLabel":"提供商","settings.fallbacks.modelLabel":"模型(可选)","settings.fallbacks.modelPlaceholder":"例如 gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"已保存密钥。留空即可保留。","settings.fallbacks.remove":"移除","settings.fallbacks.moveUp":"上移","settings.fallbacks.moveDown":"下移","settings.fallbacks.priority":"优先级 {n}","settings.fallbacks.save":"保存备用顺序","settings.fallbacks.needsKey":"请输入 API 密钥,否则此云端备用无法使用。","settings.model":"模型(选填)","settings.save":"保存","settings.saving":"保存中…","settings.saved":"已保存","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"测试连接","settings.testing":"测试中…","settings.testPassed":"✓ 连接成功 · 找到 {count} 个可用模型","settings.testFailed":"连接测试失败","settings.suggested":"推荐","settings.testRequired":"请先测试连接后再保存","settings.language":"语言","settings.searchMode":"搜索模式","settings.none":"无","settings.updates":"更新","settings.updateChecking":"正在检查更新…","settings.updateUnavailable":"暂时无法检查更新","settings.updateNoSuccessfulChecks":"目前还没有成功的更新检查记录","settings.upToDate":"已是最新版本","settings.updateAvailable":"有可用更新","settings.updateStale":"当前显示的是可能过期的缓存状态","settings.updateCachedFallback":"当前使用上次成功的缓存结果","settings.updateDeprecatedNoTarget":"已停用 — 暂无可升级目标","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} 已被维护者标记为停用 (DEPRECATED)。","settings.updatePartialTitle":"⚠️ 更新检查未完整","settings.updatePartialDescription":"{message}。本次无法确认停用状态 — 待网络恢复后请重新检查。","settings.updatePartialSummary":"部分检查 — 停用状态未确认","settings.updateDeprecatedTargetUnknown":"已停用 — 升级目标查询中","settings.currentVersion":"当前版本","settings.latestVersion":"最新版本","settings.lastChecked":"上次检查","settings.lastAttempted":"上次尝试检查","settings.lastSuccessful":"上次成功检查","settings.updateSourceFresh":"实时检查","settings.updateSourceCached":"使用缓存结果","settings.updateSourceStale":"使用过期缓存结果","settings.updateSourceUnavailable":"没有可用缓存","settings.updateCommand":"更新命令","settings.checkNow":"立即检查","settings.updateLastError":"上次检查错误:{message}","settings.installMethod":"安装方式","settings.installNpmGlobal":"npm 全局安装","settings.installNpmLocal":"项目内包安装","settings.installSourceCheckout":"源码工作目录","settings.installUnknown":"未知","settings.updateGuidanceNpmGlobal":"这个安装可以直接通过 MeMesh 更新。","settings.updateGuidanceNpmLocal":"请使用安装此包的项目包管理器来更新。","settings.updateGuidanceSourceCheckout":"请从源码仓库更新这份工作目录并重新构建。","settings.updateGuidanceUnknown":"请使用安装 MeMesh 时所用的工具或流程来更新这个安装。","graph.entities":"实体","graph.relations":"关联","graph.orphans":"孤立节点","graph.search":"搜索节点…","graph.matches":"个匹配","graph.focusMode":"聚焦","graph.showAll":"显示全部","graph.clickHint":"点击节点以聚焦","graph.interactHint":"点击节点聚焦 · 拖动空白处平移 · 滚轮缩放","graph.resetView":"重置视图","graph.resetViewHint":"重置缩放与位置","graph.ageToday":"今天","graph.ageDaysAgo":"{count} 天前","graph.ageWeeksAgo":"{count} 周前","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","feedback.submitting":"收集诊断信息中…","doctorBanner.warnTitleSoft":"memesh 有几条设置提醒","doctorBanner.failTitle":"memesh 设置不完整","doctorBanner.dismiss":"关闭","doctorBanner.getHelp":"获取帮助","doctorBanner.helpHint":"会打开一个已填好诊断信息的 GitHub issue","doctorBanner.preambleForIssue":"memesh doctor 在我的安装上报告以下情况:","doctorBanner.moreCount":"…还有 {n} 条——运行 `memesh doctor` 看完整清单","doctor.label.readme_locale_parity":"README 翻译同步","doctor.label.config":"配置文件","doctor.label.mcp-config":"MCP 连接配置文件","doctor.label.hooks-config":"Hook 定义文件","doctor.label.hook-scripts":"Hook 脚本","doctor.label.hook-wiring":"与 Claude Code 的连接","doctor.label.hook-activity":"自动记录","doctor.label.node-runtime":"Node.js 版本","doctor.label.native-binding":"SQLite 与向量搜索","doctor.label.shell-cli":"终端命令","doctor.label.dashboard":"仪表板文件","doctor.label.update-status":"版本更新","doctor.label.http-probe":"本机服务器","doctor.label.skills-manifest":"内附文件","doctor.label.config_parse":"配置文件","doctor.label.embeddings_probe":"语义搜索","doctor.label.llm_probe":"AI 服务","doctor.label.install-channel":"安装方式","doctor.label.fts_segmentation":"关键字索引","doctor.label.vector_index":"搜索索引","doctor.label.database":"数据库","doctor.msg.readme-parity.unreadable.summary":"读不到 README.md:{detail}","doctor.msg.readme-parity.drift.summary":"部分翻译版 README 与英文版结构不同步:{detail}","doctor.msg.readme-parity.drift.fix":"把列出的 README 与 README.md 重新对齐。","doctor.msg.config.invalid-json.summary":"{path} 的配置文件不是有效的 JSON,目前整份被忽略。","doctor.msg.config.invalid-json.fix":"修好或删掉 {path},再运行 `memesh config list` 确认能加载。","doctor.msg.mcp-config.missing.summary":"把 memesh 接入 Claude Code 的文件(.mcp.json)不见了。","doctor.msg.mcp-config.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.mcp-config.invalid-json.summary":".mcp.json 已损坏(不是有效的 JSON),Claude Code 读不到它。","doctor.msg.mcp-config.invalid-json.fix":"修好 {path},或重新安装 MeMesh。","doctor.msg.mcp-config.no-entry.summary":".mcp.json 里的 memesh 服务器配置不见了。","doctor.msg.mcp-config.no-entry.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` 要启动的文件不在这份安装里,所以 Claude Code 里的每个 memesh 工具都起不来。","doctor.msg.mcp-config.entry-missing.fix":"重新安装 MeMesh。如果你手动改过 `.mcp.json`,把它指回 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json 不见了,自动记忆功能无法运行。","doctor.msg.hooks-config.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json 已损坏(不是有效的 JSON)。","doctor.msg.hooks-config.invalid-json.fix":"修好 {path},或重新安装 MeMesh。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json 少了这些 hook 类型:{types}。部分自动记录不会运行。","doctor.msg.hooks-config.missing-types.fix":"恢复出厂的 hook 配置,或重新安装 MeMesh。","doctor.msg.hook-scripts.none.summary":"Hook 配置里没有任何脚本,什么都不会被自动记录。","doctor.msg.hook-scripts.none.fix":"重新安装 MeMesh。","doctor.msg.hook-scripts.missing.summary":"这些 hook 脚本不见了:{files}","doctor.msg.hook-scripts.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.hook-scripts.not-executable.summary":"这些 hook 脚本存在但没有执行权限:{files}","doctor.msg.hook-scripts.not-executable.fix":"运行 `chmod +x scripts/hooks/*.js`;源码安装则跑 `npm run build`。","doctor.msg.hook-wiring.no-marker.summary":"memesh 还没接入 Claude Code,所以不会自动记住任何东西。","doctor.msg.hook-wiring.no-marker.fix":"运行一次 `memesh install-hooks` 完成连接,再用 `memesh doctor` 确认。","doctor.msg.hook-wiring.script-missing.summary":"已接线的 memesh hook 指向 {path},但这个文件已不存在——agent 每次触发对应事件都会调用一个不存在的文件。通常是升级移除某个 hook 后留下的残留。","doctor.msg.hook-wiring.script-missing.fix":"运行 `memesh install-hooks` 重新接线(它会移除已退役的条目),然后重启你的 agent。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} 的连接记录读不到。","doctor.msg.hook-wiring.marker-unreadable.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.marker-malformed.summary":"连接记录已损坏。","doctor.msg.hook-wiring.marker-malformed.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 的设置文件({path})不见了,连接已中断。","doctor.msg.hook-wiring.settings-missing.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} 已损坏(不是有效的 JSON)。","doctor.msg.hook-wiring.settings-invalid.fix":"从备份恢复,或用 `memesh install-hooks` 重建。","doctor.msg.hook-wiring.entries-removed.summary":"{path} 里的 memesh 配置被移除了,连接已中断。","doctor.msg.hook-wiring.entries-removed.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.root-moved.summary":"连接指向的 {path} 已不存在(memesh 可能被移动了)。","doctor.msg.hook-wiring.root-moved.fix":"运行 `memesh install-hooks` 更新路径。","doctor.msg.hook-activity.never-ran.summary":"从开始追踪到现在 {hours} 小时,没有任何抓取 hook 跑过——而 hook 接线是好的,代表它们该跑却没跑,没有任何东西被记下来。","doctor.msg.hook-activity.never-ran.fix":"完整用一次工作会话,再跑 `memesh doctor`。如果还是说没有 hook 跑过,执行 `memesh install-hooks` 然后重启 agent。","doctor.msg.hook-activity.stale.summary":"最后一次抓取 hook 是大约 {hours} 小时前跑的({hook})。如果你这段时间有在工作,代表抓取已经停了,那些会话的内容都没被存下来。","doctor.msg.hook-activity.stale.fix":"重启 agent,结束一次工作会话,再跑 `memesh doctor`。如果没恢复,执行 `memesh install-hooks`。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary hook 上次运行大约在 {hours} 小时前,而且过去 3 天也没有任何 Claude Code 的写入。如果这台机器已改用其他 agent(Codex / Gemini),这是正常的;如果你在这里仍使用 Claude Code,捕获已经停了。","doctor.msg.hook-activity.stale-unconfirmed.fix":"如果这台机器仍在使用 Claude Code:重启它、结束一个 session,再运行一次 `memesh doctor`。若仍未恢复,运行 `memesh install-hooks`。","doctor.msg.hook-activity.query-failed.summary":"读不到 hook 活动记录:{detail}。抓取状态现在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.query-failed.fix":"用 `memesh doctor --verbose` 看完整错误,并确认 ~/.memesh 读得到、磁盘没满。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} hook 的最后执行时间读不出来(数据坏了,或是被时钟不准的机器盖的章)。抓取状态现在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.stale-unknown.fix":"结束一次工作会话后再跑 `memesh doctor`——新的一次执行会把坏掉的时间盖掉。","doctor.msg.hook-activity.disabled.summary":"自动抓取已关闭(MEMESH_AUTO_CAPTURE 或配置文件的 autoCapture)——这是刻意设置,hook 没动静是预期中的。想恢复抓取就把它打开。","doctor.msg.hook-activity.disabled-env.summary":"自动捕获被这个 shell 环境中的 MEMESH_AUTO_CAPTURE=false 关闭了。doctor 只能看到自己所在的环境——如果你的 agent 运行时没有这个变量,那边的捕获不受影响。","doctor.msg.hook-activity.not-wired.summary":"从来没有任何捕获 hook 运行过——而且这台机器上没有确认接好任何捕获 hook(Stop / PostToolUse / PreCompact),所以本来就没有东西可以运行。","doctor.msg.hook-activity.not-wired.fix":"想要自动抓取就执行 `memesh install-hooks`。如果这个安装只走 MCP(Codex / Gemini),这是正常状态,可以放心忽略。","doctor.msg.hook-activity.stop-silent.summary":"{hook} hook 有在盖章,但从开始追踪到现在 {hours} 小时,session-summary hook 一次都没跑过——session 抓取可能坏了,只是被 commit 抓取盖住看不见。","doctor.msg.hook-activity.stop-silent.fix":"完整结束一次工作会话再跑 `memesh doctor`。如果 session-summary 还是没跑过,执行 `memesh install-hooks` 然后重启 agent。","doctor.msg.hook-activity.never-ran-legacy.summary":"没有任何 hook 盖过心跳章,但追踪开始以来已存入 {captured} 条自动捕获的记忆——很可能是心跳追踪之前版本的 hook 还在运行。","doctor.msg.hook-activity.never-ran-legacy.fix":"把 memesh hooks 更新到当前版本(plugin 安装:`/plugin update memesh`;npm 安装:`memesh install-hooks`),然后重启 agent。","doctor.msg.node-runtime.too-old.summary":"你的 Node.js 版本比这个包支持的还旧。{detail}","doctor.msg.node-runtime.too-old.fix":"把 Node.js 升级到 {required} 以上,再运行 `memesh doctor`。","doctor.msg.native-binding.node-too-old.summary":"这个版本的 Node 内置的 SQLite 对 memesh 来说太旧,加载不了「按意思搜索」那一块。完整版本是 Node 22.13 才有的。","doctor.msg.native-binding.node-too-old.fix":"把 Node 升到 22.13 以上,再运行一次 `memesh doctor`。","doctor.msg.native-binding.not-installed.summary":"sqlite-vec 没有安装。记忆还是会存、也还找得到,只是不能用「意思相近」来搜索。","doctor.msg.native-binding.not-installed.fix":"在使用 @pcircle/memesh 的文件夹运行 `npm install`。","doctor.msg.native-binding.load-failed.summary":"sqlite-vec 加载失败:{detail}。搜索只能用关键词。","doctor.msg.native-binding.load-failed.fix":'运行:cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"终端里打 `memesh` 找不到命令。Claude Code 的功能不受影响——只影响你自己在终端操作。","doctor.msg.shell-cli.not-on-path.fix":"运行 `npm install -g @pcircle/memesh` 补上。两种安装共用同一份记忆。","doctor.msg.dashboard.missing.summary":"仪表板的文件不见了。","doctor.msg.dashboard.missing.fix":"用 `cd dashboard && npm install && npm run build` 重建。","doctor.msg.update-status.no-cache.summary":"memesh 还没成功查过有没有新版本,所以无法告诉你要不要更新。","doctor.msg.update-status.no-cache.fix":"联网时运行一次 `memesh status`,查到结果后这条提醒就会消失。","doctor.msg.update-status.deprecated.summary":"你装的 {version} 已被官方下架:{detail}","doctor.msg.update-status.deprecated.fix":"请立即更新——运行 `memesh update`(或按你的安装方式升级)。","doctor.msg.update-status.deprecation-unknown.summary":"无法确认 {version} 这个版本是否仍然安全:{detail}","doctor.msg.update-status.deprecation-unknown.fix":"联网时运行 `memesh status` 重试。","doctor.msg.update-status.update-available.summary":"有新版本:{latest}(当前是 {current})。","doctor.msg.update-status.update-available.fix":"运行 `memesh update` 升级。","doctor.msg.update-status.stale.summary":"{version} 已是最新,但更新信息有点旧了。","doctor.msg.update-status.stale.fix":"联网时运行 `memesh status` 刷新一下。","doctor.msg.http-probe.bad-status.summary":"{url} 的本机服务器返回了错误(HTTP {status})。","doctor.msg.http-probe.bad-status.fix":"用 `memesh serve` 重启并查看日志。","doctor.msg.http-probe.no-server.summary":"{url} 没有本机服务器在运行。","doctor.msg.http-probe.no-server.fix":"想用仪表板的话,用 `memesh serve` 启动一个。","doctor.msg.skills-manifest.missing-dev.summary":"找不到文件完整性清单(从源码运行时属正常)。","doctor.msg.skills-manifest.missing-dev.fix":"运行 `npm run build` 生成。","doctor.msg.skills-manifest.unreadable.summary":"文件完整性清单读不到({detail})。","doctor.msg.skills-manifest.unreadable.fix":"重新安装:`npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.empty.summary":"文件完整性清单是空的。","doctor.msg.skills-manifest.empty.fix":"重新安装:`npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.verify-failed.summary":"部分内附文件与出厂内容不一致:{detail}","doctor.msg.skills-manifest.verify-failed.fix":"重新安装:`npm install -g @pcircle/memesh`。全新安装仍出现的话,请作为安全问题上报。","doctor.msg.config-parse.not-object.summary":"{path} 的配置文件格式不对,所有设置目前都被忽略。","doctor.msg.config-parse.not-object.fix":"修好或删掉 {path},再运行 `memesh doctor`。","doctor.msg.config-parse.unreadable.summary":"{path} 的配置文件读不到({detail}),所有设置目前都被忽略。","doctor.msg.config-parse.unreadable.fix":"修好文件,或先移开:mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":"语义搜索设置为「{provider}」,但测试时没有产生任何结果。关键字搜索不受影响。","doctor.msg.embeddings.empty.fix":"运行 `memesh doctor --probe` 看细节,或检查该服务的连接。","doctor.msg.embeddings.threw.summary":"语义搜索设置为「{provider}」,但测试失败:{detail}。关键字搜索不受影响。","doctor.msg.embeddings.threw.fix":"检查 embedding 服务是否可连接(例如运行 `ollama serve`),或移除 embedder 配置以改用纯关键词搜索。","doctor.msg.llm.unreachable.summary":"AI 服务({provider})没有响应:{detail}。AI 相关功能目前默默停摆。","doctor.msg.llm.unreachable.fix":"检查 API key 和连接,再运行 `memesh doctor --probe`。","doctor.msg.llm.threw.summary":"测试 AI 服务({provider})失败:{detail}。AI 相关功能目前默默停摆。","doctor.msg.llm.threw.fix":"检查 API key 和连接,再运行 `memesh doctor --probe`。","doctor.msg.install-channel.unknown.summary":"看不出 memesh 是怎么安装的。","doctor.msg.install-channel.unknown.fix":"源码安装请在 repo 根目录运行;包安装请用 `npm install -g @pcircle/memesh` 重装。","doctor.msg.fts.unsegmented.summary":"关键字索引有 {count} 条是旧格式——部分记忆只有完整原文才搜得到。","doctor.msg.fts.unsegmented.fix":"运行 `memesh reindex --fts` 重建索引。","doctor.msg.vector-index.stale.summary":"搜索索引需要重建(搜索设置变更过)。","doctor.msg.vector-index.stale.fix":"运行 `memesh reindex` 重建。","doctor.msg.database.broken.summary":"数据库无法使用:{detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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":"暂无召回数据。下次会话后开始追踪有效性。","recall.summary":"已使用 {used} / 已注入 {total}","analytics.loadFailed":"加载分析数据失败。","memory.noContent":"(无内容)","memory.archivedBadge":"已归档","memory.factsCount":"{count} 条事实","common.error":"错误","common.serverUnreachable":"无法连接 memesh 服务器。","common.serverUnreachableAction":"请确认 `memesh serve` 仍在运行,然后刷新此页面。","common.responseUnreadable":"服务器有响应,但此页面无法读取其内容——仪表板与服务器版本可能不同步。","common.responseUnreadableAction":"请刷新页面;若持续出现,运行 `memesh doctor`。","pm.title":"PM 指标","pm.decisionsPerWeek":"决策/周","pm.openDecisions":"未决决策(>14 天)","pm.orphanRate":"未连接的记忆","pm.relationsTotal":"关系总数","pm.stalePlans":"{count} 个计划超过 30 天未回顾","common.loading":"加载中…","common.noData":"没有数据","errors.unknown":"发生未知错误","insights.noPreview":"这条提案没有摘要内容","httpError.auth.missing-bearer":"此服务器需要访问令牌,请输入令牌后继续。","httpError.auth.invalid-token":"访问令牌不正确,请检查后重试。","httpError.auth.not-configured":"服务器尚未设置访问令牌。请重启 `memesh serve` 并查看其输出。","httpError.validation.bad-body":"页面发送的请求服务器无法读取。请刷新页面后重试。","httpError.validation.bad-param":"请求中有字段不正确。请刷新页面后重试。","httpError.route.retired":"服务器已不支持此操作——页面和服务器版本可能不一致。请刷新页面。","httpError.route.not-found":"服务器不认识此请求——页面和服务器版本可能不一致。请刷新页面。","httpError.resource.not-found":"该项目已不存在,请刷新列表。","httpError.payload.too-large":"发送的数据太大(超过 1 MB),请分成较小的批次。","httpError.operation.failed":"服务器无法完成此操作。","httpError.llm.not-configured":"尚未配置 AI 提供商,请先到“设置”中添加。","httpError.rate.limited":"短时间内发送的请求过多。请稍候片刻再试一次。","httpError.server.internal":"服务器发生意外错误。","settings.testError.auth":"API 密钥被拒绝,请检查密钥后重试。","settings.testError.network":"无法连接到提供商,请检查网络连接。","settings.testError.no_models":"提供商有响应,但没有返回可用的模型。","settings.testError.bad_host":"Ollama 地址必须在本机上(localhost)。","settings.testError.http":"提供商返回错误(HTTP {status})。","settings.testError.unknown":"测试失败,原因未知。","time.justNow":"刚刚","time.hoursAgo":"{count} 小时前","time.today":"今天","time.yesterday":"昨天","time.daysAgo":"{count} 天前","time.lastWeek":"上周","time.weeksAgo":"{count} 周前","time.lastMonth":"上个月","time.monthsAgo":"{count} 个月前","memory.access.frequent":"常用 · {count} 次","memory.access.recalls":"{count} 次回忆","memory.access.never":"从未回忆","cluster.knowledge":"知识","cluster.activity":"活动","cluster.session":"工作记录","cluster.reference":"参考","cluster.all":"全部","browse.filterCategory":"类别","browse.filterTime":"时间","browse.filterValue":"价值","browse.filterProject":"项目","browse.filterSort":"排序","browse.timeToday":"今天","browse.timeWeek":"本周","browse.timeMonth":"本月","browse.timeOlder":"更早","browse.valueRecalled":"✓ 用过","browse.valueNever":"从未回忆","browse.sortMostRecalled":"最常回忆","browse.sortRecent":"最近使用","browse.sortCreated":"创建时间","browse.emptyFilter":"此分类没有记忆 — 试试切换类别或时间","lessons.tabFailure":"失败教训","lessons.tabPlan":"计划记录","lessons.tabFreeform":"笔记","lessons.totalRecalls":"总回忆次数","lessons.stepsLabel":"步骤","lessons.commitsCount":"{count} 个 commit","lessons.unstructured":"(此教训没有结构化字段,请查看原始记忆)","lessons.searchPlaceholder":"搜索 error / root cause / fix / 名称…","lessons.allProjects":"全部项目","lessons.showing":"显示 {visible} / {total} 条","lessons.noMatch":'无符合"{query}"的记忆',"lessons.emptyCategory":"此类别没有记忆","lessons.moreItems":"+{count} 条","roadmap.title":"项目路线图","roadmap.summary":"{count} 条记忆 · {first} → {last}","roadmap.switchToList":"↩ 列表视图","roadmap.switchToRoadmap":"🗺️ 路线图视图","roadmap.emptyProject":"此项目尚无记忆。","loop.label":"记忆循环","loop.subtitleHas":"本周被回忆的知识类型记忆","loop.subtitleNone":"本周尚无知识被回忆 — 试试唤起一则教训","loop.approxNote":"近似值 — 完整追踪从升级后开始累积","loop.sparkLabel":"最近 30 天","roadmap.milestones":"里程碑","roadmap.keyLessons":"重要教训","radar.title":"知识覆盖雷达","radar.caption":"显示有效知识记忆 (排除 session 和 commit)","radar.axis.lessons":"教训","radar.axis.decisions":"决策","radar.axis.patterns":"模式","radar.axis.bugs":"问题修复","radar.axis.processes":"流程","radar.axis.architecture":"架构","ageMatrix.title":"记忆年龄分布","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"颜色深度 = 记忆密度","ageMatrix.typeColumn":"类型","header.signalModeOn":"信号","header.signalModeOff":"全部","header.signalModeOnHint":"已隐藏 session 与 commit 等噪音。点击显示全部。","header.signalModeOffHint":"显示包含 session 与 commit 在内的所有记忆。点击隐藏噪音。","roadmap.phases":"阶段","onboarding.title":"欢迎使用 MeMesh","onboarding.body":"你的记忆库还是空的。从 30 条精选示例开始体验,或直接存下你的第一则教训。","onboarding.llmHint":"不需要 LLM。所有功能都靠 FTS5 运作。LLM 只用在自动产生教训,可以之后再到设置页开启。","onboarding.seedButton":"一键载入示范数据","onboarding.seedingButton":"载入中…","onboarding.seedHint":"直接在这里载入 30 条,之后可一键清除,不用切到终端","onboarding.cliReference":"习惯 CLI?","onboarding.hintDemo":"植入 30 条示范记忆,之后可一键清除","onboarding.hintReset":"移除所有 metadata.demo 标记的记忆","onboarding.resetButton":"清除示范数据","onboarding.resettingButton":"清除中…","onboarding.resetConfirm":"确定要移除所有示范记忆?你自己存的内容会保留。","onboarding.dismiss":"关闭","common.serverError":"服务器报告错误(HTTP {status})。请再试一次;若持续发生,请运行 `memesh doctor`。","emptyLibrary.title":"你的记忆库是空的","emptyLibrary.body":"这里还没有任何记忆。载入 30 条示范数据,马上看到 MeMesh 的完整功能——之后可一键清除。","browse.truncated":"当前显示前 {shown} 条(共 {total} 条)——用搜索或筛选找到其余的记忆","lessons.capNote":"只载入前 {limit} 条教训——上方统计只涵盖这些","lessons.emptyGuide":"还没有任何教训。Smart Mode 会在分析会话失败时自动记录——也可以请你的 AI 助手帮你记一条。","graph.cappedNote":"只显示前 {shown} 个节点(共 {total} 个,按回想次数排序),让图表保持流畅。","settings.testStoredKeyHint":"字段留空即测试已保存的密钥。","ageMatrix.bucket.week":"本周","ageMatrix.bucket.month":"本月","ageMatrix.bucket.quarter":"本季","ageMatrix.bucket.older":"更早","settings.behaviourTitle":"行为设置","settings.autoUpdateLabel":"自动更新策略","settings.autoUpdateOff":"关闭 — 仅手动","settings.autoUpdatePatch":"Patch — 自动应用 X.Y.Z+1","settings.autoUpdateMinor":"Minor — 自动应用 X.Y+1.0","settings.autoUpdateMajor":"Major — 自动应用任何版本升级","settings.autoUpdateHint":"每次 session 结束后触发。MEMESH_AUTO_UPDATE 环境变量优先。","errors.timeout":"请求超时","type.lesson_learned":"教训","type.lesson":"教训","type.mistake":"错误","type.decision":"决策","type.architecture_decision":"架构决策","type.design_decision":"设计决策","type.pattern":"模式","type.technical_pattern":"技术模式","type.best_practice":"最佳实践","type.bug_fix":"问题修复","type.verification_result":"验证结果","type.test_result":"测试结果","type.process":"流程","type.architecture":"架构","type.infrastructure":"基础设施","type.feature":"功能","type.release":"版本发布","type.refactoring":"重构","type.commit":"提交","type.session_keypoint":"会话要点","type.session_identity":"会话身份","type.session-insight":"会话洞察","type.session-summary":"会话摘要","type.session-identity":"会话身份","type.weekly_summary":"周摘要","type.weekly-summary":"周摘要","type.note":"笔记","type.plan":"计划","type.knowledge":"知识","type.workflow_checkpoint":"流程里程碑","type.concept":"概念","type.tool":"工具","type.person":"人物","relation.relates_to":"相关","relation.related-to":"相关","relation.depends_on":"依赖","relation.implements":"实现","relation.learned_from":"学习自","relation.supersedes":"取代","relation.contradicts":"矛盾","relation.follows":"接续","relation.belongs-to-project":"属于项目","relation.co-created":"共同创建","relation.shares-name-tokens":"名称相似","patterns.day.0":"周日","patterns.day.1":"周一","patterns.day.2":"周二","patterns.day.3":"周三","patterns.day.4":"周四","patterns.day.5":"周五","patterns.day.6":"周六","telemetry.flow.dreamer":"周报整理(dreamer)","telemetry.flow.pattern_detector":"模式检测","telemetry.flow.digest_validator":"摘要验证","telemetry.flow.auto_tagger":"自动标签","telemetry.flow.failure_analyzer":"失败分析","telemetry.flow.transcript_extractor":"对话记录挖掘","telemetry.flow.conflict_judge":"冲突判定","telemetry.errorClass.auth":"凭证被拒","telemetry.errorClass.rate_limit":"额度限制","telemetry.errorClass.upstream":"服务商故障","telemetry.errorClass.bad_request":"请求无效","telemetry.errorClass.network":"网络","telemetry.errorClass.parse":"响应无法解析","telemetry.errorClass.unknown":"未知","lessons.severity.critical":"严重","lessons.severity.major":"重大","lessons.severity.minor":"轻微","memory.tooltip.project":"项目","memory.tooltip.recalled":"已被回忆 {count} 次","memory.tooltip.hasRelations":"与 {count} 条记忆相连","memory.tooltip.createdAt":"创建于 {date}","graph.drift":"时效","graph.driftHint":"按新旧上色:红=久未使用,绿=最近使用","common.unknown":"未知","insights.entitiesCount":"{n} 个实体","roadmap.viewToggle":"路线图视图","roadmap.viewTree":"树状","roadmap.viewMindmap":"思维导图","roadmap.mindmapNeedsPhases":"思维导图需要 7 天内至少 3 条记忆。","roadmap.activePhase":"进行中","roadmap.entryCount":"{count} 条","roadmap.entriesCount":"{count} 条","roadmap.otherGroup":"其他({count})","roadmap.lowSignalHidden":"(已隐藏 {count} 条低信号)","roadmap.resetHint":"重置缩放与位置(双击背景也可重置)","roadmap.zoomHint":"滚轮缩放 · 拖动平移 · {pct}%","roadmap.moreEntities":"还有 {count} 条","nav.ariaLabel":"仪表板分页","feedback.descLabel":"反馈内容","graph.canvasA11y":"知识图谱(画布绘制):{entities} 个实体、{relations} 条关系、{orphans} 个未连接。上方的类型筛选与搜索提供非视觉浏览方式。"},ja:{"auth.title":"認証が必要です","auth.intro":"このダッシュボードは bearer トークンで保護されています。MEMESH_REMOTE_TOKEN の値(または <memeshDir>/remote-token の内容)を下に貼り付けてください。","auth.tokenLabel":"トークン","auth.empty":"トークンを入力してください。","auth.invalid":"このトークンは受け付けられませんでした。確認してもう一度お試しください。","auth.submit":"ダッシュボードのロックを解除","auth.tokenPlaceholder":"ここにトークンを貼り付け","brand.subtitle":"powered by pcircle.com","header.connected":"接続中","header.disconnected":"切断","header.connecting":"接続しています…","header.memories":"件のメモリ","tab.insights":"Insights","telemetry.title":"LLM アクティビティ","telemetry.lastNDays":"直近 {n} 日","telemetry.loading":"読み込み中…","telemetry.empty":"この期間の AI アクティビティはまだありません。バックグラウンドの AI 機能(週次まとめや自動タグ付けなど)が動くと、自動的にここに記録が表示されます。","telemetry.callsCount":"{n} 回の呼び出し","telemetry.attemptsCount":"{n} 回の試行","telemetry.successRate":"成功率","telemetry.medianLatency":"レイテンシ中央値","telemetry.fallbackUsed":"フォールバック使用 {n} 回(呼び出しの {pct})","telemetry.byProvider":"プロバイダ別","telemetry.byModel":"モデル別","telemetry.byProject":"プロジェクト別","telemetry.errors":"エラー","insights.title":"memesh が行ったこと","insights.subtitle":"自動生成された weekly recap と検出された pattern。レビュー待ち","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"すべて","insights.refresh":"更新","insights.loading":"読み込み中…","insights.emptyPending":"pending の insight はありません。`memesh dream run` で weekly recap を生成できます。","insights.emptyNoLlm":"weekly recap と pattern 検出を有効にするには、設定で LLM プロバイダを構成してください。","insights.emptyOther":"データがありません。","insights.sources":"ソース","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"詳細を見る","insights.collapse":"折りたたむ","insights.accept":"採用","insights.applying":"適用中…","insights.reject":"拒否","insights.generatedBy":"生成モデル","insights.promptVersion":"Prompt バージョン","insights.observations":"要約観察","insights.tags":"タグ","insights.sourceIds":"ソース entity","insights.validationWarnings":"疑わしい主張(LLM validator)","insights.validationClaim":"主張","insights.validationReason":"理由","insights.runDream":"weekly recap を実行","insights.runDreamWithValidate":"validator 付きで実行(遅いが高品質)","banner.pendingInsights":"{n} 件の新しい insight がレビュー待ち →","banner.dismiss":"閉じる","banner.viewAll":"すべて表示","pattern.title":"Pattern","pattern.evidenceCount":"{n} 件の証拠","pattern.severity":"重大度","pattern.severity.high":"高","pattern.severity.medium":"中","pattern.severity.low":"低","pattern.description":"Pattern の説明","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.hint":"名前・内容・タグで検索できます。完全一致の語と、意味が近い内容の両方を探します。","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":"件のアーカイブ済みメモリ","browse.archiveFailed":"アーカイブできませんでした: {message}","browse.restoreFailed":"復元できませんでした: {message}","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.entityMeta":"{type} ・ 信頼度 {confidence}% ・ {days}日未使用","settings.capabilities":"機能状態","settings.smartMode":"スマートモード","settings.core":"コア","settings.embeddings":"エンベディング","settings.llmProvider":"LLMプロバイダー","settings.llmOptional.title":"LLM はオプションです","settings.llmOptional.body":"memesh は LLM なしでも動作します。デフォルトのコアモードは全文リコール、手動の remember/recall、ダッシュボード、フックによるセッション自動キャプチャをカバーします。","settings.llmOptional.coreLabel":"LLM なし(コアモード)","settings.llmOptional.coreFeatures":"FTS5 キーワード検索、手動 remember/recall、ダッシュボード、フックによるセッションキャプチャ","settings.llmOptional.smartLabel":"LLM あり(スマートモード)","settings.llmOptional.smartFeatures":"セッション失敗から lesson_learned を自動抽出、新規エンティティの自動タグ付け、週次まとめとパターン検出","settings.apiKey":"APIキー","settings.fallbacks.title":"フォールバックプロバイダー","settings.fallbacks.explainer":"メインのプロバイダーが利用できない場合、memesh はこれらを順番に試し、成功するものを使います。","settings.fallbacks.privacyTitle":"プライバシーに関する注意","settings.fallbacks.privacyBody":"クラウドプロバイダー(OpenAI または Anthropic)を追加すると、メインのプロバイダーが停止したときに、あなたのメモリ内容(プライベートな場合があります)がそのクラウドプロバイダーに送信されます。プライバシーのためにローカルプロバイダーを使っている場合は、このトレードオフを理解したうえで追加してください。","settings.fallbacks.empty":"フォールバックプロバイダーはまだありません。","settings.fallbacks.add":"フォールバックプロバイダーを追加","settings.fallbacks.providerLabel":"プロバイダー","settings.fallbacks.modelLabel":"モデル(任意)","settings.fallbacks.modelPlaceholder":"例:gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"キーは保存済みです。空欄のままにすると保持されます。","settings.fallbacks.remove":"削除","settings.fallbacks.moveUp":"上へ","settings.fallbacks.moveDown":"下へ","settings.fallbacks.priority":"優先度 {n}","settings.fallbacks.save":"フォールバック順を保存","settings.fallbacks.needsKey":"API キーを入力してください。入力しないとこのクラウドフォールバックは使用できません。","settings.model":"モデル(任意)","settings.save":"保存","settings.saving":"保存中…","settings.saved":"保存しました","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"接続テスト","settings.testing":"テスト中…","settings.testPassed":"✓ 接続成功 · {count} 個のモデルが利用可能","settings.testFailed":"接続テストに失敗しました","settings.suggested":"推奨","settings.testRequired":"保存前に接続をテストしてください","settings.language":"言語","settings.searchMode":"検索モード","settings.none":"なし","settings.updates":"アップデート","settings.updateChecking":"更新を確認中…","settings.updateUnavailable":"現在は更新を確認できません","settings.updateNoSuccessfulChecks":"まだ一度も更新確認に成功していません","settings.upToDate":"最新です","settings.updateAvailable":"更新があります","settings.updateStale":"表示中のキャッシュ結果は古い可能性があります","settings.updateCachedFallback":"前回成功したキャッシュ結果を使用しています","settings.updateDeprecatedNoTarget":"非推奨 — まだアップグレード先がありません","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} はメンテナーによって非推奨 (DEPRECATED) としてマークされています。","settings.updatePartialTitle":"⚠️ 更新チェックが部分的に失敗しました","settings.updatePartialDescription":"{message}。このセッションでは非推奨ステータスを確認できません — オンラインに復帰してから再実行してください。","settings.updatePartialSummary":"部分的 — 非推奨ステータス未確認","settings.updateDeprecatedTargetUnknown":"非推奨 — アップグレード先を確認中","settings.currentVersion":"現在のバージョン","settings.latestVersion":"最新バージョン","settings.lastChecked":"最終確認","settings.lastAttempted":"最終確認試行","settings.lastSuccessful":"最後に成功した確認","settings.updateSourceFresh":"今すぐ確認","settings.updateSourceCached":"キャッシュ結果を使用","settings.updateSourceStale":"古いキャッシュ結果を使用","settings.updateSourceUnavailable":"利用できるキャッシュなし","settings.updateCommand":"更新コマンド","settings.checkNow":"今すぐ確認","settings.updateLastError":"前回の確認エラー: {message}","settings.installMethod":"インストール方法","settings.installNpmGlobal":"npm グローバルインストール","settings.installNpmLocal":"プロジェクトローカルのパッケージインストール","settings.installSourceCheckout":"ソースチェックアウト","settings.installUnknown":"不明","settings.updateGuidanceNpmGlobal":"このインストールは MeMesh から直接更新できます。","settings.updateGuidanceNpmLocal":"このインストールを追加したプロジェクトのパッケージマネージャーから更新してください。","settings.updateGuidanceSourceCheckout":"このソースチェックアウトはリポジトリから更新して再ビルドしてください。","settings.updateGuidanceUnknown":"MeMesh をインストールしたツールまたは手順からこのインストールを更新してください。","graph.entities":"エンティティ","graph.relations":"リレーション","graph.orphans":"孤立ノード","graph.search":"ノードを検索…","graph.matches":"件一致","graph.focusMode":"フォーカス","graph.showAll":"すべて表示","graph.clickHint":"ノードをクリックしてフォーカス","graph.interactHint":"ノードをクリックしてフォーカス · 空白をドラッグでパン · スクロールでズーム","graph.resetView":"ビューをリセット","graph.resetViewHint":"ズームと位置をリセット","graph.ageToday":"今日","graph.ageDaysAgo":"{count}日前","graph.ageWeeksAgo":"{count}週間前","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 を作成","feedback.submitting":"診断情報を収集中…","doctorBanner.warnTitleSoft":"memesh セットアップに注記があります","doctorBanner.failTitle":"memesh のセットアップが不完全です","doctorBanner.dismiss":"閉じる","doctorBanner.getHelp":"サポートを受ける","doctorBanner.helpHint":"診断情報が事前入力された GitHub Issue を開きます","doctorBanner.preambleForIssue":"memesh doctor が私のインストールで以下を検出しました:","doctorBanner.moreCount":"…ほか {n} 件 — 全リストは `memesh doctor` で確認できます","doctor.label.readme_locale_parity":"README の翻訳","doctor.label.config":"設定ファイル","doctor.label.mcp-config":"MCP 接続ファイル","doctor.label.hooks-config":"フック定義","doctor.label.hook-scripts":"フックスクリプト","doctor.label.hook-wiring":"Claude Code との接続","doctor.label.hook-activity":"自動記録","doctor.label.node-runtime":"Node.js のバージョン","doctor.label.native-binding":"SQLite とベクトル検索","doctor.label.shell-cli":"ターミナルコマンド","doctor.label.dashboard":"ダッシュボードのファイル","doctor.label.update-status":"アップデート","doctor.label.http-probe":"ローカルサーバー","doctor.label.skills-manifest":"同梱ファイル","doctor.label.config_parse":"設定ファイル","doctor.label.embeddings_probe":"意味ベース検索","doctor.label.llm_probe":"AI プロバイダー","doctor.label.install-channel":"インストール方法","doctor.label.fts_segmentation":"キーワード索引","doctor.label.vector_index":"検索インデックス","doctor.label.database":"データベース","doctor.msg.readme-parity.unreadable.summary":"README.md を読み取れませんでした: {detail}","doctor.msg.readme-parity.drift.summary":"一部の翻訳版 README が英語版とずれています: {detail}","doctor.msg.readme-parity.drift.fix":"挙げられた README を README.md に合わせて更新してください。","doctor.msg.config.invalid-json.summary":"{path} の設定ファイルは有効な JSON ではないため、無視されています。","doctor.msg.config.invalid-json.fix":"{path} を修正するか削除し、`memesh config list` で読み込めるか確認してください。","doctor.msg.mcp-config.missing.summary":"memesh を Claude Code につなぐファイル(.mcp.json)が見つかりません。","doctor.msg.mcp-config.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.mcp-config.invalid-json.summary":".mcp.json が壊れています(有効な JSON ではありません)。Claude Code が読み取れません。","doctor.msg.mcp-config.invalid-json.fix":"{path} を修正するか、MeMesh を再インストールしてください。","doctor.msg.mcp-config.no-entry.summary":".mcp.json に memesh サーバーの設定がなくなっています。","doctor.msg.mcp-config.no-entry.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` が起動しようとしているファイルがこのインストールに存在しないため、Claude Code 内の memesh ツールがすべて起動しません。","doctor.msg.mcp-config.entry-missing.fix":"MeMesh を再インストールしてください。`.mcp.json` を手で編集した場合は `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js` に戻してください。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json が見つからないため、自動の記憶保存が動きません。","doctor.msg.hooks-config.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json が壊れています(有効な JSON ではありません)。","doctor.msg.hooks-config.invalid-json.fix":"{path} を修正するか、MeMesh を再インストールしてください。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json に次のフックタイプがありません: {types}。一部の自動記録は動作しません。","doctor.msg.hooks-config.missing-types.fix":"出荷時のフック設定を復元するか、MeMesh を再インストールしてください。","doctor.msg.hook-scripts.none.summary":"フック設定にスクリプトが 1 つもないため、何も自動記録できません。","doctor.msg.hook-scripts.none.fix":"MeMesh を再インストールしてください。","doctor.msg.hook-scripts.missing.summary":"次のフックスクリプトが見つかりません: {files}","doctor.msg.hook-scripts.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.hook-scripts.not-executable.summary":"次のフックスクリプトは存在しますが、実行が許可されていません: {files}","doctor.msg.hook-scripts.not-executable.fix":"`chmod +x scripts/hooks/*.js` を実行してください。ソースからの場合は `npm run build` を実行します。","doctor.msg.hook-wiring.no-marker.summary":"memesh はまだ Claude Code に接続されていないため、何も自動で記憶されません。","doctor.msg.hook-wiring.no-marker.fix":"`memesh install-hooks` を一度実行し、`memesh doctor` で確認してください。","doctor.msg.hook-wiring.script-missing.summary":"配線済みの memesh フックが {path} を指していますが、このファイルはもう存在しません — エージェントは該当イベントのたびに存在しないファイルを呼び出します。フックを廃止したアップグレードの残骸であることが多いです。","doctor.msg.hook-wiring.script-missing.fix":"`memesh install-hooks` を実行して配線し直し(廃止済み項目は削除されます)、エージェントを再起動してください。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} の接続記録を読み取れません。","doctor.msg.hook-wiring.marker-unreadable.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.marker-malformed.summary":"接続記録が壊れています。","doctor.msg.hook-wiring.marker-malformed.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code の設定ファイル({path})がなくなっているため、接続が切れています。","doctor.msg.hook-wiring.settings-missing.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} が壊れています(有効な JSON ではありません)。","doctor.msg.hook-wiring.settings-invalid.fix":"バックアップから復元するか、`memesh install-hooks` で作り直してください。","doctor.msg.hook-wiring.entries-removed.summary":"{path} から memesh の設定が削除されたため、接続が切れています。","doctor.msg.hook-wiring.entries-removed.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.root-moved.summary":"接続先の {path} はもう存在しません(memesh が移動された可能性があります)。","doctor.msg.hook-wiring.root-moved.fix":"`memesh install-hooks` を実行して更新してください。","doctor.msg.hook-activity.never-ran.summary":"記録の追跡を始めてから {hours} 時間、キャプチャフックが一度も実行されていません。フックの配線は正常なので、実行されるはずのものが動いておらず、何も記憶されていません。","doctor.msg.hook-activity.never-ran.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。まだフックが実行されていないと表示される場合は `memesh install-hooks` を実行してエージェントを再起動してください。","doctor.msg.hook-activity.stale.summary":"最後にキャプチャフックが実行されたのは約 {hours} 時間前です({hook})。それ以降に作業しているなら、キャプチャは停止しており、そのセッションの内容は保存されていません。","doctor.msg.hook-activity.stale.fix":"エージェントを再起動し、セッションを 1 回終えてから `memesh doctor` を再実行してください。回復しない場合は `memesh install-hooks` を実行してください。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary フックの最終実行は約 {hours} 時間前で、直近 3 日間 Claude Code からの書き込みもありません。このマシンが別のエージェント(Codex / Gemini)に移行したなら正常です。まだここで Claude Code を使っているなら、キャプチャは停止しています。","doctor.msg.hook-activity.stale-unconfirmed.fix":"このマシンでまだ Claude Code を使っている場合:再起動し、セッションを 1 回終えてから `memesh doctor` を再実行してください。回復しなければ `memesh install-hooks` を実行してください。","doctor.msg.hook-activity.query-failed.summary":"データベースからフックの実行履歴を読めませんでした:{detail}。キャプチャの状態は「不明」であり、「正常」とは違います。","doctor.msg.hook-activity.query-failed.fix":"`memesh doctor --verbose` で完全なエラーを確認し、~/.memesh が読み取り可能でディスクに空きがあることを確認してください。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} フックの最終実行時刻が読み取れません(データ破損、または時計が狂ったマシンが記録した可能性があります)。キャプチャの状態は「不明」であり、「正常」とは違います。","doctor.msg.hook-activity.stale-unknown.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。新しい実行が壊れたタイムスタンプを上書きします。","doctor.msg.hook-activity.disabled.summary":"自動キャプチャはオフになっています(MEMESH_AUTO_CAPTURE または設定の autoCapture)。意図的な設定のため、フックが動かないのは想定どおりです。再開するには設定を戻してください。","doctor.msg.hook-activity.disabled-env.summary":"この shell の環境変数 MEMESH_AUTO_CAPTURE=false により自動キャプチャはオフです。doctor は自分の環境しか見えません — エージェントがこの変数なしで動いていれば、そちらのキャプチャは影響を受けません。","doctor.msg.hook-activity.not-wired.summary":"キャプチャフックは一度も実行されていません — そしてこのマシンではキャプチャフック(Stop / PostToolUse / PreCompact)の配線が確認できないため、実行されるものがそもそもありません。","doctor.msg.hook-activity.not-wired.fix":"自動キャプチャを使うには `memesh install-hooks` を実行してください。MCP のみのインストール(Codex / Gemini)であればこれは正常であり、無視してかまいません。","doctor.msg.hook-activity.stop-silent.summary":"{hook} フックは記録されていますが、追跡開始から {hours} 時間、session-summary フックは一度も実行されていません。コミットのキャプチャに隠れて、セッションのキャプチャが壊れている可能性があります。","doctor.msg.hook-activity.stop-silent.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。それでも session-summary が実行されていなければ、`memesh install-hooks` を実行してエージェントを再起動してください。","doctor.msg.hook-activity.never-ran-legacy.summary":"ハートビートを記録したフックはありませんが、追跡開始以降に {captured} 件の自動キャプチャの記憶が保存されています。ハートビート機能より前の旧バージョンのフックがまだ動いている可能性が高いです。","doctor.msg.hook-activity.never-ran-legacy.fix":"memesh のフックを現行バージョンに更新し(プラグイン:`/plugin update memesh`、npm:`memesh install-hooks`)、エージェントを再起動してください。","doctor.msg.node-runtime.too-old.summary":"お使いの Node.js はこのパッケージが対応するバージョンより古いです。{detail}","doctor.msg.node-runtime.too-old.fix":"Node.js を {required} 以上に更新し、もう一度 `memesh doctor` を実行してください。","doctor.msg.native-binding.node-too-old.summary":"このバージョンの Node に入っている SQLite は memesh には古すぎて、意味で検索する部分を読み込めません。完全な版は Node 22.13 からです。","doctor.msg.native-binding.node-too-old.fix":"Node を 22.13 以降に更新してから、もう一度 `memesh doctor` を実行してください。","doctor.msg.native-binding.not-installed.summary":"sqlite-vec がインストールされていません。記憶の保存とキーワード検索は動きますが、意味による検索は使えません。","doctor.msg.native-binding.not-installed.fix":"@pcircle/memesh を使うフォルダーで `npm install` を実行してください。","doctor.msg.native-binding.load-failed.summary":"sqlite-vec を読み込めませんでした: {detail}。検索はキーワードのみになります。","doctor.msg.native-binding.load-failed.fix":'実行: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"ターミナルで `memesh` コマンドが使えません。Claude Code の機能には影響ありません — 自分で `memesh` と入力するときだけの問題です。","doctor.msg.shell-cli.not-on-path.fix":"`npm install -g @pcircle/memesh` で追加できます。どちらのインストールも同じ記憶を共有します。","doctor.msg.dashboard.missing.summary":"ダッシュボードのファイルが見つかりません。","doctor.msg.dashboard.missing.fix":"`cd dashboard && npm install && npm run build` で作成してください。","doctor.msg.update-status.no-cache.summary":"memesh はまだ新しいバージョンの確認に成功していません。","doctor.msg.update-status.no-cache.fix":"オンラインのときに `memesh status` を一度実行してください。結果が保存され、この通知は消えます。","doctor.msg.update-status.deprecated.summary":"バージョン {version} は提供元によって取り下げられました: {detail}","doctor.msg.update-status.deprecated.fix":"今すぐ更新してください — `memesh update` を実行します(またはお使いのインストール方法に従ってください)。","doctor.msg.update-status.deprecation-unknown.summary":"バージョン {version} が今も安全に使えるか確認できませんでした: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"オンラインのときに `memesh status` を実行して再試行してください。","doctor.msg.update-status.update-available.summary":"新しいバージョンがあります: {latest}(現在は {current})。","doctor.msg.update-status.update-available.fix":"`memesh update` を実行して更新してください。","doctor.msg.update-status.stale.summary":"バージョン {version} は最新ですが、更新情報が古くなっています。","doctor.msg.update-status.stale.fix":"オンラインのときに `memesh status` を実行して更新してください。","doctor.msg.http-probe.bad-status.summary":"{url} のローカルサーバーがエラーを返しました(HTTP {status})。","doctor.msg.http-probe.bad-status.fix":"`memesh serve` で再起動し、ログを確認してください。","doctor.msg.http-probe.no-server.summary":"{url} で動いているローカルサーバーがありません。","doctor.msg.http-probe.no-server.fix":"ダッシュボードを使うなら `memesh serve` で起動してください。","doctor.msg.skills-manifest.missing-dev.summary":"ファイル整合性の一覧が見つかりません(ソースコードから実行している場合は正常です)。","doctor.msg.skills-manifest.missing-dev.fix":"`npm run build` を実行して生成してください。","doctor.msg.skills-manifest.unreadable.summary":"ファイル整合性の一覧を読み取れません({detail})。","doctor.msg.skills-manifest.unreadable.fix":"再インストール: `npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.empty.summary":"ファイル整合性の一覧が空です。","doctor.msg.skills-manifest.empty.fix":"再インストール: `npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.verify-failed.summary":"一部の同梱ファイルが出荷時の内容と一致しません: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"再インストール: `npm install -g @pcircle/memesh`。新規インストールでも再発する場合は、セキュリティ問題として報告してください。","doctor.msg.config-parse.not-object.summary":"{path} の設定ファイルが想定の形式ではないため、すべての設定が無視されています。","doctor.msg.config-parse.not-object.fix":"{path} を修正するか削除し、もう一度 `memesh doctor` を実行してください。","doctor.msg.config-parse.unreadable.summary":"{path} の設定ファイルを読み取れないため({detail})、すべての設定が無視されています。","doctor.msg.config-parse.unreadable.fix":"ファイルを修正するか、いったん退避してください: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":"意味ベース検索は「{provider}」に設定されていますが、テストで何も返しませんでした。キーワード検索は引き続き使えます。","doctor.msg.embeddings.empty.fix":"詳細は `memesh doctor --probe` で確認するか、プロバイダーの接続を確認してください。","doctor.msg.embeddings.threw.summary":"意味ベース検索は「{provider}」に設定されていますが、テストに失敗しました: {detail}。キーワード検索は引き続き使えます。","doctor.msg.embeddings.threw.fix":"エンベディングのプロバイダーに接続できるか確認するか(例: `ollama serve` を実行)、embedder 設定を削除してキーワードのみの検索に切り替えてください。","doctor.msg.llm.unreachable.summary":"AI プロバイダー({provider})から応答がありません: {detail}。AI 機能は何もしないまま止まっています。","doctor.msg.llm.unreachable.fix":"API key と接続を確認し、もう一度 `memesh doctor --probe` を実行してください。","doctor.msg.llm.threw.summary":"AI プロバイダー({provider})のテストに失敗しました: {detail}。AI 機能は何もしないまま止まっています。","doctor.msg.llm.threw.fix":"API key と接続を確認し、もう一度 `memesh doctor --probe` を実行してください。","doctor.msg.install-channel.unknown.summary":"memesh がどうインストールされたか判別できませんでした。","doctor.msg.install-channel.unknown.fix":"ソースからならリポジトリのルートで実行してください。そうでなければ `npm install -g @pcircle/memesh` で再インストールしてください。","doctor.msg.fts.unsegmented.summary":"キーワード索引に旧形式の項目が {count} 件あります — 一部の記憶は全文が完全に一致しないと見つかりません。","doctor.msg.fts.unsegmented.fix":"`memesh reindex --fts` を実行して索引を作り直してください。","doctor.msg.vector-index.stale.summary":"検索インデックスの再構築が必要です(検索設定が変わりました)。","doctor.msg.vector-index.stale.fix":"`memesh reindex` を実行して再構築してください。","doctor.msg.database.broken.summary":"データベースが使えません: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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":"リコールデータはまだありません。次のセッション後に追跡が開始されます。","recall.summary":"{used} 件使用 / {total} 件注入","analytics.loadFailed":"分析データを読み込めませんでした。","memory.noContent":"(内容なし)","memory.archivedBadge":"アーカイブ済み","memory.factsCount":"{count}件の事実","common.error":"エラー","common.serverUnreachable":"memesh サーバーに接続できません。","common.serverUnreachableAction":"`memesh serve` が実行中か確認して、このページを再読み込みしてください。","common.responseUnreadable":"サーバーは応答しましたが、このページはその内容を読み取れませんでした。ダッシュボードとサーバーのバージョンが一致していない可能性があります。","common.responseUnreadableAction":"ページを再読み込みしてください。繰り返す場合は `memesh doctor` を実行してください。","pm.title":"PM メトリクス","pm.decisionsPerWeek":"意思決定/週","pm.openDecisions":"未解決の意思決定(14日超)","pm.orphanRate":"未接続のメモリ","pm.relationsTotal":"リレーション総数","pm.stalePlans":"30日以上見直されていないプランが {count} 件","common.loading":"読み込み中…","common.noData":"データがありません","errors.unknown":"不明なエラー","insights.noPreview":"この提案には要約テキストがありません","httpError.auth.missing-bearer":"このサーバーにはアクセストークンが必要です。トークンを入力してください。","httpError.auth.invalid-token":"アクセストークンが正しくありません。確認してもう一度お試しください。","httpError.auth.not-configured":"サーバーにアクセストークンが設定されていません。`memesh serve` を再起動して出力を確認してください。","httpError.validation.bad-body":"ページが送ったリクエストをサーバーが読み取れませんでした。ページを再読み込みしてもう一度お試しください。","httpError.validation.bad-param":"リクエストの一部が正しくありません。ページを再読み込みしてもう一度お試しください。","httpError.route.retired":"この操作はサーバーでサポートされなくなりました。ページとサーバーのバージョンが違う可能性があります。ページを再読み込みしてください。","httpError.route.not-found":"サーバーがこのリクエストを認識できません。ページとサーバーのバージョンが違う可能性があります。ページを再読み込みしてください。","httpError.resource.not-found":"その項目はもう存在しません。一覧を更新してください。","httpError.payload.too-large":"送信データが大きすぎます(1 MB 超)。小さく分けてお試しください。","httpError.operation.failed":"サーバーはこの操作を完了できませんでした。","httpError.llm.not-configured":"AI プロバイダーが未設定です。まず設定で追加してください。","httpError.rate.limited":"短時間にリクエストが多すぎます。少し待ってからもう一度お試しください。","httpError.server.internal":"サーバーで予期しないエラーが発生しました。","settings.testError.auth":"API キーが拒否されました。キーを確認してもう一度お試しください。","settings.testError.network":"プロバイダーに接続できません。ネットワーク接続を確認してください。","settings.testError.no_models":"プロバイダーは応答しましたが、使用できるモデルが返されませんでした。","settings.testError.bad_host":"Ollama のアドレスはこのマシン上(localhost)である必要があります。","settings.testError.http":"プロバイダーがエラーを返しました(HTTP {status})。","settings.testError.unknown":"原因不明でテストに失敗しました。","time.justNow":"たった今","time.hoursAgo":"{count} 時間前","time.today":"今日","time.yesterday":"昨日","time.daysAgo":"{count} 日前","time.lastWeek":"先週","time.weeksAgo":"{count} 週前","time.lastMonth":"先月","time.monthsAgo":"{count} ヶ月前","memory.access.frequent":"頻繁 · {count} 回","memory.access.recalls":"{count} 回呼出","memory.access.never":"未使用","cluster.knowledge":"知識","cluster.activity":"アクティビティ","cluster.session":"セッション","cluster.reference":"参照","cluster.all":"すべて","browse.filterCategory":"カテゴリ","browse.filterTime":"時間","browse.filterValue":"価値","browse.filterProject":"プロジェクト","browse.filterSort":"並べ替え","browse.timeToday":"今日","browse.timeWeek":"今週","browse.timeMonth":"今月","browse.timeOlder":"それ以前","browse.valueRecalled":"✓ 使用済み","browse.valueNever":"未使用","browse.sortMostRecalled":"使用頻度順","browse.sortRecent":"最近の使用順","browse.sortCreated":"作成日順","browse.emptyFilter":"このカテゴリには記憶がありません — フィルタを変更してみてください","lessons.tabFailure":"失敗教訓","lessons.tabPlan":"プラン記録","lessons.tabFreeform":"ノート","lessons.totalRecalls":"合計呼出回数","lessons.stepsLabel":"ステップ","lessons.commitsCount":"{count} コミット","lessons.unstructured":"(構造化フィールドなし — 元のメモリを参照)","lessons.searchPlaceholder":"検索 error / root cause / fix / 名前…","lessons.allProjects":"すべてのプロジェクト","lessons.showing":"{visible} / {total} 件を表示","lessons.noMatch":"「{query}」に一致する記憶なし","lessons.emptyCategory":"このカテゴリには記憶がありません","lessons.moreItems":"あと {count} 件","roadmap.title":"プロジェクトロードマップ","roadmap.summary":"{count} 件の記憶 · {first} → {last}","roadmap.switchToList":"↩ リスト表示","roadmap.switchToRoadmap":"🗺️ ロードマップ表示","roadmap.emptyProject":"このプロジェクトにはまだ記憶がありません。","loop.label":"メモリループ","loop.subtitleHas":"過去 7 日間に呼び出された知識メモリ","loop.subtitleNone":"今週はまだ呼び出された知識がありません — 教訓を呼び出してみてください","loop.approxNote":"近似値 — 完全な追跡はアップグレード後に開始","loop.sparkLabel":"過去 30 日","roadmap.milestones":"マイルストーン","roadmap.keyLessons":"重要な教訓","radar.title":"知識カバレッジレーダー","radar.caption":"有効な知識メモリ (session と commit を除く)","radar.axis.lessons":"教訓","radar.axis.decisions":"決定","radar.axis.patterns":"パターン","radar.axis.bugs":"バグ修正","radar.axis.processes":"プロセス","radar.axis.architecture":"アーキテクチャ","ageMatrix.title":"メモリ年齢分布","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"色の濃さ = メモリ密度","ageMatrix.typeColumn":"タイプ","header.signalModeOn":"シグナル","header.signalModeOff":"すべて","header.signalModeOnHint":"session と commit のノイズを非表示。クリックで全表示。","header.signalModeOffHint":"session と commit を含む全メモリを表示中。クリックでノイズを非表示。","roadmap.phases":"フェーズ","onboarding.title":"MeMesh へようこそ","onboarding.body":"メモリは空です。30 件のキュレーション済みツアーで始めるか、最初の教訓を記録してください。","onboarding.llmHint":"LLM は不要です。すべての機能は FTS5 のみで動作します。LLM は自動レッスン生成のオプションで、後から設定で有効化できます。","onboarding.seedButton":"デモツアーを開始","onboarding.seedingButton":"読み込み中…","onboarding.seedHint":"端末を開かずに 30 件追加。後でいつでも削除可能","onboarding.cliReference":"CLI を使う場合","onboarding.hintDemo":"30 件のデモメモリを投入(後で削除可)","onboarding.hintReset":"metadata.demo タグの全エンティティを削除","onboarding.resetButton":"デモを削除","onboarding.resettingButton":"削除中…","onboarding.resetConfirm":"デモメモリをすべて削除しますか?自分で保存したものは残ります。","onboarding.dismiss":"閉じる","common.serverError":"サーバーがエラーを返しました(HTTP {status})。もう一度お試しください。繰り返す場合は `memesh doctor` を実行してください。","emptyLibrary.title":"メモリは空です","emptyLibrary.body":"まだ何も保存されていません。30 件のデモツアーを読み込めば MeMesh の動きをすぐ確認できます(後で一括削除可)。","browse.truncated":"全 {total} 件のうち先頭 {shown} 件を表示中 — 残りは検索やフィルタで絞り込んでください","lessons.capNote":"先頭 {limit} 件のレッスンのみ読み込み済み — 上の集計はこの範囲のみです","lessons.emptyGuide":"レッスンはまだありません。Smart Mode ならセッション失敗の分析時に自動保存されます。アシスタントに記録を頼むこともできます。","graph.cappedNote":"全 {total} 件のうち上位 {shown} 件のみ表示中(想起回数順)。グラフの動作を軽く保つためです。","settings.testStoredKeyHint":"空欄のままテストすると保存済みのキーを使用します。","ageMatrix.bucket.week":"今週","ageMatrix.bucket.month":"今月","ageMatrix.bucket.quarter":"今四半期","ageMatrix.bucket.older":"それ以前","settings.behaviourTitle":"動作設定","settings.autoUpdateLabel":"自動更新ポリシー","settings.autoUpdateOff":"オフ — 手動のみ","settings.autoUpdatePatch":"Patch — X.Y.Z+1 を自動適用","settings.autoUpdateMinor":"Minor — X.Y+1.0 を自動適用","settings.autoUpdateMajor":"Major — 任意のバンプを自動適用","settings.autoUpdateHint":"セッション終了後にトリガー。MEMESH_AUTO_UPDATE 環境変数が優先。","errors.timeout":"リクエストがタイムアウトしました","type.lesson_learned":"教訓","type.lesson":"教訓","type.mistake":"ミス","type.decision":"決定","type.architecture_decision":"アーキ決定","type.design_decision":"デザイン決定","type.pattern":"パターン","type.technical_pattern":"技術パターン","type.best_practice":"ベストプラクティス","type.bug_fix":"バグ修正","type.verification_result":"検証結果","type.test_result":"テスト結果","type.process":"プロセス","type.architecture":"アーキテクチャ","type.infrastructure":"インフラ","type.feature":"機能","type.release":"リリース","type.refactoring":"リファクタリング","type.commit":"コミット","type.session_keypoint":"セッション要点","type.session_identity":"セッション識別","type.session-insight":"セッション洞察","type.session-summary":"セッション要約","type.session-identity":"セッション識別","type.weekly_summary":"週次まとめ","type.weekly-summary":"週次まとめ","type.note":"ノート","type.plan":"計画","type.knowledge":"知識","type.workflow_checkpoint":"ワークフロー","type.concept":"概念","type.tool":"ツール","type.person":"人物","relation.relates_to":"関連","relation.related-to":"関連","relation.depends_on":"依存","relation.implements":"実装","relation.learned_from":"由来","relation.supersedes":"置き換え","relation.contradicts":"矛盾","relation.follows":"後続","relation.belongs-to-project":"プロジェクト所属","relation.co-created":"共同作成","relation.shares-name-tokens":"名称類似","patterns.day.0":"日曜","patterns.day.1":"月曜","patterns.day.2":"火曜","patterns.day.3":"水曜","patterns.day.4":"木曜","patterns.day.5":"金曜","patterns.day.6":"土曜","telemetry.flow.dreamer":"週次まとめ(dreamer)","telemetry.flow.pattern_detector":"パターン検出","telemetry.flow.digest_validator":"ダイジェスト検証","telemetry.flow.auto_tagger":"自動タグ付け","telemetry.flow.failure_analyzer":"失敗分析","telemetry.flow.transcript_extractor":"会話ログ抽出","telemetry.flow.conflict_judge":"競合判定","telemetry.errorClass.auth":"認証拒否","telemetry.errorClass.rate_limit":"レート制限","telemetry.errorClass.upstream":"プロバイダ障害","telemetry.errorClass.bad_request":"不正なリクエスト","telemetry.errorClass.network":"ネットワーク","telemetry.errorClass.parse":"応答解析不能","telemetry.errorClass.unknown":"不明","lessons.severity.critical":"致命的","lessons.severity.major":"重大","lessons.severity.minor":"軽微","memory.tooltip.project":"プロジェクト","memory.tooltip.recalled":"{count} 回呼び出されました","memory.tooltip.hasRelations":"{count} 件の記憶とリンク","memory.tooltip.createdAt":"作成: {date}","graph.drift":"鮮度","graph.driftHint":"古さで色分け:赤=長く未使用、緑=最近使用","common.unknown":"不明","insights.entitiesCount":"{n} 件のエンティティ","roadmap.viewToggle":"ロードマップ表示","roadmap.viewTree":"ツリー","roadmap.viewMindmap":"マインドマップ","roadmap.mindmapNeedsPhases":"マインドマップには 7 日以内の記憶が 3 件以上必要です。","roadmap.activePhase":"進行中","roadmap.entryCount":"{count} 件","roadmap.entriesCount":"{count} 件","roadmap.otherGroup":"その他({count})","roadmap.lowSignalHidden":"(低シグナル {count} 件を非表示)","roadmap.resetHint":"ズームと位置をリセット(背景をダブルクリックでも可)","roadmap.zoomHint":"スクロールでズーム · ドラッグでパン · {pct}%","roadmap.moreEntities":"他 {count} 件","nav.ariaLabel":"ダッシュボードのセクション","feedback.descLabel":"フィードバックの内容","graph.canvasA11y":"ナレッジグラフ(キャンバス描画):エンティティ {entities} 件、関係 {relations} 件、未接続 {orphans} 件。上部の種類フィルターと検索で非視覚的に閲覧できます。"},ko:{"auth.title":"인증 필요","auth.intro":"이 대시보드는 bearer 토큰으로 보호됩니다. 아래에 MEMESH_REMOTE_TOKEN 값(또는 <memeshDir>/remote-token 파일의 내용)을 붙여넣으세요.","auth.tokenLabel":"토큰","auth.empty":"토큰을 입력하세요.","auth.invalid":"이 토큰은 승인되지 않았습니다. 확인 후 다시 시도해 주세요.","auth.submit":"대시보드 잠금 해제","auth.tokenPlaceholder":"여기에 토큰을 붙여넣으세요","brand.subtitle":"powered by pcircle.com","header.connected":"연결됨","header.disconnected":"연결 끊김","header.connecting":"연결 중…","header.memories":"개의 기억","tab.insights":"Insights","telemetry.title":"LLM 활동","telemetry.lastNDays":"최근 {n}일","telemetry.loading":"불러오는 중…","telemetry.empty":"이 기간에는 아직 AI 활동이 없습니다. 백그라운드 AI 기능(주간 요약, 자동 태깅 등)이 실행되면 여기에 자동으로 기록이 나타납니다.","telemetry.callsCount":"{n} 회 호출","telemetry.attemptsCount":"{n} 회 시도","telemetry.successRate":"성공률","telemetry.medianLatency":"지연 시간 중앙값","telemetry.fallbackUsed":"fallback {n}회 사용 (호출의 {pct})","telemetry.byProvider":"프로바이더별","telemetry.byModel":"모델별","telemetry.byProject":"프로젝트별","telemetry.errors":"오류","insights.title":"memesh가 한 일","insights.subtitle":"자동 생성된 weekly recap과 발견된 pattern. 검토 대기 중","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"전체","insights.refresh":"새로고침","insights.loading":"불러오는 중…","insights.emptyPending":"pending insight가 없습니다. `memesh dream run`으로 weekly recap을 생성할 수 있습니다.","insights.emptyNoLlm":"weekly recap과 pattern 감지를 사용하려면 설정에서 LLM 프로바이더를 구성하세요.","insights.emptyOther":"데이터가 없습니다.","insights.sources":"소스","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"자세히 보기","insights.collapse":"접기","insights.accept":"채택","insights.applying":"적용 중…","insights.reject":"거부","insights.generatedBy":"생성 모델","insights.promptVersion":"Prompt 버전","insights.observations":"요약 관찰","insights.tags":"태그","insights.sourceIds":"소스 entity","insights.validationWarnings":"의심스러운 주장 (LLM validator)","insights.validationClaim":"주장","insights.validationReason":"이유","insights.runDream":"weekly recap 실행","insights.runDreamWithValidate":"validator 포함 실행 (느리지만 품질 높음)","banner.pendingInsights":"{n}개의 새 insight가 검토를 기다리고 있습니다 →","banner.dismiss":"닫기","banner.viewAll":"전체 보기","pattern.title":"Pattern","pattern.evidenceCount":"{n}개의 증거","pattern.severity":"심각도","pattern.severity.high":"높음","pattern.severity.medium":"중간","pattern.severity.low":"낮음","pattern.description":"Pattern 설명","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.hint":"이름, 내용, 태그로 검색합니다. 정확히 일치하는 단어와 의미가 비슷한 내용을 모두 찾습니다.","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":"개의 보관된 기억","browse.archiveFailed":"보관하지 못했습니다: {message}","browse.restoreFailed":"복원하지 못했습니다: {message}","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.entityMeta":"{type} · 신뢰도 {confidence}% · {days}일 미사용","settings.capabilities":"기능 상태","settings.smartMode":"스마트 모드","settings.core":"기본","settings.embeddings":"임베딩","settings.llmProvider":"LLM 제공자","settings.llmOptional.title":"LLM은 선택 사항입니다","settings.llmOptional.body":"memesh는 LLM 없이도 작동합니다. 기본 코어 모드는 전체 텍스트 회상, 수동 remember/recall, 대시보드, 훅 기반 세션 캡처를 모두 지원합니다.","settings.llmOptional.coreLabel":"LLM 없이(코어 모드)","settings.llmOptional.coreFeatures":"FTS5 키워드 검색, 수동 remember/recall, 대시보드, 훅 기반 세션 캡처","settings.llmOptional.smartLabel":"LLM 사용(스마트 모드)","settings.llmOptional.smartFeatures":"세션 실패에서 lesson_learned 자동 추출, 새 엔티티 자동 태깅, 주간 요약과 패턴 감지","settings.apiKey":"API 키","settings.fallbacks.title":"대체 제공자","settings.fallbacks.explainer":"기본 제공자를 사용할 수 없을 때, memesh는 이 목록을 순서대로 시도하여 작동하는 것을 사용합니다.","settings.fallbacks.privacyTitle":"개인정보 안내","settings.fallbacks.privacyBody":"클라우드 제공자(OpenAI 또는 Anthropic)를 추가하면, 기본 제공자가 중단되었을 때 (비공개일 수 있는) 메모리 내용이 해당 클라우드 제공자로 전송됩니다. 개인정보를 위해 로컬 제공자를 사용한다면, 이 점을 이해한 후에만 클라우드 대체를 추가하세요.","settings.fallbacks.empty":"아직 대체 제공자가 없습니다.","settings.fallbacks.add":"대체 제공자 추가","settings.fallbacks.providerLabel":"제공자","settings.fallbacks.modelLabel":"모델(선택)","settings.fallbacks.modelPlaceholder":"예: gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"키가 저장되어 있습니다. 비워 두면 유지됩니다.","settings.fallbacks.remove":"제거","settings.fallbacks.moveUp":"위로","settings.fallbacks.moveDown":"아래로","settings.fallbacks.priority":"우선순위 {n}","settings.fallbacks.save":"대체 순서 저장","settings.fallbacks.needsKey":"API 키를 입력하세요. 그렇지 않으면 이 클라우드 대체를 사용할 수 없습니다.","settings.model":"모델 (선택)","settings.save":"저장","settings.saving":"저장 중…","settings.saved":"저장되었습니다","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"연결 테스트","settings.testing":"테스트 중…","settings.testPassed":"✓ 연결 성공 · 사용 가능한 모델 {count}개","settings.testFailed":"연결 테스트 실패","settings.suggested":"추천","settings.testRequired":"저장하기 전에 연결을 테스트하세요","settings.language":"언어","settings.searchMode":"검색 모드","settings.none":"없음","settings.updates":"업데이트","settings.updateChecking":"업데이트 확인 중…","settings.updateUnavailable":"지금은 업데이트를 확인할 수 없습니다","settings.updateNoSuccessfulChecks":"아직 성공한 업데이트 확인 기록이 없습니다","settings.upToDate":"최신 버전입니다","settings.updateAvailable":"업데이트가 있습니다","settings.updateStale":"표시 중인 캐시 상태가 오래되었을 수 있습니다","settings.updateCachedFallback":"마지막으로 성공한 캐시 결과를 사용 중입니다","settings.updateDeprecatedNoTarget":"사용 중단됨 — 아직 업그레이드 대상이 없음","settings.updateDeprecatedTitle":"⚠️ MeMesh {version}이(가) 메인테이너에 의해 사용 중단(DEPRECATED)으로 표시되었습니다.","settings.updatePartialTitle":"⚠️ 업데이트 확인이 부분적으로 실패했습니다","settings.updatePartialDescription":"{message}. 이 세션에서는 사용 중단 상태를 확인할 수 없습니다 — 온라인 상태에서 다시 실행하세요.","settings.updatePartialSummary":"부분 확인됨 — 사용 중단 상태 미확인","settings.updateDeprecatedTargetUnknown":"사용 중단됨 — 업그레이드 대상 확인 중","settings.currentVersion":"현재 버전","settings.latestVersion":"최신 버전","settings.lastChecked":"마지막 확인","settings.lastAttempted":"마지막 확인 시도","settings.lastSuccessful":"마지막 성공 확인","settings.updateSourceFresh":"방금 확인함","settings.updateSourceCached":"캐시된 결과 사용","settings.updateSourceStale":"오래된 캐시 결과 사용","settings.updateSourceUnavailable":"사용 가능한 캐시 없음","settings.updateCommand":"업데이트 명령","settings.checkNow":"지금 확인","settings.updateLastError":"마지막 확인 오류: {message}","settings.installMethod":"설치 방식","settings.installNpmGlobal":"npm 전역 설치","settings.installNpmLocal":"프로젝트 로컬 패키지 설치","settings.installSourceCheckout":"소스 체크아웃","settings.installUnknown":"알 수 없음","settings.updateGuidanceNpmGlobal":"이 설치는 MeMesh에서 직접 업데이트할 수 있습니다.","settings.updateGuidanceNpmLocal":"이 패키지를 설치한 프로젝트의 패키지 관리자에서 업데이트하세요.","settings.updateGuidanceSourceCheckout":"이 소스 체크아웃은 저장소에서 업데이트한 뒤 다시 빌드하세요.","settings.updateGuidanceUnknown":"MeMesh를 설치한 도구나 작업 흐름으로 이 설치를 업데이트하세요.","graph.entities":"엔티티","graph.relations":"관계","graph.orphans":"고립 노드","graph.search":"노드 검색…","graph.matches":"개 일치","graph.focusMode":"포커스","graph.showAll":"모두 표시","graph.clickHint":"노드를 클릭하여 포커스","graph.interactHint":"노드 클릭으로 포커스 · 빈 영역 드래그로 이동 · 스크롤로 확대/축소","graph.resetView":"뷰 재설정","graph.resetViewHint":"확대/축소 및 위치 재설정","graph.ageToday":"오늘","graph.ageDaysAgo":"{count}일 전","graph.ageWeeksAgo":"{count}주 전","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 열기","feedback.submitting":"진단 정보 수집 중…","doctorBanner.warnTitleSoft":"memesh 설정 안내가 있습니다","doctorBanner.failTitle":"memesh 설정이 완전하지 않습니다","doctorBanner.dismiss":"닫기","doctorBanner.getHelp":"도움 받기","doctorBanner.helpHint":"진단 정보가 미리 입력된 GitHub Issue를 엽니다","doctorBanner.preambleForIssue":"memesh doctor가 내 설치에서 다음을 발견했습니다:","doctorBanner.moreCount":"…외 {n}건 — 전체 목록은 `memesh doctor`로 확인하세요","doctor.label.readme_locale_parity":"README 번역","doctor.label.config":"설정 파일","doctor.label.mcp-config":"MCP 연결 파일","doctor.label.hooks-config":"훅 정의","doctor.label.hook-scripts":"훅 스크립트","doctor.label.hook-wiring":"Claude Code 연결","doctor.label.hook-activity":"자동 기록","doctor.label.node-runtime":"Node.js 버전","doctor.label.native-binding":"SQLite 및 벡터 검색","doctor.label.shell-cli":"터미널 명령어","doctor.label.dashboard":"대시보드 파일","doctor.label.update-status":"업데이트","doctor.label.http-probe":"로컬 서버","doctor.label.skills-manifest":"번들 파일","doctor.label.config_parse":"설정 파일","doctor.label.embeddings_probe":"의미 기반 검색","doctor.label.llm_probe":"AI 제공자","doctor.label.install-channel":"설치 방법","doctor.label.fts_segmentation":"키워드 색인","doctor.label.vector_index":"검색 색인","doctor.label.database":"데이터베이스","doctor.msg.readme-parity.unreadable.summary":"README.md를 읽을 수 없습니다: {detail}","doctor.msg.readme-parity.drift.summary":"일부 번역본 README가 영어판과 어긋났습니다: {detail}","doctor.msg.readme-parity.drift.fix":"나열된 README를 README.md에 맞춰 다시 정리하세요.","doctor.msg.config.invalid-json.summary":"{path}의 설정 파일이 올바른 JSON이 아니라서 무시되고 있습니다.","doctor.msg.config.invalid-json.fix":"{path}를 고치거나 삭제한 뒤 `memesh config list`로 불러와지는지 확인하세요.","doctor.msg.mcp-config.missing.summary":"memesh를 Claude Code에 연결하는 파일(.mcp.json)이 없습니다.","doctor.msg.mcp-config.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json이 손상되어(올바른 JSON이 아님) Claude Code가 읽을 수 없습니다.","doctor.msg.mcp-config.invalid-json.fix":"{path}를 고치거나 MeMesh를 다시 설치하세요.","doctor.msg.mcp-config.no-entry.summary":".mcp.json에 memesh 서버 항목이 더 이상 없습니다.","doctor.msg.mcp-config.no-entry.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json`이 실행하려는 파일이 이 설치에 없어서 Claude Code 안의 모든 memesh 도구가 시작되지 않습니다.","doctor.msg.mcp-config.entry-missing.fix":"MeMesh를 다시 설치하세요. `.mcp.json`을 직접 고쳤다면 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`로 되돌리세요.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json이 없어서 자동 기억 저장이 동작하지 않습니다.","doctor.msg.hooks-config.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json이 손상되었습니다(올바른 JSON이 아님).","doctor.msg.hooks-config.invalid-json.fix":"{path}를 고치거나 MeMesh를 다시 설치하세요.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json에 다음 훅 유형이 없습니다: {types}. 일부 자동 기록이 실행되지 않습니다.","doctor.msg.hooks-config.missing-types.fix":"기본 제공 훅 구성을 복원하거나 MeMesh를 다시 설치하세요.","doctor.msg.hook-scripts.none.summary":"훅 설정에 스크립트가 하나도 없어서 아무것도 자동으로 기록되지 않습니다.","doctor.msg.hook-scripts.none.fix":"MeMesh를 다시 설치하세요.","doctor.msg.hook-scripts.missing.summary":"다음 훅 스크립트가 없습니다: {files}","doctor.msg.hook-scripts.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.hook-scripts.not-executable.summary":"다음 훅 스크립트는 있지만 실행 권한이 없습니다: {files}","doctor.msg.hook-scripts.not-executable.fix":"`chmod +x scripts/hooks/*.js`를 실행하세요. 소스 설치라면 `npm run build`를 실행하세요.","doctor.msg.hook-wiring.no-marker.summary":"memesh가 아직 Claude Code에 연결되지 않아 아무것도 자동으로 기억되지 않습니다.","doctor.msg.hook-wiring.no-marker.fix":"`memesh install-hooks`를 한 번 실행한 뒤 `memesh doctor`로 확인하세요.","doctor.msg.hook-wiring.script-missing.summary":"연결된 memesh 훅이 {path}를 가리키지만 이 파일은 더 이상 존재하지 않습니다 — 에이전트가 해당 이벤트마다 없는 파일을 호출합니다. 보통 훅을 은퇴시킨 업그레이드가 남긴 잔재입니다.","doctor.msg.hook-wiring.script-missing.fix":"`memesh install-hooks`를 실행해 다시 연결하고(은퇴한 항목은 제거됩니다) 에이전트를 재시작하세요.","doctor.msg.hook-wiring.marker-unreadable.summary":"{path}의 연결 기록을 읽을 수 없습니다.","doctor.msg.hook-wiring.marker-unreadable.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.marker-malformed.summary":"연결 기록이 손상되었습니다.","doctor.msg.hook-wiring.marker-malformed.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 설정 파일({path})이 사라져 연결이 끊어졌습니다.","doctor.msg.hook-wiring.settings-missing.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.settings-invalid.summary":"{path}가 손상되었습니다(올바른 JSON이 아님).","doctor.msg.hook-wiring.settings-invalid.fix":"백업에서 복원하거나 `memesh install-hooks`로 다시 만드세요.","doctor.msg.hook-wiring.entries-removed.summary":"{path}에서 memesh 항목이 제거되어 연결이 끊어졌습니다.","doctor.msg.hook-wiring.entries-removed.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.root-moved.summary":"연결이 가리키는 {path}가 더 이상 존재하지 않습니다(memesh가 옮겨졌을 수 있음).","doctor.msg.hook-wiring.root-moved.fix":"`memesh install-hooks`를 실행해 갱신하세요.","doctor.msg.hook-activity.never-ran.summary":"추적을 시작한 뒤 {hours}시간 동안 캡처 훅이 한 번도 실행되지 않았습니다. 훅 연결은 정상이므로 실행되어야 할 것이 돌지 않고 있고, 아무것도 기억되지 않고 있습니다.","doctor.msg.hook-activity.never-ran.fix":"작업 세션을 한 번 마친 뒤 `memesh doctor`를 다시 실행하세요. 여전히 훅이 실행되지 않았다고 나오면 `memesh install-hooks`를 실행하고 에이전트를 재시작하세요.","doctor.msg.hook-activity.stale.summary":"마지막 캡처 훅 실행은 약 {hours}시간 전입니다({hook}). 그 뒤로 작업했다면 캡처가 멈춘 것이며 해당 세션의 내용은 저장되지 않았습니다.","doctor.msg.hook-activity.stale.fix":"에이전트를 재시작하고 세션을 한 번 마친 뒤 `memesh doctor`를 다시 실행하세요. 회복되지 않으면 `memesh install-hooks`를 실행하세요.","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary 훅이 마지막으로 실행된 것은 약 {hours}시간 전이고, 지난 3일간 Claude Code의 쓰기도 없었습니다. 이 머신이 다른 에이전트(Codex / Gemini)로 옮겨갔다면 정상입니다. 여기서 아직 Claude Code를 쓰고 있다면 캡처가 멈춘 것입니다.","doctor.msg.hook-activity.stale-unconfirmed.fix":"이 머신에서 아직 Claude Code를 쓴다면: 재시작하고 세션을 한 번 끝낸 뒤 `memesh doctor`를 다시 실행하세요. 회복되지 않으면 `memesh install-hooks`를 실행하세요.","doctor.msg.hook-activity.query-failed.summary":'데이터베이스에서 훅 활동을 읽지 못했습니다: {detail}. 캡처 상태는 "알 수 없음"이며 이는 "정상"과 다릅니다.',"doctor.msg.hook-activity.query-failed.fix":"`memesh doctor --verbose`로 전체 오류를 확인하고 ~/.memesh를 읽을 수 있는지, 디스크가 가득 차지 않았는지 확인하세요.","doctor.msg.hook-activity.stale-unknown.summary":'{hook} 훅의 마지막 실행 시각을 읽을 수 없습니다(데이터 손상, 또는 시계가 어긋난 머신이 기록했을 수 있음). 캡처 상태는 "알 수 없음"이며, 이는 "정상"과 같지 않습니다.',"doctor.msg.hook-activity.stale-unknown.fix":"작업 세션을 한 번 끝낸 뒤 `memesh doctor`를 다시 실행하세요. 새 실행이 잘못된 타임스탬프를 덮어씁니다.","doctor.msg.hook-activity.disabled.summary":"자동 캡처가 꺼져 있습니다(MEMESH_AUTO_CAPTURE 또는 설정의 autoCapture). 의도된 설정이므로 훅이 조용한 것은 예상된 동작입니다. 다시 켜면 캡처가 재개됩니다.","doctor.msg.hook-activity.disabled-env.summary":"이 shell 환경의 MEMESH_AUTO_CAPTURE=false 때문에 자동 캡처가 꺼져 있습니다. doctor는 자신의 환경만 볼 수 있습니다 — 에이전트가 이 변수 없이 실행 중이라면 그쪽 캡처는 영향을 받지 않습니다.","doctor.msg.hook-activity.not-wired.summary":"캡처 훅이 한 번도 실행되지 않았습니다 — 그리고 이 머신에는 캡처 훅(Stop / PostToolUse / PreCompact)이 연결된 것이 확인되지 않아, 실행될 것이 애초에 없습니다.","doctor.msg.hook-activity.not-wired.fix":"자동 캡처를 원하면 `memesh install-hooks`를 실행하세요. MCP 전용 설치(Codex / Gemini)라면 정상이며 무시해도 됩니다.","doctor.msg.hook-activity.stop-silent.summary":"{hook} 훅은 기록되고 있지만, 추적을 시작한 지 {hours}시간 동안 session-summary 훅은 한 번도 실행되지 않았습니다. 커밋 캡처에 가려져 세션 캡처가 고장 났을 수 있습니다.","doctor.msg.hook-activity.stop-silent.fix":"작업 세션을 한 번 끝내고 `memesh doctor`를 다시 실행하세요. 그래도 session-summary가 실행되지 않았다면 `memesh install-hooks`를 실행하고 에이전트를 재시작하세요.","doctor.msg.hook-activity.never-ran-legacy.summary":"하트비트를 기록한 훅은 없지만 추적 시작 이후 {captured}개의 자동 캡처 기억이 저장되었습니다. 하트비트 기능 이전의 구버전 훅이 아직 실행 중일 가능성이 높습니다.","doctor.msg.hook-activity.never-ran-legacy.fix":"memesh 훅을 현재 버전으로 업데이트하고(플러그인: `/plugin update memesh`, npm: `memesh install-hooks`) 에이전트를 재시작하세요.","doctor.msg.node-runtime.too-old.summary":"사용 중인 Node.js가 이 패키지가 지원하는 버전보다 오래되었습니다. {detail}","doctor.msg.node-runtime.too-old.fix":"Node.js를 {required} 이상으로 올린 뒤 `memesh doctor`를 다시 실행하세요.","doctor.msg.native-binding.node-too-old.summary":"이 Node 버전에 들어 있는 SQLite는 memesh에 너무 오래되어 의미로 검색하는 부분을 불러오지 못합니다. 완전한 버전은 Node 22.13부터입니다.","doctor.msg.native-binding.node-too-old.fix":"Node를 22.13 이상으로 올린 뒤 `memesh doctor`를 다시 실행하세요.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec가 설치되어 있지 않습니다. 기억은 그대로 저장되고 키워드로 찾을 수 있지만, 의미 기반 검색은 꺼집니다.","doctor.msg.native-binding.not-installed.fix":"@pcircle/memesh를 쓰는 폴더에서 `npm install`을 실행하세요.","doctor.msg.native-binding.load-failed.summary":"sqlite-vec를 불러오지 못했습니다: {detail}. 검색은 키워드만 사용합니다.","doctor.msg.native-binding.load-failed.fix":'실행: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"터미널에서 `memesh` 명령어를 쓸 수 없습니다. Claude Code 기능은 그대로 동작합니다 — 직접 `memesh`를 입력할 때만 영향이 있습니다.","doctor.msg.shell-cli.not-on-path.fix":"`npm install -g @pcircle/memesh`를 실행해 추가하세요. 두 설치는 같은 기억을 공유합니다.","doctor.msg.dashboard.missing.summary":"대시보드 파일이 없습니다.","doctor.msg.dashboard.missing.fix":"`cd dashboard && npm install && npm run build`로 만드세요.","doctor.msg.update-status.no-cache.summary":"memesh가 아직 새 버전 확인에 성공하지 못했습니다.","doctor.msg.update-status.no-cache.fix":"인터넷이 되는 상태에서 `memesh status`를 한 번 실행하세요. 결과가 저장되고 이 알림이 사라집니다.","doctor.msg.update-status.deprecated.summary":"버전 {version}은 제작자가 철회했습니다: {detail}","doctor.msg.update-status.deprecated.fix":"지금 바로 업데이트하세요 — `memesh update`를 실행하세요(또는 설치 방법에 맞게 업그레이드).","doctor.msg.update-status.deprecation-unknown.summary":"버전 {version}이 여전히 안전하게 쓸 수 있는지 확인하지 못했습니다: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"인터넷이 되는 상태에서 `memesh status`를 실행해 다시 시도하세요.","doctor.msg.update-status.update-available.summary":"새 버전이 있습니다: {latest} (현재 {current}).","doctor.msg.update-status.update-available.fix":"`memesh update`를 실행해 업그레이드하세요.","doctor.msg.update-status.stale.summary":"버전 {version}은 최신이지만 업데이트 정보가 오래되었습니다.","doctor.msg.update-status.stale.fix":"인터넷이 되는 상태에서 `memesh status`를 실행해 새로 고치세요.","doctor.msg.http-probe.bad-status.summary":"{url}의 로컬 서버가 오류로 응답했습니다(HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"`memesh serve`로 재시작하고 로그를 확인하세요.","doctor.msg.http-probe.no-server.summary":"{url}에서 실행 중인 로컬 서버가 없습니다.","doctor.msg.http-probe.no-server.fix":"대시보드를 쓰려면 `memesh serve`로 하나 시작하세요.","doctor.msg.skills-manifest.missing-dev.summary":"파일 무결성 목록을 찾을 수 없습니다(소스 코드에서 실행 중이면 정상입니다).","doctor.msg.skills-manifest.missing-dev.fix":"`npm run build`를 실행해 생성하세요.","doctor.msg.skills-manifest.unreadable.summary":"파일 무결성 목록을 읽을 수 없습니다({detail}).","doctor.msg.skills-manifest.unreadable.fix":"재설치: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"파일 무결성 목록이 비어 있습니다.","doctor.msg.skills-manifest.empty.fix":"재설치: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"일부 번들 파일이 배포된 내용과 일치하지 않습니다: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"재설치: `npm install -g @pcircle/memesh`. 새로 설치해도 또 생기면 보안 문제로 신고해 주세요.","doctor.msg.config-parse.not-object.summary":"{path}의 설정 파일이 예상 형식이 아니라서 모든 설정이 무시되고 있습니다.","doctor.msg.config-parse.not-object.fix":"{path}를 고치거나 삭제한 뒤 `memesh doctor`를 다시 실행하세요.","doctor.msg.config-parse.unreadable.summary":"{path}의 설정 파일을 읽을 수 없어({detail}) 모든 설정이 무시되고 있습니다.","doctor.msg.config-parse.unreadable.fix":"파일을 고치거나 일단 치워 두세요: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'의미 기반 검색이 "{provider}"로 설정되어 있지만 테스트에서 아무 결과도 나오지 않았습니다. 키워드 검색은 그대로 동작합니다.',"doctor.msg.embeddings.empty.fix":"자세한 내용은 `memesh doctor --probe`를 실행하거나 제공자 연결을 확인하세요.","doctor.msg.embeddings.threw.summary":'의미 기반 검색이 "{provider}"로 설정되어 있지만 테스트에 실패했습니다: {detail}. 키워드 검색은 그대로 동작합니다.',"doctor.msg.embeddings.threw.fix":"임베딩 제공자에 연결할 수 있는지 확인하거나(예: `ollama serve` 실행), embedder 설정을 제거해 키워드 전용 검색으로 전환하세요.","doctor.msg.llm.unreachable.summary":"AI 제공자({provider})가 응답하지 않았습니다: {detail}. AI 기능이 조용히 아무 일도 하지 않고 있습니다.","doctor.msg.llm.unreachable.fix":"API key와 연결을 확인한 뒤 `memesh doctor --probe`를 다시 실행하세요.","doctor.msg.llm.threw.summary":"AI 제공자({provider}) 테스트에 실패했습니다: {detail}. AI 기능이 조용히 아무 일도 하지 않고 있습니다.","doctor.msg.llm.threw.fix":"API key와 연결을 확인한 뒤 `memesh doctor --probe`를 다시 실행하세요.","doctor.msg.install-channel.unknown.summary":"memesh가 어떻게 설치되었는지 알 수 없습니다.","doctor.msg.install-channel.unknown.fix":"소스 체크아웃이라면 저장소 루트에서 실행하세요. 아니라면 `npm install -g @pcircle/memesh`로 다시 설치하세요.","doctor.msg.fts.unsegmented.summary":"키워드 색인에 옛 형식 항목이 {count}개 있습니다 — 일부 기억은 전체 원문이 정확히 일치해야만 검색됩니다.","doctor.msg.fts.unsegmented.fix":"`memesh reindex --fts`를 실행해 색인을 다시 만드세요.","doctor.msg.vector-index.stale.summary":"검색 색인을 다시 만들어야 합니다(검색 설정이 바뀌었습니다).","doctor.msg.vector-index.stale.fix":"`memesh reindex`를 실행해 다시 만드세요.","doctor.msg.database.broken.summary":"데이터베이스를 사용할 수 없습니다: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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":"아직 리콜 데이터가 없습니다. 다음 세션 후 추적이 시작됩니다.","recall.summary":"{used}개 사용 / {total}개 주입","analytics.loadFailed":"분석 데이터를 불러오지 못했습니다.","memory.noContent":"(내용 없음)","memory.archivedBadge":"보관됨","memory.factsCount":"사실 {count}개","common.error":"오류","common.serverUnreachable":"memesh 서버에 연결할 수 없습니다.","common.serverUnreachableAction":"`memesh serve`가 실행 중인지 확인한 뒤 이 페이지를 새로고침하세요.","common.responseUnreadable":"서버가 응답했지만 이 페이지가 내용을 읽을 수 없습니다. 대시보드와 서버 버전이 다를 수 있습니다.","common.responseUnreadableAction":"페이지를 새로고침하세요. 계속되면 `memesh doctor`를 실행하세요.","pm.title":"PM 지표","pm.decisionsPerWeek":"결정/주","pm.openDecisions":"미해결 결정(14일 초과)","pm.orphanRate":"연결되지 않은 메모리","pm.relationsTotal":"관계 총수","pm.stalePlans":"30일 이상 검토되지 않은 계획 {count}건","common.loading":"로딩 중…","common.noData":"데이터 없음","errors.unknown":"알 수 없는 오류","insights.noPreview":"이 제안에는 요약 텍스트가 없습니다","httpError.auth.missing-bearer":"이 서버는 액세스 토큰이 필요합니다. 토큰을 입력해 주세요.","httpError.auth.invalid-token":"액세스 토큰이 올바르지 않습니다. 확인 후 다시 시도해 주세요.","httpError.auth.not-configured":"서버에 액세스 토큰이 설정되어 있지 않습니다. `memesh serve`를 다시 시작하고 출력을 확인하세요.","httpError.validation.bad-body":"페이지가 보낸 요청을 서버가 읽을 수 없습니다. 페이지를 새로고침한 뒤 다시 시도하세요.","httpError.validation.bad-param":"요청의 일부 값이 올바르지 않습니다. 페이지를 새로고침한 뒤 다시 시도하세요.","httpError.route.retired":"서버가 더 이상 이 동작을 지원하지 않습니다. 페이지와 서버 버전이 다를 수 있습니다. 페이지를 새로고침하세요.","httpError.route.not-found":"서버가 이 요청을 인식하지 못합니다. 페이지와 서버 버전이 다를 수 있습니다. 페이지를 새로고침하세요.","httpError.resource.not-found":"해당 항목이 더 이상 존재하지 않습니다. 목록을 새로고침하세요.","httpError.payload.too-large":"전송한 데이터가 너무 큽니다(1 MB 초과). 더 작게 나눠서 시도하세요.","httpError.operation.failed":"서버가 이 작업을 완료하지 못했습니다.","httpError.llm.not-configured":"AI 제공업체가 설정되어 있지 않습니다. 먼저 설정에서 추가하세요.","httpError.rate.limited":"짧은 시간에 요청이 너무 많습니다. 잠시 후 다시 시도하세요.","httpError.server.internal":"서버에서 예기치 않은 오류가 발생했습니다.","settings.testError.auth":"API 키가 거부되었습니다. 키를 확인하고 다시 시도하세요.","settings.testError.network":"제공업체에 연결할 수 없습니다. 네트워크 연결을 확인하세요.","settings.testError.no_models":"제공업체가 응답했지만 사용 가능한 모델을 반환하지 않았습니다.","settings.testError.bad_host":"Ollama 주소는 이 컴퓨터(localhost)여야 합니다.","settings.testError.http":"제공업체가 오류를 반환했습니다 (HTTP {status}).","settings.testError.unknown":"알 수 없는 이유로 테스트에 실패했습니다.","time.justNow":"방금","time.hoursAgo":"{count}시간 전","time.today":"오늘","time.yesterday":"어제","time.daysAgo":"{count}일 전","time.lastWeek":"지난주","time.weeksAgo":"{count}주 전","time.lastMonth":"지난달","time.monthsAgo":"{count}개월 전","memory.access.frequent":"자주 사용 · {count}회","memory.access.recalls":"{count}회 회상","memory.access.never":"회상 안 됨","cluster.knowledge":"지식","cluster.activity":"활동","cluster.session":"세션","cluster.reference":"참조","cluster.all":"전체","browse.filterCategory":"카테고리","browse.filterTime":"시간","browse.filterValue":"가치","browse.filterProject":"프로젝트","browse.filterSort":"정렬","browse.timeToday":"오늘","browse.timeWeek":"이번 주","browse.timeMonth":"이번 달","browse.timeOlder":"이전","browse.valueRecalled":"✓ 사용됨","browse.valueNever":"회상 안 됨","browse.sortMostRecalled":"자주 회상","browse.sortRecent":"최근 사용","browse.sortCreated":"생성 시간","browse.emptyFilter":"이 카테고리에 기억이 없습니다 — 필터를 변경해 보세요","lessons.tabFailure":"실패 교훈","lessons.tabPlan":"계획 기록","lessons.tabFreeform":"메모","lessons.totalRecalls":"총 회상 횟수","lessons.stepsLabel":"단계","lessons.commitsCount":"{count}개 커밋","lessons.unstructured":"(구조화된 필드 없음 — 원본 기억 참조)","lessons.searchPlaceholder":"error / root cause / fix / 이름 검색…","lessons.allProjects":"모든 프로젝트","lessons.showing":"{visible} / {total}개 표시","lessons.noMatch":'"{query}"와 일치하는 기억 없음',"lessons.emptyCategory":"이 카테고리에 기억이 없습니다","lessons.moreItems":"+{count}개","roadmap.title":"프로젝트 로드맵","roadmap.summary":"{count}개 기억 · {first} → {last}","roadmap.switchToList":"↩ 목록 보기","roadmap.switchToRoadmap":"🗺️ 로드맵 보기","roadmap.emptyProject":"이 프로젝트에는 아직 기억이 없습니다.","loop.label":"기억 루프","loop.subtitleHas":"지난 7일간 회상된 지식 기억","loop.subtitleNone":"이번 주 회상된 지식이 없습니다 — 교훈을 떠올려 보세요","loop.approxNote":"근사치 — 완전한 추적은 업그레이드 후 시작됩니다","loop.sparkLabel":"지난 30일","roadmap.milestones":"마일스톤","roadmap.keyLessons":"주요 교훈","radar.title":"지식 커버리지 레이더","radar.caption":"활성 지식 기억 (session 과 commit 제외)","radar.axis.lessons":"교훈","radar.axis.decisions":"결정","radar.axis.patterns":"패턴","radar.axis.bugs":"버그 수정","radar.axis.processes":"프로세스","radar.axis.architecture":"아키텍처","ageMatrix.title":"기억 연령 분포","ageMatrix.low":"낮음","ageMatrix.high":"높음","ageMatrix.legend":"색상 깊이 = 기억 밀도","ageMatrix.typeColumn":"유형","header.signalModeOn":"시그널","header.signalModeOff":"전체","header.signalModeOnHint":"session 과 commit 노이즈 숨김. 클릭하면 모두 표시.","header.signalModeOffHint":"session 과 commit 을 포함한 모든 기억 표시. 클릭하면 노이즈 숨김.","roadmap.phases":"단계","onboarding.title":"MeMesh 에 오신 것을 환영합니다","onboarding.body":"기억 저장소가 비어 있습니다. 30개 큐레이션된 투어로 시작하거나 첫 교훈을 저장하세요.","onboarding.llmHint":"LLM 불필요. 모든 기능은 FTS5만으로 작동합니다. LLM은 자동 교훈 생성을 위한 선택 사항이며, 나중에 설정에서 활성화할 수 있습니다.","onboarding.seedButton":"데모 투어 시작","onboarding.seedingButton":"시드 중…","onboarding.seedHint":"터미널 없이 여기서 30개 추가, 나중에 한 번에 삭제 가능","onboarding.cliReference":"CLI 를 선호하시나요?","onboarding.hintDemo":"30개 데모 기억을 시드(나중에 제거 가능)","onboarding.hintReset":"metadata.demo 태그가 있는 모든 항목 제거","onboarding.resetButton":"데모 제거","onboarding.resettingButton":"제거 중…","onboarding.resetConfirm":"모든 데모 기억을 제거하시겠습니까? 직접 저장한 항목은 유지됩니다.","onboarding.dismiss":"닫기","common.serverError":"서버가 오류를 반환했습니다 (HTTP {status}). 다시 시도해 보세요. 계속되면 `memesh doctor`를 실행하세요.","emptyLibrary.title":"메모리가 비어 있습니다","emptyLibrary.body":"아직 저장된 것이 없습니다. 30개 데모 투어를 불러와 MeMesh의 동작을 바로 확인해 보세요. 나중에 한 번에 삭제할 수 있습니다.","browse.truncated":"전체 {total}개 중 처음 {shown}개 표시 중 — 나머지는 검색이나 필터로 찾아보세요","lessons.capNote":"처음 {limit}개의 교훈만 불러왔습니다 — 위 통계는 이 범위만 반영합니다","lessons.emptyGuide":"아직 교훈이 없습니다. Smart Mode에서는 세션 실패를 분석할 때 자동으로 저장됩니다. 어시스턴트에게 기록을 부탁할 수도 있습니다.","graph.cappedNote":"전체 {total}개 중 상위 {shown}개만 표시 중(회상 횟수순). 그래프 반응성을 위해서입니다.","settings.testStoredKeyHint":"입력란을 비워 두면 저장된 키로 테스트합니다.","ageMatrix.bucket.week":"이번 주","ageMatrix.bucket.month":"이번 달","ageMatrix.bucket.quarter":"이번 분기","ageMatrix.bucket.older":"이전","settings.behaviourTitle":"동작 설정","settings.autoUpdateLabel":"자동 업데이트 정책","settings.autoUpdateOff":"끔 — 수동만","settings.autoUpdatePatch":"Patch — X.Y.Z+1 자동 적용","settings.autoUpdateMinor":"Minor — X.Y+1.0 자동 적용","settings.autoUpdateMajor":"Major — 모든 버전 변경 자동 적용","settings.autoUpdateHint":"세션 종료 후 트리거. MEMESH_AUTO_UPDATE 환경 변수가 우선.","errors.timeout":"요청 시간이 초과되었습니다","type.lesson_learned":"교훈","type.lesson":"교훈","type.mistake":"실수","type.decision":"결정","type.architecture_decision":"아키 결정","type.design_decision":"디자인 결정","type.pattern":"패턴","type.technical_pattern":"기술 패턴","type.best_practice":"베스트 프랙티스","type.bug_fix":"버그 수정","type.verification_result":"검증 결과","type.test_result":"테스트 결과","type.process":"프로세스","type.architecture":"아키텍처","type.infrastructure":"인프라","type.feature":"기능","type.release":"릴리스","type.refactoring":"리팩터링","type.commit":"커밋","type.session_keypoint":"세션 요점","type.session_identity":"세션 정체성","type.session-insight":"세션 인사이트","type.session-summary":"세션 요약","type.session-identity":"세션 정체성","type.weekly_summary":"주간 요약","type.weekly-summary":"주간 요약","type.note":"노트","type.plan":"계획","type.knowledge":"지식","type.workflow_checkpoint":"워크플로 마일스톤","type.concept":"개념","type.tool":"도구","type.person":"인물","relation.relates_to":"관련","relation.related-to":"관련","relation.depends_on":"의존","relation.implements":"구현","relation.learned_from":"학습 출처","relation.supersedes":"대체","relation.contradicts":"모순","relation.follows":"후속","relation.belongs-to-project":"프로젝트 소속","relation.co-created":"공동 생성","relation.shares-name-tokens":"이름 유사","patterns.day.0":"일요일","patterns.day.1":"월요일","patterns.day.2":"화요일","patterns.day.3":"수요일","patterns.day.4":"목요일","patterns.day.5":"금요일","patterns.day.6":"토요일","telemetry.flow.dreamer":"주간 요약 (dreamer)","telemetry.flow.pattern_detector":"패턴 감지","telemetry.flow.digest_validator":"다이제스트 검증","telemetry.flow.auto_tagger":"자동 태깅","telemetry.flow.failure_analyzer":"실패 분석","telemetry.flow.transcript_extractor":"대화 기록 추출","telemetry.flow.conflict_judge":"충돌 판정","telemetry.errorClass.auth":"인증 거부","telemetry.errorClass.rate_limit":"요청 제한","telemetry.errorClass.upstream":"제공자 장애","telemetry.errorClass.bad_request":"잘못된 요청","telemetry.errorClass.network":"네트워크","telemetry.errorClass.parse":"응답 해석 불가","telemetry.errorClass.unknown":"알 수 없음","lessons.severity.critical":"치명적","lessons.severity.major":"중대","lessons.severity.minor":"경미","memory.tooltip.project":"프로젝트","memory.tooltip.recalled":"{count}회 회상됨","memory.tooltip.hasRelations":"{count}개 기억과 연결됨","memory.tooltip.createdAt":"생성: {date}","graph.drift":"신선도","graph.driftHint":"오래된 정도로 색상 표시: 빨강=오래됨, 초록=최근 사용","common.unknown":"알 수 없음","insights.entitiesCount":"엔터티 {n}개","roadmap.viewToggle":"로드맵 보기","roadmap.viewTree":"트리","roadmap.viewMindmap":"마인드맵","roadmap.mindmapNeedsPhases":"마인드맵에는 7일 이내의 기억이 3개 이상 필요합니다.","roadmap.activePhase":"진행 중","roadmap.entryCount":"{count}개","roadmap.entriesCount":"{count}개","roadmap.otherGroup":"기타 ({count})","roadmap.lowSignalHidden":"(저신호 {count}개 숨김)","roadmap.resetHint":"확대/축소 및 위치 재설정 (배경 더블 클릭도 가능)","roadmap.zoomHint":"스크롤로 확대/축소 · 드래그로 이동 · {pct}%","roadmap.moreEntities":"외 {count}개","nav.ariaLabel":"대시보드 섹션","feedback.descLabel":"피드백 내용","graph.canvasA11y":"지식 그래프(캔버스): 엔터티 {entities}개, 관계 {relations}개, 미연결 {orphans}개. 위의 유형 필터와 검색으로 비시각적으로 볼 수 있습니다."},pt:{"auth.title":"Autenticação necessária","auth.intro":"Este painel é protegido por um token bearer. Cole o valor de MEMESH_REMOTE_TOKEN (ou o conteúdo de <memeshDir>/remote-token) abaixo.","auth.tokenLabel":"Token","auth.empty":"O token não pode estar vazio.","auth.invalid":"Esse token não foi aceito. Verifique e tente novamente.","auth.submit":"Desbloquear painel","auth.tokenPlaceholder":"cole o token aqui","brand.subtitle":"powered by pcircle.com","header.connected":"Conectado","header.disconnected":"Desconectado","header.connecting":"Conectando…","header.memories":"memórias","tab.insights":"Insights","telemetry.title":"Atividade do LLM","telemetry.lastNDays":"últimos {n}d","telemetry.loading":"carregando…","telemetry.empty":"Ainda não há atividade de IA neste período. As linhas aparecem automaticamente quando os recursos de IA em segundo plano (como resumos semanais e marcação automática) são executados.","telemetry.callsCount":"{n} chamadas","telemetry.attemptsCount":"{n} tentativas","telemetry.successRate":"sucesso","telemetry.medianLatency":"latência mediana","telemetry.fallbackUsed":"fallback usado {n}× ({pct} das chamadas)","telemetry.byProvider":"por provedor","telemetry.byModel":"por modelo","telemetry.byProject":"por projeto","telemetry.errors":"erros","insights.title":"O que o memesh fez por você","insights.subtitle":"recaps semanais e patterns gerados automaticamente, aguardando revisão","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"Todos","insights.refresh":"Atualizar","insights.loading":"carregando…","insights.emptyPending":"Nenhum insight pending. Execute `memesh dream run` para gerar weekly recaps.","insights.emptyNoLlm":"Configure um provedor de LLM nas Configurações para habilitar weekly recaps e detecção de patterns.","insights.emptyOther":"Nada aqui.","insights.sources":"fontes","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"Ver detalhes","insights.collapse":"Recolher","insights.accept":"Aceitar","insights.applying":"Aplicando…","insights.reject":"Rejeitar","insights.generatedBy":"Gerado por","insights.promptVersion":"Versão do prompt","insights.observations":"Observações resumidas","insights.tags":"Tags","insights.sourceIds":"Fontes","insights.validationWarnings":"Afirmações sinalizadas (LLM validator)","insights.validationClaim":"Afirmação","insights.validationReason":"Motivo","insights.runDream":"Executar weekly recap","insights.runDreamWithValidate":"Executar com validator (mais lento, maior qualidade)","banner.pendingInsights":"{n} novo(s) insight{s} aguardando sua revisão →","banner.dismiss":"Dispensar","banner.viewAll":"Ver todos","pattern.title":"Pattern","pattern.evidenceCount":"{n} evidência(s)","pattern.severity":"Severidade","pattern.severity.high":"alta","pattern.severity.medium":"média","pattern.severity.low":"baixa","pattern.description":"Descrição do pattern","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.hint":"Pesquise por nome, conteúdo ou etiquetas. Encontra palavras exatas e significados próximos.","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","browse.archiveFailed":"Não foi possível arquivar a memória: {message}","browse.restoreFailed":"Não foi possível restaurar a memória: {message}","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.entityMeta":"{type} · confiança {confidence}% · {days}d sem uso","settings.capabilities":"Capacidades","settings.smartMode":"Modo Inteligente","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Provedor LLM","settings.llmOptional.title":"O LLM é opcional","settings.llmOptional.body":"memesh funciona sem LLM. O modo Core padrão cobre busca textual, remember/recall manual, dashboard e captura de sessão via hooks.","settings.llmOptional.coreLabel":"Sem LLM (modo Core)","settings.llmOptional.coreFeatures":"busca por palavra-chave FTS5, remember/recall manual, dashboard, captura de sessão via hooks","settings.llmOptional.smartLabel":"Com LLM (modo Smart)","settings.llmOptional.smartFeatures":"lesson_learned automático a partir de falhas de sessão, auto-tag de novas entidades, resumo semanal + detecção de padrões","settings.apiKey":"Chave API","settings.fallbacks.title":"Provedores de reserva","settings.fallbacks.explainer":"Se o seu provedor principal estiver indisponível, o memesh tenta estes em ordem até um funcionar.","settings.fallbacks.privacyTitle":"Nota de privacidade","settings.fallbacks.privacyBody":"Adicionar um provedor de nuvem (OpenAI ou Anthropic) significa que, quando o provedor principal estiver fora do ar, o conteúdo da sua memória — que pode ser privado — é enviado para esse provedor de nuvem. Se você usa um provedor local por privacidade, adicione uma reserva de nuvem apenas se aceitar essa troca.","settings.fallbacks.empty":"Nenhum provedor de reserva ainda.","settings.fallbacks.add":"Adicionar provedor de reserva","settings.fallbacks.providerLabel":"Provedor","settings.fallbacks.modelLabel":"Modelo (opcional)","settings.fallbacks.modelPlaceholder":"ex.: gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"Uma chave está salva. Deixe em branco para mantê-la.","settings.fallbacks.remove":"Remover","settings.fallbacks.moveUp":"Mover para cima","settings.fallbacks.moveDown":"Mover para baixo","settings.fallbacks.priority":"Prioridade {n}","settings.fallbacks.save":"Salvar cadeia de reserva","settings.fallbacks.needsKey":"Insira uma chave de API, ou esta reserva de nuvem não poderá ser usada.","settings.model":"Modelo (opcional)","settings.save":"Salvar","settings.saving":"Salvando…","settings.saved":"Salvo.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Testar","settings.testing":"Testando…","settings.testPassed":"✓ Conexão OK · {count} modelos disponíveis","settings.testFailed":"Falha no teste de conexão","settings.suggested":"sugerido","settings.testRequired":"Teste a conexão antes de salvar","settings.language":"Idioma","settings.searchMode":"Modo de busca","settings.none":"Nenhum","settings.updates":"Atualizações","settings.updateChecking":"Verificando atualizações…","settings.updateUnavailable":"Não foi possível verificar atualizações agora","settings.updateNoSuccessfulChecks":"Ainda não há verificações de atualização bem-sucedidas","settings.upToDate":"Está na versão mais recente","settings.updateAvailable":"Atualização disponível","settings.updateStale":"O status em cache pode estar desatualizado","settings.updateCachedFallback":"Usando o último resultado em cache com sucesso","settings.updateDeprecatedNoTarget":"Obsoleto — sem destino de atualização ainda","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} foi marcado como OBSOLETO pelos mantenedores.","settings.updatePartialTitle":"⚠️ Verificação de atualização parcial","settings.updatePartialDescription":"{message}. O status de obsolescência é desconhecido nesta sessão — execute a verificação novamente quando estiver online.","settings.updatePartialSummary":"Parcial — status de obsolescência desconhecido","settings.updateDeprecatedTargetUnknown":"Obsoleto — verificando destino de atualização","settings.currentVersion":"Versão atual","settings.latestVersion":"Versão mais recente","settings.lastChecked":"Última verificação","settings.lastAttempted":"Última tentativa de verificação","settings.lastSuccessful":"Última verificação bem-sucedida","settings.updateSourceFresh":"Verificação atual","settings.updateSourceCached":"Usando resultado em cache","settings.updateSourceStale":"Usando resultado em cache desatualizado","settings.updateSourceUnavailable":"Sem resultado em cache","settings.updateCommand":"Comando de atualização","settings.checkNow":"Verificar agora","settings.updateLastError":"Erro na última verificação: {message}","settings.installMethod":"Forma de instalação","settings.installNpmGlobal":"instalação global via npm","settings.installNpmLocal":"instalação local do projeto","settings.installSourceCheckout":"checkout do código-fonte","settings.installUnknown":"desconhecida","settings.updateGuidanceNpmGlobal":"Esta instalação pode ser atualizada diretamente pelo MeMesh.","settings.updateGuidanceNpmLocal":"Atualize esta instalação pelo gerenciador de pacotes do projeto que instalou o MeMesh.","settings.updateGuidanceSourceCheckout":"Atualize este checkout pelo repositório de código-fonte e faça o build novamente.","settings.updateGuidanceUnknown":"Atualize esta instalação com a ferramenta ou fluxo que instalou o MeMesh.","graph.entities":"Entidades","graph.relations":"Relações","graph.orphans":"Isoladas","graph.search":"Buscar nós…","graph.matches":"correspondências","graph.focusMode":"Foco","graph.showAll":"Mostrar tudo","graph.clickHint":"Clique em um nó para focar","graph.interactHint":"Clique num nó para focar · arraste área vazia para deslocar · role para zoom","graph.resetView":"Redefinir vista","graph.resetViewHint":"Redefinir zoom e posição","graph.ageToday":"hoje","graph.ageDaysAgo":"há {count}d","graph.ageWeeksAgo":"há {count} sem","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","feedback.submitting":"Coletando diagnóstico…","doctorBanner.warnTitleSoft":"memesh tem notas de configuração","doctorBanner.failTitle":"A configuração do memesh está incompleta","doctorBanner.dismiss":"Fechar","doctorBanner.getHelp":"Obter ajuda","doctorBanner.helpHint":"Abre um GitHub issue com o diagnóstico pré-preenchido","doctorBanner.preambleForIssue":"O memesh doctor relatou o seguinte na minha instalação:","doctorBanner.moreCount":"…e mais {n} — execute `memesh doctor` para a lista completa","doctor.label.readme_locale_parity":"Traduções do README","doctor.label.config":"Arquivo de configuração","doctor.label.mcp-config":"Arquivo de conexão MCP","doctor.label.hooks-config":"Definições de hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Conexão com o Claude Code","doctor.label.hook-activity":"Captura automática","doctor.label.node-runtime":"Versão do Node.js","doctor.label.native-binding":"SQLite e busca vetorial","doctor.label.shell-cli":"Comando no terminal","doctor.label.dashboard":"Arquivos do painel","doctor.label.update-status":"Atualizações","doctor.label.http-probe":"Servidor local","doctor.label.skills-manifest":"Arquivos incluídos","doctor.label.config_parse":"Arquivo de configuração","doctor.label.embeddings_probe":"Busca por significado","doctor.label.llm_probe":"Provedor de IA","doctor.label.install-channel":"Método de instalação","doctor.label.fts_segmentation":"Índice de palavras-chave","doctor.label.vector_index":"Índice de busca","doctor.label.database":"Banco de dados","doctor.msg.readme-parity.unreadable.summary":"Não foi possível ler o README.md: {detail}","doctor.msg.readme-parity.drift.summary":"Alguns READMEs traduzidos ficaram fora de sincronia com o inglês: {detail}","doctor.msg.readme-parity.drift.fix":"Realinhe os READMEs listados com o README.md.","doctor.msg.config.invalid-json.summary":"O arquivo de configuração em {path} não é um JSON válido e está sendo ignorado.","doctor.msg.config.invalid-json.fix":"Corrija ou apague {path} e depois execute `memesh config list` para confirmar que ele carrega.","doctor.msg.mcp-config.missing.summary":"O arquivo que conecta o memesh ao Claude Code (.mcp.json) está faltando.","doctor.msg.mcp-config.missing.fix":"Reinstale o MeMesh para restaurá-lo.","doctor.msg.mcp-config.invalid-json.summary":"O .mcp.json está danificado (não é um JSON válido) e o Claude Code não consegue lê-lo.","doctor.msg.mcp-config.invalid-json.fix":"Corrija {path} ou reinstale o MeMesh.","doctor.msg.mcp-config.no-entry.summary":"O .mcp.json não contém mais a entrada do servidor memesh.","doctor.msg.mcp-config.no-entry.fix":"Reinstale o MeMesh para restaurá-la.","doctor.msg.mcp-config.entry-missing.summary":"O `.mcp.json` inicia um arquivo que não existe nesta instalação, então nenhuma ferramenta do memesh dentro do Claude Code consegue iniciar.","doctor.msg.mcp-config.entry-missing.fix":"Reinstale o MeMesh. Se você editou o `.mcp.json` à mão, aponte-o de volta para `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.hooks-config.missing.summary":"O hooks/hooks.json está faltando, então a captura automática de memória não funciona.","doctor.msg.hooks-config.missing.fix":"Reinstale o MeMesh para restaurá-lo.","doctor.msg.hooks-config.invalid-json.summary":"O hooks/hooks.json está danificado (não é um JSON válido).","doctor.msg.hooks-config.invalid-json.fix":"Corrija {path} ou reinstale o MeMesh.","doctor.msg.hooks-config.missing-types.summary":"O hooks/hooks.json não tem estes tipos de hook: {types}. Parte da captura automática não vai rodar.","doctor.msg.hooks-config.missing-types.fix":"Restaure a configuração de hooks original ou reinstale o MeMesh.","doctor.msg.hook-scripts.none.summary":"A configuração de hooks não tem nenhum script, então nada pode ser capturado automaticamente.","doctor.msg.hook-scripts.none.fix":"Reinstale o MeMesh.","doctor.msg.hook-scripts.missing.summary":"Estes scripts de hook estão faltando: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstale o MeMesh para restaurá-los.","doctor.msg.hook-scripts.not-executable.summary":"Estes scripts de hook existem, mas não têm permissão para executar: {files}","doctor.msg.hook-scripts.not-executable.fix":"Execute `chmod +x scripts/hooks/*.js`, ou `npm run build` se estiver usando o código-fonte.","doctor.msg.hook-wiring.no-marker.summary":"O memesh ainda não está conectado ao Claude Code, então nada é lembrado automaticamente.","doctor.msg.hook-wiring.no-marker.fix":"Execute `memesh install-hooks` uma vez e depois `memesh doctor` para confirmar.","doctor.msg.hook-wiring.script-missing.summary":"Um hook memesh ligado aponta para {path}, que já não existe — o agente invoca um ficheiro inexistente em cada evento correspondente. Normalmente é resíduo de um upgrade que aposentou o hook.","doctor.msg.hook-wiring.script-missing.fix":"Execute `memesh install-hooks` para religar (remove entradas aposentadas) e reinicie o agente.","doctor.msg.hook-wiring.marker-unreadable.summary":"O registro de conexão em {path} não pode ser lido.","doctor.msg.hook-wiring.marker-unreadable.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.marker-malformed.summary":"O registro de conexão está danificado.","doctor.msg.hook-wiring.marker-malformed.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.settings-missing.summary":"O arquivo de configurações do Claude Code ({path}) sumiu, então a conexão está quebrada.","doctor.msg.hook-wiring.settings-missing.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} está danificado (não é um JSON válido).","doctor.msg.hook-wiring.settings-invalid.fix":"Restaure de um backup, ou execute `memesh install-hooks` para recriá-lo.","doctor.msg.hook-wiring.entries-removed.summary":"As entradas do memesh foram removidas de {path}, então a conexão está quebrada.","doctor.msg.hook-wiring.entries-removed.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.root-moved.summary":"A conexão aponta para {path}, que não existe mais (o memesh provavelmente foi movido).","doctor.msg.hook-wiring.root-moved.fix":"Execute `memesh install-hooks` para atualizá-la.","doctor.msg.hook-activity.never-ran.summary":"Nenhum hook de captura foi executado nas {hours} horas desde que o acompanhamento começou, mesmo com a ligação dos hooks no lugar — nada está a ser guardado.","doctor.msg.hook-activity.never-ran.fix":"Termine uma sessão de trabalho e execute `memesh doctor` outra vez. Se continuar a dizer que nenhum hook correu, execute `memesh install-hooks` e reinicie o agente.","doctor.msg.hook-activity.stale.summary":"O último hook de captura correu há cerca de {hours} horas ({hook}). Se trabalhou desde então, a captura parou e nada dessas sessões foi guardado.","doctor.msg.hook-activity.stale.fix":"Reinicie o agente, termine uma sessão e execute `memesh doctor` outra vez. Se não recuperar, execute `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"O hook session-summary executou pela última vez há cerca de {hours} horas, e nenhuma escrita do Claude Code chegou nos últimos 3 dias. Se esta máquina passou a usar outro agente (Codex / Gemini), isto é esperado; se você ainda usa Claude Code aqui, a captura parou.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Se você ainda usa Claude Code nesta máquina: reinicie-o, termine uma sessão e execute `memesh doctor` de novo. Se não recuperar, execute `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Não foi possível ler a atividade dos hooks na base de dados: {detail}. O estado da captura é desconhecido, o que não é o mesmo que saudável.","doctor.msg.hook-activity.query-failed.fix":"Execute `memesh doctor --verbose` para ver o erro completo e verifique que ~/.memesh é legível e que há espaço em disco.","doctor.msg.hook-activity.stale-unknown.summary":'O timestamp da última execução do hook {hook} não pode ser lido (corrompido, ou gravado por uma máquina com relógio errado). O estado da captura é "desconhecido", o que não é o mesmo que "saudável".',"doctor.msg.hook-activity.stale-unknown.fix":"Termine uma sessão de trabalho e execute `memesh doctor` de novo — uma execução nova sobrescreve o timestamp inválido.","doctor.msg.hook-activity.disabled.summary":"A captura automática está desligada (MEMESH_AUTO_CAPTURE ou autoCapture na configuração) — deliberadamente, então o silêncio dos hooks é esperado. Reative para voltar a capturar sessões.","doctor.msg.hook-activity.disabled-env.summary":"A captura automática está desligada por MEMESH_AUTO_CAPTURE=false no ambiente deste shell. O doctor só enxerga o próprio ambiente — se o seu agente roda sem esta variável, a captura lá não é afetada.","doctor.msg.hook-activity.not-wired.summary":"Nenhum hook de captura jamais executou — e nenhum hook de captura (Stop / PostToolUse / PreCompact) está confirmado como ligado nesta máquina, então não há nada para executar.","doctor.msg.hook-activity.not-wired.fix":"Se quiser captura automática, execute `memesh install-hooks`. Se esta instalação é só MCP (Codex / Gemini), isto é esperado e pode ser ignorado.","doctor.msg.hook-activity.stop-silent.summary":"O hook {hook} está registando, mas o hook session-summary nunca executou nas {hours} horas desde que o rastreamento começou — a captura de sessões pode estar quebrada, escondida pela captura de commits.","doctor.msg.hook-activity.stop-silent.fix":"Termine uma sessão de trabalho e execute `memesh doctor` de novo. Se o session-summary continuar sem executar, execute `memesh install-hooks` e reinicie o agente.","doctor.msg.hook-activity.never-ran-legacy.summary":"Nenhum hook registou o heartbeat, mas {captured} memórias de captura automática chegaram desde que o rastreamento começou — hooks de uma versão anterior ao rastreamento provavelmente ainda estão a executar.","doctor.msg.hook-activity.never-ran-legacy.fix":"Atualize os hooks do memesh para a versão atual (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) e reinicie o agente.","doctor.msg.node-runtime.too-old.summary":"Seu Node.js é mais antigo do que este pacote suporta. {detail}","doctor.msg.node-runtime.too-old.fix":"Atualize o Node.js para {required} ou mais novo e execute `memesh doctor` de novo.","doctor.msg.native-binding.node-too-old.summary":"O SQLite embutido nesta versão do Node é antigo demais para o memesh — ele não consegue carregar a parte que busca por significado. A versão completa chegou no Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Atualize o Node para 22.13 ou mais recente e rode `memesh doctor` de novo.","doctor.msg.native-binding.not-installed.summary":"O sqlite-vec não está instalado. As memórias continuam sendo salvas e encontradas por palavra-chave — só a busca por significado fica desligada.","doctor.msg.native-binding.not-installed.fix":"Execute `npm install` na pasta que usa o @pcircle/memesh.","doctor.msg.native-binding.load-failed.summary":"O sqlite-vec não pôde ser carregado: {detail}. A busca volta a usar só palavras-chave.","doctor.msg.native-binding.load-failed.fix":'Execute: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"O comando `memesh` não está disponível no seu terminal. Os recursos do Claude Code continuam funcionando — isso só afeta digitar `memesh` você mesmo.","doctor.msg.shell-cli.not-on-path.fix":"Execute `npm install -g @pcircle/memesh` para adicioná-lo. As duas instalações compartilham a mesma memória.","doctor.msg.dashboard.missing.summary":"Os arquivos do painel estão faltando.","doctor.msg.dashboard.missing.fix":"Gere-os com `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"O memesh ainda não conseguiu verificar se há versões mais novas.","doctor.msg.update-status.no-cache.fix":"Execute `memesh status` uma vez enquanto estiver online — isso guarda a resposta e este aviso desaparece.","doctor.msg.update-status.deprecated.summary":"A versão {version} foi retirada pelos mantenedores: {detail}","doctor.msg.update-status.deprecated.fix":"Atualize agora — execute `memesh update` (ou siga o seu método de instalação).","doctor.msg.update-status.deprecation-unknown.summary":"Não foi possível confirmar se a versão {version} ainda é segura de usar: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Execute `memesh status` online para tentar de novo.","doctor.msg.update-status.update-available.summary":"Há uma versão mais nova disponível: {latest} (você tem a {current}).","doctor.msg.update-status.update-available.fix":"Execute `memesh update` para atualizar.","doctor.msg.update-status.stale.summary":"A versão {version} está atual, mas a informação de atualização está velha.","doctor.msg.update-status.stale.fix":"Execute `memesh status` online para atualizá-la.","doctor.msg.http-probe.bad-status.summary":"O servidor local em {url} respondeu com um erro (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Reinicie-o com `memesh serve` e confira os logs.","doctor.msg.http-probe.no-server.summary":"Nenhum servidor local está rodando em {url}.","doctor.msg.http-probe.no-server.fix":"Inicie um com `memesh serve` se quiser usar o painel.","doctor.msg.skills-manifest.missing-dev.summary":"Nenhuma lista de integridade de arquivos foi encontrada (normal ao rodar a partir do código-fonte).","doctor.msg.skills-manifest.missing-dev.fix":"Execute `npm run build` para gerá-la.","doctor.msg.skills-manifest.unreadable.summary":"A lista de integridade de arquivos não pode ser lida ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Reinstale: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"A lista de integridade de arquivos está vazia.","doctor.msg.skills-manifest.empty.fix":"Reinstale: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Alguns arquivos incluídos não batem com o que foi distribuído: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Reinstale: `npm install -g @pcircle/memesh`. Se acontecer de novo em uma instalação limpa, reporte como um problema de segurança.","doctor.msg.config-parse.not-object.summary":"O arquivo de configuração em {path} não está no formato esperado, então todas as configurações estão sendo ignoradas.","doctor.msg.config-parse.not-object.fix":"Corrija ou apague {path} e depois execute `memesh doctor` de novo.","doctor.msg.config-parse.unreadable.summary":"O arquivo de configuração em {path} não pode ser lido ({detail}), então todas as configurações estão sendo ignoradas.","doctor.msg.config-parse.unreadable.fix":"Corrija o arquivo, ou deixe-o de lado: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'A busca por significado está definida como "{provider}", mas não produziu nada em um teste. A busca por palavras-chave continua funcionando.',"doctor.msg.embeddings.empty.fix":"Execute `memesh doctor --probe` para detalhes, ou verifique a conexão com o provedor.","doctor.msg.embeddings.threw.summary":'A busca por significado está definida como "{provider}", mas falhou em um teste: {detail}. A busca por palavras-chave continua funcionando.',"doctor.msg.embeddings.threw.fix":"Verifique se o provedor de embeddings está acessível (ex.: rode `ollama serve`), ou remova a config do embedder para usar busca só por palavras-chave.","doctor.msg.llm.unreachable.summary":"O provedor de IA ({provider}) não respondeu: {detail}. Os recursos de IA estão parados em silêncio.","doctor.msg.llm.unreachable.fix":"Verifique a API key e a conexão e depois execute `memesh doctor --probe` de novo.","doctor.msg.llm.threw.summary":"O teste do provedor de IA ({provider}) falhou: {detail}. Os recursos de IA estão parados em silêncio.","doctor.msg.llm.threw.fix":"Verifique a API key e a conexão e depois execute `memesh doctor --probe` de novo.","doctor.msg.install-channel.unknown.summary":"Não foi possível saber como o memesh foi instalado.","doctor.msg.install-channel.unknown.fix":"Se for um checkout do código-fonte, execute a partir da raiz do repositório; caso contrário, reinstale com `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"O índice de palavras-chave tem {count} entradas em um formato antigo — algumas memórias só aparecem com o texto completo exato.","doctor.msg.fts.unsegmented.fix":"Execute `memesh reindex --fts` para reconstruir o índice.","doctor.msg.vector-index.stale.summary":"O índice de busca precisa ser reconstruído (as configurações de busca mudaram).","doctor.msg.vector-index.stale.fix":"Execute `memesh reindex` para reconstruí-lo.","doctor.msg.database.broken.summary":"O banco de dados não está utilizável: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"{used} usadas / {total} injetadas","analytics.loadFailed":"Não foi possível carregar a análise.","memory.noContent":"(sem conteúdo)","memory.archivedBadge":"arquivada","memory.factsCount":"{count} fatos","common.error":"Erro","common.serverUnreachable":"Não foi possível conectar ao servidor memesh.","common.serverUnreachableAction":"Verifique se `memesh serve` ainda está em execução e recarregue esta página.","common.responseUnreadable":"O servidor respondeu, mas esta página não conseguiu ler a resposta — o dashboard e o servidor podem estar fora de sincronia.","common.responseUnreadableAction":"Recarregue a página. Se persistir, execute `memesh doctor`.","pm.title":"Métricas de PM","pm.decisionsPerWeek":"decisões/semana","pm.openDecisions":"decisões abertas (>14 d)","pm.orphanRate":"Memórias sem ligação","pm.relationsTotal":"total de relações","pm.stalePlans":"{count} plano(s) sem revisão há mais de 30 dias","common.loading":"Carregando…","common.noData":"Sem dados","errors.unknown":"Erro desconhecido","insights.noPreview":"Esta proposta não tem texto de resumo","httpError.auth.missing-bearer":"Este servidor exige um token de acesso. Informe o token para continuar.","httpError.auth.invalid-token":"O token de acesso não foi aceito. Verifique e tente novamente.","httpError.auth.not-configured":"O servidor não tem token de acesso configurado. Reinicie o `memesh serve` e confira a saída.","httpError.validation.bad-body":"O servidor não conseguiu ler a requisição enviada pela página. Recarregue a página e tente de novo.","httpError.validation.bad-param":"Parte da requisição não é válida. Recarregue a página e tente de novo.","httpError.route.retired":"O servidor não oferece mais esta ação — a página e o servidor podem estar em versões diferentes. Recarregue a página.","httpError.route.not-found":"O servidor não reconhece esta requisição — a página e o servidor podem estar em versões diferentes. Recarregue a página.","httpError.resource.not-found":"Esse item não existe mais. Atualize a lista.","httpError.payload.too-large":"Os dados enviados são grandes demais (mais de 1 MB). Tente lotes menores.","httpError.operation.failed":"O servidor não conseguiu concluir esta ação.","httpError.llm.not-configured":"Nenhum provedor de IA configurado. Adicione um em Configurações primeiro.","httpError.rate.limited":"Muitas solicitações em pouco tempo. Aguarde um momento e tente novamente.","httpError.server.internal":"O servidor encontrou um erro inesperado.","settings.testError.auth":"A chave de API foi rejeitada. Verifique a chave e tente novamente.","settings.testError.network":"Não foi possível alcançar o provedor. Verifique sua conexão de rede.","settings.testError.no_models":"O provedor respondeu, mas não retornou modelos utilizáveis.","settings.testError.bad_host":"O endereço do Ollama precisa estar nesta máquina (localhost).","settings.testError.http":"O provedor retornou um erro (HTTP {status}).","settings.testError.unknown":"O teste falhou por motivo desconhecido.","time.justNow":"Agora","time.hoursAgo":"Há {count}h","time.today":"Hoje","time.yesterday":"Ontem","time.daysAgo":"Há {count}d","time.lastWeek":"Semana passada","time.weeksAgo":"Há {count}sem","time.lastMonth":"Mês passado","time.monthsAgo":"Há {count}m","memory.access.frequent":"Frequente · {count} usos","memory.access.recalls":"{count} usos","memory.access.never":"Nunca usado","cluster.knowledge":"Conhecimento","cluster.activity":"Atividade","cluster.session":"Sessões","cluster.reference":"Referência","cluster.all":"Todos","browse.filterCategory":"Categoria","browse.filterTime":"Tempo","browse.filterValue":"Valor","browse.filterProject":"Projeto","browse.filterSort":"Ordenar","browse.timeToday":"Hoje","browse.timeWeek":"Esta semana","browse.timeMonth":"Este mês","browse.timeOlder":"Mais antigo","browse.valueRecalled":"✓ Usado","browse.valueNever":"Nunca usado","browse.sortMostRecalled":"Mais usado","browse.sortRecent":"Recente","browse.sortCreated":"Criado em","browse.emptyFilter":"Sem memórias nesta categoria — tente outro filtro","lessons.tabFailure":"Lições de falha","lessons.tabPlan":"Registros de plano","lessons.tabFreeform":"Notas","lessons.totalRecalls":"Total de recalls","lessons.stepsLabel":"passos","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Sem campos estruturados — ver memória bruta)","lessons.searchPlaceholder":"Buscar error / root cause / fix / nome…","lessons.allProjects":"Todos os projetos","lessons.showing":"Mostrando {visible} / {total}","lessons.noMatch":'Sem memórias correspondendo a "{query}"',"lessons.emptyCategory":"Sem memórias nesta categoria","lessons.moreItems":"+{count} mais","roadmap.title":"Roadmap do Projeto","roadmap.summary":"{count} memórias · {first} → {last}","roadmap.switchToList":"↩ Lista","roadmap.switchToRoadmap":"🗺️ Roadmap","roadmap.emptyProject":"Sem memórias neste projeto ainda.","loop.label":"Loop de memória","loop.subtitleHas":"memórias de conhecimento reutilizadas nos últimos 7 dias","loop.subtitleNone":"Nenhuma memória de conhecimento reutilizada esta semana","loop.approxNote":"Aproximação — rastreamento completo começa após atualização.","loop.sparkLabel":"Últimos 30 dias","roadmap.milestones":"Marcos","roadmap.keyLessons":"Lições principais","radar.title":"Radar de cobertura","radar.caption":"Memórias de conhecimento ativas (session e commit excluídos)","radar.axis.lessons":"Lições","radar.axis.decisions":"Decisões","radar.axis.patterns":"Padrões","radar.axis.bugs":"Correções","radar.axis.processes":"Processos","radar.axis.architecture":"Arquitetura","ageMatrix.title":"Distribuição de idade","ageMatrix.low":"Baixa","ageMatrix.high":"Alta","ageMatrix.legend":"profundidade da cor = densidade","ageMatrix.typeColumn":"Tipo","header.signalModeOn":"Sinal","header.signalModeOff":"Tudo","header.signalModeOnHint":"Ocultando ruído de session e commit. Clique para mostrar tudo.","header.signalModeOffHint":"Mostrando todas as memórias incluindo ruído. Clique para ocultar.","roadmap.phases":"Fases","onboarding.title":"Bem-vindo ao MeMesh","onboarding.body":"Seu armazenamento de memória está vazio. Comece com um tour de 30 entidades curadas ou registre sua primeira lição.","onboarding.llmHint":"LLM não é necessário. Tudo funciona apenas com FTS5. LLM é opcional para geração automática de lições — configure depois em Configurações.","onboarding.seedButton":"Experimentar o tour","onboarding.seedingButton":"Carregando…","onboarding.seedHint":"Adiciona 30 memórias aqui mesmo — sem precisar do terminal","onboarding.cliReference":"Prefere a CLI?","onboarding.hintDemo":"Insere 30 memórias de demonstração que você pode limpar depois","onboarding.hintReset":"Remove tudo marcado com metadata.demo","onboarding.resetButton":"Resetar demo","onboarding.resettingButton":"Removendo…","onboarding.resetConfirm":"Remover todas as memórias de demonstração? Suas entradas reais serão mantidas.","onboarding.dismiss":"Fechar","common.serverError":"O servidor retornou um erro (HTTP {status}). Tente novamente — se persistir, execute `memesh doctor`.","emptyLibrary.title":"Sua memória está vazia","emptyLibrary.body":"Nada foi armazenado ainda. Carregue o tour de demonstração com 30 entradas para ver o MeMesh em ação — você pode apagá-lo depois com um clique.","browse.truncated":"mostrando as primeiras {shown} de {total} memórias — use a busca ou os filtros para alcançar o restante","lessons.capNote":"mostrando as primeiras {limit} lições — as contagens acima cobrem apenas estas","lessons.emptyGuide":"Nenhuma lição ainda. No Smart Mode, o memesh salva uma automaticamente ao analisar uma falha de sessão — ou peça ao seu assistente para registrar uma.","graph.cappedNote":"Mostrando as {shown} principais de {total} entidades (mais recuperadas primeiro) para manter o grafo responsivo.","settings.testStoredKeyHint":"Deixe o campo vazio para testar a chave já salva.","ageMatrix.bucket.week":"Esta semana","ageMatrix.bucket.month":"Este mês","ageMatrix.bucket.quarter":"Este trimestre","ageMatrix.bucket.older":"Mais antigo","settings.behaviourTitle":"Comportamento","settings.autoUpdateLabel":"Política de auto-atualização","settings.autoUpdateOff":"Desligado — apenas manual","settings.autoUpdatePatch":"Patch — aplica X.Y.Z+1","settings.autoUpdateMinor":"Minor — aplica X.Y+1.0","settings.autoUpdateMajor":"Major — aplica qualquer bump","settings.autoUpdateHint":"Acionado após cada sessão. MEMESH_AUTO_UPDATE tem prioridade.","errors.timeout":"A solicitação expirou","type.lesson_learned":"Lição","type.lesson":"Lição","type.mistake":"Erro","type.decision":"Decisão","type.architecture_decision":"Decisão arq.","type.design_decision":"Decisão de design","type.pattern":"Padrão","type.technical_pattern":"Padrão técnico","type.best_practice":"Melhor prática","type.bug_fix":"Correção","type.verification_result":"Verificação","type.test_result":"Resultado de teste","type.process":"Processo","type.architecture":"Arquitetura","type.infrastructure":"Infraestrutura","type.feature":"Funcionalidade","type.release":"Lançamento","type.refactoring":"Refatoração","type.commit":"Commit","type.session_keypoint":"Ponto da sessão","type.session_identity":"Identidade da sessão","type.session-insight":"Insight da sessão","type.session-summary":"Resumo da sessão","type.session-identity":"Identidade da sessão","type.weekly_summary":"Resumo semanal","type.weekly-summary":"Resumo semanal","type.note":"Nota","type.plan":"Plano","type.knowledge":"Conhecimento","type.workflow_checkpoint":"Checkpoint","type.concept":"Conceito","type.tool":"Ferramenta","type.person":"Pessoa","relation.relates_to":"relaciona-se com","relation.related-to":"relacionado a","relation.depends_on":"depende de","relation.implements":"implementa","relation.learned_from":"aprendido de","relation.supersedes":"substitui","relation.contradicts":"contradiz","relation.follows":"segue","relation.belongs-to-project":"pertence ao projeto","relation.co-created":"cocriado","relation.shares-name-tokens":"nomes semelhantes","patterns.day.0":"domingo","patterns.day.1":"segunda","patterns.day.2":"terça","patterns.day.3":"quarta","patterns.day.4":"quinta","patterns.day.5":"sexta","patterns.day.6":"sábado","telemetry.flow.dreamer":"Resumo semanal (dreamer)","telemetry.flow.pattern_detector":"Detector de padrões","telemetry.flow.digest_validator":"Validador de resumos","telemetry.flow.auto_tagger":"Auto-tagger","telemetry.flow.failure_analyzer":"Analisador de falhas","telemetry.flow.transcript_extractor":"Minerador de transcrições","telemetry.flow.conflict_judge":"Juiz de conflitos","telemetry.errorClass.auth":"credencial rejeitada","telemetry.errorClass.rate_limit":"limite de taxa","telemetry.errorClass.upstream":"falha do provedor","telemetry.errorClass.bad_request":"requisição inválida","telemetry.errorClass.network":"rede","telemetry.errorClass.parse":"resposta ilegível","telemetry.errorClass.unknown":"desconhecido","lessons.severity.critical":"Crítico","lessons.severity.major":"Grave","lessons.severity.minor":"Menor","memory.tooltip.project":"Projeto","memory.tooltip.recalled":"Recuperado {count} vezes","memory.tooltip.hasRelations":"Ligado a {count} outras memórias","memory.tooltip.createdAt":"Criado em {date}","graph.drift":"Frescor","graph.driftHint":"Colore os nós pela idade: vermelho = antigo, verde = usado recentemente","common.unknown":"desconhecido","insights.entitiesCount":"{n} entidades","roadmap.viewToggle":"Vista do roadmap","roadmap.viewTree":"Árvore","roadmap.viewMindmap":"Mapa mental","roadmap.mindmapNeedsPhases":"O mapa mental precisa de pelo menos 3 memórias numa janela de 7 dias.","roadmap.activePhase":"ativa","roadmap.entryCount":"{count} entrada","roadmap.entriesCount":"{count} entradas","roadmap.otherGroup":"Outros ({count})","roadmap.lowSignalHidden":"({count} de baixo sinal ocultas)","roadmap.resetHint":"Redefinir zoom e posição (duplo clique no fundo também redefine)","roadmap.zoomHint":"role para zoom · arraste para mover · {pct}%","roadmap.moreEntities":"+{count} mais","nav.ariaLabel":"Seções do painel","feedback.descLabel":"Descrição do feedback","graph.canvasA11y":"Grafo de conhecimento (em canvas): {entities} entidades, {relations} relações, {orphans} sem ligação. Use os filtros de tipo e a busca acima para uma visão não visual."},fr:{"auth.title":"Authentification requise","auth.intro":"Ce tableau de bord est protégé par un jeton bearer. Collez la valeur de MEMESH_REMOTE_TOKEN (ou le contenu de <memeshDir>/remote-token) ci-dessous.","auth.tokenLabel":"Jeton","auth.empty":"Le jeton ne peut pas être vide.","auth.invalid":"Ce jeton n'a pas été accepté. Vérifiez-le et réessayez.","auth.submit":"Déverrouiller le tableau de bord","auth.tokenPlaceholder":"collez le jeton ici","brand.subtitle":"powered by pcircle.com","header.connected":"Connecté","header.disconnected":"Déconnecté","header.connecting":"Connexion…","header.memories":"mémoires","tab.insights":"Insights","telemetry.title":"Activité du LLM","telemetry.lastNDays":"{n} derniers jours","telemetry.loading":"chargement…","telemetry.empty":"Aucune activité d'IA pour cette période. Les lignes apparaissent automatiquement lorsque les fonctions d'IA en arrière-plan (résumés hebdomadaires, étiquetage automatique…) s'exécutent.","telemetry.callsCount":"{n} appels","telemetry.attemptsCount":"{n} tentatives","telemetry.successRate":"succès","telemetry.medianLatency":"latence médiane","telemetry.fallbackUsed":"fallback utilisé {n}× ({pct} des appels)","telemetry.byProvider":"par fournisseur","telemetry.byModel":"par modèle","telemetry.byProject":"par projet","telemetry.errors":"erreurs","insights.title":"Ce que memesh a fait pour vous","insights.subtitle":"recaps hebdomadaires et patterns générés automatiquement, en attente de revue","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"Tous","insights.refresh":"Actualiser","insights.loading":"chargement…","insights.emptyPending":"Aucun insight pending. Exécutez `memesh dream run` pour générer un weekly recap.","insights.emptyNoLlm":"Configurez un fournisseur LLM dans les paramètres pour activer les weekly recaps et la détection de patterns.","insights.emptyOther":"Rien ici.","insights.sources":"sources","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"Voir le détail","insights.collapse":"Réduire","insights.accept":"Accepter","insights.applying":"Application…","insights.reject":"Rejeter","insights.generatedBy":"Généré par","insights.promptVersion":"Version du prompt","insights.observations":"Observations résumées","insights.tags":"Tags","insights.sourceIds":"Sources","insights.validationWarnings":"Affirmations signalées (LLM validator)","insights.validationClaim":"Affirmation","insights.validationReason":"Raison","insights.runDream":"Lancer le weekly recap","insights.runDreamWithValidate":"Lancer avec validator (plus lent, meilleure qualité)","banner.pendingInsights":"{n} nouveau(x) insight{s} en attente de revue →","banner.dismiss":"Ignorer","banner.viewAll":"Tout voir","pattern.title":"Pattern","pattern.evidenceCount":"{n} preuve(s)","pattern.severity":"Sévérité","pattern.severity.high":"élevée","pattern.severity.medium":"moyenne","pattern.severity.low":"faible","pattern.description":"Description du pattern","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.hint":"Recherchez par nom, contenu ou étiquettes. Trouve les mots exacts et les sens proches.","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","browse.archiveFailed":"Impossible d’archiver la mémoire : {message}","browse.restoreFailed":"Impossible de restaurer la mémoire : {message}","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.entityMeta":"{type} · confiance {confidence}% · {days} j sans usage","settings.capabilities":"Capacités","settings.smartMode":"Mode intelligent","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Fournisseur LLM","settings.llmOptional.title":"Le LLM est optionnel","settings.llmOptional.body":"memesh fonctionne sans LLM. Le mode Core par défaut couvre la recherche plein texte, remember/recall manuel, le tableau de bord et la capture de session via les hooks.","settings.llmOptional.coreLabel":"Sans LLM (mode Core)","settings.llmOptional.coreFeatures":"recherche par mot-clé FTS5, remember/recall manuel, tableau de bord, capture de session via hooks","settings.llmOptional.smartLabel":"Avec LLM (mode Smart)","settings.llmOptional.smartFeatures":"lesson_learned automatique à partir des échecs de session, auto-tag des nouvelles entités, récap hebdomadaire + détection de motifs","settings.apiKey":"Clé API","settings.fallbacks.title":"Fournisseurs de secours","settings.fallbacks.explainer":"Si votre fournisseur principal est indisponible, memesh essaie ceux-ci dans l’ordre jusqu’à ce que l’un fonctionne.","settings.fallbacks.privacyTitle":"Note de confidentialité","settings.fallbacks.privacyBody":"Ajouter un fournisseur cloud (OpenAI ou Anthropic) signifie que, lorsque votre fournisseur principal est hors service, le contenu de votre mémoire — qui peut être privé — est envoyé à ce fournisseur cloud. Si vous utilisez un fournisseur local pour la confidentialité, n’ajoutez un secours cloud que si vous acceptez ce compromis.","settings.fallbacks.empty":"Aucun fournisseur de secours pour l’instant.","settings.fallbacks.add":"Ajouter un fournisseur de secours","settings.fallbacks.providerLabel":"Fournisseur","settings.fallbacks.modelLabel":"Modèle (facultatif)","settings.fallbacks.modelPlaceholder":"ex. : gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"Une clé est enregistrée. Laissez vide pour la conserver.","settings.fallbacks.remove":"Supprimer","settings.fallbacks.moveUp":"Monter","settings.fallbacks.moveDown":"Descendre","settings.fallbacks.priority":"Priorité {n}","settings.fallbacks.save":"Enregistrer la chaîne de secours","settings.fallbacks.needsKey":"Saisissez une clé API, sinon ce secours cloud ne peut pas être utilisé.","settings.model":"Modèle (optionnel)","settings.save":"Enregistrer","settings.saving":"Enregistrement…","settings.saved":"Enregistré.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Tester","settings.testing":"Test en cours…","settings.testPassed":"✓ Connexion OK · {count} modèles disponibles","settings.testFailed":"Échec du test de connexion","settings.suggested":"suggéré","settings.testRequired":"Testez la connexion avant d'enregistrer","settings.language":"Langue","settings.searchMode":"Mode de recherche","settings.none":"Aucun","settings.updates":"Mises à jour","settings.updateChecking":"Vérification des mises à jour…","settings.updateUnavailable":"Impossible de vérifier les mises à jour pour le moment","settings.updateNoSuccessfulChecks":"Aucune vérification réussie des mises à jour pour le moment","settings.upToDate":"À jour","settings.updateAvailable":"Mise à jour disponible","settings.updateStale":"L’état en cache affiché est peut-être périmé","settings.updateCachedFallback":"Utilisation du dernier résultat en cache réussi","settings.updateDeprecatedNoTarget":"Obsolète — pas encore de cible de mise à niveau","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} est marqué OBSOLÈTE par les mainteneurs.","settings.updatePartialTitle":"⚠️ Vérification de mise à jour partielle","settings.updatePartialDescription":"{message}. Le statut d'obsolescence est inconnu pour cette session — relancez la vérification une fois en ligne.","settings.updatePartialSummary":"Partielle — statut d'obsolescence inconnu","settings.updateDeprecatedTargetUnknown":"Obsolète — recherche de la cible de mise à niveau","settings.currentVersion":"Version actuelle","settings.latestVersion":"Dernière version","settings.lastChecked":"Dernière vérification","settings.lastAttempted":"Dernière tentative de vérification","settings.lastSuccessful":"Dernière vérification réussie","settings.updateSourceFresh":"Vérification en direct","settings.updateSourceCached":"Résultat en cache","settings.updateSourceStale":"Résultat en cache périmé","settings.updateSourceUnavailable":"Aucun résultat en cache","settings.updateCommand":"Commande de mise à jour","settings.checkNow":"Vérifier maintenant","settings.updateLastError":"Erreur lors de la dernière vérification : {message}","settings.installMethod":"Méthode d’installation","settings.installNpmGlobal":"installation npm globale","settings.installNpmLocal":"installation locale au projet","settings.installSourceCheckout":"checkout du dépôt source","settings.installUnknown":"inconnue","settings.updateGuidanceNpmGlobal":"Cette installation peut être mise à jour directement depuis MeMesh.","settings.updateGuidanceNpmLocal":"Mettez cette installation à jour via le gestionnaire de paquets du projet qui a installé MeMesh.","settings.updateGuidanceSourceCheckout":"Mettez ce checkout source à jour depuis son dépôt puis reconstruisez-le.","settings.updateGuidanceUnknown":"Mettez cette installation à jour avec l’outil ou le flux qui a installé MeMesh.","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","graph.interactHint":"Cliquez sur un nœud pour cibler · glissez une zone vide pour déplacer · molette pour zoomer","graph.resetView":"Réinitialiser la vue","graph.resetViewHint":"Réinitialiser zoom et position","graph.ageToday":"aujourd’hui","graph.ageDaysAgo":"il y a {count} j","graph.ageWeeksAgo":"il y a {count} sem.","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","feedback.submitting":"Collecte des diagnostics…","doctorBanner.warnTitleSoft":"memesh a quelques notes de configuration","doctorBanner.failTitle":"La configuration de memesh est incomplète","doctorBanner.dismiss":"Fermer","doctorBanner.getHelp":"Obtenir de l'aide","doctorBanner.helpHint":"Ouvre un GitHub issue avec le diagnostic pré-rempli","doctorBanner.preambleForIssue":"memesh doctor a signalé ce qui suit sur mon installation :","doctorBanner.moreCount":"…et {n} de plus — exécutez `memesh doctor` pour la liste complète","doctor.label.readme_locale_parity":"Traductions du README","doctor.label.config":"Fichier de configuration","doctor.label.mcp-config":"Fichier de connexion MCP","doctor.label.hooks-config":"Définitions des hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Connexion à Claude Code","doctor.label.hook-activity":"Capture automatique","doctor.label.node-runtime":"Version de Node.js","doctor.label.native-binding":"SQLite et recherche vectorielle","doctor.label.shell-cli":"Commande du terminal","doctor.label.dashboard":"Fichiers du tableau de bord","doctor.label.update-status":"Mises à jour","doctor.label.http-probe":"Serveur local","doctor.label.skills-manifest":"Fichiers fournis","doctor.label.config_parse":"Fichier de configuration","doctor.label.embeddings_probe":"Recherche par le sens","doctor.label.llm_probe":"Fournisseur d'IA","doctor.label.install-channel":"Méthode d'installation","doctor.label.fts_segmentation":"Index de mots-clés","doctor.label.vector_index":"Index de recherche","doctor.label.database":"Base de données","doctor.msg.readme-parity.unreadable.summary":"Impossible de lire README.md : {detail}","doctor.msg.readme-parity.drift.summary":"Certains README traduits ne sont plus alignés avec la version anglaise : {detail}","doctor.msg.readme-parity.drift.fix":"Resynchronisez les README listés avec README.md.","doctor.msg.config.invalid-json.summary":"Le fichier de configuration {path} n'est pas un JSON valide, il est donc ignoré.","doctor.msg.config.invalid-json.fix":"Corrigez ou supprimez {path}, puis exécutez `memesh config list` pour vérifier qu'il se charge.","doctor.msg.mcp-config.missing.summary":"Le fichier qui relie memesh à Claude Code (.mcp.json) est introuvable.","doctor.msg.mcp-config.missing.fix":"Réinstallez MeMesh pour le restaurer.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json est endommagé (JSON invalide), Claude Code ne peut donc pas le lire.","doctor.msg.mcp-config.invalid-json.fix":"Corrigez {path} ou réinstallez MeMesh.","doctor.msg.mcp-config.no-entry.summary":".mcp.json ne contient plus l'entrée du serveur memesh.","doctor.msg.mcp-config.no-entry.fix":"Réinstallez MeMesh pour la restaurer.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` démarre un fichier absent de cette installation, donc aucun outil memesh dans Claude Code ne peut démarrer.","doctor.msg.mcp-config.entry-missing.fix":"Réinstallez MeMesh. Si vous avez modifié `.mcp.json` à la main, refaites-le pointer vers `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json est introuvable, la capture automatique de mémoire ne peut donc pas fonctionner.","doctor.msg.hooks-config.missing.fix":"Réinstallez MeMesh pour le restaurer.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json est endommagé (JSON invalide).","doctor.msg.hooks-config.invalid-json.fix":"Corrigez {path} ou réinstallez MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json ne contient pas ces types de hooks : {types}. Une partie de la capture automatique ne fonctionnera pas.","doctor.msg.hooks-config.missing-types.fix":"Restaurez la configuration de hooks d'origine ou réinstallez MeMesh.","doctor.msg.hook-scripts.none.summary":"La configuration des hooks ne contient aucun script, rien ne peut donc être capturé automatiquement.","doctor.msg.hook-scripts.none.fix":"Réinstallez MeMesh.","doctor.msg.hook-scripts.missing.summary":"Ces scripts de hook sont introuvables : {files}","doctor.msg.hook-scripts.missing.fix":"Réinstallez MeMesh pour les restaurer.","doctor.msg.hook-scripts.not-executable.summary":"Ces scripts de hook existent mais n'ont pas le droit de s'exécuter : {files}","doctor.msg.hook-scripts.not-executable.fix":"Exécutez `chmod +x scripts/hooks/*.js`, ou `npm run build` si vous utilisez le code source.","doctor.msg.hook-wiring.no-marker.summary":"memesh n'est pas encore relié à Claude Code, rien n'est donc mémorisé automatiquement.","doctor.msg.hook-wiring.no-marker.fix":"Exécutez `memesh install-hooks` une fois, puis `memesh doctor` pour vérifier.","doctor.msg.hook-wiring.script-missing.summary":"Un hook memesh câblé pointe vers {path}, qui n'existe plus — l'agent invoque un fichier manquant à chaque événement correspondant. Généralement un résidu d'une mise à niveau qui a retiré le hook.","doctor.msg.hook-wiring.script-missing.fix":"Lancez `memesh install-hooks` pour recâbler (les entrées retirées sont supprimées), puis redémarrez l'agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"Le registre de connexion {path} est illisible.","doctor.msg.hook-wiring.marker-unreadable.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.marker-malformed.summary":"Le registre de connexion est endommagé.","doctor.msg.hook-wiring.marker-malformed.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.settings-missing.summary":"Le fichier de réglages de Claude Code ({path}) a disparu, la connexion est donc rompue.","doctor.msg.hook-wiring.settings-missing.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} est endommagé (JSON invalide).","doctor.msg.hook-wiring.settings-invalid.fix":"Restaurez-le depuis une sauvegarde, ou exécutez `memesh install-hooks` pour le recréer.","doctor.msg.hook-wiring.entries-removed.summary":"Les entrées memesh ont été retirées de {path}, la connexion est donc rompue.","doctor.msg.hook-wiring.entries-removed.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.root-moved.summary":"La connexion pointe vers {path}, qui n'existe plus (memesh a probablement été déplacé).","doctor.msg.hook-wiring.root-moved.fix":"Exécutez `memesh install-hooks` pour la mettre à jour.","doctor.msg.hook-activity.never-ran.summary":"Aucun hook de capture n'a été exécuté depuis {hours} heures, date de début du suivi, alors que le câblage des hooks est en place — rien n'est mémorisé.","doctor.msg.hook-activity.never-ran.fix":"Terminez une session de travail puis relancez `memesh doctor`. Si le message persiste, exécutez `memesh install-hooks` et redémarrez votre agent.","doctor.msg.hook-activity.stale.summary":"Le dernier hook de capture s'est exécuté il y a environ {hours} heures ({hook}). Si vous avez travaillé depuis, la capture est arrêtée et rien de ces sessions n'a été enregistré.","doctor.msg.hook-activity.stale.fix":"Redémarrez votre agent, terminez une session puis relancez `memesh doctor`. Si cela ne se rétablit pas, exécutez `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Le hook session-summary a tourné pour la dernière fois il y a environ {hours} heures, et aucune écriture Claude Code n'est arrivée depuis 3 jours non plus. Si cette machine est passée à un autre agent (Codex / Gemini), c'est attendu ; si vous utilisez encore Claude Code ici, la capture s'est arrêtée.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Si vous utilisez encore Claude Code sur cette machine : redémarrez-le, terminez une session, puis relancez `memesh doctor`. S'il ne récupère pas, lancez `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Impossible de lire l'activité des hooks dans la base de données : {detail}. L'état de la capture est inconnu, ce qui n'est pas la même chose que sain.","doctor.msg.hook-activity.query-failed.fix":"Lancez `memesh doctor --verbose` pour voir l'erreur complète, et vérifiez que ~/.memesh est lisible et que le disque n'est pas plein.","doctor.msg.hook-activity.stale-unknown.summary":"L'horodatage de la dernière exécution du hook {hook} est illisible (corrompu, ou écrit par une machine à l'horloge déréglée). L'état de la capture est « inconnu », ce qui n'est pas la même chose que « sain ».","doctor.msg.hook-activity.stale-unknown.fix":"Terminez une session de travail puis relancez `memesh doctor` — une nouvelle exécution écrase l'horodatage invalide.","doctor.msg.hook-activity.disabled.summary":"La capture automatique est désactivée (MEMESH_AUTO_CAPTURE ou autoCapture dans la configuration) — délibérément, le silence des hooks est donc attendu. Réactivez-la pour reprendre la capture.","doctor.msg.hook-activity.disabled-env.summary":"La capture automatique est désactivée par MEMESH_AUTO_CAPTURE=false dans l'environnement de ce shell. doctor ne voit que son propre environnement — si votre agent tourne sans cette variable, la capture là-bas n'est pas affectée.","doctor.msg.hook-activity.not-wired.summary":"Aucun hook de capture n'a jamais tourné — et aucun hook de capture (Stop / PostToolUse / PreCompact) n'est confirmé câblé sur cette machine, il n'y a donc rien à exécuter.","doctor.msg.hook-activity.not-wired.fix":"Pour la capture automatique, lancez `memesh install-hooks`. Si cette installation est MCP uniquement (Codex / Gemini), c'est normal et vous pouvez l'ignorer.","doctor.msg.hook-activity.stop-silent.summary":"Le hook {hook} s'enregistre, mais le hook session-summary n'a jamais tourné une seule fois en {hours} heures de suivi — la capture de session est peut-être cassée, masquée par la capture des commits.","doctor.msg.hook-activity.stop-silent.fix":"Terminez une session de travail puis relancez `memesh doctor`. Si session-summary n'a toujours pas tourné, lancez `memesh install-hooks` et redémarrez l'agent.","doctor.msg.hook-activity.never-ran-legacy.summary":"Aucun hook n'a enregistré le heartbeat, mais {captured} mémoires de capture automatique sont arrivées depuis le début du suivi — des hooks d'une version antérieure au suivi tournent probablement encore.","doctor.msg.hook-activity.never-ran-legacy.fix":"Mettez à jour les hooks memesh vers la version actuelle (plugin : `/plugin update memesh` ; npm : `memesh install-hooks`), puis redémarrez l'agent.","doctor.msg.node-runtime.too-old.summary":"Votre Node.js est plus ancien que ce que ce paquet prend en charge. {detail}","doctor.msg.node-runtime.too-old.fix":"Mettez Node.js à niveau vers {required} ou plus récent, puis relancez `memesh doctor`.","doctor.msg.native-binding.node-too-old.summary":"Le SQLite intégré à cette version de Node est trop ancien pour memesh : il ne peut pas charger la partie qui recherche par sens. La version complète est arrivée avec Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Passez à Node 22.13 ou plus récent, puis relancez `memesh doctor`.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec n'est pas installé. Les mémoires sont toujours enregistrées et retrouvées par mot-clé — seule la recherche par sens est désactivée.","doctor.msg.native-binding.not-installed.fix":"Exécutez `npm install` dans le dossier qui utilise @pcircle/memesh.","doctor.msg.native-binding.load-failed.summary":"sqlite-vec n'a pas pu être chargé : {detail}. La recherche se limite aux mots-clés.","doctor.msg.native-binding.load-failed.fix":'Exécutez : cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"La commande `memesh` n'est pas disponible dans votre terminal. Les fonctions de Claude Code continuent de marcher — cela ne concerne que la saisie de `memesh` par vous-même.","doctor.msg.shell-cli.not-on-path.fix":"Exécutez `npm install -g @pcircle/memesh` pour l'ajouter. Les deux installations partagent la même mémoire.","doctor.msg.dashboard.missing.summary":"Les fichiers du tableau de bord sont introuvables.","doctor.msg.dashboard.missing.fix":"Générez-les avec `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"memesh n'a pas encore réussi à vérifier s'il existe des versions plus récentes.","doctor.msg.update-status.no-cache.fix":"Exécutez `memesh status` une fois en ligne — la réponse est mémorisée et cet avis disparaît.","doctor.msg.update-status.deprecated.summary":"La version {version} a été retirée par ses mainteneurs : {detail}","doctor.msg.update-status.deprecated.fix":"Mettez à jour maintenant — exécutez `memesh update` (ou suivez votre méthode d'installation).","doctor.msg.update-status.deprecation-unknown.summary":"Impossible de confirmer si la version {version} est encore sûre : {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Exécutez `memesh status` en ligne pour réessayer.","doctor.msg.update-status.update-available.summary":"Une version plus récente est disponible : {latest} (vous avez {current}).","doctor.msg.update-status.update-available.fix":"Exécutez `memesh update` pour mettre à jour.","doctor.msg.update-status.stale.summary":"La version {version} est à jour, mais les informations de mise à jour sont anciennes.","doctor.msg.update-status.stale.fix":"Exécutez `memesh status` en ligne pour les rafraîchir.","doctor.msg.http-probe.bad-status.summary":"Le serveur local à {url} a répondu par une erreur (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Redémarrez-le avec `memesh serve` et consultez les journaux.","doctor.msg.http-probe.no-server.summary":"Aucun serveur local ne tourne à {url}.","doctor.msg.http-probe.no-server.fix":"Démarrez-en un avec `memesh serve` si vous voulez le tableau de bord.","doctor.msg.skills-manifest.missing-dev.summary":"Aucune liste d'intégrité des fichiers trouvée (normal quand on exécute depuis le code source).","doctor.msg.skills-manifest.missing-dev.fix":"Exécutez `npm run build` pour la générer.","doctor.msg.skills-manifest.unreadable.summary":"La liste d'intégrité des fichiers est illisible ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Réinstallez : `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"La liste d'intégrité des fichiers est vide.","doctor.msg.skills-manifest.empty.fix":"Réinstallez : `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Certains fichiers fournis ne correspondent pas à ce qui a été livré : {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Réinstallez : `npm install -g @pcircle/memesh`. Si cela se reproduit sur une installation neuve, signalez-le comme un problème de sécurité.","doctor.msg.config-parse.not-object.summary":"Le fichier de configuration {path} n'a pas le format attendu, tous les réglages sont donc ignorés.","doctor.msg.config-parse.not-object.fix":"Corrigez ou supprimez {path}, puis relancez `memesh doctor`.","doctor.msg.config-parse.unreadable.summary":"Le fichier de configuration {path} est illisible ({detail}), tous les réglages sont donc ignorés.","doctor.msg.config-parse.unreadable.fix":"Corrigez le fichier, ou mettez-le de côté : mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":"La recherche par le sens est réglée sur « {provider} » mais n'a rien produit lors d'un test. La recherche par mots-clés fonctionne toujours.","doctor.msg.embeddings.empty.fix":"Exécutez `memesh doctor --probe` pour les détails, ou vérifiez la connexion au fournisseur.","doctor.msg.embeddings.threw.summary":"La recherche par le sens est réglée sur « {provider} » mais a échoué lors d'un test : {detail}. La recherche par mots-clés fonctionne toujours.","doctor.msg.embeddings.threw.fix":"Vérifiez que le fournisseur d'embeddings est joignable (p. ex. lancez `ollama serve`), ou retirez la config embedder pour une recherche par mots-clés seule.","doctor.msg.llm.unreachable.summary":"Le fournisseur d'IA ({provider}) n'a pas répondu : {detail}. Les fonctions IA ne font silencieusement rien.","doctor.msg.llm.unreachable.fix":"Vérifiez la API key et la connexion, puis relancez `memesh doctor --probe`.","doctor.msg.llm.threw.summary":"Le test du fournisseur d'IA ({provider}) a échoué : {detail}. Les fonctions IA ne font silencieusement rien.","doctor.msg.llm.threw.fix":"Vérifiez la API key et la connexion, puis relancez `memesh doctor --probe`.","doctor.msg.install-channel.unknown.summary":"Impossible de déterminer comment memesh a été installé.","doctor.msg.install-channel.unknown.fix":"S'il s'agit du code source, exécutez depuis la racine du dépôt ; sinon réinstallez avec `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"L'index de mots-clés contient {count} entrées dans un ancien format — certaines mémoires ne se trouvent qu'avec leur texte intégral exact.","doctor.msg.fts.unsegmented.fix":"Exécutez `memesh reindex --fts` pour reconstruire l'index.","doctor.msg.vector-index.stale.summary":"L'index de recherche doit être reconstruit (les réglages de recherche ont changé).","doctor.msg.vector-index.stale.fix":"Exécutez `memesh reindex` pour le reconstruire.","doctor.msg.database.broken.summary":"La base de données est inutilisable : {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"{used} utilisées / {total} injectées","analytics.loadFailed":"Impossible de charger les analyses.","memory.noContent":"(aucun contenu)","memory.archivedBadge":"archivée","memory.factsCount":"{count} faits","common.error":"Erreur","common.serverUnreachable":"Impossible de joindre le serveur memesh.","common.serverUnreachableAction":"Vérifiez que `memesh serve` tourne encore, puis rechargez cette page.","common.responseUnreadable":"Le serveur a répondu, mais cette page n'a pas pu lire la réponse — le tableau de bord et le serveur sont peut-être désynchronisés.","common.responseUnreadableAction":"Rechargez la page. Si cela persiste, exécutez `memesh doctor`.","pm.title":"Métriques PM","pm.decisionsPerWeek":"décisions/semaine","pm.openDecisions":"décisions ouvertes (>14 j)","pm.orphanRate":"Mémoires sans lien","pm.relationsTotal":"relations au total","pm.stalePlans":"{count} plan(s) non revu(s) depuis plus de 30 jours","common.loading":"Chargement…","common.noData":"Aucune donnée","errors.unknown":"Erreur inconnue","insights.noPreview":"Cette proposition n’a pas de texte de résumé","httpError.auth.missing-bearer":"Ce serveur exige un jeton d’accès. Saisissez votre jeton pour continuer.","httpError.auth.invalid-token":"Le jeton d’accès a été refusé. Vérifiez-le et réessayez.","httpError.auth.not-configured":"Aucun jeton d’accès n’est configuré sur le serveur. Redémarrez `memesh serve` et consultez sa sortie.","httpError.validation.bad-body":"Le serveur n’a pas pu lire la requête envoyée par la page. Rechargez la page et réessayez.","httpError.validation.bad-param":"Une partie de la requête n’est pas valide. Rechargez la page et réessayez.","httpError.route.retired":"Le serveur ne prend plus en charge cette action — la page et le serveur sont peut-être de versions différentes. Rechargez la page.","httpError.route.not-found":"Le serveur ne reconnaît pas cette requête — la page et le serveur sont peut-être de versions différentes. Rechargez la page.","httpError.resource.not-found":"Cet élément n’existe plus. Actualisez la liste.","httpError.payload.too-large":"Les données envoyées sont trop volumineuses (plus de 1 Mo). Essayez par lots plus petits.","httpError.operation.failed":"Le serveur n’a pas pu terminer cette action.","httpError.llm.not-configured":"Aucun fournisseur d’IA n’est configuré. Ajoutez-en un dans les Réglages.","httpError.rate.limited":"Trop de requêtes en peu de temps. Patientez un instant et réessayez.","httpError.server.internal":"Le serveur a rencontré une erreur inattendue.","settings.testError.auth":"La clé API a été refusée. Vérifiez la clé et réessayez.","settings.testError.network":"Impossible de joindre le fournisseur. Vérifiez votre connexion réseau.","settings.testError.no_models":"Le fournisseur a répondu mais n’a renvoyé aucun modèle utilisable.","settings.testError.bad_host":"L’adresse d’Ollama doit être sur cette machine (localhost).","settings.testError.http":"Le fournisseur a renvoyé une erreur (HTTP {status}).","settings.testError.unknown":"Le test a échoué pour une raison inconnue.","time.justNow":"À l'instant","time.hoursAgo":"Il y a {count}h","time.today":"Aujourd'hui","time.yesterday":"Hier","time.daysAgo":"Il y a {count}j","time.lastWeek":"Semaine dernière","time.weeksAgo":"Il y a {count}sem","time.lastMonth":"Mois dernier","time.monthsAgo":"Il y a {count}mo","memory.access.frequent":"Fréquent · {count} rappels","memory.access.recalls":"{count} rappels","memory.access.never":"Jamais rappelé","cluster.knowledge":"Connaissance","cluster.activity":"Activité","cluster.session":"Sessions","cluster.reference":"Référence","cluster.all":"Tout","browse.filterCategory":"Catégorie","browse.filterTime":"Temps","browse.filterValue":"Valeur","browse.filterProject":"Projet","browse.filterSort":"Trier","browse.timeToday":"Aujourd'hui","browse.timeWeek":"Cette semaine","browse.timeMonth":"Ce mois-ci","browse.timeOlder":"Plus ancien","browse.valueRecalled":"✓ Utilisé","browse.valueNever":"Jamais rappelé","browse.sortMostRecalled":"Plus rappelé","browse.sortRecent":"Récent","browse.sortCreated":"Créé","browse.emptyFilter":"Aucune mémoire dans cette catégorie — essayez un autre filtre","lessons.tabFailure":"Leçons d'échec","lessons.tabPlan":"Enregistrements de plan","lessons.tabFreeform":"Notes","lessons.totalRecalls":"Rappels totaux","lessons.stepsLabel":"étapes","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Pas de champs structurés — voir mémoire brute)","lessons.searchPlaceholder":"Rechercher error / root cause / fix / nom…","lessons.allProjects":"Tous les projets","lessons.showing":"Affichage {visible} / {total}","lessons.noMatch":"Aucune mémoire correspondant à « {query} »","lessons.emptyCategory":"Aucune mémoire dans cette catégorie","lessons.moreItems":"+{count} de plus","roadmap.title":"Feuille de Route","roadmap.summary":"{count} mémoires · {first} → {last}","roadmap.switchToList":"↩ Vue Liste","roadmap.switchToRoadmap":"🗺️ Vue Roadmap","roadmap.emptyProject":"Aucune mémoire dans ce projet pour l'instant.","loop.label":"Boucle mémoire","loop.subtitleHas":"mémoires de connaissances rappelées ces 7 derniers jours","loop.subtitleNone":"Aucune mémoire rappelée cette semaine","loop.approxNote":"Approximation — suivi complet à partir de la mise à jour.","loop.sparkLabel":"30 derniers jours","roadmap.milestones":"Jalons","roadmap.keyLessons":"Leçons clés","radar.title":"Radar de couverture","radar.caption":"Mémoires actives (session et commit exclus)","radar.axis.lessons":"Leçons","radar.axis.decisions":"Décisions","radar.axis.patterns":"Patterns","radar.axis.bugs":"Bugs corrigés","radar.axis.processes":"Processus","radar.axis.architecture":"Architecture","ageMatrix.title":"Distribution par âge","ageMatrix.low":"Faible","ageMatrix.high":"Élevé","ageMatrix.legend":"profondeur = densité","ageMatrix.typeColumn":"Type","header.signalModeOn":"Signal","header.signalModeOff":"Tout","header.signalModeOnHint":"Masque le bruit session/commit. Cliquez pour tout afficher.","header.signalModeOffHint":"Affiche toutes les mémoires y compris le bruit. Cliquez pour masquer.","roadmap.phases":"Phases","onboarding.title":"Bienvenue dans MeMesh","onboarding.body":"Votre mémoire est vide. Commencez par une visite de 30 entités ou enregistrez votre première leçon.","onboarding.llmHint":"Aucun LLM requis. Tout fonctionne avec FTS5 seul. Un LLM est facultatif pour la génération automatique de leçons — configurez-le plus tard dans Paramètres.","onboarding.seedButton":"Lancer la visite démo","onboarding.seedingButton":"Chargement…","onboarding.seedHint":"Ajoute 30 mémoires ici même — pas besoin de terminal","onboarding.cliReference":"Vous préférez la CLI ?","onboarding.hintDemo":"Sème 30 mémoires de démonstration (effaçables plus tard)","onboarding.hintReset":"Supprime tout ce qui est marqué metadata.demo","onboarding.resetButton":"Réinitialiser la démo","onboarding.resettingButton":"Suppression…","onboarding.resetConfirm":"Supprimer toutes les mémoires de démo ? Vos entrées personnelles seront conservées.","onboarding.dismiss":"Fermer","common.serverError":"Le serveur a renvoyé une erreur (HTTP {status}). Réessayez — si cela persiste, exécutez `memesh doctor`.","emptyLibrary.title":"Votre mémoire est vide","emptyLibrary.body":"Rien n’est encore enregistré. Chargez la visite de démonstration (30 entrées) pour voir MeMesh en action — supprimable ensuite en un clic.","browse.truncated":"affichage des {shown} premières mémoires sur {total} — utilisez la recherche ou les filtres pour atteindre le reste","lessons.capNote":"affichage des {limit} premières leçons — les compteurs ci-dessus ne couvrent que celles-ci","lessons.emptyGuide":"Aucune leçon pour l’instant. En Smart Mode, memesh en enregistre une automatiquement lors de l’analyse d’un échec de session — ou demandez à votre assistant d’en noter une.","graph.cappedNote":"Affichage des {shown} entités les plus rappelées sur {total} pour garder le graphe fluide.","settings.testStoredKeyHint":"Laissez le champ vide pour tester la clé déjà enregistrée.","ageMatrix.bucket.week":"Cette semaine","ageMatrix.bucket.month":"Ce mois","ageMatrix.bucket.quarter":"Ce trimestre","ageMatrix.bucket.older":"Plus ancien","settings.behaviourTitle":"Comportement","settings.autoUpdateLabel":"Politique de mise à jour auto","settings.autoUpdateOff":"Désactivé — manuel uniquement","settings.autoUpdatePatch":"Patch — applique X.Y.Z+1","settings.autoUpdateMinor":"Minor — applique X.Y+1.0","settings.autoUpdateMajor":"Major — applique toute mise à jour","settings.autoUpdateHint":"Déclenché à la fin de chaque session. MEMESH_AUTO_UPDATE a priorité.","errors.timeout":"La requête a expiré","type.lesson_learned":"Leçon","type.lesson":"Leçon","type.mistake":"Erreur","type.decision":"Décision","type.architecture_decision":"Décision arch.","type.design_decision":"Décision de design","type.pattern":"Pattern","type.technical_pattern":"Pattern tech.","type.best_practice":"Bonne pratique","type.bug_fix":"Correction","type.verification_result":"Vérification","type.test_result":"Résultat de test","type.process":"Processus","type.architecture":"Architecture","type.infrastructure":"Infrastructure","type.feature":"Fonctionnalité","type.release":"Release","type.refactoring":"Refactoring","type.commit":"Commit","type.session_keypoint":"Point de session","type.session_identity":"Identité de session","type.session-insight":"Insight de session","type.session-summary":"Résumé de session","type.session-identity":"Identité de session","type.weekly_summary":"Résumé hebdo","type.weekly-summary":"Résumé hebdo","type.note":"Note","type.plan":"Plan","type.knowledge":"Connaissance","type.workflow_checkpoint":"Jalon","type.concept":"Concept","type.tool":"Outil","type.person":"Personne","relation.relates_to":"lié à","relation.related-to":"lié à","relation.depends_on":"dépend de","relation.implements":"implémente","relation.learned_from":"appris de","relation.supersedes":"remplace","relation.contradicts":"contredit","relation.follows":"suit","relation.belongs-to-project":"appartient au projet","relation.co-created":"co-créé","relation.shares-name-tokens":"noms similaires","patterns.day.0":"dimanche","patterns.day.1":"lundi","patterns.day.2":"mardi","patterns.day.3":"mercredi","patterns.day.4":"jeudi","patterns.day.5":"vendredi","patterns.day.6":"samedi","telemetry.flow.dreamer":"Récap hebdo (dreamer)","telemetry.flow.pattern_detector":"Détecteur de patterns","telemetry.flow.digest_validator":"Validateur de digest","telemetry.flow.auto_tagger":"Auto-tagger","telemetry.flow.failure_analyzer":"Analyseur d'échecs","telemetry.flow.transcript_extractor":"Extracteur de transcriptions","telemetry.flow.conflict_judge":"Juge de conflits","telemetry.errorClass.auth":"authentification refusée","telemetry.errorClass.rate_limit":"limite de débit","telemetry.errorClass.upstream":"panne du fournisseur","telemetry.errorClass.bad_request":"requête invalide","telemetry.errorClass.network":"réseau","telemetry.errorClass.parse":"réponse illisible","telemetry.errorClass.unknown":"inconnu","lessons.severity.critical":"Critique","lessons.severity.major":"Majeur","lessons.severity.minor":"Mineur","memory.tooltip.project":"Projet","memory.tooltip.recalled":"Rappelé {count} fois","memory.tooltip.hasRelations":"Lié à {count} autres mémoires","memory.tooltip.createdAt":"Créé le {date}","graph.drift":"Fraîcheur","graph.driftHint":"Colore les nœuds selon l'âge : rouge = ancien, vert = utilisé récemment","common.unknown":"inconnu","insights.entitiesCount":"{n} entités","roadmap.viewToggle":"Vue de la feuille de route","roadmap.viewTree":"Arbre","roadmap.viewMindmap":"Carte mentale","roadmap.mindmapNeedsPhases":"La carte mentale nécessite au moins 3 mémoires sur une fenêtre de 7 jours.","roadmap.activePhase":"active","roadmap.entryCount":"{count} entrée","roadmap.entriesCount":"{count} entrées","roadmap.otherGroup":"Autres ({count})","roadmap.lowSignalHidden":"({count} à signal faible masquées)","roadmap.resetHint":"Réinitialiser zoom et position (double-clic sur le fond aussi)","roadmap.zoomHint":"molette pour zoomer · glisser pour déplacer · {pct}%","roadmap.moreEntities":"+{count} de plus","nav.ariaLabel":"Sections du tableau de bord","feedback.descLabel":"Description du retour","graph.canvasA11y":"Graphe de connaissances (canvas) : {entities} entités, {relations} relations, {orphans} sans lien. Utilisez les filtres de type et la recherche ci-dessus pour une vue non visuelle."},de:{"auth.title":"Authentifizierung erforderlich","auth.intro":"Dieses Dashboard ist durch ein Bearer-Token geschützt. Fügen Sie unten den Wert von MEMESH_REMOTE_TOKEN (oder den Inhalt von <memeshDir>/remote-token) ein.","auth.tokenLabel":"Token","auth.empty":"Token darf nicht leer sein.","auth.invalid":"Dieses Token wurde nicht akzeptiert. Bitte prüfen und erneut versuchen.","auth.submit":"Dashboard entsperren","auth.tokenPlaceholder":"Token hier einfügen","brand.subtitle":"powered by pcircle.com","header.connected":"Verbunden","header.disconnected":"Getrennt","header.connecting":"Verbinden…","header.memories":"Erinnerungen","tab.insights":"Insights","telemetry.title":"LLM-Aktivität","telemetry.lastNDays":"letzte {n} Tage","telemetry.loading":"lädt…","telemetry.empty":"In diesem Zeitraum noch keine KI-Aktivität. Einträge erscheinen automatisch, sobald die KI-Funktionen im Hintergrund (z. B. Wochenzusammenfassungen, automatisches Tagging) laufen.","telemetry.callsCount":"{n} Aufrufe","telemetry.attemptsCount":"{n} Versuche","telemetry.successRate":"Erfolg","telemetry.medianLatency":"mediane Latenz","telemetry.fallbackUsed":"Fallback {n}× verwendet ({pct} der Aufrufe)","telemetry.byProvider":"nach Provider","telemetry.byModel":"nach Modell","telemetry.byProject":"nach Projekt","telemetry.errors":"Fehler","insights.title":"Was memesh für dich getan hat","insights.subtitle":"automatisch generierte weekly recaps und erkannte patterns – warten auf Review","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"Alle","insights.refresh":"Aktualisieren","insights.loading":"lädt…","insights.emptyPending":"Keine pending Insights. Führe `memesh dream run` aus, um einen weekly recap zu erzeugen.","insights.emptyNoLlm":"Konfiguriere einen LLM-Provider in den Einstellungen, um weekly recaps und Pattern-Erkennung zu aktivieren.","insights.emptyOther":"Nichts hier.","insights.sources":"Quellen","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"Details anzeigen","insights.collapse":"Einklappen","insights.accept":"Übernehmen","insights.applying":"Wird angewendet…","insights.reject":"Ablehnen","insights.generatedBy":"Erzeugt von","insights.promptVersion":"Prompt-Version","insights.observations":"Zusammenfassende Beobachtungen","insights.tags":"Tags","insights.sourceIds":"Quell-Entities","insights.validationWarnings":"Markierte Aussagen (LLM-validator)","insights.validationClaim":"Aussage","insights.validationReason":"Grund","insights.runDream":"Weekly recap ausführen","insights.runDreamWithValidate":"Mit validator ausführen (langsamer, höhere Qualität)","banner.pendingInsights":"{n} neue(r) Insight(s) wartet auf dein Review →","banner.dismiss":"Schließen","banner.viewAll":"Alle anzeigen","pattern.title":"Pattern","pattern.evidenceCount":"{n} Belege","pattern.severity":"Schweregrad","pattern.severity.high":"hoch","pattern.severity.medium":"mittel","pattern.severity.low":"niedrig","pattern.description":"Pattern-Beschreibung","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.hint":"Suche nach Name, Inhalt oder Tags. Findet exakte Wörter und ähnliche Bedeutungen.","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","browse.archiveFailed":"Speicher konnte nicht archiviert werden: {message}","browse.restoreFailed":"Speicher konnte nicht wiederhergestellt werden: {message}","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.entityMeta":"{type} · Konfidenz {confidence}% · {days} Tage ungenutzt","settings.capabilities":"Fähigkeiten","settings.smartMode":"Smart-Modus","settings.core":"Basis","settings.embeddings":"Embeddings","settings.llmProvider":"LLM-Anbieter","settings.llmOptional.title":"LLM ist optional","settings.llmOptional.body":"memesh funktioniert ohne LLM. Der Standard-Core-Modus bietet Volltextsuche, manuelles remember/recall, Dashboard und Session-Erfassung über Hooks.","settings.llmOptional.coreLabel":"Ohne LLM (Core-Modus)","settings.llmOptional.coreFeatures":"FTS5-Stichwortsuche, manuelles remember/recall, Dashboard, Session-Erfassung via Hooks","settings.llmOptional.smartLabel":"Mit LLM (Smart-Modus)","settings.llmOptional.smartFeatures":"automatische lesson_learned aus Session-Fehlern, Auto-Tagging neuer Entitäten, Wochen-Recap + Mustererkennung","settings.apiKey":"API-Schlüssel","settings.fallbacks.title":"Fallback-Anbieter","settings.fallbacks.explainer":"Wenn Ihr Hauptanbieter nicht verfügbar ist, versucht memesh diese der Reihe nach, bis einer funktioniert.","settings.fallbacks.privacyTitle":"Datenschutzhinweis","settings.fallbacks.privacyBody":"Das Hinzufügen eines Cloud-Anbieters (OpenAI oder Anthropic) bedeutet, dass bei einem Ausfall Ihres Hauptanbieters Ihre Speicherinhalte — die privat sein können — an diesen Cloud-Anbieter gesendet werden. Wenn Sie aus Datenschutzgründen einen lokalen Anbieter nutzen, fügen Sie einen Cloud-Fallback nur hinzu, wenn Sie diesen Kompromiss akzeptieren.","settings.fallbacks.empty":"Noch keine Fallback-Anbieter.","settings.fallbacks.add":"Fallback-Anbieter hinzufügen","settings.fallbacks.providerLabel":"Anbieter","settings.fallbacks.modelLabel":"Modell (optional)","settings.fallbacks.modelPlaceholder":"z. B. gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"Ein Schlüssel ist gespeichert. Leer lassen, um ihn zu behalten.","settings.fallbacks.remove":"Entfernen","settings.fallbacks.moveUp":"Nach oben","settings.fallbacks.moveDown":"Nach unten","settings.fallbacks.priority":"Priorität {n}","settings.fallbacks.save":"Fallback-Kette speichern","settings.fallbacks.needsKey":"Geben Sie einen API-Schlüssel ein, sonst kann dieser Cloud-Fallback nicht verwendet werden.","settings.model":"Modell (optional)","settings.save":"Speichern","settings.saving":"Speichern…","settings.saved":"Gespeichert.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Testen","settings.testing":"Teste…","settings.testPassed":"✓ Verbindung OK · {count} Modelle verfügbar","settings.testFailed":"Verbindungstest fehlgeschlagen","settings.suggested":"empfohlen","settings.testRequired":"Bitte Verbindung vor dem Speichern testen","settings.language":"Sprache","settings.searchMode":"Suchmodus","settings.none":"Keine","settings.updates":"Updates","settings.updateChecking":"Suche nach Updates…","settings.updateUnavailable":"Updates können gerade nicht geprüft werden","settings.updateNoSuccessfulChecks":"Es gibt noch keine erfolgreiche Update-Prüfung","settings.upToDate":"Auf dem neuesten Stand","settings.updateAvailable":"Update verfügbar","settings.updateStale":"Der angezeigte Cache-Status ist möglicherweise veraltet","settings.updateCachedFallback":"Es wird das zuletzt erfolgreich gecachte Ergebnis verwendet","settings.updateDeprecatedNoTarget":"Veraltet — noch kein Upgrade-Ziel verfügbar","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} wurde von den Maintainern als VERALTET markiert.","settings.updatePartialTitle":"⚠️ Update-Prüfung unvollständig","settings.updatePartialDescription":"{message}. Veraltungsstatus ist in dieser Sitzung unbekannt — Prüfung online erneut ausführen.","settings.updatePartialSummary":"Teilweise — Veraltungsstatus unbekannt","settings.updateDeprecatedTargetUnknown":"Veraltet — Upgrade-Ziel wird ermittelt","settings.currentVersion":"Aktuelle Version","settings.latestVersion":"Neueste Version","settings.lastChecked":"Zuletzt geprüft","settings.lastAttempted":"Letzter Prüfversuch","settings.lastSuccessful":"Letzte erfolgreiche Prüfung","settings.updateSourceFresh":"Frische Prüfung","settings.updateSourceCached":"Zwischengespeichertes Ergebnis","settings.updateSourceStale":"Veraltetes Cache-Ergebnis","settings.updateSourceUnavailable":"Kein Cache-Ergebnis","settings.updateCommand":"Update-Befehl","settings.checkNow":"Jetzt prüfen","settings.updateLastError":"Fehler bei der letzten Prüfung: {message}","settings.installMethod":"Installationsart","settings.installNpmGlobal":"globale npm-Installation","settings.installNpmLocal":"projektlokale Paketinstallation","settings.installSourceCheckout":"Source-Checkout","settings.installUnknown":"unbekannt","settings.updateGuidanceNpmGlobal":"Diese Installation kann direkt aus MeMesh heraus aktualisiert werden.","settings.updateGuidanceNpmLocal":"Aktualisiere diese Installation über den Paketmanager des Projekts, das MeMesh installiert hat.","settings.updateGuidanceSourceCheckout":"Aktualisiere diesen Source-Checkout aus dem Repository und baue ihn neu.","settings.updateGuidanceUnknown":"Aktualisiere diese Installation mit dem Tool oder Ablauf, der MeMesh installiert hat.","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","graph.interactHint":"Knoten anklicken für Fokus · leere Fläche ziehen zum Schwenken · scrollen zum Zoomen","graph.resetView":"Ansicht zurücksetzen","graph.resetViewHint":"Zoom und Position zurücksetzen","graph.ageToday":"heute","graph.ageDaysAgo":"vor {count} Tagen","graph.ageWeeksAgo":"vor {count} Wochen","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","feedback.submitting":"Diagnose wird erfasst…","doctorBanner.warnTitleSoft":"memesh hat Einrichtungshinweise","doctorBanner.failTitle":"memesh-Einrichtung ist unvollständig","doctorBanner.dismiss":"Schließen","doctorBanner.getHelp":"Hilfe bekommen","doctorBanner.helpHint":"Öffnet ein GitHub Issue mit vorausgefülltem Diagnosebericht","doctorBanner.preambleForIssue":"memesh doctor hat in meiner Installation Folgendes gemeldet:","doctorBanner.moreCount":"…und {n} weitere — führen Sie `memesh doctor` für die vollständige Liste aus","doctor.label.readme_locale_parity":"README-Übersetzungen","doctor.label.config":"Konfigurationsdatei","doctor.label.mcp-config":"MCP-Verbindungsdatei","doctor.label.hooks-config":"Hook-Definitionen","doctor.label.hook-scripts":"Hook-Skripte","doctor.label.hook-wiring":"Verbindung zu Claude Code","doctor.label.hook-activity":"Automatische Erfassung","doctor.label.node-runtime":"Node.js-Version","doctor.label.native-binding":"SQLite und Vektorsuche","doctor.label.shell-cli":"Terminal-Befehl","doctor.label.dashboard":"Dashboard-Dateien","doctor.label.update-status":"Updates","doctor.label.http-probe":"Lokaler Server","doctor.label.skills-manifest":"Mitgelieferte Dateien","doctor.label.config_parse":"Konfigurationsdatei","doctor.label.embeddings_probe":"Bedeutungsbasierte Suche","doctor.label.llm_probe":"KI-Anbieter","doctor.label.install-channel":"Installationsart","doctor.label.fts_segmentation":"Stichwort-Index","doctor.label.vector_index":"Suchindex","doctor.label.database":"Datenbank","doctor.msg.readme-parity.unreadable.summary":"README.md konnte nicht gelesen werden: {detail}","doctor.msg.readme-parity.drift.summary":"Einige übersetzte READMEs sind nicht mehr auf dem Stand der englischen Version: {detail}","doctor.msg.readme-parity.drift.fix":"Gleichen Sie die aufgelisteten READMEs wieder mit README.md ab.","doctor.msg.config.invalid-json.summary":"Die Konfigurationsdatei unter {path} ist kein gültiges JSON und wird deshalb ignoriert.","doctor.msg.config.invalid-json.fix":"Reparieren oder löschen Sie {path} und prüfen Sie mit `memesh config list`, ob sie geladen wird.","doctor.msg.mcp-config.missing.summary":"Die Datei, die memesh mit Claude Code verbindet (.mcp.json), fehlt.","doctor.msg.mcp-config.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json ist beschädigt (kein gültiges JSON), Claude Code kann sie deshalb nicht lesen.","doctor.msg.mcp-config.invalid-json.fix":"Reparieren Sie {path} oder installieren Sie MeMesh neu.","doctor.msg.mcp-config.no-entry.summary":".mcp.json enthält den memesh-Servereintrag nicht mehr.","doctor.msg.mcp-config.no-entry.fix":"Installieren Sie MeMesh neu, um ihn wiederherzustellen.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` startet eine Datei, die in dieser Installation fehlt — daher startet kein memesh-Werkzeug in Claude Code.","doctor.msg.mcp-config.entry-missing.fix":"Installieren Sie MeMesh neu. Wenn Sie `.mcp.json` von Hand geändert haben, richten Sie es wieder auf `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js` aus.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json fehlt, die automatische Erinnerungs-Erfassung kann deshalb nicht laufen.","doctor.msg.hooks-config.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json ist beschädigt (kein gültiges JSON).","doctor.msg.hooks-config.invalid-json.fix":"Reparieren Sie {path} oder installieren Sie MeMesh neu.","doctor.msg.hooks-config.missing-types.summary":"In hooks/hooks.json fehlen diese Hook-Typen: {types}. Ein Teil der automatischen Erfassung läuft nicht.","doctor.msg.hooks-config.missing-types.fix":"Stellen Sie die mitgelieferte Hook-Konfiguration wieder her oder installieren Sie MeMesh neu.","doctor.msg.hook-scripts.none.summary":"Die Hook-Konfiguration enthält keine Skripte, es kann also nichts automatisch erfasst werden.","doctor.msg.hook-scripts.none.fix":"Installieren Sie MeMesh neu.","doctor.msg.hook-scripts.missing.summary":"Diese Hook-Skripte fehlen: {files}","doctor.msg.hook-scripts.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.hook-scripts.not-executable.summary":"Diese Hook-Skripte existieren, dürfen aber nicht ausgeführt werden: {files}","doctor.msg.hook-scripts.not-executable.fix":"Führen Sie `chmod +x scripts/hooks/*.js` aus, oder `npm run build` in einem Quellcode-Checkout.","doctor.msg.hook-wiring.no-marker.summary":"memesh ist noch nicht mit Claude Code verbunden, es wird also nichts automatisch gemerkt.","doctor.msg.hook-wiring.no-marker.fix":"Führen Sie einmal `memesh install-hooks` aus, danach `memesh doctor` zur Kontrolle.","doctor.msg.hook-wiring.script-missing.summary":"Ein verdrahteter memesh-Hook zeigt auf {path}, das nicht mehr existiert — der Agent ruft bei jedem passenden Ereignis eine fehlende Datei auf. Meist ein Rückstand eines Upgrades, das den Hook stillgelegt hat.","doctor.msg.hook-wiring.script-missing.fix":"Führen Sie `memesh install-hooks` aus (stillgelegte Einträge werden entfernt) und starten Sie den Agenten neu.","doctor.msg.hook-wiring.marker-unreadable.summary":"Der Verbindungsvermerk unter {path} kann nicht gelesen werden.","doctor.msg.hook-wiring.marker-unreadable.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.marker-malformed.summary":"Der Verbindungsvermerk ist beschädigt.","doctor.msg.hook-wiring.marker-malformed.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.settings-missing.summary":"Die Claude-Code-Einstellungsdatei ({path}) ist weg, die Verbindung ist deshalb unterbrochen.","doctor.msg.hook-wiring.settings-missing.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} ist beschädigt (kein gültiges JSON).","doctor.msg.hook-wiring.settings-invalid.fix":"Stellen Sie die Datei aus einem Backup wieder her, oder führen Sie `memesh install-hooks` aus, um sie neu anzulegen.","doctor.msg.hook-wiring.entries-removed.summary":"Die memesh-Einträge wurden aus {path} entfernt, die Verbindung ist deshalb unterbrochen.","doctor.msg.hook-wiring.entries-removed.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.root-moved.summary":"Die Verbindung zeigt auf {path}, das es nicht mehr gibt (memesh wurde vermutlich verschoben).","doctor.msg.hook-wiring.root-moved.fix":"Führen Sie `memesh install-hooks` aus, um sie zu aktualisieren.","doctor.msg.hook-activity.never-ran.summary":"Seit Beginn der Aufzeichnung vor {hours} Stunden wurde kein Capture-Hook ausgeführt, obwohl die Hook-Verdrahtung vorhanden ist — nichts wird gespeichert.","doctor.msg.hook-activity.never-ran.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus. Steht dort weiterhin, dass kein Hook lief, führen Sie `memesh install-hooks` aus und starten Sie den Agenten neu.","doctor.msg.hook-activity.stale.summary":"Der letzte Capture-Hook lief vor etwa {hours} Stunden ({hook}). Wenn Sie seitdem gearbeitet haben, ist die Erfassung gestoppt und nichts aus diesen Sitzungen wurde gespeichert.","doctor.msg.hook-activity.stale.fix":"Starten Sie den Agenten neu, beenden Sie eine Sitzung und führen Sie `memesh doctor` erneut aus. Erholt es sich nicht, führen Sie `memesh install-hooks` aus.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Der session-summary-Hook lief zuletzt vor etwa {hours} Stunden, und in den letzten 3 Tagen kamen auch keine Claude-Code-Schreibvorgänge an. Ist diese Maschine zu einem anderen Agenten (Codex / Gemini) gewechselt, ist das erwartet; nutzen Sie hier noch Claude Code, ist die Erfassung gestoppt.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Wenn Sie auf dieser Maschine noch Claude Code nutzen: neu starten, eine Sitzung beenden und `memesh doctor` erneut ausführen. Erholt es sich nicht, führen Sie `memesh install-hooks` aus.","doctor.msg.hook-activity.query-failed.summary":"Die Hook-Aktivität konnte nicht aus der Datenbank gelesen werden: {detail}. Der Zustand der Erfassung ist unbekannt, und das ist nicht dasselbe wie gesund.","doctor.msg.hook-activity.query-failed.fix":"Führen Sie `memesh doctor --verbose` für den vollständigen Fehler aus und prüfen Sie, ob ~/.memesh lesbar und die Festplatte nicht voll ist.","doctor.msg.hook-activity.stale-unknown.summary":'Der Zeitstempel des letzten Laufs des {hook}-Hooks ist unlesbar (beschädigt, oder von einer Maschine mit falscher Uhr geschrieben). Der Capture-Zustand ist „unbekannt", und das ist nicht dasselbe wie „gesund".',"doctor.msg.hook-activity.stale-unknown.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus — ein frischer Lauf überschreibt den defekten Zeitstempel.","doctor.msg.hook-activity.disabled.summary":"Die automatische Erfassung ist ausgeschaltet (MEMESH_AUTO_CAPTURE oder autoCapture in der Konfiguration) — absichtlich, daher ist die Stille der Hooks zu erwarten. Zum Fortsetzen wieder einschalten.","doctor.msg.hook-activity.disabled-env.summary":"Die automatische Erfassung ist durch MEMESH_AUTO_CAPTURE=false in der Umgebung dieser Shell ausgeschaltet. doctor sieht nur seine eigene Umgebung — läuft Ihr Agent ohne diese Variable, ist die Erfassung dort nicht betroffen.","doctor.msg.hook-activity.not-wired.summary":"Es ist noch nie ein Capture-Hook gelaufen — und auf dieser Maschine ist kein Capture-Hook (Stop / PostToolUse / PreCompact) nachweislich verdrahtet, es gibt also nichts auszuführen.","doctor.msg.hook-activity.not-wired.fix":"Für automatische Erfassung führen Sie `memesh install-hooks` aus. Bei einer reinen MCP-Installation (Codex / Gemini) ist das erwartet und kann ignoriert werden.","doctor.msg.hook-activity.stop-silent.summary":"Der {hook}-Hook stempelt, aber der session-summary-Hook ist in den {hours} Stunden seit Beginn der Aufzeichnung kein einziges Mal gelaufen — die Sitzungserfassung ist womöglich kaputt, verdeckt durch die Commit-Erfassung.","doctor.msg.hook-activity.stop-silent.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus. Läuft session-summary dann immer noch nicht, führen Sie `memesh install-hooks` aus und starten Sie den Agenten neu.","doctor.msg.hook-activity.never-ran-legacy.summary":"Kein Hook hat den Heartbeat gestempelt, aber seit Beginn der Aufzeichnung sind {captured} automatisch erfasste Erinnerungen angekommen — Hooks aus einer Version vor dem Heartbeat-Tracking laufen wahrscheinlich noch.","doctor.msg.hook-activity.never-ran-legacy.fix":"Aktualisieren Sie die memesh-Hooks auf die aktuelle Version (Plugin: `/plugin update memesh`; npm: `memesh install-hooks`) und starten Sie den Agenten neu.","doctor.msg.node-runtime.too-old.summary":"Ihr Node.js ist älter, als dieses Paket unterstützt. {detail}","doctor.msg.node-runtime.too-old.fix":"Aktualisieren Sie Node.js auf {required} oder neuer und führen Sie `memesh doctor` erneut aus.","doctor.msg.native-binding.node-too-old.summary":"Das in dieser Node-Version eingebaute SQLite ist zu alt für memesh — es kann den Teil für die Suche nach Bedeutung nicht laden. Die vollständige Fassung kam mit Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Aktualisieren Sie Node auf 22.13 oder neuer und führen Sie `memesh doctor` erneut aus.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec ist nicht installiert. Erinnerungen werden weiterhin gespeichert und über Stichwörter gefunden — nur die Suche nach Bedeutung ist aus.","doctor.msg.native-binding.not-installed.fix":"Führen Sie `npm install` in dem Ordner aus, der @pcircle/memesh verwendet.","doctor.msg.native-binding.load-failed.summary":"sqlite-vec konnte nicht geladen werden: {detail}. Die Suche nutzt nur noch Stichwörter.","doctor.msg.native-binding.load-failed.fix":'Ausführen: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"Der Befehl `memesh` ist in Ihrem Terminal nicht verfügbar. Die Claude-Code-Funktionen laufen weiter — es betrifft nur das eigene Eintippen von `memesh`.","doctor.msg.shell-cli.not-on-path.fix":"Führen Sie `npm install -g @pcircle/memesh` aus, um ihn hinzuzufügen. Beide Installationen teilen sich dieselben Erinnerungen.","doctor.msg.dashboard.missing.summary":"Die Dashboard-Dateien fehlen.","doctor.msg.dashboard.missing.fix":"Erzeugen Sie sie mit `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"memesh konnte noch nicht prüfen, ob es neuere Versionen gibt.","doctor.msg.update-status.no-cache.fix":"Führen Sie einmal online `memesh status` aus — das Ergebnis wird gespeichert und dieser Hinweis verschwindet.","doctor.msg.update-status.deprecated.summary":"Version {version} wurde von ihren Betreuern zurückgezogen: {detail}","doctor.msg.update-status.deprecated.fix":"Aktualisieren Sie jetzt — führen Sie `memesh update` aus (oder folgen Sie Ihrer Installationsart).","doctor.msg.update-status.deprecation-unknown.summary":"Es ließ sich nicht bestätigen, ob Version {version} noch sicher ist: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Führen Sie online `memesh status` aus, um es erneut zu versuchen.","doctor.msg.update-status.update-available.summary":"Eine neuere Version ist verfügbar: {latest} (Sie haben {current}).","doctor.msg.update-status.update-available.fix":"Führen Sie `memesh update` aus, um zu aktualisieren.","doctor.msg.update-status.stale.summary":"Version {version} ist aktuell, aber die Update-Informationen sind alt.","doctor.msg.update-status.stale.fix":"Führen Sie online `memesh status` aus, um sie zu erneuern.","doctor.msg.http-probe.bad-status.summary":"Der lokale Server unter {url} hat mit einem Fehler geantwortet (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Starten Sie ihn mit `memesh serve` neu und sehen Sie in die Logs.","doctor.msg.http-probe.no-server.summary":"Unter {url} läuft kein lokaler Server.","doctor.msg.http-probe.no-server.fix":"Starten Sie einen mit `memesh serve`, wenn Sie das Dashboard möchten.","doctor.msg.skills-manifest.missing-dev.summary":"Keine Datei-Integritätsliste gefunden (normal, wenn Sie aus dem Quellcode starten).","doctor.msg.skills-manifest.missing-dev.fix":"Führen Sie `npm run build` aus, um sie zu erzeugen.","doctor.msg.skills-manifest.unreadable.summary":"Die Datei-Integritätsliste kann nicht gelesen werden ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Neu installieren: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"Die Datei-Integritätsliste ist leer.","doctor.msg.skills-manifest.empty.fix":"Neu installieren: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Einige mitgelieferte Dateien stimmen nicht mit dem Ausgelieferten überein: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Neu installieren: `npm install -g @pcircle/memesh`. Passiert es auch bei einer frischen Installation wieder, melden Sie es als Sicherheitsproblem.","doctor.msg.config-parse.not-object.summary":"Die Konfigurationsdatei unter {path} hat nicht das erwartete Format, alle Einstellungen werden deshalb ignoriert.","doctor.msg.config-parse.not-object.fix":"Reparieren oder löschen Sie {path} und führen Sie `memesh doctor` erneut aus.","doctor.msg.config-parse.unreadable.summary":"Die Konfigurationsdatei unter {path} kann nicht gelesen werden ({detail}), alle Einstellungen werden deshalb ignoriert.","doctor.msg.config-parse.unreadable.fix":"Reparieren Sie die Datei, oder legen Sie sie beiseite: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'Die bedeutungsbasierte Suche ist auf „{provider}" eingestellt, lieferte im Test aber nichts. Die Stichwortsuche funktioniert weiterhin.',"doctor.msg.embeddings.empty.fix":"Führen Sie `memesh doctor --probe` für Details aus, oder prüfen Sie die Verbindung zum Anbieter.","doctor.msg.embeddings.threw.summary":'Die bedeutungsbasierte Suche ist auf „{provider}" eingestellt, schlug im Test aber fehl: {detail}. Die Stichwortsuche funktioniert weiterhin.',"doctor.msg.embeddings.threw.fix":"Prüfen Sie, ob der Embedding-Anbieter erreichbar ist (z. B. `ollama serve` starten), oder entfernen Sie die embedder-Konfiguration für reine Keyword-Suche.","doctor.msg.llm.unreachable.summary":"Der KI-Anbieter ({provider}) hat nicht geantwortet: {detail}. Die KI-Funktionen tun still und leise nichts.","doctor.msg.llm.unreachable.fix":"Prüfen Sie den API key und die Verbindung und führen Sie dann `memesh doctor --probe` erneut aus.","doctor.msg.llm.threw.summary":"Der Test des KI-Anbieters ({provider}) schlug fehl: {detail}. Die KI-Funktionen tun still und leise nichts.","doctor.msg.llm.threw.fix":"Prüfen Sie den API key und die Verbindung und führen Sie dann `memesh doctor --probe` erneut aus.","doctor.msg.install-channel.unknown.summary":"Es ließ sich nicht feststellen, wie memesh installiert wurde.","doctor.msg.install-channel.unknown.fix":"Bei einem Quellcode-Checkout starten Sie aus dem Repo-Stammverzeichnis; andernfalls installieren Sie neu mit `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"Der Stichwort-Index enthält {count} Einträge in einem alten Format — manche Erinnerungen werden nur über ihren exakten Volltext gefunden.","doctor.msg.fts.unsegmented.fix":"Führen Sie `memesh reindex --fts` aus, um den Index neu aufzubauen.","doctor.msg.vector-index.stale.summary":"Der Suchindex muss neu aufgebaut werden (die Sucheinstellungen haben sich geändert).","doctor.msg.vector-index.stale.fix":"Führen Sie `memesh reindex` aus, um ihn neu aufzubauen.","doctor.msg.database.broken.summary":"Die Datenbank ist nicht nutzbar: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"{used} verwendet / {total} injiziert","analytics.loadFailed":"Analysen konnten nicht geladen werden.","memory.noContent":"(kein Inhalt)","memory.archivedBadge":"archiviert","memory.factsCount":"{count} Fakten","common.error":"Fehler","common.serverUnreachable":"Der memesh-Server ist nicht erreichbar.","common.serverUnreachableAction":"Prüfe, ob `memesh serve` noch läuft, und lade diese Seite neu.","common.responseUnreadable":"Der Server hat geantwortet, aber diese Seite konnte die Antwort nicht lesen — Dashboard und Server sind womöglich nicht auf demselben Stand.","common.responseUnreadableAction":"Lade die Seite neu. Tritt das weiter auf, führe `memesh doctor` aus.","pm.title":"PM-Kennzahlen","pm.decisionsPerWeek":"Entscheidungen/Woche","pm.openDecisions":"offene Entscheidungen (>14 T.)","pm.orphanRate":"Unverknüpfte Erinnerungen","pm.relationsTotal":"Relationen gesamt","pm.stalePlans":"{count} Plan/Pläne seit über 30 Tagen nicht überprüft","common.loading":"Laden…","common.noData":"Keine Daten","errors.unknown":"Unbekannter Fehler","insights.noPreview":"Dieser Vorschlag hat keinen Zusammenfassungstext","httpError.auth.missing-bearer":"Dieser Server verlangt ein Zugriffstoken. Gib dein Token ein, um fortzufahren.","httpError.auth.invalid-token":"Das Zugriffstoken wurde nicht akzeptiert. Prüfe es und versuche es erneut.","httpError.auth.not-configured":"Auf dem Server ist kein Zugriffstoken eingerichtet. Starte `memesh serve` neu und prüfe die Ausgabe.","httpError.validation.bad-body":"Der Server konnte die Anfrage der Seite nicht lesen. Lade die Seite neu und versuche es erneut.","httpError.validation.bad-param":"Ein Teil der Anfrage ist ungültig. Lade die Seite neu und versuche es erneut.","httpError.route.retired":"Der Server unterstützt diese Aktion nicht mehr — Seite und Server haben womöglich unterschiedliche Versionen. Lade die Seite neu.","httpError.route.not-found":"Der Server kennt diese Anfrage nicht — Seite und Server haben womöglich unterschiedliche Versionen. Lade die Seite neu.","httpError.resource.not-found":"Dieses Element existiert nicht mehr. Aktualisiere die Liste.","httpError.payload.too-large":"Die gesendeten Daten sind zu groß (über 1 MB). Versuche kleinere Pakete.","httpError.operation.failed":"Der Server konnte diese Aktion nicht abschließen.","httpError.llm.not-configured":"Kein KI-Anbieter eingerichtet. Füge zuerst einen in den Einstellungen hinzu.","httpError.rate.limited":"Zu viele Anfragen in kurzer Zeit. Warten Sie einen Moment und versuchen Sie es erneut.","httpError.server.internal":"Auf dem Server ist ein unerwarteter Fehler aufgetreten.","settings.testError.auth":"Der API-Schlüssel wurde abgelehnt. Prüfe den Schlüssel und versuche es erneut.","settings.testError.network":"Der Anbieter ist nicht erreichbar. Prüfe deine Netzwerkverbindung.","settings.testError.no_models":"Der Anbieter hat geantwortet, aber keine nutzbaren Modelle zurückgegeben.","settings.testError.bad_host":"Die Ollama-Adresse muss auf diesem Rechner liegen (localhost).","settings.testError.http":"Der Anbieter hat einen Fehler zurückgegeben (HTTP {status}).","settings.testError.unknown":"Der Test ist aus unbekanntem Grund fehlgeschlagen.","time.justNow":"Gerade eben","time.hoursAgo":"Vor {count} Std","time.today":"Heute","time.yesterday":"Gestern","time.daysAgo":"Vor {count} T","time.lastWeek":"Letzte Woche","time.weeksAgo":"Vor {count} W","time.lastMonth":"Letzter Monat","time.monthsAgo":"Vor {count} M","memory.access.frequent":"Häufig · {count} Abrufe","memory.access.recalls":"{count} Abrufe","memory.access.never":"Nie abgerufen","cluster.knowledge":"Wissen","cluster.activity":"Aktivität","cluster.session":"Sitzungen","cluster.reference":"Referenz","cluster.all":"Alle","browse.filterCategory":"Kategorie","browse.filterTime":"Zeit","browse.filterValue":"Wert","browse.filterProject":"Projekt","browse.filterSort":"Sortieren","browse.timeToday":"Heute","browse.timeWeek":"Diese Woche","browse.timeMonth":"Dieser Monat","browse.timeOlder":"Älter","browse.valueRecalled":"✓ Verwendet","browse.valueNever":"Nie abgerufen","browse.sortMostRecalled":"Häufigste","browse.sortRecent":"Zuletzt","browse.sortCreated":"Erstellt","browse.emptyFilter":"Keine Erinnerungen in dieser Kategorie — anderen Filter probieren","lessons.tabFailure":"Fehler-Lektionen","lessons.tabPlan":"Plan-Aufzeichnungen","lessons.tabFreeform":"Notizen","lessons.totalRecalls":"Abrufe gesamt","lessons.stepsLabel":"Schritte","lessons.commitsCount":"{count} Commits","lessons.unstructured":"(Keine strukturierten Felder — siehe Rohspeicher)","lessons.searchPlaceholder":"Suche error / root cause / fix / Name…","lessons.allProjects":"Alle Projekte","lessons.showing":"{visible} / {total} angezeigt","lessons.noMatch":'Keine Erinnerungen zu „{query}"',"lessons.emptyCategory":"Keine Erinnerungen in dieser Kategorie","lessons.moreItems":"+{count} weitere","roadmap.title":"Projekt-Roadmap","roadmap.summary":"{count} Erinnerungen · {first} → {last}","roadmap.switchToList":"↩ Listenansicht","roadmap.switchToRoadmap":"🗺️ Roadmap-Ansicht","roadmap.emptyProject":"Noch keine Erinnerungen in diesem Projekt.","loop.label":"Memory-Loop","loop.subtitleHas":"Wissens-Erinnerungen in den letzten 7 Tagen wiederverwendet","loop.subtitleNone":"Diese Woche keine Wissens-Erinnerungen abgerufen","loop.approxNote":"Annäherung — vollständige Verfolgung beginnt nach Upgrade.","loop.sparkLabel":"Letzte 30 Tage","roadmap.milestones":"Meilensteine","roadmap.keyLessons":"Wichtige Lektionen","radar.title":"Wissensabdeckung","radar.caption":"Aktive Wissens-Erinnerungen (session und commit ausgeschlossen)","radar.axis.lessons":"Lektionen","radar.axis.decisions":"Entscheidungen","radar.axis.patterns":"Muster","radar.axis.bugs":"Bugfixes","radar.axis.processes":"Prozesse","radar.axis.architecture":"Architektur","ageMatrix.title":"Altersverteilung","ageMatrix.low":"Niedrig","ageMatrix.high":"Hoch","ageMatrix.legend":"Farbtiefe = Dichte","ageMatrix.typeColumn":"Typ","header.signalModeOn":"Signal","header.signalModeOff":"Alle","header.signalModeOnHint":"Session-/Commit-Rauschen ausgeblendet. Klick zeigt alles.","header.signalModeOffHint":"Alle Erinnerungen inklusive Rauschen. Klick blendet aus.","roadmap.phases":"Phasen","onboarding.title":"Willkommen bei MeMesh","onboarding.body":"Ihr Memory-Store ist leer. Starten Sie mit einer kuratierten 30-Entitäts-Tour oder speichern Sie Ihre erste Lektion.","onboarding.llmHint":"Kein LLM erforderlich. Alles funktioniert nur mit FTS5. Ein LLM ist optional für automatische Lektionsgenerierung — später in den Einstellungen konfigurieren.","onboarding.seedButton":"Demo-Tour starten","onboarding.seedingButton":"Wird geladen…","onboarding.seedHint":"Fügt direkt hier 30 Erinnerungen hinzu — kein Terminal nötig","onboarding.cliReference":"Lieber per CLI?","onboarding.hintDemo":"Fügt 30 Demo-Erinnerungen ein (später löschbar)","onboarding.hintReset":"Entfernt alle mit metadata.demo markierten Einträge","onboarding.resetButton":"Demo zurücksetzen","onboarding.resettingButton":"Wird entfernt…","onboarding.resetConfirm":"Alle Demo-Erinnerungen entfernen? Ihre echten Einträge bleiben erhalten.","onboarding.dismiss":"Schließen","common.serverError":"Der Server hat einen Fehler gemeldet (HTTP {status}). Versuchen Sie es erneut — falls es weiter auftritt, führen Sie `memesh doctor` aus.","emptyLibrary.title":"Ihr Speicher ist leer","emptyLibrary.body":"Noch ist nichts gespeichert. Laden Sie die Demo-Tour mit 30 Einträgen, um MeMesh in Aktion zu sehen — später mit einem Klick löschbar.","browse.truncated":"die ersten {shown} von {total} Erinnerungen werden angezeigt — nutzen Sie Suche oder Filter für den Rest","lessons.capNote":"nur die ersten {limit} Lektionen geladen — die Zahlen oben beziehen sich nur auf diese","lessons.emptyGuide":"Noch keine Lektionen. Im Smart Mode speichert memesh automatisch eine, wenn ein Sitzungsfehler analysiert wird — oder bitten Sie Ihren Assistenten darum.","graph.cappedNote":"Es werden die {shown} meistabgerufenen von {total} Entitäten angezeigt, damit der Graph flüssig bleibt.","settings.testStoredKeyHint":"Feld leer lassen, um den bereits gespeicherten Schlüssel zu testen.","ageMatrix.bucket.week":"Diese Woche","ageMatrix.bucket.month":"Dieser Monat","ageMatrix.bucket.quarter":"Dieses Quartal","ageMatrix.bucket.older":"Älter","settings.behaviourTitle":"Verhalten","settings.autoUpdateLabel":"Auto-Update-Richtlinie","settings.autoUpdateOff":"Aus — nur manuell","settings.autoUpdatePatch":"Patch — wendet X.Y.Z+1 an","settings.autoUpdateMinor":"Minor — wendet X.Y+1.0 an","settings.autoUpdateMajor":"Major — wendet jede Version an","settings.autoUpdateHint":"Wird nach jeder Sitzung ausgelöst. MEMESH_AUTO_UPDATE hat Vorrang.","errors.timeout":"Zeitüberschreitung der Anfrage","type.lesson_learned":"Lektion","type.lesson":"Lektion","type.mistake":"Fehler","type.decision":"Entscheidung","type.architecture_decision":"Arch.-Entsch.","type.design_decision":"Design-Entsch.","type.pattern":"Muster","type.technical_pattern":"Tech. Muster","type.best_practice":"Best Practice","type.bug_fix":"Bugfix","type.verification_result":"Verifikation","type.test_result":"Testergebnis","type.process":"Prozess","type.architecture":"Architektur","type.infrastructure":"Infrastruktur","type.feature":"Feature","type.release":"Release","type.refactoring":"Refactoring","type.commit":"Commit","type.session_keypoint":"Sitzungs-Kernpunkt","type.session_identity":"Sitzungsidentität","type.session-insight":"Sitzungs-Insight","type.session-summary":"Sitzungszusammenfassung","type.session-identity":"Sitzungsidentität","type.weekly_summary":"Wochenübersicht","type.weekly-summary":"Wochenübersicht","type.note":"Notiz","type.plan":"Plan","type.knowledge":"Wissen","type.workflow_checkpoint":"Meilenstein","type.concept":"Konzept","type.tool":"Werkzeug","type.person":"Person","relation.relates_to":"bezieht sich auf","relation.related-to":"verwandt mit","relation.depends_on":"hängt ab von","relation.implements":"implementiert","relation.learned_from":"gelernt aus","relation.supersedes":"ersetzt","relation.contradicts":"widerspricht","relation.follows":"folgt auf","relation.belongs-to-project":"gehört zum Projekt","relation.co-created":"gemeinsam erstellt","relation.shares-name-tokens":"ähnliche Namen","patterns.day.0":"Sonntag","patterns.day.1":"Montag","patterns.day.2":"Dienstag","patterns.day.3":"Mittwoch","patterns.day.4":"Donnerstag","patterns.day.5":"Freitag","patterns.day.6":"Samstag","telemetry.flow.dreamer":"Wochenrückblick (Dreamer)","telemetry.flow.pattern_detector":"Mustererkennung","telemetry.flow.digest_validator":"Digest-Validierung","telemetry.flow.auto_tagger":"Auto-Tagger","telemetry.flow.failure_analyzer":"Fehleranalyse","telemetry.flow.transcript_extractor":"Transkript-Extraktor","telemetry.flow.conflict_judge":"Konfliktrichter","telemetry.errorClass.auth":"Auth abgelehnt","telemetry.errorClass.rate_limit":"Rate-Limit","telemetry.errorClass.upstream":"Anbieterausfall","telemetry.errorClass.bad_request":"ungültige Anfrage","telemetry.errorClass.network":"Netzwerk","telemetry.errorClass.parse":"unlesbare Antwort","telemetry.errorClass.unknown":"unbekannt","lessons.severity.critical":"Kritisch","lessons.severity.major":"Schwer","lessons.severity.minor":"Gering","memory.tooltip.project":"Projekt","memory.tooltip.recalled":"{count}-mal abgerufen","memory.tooltip.hasRelations":"Mit {count} weiteren Erinnerungen verknüpft","memory.tooltip.createdAt":"Erstellt am {date}","graph.drift":"Frische","graph.driftHint":"Färbt Knoten nach Alter: Rot = veraltet, Grün = kürzlich genutzt","common.unknown":"unbekannt","insights.entitiesCount":"{n} Entitäten","roadmap.viewToggle":"Roadmap-Ansicht","roadmap.viewTree":"Baum","roadmap.viewMindmap":"Mindmap","roadmap.mindmapNeedsPhases":"Die Mindmap braucht mindestens 3 Erinnerungen innerhalb von 7 Tagen.","roadmap.activePhase":"aktiv","roadmap.entryCount":"{count} Eintrag","roadmap.entriesCount":"{count} Einträge","roadmap.otherGroup":"Sonstige ({count})","roadmap.lowSignalHidden":"({count} mit schwachem Signal ausgeblendet)","roadmap.resetHint":"Zoom und Position zurücksetzen (Doppelklick auf den Hintergrund geht auch)","roadmap.zoomHint":"scrollen zum Zoomen · ziehen zum Schwenken · {pct}%","roadmap.moreEntities":"+{count} weitere","nav.ariaLabel":"Dashboard-Bereiche","feedback.descLabel":"Feedback-Beschreibung","graph.canvasA11y":"Wissensgraph (Canvas): {entities} Entitäten, {relations} Beziehungen, {orphans} ohne Verbindung. Nutzen Sie die Typfilter und die Suche oben für eine nicht-visuelle Ansicht."},vi:{"auth.title":"Yêu cầu xác thực","auth.intro":"Bảng điều khiển này được bảo vệ bằng bearer token. Dán giá trị của MEMESH_REMOTE_TOKEN (hoặc nội dung của <memeshDir>/remote-token) bên dưới.","auth.tokenLabel":"Token","auth.empty":"Token không được để trống.","auth.invalid":"Mã thông báo này không được chấp nhận. Hãy kiểm tra và thử lại.","auth.submit":"Mở khóa bảng điều khiển","auth.tokenPlaceholder":"dán token vào đây","brand.subtitle":"powered by pcircle.com","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.insights":"Insights","telemetry.title":"Hoạt động LLM","telemetry.lastNDays":"{n} ngày qua","telemetry.loading":"đang tải…","telemetry.empty":"Chưa có hoạt động AI trong khoảng thời gian này. Các dòng sẽ tự xuất hiện khi các tính năng AI chạy nền (như tóm tắt hằng tuần và tự gắn thẻ) hoạt động.","telemetry.callsCount":"{n} lệnh gọi","telemetry.attemptsCount":"{n} lần thử","telemetry.successRate":"thành công","telemetry.medianLatency":"độ trễ trung vị","telemetry.fallbackUsed":"fallback dùng {n}× ({pct} số lệnh gọi)","telemetry.byProvider":"theo nhà cung cấp","telemetry.byModel":"theo mô hình","telemetry.byProject":"theo dự án","telemetry.errors":"lỗi","insights.title":"memesh đã làm gì cho bạn","insights.subtitle":"các weekly recap và pattern được tạo tự động, đang chờ bạn xem xét","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"Tất cả","insights.refresh":"Làm mới","insights.loading":"đang tải…","insights.emptyPending":"Không có insight nào pending. Chạy `memesh dream run` để tạo weekly recap.","insights.emptyNoLlm":"Cấu hình một nhà cung cấp LLM trong phần Cài đặt để bật weekly recap và phát hiện pattern.","insights.emptyOther":"Không có gì ở đây.","insights.sources":"nguồn","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"Xem chi tiết","insights.collapse":"Thu gọn","insights.accept":"Chấp nhận","insights.applying":"Đang áp dụng…","insights.reject":"Từ chối","insights.generatedBy":"Tạo bởi","insights.promptVersion":"Phiên bản prompt","insights.observations":"Tóm tắt quan sát","insights.tags":"Thẻ","insights.sourceIds":"Entity nguồn","insights.validationWarnings":"Nhận định bị gắn cờ (LLM validator)","insights.validationClaim":"Nhận định","insights.validationReason":"Lý do","insights.runDream":"Chạy weekly recap","insights.runDreamWithValidate":"Chạy kèm validator (chậm hơn, chất lượng cao hơn)","banner.pendingInsights":"{n} insight mới đang chờ bạn xem xét →","banner.dismiss":"Bỏ qua","banner.viewAll":"Xem tất cả","pattern.title":"Pattern","pattern.evidenceCount":"{n} bằng chứng","pattern.severity":"Mức nghiêm trọng","pattern.severity.high":"cao","pattern.severity.medium":"trung bình","pattern.severity.low":"thấp","pattern.description":"Mô tả pattern","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.hint":"Tìm theo tên, nội dung hoặc thẻ. Tìm cả từ khớp chính xác lẫn nghĩa gần giống.","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ữ","browse.archiveFailed":"Không thể lưu trữ ký ức: {message}","browse.restoreFailed":"Không thể khôi phục ký ức: {message}","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.entityMeta":"{type} · độ tin cậy {confidence}% · không dùng {days} ngày","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.llmOptional.title":"LLM là tùy chọn","settings.llmOptional.body":"memesh hoạt động mà không cần LLM. Chế độ Core mặc định bao gồm tìm kiếm toàn văn, remember/recall thủ công, dashboard và ghi nhận session qua hooks.","settings.llmOptional.coreLabel":"Không có LLM (chế độ Core)","settings.llmOptional.coreFeatures":"tìm kiếm từ khóa FTS5, remember/recall thủ công, dashboard, ghi nhận session qua hooks","settings.llmOptional.smartLabel":"Có LLM (chế độ Smart)","settings.llmOptional.smartFeatures":"tự động tạo lesson_learned từ lỗi session, tự động gắn nhãn entity mới, tóm tắt tuần + nhận diện mẫu hình","settings.apiKey":"Khóa API","settings.fallbacks.title":"Nhà cung cấp dự phòng","settings.fallbacks.explainer":"Nếu nhà cung cấp chính không khả dụng, memesh sẽ thử lần lượt các nhà cung cấp này cho đến khi có một cái hoạt động.","settings.fallbacks.privacyTitle":"Lưu ý về quyền riêng tư","settings.fallbacks.privacyBody":"Thêm nhà cung cấp đám mây (OpenAI hoặc Anthropic) nghĩa là khi nhà cung cấp chính ngừng hoạt động, nội dung bộ nhớ của bạn — có thể là riêng tư — sẽ được gửi đến nhà cung cấp đám mây đó. Nếu bạn dùng nhà cung cấp cục bộ vì quyền riêng tư, chỉ thêm dự phòng đám mây nếu bạn chấp nhận đánh đổi này.","settings.fallbacks.empty":"Chưa có nhà cung cấp dự phòng.","settings.fallbacks.add":"Thêm nhà cung cấp dự phòng","settings.fallbacks.providerLabel":"Nhà cung cấp","settings.fallbacks.modelLabel":"Mô hình (tùy chọn)","settings.fallbacks.modelPlaceholder":"ví dụ: gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"Đã lưu một khóa. Để trống để giữ khóa đó.","settings.fallbacks.remove":"Xóa","settings.fallbacks.moveUp":"Di chuyển lên","settings.fallbacks.moveDown":"Di chuyển xuống","settings.fallbacks.priority":"Ưu tiên {n}","settings.fallbacks.save":"Lưu chuỗi dự phòng","settings.fallbacks.needsKey":"Nhập khóa API, nếu không dự phòng đám mây này không thể dùng được.","settings.model":"Mô hình (tùy chọn)","settings.save":"Lưu","settings.saving":"Đang lưu…","settings.saved":"Đã lưu.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Kiểm tra","settings.testing":"Đang kiểm tra…","settings.testPassed":"✓ Kết nối OK · {count} mô hình có sẵn","settings.testFailed":"Kiểm tra kết nối thất bại","settings.suggested":"đề xuất","settings.testRequired":"Vui lòng kiểm tra kết nối trước khi lưu","settings.language":"Ngôn ngữ","settings.searchMode":"Chế độ tìm kiếm","settings.none":"Không có","settings.updates":"Cập nhật","settings.updateChecking":"Đang kiểm tra bản cập nhật…","settings.updateUnavailable":"Hiện chưa thể kiểm tra bản cập nhật","settings.updateNoSuccessfulChecks":"Chưa có lần kiểm tra cập nhật nào thành công","settings.upToDate":"Đã là bản mới nhất","settings.updateAvailable":"Có bản cập nhật mới","settings.updateStale":"Trạng thái lưu đệm hiển thị có thể đã cũ","settings.updateCachedFallback":"Đang dùng kết quả lưu đệm thành công gần nhất","settings.updateDeprecatedNoTarget":"Đã ngừng dùng — chưa có phiên bản nâng cấp","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} đã bị maintainer đánh dấu NGỪNG DÙNG (DEPRECATED).","settings.updatePartialTitle":"⚠️ Kiểm tra cập nhật chưa hoàn tất","settings.updatePartialDescription":"{message}. Phiên này chưa thể xác định trạng thái ngừng dùng — hãy chạy lại khi có mạng.","settings.updatePartialSummary":"Một phần — chưa xác nhận trạng thái ngừng dùng","settings.updateDeprecatedTargetUnknown":"Đã ngừng dùng — đang tìm phiên bản nâng cấp","settings.currentVersion":"Phiên bản hiện tại","settings.latestVersion":"Phiên bản mới nhất","settings.lastChecked":"Lần kiểm tra gần nhất","settings.lastAttempted":"Lần thử kiểm tra gần nhất","settings.lastSuccessful":"Lần kiểm tra thành công gần nhất","settings.updateSourceFresh":"Kiểm tra mới","settings.updateSourceCached":"Đang dùng kết quả lưu đệm","settings.updateSourceStale":"Đang dùng kết quả lưu đệm đã cũ","settings.updateSourceUnavailable":"Không có kết quả lưu đệm","settings.updateCommand":"Lệnh cập nhật","settings.checkNow":"Kiểm tra ngay","settings.updateLastError":"Lỗi kiểm tra gần nhất: {message}","settings.installMethod":"Kiểu cài đặt","settings.installNpmGlobal":"cài đặt npm toàn cục","settings.installNpmLocal":"cài đặt cục bộ trong dự án","settings.installSourceCheckout":"bản checkout mã nguồn","settings.installUnknown":"không rõ","settings.updateGuidanceNpmGlobal":"Bản cài đặt này có thể được cập nhật trực tiếp từ MeMesh.","settings.updateGuidanceNpmLocal":"Hãy cập nhật bản cài đặt này bằng trình quản lý gói của dự án đã cài MeMesh.","settings.updateGuidanceSourceCheckout":"Hãy cập nhật bản checkout mã nguồn này từ kho lưu trữ rồi build lại.","settings.updateGuidanceUnknown":"Hãy cập nhật bản cài đặt này bằng công cụ hoặc quy trình đã dùng để cài MeMesh.","graph.entities":"Thực thể","graph.relations":"Quan hệ","graph.orphans":"Nút 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","graph.interactHint":"Nhấp một nút để tập trung · kéo vùng trống để di chuyển · cuộn để thu phóng","graph.resetView":"Đặt lại chế độ xem","graph.resetViewHint":"Đặt lại thu phóng và vị trí","graph.ageToday":"hôm nay","graph.ageDaysAgo":"{count} ngày trước","graph.ageWeeksAgo":"{count} tuần trước","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","feedback.submitting":"Đang thu thập chẩn đoán…","doctorBanner.warnTitleSoft":"memesh có vài ghi chú cài đặt","doctorBanner.failTitle":"Cài đặt memesh chưa hoàn tất","doctorBanner.dismiss":"Đóng","doctorBanner.getHelp":"Nhận trợ giúp","doctorBanner.helpHint":"Mở một GitHub issue với chẩn đoán đã điền sẵn","doctorBanner.preambleForIssue":"memesh doctor báo cáo những vấn đề sau trên cài đặt của tôi:","doctorBanner.moreCount":"…và {n} mục nữa — chạy `memesh doctor` để xem danh sách đầy đủ","doctor.label.readme_locale_parity":"Bản dịch README","doctor.label.config":"Tệp cấu hình","doctor.label.mcp-config":"Tệp kết nối MCP","doctor.label.hooks-config":"Định nghĩa hook","doctor.label.hook-scripts":"Script hook","doctor.label.hook-wiring":"Kết nối với Claude Code","doctor.label.hook-activity":"Tự động ghi nhớ","doctor.label.node-runtime":"Phiên bản Node.js","doctor.label.native-binding":"SQLite và tìm kiếm vector","doctor.label.shell-cli":"Lệnh trong terminal","doctor.label.dashboard":"Tệp bảng điều khiển","doctor.label.update-status":"Cập nhật","doctor.label.http-probe":"Máy chủ cục bộ","doctor.label.skills-manifest":"Tệp đi kèm","doctor.label.config_parse":"Tệp cấu hình","doctor.label.embeddings_probe":"Tìm kiếm theo nghĩa","doctor.label.llm_probe":"Nhà cung cấp AI","doctor.label.install-channel":"Cách cài đặt","doctor.label.fts_segmentation":"Chỉ mục từ khóa","doctor.label.vector_index":"Chỉ mục tìm kiếm","doctor.label.database":"Cơ sở dữ liệu","doctor.msg.readme-parity.unreadable.summary":"Không đọc được README.md: {detail}","doctor.msg.readme-parity.drift.summary":"Một số README bản dịch đã lệch so với bản tiếng Anh: {detail}","doctor.msg.readme-parity.drift.fix":"Đồng bộ lại các README được liệt kê với README.md.","doctor.msg.config.invalid-json.summary":"Tệp cấu hình tại {path} không phải JSON hợp lệ nên đang bị bỏ qua.","doctor.msg.config.invalid-json.fix":"Sửa hoặc xóa {path}, rồi chạy `memesh config list` để xác nhận nó tải được.","doctor.msg.mcp-config.missing.summary":"Tệp nối memesh với Claude Code (.mcp.json) đã biến mất.","doctor.msg.mcp-config.missing.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json bị hỏng (không phải JSON hợp lệ) nên Claude Code không đọc được.","doctor.msg.mcp-config.invalid-json.fix":"Sửa {path} hoặc cài lại MeMesh.","doctor.msg.mcp-config.no-entry.summary":".mcp.json không còn mục máy chủ memesh nữa.","doctor.msg.mcp-config.no-entry.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` khởi chạy một tệp không có trong bản cài này, nên mọi công cụ memesh trong Claude Code đều không khởi động được.","doctor.msg.mcp-config.entry-missing.fix":"Cài lại MeMesh. Nếu bạn tự sửa `.mcp.json`, hãy trỏ nó về `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json đã biến mất nên tính năng ghi nhớ tự động không chạy được.","doctor.msg.hooks-config.missing.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json bị hỏng (không phải JSON hợp lệ).","doctor.msg.hooks-config.invalid-json.fix":"Sửa {path} hoặc cài lại MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json thiếu các loại hook sau: {types}. Một phần ghi nhận tự động sẽ không chạy.","doctor.msg.hooks-config.missing-types.fix":"Khôi phục cấu hình hook gốc hoặc cài đặt lại MeMesh.","doctor.msg.hook-scripts.none.summary":"Cấu hình hook không có script nào nên không thể ghi tự động thứ gì.","doctor.msg.hook-scripts.none.fix":"Cài lại MeMesh.","doctor.msg.hook-scripts.missing.summary":"Các script hook sau đã biến mất: {files}","doctor.msg.hook-scripts.missing.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.hook-scripts.not-executable.summary":"Các script hook sau tồn tại nhưng không được phép chạy: {files}","doctor.msg.hook-scripts.not-executable.fix":"Chạy `chmod +x scripts/hooks/*.js`, hoặc `npm run build` nếu dùng mã nguồn.","doctor.msg.hook-wiring.no-marker.summary":"memesh chưa được nối với Claude Code nên chưa có gì được ghi nhớ tự động.","doctor.msg.hook-wiring.no-marker.fix":"Chạy `memesh install-hooks` một lần, rồi chạy `memesh doctor` để xác nhận.","doctor.msg.hook-wiring.script-missing.summary":"Một hook memesh đã đấu nối trỏ tới {path}, nhưng tệp này không còn tồn tại — agent gọi một tệp không có ở mỗi sự kiện tương ứng. Thường là tàn dư của bản nâng cấp đã loại bỏ hook đó.","doctor.msg.hook-wiring.script-missing.fix":"Chạy `memesh install-hooks` để đấu nối lại (các mục đã loại bỏ sẽ bị xoá), rồi khởi động lại agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"Không đọc được bản ghi kết nối tại {path}.","doctor.msg.hook-wiring.marker-unreadable.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.marker-malformed.summary":"Bản ghi kết nối bị hỏng.","doctor.msg.hook-wiring.marker-malformed.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.settings-missing.summary":"Tệp cài đặt của Claude Code ({path}) đã biến mất nên kết nối bị đứt.","doctor.msg.hook-wiring.settings-missing.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} bị hỏng (không phải JSON hợp lệ).","doctor.msg.hook-wiring.settings-invalid.fix":"Khôi phục từ bản sao lưu, hoặc chạy `memesh install-hooks` để tạo lại.","doctor.msg.hook-wiring.entries-removed.summary":"Các mục memesh đã bị gỡ khỏi {path} nên kết nối bị đứt.","doctor.msg.hook-wiring.entries-removed.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.root-moved.summary":"Kết nối trỏ tới {path}, nơi này không còn tồn tại (memesh có lẽ đã bị di chuyển).","doctor.msg.hook-wiring.root-moved.fix":"Chạy `memesh install-hooks` để cập nhật.","doctor.msg.hook-activity.never-ran.summary":"Không có hook thu thập nào chạy trong {hours} giờ kể từ khi bắt đầu theo dõi, dù đấu nối hook vẫn ổn — không có gì được ghi nhớ.","doctor.msg.hook-activity.never-ran.fix":"Hoàn tất một phiên làm việc rồi chạy lại `memesh doctor`. Nếu vẫn báo chưa có hook nào chạy, chạy `memesh install-hooks` rồi khởi động lại agent.","doctor.msg.hook-activity.stale.summary":"Hook thu thập cuối cùng chạy khoảng {hours} giờ trước ({hook}). Nếu bạn đã làm việc kể từ đó, việc thu thập đã dừng và không có gì từ các phiên đó được lưu.","doctor.msg.hook-activity.stale.fix":"Khởi động lại agent, kết thúc một phiên rồi chạy lại `memesh doctor`. Nếu không khôi phục, chạy `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Hook session-summary chạy lần cuối khoảng {hours} giờ trước, và 3 ngày qua cũng không có ghi nào từ Claude Code. Nếu máy này đã chuyển sang agent khác (Codex / Gemini), điều này là bình thường; nếu bạn vẫn dùng Claude Code ở đây, thu thập đã dừng.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Nếu bạn vẫn dùng Claude Code trên máy này: khởi động lại, kết thúc một phiên rồi chạy lại `memesh doctor`. Nếu không hồi phục, chạy `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Không đọc được hoạt động hook từ cơ sở dữ liệu: {detail}. Tình trạng thu thập là không rõ, và điều đó không giống với bình thường.","doctor.msg.hook-activity.query-failed.fix":"Chạy `memesh doctor --verbose` để xem lỗi đầy đủ, và kiểm tra ~/.memesh đọc được và đĩa còn chỗ trống.","doctor.msg.hook-activity.stale-unknown.summary":'Không đọc được thời điểm chạy gần nhất của hook {hook} (dữ liệu hỏng, hoặc do một máy lệch đồng hồ ghi). Tình trạng thu thập hiện là "không rõ", và điều đó không giống "khỏe mạnh".',"doctor.msg.hook-activity.stale-unknown.fix":"Kết thúc một phiên làm việc rồi chạy lại `memesh doctor` — lần chạy mới sẽ ghi đè dấu thời gian hỏng.","doctor.msg.hook-activity.disabled.summary":"Thu thập tự động đang tắt (MEMESH_AUTO_CAPTURE hoặc autoCapture trong cấu hình) — do chủ ý, nên hook im lặng là điều dự kiến. Bật lại để tiếp tục thu thập phiên.","doctor.msg.hook-activity.disabled-env.summary":"Thu thập tự động bị tắt bởi MEMESH_AUTO_CAPTURE=false trong môi trường shell này. doctor chỉ thấy được môi trường của chính nó — nếu agent của bạn chạy không có biến này, thu thập ở đó không bị ảnh hưởng.","doctor.msg.hook-activity.not-wired.summary":"Chưa có hook thu thập nào từng chạy — và trên máy này không xác nhận được hook thu thập nào (Stop / PostToolUse / PreCompact) đã đấu nối, nên không có gì để chạy.","doctor.msg.hook-activity.not-wired.fix":"Nếu muốn thu thập tự động, chạy `memesh install-hooks`. Nếu bản cài này chỉ dùng MCP (Codex / Gemini), đây là bình thường và có thể bỏ qua.","doctor.msg.hook-activity.stop-silent.summary":"Hook {hook} vẫn đang ghi dấu, nhưng hook session-summary chưa từng chạy lần nào trong {hours} giờ kể từ khi bắt đầu theo dõi — thu thập phiên có thể đã hỏng, bị che bởi thu thập commit.","doctor.msg.hook-activity.stop-silent.fix":"Kết thúc một phiên làm việc rồi chạy lại `memesh doctor`. Nếu session-summary vẫn chưa chạy, chạy `memesh install-hooks` và khởi động lại agent.","doctor.msg.hook-activity.never-ran-legacy.summary":"Chưa hook nào ghi dấu nhịp tim, nhưng từ khi bắt đầu theo dõi đã có {captured} ký ức thu thập tự động — nhiều khả năng hook từ phiên bản trước khi có theo dõi nhịp tim vẫn đang chạy.","doctor.msg.hook-activity.never-ran-legacy.fix":"Cập nhật hook memesh lên phiên bản hiện tại (plugin: `/plugin update memesh`; npm: `memesh install-hooks`), rồi khởi động lại agent.","doctor.msg.node-runtime.too-old.summary":"Node.js của bạn cũ hơn mức gói này hỗ trợ. {detail}","doctor.msg.node-runtime.too-old.fix":"Nâng cấp Node.js lên {required} trở lên, rồi chạy lại `memesh doctor`.","doctor.msg.native-binding.node-too-old.summary":"SQLite tích hợp trong bản Node này quá cũ với memesh — nó không tải được phần tìm kiếm theo ý nghĩa. Bản đầy đủ có từ Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Nâng Node lên 22.13 trở lên rồi chạy lại `memesh doctor`.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec chưa được cài. Ký ức vẫn được lưu và tìm bằng từ khoá — chỉ tìm theo ý nghĩa là tắt.","doctor.msg.native-binding.not-installed.fix":"Chạy `npm install` trong thư mục dùng @pcircle/memesh.","doctor.msg.native-binding.load-failed.summary":"Không tải được sqlite-vec: {detail}. Tìm kiếm chỉ còn dùng từ khoá.","doctor.msg.native-binding.load-failed.fix":'Chạy: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"Lệnh `memesh` không có sẵn trong terminal của bạn. Các tính năng Claude Code vẫn hoạt động — chỉ ảnh hưởng khi bạn tự gõ `memesh`.","doctor.msg.shell-cli.not-on-path.fix":"Chạy `npm install -g @pcircle/memesh` để thêm. Hai bản cài dùng chung một bộ nhớ.","doctor.msg.dashboard.missing.summary":"Tệp bảng điều khiển đã biến mất.","doctor.msg.dashboard.missing.fix":"Tạo lại bằng `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"memesh chưa kiểm tra được có phiên bản mới hơn hay không.","doctor.msg.update-status.no-cache.fix":"Chạy `memesh status` một lần khi có mạng — kết quả được lưu và thông báo này sẽ biến mất.","doctor.msg.update-status.deprecated.summary":"Phiên bản {version} đã bị nhóm phát triển rút lại: {detail}","doctor.msg.update-status.deprecated.fix":"Cập nhật ngay — chạy `memesh update` (hoặc làm theo cách cài đặt của bạn).","doctor.msg.update-status.deprecation-unknown.summary":"Không xác nhận được phiên bản {version} còn an toàn để dùng hay không: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Chạy `memesh status` khi có mạng để thử lại.","doctor.msg.update-status.update-available.summary":"Đã có phiên bản mới hơn: {latest} (bạn đang dùng {current}).","doctor.msg.update-status.update-available.fix":"Chạy `memesh update` để nâng cấp.","doctor.msg.update-status.stale.summary":"Phiên bản {version} là mới nhất, nhưng thông tin cập nhật đã cũ.","doctor.msg.update-status.stale.fix":"Chạy `memesh status` khi có mạng để làm mới.","doctor.msg.http-probe.bad-status.summary":"Máy chủ cục bộ tại {url} trả về lỗi (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Khởi động lại bằng `memesh serve` và xem log.","doctor.msg.http-probe.no-server.summary":"Không có máy chủ cục bộ nào đang chạy tại {url}.","doctor.msg.http-probe.no-server.fix":"Muốn dùng bảng điều khiển thì khởi động bằng `memesh serve`.","doctor.msg.skills-manifest.missing-dev.summary":"Không tìm thấy danh sách kiểm tra toàn vẹn tệp (bình thường khi chạy từ mã nguồn).","doctor.msg.skills-manifest.missing-dev.fix":"Chạy `npm run build` để tạo.","doctor.msg.skills-manifest.unreadable.summary":"Không đọc được danh sách kiểm tra toàn vẹn tệp ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Cài lại: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"Danh sách kiểm tra toàn vẹn tệp bị trống.","doctor.msg.skills-manifest.empty.fix":"Cài lại: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Một số tệp đi kèm không khớp với bản phát hành: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Cài lại: `npm install -g @pcircle/memesh`. Nếu cài mới mà vẫn bị, hãy báo cáo như một vấn đề bảo mật.","doctor.msg.config-parse.not-object.summary":"Tệp cấu hình tại {path} không đúng định dạng mong đợi nên mọi thiết lập đang bị bỏ qua.","doctor.msg.config-parse.not-object.fix":"Sửa hoặc xóa {path}, rồi chạy lại `memesh doctor`.","doctor.msg.config-parse.unreadable.summary":"Không đọc được tệp cấu hình tại {path} ({detail}) nên mọi thiết lập đang bị bỏ qua.","doctor.msg.config-parse.unreadable.fix":"Sửa tệp, hoặc tạm dời nó đi: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'Tìm kiếm theo nghĩa được đặt là "{provider}" nhưng khi thử không cho ra gì. Tìm kiếm từ khóa vẫn hoạt động.',"doctor.msg.embeddings.empty.fix":"Chạy `memesh doctor --probe` để xem chi tiết, hoặc kiểm tra kết nối tới nhà cung cấp.","doctor.msg.embeddings.threw.summary":'Tìm kiếm theo nghĩa được đặt là "{provider}" nhưng thử bị lỗi: {detail}. Tìm kiếm từ khóa vẫn hoạt động.',"doctor.msg.embeddings.threw.fix":"Kiểm tra xem nhà cung cấp embedding có kết nối được không (ví dụ chạy `ollama serve`), hoặc xóa cấu hình embedder để dùng tìm kiếm chỉ theo từ khóa.","doctor.msg.llm.unreachable.summary":"Nhà cung cấp AI ({provider}) không trả lời: {detail}. Các tính năng AI đang âm thầm không làm gì cả.","doctor.msg.llm.unreachable.fix":"Kiểm tra API key và kết nối, rồi chạy lại `memesh doctor --probe`.","doctor.msg.llm.threw.summary":"Thử nhà cung cấp AI ({provider}) bị lỗi: {detail}. Các tính năng AI đang âm thầm không làm gì cả.","doctor.msg.llm.threw.fix":"Kiểm tra API key và kết nối, rồi chạy lại `memesh doctor --probe`.","doctor.msg.install-channel.unknown.summary":"Không xác định được memesh đã được cài bằng cách nào.","doctor.msg.install-channel.unknown.fix":"Nếu là mã nguồn, hãy chạy từ thư mục gốc của repo; nếu không, cài lại bằng `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"Chỉ mục từ khóa có {count} mục ở định dạng cũ — một số ký ức chỉ tìm thấy khi khớp đúng toàn bộ nguyên văn.","doctor.msg.fts.unsegmented.fix":"Chạy `memesh reindex --fts` để xây lại chỉ mục.","doctor.msg.vector-index.stale.summary":"Chỉ mục tìm kiếm cần được xây lại (thiết lập tìm kiếm đã thay đổi).","doctor.msg.vector-index.stale.fix":"Chạy `memesh reindex` để xây lại.","doctor.msg.database.broken.summary":"Cơ sở dữ liệu không dùng được: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"đã dùng {used} / đã đưa vào {total}","analytics.loadFailed":"Không thể tải dữ liệu phân tích.","memory.noContent":"(không có nội dung)","memory.archivedBadge":"đã lưu trữ","memory.factsCount":"{count} dữ kiện","common.error":"Lỗi","common.serverUnreachable":"Không kết nối được máy chủ memesh.","common.serverUnreachableAction":"Hãy kiểm tra `memesh serve` còn đang chạy không, rồi tải lại trang này.","common.responseUnreadable":"Máy chủ đã phản hồi nhưng trang này không đọc được nội dung — phiên bản dashboard và máy chủ có thể không khớp.","common.responseUnreadableAction":"Tải lại trang. Nếu vẫn xảy ra, hãy chạy `memesh doctor`.","pm.title":"Chỉ số PM","pm.decisionsPerWeek":"quyết định/tuần","pm.openDecisions":"quyết định chưa xử lý (>14 ngày)","pm.orphanRate":"Ký ức chưa liên kết","pm.relationsTotal":"tổng số quan hệ","pm.stalePlans":"{count} kế hoạch chưa được xem lại hơn 30 ngày","common.loading":"Đang tải…","common.noData":"Không có dữ liệu","errors.unknown":"Lỗi không xác định","insights.noPreview":"Đề xuất này không có nội dung tóm tắt","httpError.auth.missing-bearer":"Máy chủ này cần mã truy cập. Hãy nhập mã để tiếp tục.","httpError.auth.invalid-token":"Mã truy cập không được chấp nhận. Kiểm tra lại và thử lần nữa.","httpError.auth.not-configured":"Máy chủ chưa thiết lập mã truy cập. Khởi động lại `memesh serve` và xem đầu ra của nó.","httpError.validation.bad-body":"Máy chủ không đọc được yêu cầu trang gửi. Tải lại trang rồi thử lại.","httpError.validation.bad-param":"Một phần của yêu cầu không hợp lệ. Tải lại trang rồi thử lại.","httpError.route.retired":"Máy chủ không còn hỗ trợ thao tác này — trang và máy chủ có thể khác phiên bản. Hãy tải lại trang.","httpError.route.not-found":"Máy chủ không nhận ra yêu cầu này — trang và máy chủ có thể khác phiên bản. Hãy tải lại trang.","httpError.resource.not-found":"Mục này không còn tồn tại. Hãy làm mới danh sách.","httpError.payload.too-large":"Dữ liệu gửi đi quá lớn (hơn 1 MB). Hãy chia thành phần nhỏ hơn.","httpError.operation.failed":"Máy chủ không thể hoàn tất thao tác này.","httpError.llm.not-configured":"Chưa thiết lập nhà cung cấp AI. Hãy thêm trong phần Cài đặt trước.","httpError.rate.limited":"Quá nhiều yêu cầu trong thời gian ngắn. Vui lòng đợi một lát rồi thử lại.","httpError.server.internal":"Máy chủ gặp lỗi không mong muốn.","settings.testError.auth":"Khóa API bị từ chối. Kiểm tra khóa và thử lại.","settings.testError.network":"Không kết nối được với nhà cung cấp. Kiểm tra kết nối mạng.","settings.testError.no_models":"Nhà cung cấp có phản hồi nhưng không trả về mô hình dùng được.","settings.testError.bad_host":"Địa chỉ Ollama phải nằm trên máy này (localhost).","settings.testError.http":"Nhà cung cấp trả về lỗi (HTTP {status}).","settings.testError.unknown":"Kiểm tra thất bại vì lý do không rõ.","time.justNow":"Vừa xong","time.hoursAgo":"{count} giờ trước","time.today":"Hôm nay","time.yesterday":"Hôm qua","time.daysAgo":"{count} ngày trước","time.lastWeek":"Tuần trước","time.weeksAgo":"{count} tuần trước","time.lastMonth":"Tháng trước","time.monthsAgo":"{count} tháng trước","memory.access.frequent":"Thường dùng · {count} lần","memory.access.recalls":"{count} lần","memory.access.never":"Chưa dùng","cluster.knowledge":"Kiến thức","cluster.activity":"Hoạt động","cluster.session":"Phiên","cluster.reference":"Tham chiếu","cluster.all":"Tất cả","browse.filterCategory":"Danh mục","browse.filterTime":"Thời gian","browse.filterValue":"Giá trị","browse.filterProject":"Dự án","browse.filterSort":"Sắp xếp","browse.timeToday":"Hôm nay","browse.timeWeek":"Tuần này","browse.timeMonth":"Tháng này","browse.timeOlder":"Cũ hơn","browse.valueRecalled":"✓ Đã dùng","browse.valueNever":"Chưa dùng","browse.sortMostRecalled":"Dùng nhiều nhất","browse.sortRecent":"Gần đây","browse.sortCreated":"Tạo lúc","browse.emptyFilter":"Không có ký ức trong danh mục này — thử bộ lọc khác","lessons.tabFailure":"Bài học thất bại","lessons.tabPlan":"Bản ghi kế hoạch","lessons.tabFreeform":"Ghi chú","lessons.totalRecalls":"Tổng lần nhớ lại","lessons.stepsLabel":"bước","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Không có trường có cấu trúc — xem bộ nhớ thô)","lessons.searchPlaceholder":"Tìm error / root cause / fix / tên…","lessons.allProjects":"Tất cả dự án","lessons.showing":"Hiển thị {visible} / {total}","lessons.noMatch":'Không có ký ức khớp với "{query}"',"lessons.emptyCategory":"Không có ký ức trong danh mục này","lessons.moreItems":"+{count} nữa","roadmap.title":"Lộ Trình Dự Án","roadmap.summary":"{count} ký ức · {first} → {last}","roadmap.switchToList":"↩ Xem danh sách","roadmap.switchToRoadmap":"🗺️ Xem lộ trình","roadmap.emptyProject":"Chưa có ký ức nào trong dự án này.","loop.label":"Vòng lặp ký ức","loop.subtitleHas":"ký ức kiến thức được nhớ lại trong 7 ngày qua","loop.subtitleNone":"Tuần này chưa có ký ức nào được nhớ lại","loop.approxNote":"Xấp xỉ — theo dõi đầy đủ bắt đầu sau khi nâng cấp.","loop.sparkLabel":"30 ngày qua","roadmap.milestones":"Cột mốc","roadmap.keyLessons":"Bài học chính","radar.title":"Radar phủ kiến thức","radar.caption":"Ký ức kiến thức hoạt động (không tính session và commit)","radar.axis.lessons":"Bài học","radar.axis.decisions":"Quyết định","radar.axis.patterns":"Mẫu","radar.axis.bugs":"Sửa lỗi","radar.axis.processes":"Quy trình","radar.axis.architecture":"Kiến trúc","ageMatrix.title":"Phân bố tuổi ký ức","ageMatrix.low":"Thấp","ageMatrix.high":"Cao","ageMatrix.legend":"độ đậm = mật độ","ageMatrix.typeColumn":"Loại","header.signalModeOn":"Tín hiệu","header.signalModeOff":"Tất cả","header.signalModeOnHint":"Ẩn nhiễu session và commit. Nhấp để hiện tất cả.","header.signalModeOffHint":"Đang hiện tất cả ký ức bao gồm nhiễu. Nhấp để ẩn.","roadmap.phases":"Giai đoạn","onboarding.title":"Chào mừng đến với MeMesh","onboarding.body":"Bộ nhớ của bạn đang trống. Bắt đầu với tour 30 thực thể được tuyển chọn hoặc lưu bài học đầu tiên.","onboarding.llmHint":"Không cần LLM. Mọi thứ đều hoạt động chỉ với FTS5. LLM là tùy chọn để tự động tạo bài học — có thể cấu hình sau trong Cài đặt.","onboarding.seedButton":"Bắt đầu tour demo","onboarding.seedingButton":"Đang nạp…","onboarding.seedHint":"Thêm 30 ký ức ngay tại đây — không cần mở terminal","onboarding.cliReference":"Thích dùng CLI?","onboarding.hintDemo":"Khởi tạo 30 ký ức demo, có thể xóa sau","onboarding.hintReset":"Xóa tất cả mục có metadata.demo","onboarding.resetButton":"Xóa demo","onboarding.resettingButton":"Đang xóa…","onboarding.resetConfirm":"Xóa toàn bộ ký ức demo? Các mục bạn tự lưu vẫn được giữ lại.","onboarding.dismiss":"Đóng","common.serverError":"Máy chủ báo lỗi (HTTP {status}). Hãy thử lại — nếu vẫn xảy ra, chạy `memesh doctor`.","emptyLibrary.title":"Bộ nhớ của bạn đang trống","emptyLibrary.body":"Chưa có gì được lưu. Hãy nạp bản demo 30 mục để xem MeMesh hoạt động — có thể xóa sau chỉ với một cú nhấp.","browse.truncated":"đang hiển thị {shown} ký ức đầu tiên trong tổng số {total} — dùng tìm kiếm hoặc bộ lọc để xem phần còn lại","lessons.capNote":"chỉ tải {limit} bài học đầu tiên — số liệu phía trên chỉ tính trong phạm vi này","lessons.emptyGuide":"Chưa có bài học nào. Ở Smart Mode, memesh tự lưu khi phân tích một phiên thất bại — hoặc nhờ trợ lý của bạn ghi lại một bài.","graph.cappedNote":"Chỉ hiển thị {shown} thực thể hàng đầu trong {total} (theo số lần gợi nhớ) để giữ đồ thị mượt mà.","settings.testStoredKeyHint":"Để trống ô này để kiểm tra khóa đã lưu.","ageMatrix.bucket.week":"Tuần này","ageMatrix.bucket.month":"Tháng này","ageMatrix.bucket.quarter":"Quý này","ageMatrix.bucket.older":"Cũ hơn","settings.behaviourTitle":"Hành vi","settings.autoUpdateLabel":"Chính sách tự động cập nhật","settings.autoUpdateOff":"Tắt — chỉ thủ công","settings.autoUpdatePatch":"Patch — áp dụng X.Y.Z+1","settings.autoUpdateMinor":"Minor — áp dụng X.Y+1.0","settings.autoUpdateMajor":"Major — áp dụng mọi cấp","settings.autoUpdateHint":"Kích hoạt sau mỗi phiên. MEMESH_AUTO_UPDATE ưu tiên.","errors.timeout":"Yêu cầu đã hết thời gian chờ","type.lesson_learned":"Bài học","type.lesson":"Bài học","type.mistake":"Sai sót","type.decision":"Quyết định","type.architecture_decision":"QĐ kiến trúc","type.design_decision":"QĐ thiết kế","type.pattern":"Mẫu","type.technical_pattern":"Mẫu kỹ thuật","type.best_practice":"Best practice","type.bug_fix":"Sửa lỗi","type.verification_result":"Kết quả xác minh","type.test_result":"Kết quả kiểm thử","type.process":"Quy trình","type.architecture":"Kiến trúc","type.infrastructure":"Hạ tầng","type.feature":"Tính năng","type.release":"Bản phát hành","type.refactoring":"Tái cấu trúc","type.commit":"Commit","type.session_keypoint":"Điểm chính phiên","type.session_identity":"Danh tính phiên","type.session-insight":"Insight phiên","type.session-summary":"Tóm tắt phiên","type.session-identity":"Danh tính phiên","type.weekly_summary":"Tóm tắt tuần","type.weekly-summary":"Tóm tắt tuần","type.note":"Ghi chú","type.plan":"Kế hoạch","type.knowledge":"Kiến thức","type.workflow_checkpoint":"Mốc","type.concept":"Khái niệm","type.tool":"Công cụ","type.person":"Người","relation.relates_to":"liên quan đến","relation.related-to":"liên quan đến","relation.depends_on":"phụ thuộc vào","relation.implements":"hiện thực","relation.learned_from":"học từ","relation.supersedes":"thay thế","relation.contradicts":"mâu thuẫn","relation.follows":"tiếp nối","relation.belongs-to-project":"thuộc dự án","relation.co-created":"cùng tạo","relation.shares-name-tokens":"tên tương tự","patterns.day.0":"Chủ nhật","patterns.day.1":"Thứ hai","patterns.day.2":"Thứ ba","patterns.day.3":"Thứ tư","patterns.day.4":"Thứ năm","patterns.day.5":"Thứ sáu","patterns.day.6":"Thứ bảy","telemetry.flow.dreamer":"Tóm tắt tuần (dreamer)","telemetry.flow.pattern_detector":"Bộ phát hiện mẫu","telemetry.flow.digest_validator":"Bộ kiểm tra tóm tắt","telemetry.flow.auto_tagger":"Gắn thẻ tự động","telemetry.flow.failure_analyzer":"Phân tích thất bại","telemetry.flow.transcript_extractor":"Khai thác bản ghi","telemetry.flow.conflict_judge":"Phán định xung đột","telemetry.errorClass.auth":"xác thực bị từ chối","telemetry.errorClass.rate_limit":"giới hạn tốc độ","telemetry.errorClass.upstream":"nhà cung cấp gặp sự cố","telemetry.errorClass.bad_request":"yêu cầu không hợp lệ","telemetry.errorClass.network":"mạng","telemetry.errorClass.parse":"phản hồi không đọc được","telemetry.errorClass.unknown":"không rõ","lessons.severity.critical":"Nghiêm trọng","lessons.severity.major":"Lớn","lessons.severity.minor":"Nhỏ","memory.tooltip.project":"Dự án","memory.tooltip.recalled":"Đã nhớ lại {count} lần","memory.tooltip.hasRelations":"Liên kết với {count} ký ức khác","memory.tooltip.createdAt":"Tạo lúc {date}","graph.drift":"Độ mới","graph.driftHint":"Tô màu theo độ mới: đỏ = lâu không dùng, xanh lá = mới dùng gần đây","common.unknown":"không rõ","insights.entitiesCount":"{n} thực thể","roadmap.viewToggle":"Chế độ xem lộ trình","roadmap.viewTree":"Cây","roadmap.viewMindmap":"Sơ đồ tư duy","roadmap.mindmapNeedsPhases":"Sơ đồ tư duy cần ít nhất 3 ký ức trong vòng 7 ngày.","roadmap.activePhase":"đang diễn ra","roadmap.entryCount":"{count} mục","roadmap.entriesCount":"{count} mục","roadmap.otherGroup":"Khác ({count})","roadmap.lowSignalHidden":"(đã ẩn {count} tín hiệu thấp)","roadmap.resetHint":"Đặt lại thu phóng và vị trí (nhấp đúp nền cũng được)","roadmap.zoomHint":"cuộn để thu phóng · kéo để di chuyển · {pct}%","roadmap.moreEntities":"+{count} nữa","nav.ariaLabel":"Các mục bảng điều khiển","feedback.descLabel":"Nội dung phản hồi","graph.canvasA11y":"Đồ thị tri thức (vẽ trên canvas): {entities} thực thể, {relations} quan hệ, {orphans} chưa kết nối. Dùng bộ lọc loại và tìm kiếm ở trên để xem không trực quan."},es:{"auth.title":"Autenticación requerida","auth.intro":"Este panel está protegido por un token bearer. Pega el valor de MEMESH_REMOTE_TOKEN (o el contenido de <memeshDir>/remote-token) a continuación.","auth.tokenLabel":"Token","auth.empty":"El token no puede estar vacío.","auth.invalid":"Ese token no fue aceptado. Compruébalo e inténtalo de nuevo.","auth.submit":"Desbloquear panel","auth.tokenPlaceholder":"pega el token aquí","brand.subtitle":"powered by pcircle.com","header.connected":"Conectado","header.disconnected":"Desconectado","header.connecting":"Conectando…","header.memories":"memorias","tab.insights":"Insights","telemetry.title":"Actividad del LLM","telemetry.lastNDays":"últimos {n}d","telemetry.loading":"cargando…","telemetry.empty":"Aún no hay actividad de IA en este período. Las filas aparecen automáticamente cuando se ejecutan las funciones de IA en segundo plano (como resúmenes semanales y etiquetado automático).","telemetry.callsCount":"{n} llamadas","telemetry.attemptsCount":"{n} intentos","telemetry.successRate":"éxito","telemetry.medianLatency":"latencia mediana","telemetry.fallbackUsed":"fallback usado {n}× ({pct} de las llamadas)","telemetry.byProvider":"por proveedor","telemetry.byModel":"por modelo","telemetry.byProject":"por proyecto","telemetry.errors":"errores","insights.title":"Lo que memesh hizo por ti","insights.subtitle":"recaps semanales y patterns generados automáticamente, esperando revisión","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"Todos","insights.refresh":"Actualizar","insights.loading":"cargando…","insights.emptyPending":"No hay insights pending. Ejecuta `memesh dream run` para generar weekly recaps.","insights.emptyNoLlm":"Configura un proveedor de LLM en Ajustes para activar weekly recaps y detección de patterns.","insights.emptyOther":"Nada por aquí.","insights.sources":"fuentes","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"Ver detalle","insights.collapse":"Contraer","insights.accept":"Aceptar","insights.applying":"Aplicando…","insights.reject":"Rechazar","insights.generatedBy":"Generado por","insights.promptVersion":"Versión del prompt","insights.observations":"Observaciones resumidas","insights.tags":"Etiquetas","insights.sourceIds":"Fuentes","insights.validationWarnings":"Afirmaciones marcadas (LLM validator)","insights.validationClaim":"Afirmación","insights.validationReason":"Motivo","insights.runDream":"Ejecutar weekly recap","insights.runDreamWithValidate":"Ejecutar con validator (más lento, mayor calidad)","banner.pendingInsights":"{n} nuevo(s) insight{s} esperando tu revisión →","banner.dismiss":"Descartar","banner.viewAll":"Ver todos","pattern.title":"Pattern","pattern.evidenceCount":"{n} evidencia(s)","pattern.severity":"Severidad","pattern.severity.high":"alta","pattern.severity.medium":"media","pattern.severity.low":"baja","pattern.description":"Descripción del pattern","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.hint":"Busca por nombre, contenido o etiquetas. Encuentra palabras exactas y significados similares.","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","browse.archiveFailed":"No se pudo archivar la memoria: {message}","browse.restoreFailed":"No se pudo restaurar la memoria: {message}","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.entityMeta":"{type} · confianza {confidence}% · {days} d sin uso","settings.capabilities":"Capacidades","settings.smartMode":"Modo inteligente","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Proveedor LLM","settings.llmOptional.title":"LLM es opcional","settings.llmOptional.body":"memesh funciona sin LLM. El modo Core por defecto cubre búsqueda de texto completo, remember/recall manual, dashboard y captura de sesión mediante hooks.","settings.llmOptional.coreLabel":"Sin LLM (modo Core)","settings.llmOptional.coreFeatures":"búsqueda por palabra clave FTS5, remember/recall manual, dashboard, captura de sesión vía hooks","settings.llmOptional.smartLabel":"Con LLM (modo Smart)","settings.llmOptional.smartFeatures":"lesson_learned automático a partir de fallos de sesión, auto-etiquetado de nuevas entidades, resumen semanal + detección de patrones","settings.apiKey":"Clave API","settings.fallbacks.title":"Proveedores de respaldo","settings.fallbacks.explainer":"Si tu proveedor principal no está disponible, memesh prueba estos en orden hasta que uno funcione.","settings.fallbacks.privacyTitle":"Nota de privacidad","settings.fallbacks.privacyBody":"Añadir un proveedor en la nube (OpenAI o Anthropic) significa que, cuando tu proveedor principal esté caído, el contenido de tu memoria —que puede ser privado— se envía a ese proveedor en la nube. Si usas un proveedor local por privacidad, añade un respaldo en la nube solo si aceptas esta contrapartida.","settings.fallbacks.empty":"Aún no hay proveedores de respaldo.","settings.fallbacks.add":"Añadir proveedor de respaldo","settings.fallbacks.providerLabel":"Proveedor","settings.fallbacks.modelLabel":"Modelo (opcional)","settings.fallbacks.modelPlaceholder":"p. ej., gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"Hay una clave guardada. Déjalo en blanco para conservarla.","settings.fallbacks.remove":"Quitar","settings.fallbacks.moveUp":"Subir","settings.fallbacks.moveDown":"Bajar","settings.fallbacks.priority":"Prioridad {n}","settings.fallbacks.save":"Guardar cadena de respaldo","settings.fallbacks.needsKey":"Introduce una clave de API, o este respaldo en la nube no podrá usarse.","settings.model":"Modelo (opcional)","settings.save":"Guardar","settings.saving":"Guardando…","settings.saved":"Guardado.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Probar","settings.testing":"Probando…","settings.testPassed":"✓ Conexión OK · {count} modelos disponibles","settings.testFailed":"Error en la prueba de conexión","settings.suggested":"sugerido","settings.testRequired":"Pruebe la conexión antes de guardar","settings.language":"Idioma","settings.searchMode":"Modo de búsqueda","settings.none":"Ninguno","settings.updates":"Actualizaciones","settings.updateChecking":"Buscando actualizaciones…","settings.updateUnavailable":"No se pudo comprobar si hay actualizaciones ahora","settings.updateNoSuccessfulChecks":"Aún no hay comprobaciones de actualización correctas","settings.upToDate":"Ya está al día","settings.updateAvailable":"Actualización disponible","settings.updateStale":"El estado en caché mostrado puede estar desactualizado","settings.updateCachedFallback":"Usando el último resultado en caché correcto","settings.updateDeprecatedNoTarget":"Obsoleto — aún sin destino de actualización","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} fue marcado como OBSOLETO por los mantenedores.","settings.updatePartialTitle":"⚠️ Verificación de actualización parcial","settings.updatePartialDescription":"{message}. El estado de obsolescencia es desconocido en esta sesión — vuelva a ejecutar la verificación cuando esté en línea.","settings.updatePartialSummary":"Parcial — estado de obsolescencia desconocido","settings.updateDeprecatedTargetUnknown":"Obsoleto — buscando destino de actualización","settings.currentVersion":"Versión actual","settings.latestVersion":"Última versión","settings.lastChecked":"Última comprobación","settings.lastAttempted":"Último intento de comprobación","settings.lastSuccessful":"Última comprobación correcta","settings.updateSourceFresh":"Comprobación reciente","settings.updateSourceCached":"Usando resultado en caché","settings.updateSourceStale":"Usando resultado en caché desactualizado","settings.updateSourceUnavailable":"Sin resultado en caché","settings.updateCommand":"Comando de actualización","settings.checkNow":"Comprobar ahora","settings.updateLastError":"Error de la última comprobación: {message}","settings.installMethod":"Método de instalación","settings.installNpmGlobal":"instalación global con npm","settings.installNpmLocal":"instalación local del proyecto","settings.installSourceCheckout":"checkout del código fuente","settings.installUnknown":"desconocido","settings.updateGuidanceNpmGlobal":"Esta instalación se puede actualizar directamente desde MeMesh.","settings.updateGuidanceNpmLocal":"Actualiza esta instalación desde el gestor de paquetes del proyecto que instaló MeMesh.","settings.updateGuidanceSourceCheckout":"Actualiza este checkout desde su repositorio y vuelve a compilar.","settings.updateGuidanceUnknown":"Actualiza esta instalación con la herramienta o el flujo que instaló MeMesh.","graph.entities":"Entidades","graph.relations":"Relaciones","graph.orphans":"Huérfanos","graph.search":"Buscar nodos…","graph.matches":"coincidencias","graph.focusMode":"Enfoque","graph.showAll":"Mostrar todo","graph.clickHint":"Haz clic en un nodo para enfocar","graph.interactHint":"Clic en un nodo para enfocar · arrastra el área vacía para desplazar · rueda para zoom","graph.resetView":"Restablecer vista","graph.resetViewHint":"Restablecer zoom y posición","graph.ageToday":"hoy","graph.ageDaysAgo":"hace {count} d","graph.ageWeeksAgo":"hace {count} sem","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","feedback.submitting":"Recopilando diagnóstico…","doctorBanner.warnTitleSoft":"memesh tiene notas de configuración","doctorBanner.failTitle":"La configuración de memesh está incompleta","doctorBanner.dismiss":"Cerrar","doctorBanner.getHelp":"Obtener ayuda","doctorBanner.helpHint":"Abre un issue en GitHub con el diagnóstico ya rellenado","doctorBanner.preambleForIssue":"memesh doctor informó lo siguiente en mi instalación:","doctorBanner.moreCount":"…y {n} más — ejecuta `memesh doctor` para ver la lista completa","doctor.label.readme_locale_parity":"Traducciones del README","doctor.label.config":"Archivo de configuración","doctor.label.mcp-config":"Archivo de conexión MCP","doctor.label.hooks-config":"Definiciones de hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Conexión con Claude Code","doctor.label.hook-activity":"Captura automática","doctor.label.node-runtime":"Versión de Node.js","doctor.label.native-binding":"SQLite y búsqueda vectorial","doctor.label.shell-cli":"Comando de terminal","doctor.label.dashboard":"Archivos del panel","doctor.label.update-status":"Actualizaciones","doctor.label.http-probe":"Servidor local","doctor.label.skills-manifest":"Archivos incluidos","doctor.label.config_parse":"Archivo de configuración","doctor.label.embeddings_probe":"Búsqueda por significado","doctor.label.llm_probe":"Proveedor de IA","doctor.label.install-channel":"Método de instalación","doctor.label.fts_segmentation":"Índice de palabras clave","doctor.label.vector_index":"Índice de búsqueda","doctor.label.database":"Base de datos","doctor.msg.readme-parity.unreadable.summary":"No se pudo leer README.md: {detail}","doctor.msg.readme-parity.drift.summary":"Algunos README traducidos se desincronizaron del inglés: {detail}","doctor.msg.readme-parity.drift.fix":"Vuelve a sincronizar los README listados con README.md.","doctor.msg.config.invalid-json.summary":"El archivo de configuración en {path} no es JSON válido, así que se está ignorando.","doctor.msg.config.invalid-json.fix":"Arregla o borra {path}, y luego ejecuta `memesh config list` para confirmar que carga.","doctor.msg.mcp-config.missing.summary":"Falta el archivo que conecta memesh con Claude Code (.mcp.json).","doctor.msg.mcp-config.missing.fix":"Reinstala MeMesh para restaurarlo.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json está dañado (no es JSON válido), así que Claude Code no puede leerlo.","doctor.msg.mcp-config.invalid-json.fix":"Arregla {path} o reinstala MeMesh.","doctor.msg.mcp-config.no-entry.summary":".mcp.json ya no contiene la entrada del servidor memesh.","doctor.msg.mcp-config.no-entry.fix":"Reinstala MeMesh para restaurarla.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` arranca un archivo que no está en esta instalación, así que ninguna herramienta de memesh dentro de Claude Code puede iniciarse.","doctor.msg.mcp-config.entry-missing.fix":"Reinstala MeMesh. Si editaste `.mcp.json` a mano, vuelve a apuntarlo a `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.hooks-config.missing.summary":"Falta hooks/hooks.json, así que la captura automática de memoria no puede funcionar.","doctor.msg.hooks-config.missing.fix":"Reinstala MeMesh para restaurarlo.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json está dañado (no es JSON válido).","doctor.msg.hooks-config.invalid-json.fix":"Arregla {path} o reinstala MeMesh.","doctor.msg.hooks-config.missing-types.summary":"A hooks/hooks.json le faltan estos tipos de hook: {types}. Parte de la captura automática no se ejecutará.","doctor.msg.hooks-config.missing-types.fix":"Restaura la configuración de hooks original o reinstala MeMesh.","doctor.msg.hook-scripts.none.summary":"La configuración de hooks no tiene ningún script, así que nada puede capturarse automáticamente.","doctor.msg.hook-scripts.none.fix":"Reinstala MeMesh.","doctor.msg.hook-scripts.missing.summary":"Faltan estos scripts de hook: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstala MeMesh para restaurarlos.","doctor.msg.hook-scripts.not-executable.summary":"Estos scripts de hook existen pero no tienen permiso para ejecutarse: {files}","doctor.msg.hook-scripts.not-executable.fix":"Ejecuta `chmod +x scripts/hooks/*.js`, o `npm run build` si usas el código fuente.","doctor.msg.hook-wiring.no-marker.summary":"memesh aún no está conectado con Claude Code, así que nada se recuerda automáticamente.","doctor.msg.hook-wiring.no-marker.fix":"Ejecuta `memesh install-hooks` una vez, y luego `memesh doctor` para confirmar.","doctor.msg.hook-wiring.script-missing.summary":"Un hook memesh conectado apunta a {path}, que ya no existe — el agente invoca un archivo inexistente en cada evento correspondiente. Suele ser residuo de una actualización que retiró el hook.","doctor.msg.hook-wiring.script-missing.fix":"Ejecuta `memesh install-hooks` para reconectar (elimina entradas retiradas) y reinicia el agente.","doctor.msg.hook-wiring.marker-unreadable.summary":"El registro de conexión en {path} no se puede leer.","doctor.msg.hook-wiring.marker-unreadable.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.marker-malformed.summary":"El registro de conexión está dañado.","doctor.msg.hook-wiring.marker-malformed.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.settings-missing.summary":"El archivo de ajustes de Claude Code ({path}) desapareció, así que la conexión está rota.","doctor.msg.hook-wiring.settings-missing.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} está dañado (no es JSON válido).","doctor.msg.hook-wiring.settings-invalid.fix":"Restáuralo desde una copia de seguridad, o ejecuta `memesh install-hooks` para recrearlo.","doctor.msg.hook-wiring.entries-removed.summary":"Las entradas de memesh fueron eliminadas de {path}, así que la conexión está rota.","doctor.msg.hook-wiring.entries-removed.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.root-moved.summary":"La conexión apunta a {path}, que ya no existe (probablemente memesh se movió).","doctor.msg.hook-wiring.root-moved.fix":"Ejecuta `memesh install-hooks` para actualizarla.","doctor.msg.hook-activity.never-ran.summary":"Ningún hook de captura se ha ejecutado en las {hours} horas desde que empezó el seguimiento, aun con el cableado de hooks en su sitio — no se está guardando nada.","doctor.msg.hook-activity.never-ran.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor`. Si sigue diciendo que ningún hook se ejecutó, ejecuta `memesh install-hooks` y reinicia el agente.","doctor.msg.hook-activity.stale.summary":"El último hook de captura se ejecutó hace unas {hours} horas ({hook}). Si has trabajado desde entonces, la captura se detuvo y nada de esas sesiones se guardó.","doctor.msg.hook-activity.stale.fix":"Reinicia el agente, termina una sesión y vuelve a ejecutar `memesh doctor`. Si no se recupera, ejecuta `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"El hook session-summary se ejecutó por última vez hace unas {hours} horas, y tampoco llegó ninguna escritura de Claude Code en los últimos 3 días. Si esta máquina pasó a otro agente (Codex / Gemini), es lo esperado; si todavía usas Claude Code aquí, la captura se detuvo.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Si todavía usas Claude Code en esta máquina: reinícialo, termina una sesión y vuelve a ejecutar `memesh doctor`. Si no se recupera, ejecuta `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"No se pudo leer la actividad de los hooks en la base de datos: {detail}. El estado de la captura es desconocido, que no es lo mismo que sano.","doctor.msg.hook-activity.query-failed.fix":"Ejecuta `memesh doctor --verbose` para ver el error completo y comprueba que ~/.memesh se puede leer y que hay espacio en disco.","doctor.msg.hook-activity.stale-unknown.summary":"La marca de tiempo de la última ejecución del hook {hook} no se puede leer (corrupta, o escrita por una máquina con el reloj mal). El estado de la captura es «desconocido», que no es lo mismo que «sano».","doctor.msg.hook-activity.stale-unknown.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor` — una ejecución nueva sobrescribe la marca de tiempo dañada.","doctor.msg.hook-activity.disabled.summary":"La captura automática está desactivada (MEMESH_AUTO_CAPTURE o autoCapture en la configuración) — deliberadamente, así que el silencio de los hooks es lo esperado. Reactívala para volver a capturar sesiones.","doctor.msg.hook-activity.disabled-env.summary":"La captura automática está desactivada por MEMESH_AUTO_CAPTURE=false en el entorno de este shell. doctor solo ve su propio entorno — si tu agente corre sin esta variable, la captura allí no se ve afectada.","doctor.msg.hook-activity.not-wired.summary":"Ningún hook de captura se ha ejecutado nunca — y ningún hook de captura (Stop / PostToolUse / PreCompact) está confirmado como conectado en esta máquina, así que no hay nada que ejecutar.","doctor.msg.hook-activity.not-wired.fix":"Si quieres captura automática, ejecuta `memesh install-hooks`. Si esta instalación es solo MCP (Codex / Gemini), esto es lo esperado y puedes ignorarlo.","doctor.msg.hook-activity.stop-silent.summary":"El hook {hook} está sellando, pero el hook session-summary no se ha ejecutado ni una vez en las {hours} horas desde que empezó el seguimiento — la captura de sesiones puede estar rota, oculta tras la captura de commits.","doctor.msg.hook-activity.stop-silent.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor`. Si session-summary sigue sin ejecutarse, ejecuta `memesh install-hooks` y reinicia el agente.","doctor.msg.hook-activity.never-ran-legacy.summary":"Ningún hook ha sellado el latido, pero {captured} memorias de captura automática llegaron desde que empezó el seguimiento — probablemente siguen ejecutándose hooks de una versión anterior al seguimiento.","doctor.msg.hook-activity.never-ran-legacy.fix":"Actualiza los hooks de memesh a la versión actual (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) y reinicia el agente.","doctor.msg.node-runtime.too-old.summary":"Tu Node.js es más antiguo de lo que este paquete admite. {detail}","doctor.msg.node-runtime.too-old.fix":"Actualiza Node.js a {required} o más nuevo, y luego ejecuta `memesh doctor` de nuevo.","doctor.msg.native-binding.node-too-old.summary":"El SQLite integrado en esta versión de Node es demasiado antiguo para memesh: no puede cargar la parte que busca por significado. La versión completa llegó en Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Actualiza Node a 22.13 o posterior y vuelve a ejecutar `memesh doctor`.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec no está instalado. Los recuerdos se siguen guardando y encontrando por palabra clave — solo se apaga la búsqueda por significado.","doctor.msg.native-binding.not-installed.fix":"Ejecuta `npm install` en la carpeta que usa @pcircle/memesh.","doctor.msg.native-binding.load-failed.summary":"No se pudo cargar sqlite-vec: {detail}. La búsqueda vuelve a usar solo palabras clave.","doctor.msg.native-binding.load-failed.fix":'Ejecuta: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"El comando `memesh` no está disponible en tu terminal. Las funciones de Claude Code siguen funcionando — esto solo afecta a escribir `memesh` tú mismo.","doctor.msg.shell-cli.not-on-path.fix":"Ejecuta `npm install -g @pcircle/memesh` para añadirlo. Ambas instalaciones comparten la misma memoria.","doctor.msg.dashboard.missing.summary":"Faltan los archivos del panel.","doctor.msg.dashboard.missing.fix":"Constrúyelos con `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"memesh aún no ha podido comprobar si hay versiones más nuevas.","doctor.msg.update-status.no-cache.fix":"Ejecuta `memesh status` una vez con conexión — eso guarda la respuesta y este aviso desaparece.","doctor.msg.update-status.deprecated.summary":"La versión {version} fue retirada por sus mantenedores: {detail}","doctor.msg.update-status.deprecated.fix":"Actualiza ahora — ejecuta `memesh update` (o sigue tu método de instalación).","doctor.msg.update-status.deprecation-unknown.summary":"No se pudo confirmar si la versión {version} sigue siendo segura: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Ejecuta `memesh status` con conexión para reintentarlo.","doctor.msg.update-status.update-available.summary":"Hay una versión más nueva disponible: {latest} (tienes la {current}).","doctor.msg.update-status.update-available.fix":"Ejecuta `memesh update` para actualizar.","doctor.msg.update-status.stale.summary":"La versión {version} está al día, pero la información de actualizaciones es vieja.","doctor.msg.update-status.stale.fix":"Ejecuta `memesh status` con conexión para refrescarla.","doctor.msg.http-probe.bad-status.summary":"El servidor local en {url} respondió con un error (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Reinícialo con `memesh serve` y revisa los registros.","doctor.msg.http-probe.no-server.summary":"No hay ningún servidor local corriendo en {url}.","doctor.msg.http-probe.no-server.fix":"Arranca uno con `memesh serve` si quieres el panel.","doctor.msg.skills-manifest.missing-dev.summary":"No se encontró la lista de integridad de archivos (normal al ejecutar desde el código fuente).","doctor.msg.skills-manifest.missing-dev.fix":"Ejecuta `npm run build` para generarla.","doctor.msg.skills-manifest.unreadable.summary":"La lista de integridad de archivos no se puede leer ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Reinstala: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"La lista de integridad de archivos está vacía.","doctor.msg.skills-manifest.empty.fix":"Reinstala: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Algunos archivos incluidos no coinciden con lo distribuido: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Reinstala: `npm install -g @pcircle/memesh`. Si vuelve a pasar en una instalación limpia, repórtalo como un problema de seguridad.","doctor.msg.config-parse.not-object.summary":"El archivo de configuración en {path} no tiene el formato esperado, así que todos los ajustes se están ignorando.","doctor.msg.config-parse.not-object.fix":"Arregla o borra {path}, y luego ejecuta `memesh doctor` de nuevo.","doctor.msg.config-parse.unreadable.summary":"El archivo de configuración en {path} no se puede leer ({detail}), así que todos los ajustes se están ignorando.","doctor.msg.config-parse.unreadable.fix":"Arregla el archivo, o apártalo: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'La búsqueda por significado está configurada como "{provider}", pero no produjo nada en una prueba. La búsqueda por palabras clave sigue funcionando.',"doctor.msg.embeddings.empty.fix":"Ejecuta `memesh doctor --probe` para más detalle, o revisa la conexión con el proveedor.","doctor.msg.embeddings.threw.summary":'La búsqueda por significado está configurada como "{provider}", pero falló en una prueba: {detail}. La búsqueda por palabras clave sigue funcionando.',"doctor.msg.embeddings.threw.fix":"Revisa que el proveedor de embeddings esté accesible (p. ej. ejecuta `ollama serve`), o quita la config del embedder para usar solo búsqueda por palabras clave.","doctor.msg.llm.unreachable.summary":"El proveedor de IA ({provider}) no respondió: {detail}. Las funciones de IA no están haciendo nada, en silencio.","doctor.msg.llm.unreachable.fix":"Revisa la API key y la conexión, y luego ejecuta `memesh doctor --probe` de nuevo.","doctor.msg.llm.threw.summary":"La prueba del proveedor de IA ({provider}) falló: {detail}. Las funciones de IA no están haciendo nada, en silencio.","doctor.msg.llm.threw.fix":"Revisa la API key y la conexión, y luego ejecuta `memesh doctor --probe` de nuevo.","doctor.msg.install-channel.unknown.summary":"No se pudo saber cómo se instaló memesh.","doctor.msg.install-channel.unknown.fix":"Si es un checkout del código fuente, ejecuta desde la raíz del repositorio; si no, reinstala con `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"El índice de palabras clave tiene {count} entradas en un formato antiguo — algunas memorias solo aparecen con su texto completo exacto.","doctor.msg.fts.unsegmented.fix":"Ejecuta `memesh reindex --fts` para reconstruir el índice.","doctor.msg.vector-index.stale.summary":"El índice de búsqueda necesita reconstruirse (cambiaron los ajustes de búsqueda).","doctor.msg.vector-index.stale.fix":"Ejecuta `memesh reindex` para reconstruirlo.","doctor.msg.database.broken.summary":"La base de datos no se puede usar: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"{used} usadas / {total} inyectadas","analytics.loadFailed":"No se pudieron cargar las analíticas.","memory.noContent":"(sin contenido)","memory.archivedBadge":"archivada","memory.factsCount":"{count} datos","common.error":"Error","common.serverUnreachable":"No se pudo conectar con el servidor de memesh.","common.serverUnreachableAction":"Comprueba que `memesh serve` siga en ejecución y recarga esta página.","common.responseUnreadable":"El servidor respondió, pero esta página no pudo leer la respuesta: el dashboard y el servidor pueden estar desincronizados.","common.responseUnreadableAction":"Recarga la página. Si persiste, ejecuta `memesh doctor`.","pm.title":"Métricas de PM","pm.decisionsPerWeek":"decisiones/semana","pm.openDecisions":"decisiones abiertas (>14 d)","pm.orphanRate":"Memorias sin enlazar","pm.relationsTotal":"relaciones en total","pm.stalePlans":"{count} plan(es) sin revisar desde hace más de 30 días","common.loading":"Cargando…","common.noData":"Sin datos","errors.unknown":"Error desconocido","insights.noPreview":"Esta propuesta no tiene texto de resumen","httpError.auth.missing-bearer":"Este servidor requiere un token de acceso. Introduce tu token para continuar.","httpError.auth.invalid-token":"El token de acceso no fue aceptado. Verifícalo e inténtalo de nuevo.","httpError.auth.not-configured":"El servidor no tiene un token de acceso configurado. Reinicia `memesh serve` y revisa su salida.","httpError.validation.bad-body":"El servidor no pudo leer la solicitud que envió la página. Recarga la página e inténtalo de nuevo.","httpError.validation.bad-param":"Parte de la solicitud no es válida. Recarga la página e inténtalo de nuevo.","httpError.route.retired":"El servidor ya no admite esta acción: la página y el servidor pueden tener versiones distintas. Recarga la página.","httpError.route.not-found":"El servidor no reconoce esta solicitud: la página y el servidor pueden tener versiones distintas. Recarga la página.","httpError.resource.not-found":"Ese elemento ya no existe. Actualiza la lista.","httpError.payload.too-large":"Los datos enviados son demasiado grandes (más de 1 MB). Prueba con lotes más pequeños.","httpError.operation.failed":"El servidor no pudo completar esta acción.","httpError.llm.not-configured":"No hay proveedor de IA configurado. Añade uno en Ajustes primero.","httpError.rate.limited":"Demasiadas solicitudes en poco tiempo. Espera un momento e inténtalo de nuevo.","httpError.server.internal":"El servidor encontró un error inesperado.","settings.testError.auth":"La clave de API fue rechazada. Verifica la clave e inténtalo de nuevo.","settings.testError.network":"No se pudo contactar con el proveedor. Comprueba tu conexión de red.","settings.testError.no_models":"El proveedor respondió pero no devolvió modelos utilizables.","settings.testError.bad_host":"La dirección de Ollama debe estar en esta máquina (localhost).","settings.testError.http":"El proveedor devolvió un error (HTTP {status}).","settings.testError.unknown":"La prueba falló por un motivo desconocido.","time.justNow":"Ahora","time.hoursAgo":"Hace {count}h","time.today":"Hoy","time.yesterday":"Ayer","time.daysAgo":"Hace {count}d","time.lastWeek":"Semana pasada","time.weeksAgo":"Hace {count}sem","time.lastMonth":"Mes pasado","time.monthsAgo":"Hace {count}mes","memory.access.frequent":"Frecuente · {count} usos","memory.access.recalls":"{count} usos","memory.access.never":"Nunca usado","cluster.knowledge":"Conocimiento","cluster.activity":"Actividad","cluster.session":"Sesiones","cluster.reference":"Referencia","cluster.all":"Todo","browse.filterCategory":"Categoría","browse.filterTime":"Tiempo","browse.filterValue":"Valor","browse.filterProject":"Proyecto","browse.filterSort":"Ordenar","browse.timeToday":"Hoy","browse.timeWeek":"Esta semana","browse.timeMonth":"Este mes","browse.timeOlder":"Más antiguo","browse.valueRecalled":"✓ Usado","browse.valueNever":"Nunca usado","browse.sortMostRecalled":"Más usado","browse.sortRecent":"Reciente","browse.sortCreated":"Creado","browse.emptyFilter":"Sin memorias en esta categoría — prueba otro filtro","lessons.tabFailure":"Lecciones de fallo","lessons.tabPlan":"Registros de plan","lessons.tabFreeform":"Notas","lessons.totalRecalls":"Recuperaciones totales","lessons.stepsLabel":"pasos","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Sin campos estructurados — ver memoria sin procesar)","lessons.searchPlaceholder":"Buscar error / root cause / fix / nombre…","lessons.allProjects":"Todos los proyectos","lessons.showing":"Mostrando {visible} / {total}","lessons.noMatch":'Sin memorias coincidiendo con "{query}"',"lessons.emptyCategory":"Sin memorias en esta categoría","lessons.moreItems":"+{count} más","roadmap.title":"Hoja de Ruta","roadmap.summary":"{count} memorias · {first} → {last}","roadmap.switchToList":"↩ Vista de Lista","roadmap.switchToRoadmap":"🗺️ Vista de Hoja de Ruta","roadmap.emptyProject":"Sin memorias en este proyecto todavía.","loop.label":"Bucle de memoria","loop.subtitleHas":"memorias de conocimiento reusadas en los últimos 7 días","loop.subtitleNone":"Ninguna memoria reutilizada esta semana","loop.approxNote":"Aproximación — seguimiento completo comienza después de la actualización.","loop.sparkLabel":"Últimos 30 días","roadmap.milestones":"Hitos","roadmap.keyLessons":"Lecciones clave","radar.title":"Radar de cobertura","radar.caption":"Memorias de conocimiento activas (session y commit excluidos)","radar.axis.lessons":"Lecciones","radar.axis.decisions":"Decisiones","radar.axis.patterns":"Patrones","radar.axis.bugs":"Correcciones","radar.axis.processes":"Procesos","radar.axis.architecture":"Arquitectura","ageMatrix.title":"Distribución por edad","ageMatrix.low":"Bajo","ageMatrix.high":"Alto","ageMatrix.legend":"profundidad = densidad","ageMatrix.typeColumn":"Tipo","header.signalModeOn":"Señal","header.signalModeOff":"Todo","header.signalModeOnHint":"Ocultando ruido de session y commit. Clic para mostrar todo.","header.signalModeOffHint":"Mostrando todas las memorias incluido ruido. Clic para ocultar.","roadmap.phases":"Fases","onboarding.title":"Bienvenido a MeMesh","onboarding.body":"Tu almacén de memoria está vacío. Empieza con un tour de 30 entidades curadas o guarda tu primera lección.","onboarding.llmHint":"No se requiere LLM. Todo funciona solo con FTS5. Un LLM es opcional para la generación automática de lecciones — configúralo más tarde en Configuración.","onboarding.seedButton":"Iniciar el tour demo","onboarding.seedingButton":"Cargando…","onboarding.seedHint":"Añade 30 memorias aquí mismo — sin abrir terminal","onboarding.cliReference":"¿Prefieres la CLI?","onboarding.hintDemo":"Siembra 30 memorias demo que puedes limpiar después","onboarding.hintReset":"Elimina todo lo marcado con metadata.demo","onboarding.resetButton":"Resetear demo","onboarding.resettingButton":"Eliminando…","onboarding.resetConfirm":"¿Eliminar todas las memorias demo? Tus entradas reales se conservarán.","onboarding.dismiss":"Cerrar","common.serverError":"El servidor devolvió un error (HTTP {status}). Inténtalo de nuevo — si persiste, ejecuta `memesh doctor`.","emptyLibrary.title":"Tu memoria está vacía","emptyLibrary.body":"Aún no hay nada guardado. Carga el tour de demostración de 30 entradas para ver MeMesh en acción — puedes borrarlo luego con un clic.","browse.truncated":"mostrando las primeras {shown} de {total} memorias — usa la búsqueda o los filtros para llegar al resto","lessons.capNote":"mostrando las primeras {limit} lecciones — los recuentos de arriba solo cubren estas","lessons.emptyGuide":"Aún no hay lecciones. En Smart Mode, memesh guarda una automáticamente al analizar un fallo de sesión — o pide a tu asistente que registre una.","graph.cappedNote":"Mostrando las {shown} entidades más recordadas de {total} para mantener el grafo fluido.","settings.testStoredKeyHint":"Deja el campo vacío para probar la clave ya guardada.","ageMatrix.bucket.week":"Esta semana","ageMatrix.bucket.month":"Este mes","ageMatrix.bucket.quarter":"Este trimestre","ageMatrix.bucket.older":"Más antiguo","settings.behaviourTitle":"Comportamiento","settings.autoUpdateLabel":"Política de auto-actualización","settings.autoUpdateOff":"Apagado — solo manual","settings.autoUpdatePatch":"Patch — aplica X.Y.Z+1","settings.autoUpdateMinor":"Minor — aplica X.Y+1.0","settings.autoUpdateMajor":"Major — aplica cualquier cambio","settings.autoUpdateHint":"Activado tras cada sesión. MEMESH_AUTO_UPDATE tiene prioridad.","errors.timeout":"La solicitud agotó el tiempo de espera","type.lesson_learned":"Lección","type.lesson":"Lección","type.mistake":"Error","type.decision":"Decisión","type.architecture_decision":"Dec. arq.","type.design_decision":"Decisión de diseño","type.pattern":"Patrón","type.technical_pattern":"Patrón téc.","type.best_practice":"Buena práctica","type.bug_fix":"Corrección","type.verification_result":"Verificación","type.test_result":"Resultado de prueba","type.process":"Proceso","type.architecture":"Arquitectura","type.infrastructure":"Infraestructura","type.feature":"Característica","type.release":"Lanzamiento","type.refactoring":"Refactorización","type.commit":"Commit","type.session_keypoint":"Punto clave de sesión","type.session_identity":"Identidad de sesión","type.session-insight":"Insight de sesión","type.session-summary":"Resumen de sesión","type.session-identity":"Identidad de sesión","type.weekly_summary":"Resumen semanal","type.weekly-summary":"Resumen semanal","type.note":"Nota","type.plan":"Plan","type.knowledge":"Conocimiento","type.workflow_checkpoint":"Hito","type.concept":"Concepto","type.tool":"Herramienta","type.person":"Persona","relation.relates_to":"se relaciona con","relation.related-to":"relacionado con","relation.depends_on":"depende de","relation.implements":"implementa","relation.learned_from":"aprendido de","relation.supersedes":"reemplaza","relation.contradicts":"contradice","relation.follows":"sigue a","relation.belongs-to-project":"pertenece al proyecto","relation.co-created":"cocreado","relation.shares-name-tokens":"nombres similares","patterns.day.0":"domingo","patterns.day.1":"lunes","patterns.day.2":"martes","patterns.day.3":"miércoles","patterns.day.4":"jueves","patterns.day.5":"viernes","patterns.day.6":"sábado","telemetry.flow.dreamer":"Resumen semanal (dreamer)","telemetry.flow.pattern_detector":"Detector de patrones","telemetry.flow.digest_validator":"Validador de resúmenes","telemetry.flow.auto_tagger":"Auto-etiquetado","telemetry.flow.failure_analyzer":"Analizador de fallos","telemetry.flow.transcript_extractor":"Minero de transcripciones","telemetry.flow.conflict_judge":"Juez de conflictos","telemetry.errorClass.auth":"credencial rechazada","telemetry.errorClass.rate_limit":"límite de tasa","telemetry.errorClass.upstream":"fallo del proveedor","telemetry.errorClass.bad_request":"solicitud inválida","telemetry.errorClass.network":"red","telemetry.errorClass.parse":"respuesta ilegible","telemetry.errorClass.unknown":"desconocido","lessons.severity.critical":"Crítico","lessons.severity.major":"Mayor","lessons.severity.minor":"Menor","memory.tooltip.project":"Proyecto","memory.tooltip.recalled":"Recuperado {count} veces","memory.tooltip.hasRelations":"Vinculado a {count} otras memorias","memory.tooltip.createdAt":"Creado el {date}","graph.drift":"Frescura","graph.driftHint":"Colorea los nodos por antigüedad: rojo = antiguo, verde = usado recientemente","common.unknown":"desconocido","insights.entitiesCount":"{n} entidades","roadmap.viewToggle":"Vista de hoja de ruta","roadmap.viewTree":"Árbol","roadmap.viewMindmap":"Mapa mental","roadmap.mindmapNeedsPhases":"El mapa mental necesita al menos 3 memorias en una ventana de 7 días.","roadmap.activePhase":"activa","roadmap.entryCount":"{count} entrada","roadmap.entriesCount":"{count} entradas","roadmap.otherGroup":"Otros ({count})","roadmap.lowSignalHidden":"({count} de señal baja ocultas)","roadmap.resetHint":"Restablecer zoom y posición (doble clic en el fondo también)","roadmap.zoomHint":"rueda para zoom · arrastra para mover · {pct}%","roadmap.moreEntities":"+{count} más","nav.ariaLabel":"Secciones del panel","feedback.descLabel":"Descripción del comentario","graph.canvasA11y":"Grafo de conocimiento (en lienzo): {entities} entidades, {relations} relaciones, {orphans} sin conexión. Usa los filtros de tipo y la búsqueda de arriba para una vista no visual."},th:{"auth.title":"ต้องมีการยืนยันตัวตน","auth.intro":"แดชบอร์ดนี้ได้รับการป้องกันด้วย bearer token วางค่าของ MEMESH_REMOTE_TOKEN (หรือเนื้อหาของ <memeshDir>/remote-token) ด้านล่าง","auth.tokenLabel":"โทเค็น","auth.empty":"โทเค็นต้องไม่ว่างเปล่า","auth.invalid":"โทเค็นนี้ไม่ได้รับการยอมรับ กรุณาตรวจสอบแล้วลองใหม่อีกครั้ง","auth.submit":"ปลดล็อกแดชบอร์ด","auth.tokenPlaceholder":"วางโทเค็นที่นี่","brand.subtitle":"powered by pcircle.com","header.connected":"เชื่อมต่อแล้ว","header.disconnected":"ไม่ได้เชื่อมต่อ","header.connecting":"กำลังเชื่อมต่อ…","header.memories":"ความทรงจำ","tab.insights":"Insights","telemetry.title":"กิจกรรม LLM","telemetry.lastNDays":"{n} วันล่าสุด","telemetry.loading":"กำลังโหลด…","telemetry.empty":"ยังไม่มีกิจกรรม AI ในช่วงนี้ แถวข้อมูลจะปรากฏโดยอัตโนมัติเมื่อฟีเจอร์ AI เบื้องหลัง (เช่น สรุปรายสัปดาห์และการติดแท็กอัตโนมัติ) ทำงาน","telemetry.callsCount":"{n} การเรียก","telemetry.attemptsCount":"{n} ครั้งที่พยายาม","telemetry.successRate":"สำเร็จ","telemetry.medianLatency":"เวลาตอบสนองมัธยฐาน","telemetry.fallbackUsed":"ใช้ fallback {n}× ({pct} ของการเรียก)","telemetry.byProvider":"ตามผู้ให้บริการ","telemetry.byModel":"ตามโมเดล","telemetry.byProject":"ตามโครงการ","telemetry.errors":"ข้อผิดพลาด","insights.title":"memesh ทำอะไรให้คุณบ้าง","insights.subtitle":"weekly recap และ pattern ที่ระบบสร้างอัตโนมัติ รอให้คุณตรวจสอบ","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"ทั้งหมด","insights.refresh":"รีเฟรช","insights.loading":"กำลังโหลด…","insights.emptyPending":"ไม่มี insight ที่ pending รัน `memesh dream run` เพื่อสร้าง weekly recap","insights.emptyNoLlm":"ตั้งค่าผู้ให้บริการ LLM ในหน้าการตั้งค่าเพื่อเปิดใช้งาน weekly recap และการตรวจจับ pattern","insights.emptyOther":"ไม่มีข้อมูลที่นี่","insights.sources":"แหล่งที่มา","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"ดูรายละเอียด","insights.collapse":"ย่อ","insights.accept":"ยอมรับ","insights.applying":"กำลังนำไปใช้…","insights.reject":"ปฏิเสธ","insights.generatedBy":"สร้างโดย","insights.promptVersion":"เวอร์ชัน prompt","insights.observations":"สรุปการสังเกต","insights.tags":"แท็ก","insights.sourceIds":"entity ต้นทาง","insights.validationWarnings":"ข้อความที่ถูกตั้งคำถาม (LLM validator)","insights.validationClaim":"ข้อความ","insights.validationReason":"เหตุผล","insights.runDream":"รัน weekly recap","insights.runDreamWithValidate":"รันพร้อม validator (ช้ากว่าแต่คุณภาพสูงกว่า)","banner.pendingInsights":"มี insight ใหม่ {n} รายการรอให้คุณตรวจสอบ →","banner.dismiss":"ปิด","banner.viewAll":"ดูทั้งหมด","pattern.title":"Pattern","pattern.evidenceCount":"หลักฐาน {n} รายการ","pattern.severity":"ระดับความรุนแรง","pattern.severity.high":"สูง","pattern.severity.medium":"กลาง","pattern.severity.low":"ต่ำ","pattern.description":"คำอธิบาย pattern","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.hint":"ค้นหาด้วยชื่อ เนื้อหา หรือแท็ก ค้นได้ทั้งคำที่ตรงกันและความหมายที่ใกล้เคียง","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":"ความทรงจำที่เก็บถาวร","browse.archiveFailed":"เก็บถาวรไม่สำเร็จ: {message}","browse.restoreFailed":"กู้คืนไม่สำเร็จ: {message}","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.entityMeta":"{type} · ความเชื่อมั่น {confidence}% · ไม่ได้ใช้มา {days} วัน","settings.capabilities":"ความสามารถ","settings.smartMode":"โหมดอัจฉริยะ","settings.core":"พื้นฐาน","settings.embeddings":"Embeddings","settings.llmProvider":"ผู้ให้บริการ LLM","settings.llmOptional.title":"LLM เป็นตัวเลือก","settings.llmOptional.body":"memesh ทำงานได้โดยไม่ต้องใช้ LLM โหมด Core เริ่มต้นครอบคลุมการเรียกคืนข้อความเต็ม remember/recall ด้วยตนเอง แดชบอร์ด และการจับ session ผ่าน hooks","settings.llmOptional.coreLabel":"ไม่มี LLM (โหมด Core)","settings.llmOptional.coreFeatures":"การค้นหาคำสำคัญ FTS5, remember/recall ด้วยตนเอง, แดชบอร์ด, การจับ session ผ่าน hooks","settings.llmOptional.smartLabel":"มี LLM (โหมด Smart)","settings.llmOptional.smartFeatures":"lesson_learned อัตโนมัติจากความล้มเหลวของ session, การติดแท็กอัตโนมัติของ entity ใหม่, สรุปประจำสัปดาห์และการตรวจจับรูปแบบ","settings.apiKey":"คีย์ API","settings.fallbacks.title":"ผู้ให้บริการสำรอง","settings.fallbacks.explainer":"หากผู้ให้บริการหลักไม่พร้อมใช้งาน memesh จะลองใช้รายการเหล่านี้ตามลำดับจนกว่าจะมีตัวที่ใช้งานได้","settings.fallbacks.privacyTitle":"หมายเหตุความเป็นส่วนตัว","settings.fallbacks.privacyBody":"การเพิ่มผู้ให้บริการบนคลาวด์ (OpenAI หรือ Anthropic) หมายความว่าเมื่อผู้ให้บริการหลักใช้งานไม่ได้ เนื้อหาความจำของคุณ ซึ่งอาจเป็นข้อมูลส่วนตัว จะถูกส่งไปยังผู้ให้บริการคลาวด์นั้น หากคุณใช้ผู้ให้บริการภายในเครื่องเพื่อความเป็นส่วนตัว ให้เพิ่มตัวสำรองบนคลาวด์เฉพาะเมื่อคุณยอมรับข้อแลกเปลี่ยนนี้","settings.fallbacks.empty":"ยังไม่มีผู้ให้บริการสำรอง","settings.fallbacks.add":"เพิ่มผู้ให้บริการสำรอง","settings.fallbacks.providerLabel":"ผู้ให้บริการ","settings.fallbacks.modelLabel":"โมเดล (ไม่บังคับ)","settings.fallbacks.modelPlaceholder":"เช่น gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"มีคีย์ที่บันทึกไว้แล้ว เว้นว่างไว้เพื่อเก็บคีย์เดิม","settings.fallbacks.remove":"ลบ","settings.fallbacks.moveUp":"เลื่อนขึ้น","settings.fallbacks.moveDown":"เลื่อนลง","settings.fallbacks.priority":"ลำดับความสำคัญ {n}","settings.fallbacks.save":"บันทึกลำดับสำรอง","settings.fallbacks.needsKey":"กรอกคีย์ API มิฉะนั้นจะใช้ตัวสำรองบนคลาวด์นี้ไม่ได้","settings.model":"โมเดล (ไม่บังคับ)","settings.save":"บันทึก","settings.saving":"กำลังบันทึก…","settings.saved":"บันทึกแล้ว","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"ทดสอบ","settings.testing":"กำลังทดสอบ…","settings.testPassed":"✓ เชื่อมต่อสำเร็จ · มี {count} โมเดล","settings.testFailed":"การทดสอบการเชื่อมต่อล้มเหลว","settings.suggested":"แนะนำ","settings.testRequired":"โปรดทดสอบการเชื่อมต่อก่อนบันทึก","settings.language":"ภาษา","settings.searchMode":"โหมดการค้นหา","settings.none":"ไม่มี","settings.updates":"การอัปเดต","settings.updateChecking":"กำลังตรวจหาการอัปเดต…","settings.updateUnavailable":"ไม่สามารถตรวจสอบการอัปเดตได้ในขณะนี้","settings.updateNoSuccessfulChecks":"ยังไม่มีการตรวจสอบอัปเดตที่สำเร็จ","settings.upToDate":"เป็นเวอร์ชันล่าสุดแล้ว","settings.updateAvailable":"มีเวอร์ชันอัปเดต","settings.updateStale":"สถานะแคชที่แสดงอาจล้าสมัยแล้ว","settings.updateCachedFallback":"กำลังใช้ผลลัพธ์แคชล่าสุดที่ตรวจสอบสำเร็จ","settings.updateDeprecatedNoTarget":"เลิกใช้แล้ว — ยังไม่มีเวอร์ชันสำหรับอัปเกรด","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} ถูกผู้ดูแลทำเครื่องหมายเป็น DEPRECATED (เลิกใช้แล้ว)","settings.updatePartialTitle":"⚠️ การตรวจสอบอัปเดตไม่สมบูรณ์","settings.updatePartialDescription":"{message}. ไม่สามารถยืนยันสถานะเลิกใช้ในเซสชันนี้ — โปรดเรียกใช้ใหม่เมื่อออนไลน์","settings.updatePartialSummary":"บางส่วน — ไม่ทราบสถานะการเลิกใช้","settings.updateDeprecatedTargetUnknown":"เลิกใช้แล้ว — กำลังหาเวอร์ชันสำหรับอัปเกรด","settings.currentVersion":"เวอร์ชันปัจจุบัน","settings.latestVersion":"เวอร์ชันล่าสุด","settings.lastChecked":"ตรวจสอบล่าสุด","settings.lastAttempted":"พยายามตรวจสอบล่าสุด","settings.lastSuccessful":"ตรวจสอบสำเร็จล่าสุด","settings.updateSourceFresh":"ตรวจสอบสด","settings.updateSourceCached":"ใช้ผลลัพธ์จากแคช","settings.updateSourceStale":"ใช้ผลลัพธ์แคชที่ล้าสมัย","settings.updateSourceUnavailable":"ไม่มีผลลัพธ์แคช","settings.updateCommand":"คำสั่งอัปเดต","settings.checkNow":"ตรวจสอบตอนนี้","settings.updateLastError":"ข้อผิดพลาดจากการตรวจสอบล่าสุด: {message}","settings.installMethod":"วิธีติดตั้ง","settings.installNpmGlobal":"ติดตั้ง npm แบบทั้งระบบ","settings.installNpmLocal":"ติดตั้งภายในโปรเจกต์","settings.installSourceCheckout":"เช็กเอาต์ซอร์สโค้ด","settings.installUnknown":"ไม่ทราบ","settings.updateGuidanceNpmGlobal":"การติดตั้งนี้อัปเดตจาก MeMesh ได้โดยตรง","settings.updateGuidanceNpmLocal":"ให้อัปเดตการติดตั้งนี้ผ่านตัวจัดการแพ็กเกจของโปรเจกต์ที่ติดตั้ง MeMesh","settings.updateGuidanceSourceCheckout":"ให้อัปเดต source checkout นี้จาก repository แล้ว build ใหม่","settings.updateGuidanceUnknown":"ให้อัปเดตการติดตั้งนี้ด้วยเครื่องมือหรือขั้นตอนที่ใช้ติดตั้ง MeMesh","graph.entities":"เอนทิตี","graph.relations":"ความสัมพันธ์","graph.orphans":"โหนดโดดเดี่ยว","graph.search":"ค้นหาโหนด…","graph.matches":"รายการที่ตรงกัน","graph.focusMode":"โฟกัส","graph.showAll":"แสดงทั้งหมด","graph.clickHint":"คลิกโหนดเพื่อโฟกัส","graph.interactHint":"คลิกโหนดเพื่อโฟกัส · ลากพื้นที่ว่างเพื่อเลื่อน · เลื่อนเพื่อซูม","graph.resetView":"รีเซ็ตมุมมอง","graph.resetViewHint":"รีเซ็ตการซูมและตำแหน่ง","graph.ageToday":"วันนี้","graph.ageDaysAgo":"{count} วันที่แล้ว","graph.ageWeeksAgo":"{count} สัปดาห์ที่แล้ว","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","feedback.submitting":"กำลังรวบรวมการวินิจฉัย…","doctorBanner.warnTitleSoft":"memesh มีบันทึกการตั้งค่า","doctorBanner.failTitle":"การตั้งค่า memesh ยังไม่สมบูรณ์","doctorBanner.dismiss":"ปิด","doctorBanner.getHelp":"ขอความช่วยเหลือ","doctorBanner.helpHint":"เปิด GitHub issue พร้อมข้อมูลการวินิจฉัยที่กรอกไว้แล้ว","doctorBanner.preambleForIssue":"memesh doctor รายงานสิ่งต่อไปนี้บนการติดตั้งของฉัน:","doctorBanner.moreCount":"…และอีก {n} รายการ — รัน `memesh doctor` เพื่อดูรายการทั้งหมด","doctor.label.readme_locale_parity":"คำแปล README","doctor.label.config":"ไฟล์ตั้งค่า","doctor.label.mcp-config":"ไฟล์เชื่อมต่อ MCP","doctor.label.hooks-config":"ข้อกำหนด hook","doctor.label.hook-scripts":"สคริปต์ hook","doctor.label.hook-wiring":"การเชื่อมต่อกับ Claude Code","doctor.label.hook-activity":"บันทึกอัตโนมัติ","doctor.label.node-runtime":"เวอร์ชัน Node.js","doctor.label.native-binding":"SQLite และการค้นหาแบบเวกเตอร์","doctor.label.shell-cli":"คำสั่งในเทอร์มินัล","doctor.label.dashboard":"ไฟล์แดชบอร์ด","doctor.label.update-status":"การอัปเดต","doctor.label.http-probe":"เซิร์ฟเวอร์ในเครื่อง","doctor.label.skills-manifest":"ไฟล์ที่มาพร้อมแพ็กเกจ","doctor.label.config_parse":"ไฟล์ตั้งค่า","doctor.label.embeddings_probe":"การค้นหาตามความหมาย","doctor.label.llm_probe":"ผู้ให้บริการ AI","doctor.label.install-channel":"วิธีติดตั้ง","doctor.label.fts_segmentation":"ดัชนีคำสำคัญ","doctor.label.vector_index":"ดัชนีการค้นหา","doctor.label.database":"ฐานข้อมูล","doctor.msg.readme-parity.unreadable.summary":"อ่าน README.md ไม่ได้: {detail}","doctor.msg.readme-parity.drift.summary":"README ฉบับแปลบางไฟล์ไม่ตรงกับฉบับภาษาอังกฤษแล้ว: {detail}","doctor.msg.readme-parity.drift.fix":"ปรับ README ที่ระบุให้ตรงกับ README.md อีกครั้ง","doctor.msg.config.invalid-json.summary":"ไฟล์ตั้งค่าที่ {path} ไม่ใช่ JSON ที่ถูกต้อง จึงถูกข้ามไป","doctor.msg.config.invalid-json.fix":"แก้หรือลบ {path} แล้วรัน `memesh config list` เพื่อยืนยันว่าโหลดได้","doctor.msg.mcp-config.missing.summary":"ไฟล์ที่เชื่อม memesh กับ Claude Code (.mcp.json) หายไป","doctor.msg.mcp-config.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.mcp-config.invalid-json.summary":".mcp.json เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง) Claude Code จึงอ่านไม่ได้","doctor.msg.mcp-config.invalid-json.fix":"แก้ {path} หรือติดตั้ง MeMesh ใหม่","doctor.msg.mcp-config.no-entry.summary":".mcp.json ไม่มีรายการเซิร์ฟเวอร์ memesh แล้ว","doctor.msg.mcp-config.no-entry.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` สั่งเปิดไฟล์ที่ไม่มีอยู่ในการติดตั้งนี้ เครื่องมือ memesh ทุกตัวใน Claude Code จึงเริ่มทำงานไม่ได้","doctor.msg.mcp-config.entry-missing.fix":"ติดตั้ง MeMesh ใหม่ ถ้าคุณแก้ `.mcp.json` เอง ให้ชี้กลับไปที่ `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json หายไป การบันทึกความจำอัตโนมัติจึงทำงานไม่ได้","doctor.msg.hooks-config.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง)","doctor.msg.hooks-config.invalid-json.fix":"แก้ {path} หรือติดตั้ง MeMesh ใหม่","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json ขาด hook ประเภทเหล่านี้: {types} การบันทึกอัตโนมัติบางส่วนจะไม่ทำงาน","doctor.msg.hooks-config.missing-types.fix":"กู้คืนการตั้งค่า hook ดั้งเดิม หรือติดตั้ง MeMesh ใหม่","doctor.msg.hook-scripts.none.summary":"การตั้งค่า hook ไม่มีสคริปต์เลย จึงบันทึกอะไรอัตโนมัติไม่ได้","doctor.msg.hook-scripts.none.fix":"ติดตั้ง MeMesh ใหม่","doctor.msg.hook-scripts.missing.summary":"สคริปต์ hook เหล่านี้หายไป: {files}","doctor.msg.hook-scripts.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.hook-scripts.not-executable.summary":"สคริปต์ hook เหล่านี้มีอยู่ แต่ไม่ได้รับอนุญาตให้รัน: {files}","doctor.msg.hook-scripts.not-executable.fix":"รัน `chmod +x scripts/hooks/*.js` หรือถ้าใช้ซอร์สโค้ดให้รัน `npm run build`","doctor.msg.hook-wiring.no-marker.summary":"memesh ยังไม่ได้เชื่อมกับ Claude Code จึงยังไม่มีอะไรถูกจดจำอัตโนมัติ","doctor.msg.hook-wiring.no-marker.fix":"รัน `memesh install-hooks` หนึ่งครั้ง แล้วรัน `memesh doctor` เพื่อยืนยัน","doctor.msg.hook-wiring.script-missing.summary":"hook ของ memesh ที่เชื่อมต่อไว้ชี้ไปที่ {path} ซึ่งไม่มีอยู่แล้ว — agent จะเรียกไฟล์ที่หายไปทุกครั้งที่เกิดเหตุการณ์ที่ตรงกัน มักเป็นซากจากการอัปเกรดที่เลิกใช้ hook นั้น","doctor.msg.hook-wiring.script-missing.fix":"รัน `memesh install-hooks` เพื่อเชื่อมต่อใหม่ (รายการที่เลิกใช้จะถูกลบ) แล้วรีสตาร์ต agent","doctor.msg.hook-wiring.marker-unreadable.summary":"อ่านบันทึกการเชื่อมต่อที่ {path} ไม่ได้","doctor.msg.hook-wiring.marker-unreadable.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.marker-malformed.summary":"บันทึกการเชื่อมต่อเสียหาย","doctor.msg.hook-wiring.marker-malformed.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.settings-missing.summary":"ไฟล์ตั้งค่าของ Claude Code ({path}) หายไป การเชื่อมต่อจึงขาด","doctor.msg.hook-wiring.settings-missing.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.settings-invalid.summary":"{path} เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง)","doctor.msg.hook-wiring.settings-invalid.fix":"กู้คืนจากไฟล์สำรอง หรือรัน `memesh install-hooks` เพื่อสร้างใหม่","doctor.msg.hook-wiring.entries-removed.summary":"รายการ memesh ถูกลบออกจาก {path} การเชื่อมต่อจึงขาด","doctor.msg.hook-wiring.entries-removed.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.root-moved.summary":"การเชื่อมต่อชี้ไปที่ {path} ซึ่งไม่มีอยู่แล้ว (memesh อาจถูกย้ายที่)","doctor.msg.hook-wiring.root-moved.fix":"รัน `memesh install-hooks` เพื่ออัปเดต","doctor.msg.hook-activity.never-ran.summary":"ไม่มี hook เก็บข้อมูลทำงานเลยตลอด {hours} ชั่วโมงนับตั้งแต่เริ่มติดตาม ทั้งที่การเชื่อมต่อ hook ปกติดี — ไม่มีอะไรถูกจดจำไว้เลย","doctor.msg.hook-activity.never-ran.fix":"ทำงานให้จบหนึ่งเซสชัน แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังบอกว่าไม่มี hook ทำงาน ให้รัน `memesh install-hooks` แล้วรีสตาร์ท agent","doctor.msg.hook-activity.stale.summary":"hook เก็บข้อมูลครั้งล่าสุดทำงานเมื่อประมาณ {hours} ชั่วโมงที่แล้ว ({hook}) ถ้าคุณทำงานหลังจากนั้น แปลว่าการเก็บข้อมูลหยุดไปแล้วและไม่มีอะไรจากเซสชันเหล่านั้นถูกบันทึก","doctor.msg.hook-activity.stale.fix":"รีสตาร์ท agent จบหนึ่งเซสชัน แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังไม่กลับมา ให้รัน `memesh install-hooks`","doctor.msg.hook-activity.stale-unconfirmed.summary":"hook session-summary รันครั้งล่าสุดประมาณ {hours} ชั่วโมงก่อน และ 3 วันที่ผ่านมาก็ไม่มีการเขียนจาก Claude Code เลย ถ้าเครื่องนี้ย้ายไปใช้ agent อื่น (Codex / Gemini) นี่เป็นเรื่องปกติ แต่ถ้ายังใช้ Claude Code ที่นี่ การเก็บบันทึกหยุดแล้ว","doctor.msg.hook-activity.stale-unconfirmed.fix":"ถ้ายังใช้ Claude Code บนเครื่องนี้: รีสตาร์ต จบเซสชันหนึ่งครั้ง แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังไม่ฟื้น ให้รัน `memesh install-hooks`","doctor.msg.hook-activity.query-failed.summary":'อ่านประวัติการทำงานของ hook จากฐานข้อมูลไม่ได้: {detail} สถานะการเก็บข้อมูลตอนนี้คือ "ไม่ทราบ" ซึ่งไม่เหมือนกับ "ปกติ"',"doctor.msg.hook-activity.query-failed.fix":"รัน `memesh doctor --verbose` เพื่อดูข้อความผิดพลาดเต็ม และตรวจว่า ~/.memesh อ่านได้และดิสก์ไม่เต็ม","doctor.msg.hook-activity.stale-unknown.summary":'อ่านเวลาการรันล่าสุดของ hook {hook} ไม่ได้ (ข้อมูลเสีย หรือถูกบันทึกโดยเครื่องที่นาฬิกาเพี้ยน) สถานะการเก็บบันทึกตอนนี้คือ "ไม่ทราบ" ซึ่งไม่เหมือนกับ "ปกติ"',"doctor.msg.hook-activity.stale-unknown.fix":"จบเซสชันงานหนึ่งครั้งแล้วรัน `memesh doctor` อีกครั้ง — การรันครั้งใหม่จะเขียนทับเวลาที่เสีย","doctor.msg.hook-activity.disabled.summary":"การเก็บบันทึกอัตโนมัติถูกปิดอยู่ (MEMESH_AUTO_CAPTURE หรือ autoCapture ในการตั้งค่า) — เป็นการตั้งใจ ดังนั้น hook เงียบจึงเป็นเรื่องที่คาดไว้ เปิดกลับเพื่อกลับมาเก็บบันทึกเซสชัน","doctor.msg.hook-activity.disabled-env.summary":"การเก็บบันทึกอัตโนมัติถูกปิดโดย MEMESH_AUTO_CAPTURE=false ในสภาพแวดล้อมของ shell นี้ doctor เห็นได้เฉพาะสภาพแวดล้อมของตัวเอง — ถ้า agent ของคุณรันโดยไม่มีตัวแปรนี้ การเก็บบันทึกฝั่งนั้นไม่ได้รับผลกระทบ","doctor.msg.hook-activity.not-wired.summary":"ไม่มี hook เก็บบันทึกใดเคยรันเลย — และบนเครื่องนี้ไม่พบการเชื่อมต่อ hook เก็บบันทึก (Stop / PostToolUse / PreCompact) ที่ยืนยันได้ จึงไม่มีอะไรให้รัน","doctor.msg.hook-activity.not-wired.fix":"ถ้าต้องการเก็บบันทึกอัตโนมัติ ให้รัน `memesh install-hooks` ถ้าการติดตั้งนี้ใช้เฉพาะ MCP (Codex / Gemini) นี่เป็นเรื่องปกติและข้ามได้","doctor.msg.hook-activity.stop-silent.summary":"hook {hook} ยังประทับเวลาอยู่ แต่ hook session-summary ไม่เคยรันเลยสักครั้งตลอด {hours} ชั่วโมงนับตั้งแต่เริ่มติดตาม — การเก็บบันทึกเซสชันอาจพังอยู่ โดยถูกการเก็บบันทึก commit บังไว้","doctor.msg.hook-activity.stop-silent.fix":"จบเซสชันงานหนึ่งครั้งแล้วรัน `memesh doctor` อีกครั้ง ถ้า session-summary ยังไม่รัน ให้รัน `memesh install-hooks` แล้วรีสตาร์ต agent","doctor.msg.hook-activity.never-ran-legacy.summary":"ไม่มี hook ใดประทับเวลาหัวใจเต้นเลย แต่นับตั้งแต่เริ่มติดตามมีความทรงจำจากการเก็บบันทึกอัตโนมัติ {captured} รายการเข้ามา — น่าจะเป็น hook รุ่นเก่าก่อนมีระบบติดตามที่ยังรันอยู่","doctor.msg.hook-activity.never-ran-legacy.fix":"อัปเดต hook ของ memesh เป็นรุ่นปัจจุบัน (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) แล้วรีสตาร์ต agent","doctor.msg.node-runtime.too-old.summary":"Node.js ของคุณเก่ากว่าที่แพ็กเกจนี้รองรับ {detail}","doctor.msg.node-runtime.too-old.fix":"อัปเกรด Node.js เป็น {required} ขึ้นไป แล้วรัน `memesh doctor` อีกครั้ง","doctor.msg.native-binding.node-too-old.summary":"SQLite ที่มากับ Node รุ่นนี้เก่าเกินไปสำหรับ memesh จึงโหลดส่วนที่ค้นหาตามความหมายไม่ได้ รุ่นที่สมบูรณ์มีตั้งแต่ Node 22.13","doctor.msg.native-binding.node-too-old.fix":"อัปเกรด Node เป็น 22.13 ขึ้นไป แล้วรัน `memesh doctor` อีกครั้ง","doctor.msg.native-binding.not-installed.summary":"ยังไม่ได้ติดตั้ง sqlite-vec ความทรงจำยังถูกบันทึกและค้นด้วยคำสำคัญได้ เพียงแต่ปิดการค้นหาตามความหมาย","doctor.msg.native-binding.not-installed.fix":"รัน `npm install` ในโฟลเดอร์ที่ใช้ @pcircle/memesh","doctor.msg.native-binding.load-failed.summary":"โหลด sqlite-vec ไม่สำเร็จ: {detail} การค้นหาจะใช้คำสำคัญอย่างเดียว","doctor.msg.native-binding.load-failed.fix":'รัน: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"ใช้คำสั่ง `memesh` ในเทอร์มินัลไม่ได้ ฟีเจอร์ของ Claude Code ยังทำงานปกติ — กระทบแค่ตอนคุณพิมพ์ `memesh` เองเท่านั้น","doctor.msg.shell-cli.not-on-path.fix":"รัน `npm install -g @pcircle/memesh` เพื่อเพิ่มคำสั่ง ทั้งสองการติดตั้งใช้ความจำชุดเดียวกัน","doctor.msg.dashboard.missing.summary":"ไฟล์แดชบอร์ดหายไป","doctor.msg.dashboard.missing.fix":"สร้างด้วย `cd dashboard && npm install && npm run build`","doctor.msg.update-status.no-cache.summary":"memesh ยังเช็กไม่สำเร็จว่ามีเวอร์ชันใหม่กว่าหรือไม่","doctor.msg.update-status.no-cache.fix":"รัน `memesh status` หนึ่งครั้งตอนต่อเน็ต — ผลจะถูกเก็บไว้และข้อความนี้จะหายไป","doctor.msg.update-status.deprecated.summary":"เวอร์ชัน {version} ถูกผู้ดูแลถอนออกแล้ว: {detail}","doctor.msg.update-status.deprecated.fix":"อัปเดตทันที — รัน `memesh update` (หรือทำตามวิธีติดตั้งของคุณ)","doctor.msg.update-status.deprecation-unknown.summary":"ยืนยันไม่ได้ว่าเวอร์ชัน {version} ยังปลอดภัยอยู่หรือไม่: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"รัน `memesh status` ตอนต่อเน็ตเพื่อลองใหม่","doctor.msg.update-status.update-available.summary":"มีเวอร์ชันใหม่กว่า: {latest} (คุณใช้ {current} อยู่)","doctor.msg.update-status.update-available.fix":"รัน `memesh update` เพื่ออัปเกรด","doctor.msg.update-status.stale.summary":"เวอร์ชัน {version} เป็นรุ่นล่าสุดแล้ว แต่ข้อมูลอัปเดตเก่าไปหน่อย","doctor.msg.update-status.stale.fix":"รัน `memesh status` ตอนต่อเน็ตเพื่อรีเฟรช","doctor.msg.http-probe.bad-status.summary":"เซิร์ฟเวอร์ในเครื่องที่ {url} ตอบกลับมาเป็นข้อผิดพลาด (HTTP {status})","doctor.msg.http-probe.bad-status.fix":"รีสตาร์ตด้วย `memesh serve` แล้วดูล็อก","doctor.msg.http-probe.no-server.summary":"ไม่มีเซิร์ฟเวอร์ในเครื่องรันอยู่ที่ {url}","doctor.msg.http-probe.no-server.fix":"ถ้าอยากใช้แดชบอร์ด ให้เริ่มด้วย `memesh serve`","doctor.msg.skills-manifest.missing-dev.summary":"ไม่พบรายการตรวจสอบความครบถ้วนของไฟล์ (เป็นเรื่องปกติเมื่อรันจากซอร์สโค้ด)","doctor.msg.skills-manifest.missing-dev.fix":"รัน `npm run build` เพื่อสร้าง","doctor.msg.skills-manifest.unreadable.summary":"อ่านรายการตรวจสอบความครบถ้วนของไฟล์ไม่ได้ ({detail})","doctor.msg.skills-manifest.unreadable.fix":"ติดตั้งใหม่: `npm install -g @pcircle/memesh`","doctor.msg.skills-manifest.empty.summary":"รายการตรวจสอบความครบถ้วนของไฟล์ว่างเปล่า","doctor.msg.skills-manifest.empty.fix":"ติดตั้งใหม่: `npm install -g @pcircle/memesh`","doctor.msg.skills-manifest.verify-failed.summary":"ไฟล์ที่มาพร้อมแพ็กเกจบางไฟล์ไม่ตรงกับที่จัดส่ง: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"ติดตั้งใหม่: `npm install -g @pcircle/memesh` ถ้าติดตั้งใหม่แล้วยังเกิดอีก ให้รายงานเป็นปัญหาความปลอดภัย","doctor.msg.config-parse.not-object.summary":"ไฟล์ตั้งค่าที่ {path} ไม่ได้อยู่ในรูปแบบที่คาดไว้ การตั้งค่าทั้งหมดจึงถูกข้ามไป","doctor.msg.config-parse.not-object.fix":"แก้หรือลบ {path} แล้วรัน `memesh doctor` อีกครั้ง","doctor.msg.config-parse.unreadable.summary":"อ่านไฟล์ตั้งค่าที่ {path} ไม่ได้ ({detail}) การตั้งค่าทั้งหมดจึงถูกข้ามไป","doctor.msg.config-parse.unreadable.fix":"แก้ไฟล์ หรือย้ายออกไปก่อน: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'การค้นหาตามความหมายตั้งเป็น "{provider}" แต่ทดสอบแล้วไม่ได้ผลลัพธ์อะไรเลย การค้นหาด้วยคำสำคัญยังใช้ได้',"doctor.msg.embeddings.empty.fix":"รัน `memesh doctor --probe` เพื่อดูรายละเอียด หรือเช็กการเชื่อมต่อกับผู้ให้บริการ","doctor.msg.embeddings.threw.summary":'การค้นหาตามความหมายตั้งเป็น "{provider}" แต่ทดสอบแล้วล้มเหลว: {detail} การค้นหาด้วยคำสำคัญยังใช้ได้',"doctor.msg.embeddings.threw.fix":"ตรวจสอบว่าผู้ให้บริการ embedding เชื่อมต่อได้ (เช่น รัน `ollama serve`) หรือลบการตั้งค่า embedder เพื่อใช้การค้นหาด้วยคีย์เวิร์ดอย่างเดียว","doctor.msg.llm.unreachable.summary":"ผู้ให้บริการ AI ({provider}) ไม่ตอบกลับ: {detail} ฟีเจอร์ AI กำลังนิ่งเงียบโดยไม่ทำอะไรเลย","doctor.msg.llm.unreachable.fix":"เช็ก API key และการเชื่อมต่อ แล้วรัน `memesh doctor --probe` อีกครั้ง","doctor.msg.llm.threw.summary":"ทดสอบผู้ให้บริการ AI ({provider}) ล้มเหลว: {detail} ฟีเจอร์ AI กำลังนิ่งเงียบโดยไม่ทำอะไรเลย","doctor.msg.llm.threw.fix":"เช็ก API key และการเชื่อมต่อ แล้วรัน `memesh doctor --probe` อีกครั้ง","doctor.msg.install-channel.unknown.summary":"บอกไม่ได้ว่า memesh ถูกติดตั้งมาอย่างไร","doctor.msg.install-channel.unknown.fix":"ถ้าเป็นซอร์สโค้ด ให้รันจากโฟลเดอร์รากของ repo ไม่อย่างนั้นให้ติดตั้งใหม่ด้วย `npm install -g @pcircle/memesh`","doctor.msg.fts.unsegmented.summary":"ดัชนีคำสำคัญมี {count} รายการที่เป็นรูปแบบเก่า — ความจำบางส่วนจะเจอก็ต่อเมื่อพิมพ์ข้อความเต็มตรงเป๊ะเท่านั้น","doctor.msg.fts.unsegmented.fix":"รัน `memesh reindex --fts` เพื่อสร้างดัชนีใหม่","doctor.msg.vector-index.stale.summary":"ดัชนีการค้นหาต้องสร้างใหม่ (การตั้งค่าการค้นหาเปลี่ยนไป)","doctor.msg.vector-index.stale.fix":"รัน `memesh reindex` เพื่อสร้างใหม่","doctor.msg.database.broken.summary":"ฐานข้อมูลใช้งานไม่ได้: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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":"ยังไม่มีข้อมูล การติดตามจะเริ่มหลังเซสชันถัดไป","recall.summary":"ใช้แล้ว {used} / ใส่เข้าไป {total}","analytics.loadFailed":"โหลดข้อมูลวิเคราะห์ไม่สำเร็จ","memory.noContent":"(ไม่มีเนื้อหา)","memory.archivedBadge":"เก็บถาวรแล้ว","memory.factsCount":"{count} ข้อเท็จจริง","common.error":"ข้อผิดพลาด","common.serverUnreachable":"ไม่สามารถเชื่อมต่อเซิร์ฟเวอร์ memesh ได้","common.serverUnreachableAction":"ตรวจสอบว่า `memesh serve` ยังทำงานอยู่ แล้วโหลดหน้านี้ใหม่","common.responseUnreadable":"เซิร์ฟเวอร์ตอบกลับแล้ว แต่หน้านี้อ่านคำตอบไม่ได้ — เวอร์ชันของแดชบอร์ดกับเซิร์ฟเวอร์อาจไม่ตรงกัน","common.responseUnreadableAction":"โหลดหน้านี้ใหม่ หากยังเกิดขึ้นอีก ให้รัน `memesh doctor`","pm.title":"ตัวชี้วัด PM","pm.decisionsPerWeek":"การตัดสินใจ/สัปดาห์","pm.openDecisions":"การตัดสินใจค้าง (>14 วัน)","pm.orphanRate":"ความจำที่ไม่ได้เชื่อมโยง","pm.relationsTotal":"ความสัมพันธ์ทั้งหมด","pm.stalePlans":"แผน {count} รายการไม่ได้ทบทวนเกิน 30 วัน","common.loading":"กำลังโหลด…","common.noData":"ไม่มีข้อมูล","errors.unknown":"เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ","insights.noPreview":"ข้อเสนอนี้ไม่มีข้อความสรุป","httpError.auth.missing-bearer":"เซิร์ฟเวอร์นี้ต้องใช้โทเค็นการเข้าถึง กรุณากรอกโทเค็นเพื่อดำเนินการต่อ","httpError.auth.invalid-token":"โทเค็นการเข้าถึงไม่ถูกต้อง กรุณาตรวจสอบแล้วลองอีกครั้ง","httpError.auth.not-configured":"เซิร์ฟเวอร์ยังไม่ได้ตั้งค่าโทเค็นการเข้าถึง กรุณารีสตาร์ท `memesh serve` แล้วดูข้อความที่แสดง","httpError.validation.bad-body":"เซิร์ฟเวอร์อ่านคำขอที่หน้านี้ส่งไปไม่ได้ กรุณารีเฟรชหน้าแล้วลองอีกครั้ง","httpError.validation.bad-param":"ข้อมูลบางส่วนในคำขอไม่ถูกต้อง กรุณารีเฟรชหน้าแล้วลองอีกครั้ง","httpError.route.retired":"เซิร์ฟเวอร์ไม่รองรับการทำงานนี้แล้ว หน้าเว็บกับเซิร์ฟเวอร์อาจเป็นคนละเวอร์ชัน กรุณารีเฟรชหน้า","httpError.route.not-found":"เซิร์ฟเวอร์ไม่รู้จักคำขอนี้ หน้าเว็บกับเซิร์ฟเวอร์อาจเป็นคนละเวอร์ชัน กรุณารีเฟรชหน้า","httpError.resource.not-found":"รายการนี้ไม่มีอยู่แล้ว กรุณารีเฟรชรายการ","httpError.payload.too-large":"ข้อมูลที่ส่งใหญ่เกินไป (เกิน 1 MB) กรุณาแบ่งเป็นชุดเล็กลง","httpError.operation.failed":"เซิร์ฟเวอร์ไม่สามารถทำงานนี้ให้เสร็จได้","httpError.llm.not-configured":"ยังไม่ได้ตั้งค่าผู้ให้บริการ AI กรุณาเพิ่มในหน้าตั้งค่าก่อน","httpError.rate.limited":"มีคำขอมากเกินไปในช่วงเวลาสั้น ๆ กรุณารอสักครู่แล้วลองใหม่อีกครั้ง","httpError.server.internal":"เซิร์ฟเวอร์เกิดข้อผิดพลาดที่ไม่คาดคิด","settings.testError.auth":"คีย์ API ถูกปฏิเสธ กรุณาตรวจสอบคีย์แล้วลองอีกครั้ง","settings.testError.network":"ติดต่อผู้ให้บริการไม่ได้ กรุณาตรวจสอบการเชื่อมต่อเครือข่าย","settings.testError.no_models":"ผู้ให้บริการตอบกลับแต่ไม่ได้ส่งโมเดลที่ใช้งานได้มา","settings.testError.bad_host":"ที่อยู่ Ollama ต้องอยู่บนเครื่องนี้ (localhost)","settings.testError.http":"ผู้ให้บริการส่งข้อผิดพลาดกลับมา (HTTP {status})","settings.testError.unknown":"การทดสอบล้มเหลวโดยไม่ทราบสาเหตุ","time.justNow":"เมื่อสักครู่","time.hoursAgo":"{count} ชั่วโมงที่แล้ว","time.today":"วันนี้","time.yesterday":"เมื่อวาน","time.daysAgo":"{count} วันที่แล้ว","time.lastWeek":"สัปดาห์ที่แล้ว","time.weeksAgo":"{count} สัปดาห์ที่แล้ว","time.lastMonth":"เดือนที่แล้ว","time.monthsAgo":"{count} เดือนที่แล้ว","memory.access.frequent":"ใช้บ่อย · {count} ครั้ง","memory.access.recalls":"{count} ครั้ง","memory.access.never":"ไม่เคยเรียก","cluster.knowledge":"ความรู้","cluster.activity":"กิจกรรม","cluster.session":"เซสชัน","cluster.reference":"อ้างอิง","cluster.all":"ทั้งหมด","browse.filterCategory":"หมวดหมู่","browse.filterTime":"เวลา","browse.filterValue":"มูลค่า","browse.filterProject":"โปรเจกต์","browse.filterSort":"จัดเรียง","browse.timeToday":"วันนี้","browse.timeWeek":"สัปดาห์นี้","browse.timeMonth":"เดือนนี้","browse.timeOlder":"เก่ากว่า","browse.valueRecalled":"✓ ใช้แล้ว","browse.valueNever":"ไม่เคยเรียก","browse.sortMostRecalled":"ใช้มากที่สุด","browse.sortRecent":"ล่าสุด","browse.sortCreated":"สร้างเมื่อ","browse.emptyFilter":"ไม่มีหน่วยความจำในหมวดนี้ — ลองตัวกรองอื่น","lessons.tabFailure":"บทเรียนความล้มเหลว","lessons.tabPlan":"บันทึกแผน","lessons.tabFreeform":"โน้ต","lessons.totalRecalls":"จำนวนเรียกทั้งหมด","lessons.stepsLabel":"ขั้น","lessons.commitsCount":"{count} commits","lessons.unstructured":"(ไม่มีฟิลด์ที่มีโครงสร้าง — ดูหน่วยความจำดิบ)","lessons.searchPlaceholder":"ค้นหา error / root cause / fix / ชื่อ…","lessons.allProjects":"ทุกโปรเจกต์","lessons.showing":"แสดง {visible} / {total}","lessons.noMatch":'ไม่มีหน่วยความจำตรงกับ "{query}"',"lessons.emptyCategory":"ไม่มีหน่วยความจำในหมวดนี้","lessons.moreItems":"+{count} เพิ่มเติม","roadmap.title":"แผนที่โครงการ","roadmap.summary":"{count} ความทรงจำ · {first} → {last}","roadmap.switchToList":"↩ มุมมองรายการ","roadmap.switchToRoadmap":"🗺️ มุมมองแผนที่","roadmap.emptyProject":"ยังไม่มีความทรงจำในโครงการนี้","loop.label":"ลูปความทรงจำ","loop.subtitleHas":"ความทรงจำเชิงความรู้ที่ถูกเรียกในช่วง 7 วันที่ผ่านมา","loop.subtitleNone":"สัปดาห์นี้ยังไม่มีความทรงจำที่ถูกเรียก","loop.approxNote":"ค่าประมาณ — การติดตามเต็มรูปแบบเริ่มหลังการอัพเกรด","loop.sparkLabel":"30 วันล่าสุด","roadmap.milestones":"เหตุการณ์สำคัญ","roadmap.keyLessons":"บทเรียนสำคัญ","radar.title":"เรดาร์ความครอบคลุม","radar.caption":"ความทรงจำที่ใช้งาน (ไม่รวม session และ commit)","radar.axis.lessons":"บทเรียน","radar.axis.decisions":"การตัดสินใจ","radar.axis.patterns":"แพทเทิร์น","radar.axis.bugs":"แก้ไขบั๊ก","radar.axis.processes":"กระบวนการ","radar.axis.architecture":"สถาปัตยกรรม","ageMatrix.title":"การกระจายอายุ","ageMatrix.low":"ต่ำ","ageMatrix.high":"สูง","ageMatrix.legend":"ความเข้ม = ความหนาแน่น","ageMatrix.typeColumn":"ประเภท","header.signalModeOn":"สัญญาณ","header.signalModeOff":"ทั้งหมด","header.signalModeOnHint":"ซ่อนสัญญาณรบกวน session และ commit คลิกเพื่อแสดงทั้งหมด","header.signalModeOffHint":"แสดงความทรงจำทั้งหมดรวมถึงสัญญาณรบกวน คลิกเพื่อซ่อน","roadmap.phases":"ระยะ","onboarding.title":"ยินดีต้อนรับสู่ MeMesh","onboarding.body":"ที่เก็บความทรงจำว่างเปล่า เริ่มด้วยทัวร์ 30 รายการที่คัดสรรแล้วหรือบันทึกบทเรียนแรก","onboarding.llmHint":"ไม่ต้องใช้ LLM ทุกอย่างทำงานด้วย FTS5 อย่างเดียว LLM เป็นตัวเลือกสำหรับสร้างบทเรียนอัตโนมัติ ตั้งค่าภายหลังในหน้าตั้งค่าได้","onboarding.seedButton":"เริ่มทัวร์ตัวอย่าง","onboarding.seedingButton":"กำลังโหลด…","onboarding.seedHint":"เพิ่ม 30 ความทรงจำที่นี่เลย — ไม่ต้องเปิดเทอร์มินัล","onboarding.cliReference":"ชอบใช้ CLI ใช่ไหม?","onboarding.hintDemo":"ใส่ 30 ความทรงจำตัวอย่าง ลบทีหลังได้","onboarding.hintReset":"ลบทุกอย่างที่ติด metadata.demo","onboarding.resetButton":"ล้างข้อมูลตัวอย่าง","onboarding.resettingButton":"กำลังลบ…","onboarding.resetConfirm":"ลบความทรงจำตัวอย่างทั้งหมดหรือไม่? รายการที่คุณบันทึกเองจะยังอยู่","onboarding.dismiss":"ปิด","common.serverError":"เซิร์ฟเวอร์ตอบกลับข้อผิดพลาด (HTTP {status}) ลองอีกครั้ง — หากยังเกิดซ้ำ ให้รัน `memesh doctor`","emptyLibrary.title":"ความทรงจำของคุณยังว่างเปล่า","emptyLibrary.body":"ยังไม่มีข้อมูลบันทึกไว้ โหลดทัวร์ตัวอย่าง 30 รายการเพื่อดูการทำงานของ MeMesh — ลบทีหลังได้ในคลิกเดียว","browse.truncated":"กำลังแสดง {shown} รายการแรกจากทั้งหมด {total} — ใช้การค้นหาหรือตัวกรองเพื่อดูที่เหลือ","lessons.capNote":"โหลดเฉพาะบทเรียน {limit} รายการแรก — ตัวเลขด้านบนนับเฉพาะส่วนนี้","lessons.emptyGuide":"ยังไม่มีบทเรียน ใน Smart Mode ระบบ memesh จะบันทึกให้อัตโนมัติเมื่อวิเคราะห์ความล้มเหลวของเซสชัน — หรือขอให้ผู้ช่วยของคุณบันทึกให้","graph.cappedNote":"แสดงเฉพาะ {shown} อันดับแรกจาก {total} เอนทิตี (เรียงตามการเรียกคืน) เพื่อให้กราฟลื่นไหล","settings.testStoredKeyHint":"เว้นช่องนี้ว่างเพื่อทดสอบคีย์ที่บันทึกไว้แล้ว","ageMatrix.bucket.week":"สัปดาห์นี้","ageMatrix.bucket.month":"เดือนนี้","ageMatrix.bucket.quarter":"ไตรมาสนี้","ageMatrix.bucket.older":"เก่ากว่า","settings.behaviourTitle":"การทำงาน","settings.autoUpdateLabel":"นโยบายอัพเดตอัตโนมัติ","settings.autoUpdateOff":"ปิด — ด้วยตนเองเท่านั้น","settings.autoUpdatePatch":"Patch — ใช้ X.Y.Z+1","settings.autoUpdateMinor":"Minor — ใช้ X.Y+1.0","settings.autoUpdateMajor":"Major — ใช้ทุกระดับ","settings.autoUpdateHint":"ทำงานหลังแต่ละเซสชัน MEMESH_AUTO_UPDATE มีลำดับความสำคัญ","errors.timeout":"คำขอหมดเวลา","type.lesson_learned":"บทเรียน","type.lesson":"บทเรียน","type.mistake":"ความผิดพลาด","type.decision":"การตัดสินใจ","type.architecture_decision":"ตัดสินใจสถาปัตย์","type.design_decision":"ตัดสินใจด้านดีไซน์","type.pattern":"แพทเทิร์น","type.technical_pattern":"แพทเทิร์นเทคนิค","type.best_practice":"แนวปฏิบัติที่ดี","type.bug_fix":"แก้บั๊ก","type.verification_result":"ผลการตรวจสอบ","type.test_result":"ผลการทดสอบ","type.process":"กระบวนการ","type.architecture":"สถาปัตยกรรม","type.infrastructure":"โครงสร้างพื้นฐาน","type.feature":"ฟีเจอร์","type.release":"รีลีส","type.refactoring":"รีแฟคเตอร์","type.commit":"คอมมิต","type.session_keypoint":"ประเด็นสำคัญของเซสชัน","type.session_identity":"ตัวตนของเซสชัน","type.session-insight":"ข้อคิดจากเซสชัน","type.session-summary":"สรุปเซสชัน","type.session-identity":"ตัวตนของเซสชัน","type.weekly_summary":"สรุปรายสัปดาห์","type.weekly-summary":"สรุปรายสัปดาห์","type.note":"โน้ต","type.plan":"แผน","type.knowledge":"ความรู้","type.workflow_checkpoint":"เหตุการณ์สำคัญ","type.concept":"แนวคิด","type.tool":"เครื่องมือ","type.person":"บุคคล","relation.relates_to":"เกี่ยวข้องกับ","relation.related-to":"เกี่ยวข้องกับ","relation.depends_on":"ขึ้นอยู่กับ","relation.implements":"อิมพลีเมนต์","relation.learned_from":"เรียนรู้จาก","relation.supersedes":"แทนที่","relation.contradicts":"ขัดแย้งกับ","relation.follows":"ต่อจาก","relation.belongs-to-project":"อยู่ในโครงการ","relation.co-created":"สร้างร่วมกัน","relation.shares-name-tokens":"ชื่อคล้ายกัน","patterns.day.0":"วันอาทิตย์","patterns.day.1":"วันจันทร์","patterns.day.2":"วันอังคาร","patterns.day.3":"วันพุธ","patterns.day.4":"วันพฤหัสบดี","patterns.day.5":"วันศุกร์","patterns.day.6":"วันเสาร์","telemetry.flow.dreamer":"สรุปรายสัปดาห์ (dreamer)","telemetry.flow.pattern_detector":"ตัวตรวจจับแพทเทิร์น","telemetry.flow.digest_validator":"ตัวตรวจสอบสรุป","telemetry.flow.auto_tagger":"แท็กอัตโนมัติ","telemetry.flow.failure_analyzer":"วิเคราะห์ความล้มเหลว","telemetry.flow.transcript_extractor":"ขุดข้อมูลบันทึกการสนทนา","telemetry.flow.conflict_judge":"ตัดสินข้อขัดแย้ง","telemetry.errorClass.auth":"การยืนยันตัวถูกปฏิเสธ","telemetry.errorClass.rate_limit":"ติดขีดจำกัดอัตรา","telemetry.errorClass.upstream":"ผู้ให้บริการขัดข้อง","telemetry.errorClass.bad_request":"คำขอไม่ถูกต้อง","telemetry.errorClass.network":"เครือข่าย","telemetry.errorClass.parse":"อ่านคำตอบไม่ได้","telemetry.errorClass.unknown":"ไม่ทราบ","lessons.severity.critical":"วิกฤต","lessons.severity.major":"รุนแรง","lessons.severity.minor":"เล็กน้อย","memory.tooltip.project":"โครงการ","memory.tooltip.recalled":"ถูกเรียกคืน {count} ครั้ง","memory.tooltip.hasRelations":"เชื่อมโยงกับความทรงจำอื่น {count} รายการ","memory.tooltip.createdAt":"สร้างเมื่อ {date}","graph.drift":"ความสดใหม่","graph.driftHint":"ระบายสีตามอายุ: แดง = ไม่ได้ใช้นาน, เขียว = ใช้ล่าสุด","common.unknown":"ไม่ทราบ","insights.entitiesCount":"{n} เอนทิตี","roadmap.viewToggle":"มุมมองแผนที่","roadmap.viewTree":"ต้นไม้","roadmap.viewMindmap":"มายด์แมป","roadmap.mindmapNeedsPhases":"มายด์แมปต้องมีความทรงจำอย่างน้อย 3 รายการภายใน 7 วัน","roadmap.activePhase":"กำลังดำเนิน","roadmap.entryCount":"{count} รายการ","roadmap.entriesCount":"{count} รายการ","roadmap.otherGroup":"อื่น ๆ ({count})","roadmap.lowSignalHidden":"(ซ่อน {count} รายการสัญญาณต่ำ)","roadmap.resetHint":"รีเซ็ตการซูมและตำแหน่ง (ดับเบิลคลิกพื้นหลังก็ได้)","roadmap.zoomHint":"เลื่อนเพื่อซูม · ลากเพื่อเลื่อน · {pct}%","roadmap.moreEntities":"อีก {count} รายการ","nav.ariaLabel":"ส่วนต่าง ๆ ของแดชบอร์ด","feedback.descLabel":"รายละเอียดข้อเสนอแนะ","graph.canvasA11y":"กราฟความรู้ (วาดบนแคนวาส): {entities} เอนทิตี, {relations} ความสัมพันธ์, {orphans} ที่ไม่เชื่อมต่อ ใช้ตัวกรองประเภทและการค้นหาด้านบนเพื่อดูแบบไม่ใช้ภาพ"}},cn={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 gt="en";function dn(){const t=localStorage.getItem("memesh-locale");if(t&&Ht[t])return t;const s=navigator.language;if(s.startsWith("zh-TW")||s.startsWith("zh-Hant"))return"zh-TW";if(s.startsWith("zh"))return"zh-CN";const o=s.split("-")[0];return Ht[o]?o:"en"}function mn(){return gt=dn(),gt}function un(t){gt=t,localStorage.setItem("memesh-locale",t)}function n(t,s){const o=Ht[gt]?.[t]||Ht.en[t]||t;return s?o.replace(/\{(\w+)\}/g,(r,a)=>{const i=s[a];return i===void 0?`{${a}}`:String(i)}):o}function he(){return gt}function Fs(){return Object.entries(cn).map(([t,s])=>({code:t,name:s}))}const ys="memesh.signalMode",Xt="memesh:signal-mode-changed",hn=!0;function Jt(){try{const t=localStorage.getItem(ys);if(t==="true")return!0;if(t==="false")return!1}catch{}return hn}function gn(t){try{localStorage.setItem(ys,String(t))}catch{}}function bs(){const[t,s]=x(Jt);te(()=>{function r(i){const u=i.detail;u&&typeof u.value=="boolean"?s(u.value):s(Jt())}function a(i){i.key===ys&&s(Jt())}return window.addEventListener(Xt,r),window.addEventListener("storage",a),()=>{window.removeEventListener(Xt,r),window.removeEventListener("storage",a)}},[]);function o(r){gn(r),s(r),window.dispatchEvent(new CustomEvent(Xt,{detail:{value:r}}))}return[t,o]}function pn({health:t,error:s}){const[o,r]=bs();return e("div",{class:"header",children:[e("div",{class:"header-brand",children:[e("h1",{children:"MeMesh"}),e("small",{children:n("brand.subtitle")})]}),e("div",{class:"header-right",children:e("div",{class:"header-meta",children:[e("button",{type:"button",class:"signal-toggle",onClick:()=>r(!o),"aria-pressed":o,title:n(o?"header.signalModeOnHint":"header.signalModeOffHint"),style:{fontSize:11,padding:"4px 10px",borderRadius:"var(--radius)",border:`1px solid ${o?"rgba(0, 214, 180, 0.4)":"rgba(255, 255, 255, 0.08)"}`,background:o?"rgba(0, 214, 180, 0.12)":"transparent",color:o?"var(--accent)":"var(--text-2)",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{marginRight:4},children:o?"●":"○"}),n(o?"header.signalModeOn":"header.signalModeOff")]}),t?e(ie,{children:[e("span",{children:[e("span",{class:"dot dot-ok"}),n("header.connected")]}),e("span",{class:"badge-version",children:["v",t.version," · ",t.entity_count.toLocaleString(he())," ",n("header.memories")]})]}):s?e("span",{children:[e("span",{class:"dot dot-err"}),n("header.disconnected")]}):e("span",{style:{color:"var(--text-3)"},children:n("header.connecting")})]})})]})}function fn({tabs:t,active:s,onSelect:o}){const r=ne(null),a=ne([]),[i,u]=x(!1),m=Me(()=>{const l=r.current;l&&u(l.scrollLeft+l.clientWidth<l.scrollWidth-1)},[]);te(()=>{m();const l=r.current;if(l)return l.addEventListener("scroll",m,{passive:!0}),window.addEventListener("resize",m),()=>{l.removeEventListener("scroll",m),window.removeEventListener("resize",m)}},[m,t.length]);const d=(l,h)=>{let c;if(l.key==="ArrowRight"||l.key==="ArrowDown")c=(h+1)%t.length;else if(l.key==="ArrowLeft"||l.key==="ArrowUp")c=(h-1+t.length)%t.length;else if(l.key==="Home")c=0;else if(l.key==="End")c=t.length-1;else return;l.preventDefault(),o(t[c].key),a.current[c]?.focus(),a.current[c]?.scrollIntoView({block:"nearest",inline:"nearest"})};return e("nav",{"aria-label":n("nav.ariaLabel"),style:{position:"relative"},children:[e("div",{ref:r,class:"nav",role:"tablist","aria-label":n("nav.ariaLabel"),children:t.map(({key:l,label:h},c)=>{const y=l===s;return e("button",{ref:b=>{a.current[c]=b},id:`tab-${l}`,role:"tab","aria-selected":y?"true":"false","aria-controls":`panel-${l}`,tabIndex:y?0:-1,class:`nav-btn ${y?"active":""}`,onClick:()=>o(l),onKeyDown:b=>d(b,c),children:h},l)})}),i&&e("div",{"aria-hidden":"true",class:"nav-overflow-fade"})]})}const yn=1e4,cs="memesh_token";function ds(){try{return localStorage.getItem(cs)}catch{return null}}function bn(t){try{t?localStorage.setItem(cs,t):localStorage.removeItem(cs)}catch{}}class vs extends Error{constructor(){super("auth_required"),this.name="AuthRequiredError"}}class Ao extends Error{constructor(s){super(`HTTP ${s}`),this.name="HttpError",this.status=s}}class Ot extends Error{constructor(s){super(s),this.name="NetworkError"}}class Eo extends Error{constructor(s){super(s),this.name="RateLimitError"}}function Bs(t){if(typeof t.errorCode=="string"&&t.errorCode){const s=`httpError.${t.errorCode}`,o=n(s);if(o!==s)return new Error(o)}return new Error(typeof t.error=="string"&&t.error?t.error:n("errors.unknown"))}async function J(t,s,o){const r=new AbortController,a=setTimeout(()=>r.abort(),yn);try{const i={"Content-Type":"application/json"},u=ds();u&&(i.Authorization=`Bearer ${u}`);const m={method:t,headers:i,signal:r.signal};o&&(m.body=JSON.stringify(o));const d=await fetch(s,m);if(d.status===401)throw window.dispatchEvent(new Event("memesh:auth-required")),new vs;if(!d.ok){if(d.status===429)throw new Eo(n("httpError.rate.limited"));let h=null;try{h=await d.json()}catch{}throw h&&typeof h=="object"&&h.success===!1?Bs(h):new Ao(d.status)}const l=await d.json();if(!l.success)throw Bs(l);return l.data}catch(i){throw i instanceof Error&&i.name==="AbortError"?new Ot(n("errors.timeout")):i instanceof TypeError?new Ot(i.message):i}finally{clearTimeout(a)}}async function Lo(){const t=await J("GET","/v1/projects");return Array.isArray(t)?t:[]}async function vn(){return J("GET","/v1/graph")}async function kn(){const t=await J("GET","/v1/entities?type=lesson_learned&limit=100");return Array.isArray(t)?t:[]}const wn=/^(Steps|Commits|Branch|Diff stats|Compaction reason|Tool calls|Plan ".+" completed)[:\s]/;function xn(t){return wn.test(t.trim())}const _n={lesson_learned:"knowledge",lesson:"knowledge",mistake:"knowledge",decision:"knowledge",architecture_decision:"knowledge",design_decision:"knowledge",pattern:"knowledge",technical_pattern:"knowledge",best_practice:"knowledge",bug_fix:"knowledge",verification_result:"knowledge",test_result:"knowledge",process:"knowledge",architecture:"knowledge",infrastructure:"knowledge",feature:"knowledge",release:"knowledge",refactoring:"knowledge",commit:"activity",session_keypoint:"session",session_identity:"session","session-insight":"session","session-summary":"session","session-identity":"session",weekly_summary:"activity","weekly-summary":"activity",note:"reference",plan:"reference",knowledge:"reference",workflow_checkpoint:"reference"};function qs(t){return _n[t]??"reference"}function Oe(t){const s=`type.${t}`,o=n(s);return o===s?t:o}function Mn(t){const s=`relation.${t}`,o=n(s);return o===s?t:o}function Ge(t,s=new Date){if(!t)return"—";const o=new Date(t);if(Number.isNaN(o.getTime()))return"—";const r=s.getTime()-o.getTime(),a=Math.floor(r/864e5);if(a<0)return o.toLocaleDateString(he(),{month:"short",day:"numeric"});if(a===0){const i=Math.floor(r/36e5);return i<1?n("time.justNow"):i<24?n("time.hoursAgo",{count:i}):n("time.today")}return a===1?n("time.yesterday"):a<7?n("time.daysAgo",{count:a}):a<14?n("time.lastWeek"):a<30?n("time.weeksAgo",{count:Math.floor(a/7)}):a<60?n("time.lastMonth"):a<365?n("time.monthsAgo",{count:Math.floor(a/30)}):o.toLocaleDateString(he(),{year:"numeric",month:"short",day:"numeric"})}function To(t,s=new Date){if(!t)return"older";const o=s.getTime()-new Date(t).getTime(),r=Math.floor(o/864e5);return r<1?"today":r<7?"week":r<30?"month":"older"}const Us="project:";function it(t){const s=t.tags?.find(o=>o.startsWith(Us));return s?s.slice(Us.length):null}function Cn(t){if(!t||t.length===0)return"";const s=t.filter(r=>r.length>30&&!xn(r)),o=s.length>0?s:t;return o.slice(0,3).reduce((r,a)=>a.length>r.length?a:r,o[0])}function Ze(t){const s=t.title?.trim();if(s)return s;const o=Cn(t.observations);if(o)return o;const r=t.created_at?new Date(t.created_at).toLocaleDateString(he(),{year:"numeric",month:"short",day:"numeric"}):"";return r?`${Oe(t.type)} · ${r}`:Oe(t.type)}function ft(t){const s=t??0;return s===0?{count:s,label:n("memory.access.never"),tone:"none"}:s>=20?{count:s,label:n("memory.access.frequent",{count:s}),tone:"high"}:s>=5?{count:s,label:n("memory.access.recalls",{count:s}),tone:"medium"}:{count:s,label:n("memory.access.recalls",{count:s}),tone:"low"}}function Sn(t){if((t.tags??[]).some(i=>i==="plan-completion"||i.startsWith("plan:")))return"plan-completion";const r=(t.observations??[]).join(" ");return/(^|\s)Error:/.test(r)&&(/(^|\s)Fix:/.test(r)||/(^|\s)Root cause:/.test(r))?"failure":"freeform"}const le=1.5;function An(t){switch(t){case"lesson_learned":case"lesson":case"mistake":return"lesson";case"decision":case"architecture_decision":case"design_decision":return"decision";case"pattern":case"technical_pattern":case"best_practice":return"pattern";case"bug_fix":case"verification_result":case"test_result":return"bug";case"architecture":case"infrastructure":return"architecture";case"feature":case"release":case"refactoring":return"feature";case"commit":return"commit";case"session_keypoint":case"session_identity":case"session-insight":case"session-summary":case"session-identity":return"session";case"workflow_checkpoint":return"milestone";case"weekly-summary":case"weekly_summary":return"calendar";case"note":case"plan":case"knowledge":case"process":return"note";default:return"dot"}}const En={lesson:e(ie,{children:[e("path",{d:"M6 9.5 a4 4 0 1 1 4 0 v1 a1 1 0 0 1 -1 1 h-2 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"}),e("path",{d:"M7 13 h2",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"}),e("path",{d:"M7 14.5 h2",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),decision:e(ie,{children:[e("circle",{cx:"8",cy:"8",r:"5.5",fill:"none",stroke:"currentColor",strokeWidth:le}),e("circle",{cx:"8",cy:"8",r:"2",fill:"none",stroke:"currentColor",strokeWidth:le}),e("path",{d:"M8 0.5 v3 M8 12.5 v3 M0.5 8 h3 M12.5 8 h3",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),pattern:e("path",{d:"M3 3 h4 v1.5 a1.5 1.5 0 0 0 3 0 V3 h3 v3 h-1.5 a1.5 1.5 0 0 0 0 3 H13 v4 h-4 v-1.5 a1.5 1.5 0 0 0 -3 0 V13 H3 v-4 h1.5 a1.5 1.5 0 0 0 0 -3 H3 z",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"}),bug:e(ie,{children:[e("ellipse",{cx:"8",cy:"9",rx:"3.5",ry:"4",fill:"none",stroke:"currentColor",strokeWidth:le}),e("path",{d:"M8 5 v-1 M5.5 6.5 L4 5 M10.5 6.5 L12 5 M4.5 9 H2.5 M11.5 9 H13.5 M5 11.5 L3.5 13 M11 11.5 L12.5 13",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),architecture:e(ie,{children:[e("rect",{x:"2",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:le}),e("rect",{x:"9",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:le}),e("rect",{x:"5.5",y:"2",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:le})]}),feature:e(ie,{children:e("path",{d:"M8 2 L9.5 6.5 L14 8 L9.5 9.5 L8 14 L6.5 9.5 L2 8 L6.5 6.5 z",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"})}),commit:e(ie,{children:e("path",{d:"M5 2 L4 14 M11 2 L10 14 M2.5 6 H13.5 M2.5 10 H13.5",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})}),session:e(ie,{children:[e("circle",{cx:"8",cy:"9",r:"5",fill:"none",stroke:"currentColor",strokeWidth:le}),e("path",{d:"M8 9 V5.5 M8 9 L10.5 11",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"}),e("path",{d:"M6.5 2 H9.5",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),milestone:e(ie,{children:[e("path",{d:"M4 2 V14",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"}),e("path",{d:"M4 3 H12 L10 6 L12 9 H4 z",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"})]}),calendar:e(ie,{children:[e("rect",{x:"2",y:"3",width:"12",height:"11",rx:"1",fill:"none",stroke:"currentColor",strokeWidth:le}),e("path",{d:"M2 6.5 H14 M5 1.5 V4.5 M11 1.5 V4.5",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),note:e(ie,{children:[e("path",{d:"M4 2 H10 L13 5 V14 H4 z",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"}),e("path",{d:"M10 2 V5 H13",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"}),e("path",{d:"M6 8.5 H11 M6 11 H11",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),dot:e("circle",{cx:"8",cy:"8",r:"2",fill:"currentColor"})};function pt({type:t,size:s=16,color:o,ariaLabel:r}){const a=An(t),i=r??Oe(t);return e("svg",{width:s,height:s,viewBox:"0 0 16 16",role:"img","aria-label":i,style:{color:o??"currentColor",flexShrink:0,display:"inline-block",verticalAlign:"text-bottom"},children:[e("title",{children:i}),En[a]]})}function Ws(t,s){return t.length>s?t.slice(0,s)+"…":t}function Ln(t){if(!t)return"";const s=new Date(t);if(Number.isNaN(s.getTime()))return t.slice(0,16).replace("T"," ");const o=r=>String(r).padStart(2,"0");return`${s.getFullYear()}-${o(s.getMonth()+1)}-${o(s.getDate())} ${o(s.getHours())}:${o(s.getMinutes())}`}const Tn={high:{bg:"rgba(0, 214, 180, 0.18)",fg:"var(--accent)"},medium:{bg:"rgba(0, 214, 180, 0.10)",fg:"var(--accent)"},low:{bg:"rgba(255, 255, 255, 0.04)",fg:"var(--text-2)"},none:{bg:"rgba(255, 255, 255, 0.03)",fg:"var(--text-3)"}};function ot({entity:t,actions:s,highlight:o}){const r=Ze(t)||n("memory.noContent"),a=t.observations?.length??0,i=t.archived||t.status==="archived",u=it(t),m=ft(t.access_count),d=Tn[m.tone],l=Ge(t.last_accessed_at||t.created_at),h=(t.relations?.length??0)>0;return e("div",{class:"mem-row",style:i?{opacity:.45}:void 0,children:[e("div",{class:"mem-time",style:{textAlign:"center"},children:[e("div",{style:{height:20,display:"flex",alignItems:"center",justifyContent:"center",color:"var(--text-2)"},children:e(pt,{type:t.type,size:18})}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:2},children:l})]}),e("div",{class:"mem-body",children:[e("div",{class:"mem-preview",title:t.name,children:o?e(Pn,{text:Ws(r,160),term:o}):Ws(r,160)}),e("div",{class:"mem-meta",style:{flexWrap:"wrap",gap:6},children:[e("span",{class:"badge badge-type",children:Oe(t.type)}),i&&e("span",{class:"badge badge-archived",children:n("memory.archivedBadge")}),u&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.12)",color:"var(--accent)",display:"inline-flex",alignItems:"center",gap:4},title:n("memory.tooltip.project"),children:[e("svg",{width:"11",height:"11",viewBox:"0 0 16 16","aria-hidden":"true",style:{flexShrink:0},children:e("path",{d:"M2 4 a1 1 0 0 1 1 -1 h4 l2 2 h5 a1 1 0 0 1 1 1 v6 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"})}),u]}),m.tone!=="none"&&e("span",{class:"tag",style:{background:d.bg,color:d.fg,fontWeight:m.tone==="high"?600:400},title:n("memory.tooltip.recalled",{count:m.count}),children:["✓ ",m.label]}),h&&e("span",{class:"tag",style:{opacity:.7},title:n("memory.tooltip.hasRelations",{count:t.relations.length}),children:["→ ",t.relations.length]}),e("span",{style:{color:"var(--text-3)",fontSize:10,fontFamily:"var(--mono)",opacity:.85},title:n("memory.tooltip.createdAt",{date:t.created_at}),children:["· ",Ln(t.created_at)]}),a>1&&e("span",{style:{color:"var(--text-3)",fontSize:11},children:["· ",n("memory.factsCount",{count:a})]}),t.tags?.filter(c=>!c.startsWith("project:")&&!/^\d{4}-\d{2}-\d{2}/.test(c)).slice(0,3).map(c=>e("span",{class:"tag",children:c},c))]})]}),s&&e("div",{class:"mem-actions",children:s})]})}function Pn({text:t,term:s}){if(!s)return e(ie,{children:t});const o=[],r=t.toLowerCase(),a=s.toLowerCase();let i=0;for(;i<t.length;){const u=r.indexOf(a,i);if(u===-1){o.push(t.slice(i));break}u>i&&o.push(t.slice(i,u)),o.push(e("mark",{children:t.slice(u,u+a.length)})),i=u+a.length}return e(ie,{children:o})}function lt(t){return t instanceof Eo?"ratelimited":t instanceof Ot?"unreachable":"unreadable"}function $e(t){return t==="unreachable"?`${n("common.serverUnreachable")} ${n("common.serverUnreachableAction")}`:t==="ratelimited"?n("httpError.rate.limited"):`${n("common.responseUnreadable")} ${n("common.responseUnreadableAction")}`}function Se(t){return t instanceof Ot?$e("unreachable"):t instanceof vs?n("auth.title"):t instanceof Ao?n("common.serverError",{status:t.status}):t instanceof Error&&t.message?t.message:n("errors.unknown")}function Rn(){const[t,s]=x(""),[o,r]=x(null),[a,i]=x(!1),[u,m]=x("");async function d(){if(t.trim()){i(!0),m("");try{const l=await J("POST","/v1/recall",{query:t.trim(),limit:30}),h=Array.isArray(l)?l:l.entities||[];r(h)}catch(l){m(Se(l))}finally{i(!1)}}}return e("div",{children:e("div",{class:"card",children:[e("div",{class:"card-title",children:n("search.title")}),e("div",{class:"search-bar",children:[e("input",{type:"search",placeholder:n("search.placeholder"),value:t,onInput:l=>s(l.target.value),onKeyDown:l=>l.key==="Enter"&&d()}),e("button",{class:"btn btn-primary",onClick:d,disabled:a,children:n(a?"search.searching":"search.button")})]}),!a&&o===null&&!u&&e("div",{class:"empty",style:{padding:"32px 20px",color:"var(--text-3)"},children:e("div",{style:{fontSize:13,lineHeight:1.6},children:n("search.hint")})}),u&&e("div",{class:"error-box",role:"alert",children:u}),a&&e("div",{class:"empty",children:e("div",{class:"loading"})}),!a&&o!==null&&o.length===0&&e("div",{class:"empty",role:"status",children:[e("span",{class:"empty-icon",children:"🔍"}),n("search.noResults"),' "',t,'"']}),!a&&o&&o.length>0&&e("div",{children:[e("div",{role:"status",style:{fontSize:12,color:"var(--text-3)",marginBottom:12},children:[e("span",{style:{fontFamily:"var(--mono)"},children:o.length})," ",o.length!==1?n("search.results"):n("search.result")]}),o.map(l=>e("div",{class:"card",style:{padding:14},children:e(ot,{entity:l,highlight:t})},l.id))]})]})})}const Ks=new Set(["release","feature"]),jn=.65,zn=new Set(["release"]),In=new Set(["lesson_learned","lesson","mistake","bug_fix"]),Dn={release:0,architecture:1,architecture_decision:1,infrastructure:1,plan:2,feature:3,decision:4,design_decision:4,bug_fix:5,refactoring:6,"weekly-summary":7,weekly_summary:7,lesson_learned:8,lesson:8,mistake:8,principle:9,best_practice:10,technical_pattern:10,pattern:10};function Nn(t){if(t.length<3)return[];const r=[...t].sort((m,d)=>m.created_at.localeCompare(d.created_at)),a=[];let i=[r[0]];for(let m=1;m<r.length;m++){const d=r[m-1].created_at,l=r[m].created_at;(new Date(l).getTime()-new Date(d).getTime())/864e5<=7?i.push(r[m]):(a.push(i),i=[r[m]])}a.push(i);const u=[];for(const m of a){if(m.length<3)continue;const d=m.map(l=>({e:l,p:Dn[l.type]??99})).sort((l,h)=>l.p-h.p)[0];d.p!==99&&u.push({startIso:m[0].created_at,endIso:m[m.length-1].created_at,entityCount:m.length,label:Ze(d.e),anchorId:d.e.id})}return u}const Hn={release:0,architecture:1,architecture_decision:1,infrastructure:2,plan:3,feature:4,decision:5,design_decision:5,pattern:6,technical_pattern:6,best_practice:7,lesson_learned:8,lesson:8,mistake:8,bug_fix:9,refactoring:10,process:11,workflow_checkpoint:11,note:12,knowledge:13,verification_result:14,test_result:14,"weekly-summary":15,weekly_summary:15,commit:90,session_keypoint:91,session_identity:92,"session-identity":92,"session-insight":93,"session-summary":94};function rt(t){return Hn[t]??50}function On(t,s=new Date){const o=new Map;for(const a of t){const i=a.last_accessed_at||a.created_at,u=To(i,s);let m,d,l;if(u==="today")m="today",d=n("time.today"),l=Number.MAX_SAFE_INTEGER;else if(u==="week"){const c=i.slice(0,10);m=`week:${c}`,d=Ge(i,s),l=new Date(c).getTime()}else if(u==="month"){const c=i.slice(0,10),y=new Date(c),b=new Date(y);b.setDate(y.getDate()-y.getDay());const g=b.toISOString().slice(0,10);m=`month:${g}`,d=Ge(g,s),l=b.getTime()}else{const c=i.slice(0,7);m=`older:${c}`;const y=new Date(c+"-01");d=y.toLocaleDateString(he(),{year:"numeric",month:"long"}),l=y.getTime()}let h=o.get(m);h||(h={key:m,label:d,sort:l,entries:[]},o.set(m,h)),h.entries.push(a)}const r=Array.from(o.values()).sort((a,i)=>i.sort-a.sort);for(const a of r)a.entries.sort((i,u)=>{const m=rt(i.type)-rt(u.type);return m!==0?m:u.created_at.localeCompare(i.created_at)});return r}function Fn({projectName:t,entities:s,onSwitchToList:o}){const[r,a]=x("tree"),i=je(()=>{if(s.length===0)return{total:0,first:null,last:null,types:[]};const g=[...s].sort((_,f)=>_.created_at.localeCompare(f.created_at)),p=new Map;for(const _ of s)p.set(_.type,(p.get(_.type)??0)+1);return{total:s.length,first:g[0].created_at,last:g[g.length-1].created_at,types:Array.from(p.entries()).sort((_,f)=>f[1]-_[1])}},[s]),u=je(()=>On(s),[s]),m=je(()=>s.filter(g=>{if(!Ks.has(g.type))return!1;if(zn.has(g.type))return!0;const p=g.metadata?.signal_score;return typeof p!="number"?!0:p>=jn}).sort((g,p)=>p.created_at.localeCompare(g.created_at)).slice(0,6),[s]),d=je(()=>s.filter(p=>Ks.has(p.type)).length-m.length,[s,m]),l=je(()=>s.filter(g=>In.has(g.type)).sort((g,p)=>(p.access_count??0)-(g.access_count??0)).slice(0,5),[s]),h=je(()=>Nn(s),[s]),c=ne(new Map),y=g=>p=>{p?c.current.set(g,p):c.current.delete(g)},b=g=>{const p=c.current.get(g);p&&(p.scrollIntoView({behavior:"smooth",block:"center"}),p.style.transition="background 0.2s",p.style.background="var(--accent-soft)",window.setTimeout(()=>{p.style.background=""},1400))};return s.length===0?e("div",{class:"empty",children:[e("span",{class:"empty-icon",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",color:"var(--text-3)"},children:e("svg",{width:"32",height:"32",viewBox:"0 0 16 16","aria-hidden":"true",children:[e("path",{d:"M2 4 L6 2 L10 4 L14 2 V12 L10 14 L6 12 L2 14 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"}),e("path",{d:"M6 2 V12 M10 4 V14",stroke:"currentColor",strokeWidth:"1.5"})]})}),n("roadmap.emptyProject")]}):e("div",{children:[e("div",{style:{padding:"14px 16px",background:"var(--border-subtle)",border:"1px solid rgba(0, 214, 180, 0.12)",borderRadius:"var(--radius-sm)",marginBottom:14},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",flexWrap:"wrap",gap:8},children:[e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:18,fontWeight:600,color:"var(--text-0)",display:"inline-flex",alignItems:"center",gap:8},children:[e("svg",{width:"18",height:"18",viewBox:"0 0 16 16","aria-hidden":"true",style:{color:"var(--accent)"},children:e("path",{d:"M2 4 a1 1 0 0 1 1 -1 h4 l2 2 h5 a1 1 0 0 1 1 1 v6 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"})}),e("span",{children:t}),e("span",{style:{color:"var(--text-3)",fontWeight:400,fontSize:13},children:["· ",n("roadmap.title")]})]}),e("div",{style:{fontSize:12,color:"var(--text-2)",marginTop:4},children:n("roadmap.summary",{count:i.total,first:i.first?i.first.slice(0,10):"—",last:i.last?i.last.slice(0,10):"—"})})]}),e("div",{style:{display:"flex",gap:8,alignItems:"center",flexShrink:0},children:[e("div",{role:"tablist","aria-label":n("roadmap.viewToggle"),style:{display:"inline-flex",background:"rgba(255,255,255,0.04)",borderRadius:"var(--radius-xs)",padding:2,border:"1px solid var(--border-subtle)"},children:["tree","mindmap"].map(g=>{const p=r===g;return e("button",{role:"tab","aria-selected":p,onClick:()=>a(g),style:{padding:"4px 10px",background:p?"rgba(0,214,180,0.15)":"transparent",color:p?"var(--accent)":"var(--text-2)",border:"none",borderRadius:"var(--radius-hairline)",fontSize:11,fontFamily:"inherit",cursor:"pointer",fontWeight:p?600:400},children:g==="tree"?`🌲 ${n("roadmap.viewTree")}`:`🧠 ${n("roadmap.viewMindmap")}`},g)})}),o&&e("button",{class:"btn btn-sm",onClick:o,children:n("roadmap.switchToList")})]})]}),i.types.length>0&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginTop:10},children:[i.types.slice(0,8).map(([g,p])=>e("span",{class:"tag",style:{fontSize:11,background:"rgba(255,255,255,0.04)"},children:[Oe(g)," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)"},children:p})]},g)),i.types.length>8&&e("span",{class:"tag",style:{opacity:.5,fontSize:11},children:["+",i.types.length-8]})]})]}),h.length>0&&e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:14,padding:"12px 14px",border:"1px solid rgba(255, 255, 255, 0.04)",borderRadius:"var(--radius-sm)",background:"rgba(255, 255, 255, 0.02)",overflowX:"auto"},children:[e("span",{style:{fontSize:10,textTransform:"uppercase",letterSpacing:"0.08em",color:"var(--text-3)",fontWeight:600,flexShrink:0},children:n("roadmap.phases")}),h.map((g,p)=>e("button",{onClick:()=>g.anchorId!==void 0&&b(g.anchorId),disabled:g.anchorId===void 0,style:{flexShrink:0,display:"flex",flexDirection:"column",alignItems:"flex-start",gap:2,padding:"6px 10px",background:p===h.length-1?"var(--accent-soft)":"transparent",border:"1px solid",borderColor:p===h.length-1?"rgba(0, 214, 180, 0.3)":"var(--border-subtle)",borderRadius:"var(--radius-xs)",color:"var(--text-1)",cursor:g.anchorId!==void 0?"pointer":"default",fontFamily:"inherit",textAlign:"left",minWidth:100},title:`${g.startIso.slice(0,10)} → ${g.endIso.slice(0,10)}`,children:[e("span",{style:{fontSize:11,fontWeight:600,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:240},children:g.label}),e("span",{style:{fontSize:10,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[g.entityCount," · ",Ge(g.startIso)]})]},`${g.startIso}-${g.label}`))]}),r==="mindmap"&&h.length>0&&e(Bn,{projectName:t,phases:h,entities:s,onNodeClick:g=>{a("tree"),window.requestAnimationFrame(()=>b(g))}}),r==="mindmap"&&h.length===0&&e("div",{class:"empty",style:{padding:24},children:[n("roadmap.emptyProject")," — ",n("roadmap.mindmapNeedsPhases")]}),r==="tree"&&e("div",{style:{display:"grid",gridTemplateColumns:"minmax(0, 1fr) 280px",gap:16,alignItems:"start"},children:[e("div",{style:{position:"relative",minWidth:0},children:h.length>0?e("div",{style:{position:"relative",paddingLeft:28},children:[e("div",{"aria-hidden":"true",style:{position:"absolute",left:8,top:4,bottom:4,width:2,background:"var(--border-subtle)"}}),(()=>{const g=h.map(()=>[]),p=[];for(const f of s){const C=h.findIndex(k=>f.created_at>=k.startIso&&f.created_at<=k.endIso);C>=0?g[C].push(f):p.push(f)}for(const f of g)f.sort((C,k)=>{const I=rt(C.type)-rt(k.type);return I!==0?I:k.created_at.localeCompare(C.created_at)});const _=h.map((f,C)=>({phase:f,entries:g[C],idx:C})).reverse();return e(ie,{children:[_.map(({phase:f,entries:C},k)=>{const I=k===0;return e("div",{style:{position:"relative",marginBottom:22},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:-28,top:4,width:14,height:14,borderRadius:"50%",background:I?"transparent":"var(--accent)",border:"2px solid var(--accent)",boxSizing:"border-box"}}),e("button",{onClick:()=>f.anchorId!==void 0&&b(f.anchorId),disabled:f.anchorId===void 0,style:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:2,padding:0,background:"transparent",border:"none",color:"inherit",cursor:f.anchorId!==void 0?"pointer":"default",fontFamily:"inherit",textAlign:"left",width:"100%"},children:[e("span",{style:{fontSize:13,fontWeight:600,color:"var(--text-0)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:"100%"},children:[f.label,I&&e("span",{style:{marginLeft:8,fontSize:10,color:"var(--accent)",fontFamily:"var(--mono)",fontWeight:500},children:n("roadmap.activePhase")})]}),e("span",{style:{fontSize:11,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[f.startIso.slice(0,10)," → ",f.endIso.slice(0,10)," · ",C.length===1?n("roadmap.entryCount",{count:1}):n("roadmap.entriesCount",{count:C.length})]})]}),e("div",{style:{marginTop:8},children:C.map((T,F)=>{const H=F===C.length-1;return e("div",{ref:y(T.id),style:{position:"relative",paddingLeft:24,paddingTop:6,paddingBottom:6},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,bottom:H?"50%":0,width:1,background:"var(--border-subtle)"}}),e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:"50%",width:18,height:1,background:"var(--border-subtle)",transform:"translateY(-50%)"}}),e(ot,{entity:T})]},T.id)})})]},`${f.startIso}-${f.label}`)}),p.length>0&&e("div",{style:{position:"relative",marginBottom:22},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:-28,top:4,width:12,height:12,borderRadius:"50%",background:"var(--text-3)",opacity:.4}}),e("div",{style:{fontSize:12,color:"var(--text-2)",fontFamily:"var(--mono)",marginBottom:8},children:n("roadmap.otherGroup",{count:p.length})}),p.map((f,C)=>{const k=C===p.length-1;return e("div",{ref:y(f.id),style:{position:"relative",paddingLeft:24,paddingTop:6,paddingBottom:6},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,bottom:k?"50%":0,width:1,background:"var(--border-subtle)"}}),e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:"50%",width:18,height:1,background:"var(--border-subtle)",transform:"translateY(-50%)"}}),e(ot,{entity:f})]},f.id)})]})]})})()]}):u.map(g=>e("div",{style:{marginBottom:18},children:[e("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:8,paddingBottom:6,borderBottom:"1px solid var(--border-subtle)"},children:[e("span",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--accent)",fontFamily:"var(--mono)"},children:g.label}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:g.entries.length})]}),g.entries.map(p=>e("div",{ref:y(p.id),style:{borderBottom:"1px solid var(--border-subtle)",padding:"12px 0"},children:e(ot,{entity:p})},p.id))]},g.key))}),e("div",{style:{display:"flex",flexDirection:"column",gap:14,position:"sticky",top:16},children:[m.length>0&&e("div",{class:"card",style:{padding:14},children:[e("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--text-2)",marginBottom:10,display:"flex",alignItems:"center",gap:4},children:[n("roadmap.milestones"),d>0&&e("span",{style:{fontSize:10,fontWeight:400,opacity:.55,textTransform:"none",letterSpacing:0},children:n("roadmap.lowSignalHidden",{count:d})})]}),m.map(g=>e("button",{onClick:()=>b(g.id),style:{display:"flex",alignItems:"flex-start",gap:8,width:"100%",textAlign:"left",padding:"6px 0",background:"transparent",border:"none",borderTop:"1px solid var(--border-subtle)",color:"inherit",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{flexShrink:0,color:"var(--accent)"},children:e(pt,{type:g.type,size:14})}),e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:12,color:"var(--text-1)",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:Ze(g)}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:2},children:Ge(g.created_at)})]})]},g.id))]}),l.length>0&&e("div",{class:"card",style:{padding:14},children:[e("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--text-2)",marginBottom:10},children:n("roadmap.keyLessons")}),l.map(g=>{const p=ft(g.access_count);return e("button",{onClick:()=>b(g.id),style:{display:"flex",alignItems:"flex-start",gap:8,width:"100%",textAlign:"left",padding:"6px 0",background:"transparent",border:"none",borderTop:"1px solid var(--border-subtle)",color:"inherit",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{flexShrink:0,color:"var(--text-2)"},children:e(pt,{type:g.type,size:14})}),e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:12,color:"var(--text-1)",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:Ze(g)}),e("div",{style:{fontSize:10,color:p.tone==="high"?"var(--accent)":"var(--text-3)",marginTop:2,fontFamily:"var(--mono)"},children:p.tone!=="none"?p.label:n("memory.access.never")})]})]},g.id)})]})]})]})]})}function Bn({projectName:t,phases:s,entities:o,onNodeClick:r}){const a=s.map(()=>[]);for(const j of o){const U=s.findIndex(V=>j.created_at>=V.startIso&&j.created_at<=V.endIso);U>=0&&a[U].push(j)}for(const j of a)j.sort((U,V)=>{const $=rt(U.type)-rt(V.type);return $!==0?$:V.created_at.localeCompare(U.created_at)});const i=6,u=a.map(j=>({shown:j.slice(0,i),extra:Math.max(0,j.length-i)})),m=900,d=600,l=m/2,h=d/2,c=170,y=230,b=30,g=j=>2*Math.PI*j/s.length-Math.PI/2,p=ne(null),[_,f]=x(1),[C,k]=x(0),[I,T]=x(0),F=ne(_),H=ne({x:C,y:I});F.current=_,H.current={x:C,y:I};const X=ne({active:!1,lastX:0,lastY:0}),[ee,pe]=x(!1),E=.25,N=4,se=(j,U)=>{const V=p.current;if(!V)return{x:0,y:0};const $=V.getBoundingClientRect();return $.width===0||$.height===0?{x:0,y:0}:{x:(j-$.left)/$.width*m,y:(U-$.top)/$.height*d}};te(()=>{const j=p.current;if(!j)return;const U=V=>{V.preventDefault();const $=F.current,L=H.current,z=Math.exp(-V.deltaY*.0015),G=Math.max(E,Math.min(N,$*z));if(G===$)return;const{x:fe,y:xe}=se(V.clientX,V.clientY),Ce=(fe-L.x)/$,Ee=(xe-L.y)/$;f(G),k(fe-Ce*G),T(xe-Ee*G)};return j.addEventListener("wheel",U,{passive:!1}),()=>j.removeEventListener("wheel",U)},[]);const Ae=j=>{let V=j.target;for(;V&&V!==p.current;){if(V.style?.cursor==="pointer")return;V=V.parentElement}j.preventDefault(),X.current.active=!0,X.current.lastX=j.clientX,X.current.lastY=j.clientY,pe(!0)},de=j=>{if(!X.current.active)return;const U=p.current;if(!U)return;const V=U.getBoundingClientRect();if(V.width===0||V.height===0)return;const $=(j.clientX-X.current.lastX)/V.width*m,L=(j.clientY-X.current.lastY)/V.height*d;X.current.lastX=j.clientX,X.current.lastY=j.clientY,k(z=>z+$),T(z=>z+L)},ue=()=>{X.current.active&&(X.current.active=!1,pe(!1))},D=()=>{f(1),k(0),T(0)};return e("div",{style:{position:"relative",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-sm)",background:"rgba(255,255,255,0.02)",overflow:"hidden",marginBottom:14},children:[e("button",{onClick:D,title:n("roadmap.resetHint"),style:{position:"absolute",top:8,right:8,zIndex:2,padding:"4px 10px",fontSize:11,fontFamily:"inherit",background:"rgba(0,0,0,0.4)",color:"var(--text-1)",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-xs)",cursor:"pointer"},children:n("graph.resetView")}),e("div",{style:{position:"absolute",bottom:8,left:12,zIndex:2,fontSize:10,fontFamily:"var(--mono)",color:"var(--text-3)",pointerEvents:"none"},children:n("roadmap.zoomHint",{pct:Math.round(_*100)})}),e("svg",{ref:p,viewBox:`0 0 ${m} ${d}`,width:"100%",style:{display:"block",minHeight:600,cursor:ee?"grabbing":"grab",userSelect:"none",touchAction:"none"},onMouseDown:Ae,onMouseMove:de,onMouseUp:ue,onMouseLeave:ue,onDblClick:D,children:e("g",{transform:`translate(${C} ${I}) scale(${_})`,children:[s.map((j,U)=>{const V=g(U),$=l+c*Math.cos(V),L=h+c*Math.sin(V);return e("path",{d:`M ${l} ${h} Q ${(l+$)/2} ${(h+L)/2-10} ${$} ${L}`,fill:"none",stroke:"rgba(0, 214, 180, 0.4)",strokeWidth:1.5},`p-${U}`)}),s.map((j,U)=>{const{shown:V}=u[U],$=g(U),L=l+c*Math.cos($),z=h+c*Math.sin($),G=Math.PI/6;return V.map((fe,xe)=>{const Ce=V.length===1?.5:xe/(V.length-1),Ee=$-G/2+G*Ce,Fe=y+b*(xe%3),Ue=l+Fe*Math.cos(Ee),Le=h+Fe*Math.sin(Ee);return e("path",{d:`M ${L} ${z} Q ${(L+Ue)/2} ${(z+Le)/2} ${Ue} ${Le}`,fill:"none",stroke:"rgba(255,255,255,0.18)",strokeWidth:1},`e-${U}-${fe.id}`)})}),e("g",{children:[e("circle",{cx:l,cy:h,r:42,fill:"rgba(0, 214, 180, 0.18)",stroke:"var(--accent)",strokeWidth:1.5}),e("text",{x:l,y:h,textAnchor:"middle",dominantBaseline:"central",fontSize:11,fontWeight:600,fill:"var(--text-0)",style:{pointerEvents:"none"},children:t.length>14?t.slice(0,12)+"…":t})]}),s.map((j,U)=>{const V=g(U),$=l+c*Math.cos(V),L=h+c*Math.sin(V),z=j.label.length>18?j.label.slice(0,16)+"…":j.label;return e("g",{role:j.anchorId!==void 0?"button":void 0,tabIndex:j.anchorId!==void 0?0:void 0,"aria-label":j.anchorId!==void 0?j.label:void 0,style:{cursor:j.anchorId!==void 0?"pointer":"default"},onClick:()=>j.anchorId!==void 0&&r(j.anchorId),onKeyDown:G=>{j.anchorId!==void 0&&(G.key==="Enter"||G.key===" ")&&(G.preventDefault(),r(j.anchorId))},children:[e("circle",{cx:$,cy:L,r:28,fill:"rgba(0, 214, 180, 0.10)",stroke:"var(--accent)",strokeWidth:1.25}),e("text",{x:$,y:L-4,textAnchor:"middle",fontSize:10,fontWeight:600,fill:"var(--text-0)",style:{pointerEvents:"none"},children:[e("tspan",{x:$,dy:0,children:z}),e("tspan",{x:$,dy:12,fontSize:9,fill:"var(--text-3)",fontWeight:400,fontFamily:"var(--mono)",children:[j.entityCount," · ",j.startIso.slice(5,10)]})]})]},`phase-${U}`)}),s.map((j,U)=>{const{shown:V,extra:$}=u[U],L=g(U),z=Math.PI/6;return e("g",{children:[V.map((G,fe)=>{const xe=V.length===1?.5:fe/(V.length-1),Ce=L-z/2+z*xe,Ee=y+b*(fe%3),Fe=l+Ee*Math.cos(Ce),Ue=h+Ee*Math.sin(Ce),Le=Ze(G),ct=Le.length>22?Le.slice(0,20)+"…":Le;return e("g",{role:"button",tabIndex:0,"aria-label":`${Le} (${Oe(G.type)})`,style:{cursor:"pointer"},onClick:()=>r(G.id),onKeyDown:A=>{(A.key==="Enter"||A.key===" ")&&(A.preventDefault(),r(G.id))},children:[e("title",{children:`${Le} (${G.type})`}),e("circle",{cx:Fe,cy:Ue,r:4,fill:"var(--text-2)"}),e("text",{x:Fe,y:Ue-8,textAnchor:Math.cos(Ce)>.2?"start":Math.cos(Ce)<-.2?"end":"middle",fontSize:9,fill:"var(--text-1)",style:{pointerEvents:"none"},children:ct})]},G.id)}),$>0&&(()=>{const G=L+z/2+.05,fe=y+b*2+10,xe=l+fe*Math.cos(G),Ce=h+fe*Math.sin(G);return e("text",{x:xe,y:Ce,textAnchor:"middle",fontSize:9,fill:"var(--text-3)",fontStyle:"italic",children:n("roadmap.moreEntities",{count:$})})})()]},`leaves-${U}`)})]})})]})}function ks(){const[t,s]=x(!1),[o,r]=x("");async function a(){r(""),s(!0);try{await J("POST","/v1/demo/seed"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(i){r(Se(i))}finally{s(!1)}}return e("div",{class:"empty",style:{padding:"32px 20px"},children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-0)",marginBottom:6},children:n("emptyLibrary.title")}),e("div",{style:{fontSize:13,lineHeight:1.55,color:"var(--text-1)",maxWidth:480,margin:"0 auto 14px"},children:n("emptyLibrary.body")}),e("button",{type:"button",class:"btn btn-primary",onClick:()=>void a(),disabled:t,style:{minWidth:160},children:n(t?"onboarding.seedingButton":"onboarding.seedButton")}),e("div",{style:{fontSize:12,color:"var(--text-3)",marginTop:8},children:n("onboarding.seedHint")}),o&&e("div",{role:"alert",style:{marginTop:10,fontSize:12,color:"var(--danger)"},children:o})]})}const Qt="memesh.browse.viewMode",Zt=30,Vs=2e3;function Re({label:t,active:s,onClick:o,count:r}){return e("button",{onClick:o,"aria-pressed":s,style:{padding:"4px 10px",borderRadius:"var(--radius)",border:"1px solid",borderColor:s?"rgba(0, 214, 180, 0.5)":"rgba(255,255,255,0.08)",background:s?"rgba(0, 214, 180, 0.15)":"transparent",color:s?"var(--accent)":"var(--text-2)",fontSize:11,cursor:"pointer",whiteSpace:"nowrap",fontFamily:"inherit"},children:[t,r!==void 0&&e("span",{style:{marginLeft:6,opacity:.6,fontFamily:"var(--mono)",fontSize:10},children:r})]})}function Gs({manage:t,health:s}){const[o,r]=x([]),[a,i]=x([]),[u,m]=x(""),[d,l]=x(!0),[h,c]=x(""),[y,b]=x(0),[g]=bs(),[p,_]=x(g?"knowledge":"all"),[f,C]=x("all"),[k,I]=x("all"),[T,F]=x("all"),[H,X]=x("most-recalled"),[ee,pe]=x(()=>{try{return localStorage.getItem(Qt)==="list"?"list":"roadmap"}catch{return"roadmap"}}),E=ne(0);async function N(){const L=++E.current;l(!0),c("");try{const[z,G]=await Promise.all([J("GET",`/v1/entities?limit=${Vs}&status=all`),Lo().catch(()=>[])]);if(L!==E.current)return;Array.isArray(z)?r(z):(console.warn("[memesh dashboard] /v1/entities answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",z),r([]),c($e("unreadable"))),i(G),b(0),window.dispatchEvent(new Event("memesh:data-changed"))}catch(z){if(L!==E.current)return;console.warn("[memesh dashboard] /v1/entities failed to load:",z),c($e(lt(z)))}finally{L===E.current&&l(!1)}}te(()=>{N()},[]),te(()=>{b(0)},[u,p,f,k,T,H]),te(()=>{(p==="knowledge"||p==="all")&&_(g?"knowledge":"all")},[g]);const se=je(()=>{const L={all:0,knowledge:0,activity:0,reference:0,session:0};for(const z of o)z.archived||z.status==="archived"||(L.all++,L[qs(z.type)]++);return L},[o]),Ae=je(()=>{const L=u.toLowerCase();return o.filter(z=>!(p!=="all"&&qs(z.type)!==p||f!=="all"&&To(z.last_accessed_at||z.created_at)!==f||k==="recalled"&&(z.access_count??0)===0||k==="never"&&(z.access_count??0)>0||T!=="all"&&it(z)!==T||L&&![z.name,z.title??"",z.type,...z.observations??[],...z.tags??[]].join(" ").toLowerCase().includes(L)))},[o,p,f,k,T,u]),de=je(()=>{const L=[...Ae];return H==="most-recalled"?L.sort((z,G)=>(G.access_count??0)-(z.access_count??0)||(G.last_accessed_at??G.created_at).localeCompare(z.last_accessed_at??z.created_at)):H==="created"?L.sort((z,G)=>G.created_at.localeCompare(z.created_at)):L.sort((z,G)=>(G.last_accessed_at??G.created_at).localeCompare(z.last_accessed_at??z.created_at)),L},[Ae,H]),ue=de.filter(L=>!L.archived&&L.status!=="archived"),D=de.filter(L=>L.archived||L.status==="archived"),j=Math.ceil(ue.length/Zt),U=ue.slice(y*Zt,(y+1)*Zt);async function V(L){if(confirm(n("browse.confirmArchive")))try{await J("POST","/v1/forget",{name:L}),N()}catch(z){c(n("browse.archiveFailed",{message:Se(z)}))}}async function $(L){try{await J("POST","/v1/remember",{name:L,type:"restored"}),N()}catch(z){c(n("browse.restoreFailed",{message:Se(z)}))}}return e("div",{children:e("div",{class:"card",children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:12},children:[e("div",{children:[e("div",{class:"card-title",style:{margin:0},children:n(t?"browse.manage":"browse.title")}),!d&&e("div",{style:{fontSize:12,color:"var(--text-3)",marginTop:2},children:[e("span",{style:{fontFamily:"var(--mono)"},children:ue.length.toLocaleString(he())})," ",n("browse.active"),D.length>0?e(ie,{children:[" · ",e("span",{style:{fontFamily:"var(--mono)"},children:D.length})," ",n("browse.archived")]}):"",o.length>=Vs&&(s?.entity_count??0)>o.length&&e("span",{children:[" · ",n("browse.truncated",{shown:o.length.toLocaleString(he()),total:s.entity_count.toLocaleString(he())})]})]})]}),e("div",{style:{display:"flex",gap:8,minWidth:0,flexShrink:1},children:[e("input",{type:"search",placeholder:n("browse.filter"),value:u,onInput:L=>m(L.target.value),style:{width:"100%",maxWidth:240,minWidth:0}}),e("button",{class:"btn btn-sm",onClick:N,title:n("browse.refresh"),children:"↻"})]})]}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:6},children:[e("span",{style:{fontSize:11,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:n("browse.filterCategory")}),e(Re,{label:n("cluster.knowledge"),active:p==="knowledge",onClick:()=>_("knowledge"),count:se.knowledge}),e(Re,{label:n("cluster.activity"),active:p==="activity",onClick:()=>_("activity"),count:se.activity}),e(Re,{label:n("cluster.session"),active:p==="session",onClick:()=>_("session"),count:se.session}),e(Re,{label:n("cluster.reference"),active:p==="reference",onClick:()=>_("reference"),count:se.reference}),e(Re,{label:n("cluster.all"),active:p==="all",onClick:()=>_("all"),count:se.all})]}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:6},children:[e("span",{style:{fontSize:11,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:n("browse.filterTime")}),e(Re,{label:n("browse.timeToday"),active:f==="today",onClick:()=>C(f==="today"?"all":"today")}),e(Re,{label:n("browse.timeWeek"),active:f==="week",onClick:()=>C(f==="week"?"all":"week")}),e(Re,{label:n("browse.timeMonth"),active:f==="month",onClick:()=>C(f==="month"?"all":"month")}),e(Re,{label:n("browse.timeOlder"),active:f==="older",onClick:()=>C(f==="older"?"all":"older")}),e("span",{style:{width:1,background:"var(--border-subtle)",margin:"0 6px"}}),e("span",{style:{fontSize:11,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:n("browse.filterValue")}),e(Re,{label:n("browse.valueRecalled"),active:k==="recalled",onClick:()=>I(k==="recalled"?"all":"recalled")}),e(Re,{label:n("browse.valueNever"),active:k==="never",onClick:()=>I(k==="never"?"all":"never")})]}),a.length>0&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:6},children:[e("span",{style:{fontSize:11,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:n("browse.filterProject")}),e(Re,{label:n("cluster.all"),active:T==="all",onClick:()=>F("all")}),a.map(L=>e(Re,{label:L.name,count:L.count,active:T===L.name,onClick:()=>F(L.name)},L.name))]}),e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:14,paddingBottom:12,borderBottom:"1px solid var(--border-subtle)"},children:[e("span",{style:{fontSize:11,color:"var(--text-3)"},children:n("browse.filterSort")}),e("select",{value:H,onChange:L=>X(L.target.value),style:{padding:"3px 8px",fontSize:12},children:[e("option",{value:"most-recalled",children:n("browse.sortMostRecalled")}),e("option",{value:"recent",children:n("browse.sortRecent")}),e("option",{value:"created",children:n("browse.sortCreated")})]})]}),h&&e("div",{class:"error-box",role:"alert",style:{marginBottom:12},children:h}),d&&e("div",{class:"empty",children:e("div",{class:"loading"})}),!d&&T!=="all"&&ee==="roadmap"&&!t&&e(Fn,{projectName:T,entities:ue,onSwitchToList:()=>{pe("list");try{localStorage.setItem(Qt,"list")}catch{}}}),!d&&!h&&(T==="all"||ee==="list"||t)&&o.length===0&&e(ks,{}),!d&&(T==="all"||ee==="list"||t)&&o.length>0&&ue.length===0&&e("div",{class:"empty",children:[e("span",{class:"empty-icon",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",color:"var(--text-3)"},children:e("svg",{width:"32",height:"32",viewBox:"0 0 16 16","aria-hidden":"true",children:[e("path",{d:"M2 9 L4 4 H12 L14 9 V13 H2 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"}),e("path",{d:"M2 9 H6 a2 2 0 0 0 4 0 H14",stroke:"currentColor",strokeWidth:"1.5",fill:"none"})]})}),u?`${n("browse.noMatch")} "${u}"`:n("browse.emptyFilter")]}),!d&&(T==="all"||ee==="list"||t)&&U.length>0&&e("div",{children:[T!=="all"&&ee==="list"&&!t&&e("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:8},children:e("button",{class:"btn btn-sm",onClick:()=>{pe("roadmap");try{localStorage.setItem(Qt,"roadmap")}catch{}},children:n("roadmap.switchToRoadmap")})}),U.map(L=>e("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"14px 0"},children:e(ot,{entity:L,highlight:u,actions:t?e("button",{class:"btn btn-danger btn-sm",onClick:()=>V(L.name),children:n("browse.archive")}):void 0})},L.id)),j>1&&e("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:12,padding:"16px 0",fontSize:13},children:[e("button",{class:"btn btn-sm",disabled:y===0,onClick:()=>b(L=>L-1),children:n("browse.prev")}),e("span",{style:{color:"var(--text-3)",fontFamily:"var(--mono)",fontSize:12},children:[y+1," / ",j]}),e("button",{class:"btn btn-sm",disabled:y>=j-1,onClick:()=>b(L=>L+1),children:n("browse.next")})]})]}),!d&&D.length>0&&t&&e("div",{style:{marginTop:20},children:[e("div",{style:{fontSize:11,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8,paddingBottom:8,borderBottom:"1px solid var(--border)"},children:[n("browse.archived")," (",D.length,")"]}),D.slice(0,10).map(L=>e("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"14px 0"},children:e(ot,{entity:L,highlight:u,actions:e("button",{class:"btn btn-sm",onClick:()=>$(L.name),children:n("browse.restore")})})},L.id)),D.length>10&&e("div",{style:{fontSize:12,color:"var(--text-3)",padding:"12px 0",textAlign:"center"},children:["+",D.length-10," ",n("browse.moreArchived")]})]})]})})}function $s(t){return t>=80?"var(--success)":t>=60?"var(--accent)":t>=40?"var(--warning)":"var(--danger)"}function qn(t){return t>=80?n("health.excellent"):t>=60?n("health.good"):t>=40?n("health.fair"):n("health.poor")}const Un=["activity","quality","freshness","lessons"];function Wn({score:t,factors:s}){const o=$s(t);return e("div",{class:"card",children:[e("div",{class:"card-title",children:n("health.title")}),e("div",{style:{display:"flex",gap:"24px",alignItems:"center"},children:[e("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",flexShrink:0},children:[e("div",{style:{width:"80px",height:"80px",borderRadius:"50%",border:`3px solid ${o}`,display:"flex",alignItems:"center",justifyContent:"center"},children:e("span",{style:{fontFamily:"var(--mono)",fontSize:"24px",fontWeight:700,color:o,letterSpacing:"-0.02em"},children:t})}),e("span",{style:{marginTop:"6px",fontSize:"11px",fontWeight:500,color:"var(--text-2)"},children:qn(t)})]}),e("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:"10px"},children:Un.map(r=>{const a=s[r],i=Math.round(a.score/a.weight*100),u=$s(i);return e("div",{children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"4px"},children:[e("span",{style:{fontSize:"12px",color:"var(--text-2)"},children:n(`health.${r}`)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:"11px",color:"var(--text-3)"},children:[i,"%"]})]}),e("div",{style:{height:"4px",borderRadius:"2px",background:"var(--bg-0)",overflow:"hidden"},children:e("div",{style:{height:"100%",width:`${i}%`,borderRadius:"2px",background:u,transition:"width 600ms ease-out"}})})]},r)})})]})]})}const tt=220,Ie=36,De=2;function Kn({trend:t}){if(!t||t.length===0)return e("svg",{width:tt,height:Ie,style:{display:"block"},children:e("line",{x1:0,y1:Ie/2,x2:tt,y2:Ie/2,stroke:"rgba(255,255,255,0.06)",strokeWidth:1})});if(t.length===1){const u=tt/2,m=Ie/2;return e("svg",{width:tt,height:Ie,style:{display:"block"},children:[e("line",{x1:De,y1:Ie-De,x2:tt-De,y2:Ie-De,stroke:"rgba(255,255,255,0.06)",strokeWidth:1}),e("circle",{cx:u,cy:m,r:3,fill:"var(--accent)"})]})}const s=Math.max(1,...t.map(u=>u.count)),o=(tt-De*2)/(t.length-1),r=t.map((u,m)=>{const d=De+m*o,l=Ie-De-u.count/s*(Ie-De*2);return`${d.toFixed(1)},${l.toFixed(1)}`}),a=`M${r[0]} L${r.slice(1).join(" L")}`,i=`${a} L${De+(t.length-1)*o},${Ie-De} L${De},${Ie-De} Z`;return e("svg",{width:tt,height:Ie,style:{display:"block"},children:[e("path",{d:i,fill:"rgba(0, 214, 180, 0.12)"}),e("path",{d:a,fill:"none",stroke:"var(--accent)",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"}),t.map((u,m)=>{const[d,l]=r[m].split(",");return m===t.length-1?e("circle",{cx:d,cy:l,r:2.5,fill:"var(--accent)"},m):null})]})}function Vn({metric:t}){const{reusedThisWeek:s,trend:o,computedFrom:r}=t,a=r==="last_accessed_at_approximation",i=o.slice(0,Math.max(0,o.length-7)).slice(-7).reduce((d,l)=>d+l.count,0),u=o.slice(-7).reduce((d,l)=>d+l.count,0),m=i>0?Math.round((u-i)/i*100):null;return e("div",{class:"card",style:{display:"flex",gap:24,alignItems:"center",flexWrap:"wrap",padding:"20px 24px",background:"var(--accent-soft)",border:"1px solid rgba(0, 214, 180, 0.18)"},children:[e("div",{style:{flex:"1 1 200px",minWidth:200},children:[e("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.08em",color:"var(--text-2)",fontWeight:600,marginBottom:6},children:n("loop.label")}),e("div",{style:{display:"flex",alignItems:"baseline",gap:12},children:[e("div",{style:{fontSize:84,fontWeight:700,lineHeight:1,color:s>0?"var(--accent)":"var(--text-2)",fontFamily:"var(--font)",letterSpacing:"-0.03em"},children:s>0?s.toLocaleString(he()):"—"}),m!==null&&m!==0&&e("span",{style:{fontSize:12,fontWeight:600,fontFamily:"var(--mono)",color:m>0?"var(--success)":"var(--danger)"},children:[m>0?"↑":"↓"," ",Math.abs(m),"%"]})]}),e("div",{style:{fontSize:13,color:"var(--text-1)",marginTop:4},children:s>0?n("loop.subtitleHas"):n("loop.subtitleNone")}),a&&e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:6,fontStyle:"italic"},children:n("loop.approxNote")})]}),e("div",{style:{flex:"0 0 auto",display:"flex",flexDirection:"column",alignItems:"flex-end",gap:4},children:[e(Kn,{trend:o}),e("div",{style:{fontSize:10,color:"var(--text-3)",fontFamily:"var(--mono)"},children:n("loop.sparkLabel")})]})]})}function Po(t,s){const o=getComputedStyle(t),r={};for(const a of s)r[a]=o.getPropertyValue(a).trim();return r}function es(t,s){const o=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(t.trim());if(!o)return t;const r=parseInt(o[1],16),a=parseInt(o[2],16),i=parseInt(o[3],16);return`rgba(${r}, ${a}, ${i}, ${s})`}const Ct=8,Gn=8,$n=20,St=8,Ro=120,jo="rgba(0, 214, 180, 0.3)",Yn=1.5;function Ys(t,s){t.style.width="";const o=window.devicePixelRatio||1,a=t.getBoundingClientRect().width,i=Ro,u=a-St-Gn,m=i-Ct-$n;if(s.length===0||u<=0||m<=0)return;t.width=a*o,t.height=i*o,t.style.width=`${a}px`,t.style.height=`${i}px`;const d=t.getContext("2d");if(!d)return;d.scale(o,o);const l=Po(t,["--accent","--text-3","--font"]),h=l["--accent"],c=l["--text-3"],y=`9px ${l["--font"]}`,b=Math.max(1,...s.map(k=>k.created)),g=Math.max(1,...s.map(k=>k.recalled)),p=Math.max(b,g),_=s.length,f=1,C=Math.max(1,(u-f*(_-1))/_);d.fillStyle=jo;for(let k=0;k<_;k++){const T=s[k].created/p*m,F=St+k*(C+f),H=Ct+m-T;d.fillRect(F,H,C,T)}d.beginPath(),d.strokeStyle=h,d.lineWidth=Yn,d.lineJoin="round",d.lineCap="round";for(let k=0;k<_;k++){const I=s[k],T=St+k*(C+f)+C/2,F=Ct+m-I.recalled/p*m;k===0?d.moveTo(T,F):d.lineTo(T,F)}d.stroke(),d.fillStyle=c,d.font=y,d.textAlign="center",d.textBaseline="top";for(let k=0;k<_;k+=7){const I=s[k],T=I.date.split("-"),F=T.length>=3?`${T[1]}-${T[2]}`:I.date,H=St+k*(C+f)+C/2,X=Ct+m+4;d.fillText(F,H,X)}}function Xn({data:t}){const s=ne(null);te(()=>{const a=s.current;if(!a)return;Ys(a,t);const i=new ResizeObserver(()=>Ys(a,t));return i.observe(a),()=>i.disconnect()},[t]);const o=t.reduce((a,i)=>a+i.created,0),r=t.reduce((a,i)=>a+i.recalled,0);return e("div",{class:"card",children:[e("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:14},children:[e("div",{class:"card-title",style:{marginBottom:0},children:n("timeline.title")}),e("div",{style:{display:"flex",alignItems:"center",gap:12,fontSize:11,color:"var(--text-2)"},children:[e("span",{style:{display:"flex",alignItems:"center",gap:4},children:[e("span",{style:{display:"inline-block",width:10,height:10,borderRadius:"var(--radius-hairline)",background:jo}}),n("timeline.created"),e("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:o})]}),e("span",{style:{display:"flex",alignItems:"center",gap:4},children:[e("span",{style:{display:"inline-block",width:10,height:2,borderRadius:"var(--radius-hairline)",background:"var(--accent)"}}),n("timeline.recalled"),e("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:r})]})]})]}),e("canvas",{ref:s,style:{width:"100%",height:`${Ro}px`,display:"block"}})]})}const ts=["week","month","quarter","older"];function Jn(t){return n(`ageMatrix.bucket.${t}`)}const Qn=["lesson_learned","lesson","mistake","decision","architecture_decision","pattern","technical_pattern","best_practice","bug_fix","workflow_checkpoint","process","architecture","feature"];function Zn(t,s){return t===0||s===0?"rgba(255,255,255,0.03)":`rgba(0, 214, 180, ${(.12+Math.min(t/s,1)*.55).toFixed(2)})`}function ea({data:t}){if(!t||t.length===0)return null;const s=new Map;for(const a of t)s.has(a.type)||s.set(a.type,new Map),s.get(a.type).set(a.bucket,a.count);const o=Qn.filter(a=>s.has(a)),r=Math.max(1,...t.map(a=>a.count));return e("div",{class:"card",children:[e("div",{class:"card-title",style:{marginBottom:16},children:n("ageMatrix.title")}),e("div",{style:{overflowX:"auto"},children:e("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:12,tableLayout:"fixed"},children:[e("colgroup",{children:[e("col",{style:{width:"28%"}}),ts.map(a=>e("col",{style:{width:"18%"}},a))]}),e("thead",{children:e("tr",{children:[e("th",{style:{textAlign:"left",padding:"4px 8px",color:"var(--text-2)",fontWeight:400},children:n("ageMatrix.typeColumn")}),ts.map(a=>e("th",{style:{textAlign:"center",padding:"4px 6px",color:"var(--text-2)",fontWeight:400},children:Jn(a)},a))]})}),e("tbody",{children:o.map(a=>{const i=s.get(a),u=Array.from(i.values()).reduce((m,d)=>m+d,0);return e("tr",{children:[e("td",{style:{padding:"5px 8px",color:"var(--text-1)",fontSize:11,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:[Oe(a),e("span",{style:{color:"var(--text-3)",marginLeft:4},children:["(",u,")"]})]}),ts.map(m=>{const d=i.get(m)??0;return e("td",{style:{textAlign:"center",padding:"5px 6px",background:Zn(d,r),borderRadius:"var(--radius-xs)",color:d>0?"var(--accent)":"var(--text-3)",fontFamily:"var(--mono)",fontWeight:d>0?600:400,fontSize:11,transition:"background 0.2s"},children:d>0?d:"·"},m)})]},a)})})]})}),e("div",{style:{marginTop:10,fontSize:11,color:"var(--text-3)",display:"flex",alignItems:"center",gap:6},children:[e("span",{children:n("ageMatrix.low")}),[.15,.35,.55,.7].map(a=>e("span",{style:{display:"inline-block",width:14,height:10,borderRadius:"var(--radius-hairline)",background:`rgba(0,214,180,${a})`}},a)),e("span",{children:n("ageMatrix.high")}),e("span",{style:{marginLeft:8},children:["— ",n("ageMatrix.legend")]})]})]})}function Xs(t){return n(`radar.axis.${t}`)}const st=220,zo=st/2,Io=st/2,At=80,Et=14,ss=48;function Lt(t,s){const o=(t-90)*(Math.PI/180);return[zo+s*Math.cos(o),Io+s*Math.sin(o)]}function ta({data:t}){if(!t||t.length===0)return null;const s=t.length,o=Math.max(1,...t.map(m=>m.count)),r=t.map((m,d)=>360/s*d),a=t.map((m,d)=>{const l=m.count/o,h=Et+l*(At-Et);return Lt(r[d],h)}),i=a.map((m,d)=>`${d===0?"M":"L"}${m[0].toFixed(1)},${m[1].toFixed(1)}`).join(" ")+" Z",u=[.25,.5,.75,1];return e("div",{class:"card",children:[e("div",{class:"card-title",style:{marginBottom:8},children:n("radar.title")}),e("div",{style:{display:"flex",alignItems:"center",gap:16,flexWrap:"wrap"},children:[e("svg",{width:st+ss*2,height:st,viewBox:`${-ss} 0 ${st+ss*2} ${st}`,style:{flexShrink:0},children:[u.map(m=>{const d=r.map(l=>{const h=Et+m*(At-Et),[c,y]=Lt(l,h);return`${c.toFixed(1)},${y.toFixed(1)}`});return e("polygon",{points:d.join(" "),fill:"none",stroke:"rgba(255,255,255,0.06)",strokeWidth:1},m)}),r.map((m,d)=>{const[l,h]=Lt(m,At);return e("line",{x1:zo,y1:Io,x2:l.toFixed(1),y2:h.toFixed(1),stroke:"rgba(255,255,255,0.06)",strokeWidth:1},d)}),e("path",{d:i,fill:"rgba(0,214,180,0.15)",stroke:"var(--accent)",strokeWidth:1.5,strokeLinejoin:"round"}),a.map(([m,d],l)=>e("circle",{cx:m.toFixed(1),cy:d.toFixed(1),r:3,fill:"var(--accent)"},l)),t.map((m,d)=>{const l=r[d],[h,c]=Lt(l,At+18),y=Xs(m.axis);return e("text",{x:h.toFixed(1),y:c.toFixed(1),textAnchor:"middle",dominantBaseline:"middle",fontSize:9,fill:"var(--text-2)",fontFamily:"var(--font)",children:y},d)})]}),e("div",{style:{flex:1,minWidth:120},children:[t.map(m=>{const d=o>0?m.count/o:0;return e("div",{style:{marginBottom:8},children:[e("div",{style:{display:"flex",justifyContent:"space-between",fontSize:11,marginBottom:3},children:[e("span",{style:{color:"var(--text-1)"},children:Xs(m.axis)}),e("span",{style:{color:"var(--accent)",fontFamily:"var(--mono)",fontSize:10},children:m.count})]}),e("div",{style:{height:3,background:"rgba(255,255,255,0.06)",borderRadius:"var(--radius-hairline)",overflow:"hidden"},children:e("div",{style:{width:`${(d*100).toFixed(1)}%`,height:"100%",background:"var(--accent)",borderRadius:"var(--radius-hairline)",transition:"width 0.3s"}})})]},m.axis)}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:6},children:n("radar.caption")})]})]})]})}function sa({data:t}){const{workSchedule:s,toolPreferences:o,focusAreas:r,workflow:a,strengths:i,learningAreas:u}=t,m=new Map;for(const c of s.hourDistribution)m.set(c.hour,c.count);const d=Math.max(1,...s.hourDistribution.map(c=>c.count)),l=[...s.hourDistribution].sort((c,y)=>y.count-c.count).slice(0,3).map(c=>`${c.hour.toString().padStart(2,"0")}:00`),h=[...s.dayDistribution].sort((c,y)=>y.count-c.count).slice(0,2).map(c=>n(`patterns.day.${c.dayNum}`));return e("div",{class:"card",children:[e("div",{class:"card-title",children:n("patterns.title")}),e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:n("patterns.workSchedule")}),e("div",{style:{display:"flex",gap:2,flexWrap:"wrap"},children:Array.from({length:24},(c,y)=>{const b=m.get(y)||0,g=b/d;return e("div",{title:`${y.toString().padStart(2,"0")}:00 — ${b}`,style:{width:18,height:18,borderRadius:"var(--radius-xs)",background:g>0?`rgba(0, 214, 180, ${.1+g*.7})`:"var(--bg-0)",border:"1px solid var(--border-subtle)",fontSize:9,display:"flex",alignItems:"center",justifyContent:"center",color:g>.5?"var(--bg-0)":"var(--text-3)",fontFamily:"var(--mono)"},children:y},y)})}),e("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:6,fontFamily:"var(--mono)"},children:[n("patterns.peakHours"),": ",l.join(", "),h.length>0&&e("span",{children:[" · ",n("patterns.busiestDays"),": ",h.join(", ")]})]})]}),o.length>0&&e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:n("patterns.tools")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:o.slice(0,10).map(c=>e("span",{class:"tag",style:{fontSize:11,padding:"2px 8px"},children:[c.tool," ",e("span",{style:{opacity:.5},children:["(",c.sessions,")"]})]},c.tool))})]}),e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:n("patterns.workflow")}),e("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:8},children:[e("div",{class:"stat",style:{padding:12},children:[e("div",{class:"stat-val",style:{fontSize:18},children:a.avgSessionMinutes>0?`${Math.round(a.avgSessionMinutes)}m`:"—"}),e("div",{class:"stat-lbl",children:n("patterns.avgSession")})]}),e("div",{class:"stat",style:{padding:12},children:[e("div",{class:"stat-val",style:{fontSize:18},children:a.totalSessions>0?a.commitsPerSession.toFixed(1):"—"}),e("div",{class:"stat-lbl",children:n("patterns.commitsPerSession")})]})]})]}),r.length>0&&e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:n("patterns.focus")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:r.slice(0,12).map(c=>e("span",{class:"tag",style:{fontSize:11,padding:"2px 8px"},children:[Oe(c.type)," ",e("span",{style:{opacity:.5},children:["(",c.count,")"]})]},c.type))})]}),(i.length>0||u.length>0)&&e("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12},children:[e("div",{children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:n("patterns.strengths")}),i.slice(0,5).map(c=>e("div",{style:{marginBottom:6},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:3},children:[e("span",{style:{fontSize:12,color:"var(--text-1)"},children:Oe(c.type)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:11,color:"var(--accent)"},children:[Math.round(c.avgConfidence*100),"%"]})]}),e("div",{style:{height:3,borderRadius:"var(--radius-hairline)",background:"var(--bg-0)"},children:e("div",{style:{height:"100%",width:`${Math.round(c.avgConfidence*100)}%`,borderRadius:"var(--radius-hairline)",background:"rgba(0, 214, 180, 0.5)",transition:"width 600ms ease-out"}})})]},c.type)),i.length===0&&e("div",{style:{fontSize:11,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]}),e("div",{children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:n("patterns.learning")}),u.slice(0,5).map(c=>e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:6,fontSize:12},children:[e("span",{style:{color:"var(--text-1)"},children:c.tag}),e("span",{style:{fontFamily:"var(--mono)",fontSize:11,color:"var(--text-3)"},children:c.count})]},c.tag)),u.length===0&&e("div",{style:{fontSize:11,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]})]})]})}function oa(t){const s=`telemetry.flow.${t}`,o=n(s);return o===s?t:o}function na(t){const s=`telemetry.errorClass.${t}`,o=n(s);return o===s?t:o}function Js(t){return`${Math.round(t*100)}%`}function aa(t){return t==null?"—":t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`}function ra(){const[t,s]=x(null),[o,r]=x(null),[a,i]=x(!0),[u,m]=x(30);return te(()=>{let d=!1;return i(!0),J("GET",`/v1/telemetry?window=${u}`).then(l=>{if(!d){if(!Array.isArray(l?.summaries)){console.warn("[memesh dashboard] /v1/telemetry answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",l),r("unreadable"),s(null);return}r(null),s(l)}}).catch(l=>{d||(console.warn("[memesh dashboard] /v1/telemetry failed to load:",l),r(lt(l)))}).finally(()=>{d||i(!1)}),()=>{d=!0}},[u]),e("div",{class:"card",style:{padding:16},children:[e("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",marginBottom:8,flexWrap:"wrap",gap:8},children:[e("span",{class:"card-title",style:{margin:0},children:n("telemetry.title")}),e("div",{style:{display:"flex",gap:4,fontSize:12},children:[7,30,90].map(d=>e("button",{class:"btn btn-ghost",style:{padding:"2px 8px",fontSize:11,border:"1px solid "+(u===d?"var(--accent)":"var(--border)"),color:u===d?"var(--accent)":"var(--text-2)",background:u===d?"rgba(0,214,180,0.10)":"transparent"},onClick:()=>m(d),children:n("telemetry.lastNDays",{n:d})},d))})]}),a&&e("div",{style:{color:"var(--text-3)",fontSize:13},children:n("telemetry.loading")}),!a&&o&&e("div",{class:"error-box",role:"alert",style:{fontSize:13},children:$e(o)}),!a&&!o&&t&&t.summaries.length===0&&e("div",{style:{color:"var(--text-2)",fontSize:13,padding:8},children:n("telemetry.empty")}),!a&&!o&&t&&t.summaries.length>0&&e("div",{style:{display:"flex",flexDirection:"column",gap:12},children:t.summaries.map(d=>{const l=d.total_attempts>0?d.successes/d.total_attempts:0,h=d.total_calls>0?d.fallback_used/d.total_calls:0,c=Object.entries(d.by_provider),y=Object.entries(d.by_model),b=Object.entries(d.by_project),g=Object.entries(d.by_error_class).sort((p,_)=>_[1]-p[1]);return e("div",{style:{padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",borderLeft:`2px solid ${l>=.9?"var(--accent)":l>=.5?"var(--warning)":"var(--danger)"}`},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"baseline",marginBottom:6},children:[e("span",{style:{fontWeight:600},children:oa(d.flow)}),e("span",{style:{fontSize:12,color:"var(--text-3)"},children:[n("telemetry.callsCount",{n:d.total_calls})," · ",n("telemetry.attemptsCount",{n:d.total_attempts})]})]}),e("div",{style:{display:"flex",gap:16,flexWrap:"wrap",fontSize:13,marginBottom:6},children:[e("span",{children:[e("span",{style:{color:"var(--text-3)"},children:[n("telemetry.successRate"),": "]}),e("strong",{style:{color:l>=.9?"var(--accent)":l>=.5?"var(--warning)":"var(--danger)"},children:Js(l)})]}),e("span",{children:[e("span",{style:{color:"var(--text-3)"},children:[n("telemetry.medianLatency"),": "]}),e("strong",{children:aa(d.median_latency_ms)})]}),d.fallback_used>0&&e("span",{style:{color:"var(--warning)"},children:["⚠️ ",n("telemetry.fallbackUsed",{n:d.fallback_used,pct:Js(h)})]})]}),c.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[n("telemetry.byProvider"),":"," ",c.map(([p,_])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[p," ",_.ok,"/",_.ok+_.fail]},p))]}),y.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[n("telemetry.byModel"),":"," ",y.map(([p,_])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[p," ",_.ok,"/",_.ok+_.fail]},p))]}),b.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[n("telemetry.byProject"),":"," ",b.map(([p,_])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[p," ",_.ok,"/",_.ok+_.fail]},p))]}),g.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)"},children:[n("telemetry.errors"),":"," ",g.map(([p,_])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11,background:p==="auth"?"var(--danger-soft)":"var(--warning-soft)",color:p==="auth"?"var(--danger)":"var(--warning)"},children:[na(p)," ×",_]},p))]})]},d.flow)})})]})}function Qs(t){return typeof t?.velocity?.decisionsPerWeek=="number"&&typeof t.staleness?.openDecisionCount=="number"&&typeof t.staleness?.stalePlanCount=="number"&&typeof t.connectedness?.orphanRate=="number"&&typeof t.connectedness?.totalRelations=="number"}function ia(){const[t,s]=x(null),[o,r]=x(null);if(te(()=>{J("GET","/v1/analytics/pm").then(u=>{u!==null&&!Qs(u)&&console.warn("[PmAnalyticsPanel] /v1/analytics/pm answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",u),s(u)}).catch(u=>r(String(u)))},[]),o)return console.warn("[PmAnalyticsPanel]",o),null;if(!Qs(t))return null;const a=(t.connectedness.orphanRate*100).toFixed(1),i=t.connectedness.orphanRate>.7?"var(--danger)":t.connectedness.orphanRate>.4?"var(--warning)":"var(--success)";return e("div",{class:"card",style:{marginTop:8,padding:16},children:[e("div",{class:"card-title",style:{marginBottom:12},children:n("pm.title")}),e("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, 1fr)",gap:12},children:[e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)"},children:t.velocity.decisionsPerWeek.toFixed(1)}),e("div",{style:{fontSize:11,color:"var(--text-2)",marginTop:2},children:n("pm.decisionsPerWeek")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)"},children:t.staleness.openDecisionCount}),e("div",{style:{fontSize:11,color:"var(--text-2)",marginTop:2},children:n("pm.openDecisions")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)",color:i},children:[a,"%"]}),e("div",{style:{fontSize:11,color:"var(--text-2)",marginTop:2},children:n("pm.orphanRate")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)"},children:t.connectedness.totalRelations}),e("div",{style:{fontSize:11,color:"var(--text-2)",marginTop:2},children:n("pm.relationsTotal")})]})]}),t.staleness.stalePlanCount>0&&e("div",{style:{marginTop:10,fontSize:12,color:"var(--warning)"},children:n("pm.stalePlans",{count:t.staleness.stalePlanCount})})]})}const la=["activity","quality","freshness","lessons"];function ca(t){return typeof t?.totalEntities=="number"&&typeof t.totalObservations=="number"&&typeof t.totalRelations=="number"&&typeof t.totalTags=="number"&&Array.isArray(t.tagDistribution)}function os(t,s,o){return!o&&s!==null&&console.warn(`[memesh dashboard] ${t} answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:`,s),o}function da(t){if(typeof t?.healthScore!="number")return!1;const s=t.healthFactors;if(!s)return!1;for(const o of la)if(typeof s[o]?.score!="number"||typeof s[o]?.weight!="number")return!1;return Array.isArray(t.loopMetric?.trend)&&Array.isArray(t.timeline)}function ma(t){return Array.isArray(t?.workSchedule?.hourDistribution)&&Array.isArray(t.workSchedule?.dayDistribution)&&Array.isArray(t.toolPreferences)&&Array.isArray(t.focusAreas)&&Array.isArray(t.strengths)&&Array.isArray(t.learningAreas)&&typeof t.workflow?.avgSessionMinutes=="number"&&typeof t.workflow?.totalSessions=="number"&&typeof t.workflow?.commitsPerSession=="number"}function ua(){const[t,s]=x(null),[o,r]=x(null),[a,i]=x(null),[u,m]=x(!0),[d,l]=x(null),h=Me(()=>{m(!0);let c=!1,y=!1;const b=g=>p=>(console.warn(`[memesh dashboard] ${g} failed to load:`,p),lt(p)==="unreachable"?c=!0:y=!0,null);Promise.all([J("GET","/v1/stats").catch(b("/v1/stats")),J("GET","/v1/analytics").catch(b("/v1/analytics")),J("GET","/v1/patterns").catch(b("/v1/patterns"))]).then(([g,p,_])=>{const f=os("/v1/stats",g,ca(g)),C=os("/v1/analytics",p,da(p)),k=os("/v1/patterns",_,ma(_));(g!==null&&!f||p!==null&&!C||_!==null&&!k)&&(y=!0),s(f?g:null),r(C?p:null),i(k?_:null),l(c?"unreachable":y?"unreadable":null)}).finally(()=>m(!1))},[]);return te(()=>{h()},[h]),u?e("div",{class:"empty",children:e("div",{class:"loading"})}):!t&&!o?e("div",{class:"error-box",role:"alert",children:d?$e(d):`${n("common.error")}: ${n("analytics.loadFailed")}`}):e("div",{children:[t&&e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalEntities.toLocaleString(he())}),e("div",{class:"stat-lbl",children:n("analytics.totalMemories")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalObservations.toLocaleString(he())}),e("div",{class:"stat-lbl",children:n("analytics.knowledgeFacts")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalRelations.toLocaleString(he())}),e("div",{class:"stat-lbl",children:n("analytics.connections")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalTags.toLocaleString(he())}),e("div",{class:"stat-lbl",children:n("analytics.topics")})]})]}),o&&e("div",{style:{marginTop:8},children:e(Vn,{metric:o.loopMetric})}),o&&e("div",{style:{marginTop:8},children:e(Wn,{score:o.healthScore,factors:o.healthFactors})}),o&&e("div",{style:{marginTop:8},children:e(Xn,{data:o.timeline})}),o&&e("div",{style:{marginTop:8,display:"grid",gridTemplateColumns:"minmax(0, 1.4fr) minmax(0, 1fr)",gap:8},children:[e(ea,{data:Array.isArray(o.ageMatrix)?o.ageMatrix:[]}),e(ta,{data:Array.isArray(o.knowledgeRadar)?o.knowledgeRadar:[]})]}),a&&e("div",{style:{marginTop:8},children:e(sa,{data:a})}),e("div",{style:{marginTop:8},children:e(ra,{})}),e(ia,{}),t&&(()=>{const c=["auto_saved","auto-tracked","session_end","session:","source:","scope:","date:","urgency:"],y=t.tagDistribution.filter(b=>!c.some(g=>b.tag.startsWith(g))&&!/^\d{4}-\d{2}-\d{2}/.test(b.tag));return y.length>0?e("div",{class:"card",style:{marginTop:8},children:[e("div",{class:"card-title",children:n("analytics.topics")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:y.slice(0,30).map(b=>e("span",{class:"tag",style:{fontSize:Math.max(11,Math.min(15,10+Math.log2(b.count+1)))+"px"},children:[b.tag," ",e("span",{style:{opacity:.5},children:["(",b.count,")"]})]},b.tag))})]}):null})()]})}const ha=[["ollama","Ollama (Local)"],["openai","OpenAI"],["anthropic","Anthropic (Claude)"]];function ga(t){const s={provider:t.provider};return t.model.trim()&&(s.model=t.model.trim()),t.provider!=="ollama"&&(t.apiKey.trim()?s.apiKey=t.apiKey.trim():t.hasStoredKey&&t.originalIndex!==null&&(s.keepKeyFrom=t.originalIndex)),s}function pa(t){return typeof t?.config=="object"&&t.config!==null}function fa(t){return typeof t?.checkSucceeded=="boolean"&&typeof t.freshness=="string"&&typeof t.updateAvailable=="boolean"}function Zs(t){return t&&t.charAt(0).toUpperCase()+t.slice(1)}function eo(t){if(t.errorCode){const s=/^http_(\d+)$/.exec(t.errorCode),o=s?"settings.testError.http":`settings.testError.${t.errorCode}`,r=s?n(o,{status:s[1]}):n(o);if(r!==o)return t.error?`${r} — ${t.error}`:r}return t.error||n("settings.testFailed")}function to(t,s){if(!s)return"—";const o=new Date(s);return Number.isNaN(o.getTime())?s:o.toLocaleString(t)}function ya(t){switch(t){case"npm-global":return n("settings.installNpmGlobal");case"npm-local":return n("settings.installNpmLocal");case"source-checkout":return n("settings.installSourceCheckout");default:return n("settings.installUnknown")}}function ba(t){switch(t){case"npm-global":return n("settings.updateGuidanceNpmGlobal");case"npm-local":return n("settings.updateGuidanceNpmLocal");case"source-checkout":return n("settings.updateGuidanceSourceCheckout");default:return n("settings.updateGuidanceUnknown")}}function va({locale:t,onLocaleChange:s}){const[o,r]=x(null),[a,i]=x(null),[u,m]=x(""),[d,l]=x(""),[h,c]=x(""),[y,b]=x(""),[g,p]=x(""),[_,f]=x(!1),[C,k]=x(!1),[I,T]=x(""),[F,H]=x(null),[X,ee]=x(!1),[pe,E]=x(!0),[N,se]=x(!0),[Ae,de]=x(!1),[ue,D]=x([]),[j,U]=x([]),[V,$]=x(null),[L,z]=x(!1),[G,fe]=x("");async function xe(M=!0,P=!1){P?de(!0):se(!0);try{const v=await J("GET",M?"/v1/update-status":"/v1/update-status?cached=1");if(!fa(v)){console.warn("[memesh dashboard] /v1/update-status answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",v),P||i(null);return}i(v)}catch{P||i(null)}finally{P?de(!1):se(!1)}}te(()=>{let M=!1;return J("GET","/v1/config").then(P=>{if(!pa(P)){P!==null&&console.warn("[memesh dashboard] /v1/config answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",P),r(null);return}r(P);const q=P.config.llm?.provider||"",v=P.config.llm?.model||"";m(q),c(v),b(q),p(v),f(!!P.config.llm?.apiKey);const R=(P.config.llmFallbacks??[]).map((w,Q)=>({provider:w.provider,model:w.model??"",apiKey:"",hasStoredKey:!!w.apiKey,originalIndex:Q}));D(R),U(R.map(()=>null))}).catch(P=>{console.warn("[memesh dashboard] /v1/config failed to load:",P),r(null)}).finally(()=>E(!1)),(async()=>(await xe(!1),M||xe(!0,!0)))(),()=>{M=!0}},[]);async function Ce(){ee(!0),T(""),H(null);try{const M=await J("POST","/v1/config/test",{provider:u,...d?{apiKey:d}:{}});H(M),M.valid&&!h&&M.suggested&&c(M.suggested)}catch(M){H({valid:!1,error:Se(M)})}finally{ee(!1)}}function Ee(M){m(M),H(null),c("")}function Fe(M){l(M),H(null)}async function Ue(){k(!0),T("");try{const M={provider:u};h&&(M.model=h),d&&(M.apiKey=d),await J("POST","/v1/config",{llm:M}),T(n("settings.saved")),d&&f(!0),l(""),H(null),b(u),p(h)}catch(M){T(n("common.error")+": "+Se(M))}finally{k(!1)}}async function Le(){if(confirm(n("settings.removeProviderConfirm"))){k(!0),T("");try{await J("POST","/v1/config",{llm:null}),m(""),c(""),l(""),b(""),p(""),f(!1),H(null),T(n("settings.providerRemoved"))}catch(M){T(n("common.error")+": "+Se(M))}finally{k(!1)}}}async function ct(M,P){T("");try{await J("POST","/v1/config",M),r(q=>q&&P(q)),T(n("settings.saved"))}catch(q){T(n("common.error")+": "+Se(q))}}function A(M,P){D(q=>q.map((v,R)=>R===M?{...v,...P}:v)),U(q=>q.map((v,R)=>R===M?null:v))}function B(M,P){D(q=>q.map((v,R)=>R===M?{...v,provider:P,model:"",apiKey:"",hasStoredKey:!1,originalIndex:null}:v)),U(q=>q.map((v,R)=>R===M?null:v))}function O(){D(M=>[...M,{provider:"ollama",model:"",apiKey:"",hasStoredKey:!1,originalIndex:null}]),U(M=>[...M,null]),fe("")}function W(M){D(P=>P.filter((q,v)=>v!==M)),U(P=>P.filter((q,v)=>v!==M)),fe("")}function Y(M,P){const q=M+P;D(v=>{if(q<0||q>=v.length)return v;const R=v.slice();return[R[M],R[q]]=[R[q],R[M]],R}),U(v=>{if(q<0||q>=v.length)return v;const R=v.slice();return[R[M],R[q]]=[R[q],R[M]],R}),fe("")}async function ae(M){const P=ue[M];if(P){$(M),fe("");try{const q=P.apiKey.trim(),v=await J("POST","/v1/config/test",{provider:P.provider,...q?{apiKey:q}:P.hasStoredKey&&P.originalIndex!==null?{fallbackIndex:P.originalIndex}:{}});U(R=>R.map((w,Q)=>Q===M?v:w))}catch(q){U(v=>v.map((R,w)=>w===M?{valid:!1,error:Se(q)}:R))}finally{$(null)}}}async function ce(){z(!0),fe("");try{const M=ue.map(ga);await J("POST","/v1/config",{llmFallbacks:M}),D(P=>P.map((q,v)=>{const R=q.provider!=="ollama"&&(q.hasStoredKey||!!q.apiKey.trim());return{...q,hasStoredKey:R,originalIndex:R?v:null,apiKey:""}})),fe(n("settings.saved"))}catch(M){fe(n("common.error")+": "+Se(M))}finally{z(!1)}}if(pe)return e("div",{class:"empty",children:e("div",{class:"loading"})});const _e=o?.capabilities,we=_e?.searchLevel?n("settings.smartMode"):n("settings.core"),ye=N||Ae&&!a,Be=N||Ae,Ye=!!a?.currentVersionDeprecated,yt=!!(a?.latestVersion&&a.latestVersion!==a.currentVersion),We=!!(Ye&&a?.latestVersion&&a.latestVersion===a.currentVersion&&a?.freshness==="fresh"),bt=!!(a?.checkSucceeded&&a?.lastError),Ne=ye?n("settings.updateChecking"):a?Ye?n(yt?"settings.updateAvailable":We?"settings.updateDeprecatedNoTarget":"settings.updateDeprecatedTargetUnknown"):a.freshness==="unavailable"?n("settings.updateNoSuccessfulChecks"):!a.checkSucceeded&&a.freshness==="stale"?n("settings.updateStale"):!a.checkSucceeded&&a.freshness==="cached"?n("settings.updateCachedFallback"):a.updateAvailable?n("settings.updateAvailable"):n(bt?"settings.updatePartialSummary":"settings.upToDate"):n("settings.updateUnavailable"),qt=a?Ye?"var(--danger)":a.freshness==="unavailable"||!a.checkSucceeded&&a.freshness==="stale"?"var(--warning)":!a.checkSucceeded&&a.freshness==="cached"||a.updateAvailable?"var(--info)":bt?"var(--warning)":"var(--success)":"var(--warning)",vt=a?.freshness==="stale"?n("settings.updateSourceStale"):a?.source==="cache"?n("settings.updateSourceCached"):a?.source==="fresh"?n("settings.updateSourceFresh"):n("settings.updateSourceUnavailable"),Ut=ya(a?.installChannel),kt=ba(a?.installChannel),et=ye?n("common.loading"):to(t,a?.lastAttemptAt||null),Wt=ye?n("common.loading"):to(t,a?.lastSuccessfulCheckAt||null),Kt=!!a?.lastSuccessfulCheckAt,Ke=!!a?.lastError&&!ye;return e("div",{children:[e("div",{class:"card",children:[e("div",{class:"card-title",children:n("settings.capabilities")}),e("div",{class:"stats-row",style:{marginBottom:0},children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:18},children:we}),e("div",{class:"stat-lbl",children:n("settings.searchMode")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:14},children:Zs(_e?.embeddings||"—")}),e("div",{class:"stat-lbl",children:n("settings.embeddings")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:14},children:Zs(_e?.llm?.provider||n("settings.none"))}),e("div",{class:"stat-lbl",children:n("settings.llmProvider")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:14,fontFamily:"var(--mono)"},children:_e?.llm?.model||"—"}),e("div",{class:"stat-lbl",children:n("settings.model")})]})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:n("settings.llmProvider")}),e("div",{style:{padding:"10px 12px",marginBottom:14,background:"var(--bg-2)",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-sm)",fontSize:12,lineHeight:1.55,color:"var(--text-2)"},children:[e("div",{style:{fontWeight:600,color:"var(--text-1)",marginBottom:4},children:n("settings.llmOptional.title")}),e("div",{style:{marginBottom:6},children:n("settings.llmOptional.body")}),e("div",{children:[e("strong",{children:n("settings.llmOptional.coreLabel")})," — ",n("settings.llmOptional.coreFeatures")]}),e("div",{children:[e("strong",{children:n("settings.llmOptional.smartLabel")})," — ",n("settings.llmOptional.smartFeatures")]})]}),e("form",{onSubmit:M=>{M.preventDefault(),Ue()},children:[e("div",{style:{display:"flex",gap:16,marginBottom:14,flexWrap:"wrap"},children:[["anthropic","Anthropic (Claude)"],["openai","OpenAI"],["ollama","Ollama (Local)"]].map(([M,P])=>e("label",{style:{display:"flex",alignItems:"center",gap:5,cursor:"pointer",fontSize:13},children:[e("input",{type:"radio",name:"provider",value:M,checked:u===M,onChange:()=>Ee(M)}),P]},M))}),u&&u!=="ollama"&&e("div",{style:{marginBottom:12},children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:n("settings.apiKey")}),e("div",{style:{display:"flex",gap:8},children:[e("input",{type:"password",autoComplete:"off",placeholder:u==="anthropic"?"sk-ant-api03-…":"sk-…",value:d,onInput:M=>Fe(M.target.value),style:{flex:1}}),e("button",{type:"button",class:"btn",onClick:()=>void Ce(),disabled:u===""||X||u!=="ollama"&&d===""&&!(_&&u===y),title:_&&u===y&&d===""?n("settings.testStoredKeyHint"):void 0,style:{flexShrink:0},children:n(X?"settings.testing":"settings.test")})]})]}),u==="ollama"&&e("div",{style:{marginBottom:12},children:e("button",{type:"button",class:"btn",onClick:()=>void Ce(),disabled:X,children:n(X?"settings.testing":"settings.test")})}),F&&e("div",{role:F.valid?"status":"alert",style:{marginBottom:12,padding:"8px 10px",borderRadius:"var(--radius-xs)",fontSize:12,background:F.valid?"var(--accent-soft)":"var(--danger-soft)",border:`1px solid ${F.valid?"rgba(0, 214, 180, 0.4)":"rgba(255, 107, 107, 0.4)"}`,color:F.valid?"var(--accent)":"var(--danger)"},children:F.valid?n("settings.testPassed",{count:F.models?.length??0}):`✗ ${eo(F)}`}),F?.valid&&F.models&&F.models.length>0&&e("div",{style:{marginBottom:14},children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:[n("settings.model"),F.suggested&&e("span",{style:{marginLeft:6,color:"var(--text-3)",fontWeight:400},children:["(",n("settings.suggested"),": ",e("span",{style:{color:"var(--accent)"},children:F.suggested}),")"]})]}),e("select",{value:h,onChange:M=>c(M.target.value),style:{width:"100%"},children:F.models.map(M=>e("option",{value:M.id,children:[M.id,M.created?` — ${M.created.slice(0,10)}`:""]},M.id))})]}),(()=>{const P=(u!==y||!!d||h!==g)&&!F?.valid;return e("div",{style:{display:"flex",gap:10,alignItems:"center",flexWrap:"wrap"},children:[e("button",{class:"btn btn-primary",type:"submit",disabled:!u||C||P,children:n(C?"settings.saving":"settings.save")}),_&&e("button",{type:"button",class:"btn",onClick:Le,disabled:C,style:{borderColor:"var(--danger)",color:"var(--danger)",background:"transparent"},title:n("settings.removeProviderHint"),children:n("settings.removeProvider")}),P&&e("span",{style:{fontSize:11,color:"var(--text-3)"},children:n("settings.testRequired")}),I&&e("span",{role:I.startsWith(n("common.error"))?"alert":"status",style:{fontSize:12,color:I.startsWith(n("common.error"))?"var(--danger)":"var(--success)"},children:I})]})})()]})]}),e("div",{class:"card","data-testid":"settings-fallbacks",children:[e("div",{class:"card-title",children:n("settings.fallbacks.title")}),e("div",{style:{fontSize:12,color:"var(--text-2)",lineHeight:1.55,marginBottom:12},children:n("settings.fallbacks.explainer")}),e("div",{role:"note",style:{padding:"10px 12px",marginBottom:14,background:"var(--warning-soft)",border:"1px solid rgba(255, 184, 77, 0.4)",borderRadius:"var(--radius-sm)",fontSize:12,lineHeight:1.55,color:"var(--text-0)"},"data-testid":"settings-fallbacks-privacy",children:[e("div",{style:{fontWeight:600,color:"var(--warning)",marginBottom:4},children:n("settings.fallbacks.privacyTitle")}),e("div",{children:n("settings.fallbacks.privacyBody")})]}),ue.length===0&&e("div",{style:{fontSize:12,color:"var(--text-3)",marginBottom:12},children:n("settings.fallbacks.empty")}),e("div",{style:{display:"grid",gap:12},children:ue.map((M,P)=>{const q=M.provider!=="ollama",v=j[P],R=q&&!M.apiKey.trim()&&!M.hasStoredKey;return e("div",{"data-testid":"fallback-entry",style:{border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--bg-2)",padding:"12px"},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:10,gap:8,flexWrap:"wrap"},children:[e("span",{style:{fontSize:11,color:"var(--text-2)",fontFamily:"var(--mono)"},children:n("settings.fallbacks.priority",{n:P+1})}),e("div",{style:{display:"flex",gap:6},children:[e("button",{type:"button",class:"btn btn-sm",onClick:()=>Y(P,-1),disabled:P===0,"aria-label":n("settings.fallbacks.moveUp"),title:n("settings.fallbacks.moveUp"),children:"↑"}),e("button",{type:"button",class:"btn btn-sm",onClick:()=>Y(P,1),disabled:P===ue.length-1,"aria-label":n("settings.fallbacks.moveDown"),title:n("settings.fallbacks.moveDown"),children:"↓"}),e("button",{type:"button",class:"btn btn-sm",onClick:()=>W(P),style:{borderColor:"var(--danger)",color:"var(--danger)",background:"transparent"},children:n("settings.fallbacks.remove")})]})]}),e("div",{style:{display:"flex",gap:10,flexWrap:"wrap",alignItems:"flex-end"},children:[e("div",{children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:n("settings.fallbacks.providerLabel")}),e("select",{"aria-label":n("settings.fallbacks.providerLabel"),value:M.provider,onChange:w=>B(P,w.target.value),style:{fontSize:13,padding:"6px 10px",borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--bg-input)",color:"var(--text-1)",cursor:"pointer"},children:ha.map(([w,Q])=>e("option",{value:w,children:Q},w))})]}),e("div",{style:{flex:1,minWidth:160},children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:n("settings.fallbacks.modelLabel")}),e("input",{type:"text",value:M.model,placeholder:n("settings.fallbacks.modelPlaceholder"),onInput:w=>A(P,{model:w.target.value}),style:{width:"100%",fontFamily:"var(--mono)"}})]})]}),q&&e("div",{style:{marginTop:10},children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:n("settings.apiKey")}),e("input",{type:"password",autoComplete:"off",placeholder:M.provider==="anthropic"?"sk-ant-api03-…":"sk-…",value:M.apiKey,onInput:w=>A(P,{apiKey:w.target.value}),style:{width:"100%"}}),M.hasStoredKey&&!M.apiKey.trim()&&e("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:4},children:n("settings.fallbacks.apiKeyStoredHint")}),R&&e("div",{style:{fontSize:11,color:"var(--warning)",marginTop:4},children:n("settings.fallbacks.needsKey")})]}),e("div",{style:{display:"flex",gap:10,alignItems:"center",marginTop:10,flexWrap:"wrap"},children:[e("button",{type:"button",class:"btn btn-sm",onClick:()=>void ae(P),disabled:V===P,children:n(V===P?"settings.testing":"settings.test")}),v&&e("span",{role:v.valid?"status":"alert",style:{fontSize:12,color:v.valid?"var(--success)":"var(--danger)"},children:v.valid?n("settings.testPassed",{count:v.models?.length??0}):`✗ ${eo(v)}`})]})]},P)})}),e("div",{style:{display:"flex",gap:10,alignItems:"center",marginTop:14,flexWrap:"wrap"},children:[e("button",{type:"button",class:"btn",onClick:O,children:n("settings.fallbacks.add")}),e("button",{type:"button",class:"btn btn-primary",onClick:()=>void ce(),disabled:L,children:n(L?"settings.saving":"settings.fallbacks.save")}),G&&e("span",{role:G.startsWith(n("common.error"))?"alert":"status",style:{fontSize:12,color:G.startsWith(n("common.error"))?"var(--danger)":"var(--success)"},children:G})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:n("settings.updates")}),a?.currentVersionDeprecated&&a.deprecationMessage&&e("div",{style:{background:"var(--danger-soft)",border:"1px solid rgba(255, 107, 107, 0.4)",borderRadius:"var(--radius-xs)",padding:"10px 12px",marginBottom:12,fontSize:12,color:"var(--text-0)",lineHeight:1.55},"data-testid":"settings-deprecation-warning",children:[e("strong",{style:{color:"var(--danger)"},children:n("settings.updateDeprecatedTitle",{version:a.currentVersion})}),e("div",{style:{marginTop:4,opacity:.9},children:a.deprecationMessage})]}),a&&a.checkSucceeded&&a.lastError&&e("div",{style:{background:"var(--warning-soft)",border:"1px solid rgba(255, 184, 77, 0.4)",borderRadius:"var(--radius-xs)",padding:"10px 12px",marginBottom:12,fontSize:12,color:"var(--text-0)",lineHeight:1.55},"data-testid":"settings-update-partial-warning",children:[e("strong",{style:{color:"var(--warning)"},children:n("settings.updatePartialTitle")}),e("div",{style:{marginTop:4,opacity:.9},children:n("settings.updatePartialDescription",{message:a.lastError??""})})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,alignItems:"baseline",marginBottom:12,flexWrap:"wrap"},children:[e("div",{style:{color:qt,fontSize:13,fontWeight:600},children:Ne}),e("div",{style:{display:"flex",gap:10,alignItems:"center",flexWrap:"wrap"},children:[!ye&&a&&e("div",{style:{fontSize:11,color:"var(--text-2)"},children:vt}),e("button",{class:"btn btn-sm",type:"button",onClick:()=>{xe(!0,!!a)},disabled:Be,children:n(Be?"settings.updateChecking":"settings.checkNow")})]})]}),e("div",{style:{display:"grid",gap:10},children:[e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:n("settings.installMethod")}),e("span",{style:{color:"var(--text-0)"},children:ye?n("common.loading"):Ut})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:n("settings.currentVersion")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:a?.currentVersion||"—"})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:n("settings.latestVersion")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:a?.latestVersion||"—"})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:n("settings.lastAttempted")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:et})]}),Kt&&e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:n("settings.lastSuccessful")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:Wt})]}),!N&&e("div",{style:{color:"var(--text-2)",fontSize:12,lineHeight:1.5,marginTop:2},children:kt}),Ke&&e("div",{style:{color:"var(--warning)",fontSize:12,lineHeight:1.5},children:n("settings.updateLastError",{message:a?.lastError||""})}),a?.recommendedCommand&&e("div",{style:{display:"grid",gap:6,marginTop:4},children:[e("span",{style:{color:"var(--text-2)",fontSize:12},children:n("settings.updateCommand")}),e("code",{style:{color:"var(--text-0)",background:"var(--bg-input)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:"8px 10px",fontSize:12,fontFamily:"var(--mono)"},children:a.recommendedCommand})]})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:n("settings.behaviourTitle")}),e("div",{style:{marginTop:8},children:[e("label",{id:"settings-autoupdate-label",style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:n("settings.autoUpdateLabel")}),e("select",{"aria-labelledby":"settings-autoupdate-label",value:o?.config.autoUpdate??"off",onChange:async M=>{const P=M.target.value;await ct({autoUpdate:P},q=>({...q,config:{...q.config,autoUpdate:P}}))},style:{fontSize:13,padding:"6px 10px",borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--bg-input)",color:"var(--text-1)",cursor:"pointer"},children:[e("option",{value:"off",children:n("settings.autoUpdateOff")}),e("option",{value:"patch",children:n("settings.autoUpdatePatch")}),e("option",{value:"minor",children:n("settings.autoUpdateMinor")}),e("option",{value:"major",children:n("settings.autoUpdateMajor")})]}),e("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:4},children:n("settings.autoUpdateHint")})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:n("settings.language")}),e("select",{"aria-label":n("settings.language"),value:t,onChange:M=>{const P=M.target.value;un(P),s(P);const q=Fs().find(v=>v.code===P)?.name;q&&J("POST","/v1/config",{language:q}).catch(()=>{})},style:{fontSize:13,padding:"6px 10px",borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--bg-input)",color:"var(--text-1)",cursor:"pointer"},children:Fs().map(M=>e("option",{value:M.code,children:M.name},M.code))})]})]})}const Do={commit:"#A78BFA",session_keypoint:"#4ADE80",session_identity:"#F472B6",workflow_checkpoint:"#38BDF8",feature:"#FB923C",bug_fix:"#F87171",tool:"#818CF8",person:"#E879F9",note:"#94A3B8"};function ka(t){return Array.isArray(t?.entities)&&Array.isArray(t.relations)}const No={decision:"--accent",concept:"--accent",pattern:"--info",lesson_learned:"--warning","session-insight":"--text-2"},Ho="--text-1",wa=["--accent","--accent-hover","--info","--warning","--text-0","--text-1","--text-2","--text-3","--bg-0","--bg-1","--font","--mono"];function xa(t){const s=No[t];return s?`var(${s})`:Do[t]??`var(${Ho})`}function _a(t,s){const o=No[t];return o?s[o]??"":Do[t]??s[Ho]??""}function Ma(t){const s=Math.max(0,Math.min(1,(t-.15)/.85)),o=Math.round(248+-248*s),r=Math.round(113+101*s),a=Math.round(113+67*s);return`rgb(${o},${r},${a})`}function Ca(t){const s=Number.isFinite(t)&&t>0?t:0;return s===0?3.5:Math.min(9,3.5+Math.log2(s+1)*1.2)}function Sa(t,s=.55){const o=/^#([0-9a-f]{6})$/i.exec(t.trim());if(o){const a=parseInt(o[1],16),i=Math.round((a>>16&255)*s),u=Math.round((a>>8&255)*s),m=Math.round((a&255)*s);return`rgb(${i},${u},${m})`}const r=/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/.exec(t.trim());return r?`rgb(${Math.round(+r[1]*s)},${Math.round(+r[2]*s)},${Math.round(+r[3]*s)})`:t}function so(t){let s=5381;for(let o=0;o<t.length;o++)s=(s<<5)+s+t.charCodeAt(o)>>>0;return s}function Aa(t){if(!t)return .15;const s=Date.now()-new Date(t).getTime();return Math.max(.15,1-Math.min(1,s/(30*864e5)))}function Ea(t){const s=Date.now()-new Date(t).getTime(),o=Math.floor(s/864e5);return o<1?n("graph.ageToday"):o<7?n("graph.ageDaysAgo",{count:o}):o<30?n("graph.ageWeeksAgo",{count:Math.floor(o/7)}):n("graph.ageDaysAgo",{count:o})}const oo=440,Tt=4,La=1500;function Ta(t,s=La){return t.length<=s?t:[...t].sort((o,r)=>(r.access_count??0)-(o.access_count??0)||(r.last_accessed_at??r.created_at).localeCompare(o.last_accessed_at??o.created_at)).slice(0,s)}function Pa(){const[t,s]=x(null),[o,r]=x(0),[a,i]=x(!0),[u,m]=x(null),[d,l]=x({}),[h]=bs(),[c,y]=x(""),[b,g]=x(null),[p,_]=x(!1),f=ne(null),C=ne([]),k=ne([]),I=ne(new Set),T=ne(0),F=ne({scale:1,panX:0,panY:0}),H=ne({active:!1,startScreenX:0,startScreenY:0,startPanX:0,startPanY:0,moved:!1}),X=ne({node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1}),ee=ne(null),pe=ne({x:0,y:0,node:null}),E=ne(800),N=ne({}),se=ne(d),Ae=ne(c),de=ne(b),ue=ne(p);te(()=>{se.current=d},[d]),te(()=>{if(!t)return;const A=new Set(t.noiseTypes??[]);l(B=>{const O={...B};let W=!1;for(const Y of A){const ae=!h;O[Y]!==ae&&(O[Y]=ae,W=!0)}return W?O:B})},[h,t]),te(()=>{Ae.current=c},[c]),te(()=>{de.current=b},[b]),te(()=>{ue.current=p},[p]),te(()=>{vn().then(A=>{if(!ka(A)){console.warn("[memesh dashboard] /v1/graph answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",A),m("unreadable"),s(null);return}m(null);const B=Ta(A.entities);B.length<A.entities.length&&console.info(`[memesh dashboard] graph capped at ${B.length} of ${A.entities.length} entities — the O(n²) simulation freezes the tab beyond this; showing the most-recalled nodes.`),r(A.entities.length),s({...A,entities:B});const O=new Set(Array.isArray(A.noiseTypes)?A.noiseTypes:[]),W={};B.forEach(Y=>{W[Y.type]=W[Y.type]??(h?!O.has(Y.type):!0)}),l(W)}).catch(A=>{console.warn("[memesh dashboard] /v1/graph failed to load:",A),m(lt(A))}).finally(()=>i(!1))},[]),te(()=>{if(!t||a)return;const A=f.current;if(!A)return;N.current=Po(A,wa);const B=A.parentElement?.getBoundingClientRect(),O=B?Math.floor(B.width)-24:800,W=oo,Y=window.devicePixelRatio||1;A.width=O*Y,A.height=W*Y,A.style.width=O+"px",A.style.height=W+"px",E.current=O;const ae=new Set;t.relations.forEach(v=>{ae.add(v.from),ae.add(v.to)});const ce=2.399963229728653,_e=O/2,we=W/2,ye=[...new Set(t.entities.map(v=>v.type))].sort(),Be=new Map,Ye=O*.42,yt=W*.42;ye.forEach((v,R)=>{const w=Math.sqrt((R+1)/ye.length),Q=R*ce;Be.set(v,{x:_e+Math.cos(Q)*Ye*w,y:we+Math.sin(Q)*yt*w})});const We=new Map;for(const v of ye)t.entities.filter(R=>R.type===v).map(R=>R.name).sort().forEach((R,w)=>We.set(R,w));const bt=Math.min(O,W)*.18,Ne=new Map;t.entities.forEach(v=>{const R=v.last_accessed_at||v.created_at,w=Be.get(v.type),Q=We.get(v.name),oe=so(v.name),Te=Q*ce+oe%100/100,He=Math.min(bt,14+Math.sqrt(Q)*16+oe%7);Ne.set(v.name,{id:v.name,title:v.title??null,type:v.type,x:Math.min(O-16,Math.max(16,w.x+Math.cos(Te)*He)),y:Math.min(W-16,Math.max(16,w.y+Math.sin(Te)*He)),vx:0,vy:0,radius:Ca(v.access_count),recency:Aa(R),isOrphan:!ae.has(v.name),lastDate:R,accessCount:Math.max(0,v.access_count??0)})});const qt=Array.from(Ne.values()).sort((v,R)=>R.accessCount-v.accessCount||R.recency-v.recency||v.id.localeCompare(R.id));C.current=Array.from(Ne.values()),k.current=t.relations.filter(v=>Ne.has(v.from)&&Ne.has(v.to));const vt=new Set;for(const v of k.current){const R=so(v.from+" "+v.to);((R^R>>>16)&3)===0&&vt.add(v)}const Ut=v=>{const R=new Map,w=v.map(oe=>{const Te=Ne.get(oe.from),He=Ne.get(oe.to),Vt=Math.sqrt(Math.log2(Te.accessCount+2)*Math.log2(He.accessCount+2));return{e:oe,p:Vt*Math.min(Te.recency,He.recency)}}).sort((oe,Te)=>Te.p-oe.p),Q=new Set;for(const{e:oe}of w){if(Q.size>=128)break;const Te=R.get(oe.from)??0,He=R.get(oe.to)??0;Te>=5||He>=5||(Q.add(oe),R.set(oe.from,Te+1),R.set(oe.to,He+1))}return Q};let kt=null;const et=v=>{if(se.current[v.type]===!1)return!1;const w=de.current;return w?v.id===w?!0:k.current.some(oe=>oe.from===w&&oe.to===v.id||oe.to===w&&oe.from===v.id):!0},Wt=v=>{const R=Ne.get(v.from),w=Ne.get(v.to);return!R||!w?!1:et(R)&&et(w)},Kt=v=>{const R=Ae.current.toLowerCase();return R?v.id.toLowerCase().includes(R):!1};let Ke=1;const M=.005,P=()=>{Ke=.3};window.__graphReheat=P;const q=()=>{const v=C.current,R=k.current,w=A.getContext("2d");if(!w)return;const Q=N.current,oe=window.devicePixelRatio||1;Ke=Math.max(0,Ke-M);const Te=Ke>0,He=.85,Vt=2e3*Ke,Bo=80,qo=.02*Ke,xs=.02*Ke,Uo=v.length>200,_s=O/2,Ms=W/2,wt=new Map(v.map(S=>[S.id,S]));if(Te){for(let S=0;S<v.length;S++)for(let K=S+1;K<v.length;K++){const Z=v[K].x-v[S].x,be=v[K].y-v[S].y,ve=Z*Z+be*be;if(Uo&&ve>9e4)continue;const me=Math.sqrt(ve)||1,ze=Vt/(me*me),Je=Z/me*ze,qe=be/me*ze;v[S].vx-=Je,v[S].vy-=qe,v[K].vx+=Je,v[K].vy+=qe}for(const S of R){const K=wt.get(S.from),Z=wt.get(S.to);if(!K||!Z)continue;const be=Z.x-K.x,ve=Z.y-K.y,me=Math.sqrt(be*be+ve*ve)||1,ze=(me-Bo)*qo,Je=be/me*ze,qe=ve/me*ze;K.vx+=Je,K.vy+=qe,Z.vx-=Je,Z.vy-=qe}for(const S of v)S.vx+=(_s-S.x)*xs,S.vy+=(Ms-S.y)*xs}let dt=X.current.node;if(dt&&!v.includes(dt)&&(X.current.node=null,dt=null),!(!Te&&!dt&&v.every(S=>S.vx===0&&S.vy===0)))for(const S of v){if(dt===S)continue;S.vx*=He,S.vy*=He,Math.abs(S.vx)<.01&&Math.abs(S.vy)<.01&&(S.vx=0,S.vy=0),S.x+=S.vx,S.y+=S.vy;const K=100;S.x<-K?S.x=-K:S.x>O+K&&(S.x=O+K),S.y<-K?S.y=-K:S.y>W+K&&(S.y=W+K)}const Cs=Ae.current.toLowerCase();if(Cs){const S=v.filter(K=>K.id.toLowerCase().includes(Cs));if(S.length===1){const K=S[0],Z=_s-K.x,be=Ms-K.y,ve=.05;for(const me of v)me.x+=Z*ve,me.y+=be*ve}}w.setTransform(oe,0,0,oe,0,0),w.clearRect(0,0,O,W);const Pe=F.current;w.setTransform(Pe.scale*oe,0,0,Pe.scale*oe,Pe.panX*oe,Pe.panY*oe);const xt=R.filter(Wt),Wo=xt.length<30,Ss=(de.current??"")+"|"+Object.keys(se.current).filter(S=>se.current[S]===!1).sort().join(",");Ss!==kt&&(kt=Ss,I.current=Ut(xt));const Ko=I.current,Vo=xt.length>400,As=de.current!==null;for(const S of xt){const K=wt.get(S.from),Z=wt.get(S.to);if(!K||!Z)continue;const be=Ko.has(S);if(!be&&!As){if(Vo&&!vt.has(S))continue;w.globalAlpha=Math.min(K.recency,Z.recency)*.22}else w.globalAlpha=Math.min(K.recency,Z.recency)*.7;if(w.strokeStyle=es(Q["--accent"],be||As?.5:.35),w.lineWidth=1,w.setLineDash([]),w.beginPath(),w.moveTo(K.x,K.y),w.lineTo(Z.x,Z.y),w.stroke(),Wo){const ve=(K.x+Z.x)/2,me=(K.y+Z.y)/2,ze=w.globalAlpha;w.globalAlpha=Math.max(.6,Math.min(K.recency,Z.recency)),w.font=`${9/Pe.scale}px ${Q["--font"]}`,w.fillStyle=Q["--text-2"],w.fillText(Mn(S.type),ve+2,me-2),w.globalAlpha=ze}}w.globalAlpha=1;const Go=v.filter(et),$o=Pe.scale<.75?3:Pe.scale<1.5?12:28,Gt=new Set;if(!ue.current)for(const S of qt){if(Gt.size>=$o)break;if(!et(S))continue;const K=S.x*Pe.scale+Pe.panX,Z=S.y*Pe.scale+Pe.panY;K<-20||K>O+20||Z<-20||Z>W+20||Gt.add(S)}const Yo=ee.current;for(const S of Go){const K=Yo===S,Z=Kt(S),be=de.current===S.id,ve=be?10:K?9:S.radius,me=K||Z?1:S.recency;w.globalAlpha=me,w.beginPath(),w.arc(S.x,S.y,ve,0,Math.PI*2);const ze=ue.current?Ma(S.recency):_a(S.type,Q);if(w.fillStyle=ze,w.fill(),S.isOrphan||(w.strokeStyle=Sa(ze),w.lineWidth=1,w.stroke()),S.isOrphan&&(w.setLineDash([3,3]),w.strokeStyle=Q["--text-3"],w.lineWidth=1,w.stroke(),w.setLineDash([])),Z&&(w.globalAlpha=1,w.strokeStyle=Q["--accent-hover"],w.lineWidth=2,w.beginPath(),w.arc(S.x,S.y,ve+3,0,Math.PI*2),w.stroke()),K&&!Z&&(w.globalAlpha=1,w.strokeStyle="#fff",w.lineWidth=2,w.beginPath(),w.arc(S.x,S.y,ve,0,Math.PI*2),w.stroke()),K||Z||be||Gt.has(S)){const qe=K||Z||be;w.globalAlpha=qe?1:Math.max(.7,S.recency),w.font=`${10/Pe.scale}px ${Q["--font"]}`;const _t=Z||be?S.id:S.id.length>20?S.id.slice(0,18)+"...":S.id;w.strokeStyle=Q["--bg-0"],w.lineWidth=3/Pe.scale,w.strokeText(_t,S.x+ve+4,S.y+3),w.fillStyle=qe?Q["--text-1"]:Q["--text-2"],w.fillText(_t,S.x+ve+4,S.y+3),w.globalAlpha=me}}w.globalAlpha=1;const Xe=pe.current;if(Xe.node&&et(Xe.node)){w.setTransform(oe,0,0,oe,0,0);const S=Xe.x+12,K=Xe.y-10,Z=Oe(Xe.node.type),be=Ea(Xe.node.lastDate),ve=Xe.node.title?.trim()||`${Z} · ${be}`,me=Xe.node.title?.trim()?`${Z} | ${be}`:"";w.font=`11px ${Q["--font"]}`;const ze=w.measureText(ve).width,Je=me?w.measureText(me).width:0,qe=Math.max(ze,Je)+12,_t=me?34:20;w.fillStyle=es(Q["--bg-1"],.92),w.strokeStyle=es(Q["--accent"],.3),w.lineWidth=1,w.beginPath(),w.roundRect(S-4,K-18,qe,_t,4),w.fill(),w.stroke(),w.fillStyle=Q["--text-0"],w.fillText(ve,S,K-4),me&&(w.fillStyle=Q["--text-2"],w.font=`10px ${Q["--mono"]}`,w.fillText(me,S,K+10))}T.current=requestAnimationFrame(q)};return T.current=requestAnimationFrame(q),()=>cancelAnimationFrame(T.current)},[t,a]);const D=Me((A,B)=>{const O=C.current,W=se.current,Y=de.current,ce=12/(F.current.scale||1),_e=ce*ce;for(let we=O.length-1;we>=0;we--){const ye=O[we];if(W[ye.type]===!1||Y&&ye.id!==Y&&!k.current.some(We=>We.from===Y&&We.to===ye.id||We.to===Y&&We.from===ye.id))continue;const Be=ye.x-A,Ye=ye.y-B;if(Be*Be+Ye*Ye<_e)return ye}return null},[]),j=Me(A=>{const B=f.current;if(!B)return{x:0,y:0};const O=B.getBoundingClientRect();return{x:A.clientX-O.left,y:A.clientY-O.top}},[]),U=Me((A,B)=>{const O=F.current;return{x:(A-O.panX)/O.scale,y:(B-O.panY)/O.scale}},[]),V=Me(A=>{f.current?.setPointerCapture?.(A.pointerId);const B=j(A),O=U(B.x,B.y),W=D(O.x,O.y);if(W)window.__graphReheat?.(),X.current={node:W,offsetX:O.x-W.x,offsetY:O.y-W.y,startX:B.x,startY:B.y,dragged:!1},H.current.active=!1;else{const Y=F.current;H.current={active:!0,startScreenX:B.x,startScreenY:B.y,startPanX:Y.panX,startPanY:Y.panY,moved:!1},X.current={node:null,offsetX:0,offsetY:0,startX:B.x,startY:B.y,dragged:!1};const ae=f.current;ae&&(ae.style.cursor="grabbing")}},[D,j,U]),$=Me(A=>{const B=j(A),O=U(B.x,B.y),W=X.current,Y=H.current;if(W.node){const _e=B.x-W.startX,we=B.y-W.startY;_e*_e+we*we>Tt*Tt&&(W.dragged=!0),W.node.x=O.x-W.offsetX,W.node.y=O.y-W.offsetY,W.node.vx=0,W.node.vy=0}else if(Y.active){const _e=B.x-Y.startScreenX,we=B.y-Y.startScreenY;_e*_e+we*we>Tt*Tt&&(Y.moved=!0),F.current.panX=Y.startPanX+_e,F.current.panY=Y.startPanY+we}const ae=D(O.x,O.y);ee.current=ae,pe.current=ae?{x:B.x,y:B.y,node:ae}:{x:0,y:0,node:null};const ce=f.current;ce&&(W.node||Y.active?ce.style.cursor="grabbing":ae?ce.style.cursor=de.current?"pointer":"grab":ce.style.cursor="grab")},[D,j,U]),L=Me(A=>{f.current?.releasePointerCapture?.(A.pointerId);const B=X.current,O=H.current,W=j(A),Y=U(W.x,W.y);B.node&&!B.dragged?g(ce=>ce===B.node.id?null:B.node.id):!B.node&&O.active&&!O.moved&&(D(Y.x,Y.y)||g(null)),X.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1},H.current.active=!1,H.current.moved=!1;const ae=f.current;if(ae){const ce=D(Y.x,Y.y);ae.style.cursor=ce&&de.current?"pointer":"grab"}},[D,j,U]),z=Me(()=>{X.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1},H.current.active=!1,H.current.moved=!1,ee.current=null,pe.current={x:0,y:0,node:null};const A=f.current;A&&(A.style.cursor="default")},[]),G=Me(A=>{A.preventDefault();const B=f.current;if(!B)return;const O=B.getBoundingClientRect(),W=A.clientX-O.left,Y=A.clientY-O.top,ae=F.current,ce=ae.scale,_e=Math.exp(-A.deltaY*.0015),we=Math.max(.25,Math.min(4,ce*_e));if(we===ce)return;const ye=(W-ae.panX)/ce,Be=(Y-ae.panY)/ce;ae.scale=we,ae.panX=W-ye*we,ae.panY=Y-Be*we},[]),fe=Me(()=>{F.current={scale:1,panX:0,panY:0}},[]);if(te(()=>{if(a||!t)return;const A=f.current;if(!A)return;const B=O=>G(O);return A.addEventListener("wheel",B,{passive:!1}),()=>A.removeEventListener("wheel",B)},[t,a,G]),a)return e("div",{class:"empty",children:e("div",{class:"loading"})});if(u)return e("div",{class:"error-box",role:"alert",children:$e(u)});if(!t)return e("div",{class:"error-box",role:"alert",children:[n("common.error"),": ",n("common.noData")]});const xe=new Map;t.entities.forEach(A=>xe.set(A.type,(xe.get(A.type)||0)+1));const Ce=new Set(t.entities.map(A=>A.name)),Ee=new Set;t.relations.forEach(A=>{!Ce.has(A.from)||!Ce.has(A.to)||(Ee.add(A.from),Ee.add(A.to))});const Fe=t.entities.filter(A=>!Ee.has(A.name)).length,Ue=c?t.entities.filter(A=>A.name.toLowerCase().includes(c.toLowerCase())).length:0,Le=b?t.entities.find(A=>A.name===b):null;if(t.entities.length===0)return e("div",{children:[e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:"0"}),e("div",{class:"stat-lbl",children:n("graph.entities")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:"0"}),e("div",{class:"stat-lbl",children:n("graph.relations")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:"0"}),e("div",{class:"stat-lbl",children:n("graph.orphans")})]})]}),e("div",{class:"card",style:{padding:12},children:[e("span",{class:"card-title",style:{margin:0},children:n("tab.graph")}),e(ks,{})]})]});const ct=o>t.entities.length;return e("div",{children:[e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:o.toLocaleString(he())}),e("div",{class:"stat-lbl",children:n("graph.entities")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.relations.length.toLocaleString(he())}),e("div",{class:"stat-lbl",children:n("graph.relations")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:Fe.toLocaleString(he())}),e("div",{class:"stat-lbl",children:n("graph.orphans")})]})]}),ct&&e("div",{role:"status",style:{fontSize:11,color:"var(--text-2)",margin:"0 0 8px"},children:n("graph.cappedNote",{shown:t.entities.length.toLocaleString(he()),total:o.toLocaleString(he())})}),e("div",{class:"card",style:{padding:12},children:[e("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:8,flexWrap:"nowrap",overflowX:"auto",paddingBottom:4,scrollbarWidth:"thin"},children:[e("span",{class:"card-title",style:{margin:0,flexShrink:0},children:n("tab.graph")}),Array.from(xe.entries()).map(([A,B])=>{const O=d[A]!==!1,W=xa(A);return e("label",{style:{display:"inline-flex",alignItems:"center",gap:4,fontSize:11,color:"var(--text-1)",opacity:O?1:.4,cursor:"pointer",userSelect:"none"},children:[e("input",{type:"checkbox",checked:O,onChange:()=>l(Y=>({...Y,[A]:!Y[A]})),style:{accentColor:W,width:13,height:13,cursor:"pointer"}}),e("span",{style:{width:8,height:8,borderRadius:"50%",background:W,display:"inline-block",flexShrink:0}}),Oe(A)," (",B,")"]},A)})]}),e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8,flexWrap:"wrap"},children:[e("input",{type:"text",placeholder:n("graph.search"),value:c,onInput:A=>y(A.target.value),style:{flex:"1 1 160px",minWidth:120,maxWidth:260,padding:"4px 8px",background:"var(--bg-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-xs)",color:"var(--text-0)",fontSize:12,fontFamily:"var(--font)"}}),c&&e("span",{style:{fontSize:11,fontFamily:"var(--mono)",color:"var(--text-2)"},children:[Ue," ",n("graph.matches")]}),e("button",{onClick:fe,title:n("graph.resetViewHint"),style:{marginLeft:"auto",padding:"3px 10px",background:"rgba(255,255,255,0.04)",border:"1px solid rgba(255,255,255,0.08)",borderRadius:"var(--radius-xs)",color:"var(--text-2)",fontSize:11,cursor:"pointer"},children:n("graph.resetView")}),e("button",{onClick:()=>_(A=>!A),title:n("graph.driftHint"),"aria-pressed":p,style:{padding:"3px 10px",background:p?"rgba(0,214,180,0.15)":"rgba(255,255,255,0.04)",border:`1px solid ${p?"rgba(0,214,180,0.4)":"rgba(255,255,255,0.08)"}`,borderRadius:"var(--radius-xs)",color:p?"var(--accent)":"var(--text-2)",fontSize:11,cursor:"pointer",display:"flex",alignItems:"center",gap:6},children:[e("span",{style:{display:"inline-block",width:32,height:6,borderRadius:"var(--radius-hairline)",background:"linear-gradient(to right, #F87171, var(--accent))"}}),n("graph.drift")]})]}),Le&&e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8,padding:"4px 10px",background:"var(--accent-soft)",borderRadius:"var(--radius-xs)",fontSize:12},children:[e("span",{style:{color:"var(--accent)",fontWeight:600},children:[n("graph.focusMode"),":"]}),e("span",{style:{color:"var(--text-0)"},children:Le.name}),e("button",{onClick:()=>g(null),style:{marginLeft:"auto",padding:"2px 8px",background:"rgba(0, 214, 180, 0.12)",border:"1px solid rgba(0, 214, 180, 0.2)",borderRadius:"var(--radius-hairline)",color:"var(--accent)",fontSize:11,cursor:"pointer"},children:n("graph.showAll")})]}),!b&&e("div",{style:{fontSize:11,color:"var(--text-3)",marginBottom:6},children:n("graph.interactHint")}),e("canvas",{ref:f,role:"img",tabIndex:0,"aria-label":n("graph.canvasA11y",{entities:o.toLocaleString(he()),relations:t.relations.length.toLocaleString(he()),orphans:Fe.toLocaleString(he())}),style:{width:"100%",height:oo,borderRadius:"var(--radius-sm)",background:"var(--bg-0)",cursor:"grab",touchAction:"none"},onPointerDown:V,onPointerMove:$,onPointerUp:L,onPointerCancel:z,onPointerLeave:z})]})]})}function nt({type:t,children:s}){return e("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[e(pt,{type:t,size:16}),s]})}function Ra(t){const s=[];let o=null;for(const r of t){const a=r.trim();a.startsWith("Error:")?(o&&s.push(o),o={error:a.slice(6).trim(),rootCause:"",fix:"",prevention:""}):a.startsWith("Root cause:")?(o||(o={error:"",rootCause:"",fix:"",prevention:""}),o.rootCause=a.slice(11).trim()):a.startsWith("Fix:")||a.startsWith("Solution")?(o||(o={error:"",rootCause:"",fix:"",prevention:""}),o.fix=a.replace(/^(Fix|Solution\s*\d*):/i,"").trim()):a.startsWith("Prevention:")&&(o||(o={error:"",rootCause:"",fix:"",prevention:""}),o.prevention=a.slice(11).trim())}return o&&s.push(o),s}function ja(t){const s=t.observations??[],o=s[0]?.match(/^Plan "(.+?)" completed \((\d+) steps?\)/),r=s.find(i=>i.startsWith("Steps:"))?.slice(6).trim()??"",a=s.find(i=>i.startsWith("Commits:"))?.slice(8).trim()??"";return{planName:o?.[1]??Ze(t),stepCount:o?parseInt(o[2],10):0,steps:r,commits:a?a.split(",").map(i=>i.trim()).filter(Boolean):[]}}const ns={critical:"var(--danger)",major:"var(--warning)",minor:"var(--info)"};function Oo(t){const s=t.tags??[];return s.includes("severity:critical")?"critical":s.includes("severity:major")?"major":s.includes("severity:minor")?"minor":null}function za({entity:t}){const s=Ra(t.observations??[]),o=Oo(t),r=it(t),a=ft(t.access_count),i=o?ns[o]:"var(--border)";return e("div",{class:"card",style:{borderLeft:`3px solid ${i}`,marginBottom:12},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:10,flexWrap:"wrap",gap:6},children:[e("div",{class:"card-title",style:{margin:0,flex:1,minWidth:0},children:e(nt,{type:"lesson_learned",children:Ze(t)})}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[r&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.12)",color:"var(--accent)",display:"inline-flex",alignItems:"center",gap:4},children:[e("svg",{width:"11",height:"11",viewBox:"0 0 16 16","aria-hidden":"true",style:{flexShrink:0},children:e("path",{d:"M2 4 a1 1 0 0 1 1 -1 h4 l2 2 h5 a1 1 0 0 1 1 1 v6 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"})}),r]}),o&&e("span",{class:"badge",style:{background:`${ns[o]}18`,color:ns[o]},children:n(`lessons.severity.${o}`)}),a.tone!=="none"&&e("span",{class:"tag",style:{background:a.tone==="high"?"rgba(0, 214, 180, 0.18)":"rgba(0, 214, 180, 0.10)",color:"var(--accent)",fontWeight:a.tone==="high"?600:400},children:["✓ ",a.label]}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:Ge(t.last_accessed_at||t.created_at)})]})]}),s.length===0&&e("div",{style:{fontSize:12,color:"var(--text-3)",fontStyle:"italic"},children:n("lessons.unstructured")}),s.map((u,m)=>e("div",{style:{marginTop:m>0?14:0,paddingTop:m>0?14:0,borderTop:m>0?"1px dashed var(--border-subtle)":"none"},children:[u.error&&e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--danger)",marginBottom:2},children:n("lessons.error")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:u.error})]}),u.rootCause&&e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--warning)",marginBottom:2},children:n("lessons.rootCause")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:u.rootCause})]}),u.fix&&e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--success)",marginBottom:2},children:n("lessons.fix")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:u.fix})]}),u.prevention&&e("div",{children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--info)",marginBottom:2},children:n("lessons.prevention")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:u.prevention})]})]},m))]})}function Ia({entity:t}){const s=ja(t),o=it(t),r=ft(t.access_count);return e("div",{class:"card",style:{marginBottom:10},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:6,gap:8,flexWrap:"wrap"},children:[e("div",{style:{flex:1,minWidth:0},children:[e("div",{class:"card-title",style:{margin:0},children:e(nt,{type:"plan",children:s.planName})}),e("div",{style:{fontSize:12,color:"var(--text-3)",marginTop:2},children:[e("span",{style:{fontFamily:"var(--mono)"},children:s.stepCount})," ",n("lessons.stepsLabel")," · ",n("lessons.commitsCount",{count:s.commits.length})]})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0},children:[o&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.12)",color:"var(--accent)",display:"inline-flex",alignItems:"center",gap:4},children:[e("svg",{width:"11",height:"11",viewBox:"0 0 16 16","aria-hidden":"true",style:{flexShrink:0},children:e("path",{d:"M2 4 a1 1 0 0 1 1 -1 h4 l2 2 h5 a1 1 0 0 1 1 1 v6 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"})}),o]}),r.tone!=="none"&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.10)",color:"var(--accent)"},children:["✓ ",r.label]}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:Ge(t.created_at)})]})]}),s.steps&&e("div",{style:{fontSize:12,color:"var(--text-2)",lineHeight:1.5,marginTop:4},children:s.steps.length>220?s.steps.slice(0,220)+"…":s.steps}),s.commits.length>0&&e("div",{style:{marginTop:8,fontSize:11,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[s.commits.slice(0,4).join(" · "),s.commits.length>4&&e("span",{children:[" · +",s.commits.length-4]})]})]})}function Da({entity:t}){const s=t.observations??[],o=it(t),r=ft(t.access_count);return e("div",{class:"card",style:{marginBottom:10},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:6,gap:8,flexWrap:"wrap"},children:[e("div",{class:"card-title",style:{margin:0,flex:1,minWidth:0},children:e(nt,{type:"note",children:Ze(t)})}),e("div",{style:{display:"flex",gap:6,flexShrink:0},children:[o&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.12)",color:"var(--accent)",display:"inline-flex",alignItems:"center",gap:4},children:[e("svg",{width:"11",height:"11",viewBox:"0 0 16 16","aria-hidden":"true",style:{flexShrink:0},children:e("path",{d:"M2 4 a1 1 0 0 1 1 -1 h4 l2 2 h5 a1 1 0 0 1 1 1 v6 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"})}),o]}),r.tone!=="none"&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.10)",color:"var(--accent)"},children:["✓ ",r.label]}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:Ge(t.created_at)})]})]}),s.length>0&&e("ul",{style:{fontSize:13,lineHeight:1.6,margin:0,paddingLeft:18,color:"var(--text-1)"},children:[s.slice(0,6).map((a,i)=>e("li",{style:{marginBottom:3},children:a.length>200?a.slice(0,200)+"…":a},i)),s.length>6&&e("li",{style:{color:"var(--text-3)",listStyle:"none"},children:n("lessons.moreItems",{count:s.length-6})})]})]})}const no=100;function Na({health:t}){const[s,o]=x([]),[r,a]=x([]),[i,u]=x(!0),[m,d]=x(""),[l,h]=x("failure"),[c,y]=x(""),[b,g]=x("all");te(()=>{Promise.all([kn(),Lo().catch(()=>[])]).then(([k,I])=>{o(k),a(I)}).catch(k=>d($e(lt(k)))).finally(()=>u(!1))},[]);const p=je(()=>{const k={failure:[],"plan-completion":[],freeform:[]};for(const I of s)k[Sn(I)].push(I);for(const I of Object.keys(k))k[I].sort((T,F)=>(F.access_count??0)-(T.access_count??0)||F.created_at.localeCompare(T.created_at));return k},[s]),_=je(()=>{const k=p[l],I=c.toLowerCase();return k.filter(T=>b!=="all"&&it(T)!==b?!1:I?[T.name,T.title??"",...T.observations??[],...T.tags??[]].join(" ").toLowerCase().includes(I):!0)},[p,l,c,b]);if(i)return e("div",{class:"empty",children:e("div",{class:"loading"})});if(m)return e("div",{class:"error-box",role:"alert",children:m});const f=s.reduce((k,I)=>k+(I.access_count??0),0),C=p.failure.filter(k=>Oo(k)==="critical").length;return e("div",{children:[e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:p.failure.length}),e("div",{class:"stat-lbl",children:n("lessons.tabFailure")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{color:C>0?"var(--danger)":void 0},children:C}),e("div",{class:"stat-lbl",children:n("lessons.severity.critical")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:p["plan-completion"].length}),e("div",{class:"stat-lbl",children:n("lessons.tabPlan")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:f}),e("div",{class:"stat-lbl",children:n("lessons.totalRecalls")})]})]}),e("div",{class:"card",style:{padding:"12px 14px"},children:[e("div",{style:{display:"flex",gap:6,flexWrap:"wrap",marginBottom:10},children:[e("button",{class:"btn btn-sm",style:{background:l==="failure"?"rgba(0, 214, 180, 0.18)":"transparent",borderColor:l==="failure"?"rgba(0, 214, 180, 0.5)":"rgba(255,255,255,0.08)",color:l==="failure"?"var(--accent)":"var(--text-2)"},onClick:()=>h("failure"),children:[e(nt,{type:"lesson_learned",children:n("lessons.tabFailure")})," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)",marginLeft:6},children:p.failure.length})]}),e("button",{class:"btn btn-sm",style:{background:l==="plan-completion"?"rgba(0, 214, 180, 0.18)":"transparent",borderColor:l==="plan-completion"?"rgba(0, 214, 180, 0.5)":"rgba(255,255,255,0.08)",color:l==="plan-completion"?"var(--accent)":"var(--text-2)"},onClick:()=>h("plan-completion"),children:[e(nt,{type:"plan",children:n("lessons.tabPlan")})," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)",marginLeft:6},children:p["plan-completion"].length})]}),e("button",{class:"btn btn-sm",style:{background:l==="freeform"?"rgba(0, 214, 180, 0.18)":"transparent",borderColor:l==="freeform"?"rgba(0, 214, 180, 0.5)":"rgba(255,255,255,0.08)",color:l==="freeform"?"var(--accent)":"var(--text-2)"},onClick:()=>h("freeform"),children:[e(nt,{type:"note",children:n("lessons.tabFreeform")})," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)",marginLeft:6},children:p.freeform.length})]})]}),e("div",{style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap"},children:[e("input",{type:"search",placeholder:n("lessons.searchPlaceholder"),value:c,onInput:k=>y(k.target.value),style:{flex:1,minWidth:240,padding:"4px 8px",fontSize:12}}),r.length>0&&e("select",{value:b,onChange:k=>g(k.target.value),style:{padding:"3px 8px",fontSize:12},children:[e("option",{value:"all",children:n("lessons.allProjects")}),r.map(k=>e("option",{value:k.name,children:[k.name," (",k.count,")"]},k.name))]})]}),e("div",{style:{marginTop:8,fontSize:11,color:"var(--text-3)"},children:[n("lessons.showing",{visible:_.length,total:p[l].length}),s.length>=no&&e("span",{children:[" · ",n("lessons.capNote",{limit:no})]})]})]}),e("div",{style:{marginTop:14},children:s.length===0&&t==null?e("div",{class:"empty",children:e("div",{class:"loading"})}):s.length===0&&t?.entity_count===0?e(ks,{}):_.length===0?e("div",{class:"empty",children:[e("span",{class:"empty-icon",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",color:"var(--text-3)"},children:e(pt,{type:l==="failure"?"lesson_learned":l==="plan-completion"?"plan":"note",size:28})}),s.length===0?n("lessons.emptyGuide"):c?n("lessons.noMatch",{query:c}):n("lessons.emptyCategory")]}):_.map(k=>l==="failure"?e(za,{entity:k},k.id):l==="plan-completion"?e(Ia,{entity:k},k.id):e(Da,{entity:k},k.id))})]})}function Ha(t){if(!t)return null;for(const s of t){const o=/^severity:(high|medium|low)$/i.exec(s);if(o)return o[1].toLowerCase()}return null}function ao(t){switch(t){case"high":return"var(--danger)";case"medium":return"var(--warning)";case"low":return"var(--text-2)";default:return"var(--text-3)"}}function Oa(t){const{proposal:s,detail:o,expanded:r,inFlight:a,onToggleExpand:i,onAccept:u,onReject:m,formatRelative:d,statusBadgeStyle:l,statusLabel:h}=t,c=s.status==="pending",y=Ha(o?.proposed_digest?.tags),b=l(s.status);return e("div",{class:"card",style:{padding:14,borderLeft:"3px solid var(--warning)",background:"var(--warning-soft)"},children:[e("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:12,flexWrap:"wrap"},children:[e("div",{style:{flex:"1 1 60%",minWidth:240},children:[e("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[e("span",{class:"badge badge-type",style:{textTransform:"none"},children:["#",s.id]}),e("span",{class:"tag",style:{fontSize:11,background:"var(--warning)",color:"var(--bg-0)",fontWeight:600},children:n("pattern.title")}),e("span",{style:{fontWeight:600},children:s.digest_name}),e("span",{class:"tag",style:{fontSize:11},children:s.project}),e("span",{class:"tag",style:{fontSize:11,color:"var(--text-2)"},children:n("pattern.evidenceCount",{n:String(s.source_count)})}),y&&e("span",{class:"tag",style:{fontSize:11,color:ao(y),borderColor:ao(y)},children:[n("pattern.severity"),": ",n(`pattern.severity.${y}`)]}),e("span",{class:"tag",style:{fontSize:11,...b},children:h(s.status)})]}),e("div",{style:{marginTop:6,color:"var(--text-2)",fontSize:13,lineHeight:1.5},children:s.digest_observations_preview!==null?e(ie,{children:[s.digest_observations_preview,"…"]}):e("span",{style:{fontStyle:"italic",color:"var(--text-3)"},children:n("insights.noPreview")})}),e("div",{style:{marginTop:4,color:"var(--text-3)",fontSize:11},children:d(s.created_at)})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[e("button",{class:"btn btn-ghost",onClick:()=>i(s.id),disabled:a,"aria-expanded":r,children:n(r?"insights.collapse":"insights.viewDetail")}),c&&e(ie,{children:[e("button",{class:"btn btn-primary",onClick:()=>u(s.id),disabled:a,children:n(a?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>m(s.id),disabled:a,style:{color:"var(--danger)"},children:n("insights.reject")})]})]})]}),o&&o.proposed_digest&&e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:13},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:11},children:[n("insights.generatedBy"),": ",e("code",{children:o.llm_model??n("common.unknown")})," "," "," ",n("insights.promptVersion"),": ",e("code",{children:o.prompt_version})]}),Array.isArray(o.proposed_digest.validation_warnings)&&o.proposed_digest.validation_warnings.length>0&&e("div",{style:{marginBottom:10,padding:10,borderRadius:"var(--radius-xs)",borderLeft:"3px solid var(--warning)",background:"var(--warning-soft)"},children:[e("div",{style:{fontWeight:600,color:"var(--warning)",marginBottom:6},children:["⚠ ",n("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:o.proposed_digest.validation_warnings.map((g,p)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[n("insights.validationClaim"),": "]}),e("code",{style:{fontSize:12},children:g.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[n("insights.validationReason"),": "]}),e("span",{children:g.reason})]})]},p))})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:[n("pattern.description"),":"]}),e("ol",{style:{margin:"4px 0 0 18px",padding:0},children:o.proposed_digest.observations.map((g,p)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:g},p))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[n("insights.tags"),":"]})," ",o.proposed_digest.tags.map(g=>e("span",{class:"tag",style:{marginLeft:4,fontSize:11},children:g},g))]}),e("div",{style:{color:"var(--text-3)",fontSize:11,marginTop:6},children:[n("insights.sourceIds"),": ",o.source_ids.length," (",o.source_ids.slice(0,8).join(", "),o.source_ids.length>8?"…":"",")"]})]})]})}function ro(t){return t?Ge(t.includes(" ")?t.replace(" ","T")+"Z":t):""}function io(t){switch(t){case"pending":return{background:"var(--warning-soft)",color:"var(--warning)"};case"applied":return{background:"rgba(0,214,180,0.12)",color:"var(--accent)"};case"rejected":return{background:"var(--danger-soft)",color:"var(--danger)"};default:return{background:"var(--neutral-soft)",color:"var(--text-3)"}}}function lo(t){const s=`insights.status.${t}`,o=n(s);return o===s?t:o}function Fa(){const[t,s]=x([]),[o,r]=x("pending"),[a,i]=x(new Map),[u,m]=x(!1),[d,l]=x(""),[h,c]=x(null),[y,b]=x(new Set),[g,p]=x(null),_=Me(async()=>{m(!0),l("");try{const E=await J("GET","/v1/dream/proposals?status=all");Array.isArray(E)?s(E):(console.warn("[memesh dashboard] /v1/dream/proposals answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",E),s([]),l($e("unreadable")))}catch(E){console.warn("[memesh dashboard] /v1/dream/proposals failed to load:",E),l($e(lt(E)))}finally{m(!1)}},[]);te(()=>{_()},[_]),te(()=>{J("GET","/v1/config").then(E=>c(!!E?.capabilities?.llm)).catch(()=>c(!1))},[]);const f=o==="all"?t:t.filter(E=>E.status===o),C=Me(async E=>{if(a.has(E)){const N=new Map(a);N.delete(E),i(N);return}try{const N=await J("GET",`/v1/dream/proposals/${E}`),se=new Map(a);se.set(E,N),i(se)}catch(N){l(Se(N))}},[a]),k=E=>{b(N=>{const se=new Set(N);return se.add(E),se})},I=E=>{b(N=>{const se=new Set(N);return se.delete(E),se})},T=Me(async E=>{k(E);try{await J("POST",`/v1/dream/proposals/${E}/accept`),window.dispatchEvent(new Event("memesh:data-changed")),await _()}catch(N){l(Se(N))}finally{I(E)}},[_]),F=Me(async E=>{k(E);try{await J("POST",`/v1/dream/proposals/${E}/reject`,{reason:"rejected via dashboard"}),window.dispatchEvent(new Event("memesh:data-changed")),await _()}catch(N){l(Se(N))}finally{I(E)}},[_]),H=Me(async E=>{p(E),l("");try{await J("POST","/v1/dream/run",{maxLlmCalls:3,validate:E==="validate"}),window.dispatchEvent(new Event("memesh:data-changed")),await _()}catch(N){l(Se(N))}finally{p(null)}},[_]),X=t.filter(E=>E.status==="pending").length,ee=t.filter(E=>E.status==="applied").length,pe=t.filter(E=>E.status==="rejected").length;return e("div",{style:{display:"flex",flexDirection:"column",gap:16},children:[e("div",{class:"card",style:{padding:16},children:[e("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",flexWrap:"wrap",gap:8},children:[e("h2",{style:{margin:0,fontSize:18},children:n("insights.title")}),e("span",{style:{color:"var(--text-2)",fontSize:13},children:n("insights.subtitle")})]}),e("div",{style:{marginTop:10,display:"flex",gap:16,flexWrap:"wrap",color:"var(--text-2)",fontSize:13},children:[e("span",{children:[e("strong",{style:{color:"var(--accent)",fontFamily:"var(--mono)"},children:X})," ",n("insights.statPending")]}),e("span",{children:[e("strong",{style:{fontFamily:"var(--mono)"},children:ee})," ",n("insights.statApplied")]}),e("span",{children:[e("strong",{style:{fontFamily:"var(--mono)"},children:pe})," ",n("insights.statRejected")]})]}),h&&e("div",{style:{marginTop:12,display:"flex",gap:8,flexWrap:"wrap"},children:[e("button",{class:"btn btn-primary",onClick:()=>H("plain"),disabled:g!==null,"aria-busy":g==="plain",children:g==="plain"?`${n("insights.runDream")}…`:n("insights.runDream")}),e("button",{class:"btn btn-ghost",onClick:()=>H("validate"),disabled:g!==null,"aria-busy":g==="validate",children:g==="validate"?`${n("insights.runDreamWithValidate")}…`:n("insights.runDreamWithValidate")})]})]}),e("div",{style:{display:"flex",gap:8,flexWrap:"wrap"},role:"group","aria-label":n("insights.title"),children:[["pending","applied","rejected","all"].map(E=>{const N=o===E;return e("button",{class:"tag","aria-pressed":N,style:{padding:"4px 10px",borderRadius:"var(--radius-xs)",cursor:"pointer",border:"1px solid "+(N?"var(--accent)":"var(--border)"),background:N?"rgba(0,214,180,0.12)":"transparent",color:N?"var(--accent)":"var(--text-2)"},onClick:()=>r(E),children:n(`insights.filter.${E}`)},E)}),e("button",{class:"btn btn-ghost",onClick:_,style:{marginLeft:"auto"},children:n("insights.refresh")})]}),d&&e("div",{class:"card",role:"alert",style:{padding:12,color:"var(--danger)"},children:d}),u&&e("div",{style:{color:"var(--text-3)",fontSize:13},children:n("insights.loading")}),!u&&f.length===0&&e("div",{class:"card",style:{padding:16,textAlign:"center",color:"var(--text-2)"},children:n(o!=="pending"?"insights.emptyOther":h===!1?"insights.emptyNoLlm":"insights.emptyPending")}),f.map(E=>{const N=a.get(E.id),se=a.has(E.id),Ae=E.status==="pending",de=y.has(E.id);if(E.kind==="pattern_emergent")return e(Oa,{proposal:E,detail:N,expanded:se,inFlight:de,onToggleExpand:C,onAccept:T,onReject:F,formatRelative:ro,statusBadgeStyle:io,statusLabel:lo},E.id);const ue=E.digest_observations_preview;return e("div",{class:"card",style:{padding:14},children:[e("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:12,flexWrap:"wrap"},children:[e("div",{style:{flex:"1 1 60%",minWidth:240},children:[e("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[e("span",{class:"badge badge-type",style:{textTransform:"none",fontFamily:"var(--mono)"},children:["#",E.id]}),e("span",{style:{fontWeight:600},children:E.digest_name}),e("span",{class:"tag",style:{fontSize:11},children:E.project}),e("span",{class:"tag",style:{fontSize:11},children:E.cluster_key}),e("span",{class:"tag",style:{fontSize:11,color:"var(--text-2)"},children:[E.source_count," ",n("insights.sources")]}),e("span",{class:"tag",style:{fontSize:11,...io(E.status)},children:lo(E.status)})]}),e("div",{style:{marginTop:6,color:"var(--text-2)",fontSize:13,lineHeight:1.5},children:ue!==null?e(ie,{children:[ue,"…"]}):e("span",{style:{fontStyle:"italic",color:"var(--text-3)"},children:n("insights.noPreview")})}),e("div",{style:{marginTop:4,color:"var(--text-3)",fontSize:11},children:ro(E.created_at)})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[e("button",{class:"btn btn-ghost",onClick:()=>C(E.id),disabled:de,"aria-expanded":se,children:n(se?"insights.collapse":"insights.viewDetail")}),Ae&&e(ie,{children:[e("button",{class:"btn btn-primary",onClick:()=>T(E.id),disabled:de,children:n(de?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>F(E.id),disabled:de,style:{color:"var(--danger)"},children:n("insights.reject")})]})]})]}),N&&N.proposed_digest&&E.kind==="relation"&&(()=>{const D=N.proposed_digest,[j,U]=D.relation_type==="supersedes"&&D.direction==="b_supersedes_a"?[D.b?.name,D.a?.name]:[D.a?.name,D.b?.name];return e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:13},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:11},children:[n("insights.generatedBy"),": ",e("code",{children:N.llm_model??n("common.unknown")})," · ",n("insights.promptVersion"),": ",e("code",{children:N.prompt_version})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:D.verdict}),D.severity&&e("span",{class:"tag",style:{marginLeft:8,fontSize:11},children:D.severity})]}),e("div",{style:{marginBottom:8,fontFamily:"var(--mono)",fontSize:12},children:[j," —",D.relation_type,"→ ",U]}),D.rationale&&e("div",{style:{marginBottom:8,lineHeight:1.5},children:D.rationale}),D.recommended_action&&e("div",{style:{marginBottom:8,color:"var(--text-2)",lineHeight:1.5},children:["→ ",D.recommended_action]}),(D.excerpts?.a||D.excerpts?.b)&&e("div",{style:{marginBottom:4,color:"var(--text-2)",fontSize:12},children:[e("div",{children:[e("code",{children:"A"})," ",D.a?.name,": “",D.excerpts?.a,"”"]}),e("div",{children:[e("code",{children:"B"})," ",D.b?.name,": “",D.excerpts?.b,"”"]})]})]})})(),N&&N.proposed_digest&&E.kind!=="relation"&&e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:13},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:11},children:[n("insights.generatedBy"),": ",e("code",{children:N.llm_model??n("common.unknown")})," · ",n("insights.promptVersion"),": ",e("code",{children:N.prompt_version})]}),Array.isArray(N.proposed_digest.validation_warnings)&&N.proposed_digest.validation_warnings.length>0&&e("div",{style:{marginBottom:10,padding:10,borderRadius:"var(--radius-xs)",borderLeft:"3px solid var(--warning)",background:"var(--warning-soft)"},children:[e("div",{style:{fontWeight:600,color:"var(--warning)",marginBottom:6},children:["⚠ ",n("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:N.proposed_digest.validation_warnings.map((D,j)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[n("insights.validationClaim"),": "]}),e("code",{style:{fontSize:12},children:D.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[n("insights.validationReason"),": "]}),e("span",{children:D.reason})]})]},j))})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:[n("insights.observations"),":"]}),e("ol",{style:{margin:"4px 0 0 18px",padding:0},children:N.proposed_digest.observations.map((D,j)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:D},j))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[n("insights.tags"),":"]})," ",N.proposed_digest.tags.map(D=>e("span",{class:"tag",style:{marginLeft:4,fontSize:11},children:D},D))]}),e("div",{style:{color:"var(--text-3)",fontSize:11,marginTop:6},children:[n("insights.sourceIds"),": ",n("insights.entitiesCount",{n:N.source_ids.length})," (",N.source_ids.slice(0,8).join(", "),N.source_ids.length>8?"…":"",")"]})]})]},E.id)})]})}const Ba=["bug","feature","question"],co={bug:"feedback.bug",feature:"feedback.feature",question:"feedback.question"};function qa({health:t}){const[s,o]=x(!1),[r,a]=x("bug"),[i,u]=x(""),[m,d]=x(!0),[l,h]=x(!1),c=ne(null),y=ne(null),b=ne(null),g=()=>{o(!1),y.current?.focus()};te(()=>{if(!s)return;b.current?.focus();const f=k=>{const I=k.target;y.current?.contains(I)||c.current&&!c.current.contains(I)&&o(!1)},C=k=>{k.key==="Escape"&&(k.preventDefault(),g())};return document.addEventListener("mousedown",f),document.addEventListener("keydown",C),()=>{document.removeEventListener("mousedown",f),document.removeEventListener("keydown",C)}},[s]);function p(f){const C=f.checks.find(H=>H.id==="install_id"),T=f.checks.filter(H=>H.id!=="install_id").sort((H,X)=>{const ee={fail:0,warn:1,pass:2};return(ee[H.status]??3)-(ee[X.status]??3)}).map(H=>{const X=H.status==="fail"?"❌":H.status==="warn"?"⚠️":"✅",ee=H.fix?` _Fix: ${H.fix}_`:"";return`- ${X} **${H.label}**: ${H.summary}${ee}`}),F=C?`
|
|
13
|
-
_Anonymous install ID: \`${(C.summary.match(/[0-9a-f-]{36}/)??["(unavailable)"])[0]}\` — included only because you checked "Include system info"._
|
|
14
|
-
|
|
15
|
-
${
|
|
16
|
-
|
|
9
|
+
<!-- Three voices (DESIGN.md "Type"): Bricolage Grotesque = UI chrome,
|
|
10
|
+
Newsreader = memory content (italic carries the inferred-vs-verbatim
|
|
11
|
+
distinction), Geist Mono = data. Offline, the stacks fall back. -->
|
|
12
|
+
<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,300..700&family=Newsreader:ital,opsz,wght@0,6..72,400..600;1,6..72,400..600&family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet" />
|
|
13
|
+
<script type="module" crossorigin>(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))a(n);new MutationObserver(n=>{for(const i of n)if(i.type==="childList")for(const m of i.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&a(m)}).observe(document,{childList:!0,subtree:!0});function o(n){const i={};return n.integrity&&(i.integrity=n.integrity),n.referrerPolicy&&(i.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?i.credentials="include":n.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function a(n){if(n.ep)return;n.ep=!0;const i=o(n);fetch(n.href,i)}})();var es,ue,Ro,nt,Us,jo,zo,ns,Ft,St,Do,Ss,ys,vs,Vt={},$t=[],kr=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,ts=Array.isArray;function st(t,s){for(var o in s)t[o]=s[o];return t}function Cs(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function xr(t,s,o){var a,n,i,m={};for(i in s)i=="key"?a=s[i]:i=="ref"?n=s[i]:m[i]=s[i];if(arguments.length>2&&(m.children=arguments.length>3?es.call(arguments,2):o),typeof t=="function"&&t.defaultProps!=null)for(i in t.defaultProps)m[i]===void 0&&(m[i]=t.defaultProps[i]);return qt(t,m,a,n,null)}function qt(t,s,o,a,n){var i={type:t,props:s,key:o,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:n??++Ro,__i:-1,__u:0};return n==null&&ue.vnode!=null&&ue.vnode(i),i}function de(t){return t.children}function Ut(t,s){this.props=t,this.context=s}function yt(t,s){if(s==null)return t.__?yt(t.__,t.__i+1):null;for(var o;s<t.__k.length;s++)if((o=t.__k[s])!=null&&o.__e!=null)return o.__e;return typeof t.type=="function"?yt(t):null}function wr(t){if(t.__P&&t.__d){var s=t.__v,o=s.__e,a=[],n=[],i=st({},s);i.__v=s.__v+1,ue.vnode&&ue.vnode(i),As(t.__P,i,s,t.__n,t.__P.namespaceURI,32&s.__u?[o]:null,a,o??yt(s),!!(32&s.__u),n),i.__v=s.__v,i.__.__k[i.__i]=i,Oo(a,i,n),s.__e=s.__=null,i.__e!=o&&No(i)}}function No(t){if((t=t.__)!=null&&t.__c!=null)return t.__e=t.__c.base=null,t.__k.some(function(s){if(s!=null&&s.__e!=null)return t.__e=t.__c.base=s.__e}),No(t)}function Ws(t){(!t.__d&&(t.__d=!0)&&nt.push(t)&&!Gt.__r++||Us!=ue.debounceRendering)&&((Us=ue.debounceRendering)||jo)(Gt)}function Gt(){try{for(var t,s=1;nt.length;)nt.length>s&&nt.sort(zo),t=nt.shift(),s=nt.length,wr(t)}finally{nt.length=Gt.__r=0}}function Io(t,s,o,a,n,i,m,d,u,l,h){var c,g,f,b,M,k,y,L=a&&a.__k||$t,N=s.length;for(u=_r(o,s,L,u,N),c=0;c<N;c++)(f=o.__k[c])!=null&&(g=f.__i!=-1&&L[f.__i]||Vt,f.__i=c,k=As(t,f,g,n,i,m,d,u,l,h),b=f.__e,f.ref&&g.ref!=f.ref&&(g.ref&&Es(g.ref,null,f),h.push(f.ref,f.__c||b,f)),M==null&&b!=null&&(M=b),(y=!!(4&f.__u))||g.__k===f.__k?(u=Ho(f,u,t,y),y&&g.__e&&(g.__e=null)):typeof f.type=="function"&&k!==void 0?u=k:b&&(u=b.nextSibling),f.__u&=-7);return o.__e=M,u}function _r(t,s,o,a,n){var i,m,d,u,l,h=o.length,c=h,g=0;for(t.__k=new Array(n),i=0;i<n;i++)(m=s[i])!=null&&typeof m!="boolean"&&typeof m!="function"?(typeof m=="string"||typeof m=="number"||typeof m=="bigint"||m.constructor==String?m=t.__k[i]=qt(null,m,null,null,null):ts(m)?m=t.__k[i]=qt(de,{children:m},null,null,null):m.constructor===void 0&&m.__b>0?m=t.__k[i]=qt(m.type,m.props,m.key,m.ref?m.ref:null,m.__v):t.__k[i]=m,u=i+g,m.__=t,m.__b=t.__b+1,d=null,(l=m.__i=Mr(m,o,u,c))!=-1&&(c--,(d=o[l])&&(d.__u|=2)),d==null||d.__v==null?(l==-1&&(n>h?g--:n<h&&g++),typeof m.type!="function"&&(m.__u|=4)):l!=u&&(l==u-1?g--:l==u+1?g++:(l>u?g--:g++,m.__u|=4))):t.__k[i]=null;if(c)for(i=0;i<h;i++)(d=o[i])!=null&&(2&d.__u)==0&&(d.__e==a&&(a=yt(d)),Fo(d,d));return a}function Ho(t,s,o,a){var n,i;if(typeof t.type=="function"){for(n=t.__k,i=0;n&&i<n.length;i++)n[i]&&(n[i].__=t,s=Ho(n[i],s,o,a));return s}t.__e!=s&&(a&&(s&&t.type&&!s.parentNode&&(s=yt(t)),o.insertBefore(t.__e,s||null)),s=t.__e);do s=s&&s.nextSibling;while(s!=null&&s.nodeType==8);return s}function Mr(t,s,o,a){var n,i,m,d=t.key,u=t.type,l=s[o],h=l!=null&&(2&l.__u)==0;if(l===null&&d==null||h&&d==l.key&&u==l.type)return o;if(a>(h?1:0)){for(n=o-1,i=o+1;n>=0||i<s.length;)if((l=s[m=n>=0?n--:i++])!=null&&(2&l.__u)==0&&d==l.key&&u==l.type)return m}return-1}function Ks(t,s,o){s[0]=="-"?t.setProperty(s,o??""):t[s]=o==null?"":typeof o!="number"||kr.test(s)?o:o+"px"}function Rt(t,s,o,a,n){var i,m;e:if(s=="style")if(typeof o=="string")t.style.cssText=o;else{if(typeof a=="string"&&(t.style.cssText=a=""),a)for(s in a)o&&s in o||Ks(t.style,s,"");if(o)for(s in o)a&&o[s]==a[s]||Ks(t.style,s,o[s])}else if(s[0]=="o"&&s[1]=="n")i=s!=(s=s.replace(Do,"$1")),m=s.toLowerCase(),s=m in t||s=="onFocusOut"||s=="onFocusIn"?m.slice(2):s.slice(2),t.l||(t.l={}),t.l[s+i]=o,o?a?o[St]=a[St]:(o[St]=Ss,t.addEventListener(s,i?vs:ys,i)):t.removeEventListener(s,i?vs:ys,i);else{if(n=="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 t)try{t[s]=o??"";break e}catch{}typeof o=="function"||(o==null||o===!1&&s[4]!="-"?t.removeAttribute(s):t.setAttribute(s,s=="popover"&&o==1?"":o))}}function Vs(t){return function(s){if(this.l){var o=this.l[s.type+t];if(s[Ft]==null)s[Ft]=Ss++;else if(s[Ft]<o[St])return;return o(ue.event?ue.event(s):s)}}}function As(t,s,o,a,n,i,m,d,u,l){var h,c,g,f,b,M,k,y,L,N,W,U,p,w,B,T=s.type;if(s.constructor!==void 0)return null;128&o.__u&&(u=!!(32&o.__u),i=[d=s.__e=o.__e]),(h=ue.__b)&&h(s);e:if(typeof T=="function")try{if(y=s.props,L=T.prototype&&T.prototype.render,N=(h=T.contextType)&&a[h.__c],W=h?N?N.props.value:h.__:a,o.__c?k=(c=s.__c=o.__c).__=c.__E:(L?s.__c=c=new T(y,W):(s.__c=c=new Ut(y,W),c.constructor=T,c.render=Cr),N&&N.sub(c),c.state||(c.state={}),c.__n=a,g=c.__d=!0,c.__h=[],c._sb=[]),L&&c.__s==null&&(c.__s=c.state),L&&T.getDerivedStateFromProps!=null&&(c.__s==c.state&&(c.__s=st({},c.__s)),st(c.__s,T.getDerivedStateFromProps(y,c.__s))),f=c.props,b=c.state,c.__v=s,g)L&&T.getDerivedStateFromProps==null&&c.componentWillMount!=null&&c.componentWillMount(),L&&c.componentDidMount!=null&&c.__h.push(c.componentDidMount);else{if(L&&T.getDerivedStateFromProps==null&&y!==f&&c.componentWillReceiveProps!=null&&c.componentWillReceiveProps(y,W),s.__v==o.__v||!c.__e&&c.shouldComponentUpdate!=null&&c.shouldComponentUpdate(y,c.__s,W)===!1){s.__v!=o.__v&&(c.props=y,c.state=c.__s,c.__d=!1),s.__e=o.__e,s.__k=o.__k,s.__k.some(function(Y){Y&&(Y.__=s)}),$t.push.apply(c.__h,c._sb),c._sb=[],c.__h.length&&m.push(c);break e}c.componentWillUpdate!=null&&c.componentWillUpdate(y,c.__s,W),L&&c.componentDidUpdate!=null&&c.__h.push(function(){c.componentDidUpdate(f,b,M)})}if(c.context=W,c.props=y,c.__P=t,c.__e=!1,U=ue.__r,p=0,L)c.state=c.__s,c.__d=!1,U&&U(s),h=c.render(c.props,c.state,c.context),$t.push.apply(c.__h,c._sb),c._sb=[];else do c.__d=!1,U&&U(s),h=c.render(c.props,c.state,c.context),c.state=c.__s;while(c.__d&&++p<25);c.state=c.__s,c.getChildContext!=null&&(a=st(st({},a),c.getChildContext())),L&&!g&&c.getSnapshotBeforeUpdate!=null&&(M=c.getSnapshotBeforeUpdate(f,b)),w=h!=null&&h.type===de&&h.key==null?Bo(h.props.children):h,d=Io(t,ts(w)?w:[w],s,o,a,n,i,m,d,u,l),c.base=s.__e,s.__u&=-161,c.__h.length&&m.push(c),k&&(c.__E=c.__=null)}catch(Y){if(s.__v=null,u||i!=null)if(Y.then){for(s.__u|=u?160:128;d&&d.nodeType==8&&d.nextSibling;)d=d.nextSibling;i[i.indexOf(d)]=null,s.__e=d}else{for(B=i.length;B--;)Cs(i[B]);bs(s)}else s.__e=o.__e,s.__k=o.__k,Y.then||bs(s);ue.__e(Y,s,o)}else i==null&&s.__v==o.__v?(s.__k=o.__k,s.__e=o.__e):d=s.__e=Sr(o.__e,s,o,a,n,i,m,u,l);return(h=ue.diffed)&&h(s),128&s.__u?void 0:d}function bs(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(bs))}function Oo(t,s,o){for(var a=0;a<o.length;a++)Es(o[a],o[++a],o[++a]);ue.__c&&ue.__c(s,t),t.some(function(n){try{t=n.__h,n.__h=[],t.some(function(i){i.call(n)})}catch(i){ue.__e(i,n.__v)}})}function Bo(t){return typeof t!="object"||t==null||t.__b>0?t:ts(t)?t.map(Bo):st({},t)}function Sr(t,s,o,a,n,i,m,d,u){var l,h,c,g,f,b,M,k=o.props||Vt,y=s.props,L=s.type;if(L=="svg"?n="http://www.w3.org/2000/svg":L=="math"?n="http://www.w3.org/1998/Math/MathML":n||(n="http://www.w3.org/1999/xhtml"),i!=null){for(l=0;l<i.length;l++)if((f=i[l])&&"setAttribute"in f==!!L&&(L?f.localName==L:f.nodeType==3)){t=f,i[l]=null;break}}if(t==null){if(L==null)return document.createTextNode(y);t=document.createElementNS(n,L,y.is&&y),d&&(ue.__m&&ue.__m(s,i),d=!1),i=null}if(L==null)k===y||d&&t.data==y||(t.data=y);else{if(i=i&&es.call(t.childNodes),!d&&i!=null)for(k={},l=0;l<t.attributes.length;l++)k[(f=t.attributes[l]).name]=f.value;for(l in k)f=k[l],l=="dangerouslySetInnerHTML"?c=f:l=="children"||l in y||l=="value"&&"defaultValue"in y||l=="checked"&&"defaultChecked"in y||Rt(t,l,null,f,n);for(l in y)f=y[l],l=="children"?g=f:l=="dangerouslySetInnerHTML"?h=f:l=="value"?b=f:l=="checked"?M=f:d&&typeof f!="function"||k[l]===f||Rt(t,l,f,k[l],n);if(h)d||c&&(h.__html==c.__html||h.__html==t.innerHTML)||(t.innerHTML=h.__html),s.__k=[];else if(c&&(t.innerHTML=""),Io(s.type=="template"?t.content:t,ts(g)?g:[g],s,o,a,L=="foreignObject"?"http://www.w3.org/1999/xhtml":n,i,m,i?i[0]:o.__k&&yt(o,0),d,u),i!=null)for(l=i.length;l--;)Cs(i[l]);d||(l="value",L=="progress"&&b==null?t.removeAttribute("value"):b!=null&&(b!==t[l]||L=="progress"&&!b||L=="option"&&b!=k[l])&&Rt(t,l,b,k[l],n),l="checked",M!=null&&M!=t[l]&&Rt(t,l,M,k[l],n))}return t}function Es(t,s,o){try{if(typeof t=="function"){var a=typeof t.__u=="function";a&&t.__u(),a&&s==null||(t.__u=t(s))}else t.current=s}catch(n){ue.__e(n,o)}}function Fo(t,s,o){var a,n;if(ue.unmount&&ue.unmount(t),(a=t.ref)&&(a.current&&a.current!=t.__e||Es(a,null,s)),(a=t.__c)!=null){if(a.componentWillUnmount)try{a.componentWillUnmount()}catch(i){ue.__e(i,s)}a.base=a.__P=null}if(a=t.__k)for(n=0;n<a.length;n++)a[n]&&Fo(a[n],s,o||typeof t.type!="function");o||Cs(t.__e),t.__c=t.__=t.__e=void 0}function Cr(t,s,o){return this.constructor(t,o)}function Ar(t,s,o){var a,n,i,m;s==document&&(s=document.documentElement),ue.__&&ue.__(t,s),n=(a=!1)?null:s.__k,i=[],m=[],As(s,t=s.__k=xr(de,null,[t]),n||Vt,Vt,s.namespaceURI,n?null:s.firstChild?es.call(s.childNodes):null,i,n?n.__e:s.firstChild,a,m),Oo(i,t,m)}es=$t.slice,ue={__e:function(t,s,o,a){for(var n,i,m;s=s.__;)if((n=s.__c)&&!n.__)try{if((i=n.constructor)&&i.getDerivedStateFromError!=null&&(n.setState(i.getDerivedStateFromError(t)),m=n.__d),n.componentDidCatch!=null&&(n.componentDidCatch(t,a||{}),m=n.__d),m)return n.__E=n}catch(d){t=d}throw t}},Ro=0,Ut.prototype.setState=function(t,s){var o;o=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=st({},this.state),typeof t=="function"&&(t=t(st({},o),this.props)),t&&st(o,t),t!=null&&this.__v&&(s&&this._sb.push(s),Ws(this))},Ut.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),Ws(this))},Ut.prototype.render=de,nt=[],jo=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,zo=function(t,s){return t.__v.__b-s.__v.__b},Gt.__r=0,ns=Math.random().toString(8),Ft="__d"+ns,St="__a"+ns,Do=/(PointerCapture)$|Capture$/i,Ss=0,ys=Vs(!1),vs=Vs(!0);var Er=0;function e(t,s,o,a,n,i){s||(s={});var m,d,u=s;if("ref"in u)for(d in u={},s)d=="ref"?m=s[d]:u[d]=s[d];var l={type:t,props:u,key:o,ref:m,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Er,__i:-1,__u:0,__source:n,__self:i};if(typeof t=="function"&&(m=t.defaultProps))for(d in m)u[d]===void 0&&(u[d]=m[d]);return ue.vnode&&ue.vnode(l),l}var Ct,_e,as,$s,At=0,qo=[],Se=ue,Gs=Se.__b,Ys=Se.__r,Xs=Se.diffed,Js=Se.__c,Qs=Se.unmount,Zs=Se.__;function Ls(t,s){Se.__h&&Se.__h(_e,t,At||s),At=0;var o=_e.__H||(_e.__H={__:[],__h:[]});return t>=o.__.length&&o.__.push({}),o.__[t]}function v(t){return At=1,Lr(Wo,t)}function Lr(t,s,o){var a=Ls(Ct++,2);if(a.t=t,!a.__c&&(a.__=[Wo(void 0,s),function(d){var u=a.__N?a.__N[0]:a.__[0],l=a.t(u,d);u!==l&&(a.__N=[l,a.__[1]],a.__c.setState({}))}],a.__c=_e,!_e.__f)){var n=function(d,u,l){if(!a.__c.__H)return!0;var h=a.__c.__H.__.filter(function(g){return g.__c});if(h.every(function(g){return!g.__N}))return!i||i.call(this,d,u,l);var c=a.__c.props!==d;return h.some(function(g){if(g.__N){var f=g.__[0];g.__=g.__N,g.__N=void 0,f!==g.__[0]&&(c=!0)}}),i&&i.call(this,d,u,l)||c};_e.__f=!0;var i=_e.shouldComponentUpdate,m=_e.componentWillUpdate;_e.componentWillUpdate=function(d,u,l){if(this.__e){var h=i;i=void 0,n(d,u,l),i=h}m&&m.call(this,d,u,l)},_e.shouldComponentUpdate=n}return a.__N||a.__}function te(t,s){var o=Ls(Ct++,3);!Se.__s&&Uo(o.__H,s)&&(o.__=t,o.u=s,_e.__H.__h.push(o))}function ne(t){return At=5,be(function(){return{current:t}},[])}function be(t,s){var o=Ls(Ct++,7);return Uo(o.__H,s)&&(o.__=t(),o.__H=s,o.__h=t),o.__}function ze(t,s){return At=8,be(function(){return t},s)}function Tr(){for(var t;t=qo.shift();){var s=t.__H;if(t.__P&&s)try{s.__h.some(Wt),s.__h.some(ks),s.__h=[]}catch(o){s.__h=[],Se.__e(o,t.__v)}}}Se.__b=function(t){_e=null,Gs&&Gs(t)},Se.__=function(t,s){t&&s.__k&&s.__k.__m&&(t.__m=s.__k.__m),Zs&&Zs(t,s)},Se.__r=function(t){Ys&&Ys(t),Ct=0;var s=(_e=t.__c).__H;s&&(as===_e?(s.__h=[],_e.__h=[],s.__.some(function(o){o.__N&&(o.__=o.__N),o.u=o.__N=void 0})):(s.__h.some(Wt),s.__h.some(ks),s.__h=[],Ct=0)),as=_e},Se.diffed=function(t){Xs&&Xs(t);var s=t.__c;s&&s.__H&&(s.__H.__h.length&&(qo.push(s)!==1&&$s===Se.requestAnimationFrame||(($s=Se.requestAnimationFrame)||Pr)(Tr)),s.__H.__.some(function(o){o.u&&(o.__H=o.u),o.u=void 0})),as=_e=null},Se.__c=function(t,s){s.some(function(o){try{o.__h.some(Wt),o.__h=o.__h.filter(function(a){return!a.__||ks(a)})}catch(a){s.some(function(n){n.__h&&(n.__h=[])}),s=[],Se.__e(a,o.__v)}}),Js&&Js(t,s)},Se.unmount=function(t){Qs&&Qs(t);var s,o=t.__c;o&&o.__H&&(o.__H.__.some(function(a){try{Wt(a)}catch(n){s=n}}),o.__H=void 0,s&&Se.__e(s,o.__v))};var eo=typeof requestAnimationFrame=="function";function Pr(t){var s,o=function(){clearTimeout(a),eo&&cancelAnimationFrame(s),setTimeout(t)},a=setTimeout(o,35);eo&&(s=requestAnimationFrame(o))}function Wt(t){var s=_e,o=t.__c;typeof o=="function"&&(t.__c=void 0,o()),_e=s}function ks(t){var s=_e;t.__c=t.__(),_e=s}function Uo(t,s){return!t||t.length!==s.length||s.some(function(o,a){return o!==t[a]})}function Wo(t,s){return typeof s=="function"?s(t):s}const Yt={en:{"auth.title":"Authentication required","auth.intro":"This dashboard is protected by a bearer token. Paste the value of MEMESH_REMOTE_TOKEN (or the contents of <memeshDir>/remote-token) below.","auth.tokenLabel":"Token","auth.empty":"Token cannot be empty.","auth.invalid":"That token was not accepted. Check it and try again.","auth.submit":"Unlock dashboard","auth.tokenPlaceholder":"paste token here","brand.subtitle":"powered by pcircle.com","header.connected":"Connected","header.disconnected":"Disconnected","header.connecting":"Connecting…","header.memories":"memories","telemetry.title":"LLM activity","telemetry.lastNDays":"last {n}d","telemetry.loading":"loading…","telemetry.empty":"No AI activity in this period yet. Rows appear automatically once the background AI features (like weekly summaries and auto-tagging) run.","telemetry.callsCount":"{n} calls","telemetry.attemptsCount":"{n} attempts","telemetry.successRate":"success","telemetry.medianLatency":"median latency","telemetry.fallbackUsed":"fallback used {n}× ({pct} of calls)","telemetry.byProvider":"by provider","telemetry.byModel":"by model","telemetry.byProject":"by project","telemetry.errors":"errors","tab.graph":"Knowledge Graph","tab.settings":"Settings","tab.home":"Home","tab.memories":"Memories","tab.project":"Project","memories.searchPlaceholder":"Filter as you type — press Enter for ranked search","memories.scopeLabel":"Scope","memories.scopeWork":"Work layer","memories.scopeEvidence":"Evidence","memories.scopeAll":"All","memories.scopeArchived":"Archived","memories.composition":"Composition","memories.rankedBy":"ranked by relevance","memories.backToList":"Back to list","memories.workEmpty":"No work-layer memories yet — goals, decisions, lessons and plans land here as they are captured.","memories.showAll":"Show all memories","memories.expand":"Show details","memories.collapse":"Hide details","home.analyticsTitle":"Analytics","home.analyticsHint":"Health, timeline, patterns and usage — expands on demand","project.selectLabel":"Project","project.selectPrompt":"Pick a project to see its history.","project.empty":"No project memories yet. Work in a git repository with memesh hooks installed and its story will appear here.","guard.sourceLesson":"Source lesson","guard.pattern":"Trigger pattern","guard.message":"Warning it will speak","guard.shouldMatch":"Must trigger on","guard.shouldNotMatch":"Must stay silent on","insights.title":"Memory insights","insights.subtitle":"auto-generated weekly recaps and patterns waiting for review","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"All","insights.refresh":"Refresh","insights.loading":"loading…","insights.emptyPending":"No pending insights. Run `memesh dream run` to generate weekly recaps.","insights.emptyNoLlm":"Configure an LLM provider in Settings to enable weekly recaps and pattern detection.","insights.emptyOther":"Nothing here.","insights.sources":"sources","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"View detail","insights.collapse":"Collapse","insights.accept":"Accept","insights.applying":"Applying…","insights.reject":"Reject","insights.generatedBy":"Generated by","insights.promptVersion":"Prompt version","insights.observations":"Summary observations","insights.tags":"Tags","insights.sourceIds":"Sources","insights.validationWarnings":"Flagged claims (LLM validator)","insights.validationClaim":"Claim","insights.validationReason":"Reason","insights.runDream":"Run weekly recap","insights.runDreamWithValidate":"Run with validator (slower, higher quality)","banner.pendingInsights":"{n} new insight{s} waiting for your review →","banner.dismiss":"Dismiss","banner.viewAll":"View all","pattern.title":"Pattern","pattern.evidenceCount":"{n} evidence","pattern.severity":"Severity","pattern.severity.high":"high","pattern.severity.medium":"medium","pattern.severity.low":"low","pattern.description":"Pattern description","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.active":"active","browse.archived":"archived","browse.refresh":"Refresh","browse.noMatch":"No memories matching","browse.prev":"← Prev","browse.next":"Next →","browse.archive":"Archive","browse.restore":"Restore","browse.confirmArchive":"Archive this memory?","browse.archiveFailed":"Could not archive memory: {message}","browse.restoreFailed":"Could not restore memory: {message}","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","metrics.notMeasured":"Not measured yet","metrics.health":"Health","metrics.healthNote":"Activity, quality, freshness, lessons","metrics.critical":"Critical lessons","metrics.criticalPartial":"of {tagged} classified · {total} lessons total","metrics.criticalAll":"of {total} lessons, all classified","metrics.criticalUnclassified":"{total} lessons, none classified by severity yet","metrics.criticalNoLessons":"No lessons recorded yet","metrics.citation":"Citations","metrics.citationNote":"{cited} of {total} sessions cited a memory","metrics.citationNotMeasured":"Citation tracking starts after your next session","metrics.reused":"Reused this week","metrics.reusedNote":"Approximate — counted from last-access dates","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.entityMeta":"{type} · {confidence}% confidence · {days}d unused","settings.capabilities":"Capabilities","settings.smartMode":"Smart Mode","settings.core":"Core","settings.embeddings":"Embeddings","settings.llmProvider":"LLM Provider","settings.llmOptional.title":"LLM is optional","settings.llmOptional.body":"memesh works without an LLM. The default Core mode covers full-text recall, manual remember/recall, the dashboard, and session capture via hooks.","settings.llmOptional.coreLabel":"Without LLM (Core mode)","settings.llmOptional.coreFeatures":"FTS5 keyword search, manual remember/recall, dashboard, hooks-based session capture","settings.llmOptional.smartLabel":"With LLM (Smart mode)","settings.llmOptional.smartFeatures":"auto lesson_learned from session failures, auto-tagging of new entities, weekly recap + pattern detection","settings.apiKey":"API Key","settings.fallbacks.title":"Fallback providers","settings.fallbacks.explainer":"If your main provider is unavailable, memesh tries these in order until one works.","settings.fallbacks.privacyTitle":"Privacy note","settings.fallbacks.privacyBody":"Adding a cloud provider (OpenAI or Anthropic) means that when your main provider is down, your memory content — which can be private — is sent to that cloud provider. If you run a local provider for privacy, add a cloud fallback only if you accept this.","settings.fallbacks.empty":"No fallback providers yet.","settings.fallbacks.add":"Add fallback provider","settings.fallbacks.providerLabel":"Provider","settings.fallbacks.modelLabel":"Model (optional)","settings.fallbacks.modelPlaceholder":"e.g. gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"A key is saved. Leave blank to keep it.","settings.fallbacks.remove":"Remove","settings.fallbacks.moveUp":"Move up","settings.fallbacks.moveDown":"Move down","settings.fallbacks.priority":"Priority {n}","settings.fallbacks.save":"Save fallback chain","settings.fallbacks.needsKey":"Enter an API key, or this cloud fallback cannot be used.","settings.model":"Model (optional)","settings.save":"Save","settings.saving":"Saving…","settings.saved":"Saved.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Test","settings.testing":"Testing…","settings.testPassed":"✓ Connection OK · {count} models available","settings.testFailed":"Connection test failed","settings.suggested":"suggested","settings.testRequired":"Test connection before saving","settings.language":"Language","settings.searchMode":"Search Mode","settings.none":"None","settings.updates":"Updates","settings.updateChecking":"Checking for updates…","settings.updateUnavailable":"Could not check for updates right now","settings.updateNoSuccessfulChecks":"No successful update checks yet","settings.upToDate":"Up to date","settings.updateAvailable":"Update available","settings.updateStale":"Cached status may be outdated","settings.updateCachedFallback":"Using the last successful cached result","settings.updateDeprecatedNoTarget":"Deprecated — no upgrade target yet","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} is DEPRECATED by maintainers.","settings.updatePartialTitle":"⚠️ Update check partial","settings.updatePartialDescription":"{message}. Deprecation status is unknown for this session — re-run the check while online.","settings.updatePartialSummary":"Partial — deprecation status unknown","settings.updateDeprecatedTargetUnknown":"Deprecated — checking for upgrade target","settings.currentVersion":"Current version","settings.latestVersion":"Latest version","settings.lastChecked":"Last checked","settings.lastAttempted":"Last attempted check","settings.lastSuccessful":"Last successful check","settings.updateSourceFresh":"Fresh check","settings.updateSourceCached":"Using cached result","settings.updateSourceStale":"Using stale cached result","settings.updateSourceUnavailable":"No cached result","settings.updateCommand":"Update command","settings.checkNow":"Check now","settings.updateLastError":"Last check error: {message}","settings.installMethod":"Install method","settings.installNpmGlobal":"npm global install","settings.installNpmLocal":"project-local package install","settings.installSourceCheckout":"source checkout","settings.installUnknown":"unknown","settings.updateGuidanceNpmGlobal":"This install can be updated directly from MeMesh.","settings.updateGuidanceNpmLocal":"Update this install from the project package manager that installed MeMesh.","settings.updateGuidanceSourceCheckout":"Update this source checkout from its repository and rebuild it.","settings.updateGuidanceUnknown":"Update this installation from the tool or workflow that installed MeMesh.","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","graph.interactHint":"Click a node to focus · drag empty area to pan · scroll to zoom","graph.resetView":"Reset view","graph.resetViewHint":"Reset zoom and pan","graph.ageToday":"today","graph.ageDaysAgo":"{count}d ago","graph.ageWeeksAgo":"{count}w ago","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","feedback.submitting":"Gathering diagnostics…","doctorBanner.warnTitleSoft":"memesh has setup notes","doctorBanner.failTitle":"memesh setup is incomplete","doctorBanner.dismiss":"Dismiss","doctorBanner.getHelp":"Get help","doctorBanner.helpHint":"Opens a GitHub issue with the diagnostics pre-filled","doctorBanner.preambleForIssue":"memesh doctor reported the following on my install:","doctorBanner.moreCount":"…and {n} more — run `memesh doctor` for the full list","doctor.label.readme_locale_parity":"README translations","doctor.label.config":"Config file","doctor.label.mcp-config":"MCP connection file","doctor.label.hooks-config":"Hook definitions","doctor.label.hook-scripts":"Hook scripts","doctor.label.hook-wiring":"Connection to Claude Code","doctor.label.hook-activity":"Auto-capture","doctor.label.node-runtime":"Node.js version","doctor.label.native-binding":"SQLite and vector search","doctor.label.shell-cli":"Terminal command","doctor.label.dashboard":"Dashboard files","doctor.label.update-status":"Updates","doctor.label.http-probe":"Local server","doctor.label.skills-manifest":"Bundled files","doctor.label.config_parse":"Config file","doctor.label.embeddings_probe":"Meaning-based search","doctor.label.llm_probe":"AI provider","doctor.label.install-channel":"Install method","doctor.label.fts_segmentation":"Keyword index","doctor.label.vector_index":"Search index","doctor.label.database":"Database","doctor.msg.readme-parity.unreadable.summary":"Could not read README.md: {detail}","doctor.msg.readme-parity.drift.summary":"Some translated READMEs drifted from the English one: {detail}","doctor.msg.readme-parity.drift.fix":"Re-sync the listed READMEs with README.md.","doctor.msg.config.invalid-json.summary":"The config file at {path} is not valid JSON, so it is being ignored.","doctor.msg.config.invalid-json.fix":"Fix or delete {path}, then run `memesh config list` to confirm it loads.","doctor.msg.mcp-config.missing.summary":"The file that connects memesh to Claude Code (.mcp.json) is missing.","doctor.msg.mcp-config.missing.fix":"Reinstall MeMesh to restore it.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json is damaged (not valid JSON), so Claude Code cannot read it.","doctor.msg.mcp-config.invalid-json.fix":"Fix {path} or reinstall MeMesh.","doctor.msg.mcp-config.no-entry.summary":".mcp.json no longer contains the memesh server entry.","doctor.msg.mcp-config.no-entry.fix":"Reinstall MeMesh to restore it.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` starts a file that is not in this install, so every memesh tool inside Claude Code fails to start.","doctor.msg.mcp-config.entry-missing.fix":"Reinstall MeMesh. If you edited `.mcp.json` by hand, point it back at `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json is missing, so automatic memory capture cannot run.","doctor.msg.hooks-config.missing.fix":"Reinstall MeMesh to restore it.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json is damaged (not valid JSON).","doctor.msg.hooks-config.invalid-json.fix":"Fix {path} or reinstall MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json is missing these hook types: {types}. Some automatic capture will not run.","doctor.msg.hooks-config.missing-types.fix":"Restore the shipped hook configuration or reinstall MeMesh.","doctor.msg.hook-scripts.none.summary":"The hook configuration contains no scripts, so nothing can be captured automatically.","doctor.msg.hook-scripts.none.fix":"Reinstall MeMesh.","doctor.msg.hook-scripts.missing.summary":"These hook scripts are missing: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstall MeMesh to restore them.","doctor.msg.hook-scripts.not-executable.summary":"These hook scripts exist but are not allowed to run: {files}","doctor.msg.hook-scripts.not-executable.fix":"Run `chmod +x scripts/hooks/*.js`, or `npm run build` in a source checkout.","doctor.msg.hook-wiring.no-marker.summary":"memesh is not connected to Claude Code yet, so nothing gets remembered automatically.","doctor.msg.hook-wiring.no-marker.fix":"Run `memesh install-hooks` once, then `memesh doctor` to confirm.","doctor.msg.hook-wiring.script-missing.summary":"A wired memesh hook points at {path}, which no longer exists — the agent invokes a missing file on every matching event. Usually residue from an upgrade that retired the hook.","doctor.msg.hook-wiring.script-missing.fix":"Run `memesh install-hooks` to re-wire (it removes retired entries), then restart your agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"The connection record at {path} cannot be read.","doctor.msg.hook-wiring.marker-unreadable.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.marker-malformed.summary":"The connection record is damaged.","doctor.msg.hook-wiring.marker-malformed.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.settings-missing.summary":"The Claude Code settings file ({path}) is gone, so the connection is broken.","doctor.msg.hook-wiring.settings-missing.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} is damaged (not valid JSON).","doctor.msg.hook-wiring.settings-invalid.fix":"Restore it from a backup, or run `memesh install-hooks` to recreate it.","doctor.msg.hook-wiring.entries-removed.summary":"The memesh entries were removed from {path}, so the connection is broken.","doctor.msg.hook-wiring.entries-removed.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.root-moved.summary":"The connection points at {path}, which no longer exists (memesh probably moved).","doctor.msg.hook-wiring.root-moved.fix":"Run `memesh install-hooks` to refresh it.","doctor.msg.hook-activity.never-ran.summary":"No capture hook has run in the {hours} hours since tracking began, even though hook wiring is in place — nothing is being remembered.","doctor.msg.hook-activity.never-ran.fix":"Finish one work session, then run `memesh doctor` again. If it still says no hook has run, run `memesh install-hooks` and restart your agent.","doctor.msg.hook-activity.stale.summary":"The last capture hook ran about {hours} hours ago ({hook}). If you have worked since then, capture has stopped and nothing from those sessions was saved.","doctor.msg.hook-activity.stale.fix":"Restart your agent, end one session, then run `memesh doctor` again. If it does not recover, run `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"The session-summary hook last ran about {hours} hours ago, and no Claude Code writes landed in the last 3 days either. If this machine has moved to another agent (Codex / Gemini), this is expected; if you still use Claude Code here, capture has stopped.","doctor.msg.hook-activity.stale-unconfirmed.fix":"If you still use Claude Code on this machine: restart it, end one session, and re-run `memesh doctor`. If it does not recover, run `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Could not read hook activity from the database: {detail}. Capture health is unknown, which is not the same as healthy.","doctor.msg.hook-activity.query-failed.fix":"Run `memesh doctor --verbose` for the full error, and check that ~/.memesh is readable and not out of disk.","doctor.msg.hook-activity.stale-unknown.summary":"The {hook} hook's last-run timestamp cannot be read (corrupt, or stamped by a machine with a wrong clock). Capture health is unknown, which is not the same as healthy.","doctor.msg.hook-activity.stale-unknown.fix":"End one work session, then run `memesh doctor` again — a fresh run overwrites the bad timestamp.","doctor.msg.hook-activity.disabled.summary":"Automatic capture is turned off (MEMESH_AUTO_CAPTURE or config autoCapture) — deliberately, so hook silence is expected. Re-enable it to resume capturing sessions.","doctor.msg.hook-activity.disabled-env.summary":"Automatic capture is turned off by MEMESH_AUTO_CAPTURE=false in this shell's environment. Doctor can only see its own environment — if your agent runs without this variable, capture there is unaffected.","doctor.msg.hook-activity.not-wired.summary":"No capture hook has ever run — and no capture hook (Stop / PostToolUse / PreCompact) is confirmed wired on this machine, so there is nothing to run.","doctor.msg.hook-activity.not-wired.fix":"If you want automatic capture, run `memesh install-hooks`. If this install is MCP-only (Codex / Gemini), this is expected and safe to ignore.","doctor.msg.hook-activity.stop-silent.summary":"The {hook} hook is stamping, but the session-summary hook has never run once in the {hours} hours since tracking began — session capture may be broken while commit capture hides it.","doctor.msg.hook-activity.stop-silent.fix":"End one work session and run `memesh doctor` again. If session-summary still has not run, run `memesh install-hooks` and restart your agent.","doctor.msg.hook-activity.never-ran-legacy.summary":"No hook has stamped the heartbeat, but {captured} auto-capture memories landed since tracking began — hooks from a version before heartbeat tracking are probably still running.","doctor.msg.hook-activity.never-ran-legacy.fix":"Update the memesh hooks to the current version (plugin installs: `/plugin update memesh`; npm installs: `memesh install-hooks`), then restart your agent.","doctor.msg.node-runtime.too-old.summary":"Your Node.js is older than this package supports. {detail}","doctor.msg.node-runtime.too-old.fix":"Upgrade Node.js to {required} or newer, then run `memesh doctor` again.","doctor.msg.native-binding.node-too-old.summary":"The SQLite built into this version of Node is too old for memesh — it cannot load the part that searches by meaning. The complete version arrived in Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Upgrade Node to 22.13 or newer, then run `memesh doctor` again.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec is not installed. Memories are still saved and found by keyword — only search by meaning is off.","doctor.msg.native-binding.not-installed.fix":"Run `npm install` in the folder that uses @pcircle/memesh.","doctor.msg.native-binding.load-failed.summary":"sqlite-vec could not load: {detail}. Search falls back to keywords only.","doctor.msg.native-binding.load-failed.fix":'Run: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"The `memesh` command is not available in your terminal. Claude Code features still work — this only affects typing `memesh` yourself.","doctor.msg.shell-cli.not-on-path.fix":"Run `npm install -g @pcircle/memesh` to add it. Both installs share the same memory.","doctor.msg.dashboard.missing.summary":"The dashboard files are missing.","doctor.msg.dashboard.missing.fix":"Build them with `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"memesh has not been able to check for newer versions yet.","doctor.msg.update-status.no-cache.fix":"Run `memesh status` once while online — that stores the answer and this notice goes away.","doctor.msg.update-status.deprecated.summary":"Version {version} has been withdrawn by its maintainers: {detail}","doctor.msg.update-status.deprecated.fix":"Update now — run `memesh update` (or follow your install method).","doctor.msg.update-status.deprecation-unknown.summary":"Could not confirm whether version {version} is still safe to use: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Run `memesh status` while online to retry.","doctor.msg.update-status.update-available.summary":"A newer version is available: {latest} (you have {current}).","doctor.msg.update-status.update-available.fix":"Run `memesh update` to upgrade.","doctor.msg.update-status.stale.summary":"Version {version} is current, but the update info is old.","doctor.msg.update-status.stale.fix":"Run `memesh status` while online to refresh it.","doctor.msg.http-probe.bad-status.summary":"The local server at {url} answered with an error (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Restart it with `memesh serve` and check the logs.","doctor.msg.http-probe.no-server.summary":"No local server is running at {url}.","doctor.msg.http-probe.no-server.fix":"Start one with `memesh serve` if you want the dashboard.","doctor.msg.skills-manifest.missing-dev.summary":"No file-integrity manifest found (normal when running from source code).","doctor.msg.skills-manifest.missing-dev.fix":"Run `npm run build` to generate it.","doctor.msg.skills-manifest.unreadable.summary":"The file-integrity manifest cannot be read ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Reinstall: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"The file-integrity manifest is empty.","doctor.msg.skills-manifest.empty.fix":"Reinstall: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Some bundled files do not match what was shipped: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Reinstall: `npm install -g @pcircle/memesh`. If it happens again on a fresh install, report it as a security issue.","doctor.msg.config-parse.not-object.summary":"The config file at {path} is not in the expected format, so every setting is being ignored.","doctor.msg.config-parse.not-object.fix":"Fix or delete {path}, then run `memesh doctor` again.","doctor.msg.config-parse.unreadable.summary":"The config file at {path} cannot be read ({detail}), so every setting is being ignored.","doctor.msg.config-parse.unreadable.fix":"Fix the file, or set it aside: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'Meaning-based search is set to "{provider}" but produced nothing in a test. Keyword search still works.',"doctor.msg.embeddings.empty.fix":"Run `memesh doctor --probe` for detail, or check the provider connection.","doctor.msg.embeddings.threw.summary":'Meaning-based search is set to "{provider}" but failed in a test: {detail}. Keyword search still works.',"doctor.msg.embeddings.threw.fix":"Check the embedding provider is reachable (e.g. run `ollama serve`), or remove embedder config to use keyword-only search.","doctor.msg.llm.unreachable.summary":"The AI provider ({provider}) did not answer: {detail}. AI features are silently doing nothing.","doctor.msg.llm.unreachable.fix":"Check the API key and connection, then run `memesh doctor --probe` again.","doctor.msg.llm.threw.summary":"Testing the AI provider ({provider}) failed: {detail}. AI features are silently doing nothing.","doctor.msg.llm.threw.fix":"Check the API key and connection, then run `memesh doctor --probe` again.","doctor.msg.install-channel.unknown.summary":"Could not tell how memesh was installed.","doctor.msg.install-channel.unknown.fix":"If this is a source checkout, run from the repo root; otherwise reinstall with `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"The keyword index has {count} entries in an old format — some memories only match their exact full text.","doctor.msg.fts.unsegmented.fix":"Run `memesh reindex --fts` to rebuild the index.","doctor.msg.vector-index.stale.summary":"The search index needs a rebuild (the search settings changed).","doctor.msg.vector-index.stale.fix":"Run `memesh reindex` to rebuild it.","doctor.msg.vector-generation.open.summary":"An unfinished index rebuild is holding disk space.","doctor.msg.vector-generation.open.fix":"Run `memesh reindex` to finish it, or `memesh reindex --discard-generation` to reclaim the space.","doctor.msg.database.broken.summary":"The database is not usable: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"{used} used / {total} injected","analytics.loadFailed":"Could not load analytics.","memory.noContent":"(no content)","memory.archivedBadge":"archived","memory.factsCount":"{count} facts","common.error":"Error","common.serverUnreachable":"Could not reach the memesh server.","common.serverUnreachableAction":"Check that `memesh serve` is still running, then reload this page.","common.responseUnreadable":"The server answered, but this page could not read the reply — the dashboard and server may be out of sync.","common.responseUnreadableAction":"Reload the page. If this keeps happening, run `memesh doctor`.","pm.title":"PM Metrics","pm.decisionsPerWeek":"decisions/week","pm.openDecisions":"open decisions (>14d)","pm.orphanRate":"Unlinked memories","pm.relationsTotal":"relations total","pm.stalePlans":"{count} plan(s) not reviewed in 30+ days","common.loading":"Loading…","common.noData":"No data","errors.unknown":"Unknown error","insights.noPreview":"This proposal has no summary text","httpError.auth.missing-bearer":"This server needs an access token. Enter your token to continue.","httpError.auth.invalid-token":"The access token was not accepted. Check it and try again.","httpError.auth.not-configured":"The server has no access token set up. Restart `memesh serve` and check its output.","httpError.validation.bad-body":"The page sent a request the server could not read. Reload the page and try again.","httpError.validation.bad-param":"Part of the request was not valid. Reload the page and try again.","httpError.route.retired":"The server no longer supports this action — the page and server may be different versions. Reload the page.","httpError.route.not-found":"The server does not know this request — the page and server may be different versions. Reload the page.","httpError.resource.not-found":"That item no longer exists on the server. Refresh the list.","httpError.payload.too-large":"The data sent was too large (over 1 MB). Try a smaller batch.","httpError.operation.failed":"The server could not complete this action.","httpError.llm.not-configured":"No AI provider is set up. Add one in Settings first.","httpError.rate.limited":"Too many requests in a short time. Wait a moment and try again.","httpError.server.internal":"The server hit an unexpected error.","settings.testError.auth":"The API key was rejected. Check the key and try again.","settings.testError.network":"Could not reach the provider. Check your internet connection.","settings.testError.no_models":"The provider answered but returned no usable models.","settings.testError.bad_host":"The Ollama address must be on this machine (localhost).","settings.testError.http":"The provider returned an error (HTTP {status}).","settings.testError.unknown":"The test failed for an unknown reason.","time.justNow":"Just now","time.hoursAgo":"{count}h ago","time.today":"Today","time.yesterday":"Yesterday","time.daysAgo":"{count}d ago","time.lastWeek":"Last week","time.weeksAgo":"{count}w ago","time.lastMonth":"Last month","time.monthsAgo":"{count}mo ago","memory.access.frequent":"Frequent · {count} recalls","memory.access.recalls":"{count} recalls","memory.access.never":"Never recalled","cluster.knowledge":"Knowledge","cluster.activity":"Activity","cluster.session":"Sessions","cluster.reference":"Reference","cluster.all":"All","browse.filterTime":"Time","browse.filterValue":"Value","browse.filterProject":"Project","browse.filterSort":"Sort","browse.timeToday":"Today","browse.timeWeek":"This week","browse.timeMonth":"This month","browse.timeOlder":"Older","browse.valueRecalled":"✓ Used","browse.valueNever":"Never recalled","browse.sortMostRecalled":"Most recalled","browse.sortRecent":"Recently used","browse.sortCreated":"Created","browse.emptyFilter":"No memories in this category — try a different filter","lessons.stepsLabel":"steps","lessons.commitsCount":"{count} commits","lessons.unstructured":"(No structured fields — see raw memory)","lessons.moreItems":"+{count} more","roadmap.title":"Project Roadmap","roadmap.summary":"{count} memories · {first} → {last}","roadmap.switchToList":"↩ List view","roadmap.switchToRoadmap":"🗺️ Roadmap view","roadmap.emptyProject":"No memories in this project yet.","loop.label":"Memory loop","loop.subtitleHas":"knowledge memories reused in the past 7 days","loop.subtitleNone":"No knowledge memories reused this week — try recalling a lesson","loop.approxNote":"Approximation — full tracking starts after upgrade.","loop.sparkLabel":"Last 30 days","roadmap.milestones":"Milestones","roadmap.keyLessons":"Key lessons","radar.title":"Knowledge coverage radar","radar.caption":"Active knowledge memories (session and commit excluded)","radar.axis.lessons":"Lessons","radar.axis.decisions":"Decisions","radar.axis.patterns":"Patterns","radar.axis.bugs":"Bug fixes","radar.axis.processes":"Processes","radar.axis.architecture":"Architecture","ageMatrix.title":"Memory age distribution","ageMatrix.low":"Low","ageMatrix.high":"High","ageMatrix.legend":"colour depth = memory density","ageMatrix.typeColumn":"Type","header.signalModeOn":"Signal","header.signalModeOff":"All","header.signalModeOnHint":"Hiding session and commit noise. Click to show everything.","header.signalModeOffHint":"Showing all memories including session and commit noise. Click to hide noise.","roadmap.phases":"Phases","onboarding.title":"Welcome to MeMesh","onboarding.body":"Your memory store is empty. Start with a curated 30-entity tour or stash your first lesson.","onboarding.llmHint":"No LLM required. Everything below works on FTS5 alone. An LLM is optional for auto-lesson generation — configure later in Settings.","onboarding.seedButton":"Try the demo tour","onboarding.seedingButton":"Seeding…","onboarding.seedHint":"Adds 30 memories you can wipe later — no terminal needed","onboarding.cliReference":"Prefer the CLI?","onboarding.hintDemo":"Seeds 30 demo memories you can wipe later","onboarding.hintReset":"Removes everything tagged metadata.demo","onboarding.resetButton":"Reset demo","onboarding.resettingButton":"Resetting…","onboarding.resetConfirm":"Remove all demo memories? Real entries you saved will be kept.","onboarding.dismiss":"Dismiss","common.serverError":"The server reported an error (HTTP {status}). Try again — if it keeps happening, run `memesh doctor`.","emptyLibrary.title":"Your memory is empty","emptyLibrary.body":"Nothing is stored here yet. Load the 30-entry demo tour to see how MeMesh works — you can wipe it later with one click.","browse.truncated":"showing the first {shown} of {total} memories — use search or filters to reach the rest","browse.truncatedUnknownTotal":"showing the first {shown} memories — the total is unavailable, so there may be more","graph.cappedNote":"Showing the top {shown} of {total} entities (most recalled first) so the graph stays responsive.","settings.testStoredKeyHint":"Leave the field empty to test the key that is already saved.","ageMatrix.bucket.week":"This week","ageMatrix.bucket.month":"This month","ageMatrix.bucket.quarter":"This quarter","ageMatrix.bucket.older":"Older","settings.behaviourTitle":"Behaviour","settings.autoUpdateLabel":"Auto-update policy","settings.autoUpdateOff":"Off — manual only","settings.autoUpdatePatch":"Patch — auto-apply X.Y.Z+1","settings.autoUpdateMinor":"Minor — auto-apply X.Y+1.0","settings.autoUpdateMajor":"Major — auto-apply any bump","settings.autoUpdateHint":"Triggered after every session ends. Env MEMESH_AUTO_UPDATE wins when set.","errors.timeout":"Request timed out","type.lesson_learned":"Lesson","type.lesson":"Lesson","type.mistake":"Mistake","type.decision":"Decision","type.architecture_decision":"Arch decision","type.design_decision":"Design decision","type.pattern":"Pattern","type.technical_pattern":"Tech pattern","type.best_practice":"Best practice","type.bug_fix":"Bug fix","type.verification_result":"Verification","type.test_result":"Test result","type.process":"Process","type.architecture":"Architecture","type.infrastructure":"Infrastructure","type.feature":"Feature","type.release":"Release","type.refactoring":"Refactoring","type.commit":"Commit","type.session_keypoint":"Session keypoint","type.session_identity":"Session identity","type.session-insight":"Session insight","type.session-summary":"Session summary","type.session-identity":"Session identity","type.weekly_summary":"Weekly summary","type.weekly-summary":"Weekly summary","type.note":"Note","type.plan":"Plan","type.knowledge":"Knowledge","type.workflow_checkpoint":"Workflow milestone","type.concept":"Concept","type.tool":"Tool","type.person":"Person","relation.relates_to":"relates to","relation.related-to":"related to","relation.depends_on":"depends on","relation.implements":"implements","relation.learned_from":"learned from","relation.supersedes":"supersedes","relation.contradicts":"contradicts","relation.follows":"follows","relation.belongs-to-project":"belongs to project","relation.evidences":"evidences","relation.co-created":"co-created","relation.shares-name-tokens":"shares name tokens","patterns.day.0":"Sunday","patterns.day.1":"Monday","patterns.day.2":"Tuesday","patterns.day.3":"Wednesday","patterns.day.4":"Thursday","patterns.day.5":"Friday","patterns.day.6":"Saturday","telemetry.flow.dreamer":"Weekly recap (dreamer)","telemetry.flow.pattern_detector":"Pattern detector","telemetry.flow.digest_validator":"Digest validator","telemetry.flow.guard_proposer":"Guard proposer","telemetry.flow.auto_tagger":"Auto-tagger","telemetry.flow.failure_analyzer":"Failure analyzer","telemetry.flow.transcript_extractor":"Transcript miner","telemetry.flow.conflict_judge":"Conflict judge","telemetry.errorClass.auth":"auth rejected","telemetry.errorClass.rate_limit":"rate limited","telemetry.errorClass.upstream":"provider outage","telemetry.errorClass.bad_request":"bad request","telemetry.errorClass.network":"network","telemetry.errorClass.parse":"unreadable reply","telemetry.errorClass.unknown":"unknown","lessons.severity.critical":"Critical","lessons.severity.major":"Major","lessons.severity.minor":"Minor","memory.tooltip.project":"Project","memory.tooltip.recalled":"Recalled {count} times","memory.tooltip.hasRelations":"Linked to {count} other memories","memory.tooltip.createdAt":"Created {date}","graph.layerLabel":"Graph layer","graph.layerWork":"Work","graph.layerAll":"Everything","graph.layerWorkHint":"Decisions, lessons and plans — what the work was.","graph.layerAllHint":"Every memory memesh has stored, including mechanical capture.","graph.layerFellBack":"Fewer than {min} work items so far, so the full graph is shown instead. Record decisions and lessons and this view fills in.","graph.evidenceFor":"Evidence for {node}","graph.evidenceClose":"Close","graph.evidenceLoading":"Loading evidence…","graph.evidenceFailed":"Could not load the evidence for this item.","graph.evidenceEmpty":"No evidence linked to this item yet. Run `memesh kg backfill` to draw those links from commits and session captures.","graph.evidenceTruncated":"Showing the {shown} most recent; more exist.","graph.drift":"Drift","graph.driftHint":"Colour nodes by age: red = stale, green = recently used","common.unknown":"unknown","insights.entitiesCount":"{n} entities","roadmap.viewToggle":"Roadmap view","roadmap.viewTree":"Tree","roadmap.viewMindmap":"Mindmap","roadmap.mindmapNeedsPhases":"The mindmap needs at least 3 memories within a 7-day window.","roadmap.activePhase":"active","roadmap.entryCount":"{count} entry","roadmap.entriesCount":"{count} entries","roadmap.otherGroup":"Other ({count})","roadmap.lowSignalHidden":"({count} low-signal hidden)","roadmap.resetHint":"Reset zoom and pan (double-clicking the background also resets)","roadmap.zoomHint":"scroll to zoom · drag to pan · {pct}%","roadmap.moreEntities":"+{count} more","roadmap.viewDecisions":"Decisions","roadmap.densityTitle":"Capture density by category","roadmap.densityNote":"what memesh captured — not everything that happened","roadmap.lineageSupersedes":"{n} superseded","roadmap.lineageConflicts":"{n} unresolved conflicts","adr.empty":'No decisions recorded for this project yet. Record one with type "decision" and it appears here with its history.',"adr.statusActive":"active","adr.statusSuperseded":"superseded","adr.supersedes":"supersedes","adr.supersededBy":"superseded by","nav.ariaLabel":"Dashboard sections","feedback.descLabel":"Feedback description","graph.canvasA11y":"Knowledge graph, drawn on a canvas: {entities} entities, {relations} relations, {orphans} unconnected. Use the type filters and search above for a non-visual view."},"zh-TW":{"auth.title":"需要驗證","auth.intro":"此儀表板受 bearer token 保護。請在下方貼上 MEMESH_REMOTE_TOKEN 的值(或 <memeshDir>/remote-token 檔案的內容)。","auth.tokenLabel":"Token","auth.empty":"Token 不能為空。","auth.invalid":"這個權杖沒有被接受,請檢查後再試一次。","auth.submit":"解鎖儀表板","auth.tokenPlaceholder":"在這裡貼上 token","brand.subtitle":"powered by pcircle.com","header.connected":"已連線","header.disconnected":"已斷線","header.connecting":"連線中…","header.memories":"筆記憶","telemetry.title":"LLM 活動","telemetry.lastNDays":"近 {n} 天","telemetry.loading":"載入中…","telemetry.empty":"這段期間還沒有 AI 活動。當背景 AI 功能(例如每週摘要、自動標記)執行後,這裡會自動出現紀錄。","telemetry.callsCount":"{n} 次呼叫","telemetry.attemptsCount":"{n} 次嘗試","telemetry.successRate":"成功率","telemetry.medianLatency":"延遲中位數","telemetry.fallbackUsed":"啟用備援 {n} 次(佔呼叫的 {pct})","telemetry.byProvider":"依供應商","telemetry.byModel":"依模型","telemetry.byProject":"依專案","telemetry.errors":"錯誤","insights.title":"memesh 為你做了什麼","insights.subtitle":"自動產生的週報整理與發現的模式,等你審閱","insights.statPending":"待審","insights.statApplied":"已採用","insights.statRejected":"已拒絕","insights.filter.pending":"待審","insights.filter.applied":"已採用","insights.filter.rejected":"已拒絕","insights.filter.all":"全部","insights.refresh":"重新整理","insights.loading":"讀取中…","insights.emptyPending":"目前沒有待審 insight。可執行 `memesh dream run` 產生週報整理。","insights.emptyNoLlm":"到設定頁設定 LLM 服務,就能開啟每週整理和模式偵測。","insights.emptyOther":"沒有資料。","insights.sources":"來源","insights.status.pending":"待審","insights.status.applied":"已採用","insights.status.rejected":"已拒絕","insights.viewDetail":"查看詳情","insights.collapse":"收合","insights.accept":"採用","insights.applying":"套用中…","insights.reject":"拒絕","insights.generatedBy":"產生模型","insights.promptVersion":"Prompt 版本","insights.observations":"摘要觀察","insights.tags":"標籤","insights.sourceIds":"來源實體","insights.validationWarnings":"可疑陳述(LLM 驗證器)","insights.validationClaim":"陳述","insights.validationReason":"原因","insights.runDream":"執行週報","insights.runDreamWithValidate":"執行(含驗證器,較慢但品質更高)","banner.pendingInsights":"有 {n} 則新洞察等你審閱 →","banner.dismiss":"關閉","banner.viewAll":"查看全部","pattern.title":"模式","pattern.evidenceCount":"{n} 個證據","pattern.severity":"嚴重度","pattern.severity.high":"高","pattern.severity.medium":"中","pattern.severity.low":"低","pattern.description":"模式說明","tab.graph":"知識圖譜","tab.settings":"設定","tab.home":"首頁","tab.memories":"記憶","tab.project":"專案","memories.searchPlaceholder":"輸入即時篩選 — 按 Enter 依相關度排序搜尋","memories.scopeLabel":"範圍","memories.scopeWork":"工作層","memories.scopeEvidence":"證據","memories.scopeAll":"全部","memories.scopeArchived":"已封存","memories.composition":"組成","memories.rankedBy":"依相關度排序","memories.backToList":"返回列表","memories.workEmpty":"還沒有工作層記憶 — 目標、決策、教訓與計畫被記錄後會出現在這裡。","memories.showAll":"顯示所有記憶","memories.expand":"顯示詳情","memories.collapse":"隱藏詳情","home.analyticsTitle":"分析","home.analyticsHint":"健康度、時間軸、模式與使用情況 — 需要時再展開","project.selectLabel":"專案","project.selectPrompt":"選擇一個專案即可查看它的歷程。","project.empty":"還沒有專案記憶。在裝有 memesh hook 的 git 儲存庫中工作,它的故事就會出現在這裡。","guard.sourceLesson":"來源教訓","guard.pattern":"觸發樣式","guard.message":"將發出的警告","guard.shouldMatch":"必須觸發於","guard.shouldNotMatch":"必須靜默於","search.button":"搜尋","search.searching":"搜尋中…","search.results":"個結果","search.result":"個結果","search.noResults":"找不到符合的結果:","search.facts":"筆事實","browse.title":"所有記憶","browse.active":"使用中","browse.archived":"已封存","browse.refresh":"重新整理","browse.noMatch":"找不到符合的記憶:","browse.prev":"← 上一頁","browse.next":"下一頁 →","browse.archive":"封存","browse.restore":"還原","browse.confirmArchive":"確定要封存此記憶?","browse.archiveFailed":"封存失敗:{message}","browse.restoreFailed":"還原失敗:{message}","analytics.totalMemories":"記憶總數","analytics.knowledgeFacts":"知識事實","analytics.connections":"關聯","analytics.topics":"主題","analytics.insights":"洞察","analytics.thisWeek":"本週","analytics.new":"筆新增","analytics.stale":"閒置(30 天以上未使用)","analytics.archivedLabel":"已封存","analytics.mostRecalled":"最常查閱","health.title":"記憶健康度","metrics.notMeasured":"尚未量測","metrics.health":"健康度","metrics.healthNote":"活躍度、品質、新鮮度、教訓","metrics.critical":"嚴重教訓","metrics.criticalPartial":"在 {tagged} 筆已分類中 · 共 {total} 筆教訓","metrics.criticalAll":"共 {total} 筆教訓,全數已分類","metrics.criticalUnclassified":"{total} 筆教訓,尚未依嚴重度分類","metrics.criticalNoLessons":"尚未記錄任何教訓","metrics.citation":"引用率","metrics.citationNote":"{total} 次工作階段中有 {cited} 次引用了記憶","metrics.citationNotMeasured":"引用追蹤會在下次工作階段開始計算","metrics.reused":"本週被重用","metrics.reusedNote":"近似值——以最後存取時間推估","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.entityMeta":"{type} · 信心度 {confidence}% · 已閒置 {days} 天","settings.capabilities":"功能狀態","settings.smartMode":"智慧模式","settings.core":"基礎","settings.embeddings":"嵌入模型","settings.llmProvider":"LLM 提供者","settings.llmOptional.title":"LLM 是選用的","settings.llmOptional.body":"memesh 不需要 LLM 也能運作。預設的核心模式已涵蓋全文回憶、手動 remember/recall、儀表板,以及透過 hook 自動捕捉 session。","settings.llmOptional.coreLabel":"沒有 LLM(核心模式)","settings.llmOptional.coreFeatures":"FTS5 關鍵字搜尋、手動 remember/recall、儀表板、hook 自動捕捉 session","settings.llmOptional.smartLabel":"有 LLM(智慧模式)","settings.llmOptional.smartFeatures":"自動從 session 失敗萃取 lesson_learned、新 entity 自動標籤、週報整理 + 模式發現","settings.apiKey":"API 金鑰","settings.fallbacks.title":"備援供應商","settings.fallbacks.explainer":"當主要供應商無法使用時,memesh 會依序嘗試這些供應商,直到其中一個成功。","settings.fallbacks.privacyTitle":"隱私提醒","settings.fallbacks.privacyBody":"加入雲端供應商(OpenAI 或 Anthropic)代表:當主要供應商無法使用時,你的記憶內容(可能是私密的)會被送到該雲端供應商。如果你為了隱私而使用本機供應商,請在接受這個取捨後再加入雲端備援。","settings.fallbacks.empty":"尚未設定備援供應商。","settings.fallbacks.add":"新增備援供應商","settings.fallbacks.providerLabel":"供應商","settings.fallbacks.modelLabel":"模型(選填)","settings.fallbacks.modelPlaceholder":"例如 gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"已儲存金鑰。留空即可保留。","settings.fallbacks.remove":"移除","settings.fallbacks.moveUp":"上移","settings.fallbacks.moveDown":"下移","settings.fallbacks.priority":"優先順序 {n}","settings.fallbacks.save":"儲存備援順序","settings.fallbacks.needsKey":"請輸入 API 金鑰,否則此雲端備援無法使用。","settings.model":"模型(選填)","settings.save":"儲存","settings.saving":"儲存中…","settings.saved":"已儲存","settings.removeProvider":"移除 LLM 設定","settings.removeProviderHint":"移除 apiKey 和 model 設定。將回退到環境變數自動偵測或 Core Mode(無 LLM)。","settings.removeProviderConfirm":"確定要移除已配置的 LLM provider?這會清除已儲存的 API key 和 model 設定。memesh 將回退到環境變數自動偵測(ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST)或在沒有任何憑證時以 Core Mode 運作。","settings.providerRemoved":"已移除 provider。memesh 現以 Core Mode 或環境變數自動偵測運作。","settings.test":"測試連線","settings.testing":"測試中…","settings.testPassed":"✓ 連線成功 · 找到 {count} 個可用模型","settings.testFailed":"連線測試失敗","settings.suggested":"推薦","settings.testRequired":"請先測試連線後再儲存","settings.language":"語言","settings.searchMode":"搜尋模式","settings.none":"無","settings.updates":"更新","settings.updateChecking":"正在檢查更新…","settings.updateUnavailable":"目前無法檢查更新","settings.updateNoSuccessfulChecks":"目前還沒有成功的更新檢查紀錄","settings.upToDate":"已是最新版本","settings.updateAvailable":"有可用更新","settings.updateStale":"目前顯示的是可能過期的快取狀態","settings.updateCachedFallback":"目前使用上次成功的快取結果","settings.updateDeprecatedNoTarget":"已停用 — 暫無可升級目標","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} 已被維護者標示為停用 (DEPRECATED)。","settings.updatePartialTitle":"⚠️ 更新檢查未完整","settings.updatePartialDescription":"{message}。本次無法確認停用狀態 — 待網路恢復後請重新檢查。","settings.updatePartialSummary":"部分檢查 — 停用狀態未確認","settings.updateDeprecatedTargetUnknown":"已停用 — 升級目標查詢中","settings.currentVersion":"目前版本","settings.latestVersion":"最新版本","settings.lastChecked":"上次檢查","settings.lastAttempted":"上次嘗試檢查","settings.lastSuccessful":"上次成功檢查","settings.updateSourceFresh":"即時檢查","settings.updateSourceCached":"使用快取結果","settings.updateSourceStale":"使用過期快取結果","settings.updateSourceUnavailable":"沒有可用快取","settings.updateCommand":"更新指令","settings.checkNow":"立即檢查","settings.updateLastError":"上次檢查錯誤:{message}","settings.installMethod":"安裝方式","settings.installNpmGlobal":"npm 全域安裝","settings.installNpmLocal":"專案內套件安裝","settings.installSourceCheckout":"原始碼工作目錄","settings.installUnknown":"未知","settings.updateGuidanceNpmGlobal":"這個安裝可直接透過 MeMesh 更新。","settings.updateGuidanceNpmLocal":"請用安裝此套件的專案套件管理工具來更新。","settings.updateGuidanceSourceCheckout":"請從原始碼儲存庫更新這份工作目錄並重新建置。","settings.updateGuidanceUnknown":"請使用安裝 MeMesh 時的工具或工作流程來更新這個安裝。","graph.entities":"實體","graph.relations":"關聯","graph.orphans":"孤立節點","graph.search":"搜尋節點…","graph.matches":"個符合","graph.focusMode":"聚焦","graph.showAll":"顯示全部","graph.clickHint":"點擊節點以聚焦","graph.interactHint":"點擊節點聚焦 · 拖曳空白處平移 · 滾輪縮放","graph.resetView":"重設視圖","graph.resetViewHint":"重設縮放與位置","graph.ageToday":"今天","graph.ageDaysAgo":"{count} 天前","graph.ageWeeksAgo":"{count} 週前","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","feedback.submitting":"收集診斷資訊中…","doctorBanner.warnTitleSoft":"memesh 有幾條設定提醒","doctorBanner.failTitle":"memesh 設定不完整","doctorBanner.dismiss":"關閉","doctorBanner.getHelp":"取得協助","doctorBanner.helpHint":"會開啟一個已填好診斷資訊的 GitHub issue","doctorBanner.preambleForIssue":"memesh doctor 在我的安裝上回報以下狀況:","doctorBanner.moreCount":"…還有 {n} 條——執行 `memesh doctor` 看完整清單","doctor.label.readme_locale_parity":"README 翻譯同步","doctor.label.config":"設定檔","doctor.label.mcp-config":"MCP 連線設定檔","doctor.label.hooks-config":"Hook 定義檔","doctor.label.hook-scripts":"Hook 腳本","doctor.label.hook-wiring":"與 Claude Code 的連接","doctor.label.hook-activity":"自動記錄","doctor.label.node-runtime":"Node.js 版本","doctor.label.native-binding":"SQLite 與向量搜尋","doctor.label.shell-cli":"終端機指令","doctor.label.dashboard":"儀表板檔案","doctor.label.update-status":"版本更新","doctor.label.http-probe":"本機伺服器","doctor.label.skills-manifest":"內附檔案","doctor.label.config_parse":"設定檔","doctor.label.embeddings_probe":"語意搜尋","doctor.label.llm_probe":"AI 服務","doctor.label.install-channel":"安裝方式","doctor.label.fts_segmentation":"關鍵字索引","doctor.label.vector_index":"搜尋索引","doctor.label.database":"資料庫","doctor.msg.readme-parity.unreadable.summary":"讀不到 README.md:{detail}","doctor.msg.readme-parity.drift.summary":"部分翻譯版 README 跟英文版結構不同步:{detail}","doctor.msg.readme-parity.drift.fix":"把列出的 README 跟 README.md 重新對齊。","doctor.msg.config.invalid-json.summary":"{path} 的設定檔不是有效的 JSON,目前整份被忽略。","doctor.msg.config.invalid-json.fix":"修好或刪掉 {path},再執行 `memesh config list` 確認能載入。","doctor.msg.mcp-config.missing.summary":"把 memesh 接上 Claude Code 的檔案(.mcp.json)不見了。","doctor.msg.mcp-config.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.mcp-config.invalid-json.summary":".mcp.json 壞掉了(不是有效的 JSON),Claude Code 讀不到它。","doctor.msg.mcp-config.invalid-json.fix":"修好 {path},或重新安裝 MeMesh。","doctor.msg.mcp-config.no-entry.summary":".mcp.json 裡的 memesh 伺服器設定不見了。","doctor.msg.mcp-config.no-entry.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` 要啟動的檔案不在這份安裝裡,所以 Claude Code 裡的每個 memesh 工具都起不來。","doctor.msg.mcp-config.entry-missing.fix":"重新安裝 MeMesh。如果你手動改過 `.mcp.json`,把它指回 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json 不見了,自動記憶功能跑不起來。","doctor.msg.hooks-config.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json 壞掉了(不是有效的 JSON)。","doctor.msg.hooks-config.invalid-json.fix":"修好 {path},或重新安裝 MeMesh。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json 少了這些 hook 類型:{types}。部分自動記錄不會執行。","doctor.msg.hooks-config.missing-types.fix":"還原出廠的 hook 設定,或重新安裝 MeMesh。","doctor.msg.hook-scripts.none.summary":"Hook 設定裡沒有任何腳本,什麼都不會被自動記錄。","doctor.msg.hook-scripts.none.fix":"重新安裝 MeMesh。","doctor.msg.hook-scripts.missing.summary":"這些 hook 腳本不見了:{files}","doctor.msg.hook-scripts.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.hook-scripts.not-executable.summary":"這些 hook 腳本存在但沒有執行權限:{files}","doctor.msg.hook-scripts.not-executable.fix":"執行 `chmod +x scripts/hooks/*.js`;原始碼安裝則跑 `npm run build`。","doctor.msg.hook-wiring.no-marker.summary":"memesh 還沒接上 Claude Code,所以不會自動記住任何東西。","doctor.msg.hook-wiring.no-marker.fix":"執行一次 `memesh install-hooks` 完成連接,再用 `memesh doctor` 確認。","doctor.msg.hook-wiring.script-missing.summary":"已接線的 memesh hook 指向 {path},但這個檔案已不存在——agent 每次觸發對應事件都會呼叫一個不存在的檔案。通常是升級移除某個 hook 後留下的殘留。","doctor.msg.hook-wiring.script-missing.fix":"執行 `memesh install-hooks` 重新接線(它會移除已退役的項目),然後重啟你的 agent。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} 的連接紀錄讀不到。","doctor.msg.hook-wiring.marker-unreadable.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.marker-malformed.summary":"連接紀錄壞掉了。","doctor.msg.hook-wiring.marker-malformed.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 的設定檔({path})不見了,連接已中斷。","doctor.msg.hook-wiring.settings-missing.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} 壞掉了(不是有效的 JSON)。","doctor.msg.hook-wiring.settings-invalid.fix":"從備份還原,或用 `memesh install-hooks` 重建。","doctor.msg.hook-wiring.entries-removed.summary":"{path} 裡的 memesh 設定被移除了,連接已中斷。","doctor.msg.hook-wiring.entries-removed.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.root-moved.summary":"連接指向的 {path} 已經不存在(memesh 可能被搬走了)。","doctor.msg.hook-wiring.root-moved.fix":"執行 `memesh install-hooks` 更新路徑。","doctor.msg.hook-activity.never-ran.summary":"從開始追蹤到現在 {hours} 小時,沒有任何擷取 hook 跑過——而 hook 接線是好的,代表它們該跑卻沒跑,沒有任何東西被記下來。","doctor.msg.hook-activity.never-ran.fix":"完整用一次工作階段,再跑 `memesh doctor`。如果還是說沒有 hook 跑過,執行 `memesh install-hooks` 然後重啟 agent。","doctor.msg.hook-activity.stale.summary":"最後一次擷取 hook 是大約 {hours} 小時前跑的({hook})。如果你這段時間有在工作,代表擷取已經停了,那些工作階段的內容都沒被存下來。","doctor.msg.hook-activity.stale.fix":"重啟 agent,結束一次工作階段,再跑 `memesh doctor`。如果沒恢復,執行 `memesh install-hooks`。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary hook 上次執行大約在 {hours} 小時前,而且過去 3 天也沒有任何 Claude Code 的寫入。如果這台機器已改用其他 agent(Codex / Gemini),這是正常的;如果你在這裡仍使用 Claude Code,擷取已經停了。","doctor.msg.hook-activity.stale-unconfirmed.fix":"如果這台機器仍在使用 Claude Code:重啟它、結束一個 session,再執行一次 `memesh doctor`。若仍未恢復,執行 `memesh install-hooks`。","doctor.msg.hook-activity.query-failed.summary":"讀不到 hook 活動紀錄:{detail}。擷取狀態現在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.query-failed.fix":"用 `memesh doctor --verbose` 看完整錯誤,並確認 ~/.memesh 讀得到、磁碟沒滿。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} hook 的最後執行時間讀不出來(資料壞了,或是被時鐘不準的機器蓋的章)。擷取狀態現在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.stale-unknown.fix":"結束一次工作階段後再跑 `memesh doctor`——新的一次執行會把壞掉的時間蓋掉。","doctor.msg.hook-activity.disabled.summary":"自動擷取已關閉(MEMESH_AUTO_CAPTURE 或設定檔的 autoCapture)——這是刻意設定,hook 沒動靜是預期中的。想恢復擷取就把它打開。","doctor.msg.hook-activity.disabled-env.summary":"自動擷取被這個 shell 環境中的 MEMESH_AUTO_CAPTURE=false 關閉了。doctor 只能看到自己所在的環境——如果你的 agent 執行時沒有這個變數,那邊的擷取不受影響。","doctor.msg.hook-activity.not-wired.summary":"從來沒有任何擷取 hook 執行過——而且這台機器上沒有確認接好任何擷取 hook(Stop / PostToolUse / PreCompact),所以本來就沒有東西可以執行。","doctor.msg.hook-activity.not-wired.fix":"想要自動擷取就執行 `memesh install-hooks`。如果這個安裝只走 MCP(Codex / Gemini),這是正常狀態,可以放心忽略。","doctor.msg.hook-activity.stop-silent.summary":"{hook} hook 有在蓋章,但從開始追蹤到現在 {hours} 小時,session-summary hook 一次都沒跑過——session 擷取可能壞了,只是被 commit 擷取蓋住看不見。","doctor.msg.hook-activity.stop-silent.fix":"完整結束一次工作階段再跑 `memesh doctor`。如果 session-summary 還是沒跑過,執行 `memesh install-hooks` 然後重啟 agent。","doctor.msg.hook-activity.never-ran-legacy.summary":"沒有任何 hook 蓋過心跳章,但追蹤開始以來已存入 {captured} 筆自動擷取的記憶——很可能是心跳追蹤之前版本的 hook 還在執行。","doctor.msg.hook-activity.never-ran-legacy.fix":"把 memesh hooks 更新到目前版本(plugin 安裝:`/plugin update memesh`;npm 安裝:`memesh install-hooks`),然後重啟 agent。","doctor.msg.node-runtime.too-old.summary":"你的 Node.js 版本比這個套件支援的還舊。{detail}","doctor.msg.node-runtime.too-old.fix":"把 Node.js 升級到 {required} 以上,再執行 `memesh doctor`。","doctor.msg.native-binding.node-too-old.summary":"這個版本的 Node 內建的 SQLite 對 memesh 來說太舊,載不動「用意思搜尋」那一塊。完整版本是 Node 22.13 才有的。","doctor.msg.native-binding.node-too-old.fix":"把 Node 升到 22.13 以上,再執行一次 `memesh doctor`。","doctor.msg.native-binding.not-installed.summary":"sqlite-vec 沒有安裝。記憶還是會存、也還找得到,只是不能用「意思相近」來搜尋。","doctor.msg.native-binding.not-installed.fix":"在使用 @pcircle/memesh 的資料夾執行 `npm install`。","doctor.msg.native-binding.load-failed.summary":"sqlite-vec 載入失敗:{detail}。搜尋只能用關鍵字。","doctor.msg.native-binding.load-failed.fix":'執行:cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"終端機裡打 `memesh` 找不到指令。Claude Code 的功能不受影響——只影響你自己在終端機操作。","doctor.msg.shell-cli.not-on-path.fix":"執行 `npm install -g @pcircle/memesh` 補上。兩種安裝共用同一份記憶。","doctor.msg.dashboard.missing.summary":"儀表板的檔案不見了。","doctor.msg.dashboard.missing.fix":"用 `cd dashboard && npm install && npm run build` 重建。","doctor.msg.update-status.no-cache.summary":"memesh 還沒成功查過有沒有新版本,所以無法告訴你要不要更新。","doctor.msg.update-status.no-cache.fix":"連網時執行一次 `memesh status`,查到結果後這則提醒就會消失。","doctor.msg.update-status.deprecated.summary":"你裝的 {version} 已被官方下架:{detail}","doctor.msg.update-status.deprecated.fix":"請立刻更新——執行 `memesh update`(或依你的安裝方式升級)。","doctor.msg.update-status.deprecation-unknown.summary":"無法確認 {version} 這個版本是否仍然安全:{detail}","doctor.msg.update-status.deprecation-unknown.fix":"連網時執行 `memesh status` 重試。","doctor.msg.update-status.update-available.summary":"有新版本:{latest}(目前是 {current})。","doctor.msg.update-status.update-available.fix":"執行 `memesh update` 升級。","doctor.msg.update-status.stale.summary":"{version} 已是最新,但更新資訊有點舊了。","doctor.msg.update-status.stale.fix":"連網時執行 `memesh status` 更新一下。","doctor.msg.http-probe.bad-status.summary":"{url} 的本機伺服器回了錯誤(HTTP {status})。","doctor.msg.http-probe.bad-status.fix":"用 `memesh serve` 重啟並查看記錄。","doctor.msg.http-probe.no-server.summary":"{url} 沒有本機伺服器在跑。","doctor.msg.http-probe.no-server.fix":"想用儀表板的話,用 `memesh serve` 啟動一個。","doctor.msg.skills-manifest.missing-dev.summary":"找不到檔案完整性清單(從原始碼執行時屬正常)。","doctor.msg.skills-manifest.missing-dev.fix":"執行 `npm run build` 產生。","doctor.msg.skills-manifest.unreadable.summary":"檔案完整性清單讀不到({detail})。","doctor.msg.skills-manifest.unreadable.fix":"重新安裝:`npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.empty.summary":"檔案完整性清單是空的。","doctor.msg.skills-manifest.empty.fix":"重新安裝:`npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.verify-failed.summary":"部分內附檔案跟出廠內容不一致:{detail}","doctor.msg.skills-manifest.verify-failed.fix":"重新安裝:`npm install -g @pcircle/memesh`。全新安裝仍出現的話,請當成安全問題回報。","doctor.msg.config-parse.not-object.summary":"{path} 的設定檔格式不對,所有設定目前都被忽略。","doctor.msg.config-parse.not-object.fix":"修好或刪掉 {path},再執行 `memesh doctor`。","doctor.msg.config-parse.unreadable.summary":"{path} 的設定檔讀不到({detail}),所有設定目前都被忽略。","doctor.msg.config-parse.unreadable.fix":"修好檔案,或先移開:mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":"語意搜尋設定為「{provider}」,但測試時沒有產生任何結果。關鍵字搜尋不受影響。","doctor.msg.embeddings.empty.fix":"執行 `memesh doctor --probe` 看細節,或檢查該服務的連線。","doctor.msg.embeddings.threw.summary":"語意搜尋設定為「{provider}」,但測試失敗:{detail}。關鍵字搜尋不受影響。","doctor.msg.embeddings.threw.fix":"確認 embedding 服務可連線(例如執行 `ollama serve`),或移除 embedder 設定以改用純關鍵字搜尋。","doctor.msg.llm.unreachable.summary":"AI 服務({provider})沒有回應:{detail}。AI 相關功能目前默默停擺。","doctor.msg.llm.unreachable.fix":"檢查 API key 和連線,再執行 `memesh doctor --probe`。","doctor.msg.llm.threw.summary":"測試 AI 服務({provider})失敗:{detail}。AI 相關功能目前默默停擺。","doctor.msg.llm.threw.fix":"檢查 API key 和連線,再執行 `memesh doctor --probe`。","doctor.msg.install-channel.unknown.summary":"看不出 memesh 是怎麼安裝的。","doctor.msg.install-channel.unknown.fix":"原始碼安裝請在 repo 根目錄執行;套件安裝請用 `npm install -g @pcircle/memesh` 重裝。","doctor.msg.fts.unsegmented.summary":"關鍵字索引有 {count} 筆是舊格式——部分記憶只有完整原文才搜得到。","doctor.msg.fts.unsegmented.fix":"執行 `memesh reindex --fts` 重建索引。","doctor.msg.vector-index.stale.summary":"搜尋索引需要重建(搜尋設定變更過)。","doctor.msg.vector-index.stale.fix":"執行 `memesh reindex` 重建。","doctor.msg.vector-generation.open.summary":"有一個未完成的索引重建正佔著磁碟空間。","doctor.msg.vector-generation.open.fix":"執行 `memesh reindex` 完成它,或 `memesh reindex --discard-generation` 回收空間。","doctor.msg.database.broken.summary":"資料庫無法使用:{detail}","doctor.update_status.prerelease":"正在使用預發布版本({current}),npm 最新版為 {latest}","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":"尚無召回數據。下次會話後開始追蹤有效性。","recall.summary":"已使用 {used} / 已注入 {total}","analytics.loadFailed":"載入分析資料失敗。","memory.noContent":"(無內容)","memory.archivedBadge":"已封存","memory.factsCount":"{count} 筆事實","common.error":"錯誤","common.serverUnreachable":"連不上 memesh 伺服器。","common.serverUnreachableAction":"請確認 `memesh serve` 還在執行,然後重新整理這個頁面。","common.responseUnreadable":"伺服器有回應,但這個頁面看不懂它的內容——儀表板和伺服器的版本可能不同步。","common.responseUnreadableAction":"請重新整理頁面;若持續發生,執行 `memesh doctor`。","pm.title":"PM 指標","pm.decisionsPerWeek":"決策/週","pm.openDecisions":"未結決策(>14 天)","pm.orphanRate":"未連結的記憶","pm.relationsTotal":"關聯總數","pm.stalePlans":"{count} 個計畫超過 30 天未回顧","common.loading":"載入中…","common.noData":"沒有資料","errors.unknown":"發生未知錯誤","insights.noPreview":"這筆提案沒有摘要內容","httpError.auth.missing-bearer":"這台伺服器需要存取權杖,請輸入權杖後繼續。","httpError.auth.invalid-token":"存取權杖不正確,請檢查後再試一次。","httpError.auth.not-configured":"伺服器尚未設定存取權杖。請重新啟動 `memesh serve` 並查看它的輸出。","httpError.validation.bad-body":"頁面送出的請求伺服器讀不懂。請重新整理頁面後再試。","httpError.validation.bad-param":"請求中有欄位不正確。請重新整理頁面後再試。","httpError.route.retired":"伺服器已不支援這個動作——頁面和伺服器版本可能不一致。請重新整理頁面。","httpError.route.not-found":"伺服器不認得這個請求——頁面和伺服器版本可能不一致。請重新整理頁面。","httpError.resource.not-found":"這個項目已不存在,請重新整理清單。","httpError.payload.too-large":"送出的資料太大(超過 1 MB),請分成較小的批次。","httpError.operation.failed":"伺服器無法完成這個動作。","httpError.llm.not-configured":"尚未設定 AI 供應商,請先到「設定」新增。","httpError.rate.limited":"短時間內送出太多請求。請稍候片刻再試一次。","httpError.server.internal":"伺服器發生預期外的錯誤。","settings.testError.auth":"API 金鑰被拒絕,請檢查金鑰後再試一次。","settings.testError.network":"連不上供應商,請檢查網路連線。","settings.testError.no_models":"供應商有回應,但沒有回傳可用的模型。","settings.testError.bad_host":"Ollama 位址必須在這台機器上(localhost)。","settings.testError.http":"供應商回傳錯誤(HTTP {status})。","settings.testError.unknown":"測試失敗,原因不明。","time.justNow":"剛剛","time.hoursAgo":"{count} 小時前","time.today":"今天","time.yesterday":"昨天","time.daysAgo":"{count} 天前","time.lastWeek":"上週","time.weeksAgo":"{count} 週前","time.lastMonth":"上個月","time.monthsAgo":"{count} 個月前","memory.access.frequent":"常用 · {count} 次","memory.access.recalls":"{count} 次回憶","memory.access.never":"從未回憶","cluster.knowledge":"知識","cluster.activity":"活動","cluster.session":"工作記錄","cluster.reference":"參考","cluster.all":"全部","browse.filterTime":"時間","browse.filterValue":"價值","browse.filterProject":"專案","browse.filterSort":"排序","browse.timeToday":"今天","browse.timeWeek":"本週","browse.timeMonth":"本月","browse.timeOlder":"更早","browse.valueRecalled":"✓ 用過","browse.valueNever":"從未回憶","browse.sortMostRecalled":"最常回憶","browse.sortRecent":"最近使用","browse.sortCreated":"建立時間","browse.emptyFilter":"此分類沒有記憶 — 試試切換類別或時間","lessons.stepsLabel":"步驟","lessons.commitsCount":"{count} 個 commit","lessons.unstructured":"(此教訓沒有結構化欄位,請查看原始記憶)","lessons.moreItems":"+{count} 條","roadmap.title":"專案路線圖","roadmap.summary":"{count} 筆記憶 · {first} → {last}","roadmap.switchToList":"↩ 清單檢視","roadmap.switchToRoadmap":"🗺️ 路線圖檢視","roadmap.emptyProject":"此專案尚無記憶。","loop.label":"記憶循環","loop.subtitleHas":"本週被回憶的知識類型記憶","loop.subtitleNone":"本週尚無知識被回憶 — 試試喚起一則教訓","loop.approxNote":"近似值 — 完整追蹤從升級後開始累積","loop.sparkLabel":"最近 30 天","roadmap.milestones":"里程碑","roadmap.keyLessons":"重要教訓","radar.title":"知識覆蓋雷達","radar.caption":"顯示有效知識記憶 (排除 session 和 commit)","radar.axis.lessons":"教訓","radar.axis.decisions":"決策","radar.axis.patterns":"模式","radar.axis.bugs":"問題修復","radar.axis.processes":"流程","radar.axis.architecture":"架構","ageMatrix.title":"記憶年齡分佈","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"顏色深度 = 記憶密度","ageMatrix.typeColumn":"類型","header.signalModeOn":"訊號","header.signalModeOff":"全部","header.signalModeOnHint":"已隱藏 session 與 commit 等雜訊。點擊顯示全部。","header.signalModeOffHint":"顯示包含 session 與 commit 在內的所有記憶。點擊隱藏雜訊。","roadmap.phases":"階段","onboarding.title":"歡迎使用 MeMesh","onboarding.body":"你的記憶庫還是空的。從 30 筆精選範例開始體驗,或直接存下你的第一則教訓。","onboarding.llmHint":"不需要 LLM。所有功能都靠 FTS5 運作。LLM 只用在自動產生教訓,可以之後再到設定頁開啟。","onboarding.seedButton":"一鍵載入示範資料","onboarding.seedingButton":"載入中…","onboarding.seedHint":"直接在這裡載入 30 筆,之後可一鍵清除,不用切到終端機","onboarding.cliReference":"習慣 CLI?","onboarding.hintDemo":"植入 30 筆示範記憶,之後可一鍵清除","onboarding.hintReset":"移除所有 metadata.demo 標記的記憶","onboarding.resetButton":"清除示範資料","onboarding.resettingButton":"清除中…","onboarding.resetConfirm":"確定要移除所有示範記憶?你自己存的內容會保留。","onboarding.dismiss":"關閉","common.serverError":"伺服器回報錯誤(HTTP {status})。請再試一次;若持續發生,請執行 `memesh doctor`。","emptyLibrary.title":"你的記憶庫是空的","emptyLibrary.body":"這裡還沒有任何記憶。載入 30 筆示範資料,馬上看到 MeMesh 的完整功能——之後可一鍵清除。","browse.truncated":"目前顯示前 {shown} 筆(共 {total} 筆)——用搜尋或篩選找到其餘的記憶","browse.truncatedUnknownTotal":"目前顯示前 {shown} 筆——讀不到總數,可能還有更多","graph.cappedNote":"只顯示前 {shown} 個節點(共 {total} 個,依回想次數排序),讓圖表保持流暢。","settings.testStoredKeyHint":"欄位留空即測試已儲存的金鑰。","ageMatrix.bucket.week":"本週","ageMatrix.bucket.month":"本月","ageMatrix.bucket.quarter":"本季","ageMatrix.bucket.older":"更早","settings.behaviourTitle":"行為設定","settings.autoUpdateLabel":"自動更新策略","settings.autoUpdateOff":"關閉 — 僅手動","settings.autoUpdatePatch":"Patch — 自動套用 X.Y.Z+1","settings.autoUpdateMinor":"Minor — 自動套用 X.Y+1.0","settings.autoUpdateMajor":"Major — 自動套用任何版本升級","settings.autoUpdateHint":"每次 session 結束後觸發。MEMESH_AUTO_UPDATE 環境變數優先。","errors.timeout":"請求逾時","type.lesson_learned":"教訓","type.lesson":"教訓","type.mistake":"錯誤","type.decision":"決策","type.architecture_decision":"架構決策","type.design_decision":"設計決策","type.pattern":"模式","type.technical_pattern":"技術模式","type.best_practice":"最佳實踐","type.bug_fix":"問題修復","type.verification_result":"驗證結果","type.test_result":"測試結果","type.process":"流程","type.architecture":"架構","type.infrastructure":"基礎設施","type.feature":"功能","type.release":"版本發佈","type.refactoring":"重構","type.commit":"提交","type.session_keypoint":"工作階段重點","type.session_identity":"工作階段身分","type.session-insight":"工作階段洞察","type.session-summary":"工作階段摘要","type.session-identity":"工作階段身分","type.weekly_summary":"週摘要","type.weekly-summary":"週摘要","type.note":"筆記","type.plan":"計畫","type.knowledge":"知識","type.workflow_checkpoint":"流程里程碑","type.concept":"概念","type.tool":"工具","type.person":"人物","relation.relates_to":"相關","relation.related-to":"相關","relation.depends_on":"依賴","relation.implements":"實作","relation.learned_from":"學習自","relation.supersedes":"取代","relation.contradicts":"矛盾","relation.follows":"接續","relation.belongs-to-project":"屬於專案","relation.evidences":"證據","relation.co-created":"共同建立","relation.shares-name-tokens":"名稱相似","patterns.day.0":"週日","patterns.day.1":"週一","patterns.day.2":"週二","patterns.day.3":"週三","patterns.day.4":"週四","patterns.day.5":"週五","patterns.day.6":"週六","telemetry.flow.dreamer":"週報整理(dreamer)","telemetry.flow.pattern_detector":"模式偵測","telemetry.flow.digest_validator":"摘要驗證","telemetry.flow.guard_proposer":"守衛提案器","telemetry.flow.auto_tagger":"自動標籤","telemetry.flow.failure_analyzer":"失敗分析","telemetry.flow.transcript_extractor":"對話記錄挖掘","telemetry.flow.conflict_judge":"衝突判定","telemetry.errorClass.auth":"憑證被拒","telemetry.errorClass.rate_limit":"額度限制","telemetry.errorClass.upstream":"供應商故障","telemetry.errorClass.bad_request":"請求無效","telemetry.errorClass.network":"網路","telemetry.errorClass.parse":"回應無法解析","telemetry.errorClass.unknown":"未知","lessons.severity.critical":"嚴重","lessons.severity.major":"重大","lessons.severity.minor":"輕微","memory.tooltip.project":"專案","memory.tooltip.recalled":"已被回憶 {count} 次","memory.tooltip.hasRelations":"與 {count} 筆記憶相連","memory.tooltip.createdAt":"建立於 {date}","graph.layerLabel":"圖層","graph.layerWork":"工作","graph.layerAll":"全部","graph.layerWorkHint":"決策、教訓與計畫——工作本身。","graph.layerAllHint":"memesh 存下的每一筆記憶,含機械捕捉。","graph.layerFellBack":"目前工作項目不到 {min} 筆,改顯示完整圖譜。記下決策與教訓後,這個檢視就會長出來。","graph.evidenceFor":"{node} 的證據","graph.evidenceClose":"關閉","graph.evidenceLoading":"載入證據中…","graph.evidenceFailed":"無法載入這個項目的證據。","graph.evidenceEmpty":"這個項目還沒有連上證據。執行 `memesh kg backfill` 可從 commit 與 session 捕捉建立連結。","graph.evidenceTruncated":"顯示最近 {shown} 筆,還有更多。","graph.drift":"時效","graph.driftHint":"依新舊上色:紅=久未使用,綠=最近使用","common.unknown":"未知","insights.entitiesCount":"{n} 筆實體","roadmap.viewToggle":"路線圖檢視","roadmap.viewTree":"樹狀","roadmap.viewMindmap":"心智圖","roadmap.mindmapNeedsPhases":"心智圖需要 7 天內至少 3 筆記憶。","roadmap.activePhase":"進行中","roadmap.entryCount":"{count} 筆","roadmap.entriesCount":"{count} 筆","roadmap.otherGroup":"其他({count})","roadmap.lowSignalHidden":"(已隱藏 {count} 筆低訊號)","roadmap.resetHint":"重設縮放與位置(雙擊背景也可重設)","roadmap.zoomHint":"滾輪縮放 · 拖曳平移 · {pct}%","roadmap.moreEntities":"還有 {count} 筆","roadmap.viewDecisions":"決策","roadmap.densityTitle":"依類別的捕捉密度","roadmap.densityNote":"這是 memesh 捕捉到的,不等於發生過的一切","roadmap.lineageSupersedes":"{n} 筆已被取代","roadmap.lineageConflicts":"{n} 筆衝突未解","adr.empty":"這個專案還沒有記錄任何決策。用類型「decision」記下一筆,它就會帶著自己的歷史出現在這裡。","adr.statusActive":"現行","adr.statusSuperseded":"已被取代","adr.supersedes":"取代","adr.supersededBy":"被取代","nav.ariaLabel":"儀表板分頁","feedback.descLabel":"意見內容","graph.canvasA11y":"知識圖譜(畫布繪製):{entities} 個實體、{relations} 條關係、{orphans} 個未連結。上方的類型篩選與搜尋提供非視覺瀏覽方式。"},"zh-CN":{"auth.title":"需要验证","auth.intro":"此仪表板受 bearer token 保护。请在下方粘贴 MEMESH_REMOTE_TOKEN 的值(或 <memeshDir>/remote-token 文件的内容)。","auth.tokenLabel":"Token","auth.empty":"Token 不能为空。","auth.invalid":"这个令牌未被接受,请检查后重试。","auth.submit":"解锁仪表板","auth.tokenPlaceholder":"在这里粘贴 token","brand.subtitle":"powered by pcircle.com","header.connected":"已连接","header.disconnected":"已断开","header.connecting":"连接中…","header.memories":"条记忆","telemetry.title":"LLM 活动","telemetry.lastNDays":"近 {n} 天","telemetry.loading":"加载中…","telemetry.empty":"这段时间还没有 AI 活动。当后台 AI 功能(例如每周摘要、自动标记)运行后,这里会自动出现记录。","telemetry.callsCount":"{n} 次调用","telemetry.attemptsCount":"{n} 次尝试","telemetry.successRate":"成功率","telemetry.medianLatency":"延迟中位数","telemetry.fallbackUsed":"启用备用 {n} 次(占调用的 {pct})","telemetry.byProvider":"按服务商","telemetry.byModel":"按模型","telemetry.byProject":"按项目","telemetry.errors":"错误","insights.title":"memesh 为你做了什么","insights.subtitle":"自动生成的周报整理与发现的模式,等你审阅","insights.statPending":"待审","insights.statApplied":"已采用","insights.statRejected":"已拒绝","insights.filter.pending":"待审","insights.filter.applied":"已采用","insights.filter.rejected":"已拒绝","insights.filter.all":"全部","insights.refresh":"刷新","insights.loading":"读取中…","insights.emptyPending":"目前没有待审 insight。可执行 `memesh dream run` 生成周报整理。","insights.emptyNoLlm":"到设置页配置 LLM 服务,即可开启每周整理和模式检测。","insights.emptyOther":"没有数据。","insights.sources":"来源","insights.status.pending":"待审","insights.status.applied":"已采用","insights.status.rejected":"已拒绝","insights.viewDetail":"查看详情","insights.collapse":"收起","insights.accept":"采用","insights.applying":"应用中…","insights.reject":"拒绝","insights.generatedBy":"生成模型","insights.promptVersion":"Prompt 版本","insights.observations":"摘要观察","insights.tags":"标签","insights.sourceIds":"来源实体","insights.validationWarnings":"可疑陈述(LLM 验证器)","insights.validationClaim":"陈述","insights.validationReason":"原因","insights.runDream":"执行周报","insights.runDreamWithValidate":"执行(含验证器,较慢但质量更高)","banner.pendingInsights":"有 {n} 则新洞察等你审阅 →","banner.dismiss":"关闭","banner.viewAll":"查看全部","pattern.title":"模式","pattern.evidenceCount":"{n} 个证据","pattern.severity":"严重度","pattern.severity.high":"高","pattern.severity.medium":"中","pattern.severity.low":"低","pattern.description":"模式说明","tab.graph":"知识图谱","tab.settings":"设置","tab.home":"首页","tab.memories":"记忆","tab.project":"项目","memories.searchPlaceholder":"输入即时筛选 — 按 Enter 进行相关度排序搜索","memories.scopeLabel":"范围","memories.scopeWork":"工作层","memories.scopeEvidence":"证据","memories.scopeAll":"全部","memories.scopeArchived":"已归档","memories.composition":"构成","memories.rankedBy":"按相关度排序","memories.backToList":"返回列表","memories.workEmpty":"还没有工作层记忆 — 目标、决策、教训和计划被记录后会出现在这里。","memories.showAll":"显示所有记忆","memories.expand":"显示详情","memories.collapse":"隐藏详情","home.analyticsTitle":"分析","home.analyticsHint":"健康度、时间线、模式与使用情况 — 需要时再展开","project.selectLabel":"项目","project.selectPrompt":"选择一个项目即可查看它的历程。","project.empty":"还没有项目记忆。在装有 memesh hook 的 git 仓库中工作,它的故事就会出现在这里。","guard.sourceLesson":"来源教训","guard.pattern":"触发模式","guard.message":"将发出的警告","guard.shouldMatch":"必须触发于","guard.shouldNotMatch":"必须静默于","search.button":"搜索","search.searching":"搜索中…","search.results":"个结果","search.result":"个结果","search.noResults":"没有找到结果:","search.facts":"条事实","browse.title":"所有记忆","browse.active":"活跃","browse.archived":"已归档","browse.refresh":"刷新","browse.noMatch":"没有匹配的记忆:","browse.prev":"← 上一页","browse.next":"下一页 →","browse.archive":"归档","browse.restore":"恢复","browse.confirmArchive":"确定要归档此记忆?","browse.archiveFailed":"归档失败:{message}","browse.restoreFailed":"恢复失败:{message}","analytics.totalMemories":"记忆总数","analytics.knowledgeFacts":"知识事实","analytics.connections":"关联","analytics.topics":"主题","analytics.insights":"洞察","analytics.thisWeek":"本周","analytics.new":"条新增","analytics.stale":"闲置(30 天以上未使用)","analytics.archivedLabel":"已归档","analytics.mostRecalled":"最常查阅","health.title":"记忆健康度","metrics.notMeasured":"尚未测量","metrics.health":"健康度","metrics.healthNote":"活跃度、质量、新鲜度、教训","metrics.critical":"严重教训","metrics.criticalPartial":"在 {tagged} 条已分类中 · 共 {total} 条教训","metrics.criticalAll":"共 {total} 条教训,全部已分类","metrics.criticalUnclassified":"{total} 条教训,尚未按严重度分类","metrics.criticalNoLessons":"尚未记录任何教训","metrics.citation":"引用率","metrics.citationNote":"{total} 次会话中有 {cited} 次引用了记忆","metrics.citationNotMeasured":"引用追踪将从下次会话开始计算","metrics.reused":"本周被重用","metrics.reusedNote":"近似值——以最后访问时间推估","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.entityMeta":"{type} · 置信度 {confidence}% · 已闲置 {days} 天","settings.capabilities":"功能状态","settings.smartMode":"智能模式","settings.core":"基础","settings.embeddings":"嵌入模型","settings.llmProvider":"LLM 提供商","settings.llmOptional.title":"LLM 是可选的","settings.llmOptional.body":"memesh 不需要 LLM 也能运作。默认的核心模式已涵盖全文回忆、手动 remember/recall、仪表板,以及通过 hook 自动捕捉 session。","settings.llmOptional.coreLabel":"没有 LLM(核心模式)","settings.llmOptional.coreFeatures":"FTS5 关键字搜索、手动 remember/recall、仪表板、hook 自动捕捉 session","settings.llmOptional.smartLabel":"有 LLM(智能模式)","settings.llmOptional.smartFeatures":"自动从 session 失败萃取 lesson_learned、新 entity 自动标签、周报整理 + 模式发现","settings.apiKey":"API 密钥","settings.fallbacks.title":"备用提供商","settings.fallbacks.explainer":"当主要提供商不可用时,memesh 会按顺序尝试这些提供商,直到有一个成功。","settings.fallbacks.privacyTitle":"隐私提示","settings.fallbacks.privacyBody":"添加云端提供商(OpenAI 或 Anthropic)意味着:当主要提供商不可用时,你的记忆内容(可能是私密的)会被发送到该云端提供商。如果你为了隐私使用本地提供商,请在接受这一权衡后再添加云端备用。","settings.fallbacks.empty":"尚未设置备用提供商。","settings.fallbacks.add":"添加备用提供商","settings.fallbacks.providerLabel":"提供商","settings.fallbacks.modelLabel":"模型(可选)","settings.fallbacks.modelPlaceholder":"例如 gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"已保存密钥。留空即可保留。","settings.fallbacks.remove":"移除","settings.fallbacks.moveUp":"上移","settings.fallbacks.moveDown":"下移","settings.fallbacks.priority":"优先级 {n}","settings.fallbacks.save":"保存备用顺序","settings.fallbacks.needsKey":"请输入 API 密钥,否则此云端备用无法使用。","settings.model":"模型(选填)","settings.save":"保存","settings.saving":"保存中…","settings.saved":"已保存","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"测试连接","settings.testing":"测试中…","settings.testPassed":"✓ 连接成功 · 找到 {count} 个可用模型","settings.testFailed":"连接测试失败","settings.suggested":"推荐","settings.testRequired":"请先测试连接后再保存","settings.language":"语言","settings.searchMode":"搜索模式","settings.none":"无","settings.updates":"更新","settings.updateChecking":"正在检查更新…","settings.updateUnavailable":"暂时无法检查更新","settings.updateNoSuccessfulChecks":"目前还没有成功的更新检查记录","settings.upToDate":"已是最新版本","settings.updateAvailable":"有可用更新","settings.updateStale":"当前显示的是可能过期的缓存状态","settings.updateCachedFallback":"当前使用上次成功的缓存结果","settings.updateDeprecatedNoTarget":"已停用 — 暂无可升级目标","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} 已被维护者标记为停用 (DEPRECATED)。","settings.updatePartialTitle":"⚠️ 更新检查未完整","settings.updatePartialDescription":"{message}。本次无法确认停用状态 — 待网络恢复后请重新检查。","settings.updatePartialSummary":"部分检查 — 停用状态未确认","settings.updateDeprecatedTargetUnknown":"已停用 — 升级目标查询中","settings.currentVersion":"当前版本","settings.latestVersion":"最新版本","settings.lastChecked":"上次检查","settings.lastAttempted":"上次尝试检查","settings.lastSuccessful":"上次成功检查","settings.updateSourceFresh":"实时检查","settings.updateSourceCached":"使用缓存结果","settings.updateSourceStale":"使用过期缓存结果","settings.updateSourceUnavailable":"没有可用缓存","settings.updateCommand":"更新命令","settings.checkNow":"立即检查","settings.updateLastError":"上次检查错误:{message}","settings.installMethod":"安装方式","settings.installNpmGlobal":"npm 全局安装","settings.installNpmLocal":"项目内包安装","settings.installSourceCheckout":"源码工作目录","settings.installUnknown":"未知","settings.updateGuidanceNpmGlobal":"这个安装可以直接通过 MeMesh 更新。","settings.updateGuidanceNpmLocal":"请使用安装此包的项目包管理器来更新。","settings.updateGuidanceSourceCheckout":"请从源码仓库更新这份工作目录并重新构建。","settings.updateGuidanceUnknown":"请使用安装 MeMesh 时所用的工具或流程来更新这个安装。","graph.entities":"实体","graph.relations":"关联","graph.orphans":"孤立节点","graph.search":"搜索节点…","graph.matches":"个匹配","graph.focusMode":"聚焦","graph.showAll":"显示全部","graph.clickHint":"点击节点以聚焦","graph.interactHint":"点击节点聚焦 · 拖动空白处平移 · 滚轮缩放","graph.resetView":"重置视图","graph.resetViewHint":"重置缩放与位置","graph.ageToday":"今天","graph.ageDaysAgo":"{count} 天前","graph.ageWeeksAgo":"{count} 周前","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","feedback.submitting":"收集诊断信息中…","doctorBanner.warnTitleSoft":"memesh 有几条设置提醒","doctorBanner.failTitle":"memesh 设置不完整","doctorBanner.dismiss":"关闭","doctorBanner.getHelp":"获取帮助","doctorBanner.helpHint":"会打开一个已填好诊断信息的 GitHub issue","doctorBanner.preambleForIssue":"memesh doctor 在我的安装上报告以下情况:","doctorBanner.moreCount":"…还有 {n} 条——运行 `memesh doctor` 看完整清单","doctor.label.readme_locale_parity":"README 翻译同步","doctor.label.config":"配置文件","doctor.label.mcp-config":"MCP 连接配置文件","doctor.label.hooks-config":"Hook 定义文件","doctor.label.hook-scripts":"Hook 脚本","doctor.label.hook-wiring":"与 Claude Code 的连接","doctor.label.hook-activity":"自动记录","doctor.label.node-runtime":"Node.js 版本","doctor.label.native-binding":"SQLite 与向量搜索","doctor.label.shell-cli":"终端命令","doctor.label.dashboard":"仪表板文件","doctor.label.update-status":"版本更新","doctor.label.http-probe":"本机服务器","doctor.label.skills-manifest":"内附文件","doctor.label.config_parse":"配置文件","doctor.label.embeddings_probe":"语义搜索","doctor.label.llm_probe":"AI 服务","doctor.label.install-channel":"安装方式","doctor.label.fts_segmentation":"关键字索引","doctor.label.vector_index":"搜索索引","doctor.label.database":"数据库","doctor.msg.readme-parity.unreadable.summary":"读不到 README.md:{detail}","doctor.msg.readme-parity.drift.summary":"部分翻译版 README 与英文版结构不同步:{detail}","doctor.msg.readme-parity.drift.fix":"把列出的 README 与 README.md 重新对齐。","doctor.msg.config.invalid-json.summary":"{path} 的配置文件不是有效的 JSON,目前整份被忽略。","doctor.msg.config.invalid-json.fix":"修好或删掉 {path},再运行 `memesh config list` 确认能加载。","doctor.msg.mcp-config.missing.summary":"把 memesh 接入 Claude Code 的文件(.mcp.json)不见了。","doctor.msg.mcp-config.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.mcp-config.invalid-json.summary":".mcp.json 已损坏(不是有效的 JSON),Claude Code 读不到它。","doctor.msg.mcp-config.invalid-json.fix":"修好 {path},或重新安装 MeMesh。","doctor.msg.mcp-config.no-entry.summary":".mcp.json 里的 memesh 服务器配置不见了。","doctor.msg.mcp-config.no-entry.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` 要启动的文件不在这份安装里,所以 Claude Code 里的每个 memesh 工具都起不来。","doctor.msg.mcp-config.entry-missing.fix":"重新安装 MeMesh。如果你手动改过 `.mcp.json`,把它指回 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json 不见了,自动记忆功能无法运行。","doctor.msg.hooks-config.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json 已损坏(不是有效的 JSON)。","doctor.msg.hooks-config.invalid-json.fix":"修好 {path},或重新安装 MeMesh。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json 少了这些 hook 类型:{types}。部分自动记录不会运行。","doctor.msg.hooks-config.missing-types.fix":"恢复出厂的 hook 配置,或重新安装 MeMesh。","doctor.msg.hook-scripts.none.summary":"Hook 配置里没有任何脚本,什么都不会被自动记录。","doctor.msg.hook-scripts.none.fix":"重新安装 MeMesh。","doctor.msg.hook-scripts.missing.summary":"这些 hook 脚本不见了:{files}","doctor.msg.hook-scripts.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.hook-scripts.not-executable.summary":"这些 hook 脚本存在但没有执行权限:{files}","doctor.msg.hook-scripts.not-executable.fix":"运行 `chmod +x scripts/hooks/*.js`;源码安装则跑 `npm run build`。","doctor.msg.hook-wiring.no-marker.summary":"memesh 还没接入 Claude Code,所以不会自动记住任何东西。","doctor.msg.hook-wiring.no-marker.fix":"运行一次 `memesh install-hooks` 完成连接,再用 `memesh doctor` 确认。","doctor.msg.hook-wiring.script-missing.summary":"已接线的 memesh hook 指向 {path},但这个文件已不存在——agent 每次触发对应事件都会调用一个不存在的文件。通常是升级移除某个 hook 后留下的残留。","doctor.msg.hook-wiring.script-missing.fix":"运行 `memesh install-hooks` 重新接线(它会移除已退役的条目),然后重启你的 agent。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} 的连接记录读不到。","doctor.msg.hook-wiring.marker-unreadable.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.marker-malformed.summary":"连接记录已损坏。","doctor.msg.hook-wiring.marker-malformed.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 的设置文件({path})不见了,连接已中断。","doctor.msg.hook-wiring.settings-missing.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} 已损坏(不是有效的 JSON)。","doctor.msg.hook-wiring.settings-invalid.fix":"从备份恢复,或用 `memesh install-hooks` 重建。","doctor.msg.hook-wiring.entries-removed.summary":"{path} 里的 memesh 配置被移除了,连接已中断。","doctor.msg.hook-wiring.entries-removed.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.root-moved.summary":"连接指向的 {path} 已不存在(memesh 可能被移动了)。","doctor.msg.hook-wiring.root-moved.fix":"运行 `memesh install-hooks` 更新路径。","doctor.msg.hook-activity.never-ran.summary":"从开始追踪到现在 {hours} 小时,没有任何抓取 hook 跑过——而 hook 接线是好的,代表它们该跑却没跑,没有任何东西被记下来。","doctor.msg.hook-activity.never-ran.fix":"完整用一次工作会话,再跑 `memesh doctor`。如果还是说没有 hook 跑过,执行 `memesh install-hooks` 然后重启 agent。","doctor.msg.hook-activity.stale.summary":"最后一次抓取 hook 是大约 {hours} 小时前跑的({hook})。如果你这段时间有在工作,代表抓取已经停了,那些会话的内容都没被存下来。","doctor.msg.hook-activity.stale.fix":"重启 agent,结束一次工作会话,再跑 `memesh doctor`。如果没恢复,执行 `memesh install-hooks`。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary hook 上次运行大约在 {hours} 小时前,而且过去 3 天也没有任何 Claude Code 的写入。如果这台机器已改用其他 agent(Codex / Gemini),这是正常的;如果你在这里仍使用 Claude Code,捕获已经停了。","doctor.msg.hook-activity.stale-unconfirmed.fix":"如果这台机器仍在使用 Claude Code:重启它、结束一个 session,再运行一次 `memesh doctor`。若仍未恢复,运行 `memesh install-hooks`。","doctor.msg.hook-activity.query-failed.summary":"读不到 hook 活动记录:{detail}。抓取状态现在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.query-failed.fix":"用 `memesh doctor --verbose` 看完整错误,并确认 ~/.memesh 读得到、磁盘没满。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} hook 的最后执行时间读不出来(数据坏了,或是被时钟不准的机器盖的章)。抓取状态现在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.stale-unknown.fix":"结束一次工作会话后再跑 `memesh doctor`——新的一次执行会把坏掉的时间盖掉。","doctor.msg.hook-activity.disabled.summary":"自动抓取已关闭(MEMESH_AUTO_CAPTURE 或配置文件的 autoCapture)——这是刻意设置,hook 没动静是预期中的。想恢复抓取就把它打开。","doctor.msg.hook-activity.disabled-env.summary":"自动捕获被这个 shell 环境中的 MEMESH_AUTO_CAPTURE=false 关闭了。doctor 只能看到自己所在的环境——如果你的 agent 运行时没有这个变量,那边的捕获不受影响。","doctor.msg.hook-activity.not-wired.summary":"从来没有任何捕获 hook 运行过——而且这台机器上没有确认接好任何捕获 hook(Stop / PostToolUse / PreCompact),所以本来就没有东西可以运行。","doctor.msg.hook-activity.not-wired.fix":"想要自动抓取就执行 `memesh install-hooks`。如果这个安装只走 MCP(Codex / Gemini),这是正常状态,可以放心忽略。","doctor.msg.hook-activity.stop-silent.summary":"{hook} hook 有在盖章,但从开始追踪到现在 {hours} 小时,session-summary hook 一次都没跑过——session 抓取可能坏了,只是被 commit 抓取盖住看不见。","doctor.msg.hook-activity.stop-silent.fix":"完整结束一次工作会话再跑 `memesh doctor`。如果 session-summary 还是没跑过,执行 `memesh install-hooks` 然后重启 agent。","doctor.msg.hook-activity.never-ran-legacy.summary":"没有任何 hook 盖过心跳章,但追踪开始以来已存入 {captured} 条自动捕获的记忆——很可能是心跳追踪之前版本的 hook 还在运行。","doctor.msg.hook-activity.never-ran-legacy.fix":"把 memesh hooks 更新到当前版本(plugin 安装:`/plugin update memesh`;npm 安装:`memesh install-hooks`),然后重启 agent。","doctor.msg.node-runtime.too-old.summary":"你的 Node.js 版本比这个包支持的还旧。{detail}","doctor.msg.node-runtime.too-old.fix":"把 Node.js 升级到 {required} 以上,再运行 `memesh doctor`。","doctor.msg.native-binding.node-too-old.summary":"这个版本的 Node 内置的 SQLite 对 memesh 来说太旧,加载不了「按意思搜索」那一块。完整版本是 Node 22.13 才有的。","doctor.msg.native-binding.node-too-old.fix":"把 Node 升到 22.13 以上,再运行一次 `memesh doctor`。","doctor.msg.native-binding.not-installed.summary":"sqlite-vec 没有安装。记忆还是会存、也还找得到,只是不能用「意思相近」来搜索。","doctor.msg.native-binding.not-installed.fix":"在使用 @pcircle/memesh 的文件夹运行 `npm install`。","doctor.msg.native-binding.load-failed.summary":"sqlite-vec 加载失败:{detail}。搜索只能用关键词。","doctor.msg.native-binding.load-failed.fix":'运行:cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"终端里打 `memesh` 找不到命令。Claude Code 的功能不受影响——只影响你自己在终端操作。","doctor.msg.shell-cli.not-on-path.fix":"运行 `npm install -g @pcircle/memesh` 补上。两种安装共用同一份记忆。","doctor.msg.dashboard.missing.summary":"仪表板的文件不见了。","doctor.msg.dashboard.missing.fix":"用 `cd dashboard && npm install && npm run build` 重建。","doctor.msg.update-status.no-cache.summary":"memesh 还没成功查过有没有新版本,所以无法告诉你要不要更新。","doctor.msg.update-status.no-cache.fix":"联网时运行一次 `memesh status`,查到结果后这条提醒就会消失。","doctor.msg.update-status.deprecated.summary":"你装的 {version} 已被官方下架:{detail}","doctor.msg.update-status.deprecated.fix":"请立即更新——运行 `memesh update`(或按你的安装方式升级)。","doctor.msg.update-status.deprecation-unknown.summary":"无法确认 {version} 这个版本是否仍然安全:{detail}","doctor.msg.update-status.deprecation-unknown.fix":"联网时运行 `memesh status` 重试。","doctor.msg.update-status.update-available.summary":"有新版本:{latest}(当前是 {current})。","doctor.msg.update-status.update-available.fix":"运行 `memesh update` 升级。","doctor.msg.update-status.stale.summary":"{version} 已是最新,但更新信息有点旧了。","doctor.msg.update-status.stale.fix":"联网时运行 `memesh status` 刷新一下。","doctor.msg.http-probe.bad-status.summary":"{url} 的本机服务器返回了错误(HTTP {status})。","doctor.msg.http-probe.bad-status.fix":"用 `memesh serve` 重启并查看日志。","doctor.msg.http-probe.no-server.summary":"{url} 没有本机服务器在运行。","doctor.msg.http-probe.no-server.fix":"想用仪表板的话,用 `memesh serve` 启动一个。","doctor.msg.skills-manifest.missing-dev.summary":"找不到文件完整性清单(从源码运行时属正常)。","doctor.msg.skills-manifest.missing-dev.fix":"运行 `npm run build` 生成。","doctor.msg.skills-manifest.unreadable.summary":"文件完整性清单读不到({detail})。","doctor.msg.skills-manifest.unreadable.fix":"重新安装:`npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.empty.summary":"文件完整性清单是空的。","doctor.msg.skills-manifest.empty.fix":"重新安装:`npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.verify-failed.summary":"部分内附文件与出厂内容不一致:{detail}","doctor.msg.skills-manifest.verify-failed.fix":"重新安装:`npm install -g @pcircle/memesh`。全新安装仍出现的话,请作为安全问题上报。","doctor.msg.config-parse.not-object.summary":"{path} 的配置文件格式不对,所有设置目前都被忽略。","doctor.msg.config-parse.not-object.fix":"修好或删掉 {path},再运行 `memesh doctor`。","doctor.msg.config-parse.unreadable.summary":"{path} 的配置文件读不到({detail}),所有设置目前都被忽略。","doctor.msg.config-parse.unreadable.fix":"修好文件,或先移开:mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":"语义搜索设置为「{provider}」,但测试时没有产生任何结果。关键字搜索不受影响。","doctor.msg.embeddings.empty.fix":"运行 `memesh doctor --probe` 看细节,或检查该服务的连接。","doctor.msg.embeddings.threw.summary":"语义搜索设置为「{provider}」,但测试失败:{detail}。关键字搜索不受影响。","doctor.msg.embeddings.threw.fix":"检查 embedding 服务是否可连接(例如运行 `ollama serve`),或移除 embedder 配置以改用纯关键词搜索。","doctor.msg.llm.unreachable.summary":"AI 服务({provider})没有响应:{detail}。AI 相关功能目前默默停摆。","doctor.msg.llm.unreachable.fix":"检查 API key 和连接,再运行 `memesh doctor --probe`。","doctor.msg.llm.threw.summary":"测试 AI 服务({provider})失败:{detail}。AI 相关功能目前默默停摆。","doctor.msg.llm.threw.fix":"检查 API key 和连接,再运行 `memesh doctor --probe`。","doctor.msg.install-channel.unknown.summary":"看不出 memesh 是怎么安装的。","doctor.msg.install-channel.unknown.fix":"源码安装请在 repo 根目录运行;包安装请用 `npm install -g @pcircle/memesh` 重装。","doctor.msg.fts.unsegmented.summary":"关键字索引有 {count} 条是旧格式——部分记忆只有完整原文才搜得到。","doctor.msg.fts.unsegmented.fix":"运行 `memesh reindex --fts` 重建索引。","doctor.msg.vector-index.stale.summary":"搜索索引需要重建(搜索设置变更过)。","doctor.msg.vector-index.stale.fix":"运行 `memesh reindex` 重建。","doctor.msg.vector-generation.open.summary":"有一个未完成的索引重建正占着磁盘空间。","doctor.msg.vector-generation.open.fix":"执行 `memesh reindex` 完成它,或 `memesh reindex --discard-generation` 回收空间。","doctor.msg.database.broken.summary":"数据库无法使用:{detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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":"暂无召回数据。下次会话后开始追踪有效性。","recall.summary":"已使用 {used} / 已注入 {total}","analytics.loadFailed":"加载分析数据失败。","memory.noContent":"(无内容)","memory.archivedBadge":"已归档","memory.factsCount":"{count} 条事实","common.error":"错误","common.serverUnreachable":"无法连接 memesh 服务器。","common.serverUnreachableAction":"请确认 `memesh serve` 仍在运行,然后刷新此页面。","common.responseUnreadable":"服务器有响应,但此页面无法读取其内容——仪表板与服务器版本可能不同步。","common.responseUnreadableAction":"请刷新页面;若持续出现,运行 `memesh doctor`。","pm.title":"PM 指标","pm.decisionsPerWeek":"决策/周","pm.openDecisions":"未决决策(>14 天)","pm.orphanRate":"未连接的记忆","pm.relationsTotal":"关系总数","pm.stalePlans":"{count} 个计划超过 30 天未回顾","common.loading":"加载中…","common.noData":"没有数据","errors.unknown":"发生未知错误","insights.noPreview":"这条提案没有摘要内容","httpError.auth.missing-bearer":"此服务器需要访问令牌,请输入令牌后继续。","httpError.auth.invalid-token":"访问令牌不正确,请检查后重试。","httpError.auth.not-configured":"服务器尚未设置访问令牌。请重启 `memesh serve` 并查看其输出。","httpError.validation.bad-body":"页面发送的请求服务器无法读取。请刷新页面后重试。","httpError.validation.bad-param":"请求中有字段不正确。请刷新页面后重试。","httpError.route.retired":"服务器已不支持此操作——页面和服务器版本可能不一致。请刷新页面。","httpError.route.not-found":"服务器不认识此请求——页面和服务器版本可能不一致。请刷新页面。","httpError.resource.not-found":"该项目已不存在,请刷新列表。","httpError.payload.too-large":"发送的数据太大(超过 1 MB),请分成较小的批次。","httpError.operation.failed":"服务器无法完成此操作。","httpError.llm.not-configured":"尚未配置 AI 提供商,请先到“设置”中添加。","httpError.rate.limited":"短时间内发送的请求过多。请稍候片刻再试一次。","httpError.server.internal":"服务器发生意外错误。","settings.testError.auth":"API 密钥被拒绝,请检查密钥后重试。","settings.testError.network":"无法连接到提供商,请检查网络连接。","settings.testError.no_models":"提供商有响应,但没有返回可用的模型。","settings.testError.bad_host":"Ollama 地址必须在本机上(localhost)。","settings.testError.http":"提供商返回错误(HTTP {status})。","settings.testError.unknown":"测试失败,原因未知。","time.justNow":"刚刚","time.hoursAgo":"{count} 小时前","time.today":"今天","time.yesterday":"昨天","time.daysAgo":"{count} 天前","time.lastWeek":"上周","time.weeksAgo":"{count} 周前","time.lastMonth":"上个月","time.monthsAgo":"{count} 个月前","memory.access.frequent":"常用 · {count} 次","memory.access.recalls":"{count} 次回忆","memory.access.never":"从未回忆","cluster.knowledge":"知识","cluster.activity":"活动","cluster.session":"工作记录","cluster.reference":"参考","cluster.all":"全部","browse.filterTime":"时间","browse.filterValue":"价值","browse.filterProject":"项目","browse.filterSort":"排序","browse.timeToday":"今天","browse.timeWeek":"本周","browse.timeMonth":"本月","browse.timeOlder":"更早","browse.valueRecalled":"✓ 用过","browse.valueNever":"从未回忆","browse.sortMostRecalled":"最常回忆","browse.sortRecent":"最近使用","browse.sortCreated":"创建时间","browse.emptyFilter":"此分类没有记忆 — 试试切换类别或时间","lessons.stepsLabel":"步骤","lessons.commitsCount":"{count} 个 commit","lessons.unstructured":"(此教训没有结构化字段,请查看原始记忆)","lessons.moreItems":"+{count} 条","roadmap.title":"项目路线图","roadmap.summary":"{count} 条记忆 · {first} → {last}","roadmap.switchToList":"↩ 列表视图","roadmap.switchToRoadmap":"🗺️ 路线图视图","roadmap.emptyProject":"此项目尚无记忆。","loop.label":"记忆循环","loop.subtitleHas":"本周被回忆的知识类型记忆","loop.subtitleNone":"本周尚无知识被回忆 — 试试唤起一则教训","loop.approxNote":"近似值 — 完整追踪从升级后开始累积","loop.sparkLabel":"最近 30 天","roadmap.milestones":"里程碑","roadmap.keyLessons":"重要教训","radar.title":"知识覆盖雷达","radar.caption":"显示有效知识记忆 (排除 session 和 commit)","radar.axis.lessons":"教训","radar.axis.decisions":"决策","radar.axis.patterns":"模式","radar.axis.bugs":"问题修复","radar.axis.processes":"流程","radar.axis.architecture":"架构","ageMatrix.title":"记忆年龄分布","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"颜色深度 = 记忆密度","ageMatrix.typeColumn":"类型","header.signalModeOn":"信号","header.signalModeOff":"全部","header.signalModeOnHint":"已隐藏 session 与 commit 等噪音。点击显示全部。","header.signalModeOffHint":"显示包含 session 与 commit 在内的所有记忆。点击隐藏噪音。","roadmap.phases":"阶段","onboarding.title":"欢迎使用 MeMesh","onboarding.body":"你的记忆库还是空的。从 30 条精选示例开始体验,或直接存下你的第一则教训。","onboarding.llmHint":"不需要 LLM。所有功能都靠 FTS5 运作。LLM 只用在自动产生教训,可以之后再到设置页开启。","onboarding.seedButton":"一键载入示范数据","onboarding.seedingButton":"载入中…","onboarding.seedHint":"直接在这里载入 30 条,之后可一键清除,不用切到终端","onboarding.cliReference":"习惯 CLI?","onboarding.hintDemo":"植入 30 条示范记忆,之后可一键清除","onboarding.hintReset":"移除所有 metadata.demo 标记的记忆","onboarding.resetButton":"清除示范数据","onboarding.resettingButton":"清除中…","onboarding.resetConfirm":"确定要移除所有示范记忆?你自己存的内容会保留。","onboarding.dismiss":"关闭","common.serverError":"服务器报告错误(HTTP {status})。请再试一次;若持续发生,请运行 `memesh doctor`。","emptyLibrary.title":"你的记忆库是空的","emptyLibrary.body":"这里还没有任何记忆。载入 30 条示范数据,马上看到 MeMesh 的完整功能——之后可一键清除。","browse.truncated":"当前显示前 {shown} 条(共 {total} 条)——用搜索或筛选找到其余的记忆","browse.truncatedUnknownTotal":"当前显示前 {shown} 条——读不到总数,可能还有更多","graph.cappedNote":"只显示前 {shown} 个节点(共 {total} 个,按回想次数排序),让图表保持流畅。","settings.testStoredKeyHint":"字段留空即测试已保存的密钥。","ageMatrix.bucket.week":"本周","ageMatrix.bucket.month":"本月","ageMatrix.bucket.quarter":"本季","ageMatrix.bucket.older":"更早","settings.behaviourTitle":"行为设置","settings.autoUpdateLabel":"自动更新策略","settings.autoUpdateOff":"关闭 — 仅手动","settings.autoUpdatePatch":"Patch — 自动应用 X.Y.Z+1","settings.autoUpdateMinor":"Minor — 自动应用 X.Y+1.0","settings.autoUpdateMajor":"Major — 自动应用任何版本升级","settings.autoUpdateHint":"每次 session 结束后触发。MEMESH_AUTO_UPDATE 环境变量优先。","errors.timeout":"请求超时","type.lesson_learned":"教训","type.lesson":"教训","type.mistake":"错误","type.decision":"决策","type.architecture_decision":"架构决策","type.design_decision":"设计决策","type.pattern":"模式","type.technical_pattern":"技术模式","type.best_practice":"最佳实践","type.bug_fix":"问题修复","type.verification_result":"验证结果","type.test_result":"测试结果","type.process":"流程","type.architecture":"架构","type.infrastructure":"基础设施","type.feature":"功能","type.release":"版本发布","type.refactoring":"重构","type.commit":"提交","type.session_keypoint":"会话要点","type.session_identity":"会话身份","type.session-insight":"会话洞察","type.session-summary":"会话摘要","type.session-identity":"会话身份","type.weekly_summary":"周摘要","type.weekly-summary":"周摘要","type.note":"笔记","type.plan":"计划","type.knowledge":"知识","type.workflow_checkpoint":"流程里程碑","type.concept":"概念","type.tool":"工具","type.person":"人物","relation.relates_to":"相关","relation.related-to":"相关","relation.depends_on":"依赖","relation.implements":"实现","relation.learned_from":"学习自","relation.supersedes":"取代","relation.contradicts":"矛盾","relation.follows":"接续","relation.belongs-to-project":"属于项目","relation.evidences":"证据","relation.co-created":"共同创建","relation.shares-name-tokens":"名称相似","patterns.day.0":"周日","patterns.day.1":"周一","patterns.day.2":"周二","patterns.day.3":"周三","patterns.day.4":"周四","patterns.day.5":"周五","patterns.day.6":"周六","telemetry.flow.dreamer":"周报整理(dreamer)","telemetry.flow.pattern_detector":"模式检测","telemetry.flow.digest_validator":"摘要验证","telemetry.flow.guard_proposer":"守卫提案器","telemetry.flow.auto_tagger":"自动标签","telemetry.flow.failure_analyzer":"失败分析","telemetry.flow.transcript_extractor":"对话记录挖掘","telemetry.flow.conflict_judge":"冲突判定","telemetry.errorClass.auth":"凭证被拒","telemetry.errorClass.rate_limit":"额度限制","telemetry.errorClass.upstream":"服务商故障","telemetry.errorClass.bad_request":"请求无效","telemetry.errorClass.network":"网络","telemetry.errorClass.parse":"响应无法解析","telemetry.errorClass.unknown":"未知","lessons.severity.critical":"严重","lessons.severity.major":"重大","lessons.severity.minor":"轻微","memory.tooltip.project":"项目","memory.tooltip.recalled":"已被回忆 {count} 次","memory.tooltip.hasRelations":"与 {count} 条记忆相连","memory.tooltip.createdAt":"创建于 {date}","graph.layerLabel":"图层","graph.layerWork":"工作","graph.layerAll":"全部","graph.layerWorkHint":"决策、教训与计划——工作本身。","graph.layerAllHint":"memesh 存下的每一条记忆,含机械捕捉。","graph.layerFellBack":"目前工作项目不到 {min} 条,改显示完整图谱。记下决策与教训后,这个视图就会长出来。","graph.evidenceFor":"{node} 的证据","graph.evidenceClose":"关闭","graph.evidenceLoading":"正在加载证据…","graph.evidenceFailed":"无法加载这个项目的证据。","graph.evidenceEmpty":"这个项目还没有连上证据。运行 `memesh kg backfill` 可从 commit 与 session 捕捉建立连结。","graph.evidenceTruncated":"显示最近 {shown} 条,还有更多。","graph.drift":"时效","graph.driftHint":"按新旧上色:红=久未使用,绿=最近使用","common.unknown":"未知","insights.entitiesCount":"{n} 个实体","roadmap.viewToggle":"路线图视图","roadmap.viewTree":"树状","roadmap.viewMindmap":"思维导图","roadmap.mindmapNeedsPhases":"思维导图需要 7 天内至少 3 条记忆。","roadmap.activePhase":"进行中","roadmap.entryCount":"{count} 条","roadmap.entriesCount":"{count} 条","roadmap.otherGroup":"其他({count})","roadmap.lowSignalHidden":"(已隐藏 {count} 条低信号)","roadmap.resetHint":"重置缩放与位置(双击背景也可重置)","roadmap.zoomHint":"滚轮缩放 · 拖动平移 · {pct}%","roadmap.moreEntities":"还有 {count} 条","roadmap.viewDecisions":"决策","roadmap.densityTitle":"按类别的捕捉密度","roadmap.densityNote":"这是 memesh 捕捉到的,不等于发生过的一切","roadmap.lineageSupersedes":"{n} 条已被取代","roadmap.lineageConflicts":"{n} 条冲突未解决","adr.empty":"这个项目还没有记录任何决策。用类型「decision」记下一条,它就会带着自己的历史出现在这里。","adr.statusActive":"现行","adr.statusSuperseded":"已被取代","adr.supersedes":"取代","adr.supersededBy":"被取代","nav.ariaLabel":"仪表板分页","feedback.descLabel":"反馈内容","graph.canvasA11y":"知识图谱(画布绘制):{entities} 个实体、{relations} 条关系、{orphans} 个未连接。上方的类型筛选与搜索提供非视觉浏览方式。"},ja:{"auth.title":"認証が必要です","auth.intro":"このダッシュボードは bearer トークンで保護されています。MEMESH_REMOTE_TOKEN の値(または <memeshDir>/remote-token の内容)を下に貼り付けてください。","auth.tokenLabel":"トークン","auth.empty":"トークンを入力してください。","auth.invalid":"このトークンは受け付けられませんでした。確認してもう一度お試しください。","auth.submit":"ダッシュボードのロックを解除","auth.tokenPlaceholder":"ここにトークンを貼り付け","brand.subtitle":"powered by pcircle.com","header.connected":"接続中","header.disconnected":"切断","header.connecting":"接続しています…","header.memories":"件のメモリ","telemetry.title":"LLM アクティビティ","telemetry.lastNDays":"直近 {n} 日","telemetry.loading":"読み込み中…","telemetry.empty":"この期間の AI アクティビティはまだありません。バックグラウンドの AI 機能(週次まとめや自動タグ付けなど)が動くと、自動的にここに記録が表示されます。","telemetry.callsCount":"{n} 回の呼び出し","telemetry.attemptsCount":"{n} 回の試行","telemetry.successRate":"成功率","telemetry.medianLatency":"レイテンシ中央値","telemetry.fallbackUsed":"フォールバック使用 {n} 回(呼び出しの {pct})","telemetry.byProvider":"プロバイダ別","telemetry.byModel":"モデル別","telemetry.byProject":"プロジェクト別","telemetry.errors":"エラー","insights.title":"memesh が行ったこと","insights.subtitle":"自動生成された weekly recap と検出された pattern。レビュー待ち","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"すべて","insights.refresh":"更新","insights.loading":"読み込み中…","insights.emptyPending":"pending の insight はありません。`memesh dream run` で weekly recap を生成できます。","insights.emptyNoLlm":"weekly recap と pattern 検出を有効にするには、設定で LLM プロバイダを構成してください。","insights.emptyOther":"データがありません。","insights.sources":"ソース","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"詳細を見る","insights.collapse":"折りたたむ","insights.accept":"採用","insights.applying":"適用中…","insights.reject":"拒否","insights.generatedBy":"生成モデル","insights.promptVersion":"Prompt バージョン","insights.observations":"要約観察","insights.tags":"タグ","insights.sourceIds":"ソース entity","insights.validationWarnings":"疑わしい主張(LLM validator)","insights.validationClaim":"主張","insights.validationReason":"理由","insights.runDream":"weekly recap を実行","insights.runDreamWithValidate":"validator 付きで実行(遅いが高品質)","banner.pendingInsights":"{n} 件の新しい insight がレビュー待ち →","banner.dismiss":"閉じる","banner.viewAll":"すべて表示","pattern.title":"Pattern","pattern.evidenceCount":"{n} 件の証拠","pattern.severity":"重大度","pattern.severity.high":"高","pattern.severity.medium":"中","pattern.severity.low":"低","pattern.description":"Pattern の説明","tab.graph":"グラフ","tab.settings":"設定","tab.home":"ホーム","tab.memories":"メモリ","tab.project":"プロジェクト","memories.searchPlaceholder":"入力しながら絞り込み — Enter で関連度順に検索","memories.scopeLabel":"範囲","memories.scopeWork":"ワークレイヤー","memories.scopeEvidence":"証拠","memories.scopeAll":"すべて","memories.scopeArchived":"アーカイブ済み","memories.composition":"構成","memories.rankedBy":"関連度順","memories.backToList":"一覧に戻る","memories.workEmpty":"ワークレイヤーのメモリはまだありません — 目標・決定・教訓・プランは記録されるとここに表示されます。","memories.showAll":"すべてのメモリを表示","memories.expand":"詳細を表示","memories.collapse":"詳細を隠す","home.analyticsTitle":"分析","home.analyticsHint":"健康度・タイムライン・パターン・利用状況 — 必要なときに展開","project.selectLabel":"プロジェクト","project.selectPrompt":"プロジェクトを選ぶと履歴が表示されます。","project.empty":"プロジェクトのメモリはまだありません。memesh フックを導入した git リポジトリで作業すると、その歩みがここに表示されます。","guard.sourceLesson":"元の教訓","guard.pattern":"トリガーパターン","guard.message":"発する警告","guard.shouldMatch":"必ず反応する入力","guard.shouldNotMatch":"反応してはいけない入力","search.button":"検索","search.searching":"検索中…","search.results":"件の結果","search.result":"件の結果","search.noResults":"結果が見つかりません:","search.facts":"件の事実","browse.title":"すべてのメモリ","browse.active":"アクティブ","browse.archived":"アーカイブ済み","browse.refresh":"更新","browse.noMatch":"一致するメモリがありません:","browse.prev":"← 前へ","browse.next":"次へ →","browse.archive":"アーカイブ","browse.restore":"復元","browse.confirmArchive":"このメモリをアーカイブしますか?","browse.archiveFailed":"アーカイブできませんでした: {message}","browse.restoreFailed":"復元できませんでした: {message}","analytics.totalMemories":"メモリ総数","analytics.knowledgeFacts":"知識ファクト","analytics.connections":"接続","analytics.topics":"トピック","analytics.insights":"インサイト","analytics.thisWeek":"今週","analytics.new":"件の新規","analytics.stale":"未使用(30日以上)","analytics.archivedLabel":"アーカイブ済み","analytics.mostRecalled":"よく参照される","health.title":"メモリ健康度","metrics.notMeasured":"未計測","metrics.health":"健全性","metrics.healthNote":"活動・品質・鮮度・教訓","metrics.critical":"重大な教訓","metrics.criticalPartial":"分類済み {tagged} 件のうち · 教訓は全 {total} 件","metrics.criticalAll":"全 {total} 件の教訓、すべて分類済み","metrics.criticalUnclassified":"教訓 {total} 件、重大度は未分類","metrics.criticalNoLessons":"教訓はまだ記録されていません","metrics.citation":"引用率","metrics.citationNote":"{total} セッション中 {cited} 件が記憶を引用","metrics.citationNotMeasured":"引用の計測は次のセッションから始まります","metrics.reused":"今週の再利用","metrics.reusedNote":"概算——最終アクセス日から推定","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.entityMeta":"{type} ・ 信頼度 {confidence}% ・ {days}日未使用","settings.capabilities":"機能状態","settings.smartMode":"スマートモード","settings.core":"コア","settings.embeddings":"エンベディング","settings.llmProvider":"LLMプロバイダー","settings.llmOptional.title":"LLM はオプションです","settings.llmOptional.body":"memesh は LLM なしでも動作します。デフォルトのコアモードは全文リコール、手動の remember/recall、ダッシュボード、フックによるセッション自動キャプチャをカバーします。","settings.llmOptional.coreLabel":"LLM なし(コアモード)","settings.llmOptional.coreFeatures":"FTS5 キーワード検索、手動 remember/recall、ダッシュボード、フックによるセッションキャプチャ","settings.llmOptional.smartLabel":"LLM あり(スマートモード)","settings.llmOptional.smartFeatures":"セッション失敗から lesson_learned を自動抽出、新規エンティティの自動タグ付け、週次まとめとパターン検出","settings.apiKey":"APIキー","settings.fallbacks.title":"フォールバックプロバイダー","settings.fallbacks.explainer":"メインのプロバイダーが利用できない場合、memesh はこれらを順番に試し、成功するものを使います。","settings.fallbacks.privacyTitle":"プライバシーに関する注意","settings.fallbacks.privacyBody":"クラウドプロバイダー(OpenAI または Anthropic)を追加すると、メインのプロバイダーが停止したときに、あなたのメモリ内容(プライベートな場合があります)がそのクラウドプロバイダーに送信されます。プライバシーのためにローカルプロバイダーを使っている場合は、このトレードオフを理解したうえで追加してください。","settings.fallbacks.empty":"フォールバックプロバイダーはまだありません。","settings.fallbacks.add":"フォールバックプロバイダーを追加","settings.fallbacks.providerLabel":"プロバイダー","settings.fallbacks.modelLabel":"モデル(任意)","settings.fallbacks.modelPlaceholder":"例:gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"キーは保存済みです。空欄のままにすると保持されます。","settings.fallbacks.remove":"削除","settings.fallbacks.moveUp":"上へ","settings.fallbacks.moveDown":"下へ","settings.fallbacks.priority":"優先度 {n}","settings.fallbacks.save":"フォールバック順を保存","settings.fallbacks.needsKey":"API キーを入力してください。入力しないとこのクラウドフォールバックは使用できません。","settings.model":"モデル(任意)","settings.save":"保存","settings.saving":"保存中…","settings.saved":"保存しました","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"接続テスト","settings.testing":"テスト中…","settings.testPassed":"✓ 接続成功 · {count} 個のモデルが利用可能","settings.testFailed":"接続テストに失敗しました","settings.suggested":"推奨","settings.testRequired":"保存前に接続をテストしてください","settings.language":"言語","settings.searchMode":"検索モード","settings.none":"なし","settings.updates":"アップデート","settings.updateChecking":"更新を確認中…","settings.updateUnavailable":"現在は更新を確認できません","settings.updateNoSuccessfulChecks":"まだ一度も更新確認に成功していません","settings.upToDate":"最新です","settings.updateAvailable":"更新があります","settings.updateStale":"表示中のキャッシュ結果は古い可能性があります","settings.updateCachedFallback":"前回成功したキャッシュ結果を使用しています","settings.updateDeprecatedNoTarget":"非推奨 — まだアップグレード先がありません","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} はメンテナーによって非推奨 (DEPRECATED) としてマークされています。","settings.updatePartialTitle":"⚠️ 更新チェックが部分的に失敗しました","settings.updatePartialDescription":"{message}。このセッションでは非推奨ステータスを確認できません — オンラインに復帰してから再実行してください。","settings.updatePartialSummary":"部分的 — 非推奨ステータス未確認","settings.updateDeprecatedTargetUnknown":"非推奨 — アップグレード先を確認中","settings.currentVersion":"現在のバージョン","settings.latestVersion":"最新バージョン","settings.lastChecked":"最終確認","settings.lastAttempted":"最終確認試行","settings.lastSuccessful":"最後に成功した確認","settings.updateSourceFresh":"今すぐ確認","settings.updateSourceCached":"キャッシュ結果を使用","settings.updateSourceStale":"古いキャッシュ結果を使用","settings.updateSourceUnavailable":"利用できるキャッシュなし","settings.updateCommand":"更新コマンド","settings.checkNow":"今すぐ確認","settings.updateLastError":"前回の確認エラー: {message}","settings.installMethod":"インストール方法","settings.installNpmGlobal":"npm グローバルインストール","settings.installNpmLocal":"プロジェクトローカルのパッケージインストール","settings.installSourceCheckout":"ソースチェックアウト","settings.installUnknown":"不明","settings.updateGuidanceNpmGlobal":"このインストールは MeMesh から直接更新できます。","settings.updateGuidanceNpmLocal":"このインストールを追加したプロジェクトのパッケージマネージャーから更新してください。","settings.updateGuidanceSourceCheckout":"このソースチェックアウトはリポジトリから更新して再ビルドしてください。","settings.updateGuidanceUnknown":"MeMesh をインストールしたツールまたは手順からこのインストールを更新してください。","graph.entities":"エンティティ","graph.relations":"リレーション","graph.orphans":"孤立ノード","graph.search":"ノードを検索…","graph.matches":"件一致","graph.focusMode":"フォーカス","graph.showAll":"すべて表示","graph.clickHint":"ノードをクリックしてフォーカス","graph.interactHint":"ノードをクリックしてフォーカス · 空白をドラッグでパン · スクロールでズーム","graph.resetView":"ビューをリセット","graph.resetViewHint":"ズームと位置をリセット","graph.ageToday":"今日","graph.ageDaysAgo":"{count}日前","graph.ageWeeksAgo":"{count}週間前","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 を作成","feedback.submitting":"診断情報を収集中…","doctorBanner.warnTitleSoft":"memesh セットアップに注記があります","doctorBanner.failTitle":"memesh のセットアップが不完全です","doctorBanner.dismiss":"閉じる","doctorBanner.getHelp":"サポートを受ける","doctorBanner.helpHint":"診断情報が事前入力された GitHub Issue を開きます","doctorBanner.preambleForIssue":"memesh doctor が私のインストールで以下を検出しました:","doctorBanner.moreCount":"…ほか {n} 件 — 全リストは `memesh doctor` で確認できます","doctor.label.readme_locale_parity":"README の翻訳","doctor.label.config":"設定ファイル","doctor.label.mcp-config":"MCP 接続ファイル","doctor.label.hooks-config":"フック定義","doctor.label.hook-scripts":"フックスクリプト","doctor.label.hook-wiring":"Claude Code との接続","doctor.label.hook-activity":"自動記録","doctor.label.node-runtime":"Node.js のバージョン","doctor.label.native-binding":"SQLite とベクトル検索","doctor.label.shell-cli":"ターミナルコマンド","doctor.label.dashboard":"ダッシュボードのファイル","doctor.label.update-status":"アップデート","doctor.label.http-probe":"ローカルサーバー","doctor.label.skills-manifest":"同梱ファイル","doctor.label.config_parse":"設定ファイル","doctor.label.embeddings_probe":"意味ベース検索","doctor.label.llm_probe":"AI プロバイダー","doctor.label.install-channel":"インストール方法","doctor.label.fts_segmentation":"キーワード索引","doctor.label.vector_index":"検索インデックス","doctor.label.database":"データベース","doctor.msg.readme-parity.unreadable.summary":"README.md を読み取れませんでした: {detail}","doctor.msg.readme-parity.drift.summary":"一部の翻訳版 README が英語版とずれています: {detail}","doctor.msg.readme-parity.drift.fix":"挙げられた README を README.md に合わせて更新してください。","doctor.msg.config.invalid-json.summary":"{path} の設定ファイルは有効な JSON ではないため、無視されています。","doctor.msg.config.invalid-json.fix":"{path} を修正するか削除し、`memesh config list` で読み込めるか確認してください。","doctor.msg.mcp-config.missing.summary":"memesh を Claude Code につなぐファイル(.mcp.json)が見つかりません。","doctor.msg.mcp-config.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.mcp-config.invalid-json.summary":".mcp.json が壊れています(有効な JSON ではありません)。Claude Code が読み取れません。","doctor.msg.mcp-config.invalid-json.fix":"{path} を修正するか、MeMesh を再インストールしてください。","doctor.msg.mcp-config.no-entry.summary":".mcp.json に memesh サーバーの設定がなくなっています。","doctor.msg.mcp-config.no-entry.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` が起動しようとしているファイルがこのインストールに存在しないため、Claude Code 内の memesh ツールがすべて起動しません。","doctor.msg.mcp-config.entry-missing.fix":"MeMesh を再インストールしてください。`.mcp.json` を手で編集した場合は `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js` に戻してください。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json が見つからないため、自動の記憶保存が動きません。","doctor.msg.hooks-config.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json が壊れています(有効な JSON ではありません)。","doctor.msg.hooks-config.invalid-json.fix":"{path} を修正するか、MeMesh を再インストールしてください。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json に次のフックタイプがありません: {types}。一部の自動記録は動作しません。","doctor.msg.hooks-config.missing-types.fix":"出荷時のフック設定を復元するか、MeMesh を再インストールしてください。","doctor.msg.hook-scripts.none.summary":"フック設定にスクリプトが 1 つもないため、何も自動記録できません。","doctor.msg.hook-scripts.none.fix":"MeMesh を再インストールしてください。","doctor.msg.hook-scripts.missing.summary":"次のフックスクリプトが見つかりません: {files}","doctor.msg.hook-scripts.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.hook-scripts.not-executable.summary":"次のフックスクリプトは存在しますが、実行が許可されていません: {files}","doctor.msg.hook-scripts.not-executable.fix":"`chmod +x scripts/hooks/*.js` を実行してください。ソースからの場合は `npm run build` を実行します。","doctor.msg.hook-wiring.no-marker.summary":"memesh はまだ Claude Code に接続されていないため、何も自動で記憶されません。","doctor.msg.hook-wiring.no-marker.fix":"`memesh install-hooks` を一度実行し、`memesh doctor` で確認してください。","doctor.msg.hook-wiring.script-missing.summary":"配線済みの memesh フックが {path} を指していますが、このファイルはもう存在しません — エージェントは該当イベントのたびに存在しないファイルを呼び出します。フックを廃止したアップグレードの残骸であることが多いです。","doctor.msg.hook-wiring.script-missing.fix":"`memesh install-hooks` を実行して配線し直し(廃止済み項目は削除されます)、エージェントを再起動してください。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} の接続記録を読み取れません。","doctor.msg.hook-wiring.marker-unreadable.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.marker-malformed.summary":"接続記録が壊れています。","doctor.msg.hook-wiring.marker-malformed.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code の設定ファイル({path})がなくなっているため、接続が切れています。","doctor.msg.hook-wiring.settings-missing.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} が壊れています(有効な JSON ではありません)。","doctor.msg.hook-wiring.settings-invalid.fix":"バックアップから復元するか、`memesh install-hooks` で作り直してください。","doctor.msg.hook-wiring.entries-removed.summary":"{path} から memesh の設定が削除されたため、接続が切れています。","doctor.msg.hook-wiring.entries-removed.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.root-moved.summary":"接続先の {path} はもう存在しません(memesh が移動された可能性があります)。","doctor.msg.hook-wiring.root-moved.fix":"`memesh install-hooks` を実行して更新してください。","doctor.msg.hook-activity.never-ran.summary":"記録の追跡を始めてから {hours} 時間、キャプチャフックが一度も実行されていません。フックの配線は正常なので、実行されるはずのものが動いておらず、何も記憶されていません。","doctor.msg.hook-activity.never-ran.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。まだフックが実行されていないと表示される場合は `memesh install-hooks` を実行してエージェントを再起動してください。","doctor.msg.hook-activity.stale.summary":"最後にキャプチャフックが実行されたのは約 {hours} 時間前です({hook})。それ以降に作業しているなら、キャプチャは停止しており、そのセッションの内容は保存されていません。","doctor.msg.hook-activity.stale.fix":"エージェントを再起動し、セッションを 1 回終えてから `memesh doctor` を再実行してください。回復しない場合は `memesh install-hooks` を実行してください。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary フックの最終実行は約 {hours} 時間前で、直近 3 日間 Claude Code からの書き込みもありません。このマシンが別のエージェント(Codex / Gemini)に移行したなら正常です。まだここで Claude Code を使っているなら、キャプチャは停止しています。","doctor.msg.hook-activity.stale-unconfirmed.fix":"このマシンでまだ Claude Code を使っている場合:再起動し、セッションを 1 回終えてから `memesh doctor` を再実行してください。回復しなければ `memesh install-hooks` を実行してください。","doctor.msg.hook-activity.query-failed.summary":"データベースからフックの実行履歴を読めませんでした:{detail}。キャプチャの状態は「不明」であり、「正常」とは違います。","doctor.msg.hook-activity.query-failed.fix":"`memesh doctor --verbose` で完全なエラーを確認し、~/.memesh が読み取り可能でディスクに空きがあることを確認してください。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} フックの最終実行時刻が読み取れません(データ破損、または時計が狂ったマシンが記録した可能性があります)。キャプチャの状態は「不明」であり、「正常」とは違います。","doctor.msg.hook-activity.stale-unknown.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。新しい実行が壊れたタイムスタンプを上書きします。","doctor.msg.hook-activity.disabled.summary":"自動キャプチャはオフになっています(MEMESH_AUTO_CAPTURE または設定の autoCapture)。意図的な設定のため、フックが動かないのは想定どおりです。再開するには設定を戻してください。","doctor.msg.hook-activity.disabled-env.summary":"この shell の環境変数 MEMESH_AUTO_CAPTURE=false により自動キャプチャはオフです。doctor は自分の環境しか見えません — エージェントがこの変数なしで動いていれば、そちらのキャプチャは影響を受けません。","doctor.msg.hook-activity.not-wired.summary":"キャプチャフックは一度も実行されていません — そしてこのマシンではキャプチャフック(Stop / PostToolUse / PreCompact)の配線が確認できないため、実行されるものがそもそもありません。","doctor.msg.hook-activity.not-wired.fix":"自動キャプチャを使うには `memesh install-hooks` を実行してください。MCP のみのインストール(Codex / Gemini)であればこれは正常であり、無視してかまいません。","doctor.msg.hook-activity.stop-silent.summary":"{hook} フックは記録されていますが、追跡開始から {hours} 時間、session-summary フックは一度も実行されていません。コミットのキャプチャに隠れて、セッションのキャプチャが壊れている可能性があります。","doctor.msg.hook-activity.stop-silent.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。それでも session-summary が実行されていなければ、`memesh install-hooks` を実行してエージェントを再起動してください。","doctor.msg.hook-activity.never-ran-legacy.summary":"ハートビートを記録したフックはありませんが、追跡開始以降に {captured} 件の自動キャプチャの記憶が保存されています。ハートビート機能より前の旧バージョンのフックがまだ動いている可能性が高いです。","doctor.msg.hook-activity.never-ran-legacy.fix":"memesh のフックを現行バージョンに更新し(プラグイン:`/plugin update memesh`、npm:`memesh install-hooks`)、エージェントを再起動してください。","doctor.msg.node-runtime.too-old.summary":"お使いの Node.js はこのパッケージが対応するバージョンより古いです。{detail}","doctor.msg.node-runtime.too-old.fix":"Node.js を {required} 以上に更新し、もう一度 `memesh doctor` を実行してください。","doctor.msg.native-binding.node-too-old.summary":"このバージョンの Node に入っている SQLite は memesh には古すぎて、意味で検索する部分を読み込めません。完全な版は Node 22.13 からです。","doctor.msg.native-binding.node-too-old.fix":"Node を 22.13 以降に更新してから、もう一度 `memesh doctor` を実行してください。","doctor.msg.native-binding.not-installed.summary":"sqlite-vec がインストールされていません。記憶の保存とキーワード検索は動きますが、意味による検索は使えません。","doctor.msg.native-binding.not-installed.fix":"@pcircle/memesh を使うフォルダーで `npm install` を実行してください。","doctor.msg.native-binding.load-failed.summary":"sqlite-vec を読み込めませんでした: {detail}。検索はキーワードのみになります。","doctor.msg.native-binding.load-failed.fix":'実行: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"ターミナルで `memesh` コマンドが使えません。Claude Code の機能には影響ありません — 自分で `memesh` と入力するときだけの問題です。","doctor.msg.shell-cli.not-on-path.fix":"`npm install -g @pcircle/memesh` で追加できます。どちらのインストールも同じ記憶を共有します。","doctor.msg.dashboard.missing.summary":"ダッシュボードのファイルが見つかりません。","doctor.msg.dashboard.missing.fix":"`cd dashboard && npm install && npm run build` で作成してください。","doctor.msg.update-status.no-cache.summary":"memesh はまだ新しいバージョンの確認に成功していません。","doctor.msg.update-status.no-cache.fix":"オンラインのときに `memesh status` を一度実行してください。結果が保存され、この通知は消えます。","doctor.msg.update-status.deprecated.summary":"バージョン {version} は提供元によって取り下げられました: {detail}","doctor.msg.update-status.deprecated.fix":"今すぐ更新してください — `memesh update` を実行します(またはお使いのインストール方法に従ってください)。","doctor.msg.update-status.deprecation-unknown.summary":"バージョン {version} が今も安全に使えるか確認できませんでした: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"オンラインのときに `memesh status` を実行して再試行してください。","doctor.msg.update-status.update-available.summary":"新しいバージョンがあります: {latest}(現在は {current})。","doctor.msg.update-status.update-available.fix":"`memesh update` を実行して更新してください。","doctor.msg.update-status.stale.summary":"バージョン {version} は最新ですが、更新情報が古くなっています。","doctor.msg.update-status.stale.fix":"オンラインのときに `memesh status` を実行して更新してください。","doctor.msg.http-probe.bad-status.summary":"{url} のローカルサーバーがエラーを返しました(HTTP {status})。","doctor.msg.http-probe.bad-status.fix":"`memesh serve` で再起動し、ログを確認してください。","doctor.msg.http-probe.no-server.summary":"{url} で動いているローカルサーバーがありません。","doctor.msg.http-probe.no-server.fix":"ダッシュボードを使うなら `memesh serve` で起動してください。","doctor.msg.skills-manifest.missing-dev.summary":"ファイル整合性の一覧が見つかりません(ソースコードから実行している場合は正常です)。","doctor.msg.skills-manifest.missing-dev.fix":"`npm run build` を実行して生成してください。","doctor.msg.skills-manifest.unreadable.summary":"ファイル整合性の一覧を読み取れません({detail})。","doctor.msg.skills-manifest.unreadable.fix":"再インストール: `npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.empty.summary":"ファイル整合性の一覧が空です。","doctor.msg.skills-manifest.empty.fix":"再インストール: `npm install -g @pcircle/memesh`。","doctor.msg.skills-manifest.verify-failed.summary":"一部の同梱ファイルが出荷時の内容と一致しません: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"再インストール: `npm install -g @pcircle/memesh`。新規インストールでも再発する場合は、セキュリティ問題として報告してください。","doctor.msg.config-parse.not-object.summary":"{path} の設定ファイルが想定の形式ではないため、すべての設定が無視されています。","doctor.msg.config-parse.not-object.fix":"{path} を修正するか削除し、もう一度 `memesh doctor` を実行してください。","doctor.msg.config-parse.unreadable.summary":"{path} の設定ファイルを読み取れないため({detail})、すべての設定が無視されています。","doctor.msg.config-parse.unreadable.fix":"ファイルを修正するか、いったん退避してください: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":"意味ベース検索は「{provider}」に設定されていますが、テストで何も返しませんでした。キーワード検索は引き続き使えます。","doctor.msg.embeddings.empty.fix":"詳細は `memesh doctor --probe` で確認するか、プロバイダーの接続を確認してください。","doctor.msg.embeddings.threw.summary":"意味ベース検索は「{provider}」に設定されていますが、テストに失敗しました: {detail}。キーワード検索は引き続き使えます。","doctor.msg.embeddings.threw.fix":"エンベディングのプロバイダーに接続できるか確認するか(例: `ollama serve` を実行)、embedder 設定を削除してキーワードのみの検索に切り替えてください。","doctor.msg.llm.unreachable.summary":"AI プロバイダー({provider})から応答がありません: {detail}。AI 機能は何もしないまま止まっています。","doctor.msg.llm.unreachable.fix":"API key と接続を確認し、もう一度 `memesh doctor --probe` を実行してください。","doctor.msg.llm.threw.summary":"AI プロバイダー({provider})のテストに失敗しました: {detail}。AI 機能は何もしないまま止まっています。","doctor.msg.llm.threw.fix":"API key と接続を確認し、もう一度 `memesh doctor --probe` を実行してください。","doctor.msg.install-channel.unknown.summary":"memesh がどうインストールされたか判別できませんでした。","doctor.msg.install-channel.unknown.fix":"ソースからならリポジトリのルートで実行してください。そうでなければ `npm install -g @pcircle/memesh` で再インストールしてください。","doctor.msg.fts.unsegmented.summary":"キーワード索引に旧形式の項目が {count} 件あります — 一部の記憶は全文が完全に一致しないと見つかりません。","doctor.msg.fts.unsegmented.fix":"`memesh reindex --fts` を実行して索引を作り直してください。","doctor.msg.vector-index.stale.summary":"検索インデックスの再構築が必要です(検索設定が変わりました)。","doctor.msg.vector-index.stale.fix":"`memesh reindex` を実行して再構築してください。","doctor.msg.vector-generation.open.summary":"未完了のインデックス再構築がディスク領域を占有しています。","doctor.msg.vector-generation.open.fix":"`memesh reindex` で完了させるか、`memesh reindex --discard-generation` で領域を解放してください。","doctor.msg.database.broken.summary":"データベースが使えません: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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":"リコールデータはまだありません。次のセッション後に追跡が開始されます。","recall.summary":"{used} 件使用 / {total} 件注入","analytics.loadFailed":"分析データを読み込めませんでした。","memory.noContent":"(内容なし)","memory.archivedBadge":"アーカイブ済み","memory.factsCount":"{count}件の事実","common.error":"エラー","common.serverUnreachable":"memesh サーバーに接続できません。","common.serverUnreachableAction":"`memesh serve` が実行中か確認して、このページを再読み込みしてください。","common.responseUnreadable":"サーバーは応答しましたが、このページはその内容を読み取れませんでした。ダッシュボードとサーバーのバージョンが一致していない可能性があります。","common.responseUnreadableAction":"ページを再読み込みしてください。繰り返す場合は `memesh doctor` を実行してください。","pm.title":"PM メトリクス","pm.decisionsPerWeek":"意思決定/週","pm.openDecisions":"未解決の意思決定(14日超)","pm.orphanRate":"未接続のメモリ","pm.relationsTotal":"リレーション総数","pm.stalePlans":"30日以上見直されていないプランが {count} 件","common.loading":"読み込み中…","common.noData":"データがありません","errors.unknown":"不明なエラー","insights.noPreview":"この提案には要約テキストがありません","httpError.auth.missing-bearer":"このサーバーにはアクセストークンが必要です。トークンを入力してください。","httpError.auth.invalid-token":"アクセストークンが正しくありません。確認してもう一度お試しください。","httpError.auth.not-configured":"サーバーにアクセストークンが設定されていません。`memesh serve` を再起動して出力を確認してください。","httpError.validation.bad-body":"ページが送ったリクエストをサーバーが読み取れませんでした。ページを再読み込みしてもう一度お試しください。","httpError.validation.bad-param":"リクエストの一部が正しくありません。ページを再読み込みしてもう一度お試しください。","httpError.route.retired":"この操作はサーバーでサポートされなくなりました。ページとサーバーのバージョンが違う可能性があります。ページを再読み込みしてください。","httpError.route.not-found":"サーバーがこのリクエストを認識できません。ページとサーバーのバージョンが違う可能性があります。ページを再読み込みしてください。","httpError.resource.not-found":"その項目はもう存在しません。一覧を更新してください。","httpError.payload.too-large":"送信データが大きすぎます(1 MB 超)。小さく分けてお試しください。","httpError.operation.failed":"サーバーはこの操作を完了できませんでした。","httpError.llm.not-configured":"AI プロバイダーが未設定です。まず設定で追加してください。","httpError.rate.limited":"短時間にリクエストが多すぎます。少し待ってからもう一度お試しください。","httpError.server.internal":"サーバーで予期しないエラーが発生しました。","settings.testError.auth":"API キーが拒否されました。キーを確認してもう一度お試しください。","settings.testError.network":"プロバイダーに接続できません。ネットワーク接続を確認してください。","settings.testError.no_models":"プロバイダーは応答しましたが、使用できるモデルが返されませんでした。","settings.testError.bad_host":"Ollama のアドレスはこのマシン上(localhost)である必要があります。","settings.testError.http":"プロバイダーがエラーを返しました(HTTP {status})。","settings.testError.unknown":"原因不明でテストに失敗しました。","time.justNow":"たった今","time.hoursAgo":"{count} 時間前","time.today":"今日","time.yesterday":"昨日","time.daysAgo":"{count} 日前","time.lastWeek":"先週","time.weeksAgo":"{count} 週前","time.lastMonth":"先月","time.monthsAgo":"{count} ヶ月前","memory.access.frequent":"頻繁 · {count} 回","memory.access.recalls":"{count} 回呼出","memory.access.never":"未使用","cluster.knowledge":"知識","cluster.activity":"アクティビティ","cluster.session":"セッション","cluster.reference":"参照","cluster.all":"すべて","browse.filterTime":"時間","browse.filterValue":"価値","browse.filterProject":"プロジェクト","browse.filterSort":"並べ替え","browse.timeToday":"今日","browse.timeWeek":"今週","browse.timeMonth":"今月","browse.timeOlder":"それ以前","browse.valueRecalled":"✓ 使用済み","browse.valueNever":"未使用","browse.sortMostRecalled":"使用頻度順","browse.sortRecent":"最近の使用順","browse.sortCreated":"作成日順","browse.emptyFilter":"このカテゴリには記憶がありません — フィルタを変更してみてください","lessons.stepsLabel":"ステップ","lessons.commitsCount":"{count} コミット","lessons.unstructured":"(構造化フィールドなし — 元のメモリを参照)","lessons.moreItems":"あと {count} 件","roadmap.title":"プロジェクトロードマップ","roadmap.summary":"{count} 件の記憶 · {first} → {last}","roadmap.switchToList":"↩ リスト表示","roadmap.switchToRoadmap":"🗺️ ロードマップ表示","roadmap.emptyProject":"このプロジェクトにはまだ記憶がありません。","loop.label":"メモリループ","loop.subtitleHas":"過去 7 日間に呼び出された知識メモリ","loop.subtitleNone":"今週はまだ呼び出された知識がありません — 教訓を呼び出してみてください","loop.approxNote":"近似値 — 完全な追跡はアップグレード後に開始","loop.sparkLabel":"過去 30 日","roadmap.milestones":"マイルストーン","roadmap.keyLessons":"重要な教訓","radar.title":"知識カバレッジレーダー","radar.caption":"有効な知識メモリ (session と commit を除く)","radar.axis.lessons":"教訓","radar.axis.decisions":"決定","radar.axis.patterns":"パターン","radar.axis.bugs":"バグ修正","radar.axis.processes":"プロセス","radar.axis.architecture":"アーキテクチャ","ageMatrix.title":"メモリ年齢分布","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"色の濃さ = メモリ密度","ageMatrix.typeColumn":"タイプ","header.signalModeOn":"シグナル","header.signalModeOff":"すべて","header.signalModeOnHint":"session と commit のノイズを非表示。クリックで全表示。","header.signalModeOffHint":"session と commit を含む全メモリを表示中。クリックでノイズを非表示。","roadmap.phases":"フェーズ","onboarding.title":"MeMesh へようこそ","onboarding.body":"メモリは空です。30 件のキュレーション済みツアーで始めるか、最初の教訓を記録してください。","onboarding.llmHint":"LLM は不要です。すべての機能は FTS5 のみで動作します。LLM は自動レッスン生成のオプションで、後から設定で有効化できます。","onboarding.seedButton":"デモツアーを開始","onboarding.seedingButton":"読み込み中…","onboarding.seedHint":"端末を開かずに 30 件追加。後でいつでも削除可能","onboarding.cliReference":"CLI を使う場合","onboarding.hintDemo":"30 件のデモメモリを投入(後で削除可)","onboarding.hintReset":"metadata.demo タグの全エンティティを削除","onboarding.resetButton":"デモを削除","onboarding.resettingButton":"削除中…","onboarding.resetConfirm":"デモメモリをすべて削除しますか?自分で保存したものは残ります。","onboarding.dismiss":"閉じる","common.serverError":"サーバーがエラーを返しました(HTTP {status})。もう一度お試しください。繰り返す場合は `memesh doctor` を実行してください。","emptyLibrary.title":"メモリは空です","emptyLibrary.body":"まだ何も保存されていません。30 件のデモツアーを読み込めば MeMesh の動きをすぐ確認できます(後で一括削除可)。","browse.truncated":"全 {total} 件のうち先頭 {shown} 件を表示中 — 残りは検索やフィルタで絞り込んでください","browse.truncatedUnknownTotal":"先頭 {shown} 件を表示中 — 総数を取得できないため、さらにある可能性があります","graph.cappedNote":"全 {total} 件のうち上位 {shown} 件のみ表示中(想起回数順)。グラフの動作を軽く保つためです。","settings.testStoredKeyHint":"空欄のままテストすると保存済みのキーを使用します。","ageMatrix.bucket.week":"今週","ageMatrix.bucket.month":"今月","ageMatrix.bucket.quarter":"今四半期","ageMatrix.bucket.older":"それ以前","settings.behaviourTitle":"動作設定","settings.autoUpdateLabel":"自動更新ポリシー","settings.autoUpdateOff":"オフ — 手動のみ","settings.autoUpdatePatch":"Patch — X.Y.Z+1 を自動適用","settings.autoUpdateMinor":"Minor — X.Y+1.0 を自動適用","settings.autoUpdateMajor":"Major — 任意のバンプを自動適用","settings.autoUpdateHint":"セッション終了後にトリガー。MEMESH_AUTO_UPDATE 環境変数が優先。","errors.timeout":"リクエストがタイムアウトしました","type.lesson_learned":"教訓","type.lesson":"教訓","type.mistake":"ミス","type.decision":"決定","type.architecture_decision":"アーキ決定","type.design_decision":"デザイン決定","type.pattern":"パターン","type.technical_pattern":"技術パターン","type.best_practice":"ベストプラクティス","type.bug_fix":"バグ修正","type.verification_result":"検証結果","type.test_result":"テスト結果","type.process":"プロセス","type.architecture":"アーキテクチャ","type.infrastructure":"インフラ","type.feature":"機能","type.release":"リリース","type.refactoring":"リファクタリング","type.commit":"コミット","type.session_keypoint":"セッション要点","type.session_identity":"セッション識別","type.session-insight":"セッション洞察","type.session-summary":"セッション要約","type.session-identity":"セッション識別","type.weekly_summary":"週次まとめ","type.weekly-summary":"週次まとめ","type.note":"ノート","type.plan":"計画","type.knowledge":"知識","type.workflow_checkpoint":"ワークフロー","type.concept":"概念","type.tool":"ツール","type.person":"人物","relation.relates_to":"関連","relation.related-to":"関連","relation.depends_on":"依存","relation.implements":"実装","relation.learned_from":"由来","relation.supersedes":"置き換え","relation.contradicts":"矛盾","relation.follows":"後続","relation.belongs-to-project":"プロジェクト所属","relation.evidences":"根拠","relation.co-created":"共同作成","relation.shares-name-tokens":"名称類似","patterns.day.0":"日曜","patterns.day.1":"月曜","patterns.day.2":"火曜","patterns.day.3":"水曜","patterns.day.4":"木曜","patterns.day.5":"金曜","patterns.day.6":"土曜","telemetry.flow.dreamer":"週次まとめ(dreamer)","telemetry.flow.pattern_detector":"パターン検出","telemetry.flow.digest_validator":"ダイジェスト検証","telemetry.flow.guard_proposer":"ガード提案","telemetry.flow.auto_tagger":"自動タグ付け","telemetry.flow.failure_analyzer":"失敗分析","telemetry.flow.transcript_extractor":"会話ログ抽出","telemetry.flow.conflict_judge":"競合判定","telemetry.errorClass.auth":"認証拒否","telemetry.errorClass.rate_limit":"レート制限","telemetry.errorClass.upstream":"プロバイダ障害","telemetry.errorClass.bad_request":"不正なリクエスト","telemetry.errorClass.network":"ネットワーク","telemetry.errorClass.parse":"応答解析不能","telemetry.errorClass.unknown":"不明","lessons.severity.critical":"致命的","lessons.severity.major":"重大","lessons.severity.minor":"軽微","memory.tooltip.project":"プロジェクト","memory.tooltip.recalled":"{count} 回呼び出されました","memory.tooltip.hasRelations":"{count} 件の記憶とリンク","memory.tooltip.createdAt":"作成: {date}","graph.layerLabel":"グラフの層","graph.layerWork":"仕事","graph.layerAll":"すべて","graph.layerWorkHint":"決定・教訓・計画——仕事そのもの。","graph.layerAllHint":"memesh が保存したすべての記憶(機械的な記録を含む)。","graph.layerFellBack":"仕事の項目が {min} 件未満のため、全体グラフを表示しています。決定や教訓を記録すると、この表示が育ちます。","graph.evidenceFor":"{node} の根拠","graph.evidenceClose":"閉じる","graph.evidenceLoading":"根拠を読み込み中…","graph.evidenceFailed":"この項目の根拠を読み込めませんでした。","graph.evidenceEmpty":"この項目にはまだ根拠が結び付いていません。`memesh kg backfill` を実行すると、コミットやセッションの記録からリンクを作成します。","graph.evidenceTruncated":"最新の {shown} 件を表示しています。さらにあります。","graph.drift":"鮮度","graph.driftHint":"古さで色分け:赤=長く未使用、緑=最近使用","common.unknown":"不明","insights.entitiesCount":"{n} 件のエンティティ","roadmap.viewToggle":"ロードマップ表示","roadmap.viewTree":"ツリー","roadmap.viewMindmap":"マインドマップ","roadmap.mindmapNeedsPhases":"マインドマップには 7 日以内の記憶が 3 件以上必要です。","roadmap.activePhase":"進行中","roadmap.entryCount":"{count} 件","roadmap.entriesCount":"{count} 件","roadmap.otherGroup":"その他({count})","roadmap.lowSignalHidden":"(低シグナル {count} 件を非表示)","roadmap.resetHint":"ズームと位置をリセット(背景をダブルクリックでも可)","roadmap.zoomHint":"スクロールでズーム · ドラッグでパン · {pct}%","roadmap.moreEntities":"他 {count} 件","roadmap.viewDecisions":"決定","roadmap.densityTitle":"カテゴリ別のキャプチャ密度","roadmap.densityNote":"memesh がキャプチャしたものであり、起きたことのすべてではありません","roadmap.lineageSupersedes":"{n} 件が置き換え済み","roadmap.lineageConflicts":"{n} 件の未解決の矛盾","adr.empty":"このプロジェクトにはまだ決定が記録されていません。タイプ「decision」で記録すると、履歴とともにここに表示されます。","adr.statusActive":"有効","adr.statusSuperseded":"置き換え済み","adr.supersedes":"置き換え元","adr.supersededBy":"置き換え先","nav.ariaLabel":"ダッシュボードのセクション","feedback.descLabel":"フィードバックの内容","graph.canvasA11y":"ナレッジグラフ(キャンバス描画):エンティティ {entities} 件、関係 {relations} 件、未接続 {orphans} 件。上部の種類フィルターと検索で非視覚的に閲覧できます。"},ko:{"auth.title":"인증 필요","auth.intro":"이 대시보드는 bearer 토큰으로 보호됩니다. 아래에 MEMESH_REMOTE_TOKEN 값(또는 <memeshDir>/remote-token 파일의 내용)을 붙여넣으세요.","auth.tokenLabel":"토큰","auth.empty":"토큰을 입력하세요.","auth.invalid":"이 토큰은 승인되지 않았습니다. 확인 후 다시 시도해 주세요.","auth.submit":"대시보드 잠금 해제","auth.tokenPlaceholder":"여기에 토큰을 붙여넣으세요","brand.subtitle":"powered by pcircle.com","header.connected":"연결됨","header.disconnected":"연결 끊김","header.connecting":"연결 중…","header.memories":"개의 기억","telemetry.title":"LLM 활동","telemetry.lastNDays":"최근 {n}일","telemetry.loading":"불러오는 중…","telemetry.empty":"이 기간에는 아직 AI 활동이 없습니다. 백그라운드 AI 기능(주간 요약, 자동 태깅 등)이 실행되면 여기에 자동으로 기록이 나타납니다.","telemetry.callsCount":"{n} 회 호출","telemetry.attemptsCount":"{n} 회 시도","telemetry.successRate":"성공률","telemetry.medianLatency":"지연 시간 중앙값","telemetry.fallbackUsed":"fallback {n}회 사용 (호출의 {pct})","telemetry.byProvider":"프로바이더별","telemetry.byModel":"모델별","telemetry.byProject":"프로젝트별","telemetry.errors":"오류","insights.title":"memesh가 한 일","insights.subtitle":"자동 생성된 weekly recap과 발견된 pattern. 검토 대기 중","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"전체","insights.refresh":"새로고침","insights.loading":"불러오는 중…","insights.emptyPending":"pending insight가 없습니다. `memesh dream run`으로 weekly recap을 생성할 수 있습니다.","insights.emptyNoLlm":"weekly recap과 pattern 감지를 사용하려면 설정에서 LLM 프로바이더를 구성하세요.","insights.emptyOther":"데이터가 없습니다.","insights.sources":"소스","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"자세히 보기","insights.collapse":"접기","insights.accept":"채택","insights.applying":"적용 중…","insights.reject":"거부","insights.generatedBy":"생성 모델","insights.promptVersion":"Prompt 버전","insights.observations":"요약 관찰","insights.tags":"태그","insights.sourceIds":"소스 entity","insights.validationWarnings":"의심스러운 주장 (LLM validator)","insights.validationClaim":"주장","insights.validationReason":"이유","insights.runDream":"weekly recap 실행","insights.runDreamWithValidate":"validator 포함 실행 (느리지만 품질 높음)","banner.pendingInsights":"{n}개의 새 insight가 검토를 기다리고 있습니다 →","banner.dismiss":"닫기","banner.viewAll":"전체 보기","pattern.title":"Pattern","pattern.evidenceCount":"{n}개의 증거","pattern.severity":"심각도","pattern.severity.high":"높음","pattern.severity.medium":"중간","pattern.severity.low":"낮음","pattern.description":"Pattern 설명","tab.graph":"그래프","tab.settings":"설정","tab.home":"홈","tab.memories":"기억","tab.project":"프로젝트","memories.searchPlaceholder":"입력하는 대로 필터링 — Enter를 누르면 관련도순 검색","memories.scopeLabel":"범위","memories.scopeWork":"작업 레이어","memories.scopeEvidence":"증거","memories.scopeAll":"전체","memories.scopeArchived":"보관됨","memories.composition":"구성","memories.rankedBy":"관련도순","memories.backToList":"목록으로 돌아가기","memories.workEmpty":"작업 레이어 기억이 아직 없습니다 — 목표, 결정, 교훈, 계획이 기록되면 여기에 나타납니다.","memories.showAll":"모든 기억 보기","memories.expand":"상세 보기","memories.collapse":"상세 숨기기","home.analyticsTitle":"분석","home.analyticsHint":"건강도, 타임라인, 패턴, 사용량 — 필요할 때 펼쳐집니다","project.selectLabel":"프로젝트","project.selectPrompt":"프로젝트를 선택하면 그 히스토리가 표시됩니다.","project.empty":"프로젝트 기억이 아직 없습니다. memesh 훅이 설치된 git 저장소에서 작업하면 그 이야기가 여기에 나타납니다.","guard.sourceLesson":"출처 교훈","guard.pattern":"트리거 패턴","guard.message":"표시될 경고","guard.shouldMatch":"반드시 발동","guard.shouldNotMatch":"발동 금지","search.button":"검색","search.searching":"검색 중…","search.results":"개의 결과","search.result":"개의 결과","search.noResults":"결과를 찾을 수 없습니다:","search.facts":"개의 사실","browse.title":"모든 기억","browse.active":"활성","browse.archived":"보관됨","browse.refresh":"새로고침","browse.noMatch":"일치하는 기억이 없습니다:","browse.prev":"← 이전","browse.next":"다음 →","browse.archive":"보관","browse.restore":"복원","browse.confirmArchive":"이 기억을 보관하시겠습니까?","browse.archiveFailed":"보관하지 못했습니다: {message}","browse.restoreFailed":"복원하지 못했습니다: {message}","analytics.totalMemories":"총 기억 수","analytics.knowledgeFacts":"지식 사실","analytics.connections":"연결","analytics.topics":"주제","analytics.insights":"인사이트","analytics.thisWeek":"이번 주","analytics.new":"개 신규","analytics.stale":"비활성 (30일 이상 미사용)","analytics.archivedLabel":"보관됨","analytics.mostRecalled":"가장 많이 조회됨","health.title":"메모리 건강도","metrics.notMeasured":"아직 측정되지 않음","metrics.health":"건강도","metrics.healthNote":"활동, 품질, 신선도, 교훈","metrics.critical":"심각한 교훈","metrics.criticalPartial":"분류된 {tagged}개 중 · 전체 교훈 {total}개","metrics.criticalAll":"전체 {total}개 교훈, 모두 분류됨","metrics.criticalUnclassified":"교훈 {total}개, 심각도 분류 없음","metrics.criticalNoLessons":"아직 기록된 교훈이 없습니다","metrics.citation":"인용률","metrics.citationNote":"{total}개 세션 중 {cited}개가 기억을 인용","metrics.citationNotMeasured":"인용 추적은 다음 세션부터 시작됩니다","metrics.reused":"이번 주 재사용","metrics.reusedNote":"근사치 — 마지막 접근 시각으로 추정","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.entityMeta":"{type} · 신뢰도 {confidence}% · {days}일 미사용","settings.capabilities":"기능 상태","settings.smartMode":"스마트 모드","settings.core":"기본","settings.embeddings":"임베딩","settings.llmProvider":"LLM 제공자","settings.llmOptional.title":"LLM은 선택 사항입니다","settings.llmOptional.body":"memesh는 LLM 없이도 작동합니다. 기본 코어 모드는 전체 텍스트 회상, 수동 remember/recall, 대시보드, 훅 기반 세션 캡처를 모두 지원합니다.","settings.llmOptional.coreLabel":"LLM 없이(코어 모드)","settings.llmOptional.coreFeatures":"FTS5 키워드 검색, 수동 remember/recall, 대시보드, 훅 기반 세션 캡처","settings.llmOptional.smartLabel":"LLM 사용(스마트 모드)","settings.llmOptional.smartFeatures":"세션 실패에서 lesson_learned 자동 추출, 새 엔티티 자동 태깅, 주간 요약과 패턴 감지","settings.apiKey":"API 키","settings.fallbacks.title":"대체 제공자","settings.fallbacks.explainer":"기본 제공자를 사용할 수 없을 때, memesh는 이 목록을 순서대로 시도하여 작동하는 것을 사용합니다.","settings.fallbacks.privacyTitle":"개인정보 안내","settings.fallbacks.privacyBody":"클라우드 제공자(OpenAI 또는 Anthropic)를 추가하면, 기본 제공자가 중단되었을 때 (비공개일 수 있는) 메모리 내용이 해당 클라우드 제공자로 전송됩니다. 개인정보를 위해 로컬 제공자를 사용한다면, 이 점을 이해한 후에만 클라우드 대체를 추가하세요.","settings.fallbacks.empty":"아직 대체 제공자가 없습니다.","settings.fallbacks.add":"대체 제공자 추가","settings.fallbacks.providerLabel":"제공자","settings.fallbacks.modelLabel":"모델(선택)","settings.fallbacks.modelPlaceholder":"예: gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"키가 저장되어 있습니다. 비워 두면 유지됩니다.","settings.fallbacks.remove":"제거","settings.fallbacks.moveUp":"위로","settings.fallbacks.moveDown":"아래로","settings.fallbacks.priority":"우선순위 {n}","settings.fallbacks.save":"대체 순서 저장","settings.fallbacks.needsKey":"API 키를 입력하세요. 그렇지 않으면 이 클라우드 대체를 사용할 수 없습니다.","settings.model":"모델 (선택)","settings.save":"저장","settings.saving":"저장 중…","settings.saved":"저장되었습니다","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"연결 테스트","settings.testing":"테스트 중…","settings.testPassed":"✓ 연결 성공 · 사용 가능한 모델 {count}개","settings.testFailed":"연결 테스트 실패","settings.suggested":"추천","settings.testRequired":"저장하기 전에 연결을 테스트하세요","settings.language":"언어","settings.searchMode":"검색 모드","settings.none":"없음","settings.updates":"업데이트","settings.updateChecking":"업데이트 확인 중…","settings.updateUnavailable":"지금은 업데이트를 확인할 수 없습니다","settings.updateNoSuccessfulChecks":"아직 성공한 업데이트 확인 기록이 없습니다","settings.upToDate":"최신 버전입니다","settings.updateAvailable":"업데이트가 있습니다","settings.updateStale":"표시 중인 캐시 상태가 오래되었을 수 있습니다","settings.updateCachedFallback":"마지막으로 성공한 캐시 결과를 사용 중입니다","settings.updateDeprecatedNoTarget":"사용 중단됨 — 아직 업그레이드 대상이 없음","settings.updateDeprecatedTitle":"⚠️ MeMesh {version}이(가) 메인테이너에 의해 사용 중단(DEPRECATED)으로 표시되었습니다.","settings.updatePartialTitle":"⚠️ 업데이트 확인이 부분적으로 실패했습니다","settings.updatePartialDescription":"{message}. 이 세션에서는 사용 중단 상태를 확인할 수 없습니다 — 온라인 상태에서 다시 실행하세요.","settings.updatePartialSummary":"부분 확인됨 — 사용 중단 상태 미확인","settings.updateDeprecatedTargetUnknown":"사용 중단됨 — 업그레이드 대상 확인 중","settings.currentVersion":"현재 버전","settings.latestVersion":"최신 버전","settings.lastChecked":"마지막 확인","settings.lastAttempted":"마지막 확인 시도","settings.lastSuccessful":"마지막 성공 확인","settings.updateSourceFresh":"방금 확인함","settings.updateSourceCached":"캐시된 결과 사용","settings.updateSourceStale":"오래된 캐시 결과 사용","settings.updateSourceUnavailable":"사용 가능한 캐시 없음","settings.updateCommand":"업데이트 명령","settings.checkNow":"지금 확인","settings.updateLastError":"마지막 확인 오류: {message}","settings.installMethod":"설치 방식","settings.installNpmGlobal":"npm 전역 설치","settings.installNpmLocal":"프로젝트 로컬 패키지 설치","settings.installSourceCheckout":"소스 체크아웃","settings.installUnknown":"알 수 없음","settings.updateGuidanceNpmGlobal":"이 설치는 MeMesh에서 직접 업데이트할 수 있습니다.","settings.updateGuidanceNpmLocal":"이 패키지를 설치한 프로젝트의 패키지 관리자에서 업데이트하세요.","settings.updateGuidanceSourceCheckout":"이 소스 체크아웃은 저장소에서 업데이트한 뒤 다시 빌드하세요.","settings.updateGuidanceUnknown":"MeMesh를 설치한 도구나 작업 흐름으로 이 설치를 업데이트하세요.","graph.entities":"엔티티","graph.relations":"관계","graph.orphans":"고립 노드","graph.search":"노드 검색…","graph.matches":"개 일치","graph.focusMode":"포커스","graph.showAll":"모두 표시","graph.clickHint":"노드를 클릭하여 포커스","graph.interactHint":"노드 클릭으로 포커스 · 빈 영역 드래그로 이동 · 스크롤로 확대/축소","graph.resetView":"뷰 재설정","graph.resetViewHint":"확대/축소 및 위치 재설정","graph.ageToday":"오늘","graph.ageDaysAgo":"{count}일 전","graph.ageWeeksAgo":"{count}주 전","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 열기","feedback.submitting":"진단 정보 수집 중…","doctorBanner.warnTitleSoft":"memesh 설정 안내가 있습니다","doctorBanner.failTitle":"memesh 설정이 완전하지 않습니다","doctorBanner.dismiss":"닫기","doctorBanner.getHelp":"도움 받기","doctorBanner.helpHint":"진단 정보가 미리 입력된 GitHub Issue를 엽니다","doctorBanner.preambleForIssue":"memesh doctor가 내 설치에서 다음을 발견했습니다:","doctorBanner.moreCount":"…외 {n}건 — 전체 목록은 `memesh doctor`로 확인하세요","doctor.label.readme_locale_parity":"README 번역","doctor.label.config":"설정 파일","doctor.label.mcp-config":"MCP 연결 파일","doctor.label.hooks-config":"훅 정의","doctor.label.hook-scripts":"훅 스크립트","doctor.label.hook-wiring":"Claude Code 연결","doctor.label.hook-activity":"자동 기록","doctor.label.node-runtime":"Node.js 버전","doctor.label.native-binding":"SQLite 및 벡터 검색","doctor.label.shell-cli":"터미널 명령어","doctor.label.dashboard":"대시보드 파일","doctor.label.update-status":"업데이트","doctor.label.http-probe":"로컬 서버","doctor.label.skills-manifest":"번들 파일","doctor.label.config_parse":"설정 파일","doctor.label.embeddings_probe":"의미 기반 검색","doctor.label.llm_probe":"AI 제공자","doctor.label.install-channel":"설치 방법","doctor.label.fts_segmentation":"키워드 색인","doctor.label.vector_index":"검색 색인","doctor.label.database":"데이터베이스","doctor.msg.readme-parity.unreadable.summary":"README.md를 읽을 수 없습니다: {detail}","doctor.msg.readme-parity.drift.summary":"일부 번역본 README가 영어판과 어긋났습니다: {detail}","doctor.msg.readme-parity.drift.fix":"나열된 README를 README.md에 맞춰 다시 정리하세요.","doctor.msg.config.invalid-json.summary":"{path}의 설정 파일이 올바른 JSON이 아니라서 무시되고 있습니다.","doctor.msg.config.invalid-json.fix":"{path}를 고치거나 삭제한 뒤 `memesh config list`로 불러와지는지 확인하세요.","doctor.msg.mcp-config.missing.summary":"memesh를 Claude Code에 연결하는 파일(.mcp.json)이 없습니다.","doctor.msg.mcp-config.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json이 손상되어(올바른 JSON이 아님) Claude Code가 읽을 수 없습니다.","doctor.msg.mcp-config.invalid-json.fix":"{path}를 고치거나 MeMesh를 다시 설치하세요.","doctor.msg.mcp-config.no-entry.summary":".mcp.json에 memesh 서버 항목이 더 이상 없습니다.","doctor.msg.mcp-config.no-entry.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json`이 실행하려는 파일이 이 설치에 없어서 Claude Code 안의 모든 memesh 도구가 시작되지 않습니다.","doctor.msg.mcp-config.entry-missing.fix":"MeMesh를 다시 설치하세요. `.mcp.json`을 직접 고쳤다면 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`로 되돌리세요.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json이 없어서 자동 기억 저장이 동작하지 않습니다.","doctor.msg.hooks-config.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json이 손상되었습니다(올바른 JSON이 아님).","doctor.msg.hooks-config.invalid-json.fix":"{path}를 고치거나 MeMesh를 다시 설치하세요.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json에 다음 훅 유형이 없습니다: {types}. 일부 자동 기록이 실행되지 않습니다.","doctor.msg.hooks-config.missing-types.fix":"기본 제공 훅 구성을 복원하거나 MeMesh를 다시 설치하세요.","doctor.msg.hook-scripts.none.summary":"훅 설정에 스크립트가 하나도 없어서 아무것도 자동으로 기록되지 않습니다.","doctor.msg.hook-scripts.none.fix":"MeMesh를 다시 설치하세요.","doctor.msg.hook-scripts.missing.summary":"다음 훅 스크립트가 없습니다: {files}","doctor.msg.hook-scripts.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.hook-scripts.not-executable.summary":"다음 훅 스크립트는 있지만 실행 권한이 없습니다: {files}","doctor.msg.hook-scripts.not-executable.fix":"`chmod +x scripts/hooks/*.js`를 실행하세요. 소스 설치라면 `npm run build`를 실행하세요.","doctor.msg.hook-wiring.no-marker.summary":"memesh가 아직 Claude Code에 연결되지 않아 아무것도 자동으로 기억되지 않습니다.","doctor.msg.hook-wiring.no-marker.fix":"`memesh install-hooks`를 한 번 실행한 뒤 `memesh doctor`로 확인하세요.","doctor.msg.hook-wiring.script-missing.summary":"연결된 memesh 훅이 {path}를 가리키지만 이 파일은 더 이상 존재하지 않습니다 — 에이전트가 해당 이벤트마다 없는 파일을 호출합니다. 보통 훅을 은퇴시킨 업그레이드가 남긴 잔재입니다.","doctor.msg.hook-wiring.script-missing.fix":"`memesh install-hooks`를 실행해 다시 연결하고(은퇴한 항목은 제거됩니다) 에이전트를 재시작하세요.","doctor.msg.hook-wiring.marker-unreadable.summary":"{path}의 연결 기록을 읽을 수 없습니다.","doctor.msg.hook-wiring.marker-unreadable.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.marker-malformed.summary":"연결 기록이 손상되었습니다.","doctor.msg.hook-wiring.marker-malformed.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 설정 파일({path})이 사라져 연결이 끊어졌습니다.","doctor.msg.hook-wiring.settings-missing.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.settings-invalid.summary":"{path}가 손상되었습니다(올바른 JSON이 아님).","doctor.msg.hook-wiring.settings-invalid.fix":"백업에서 복원하거나 `memesh install-hooks`로 다시 만드세요.","doctor.msg.hook-wiring.entries-removed.summary":"{path}에서 memesh 항목이 제거되어 연결이 끊어졌습니다.","doctor.msg.hook-wiring.entries-removed.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.root-moved.summary":"연결이 가리키는 {path}가 더 이상 존재하지 않습니다(memesh가 옮겨졌을 수 있음).","doctor.msg.hook-wiring.root-moved.fix":"`memesh install-hooks`를 실행해 갱신하세요.","doctor.msg.hook-activity.never-ran.summary":"추적을 시작한 뒤 {hours}시간 동안 캡처 훅이 한 번도 실행되지 않았습니다. 훅 연결은 정상이므로 실행되어야 할 것이 돌지 않고 있고, 아무것도 기억되지 않고 있습니다.","doctor.msg.hook-activity.never-ran.fix":"작업 세션을 한 번 마친 뒤 `memesh doctor`를 다시 실행하세요. 여전히 훅이 실행되지 않았다고 나오면 `memesh install-hooks`를 실행하고 에이전트를 재시작하세요.","doctor.msg.hook-activity.stale.summary":"마지막 캡처 훅 실행은 약 {hours}시간 전입니다({hook}). 그 뒤로 작업했다면 캡처가 멈춘 것이며 해당 세션의 내용은 저장되지 않았습니다.","doctor.msg.hook-activity.stale.fix":"에이전트를 재시작하고 세션을 한 번 마친 뒤 `memesh doctor`를 다시 실행하세요. 회복되지 않으면 `memesh install-hooks`를 실행하세요.","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary 훅이 마지막으로 실행된 것은 약 {hours}시간 전이고, 지난 3일간 Claude Code의 쓰기도 없었습니다. 이 머신이 다른 에이전트(Codex / Gemini)로 옮겨갔다면 정상입니다. 여기서 아직 Claude Code를 쓰고 있다면 캡처가 멈춘 것입니다.","doctor.msg.hook-activity.stale-unconfirmed.fix":"이 머신에서 아직 Claude Code를 쓴다면: 재시작하고 세션을 한 번 끝낸 뒤 `memesh doctor`를 다시 실행하세요. 회복되지 않으면 `memesh install-hooks`를 실행하세요.","doctor.msg.hook-activity.query-failed.summary":'데이터베이스에서 훅 활동을 읽지 못했습니다: {detail}. 캡처 상태는 "알 수 없음"이며 이는 "정상"과 다릅니다.',"doctor.msg.hook-activity.query-failed.fix":"`memesh doctor --verbose`로 전체 오류를 확인하고 ~/.memesh를 읽을 수 있는지, 디스크가 가득 차지 않았는지 확인하세요.","doctor.msg.hook-activity.stale-unknown.summary":'{hook} 훅의 마지막 실행 시각을 읽을 수 없습니다(데이터 손상, 또는 시계가 어긋난 머신이 기록했을 수 있음). 캡처 상태는 "알 수 없음"이며, 이는 "정상"과 같지 않습니다.',"doctor.msg.hook-activity.stale-unknown.fix":"작업 세션을 한 번 끝낸 뒤 `memesh doctor`를 다시 실행하세요. 새 실행이 잘못된 타임스탬프를 덮어씁니다.","doctor.msg.hook-activity.disabled.summary":"자동 캡처가 꺼져 있습니다(MEMESH_AUTO_CAPTURE 또는 설정의 autoCapture). 의도된 설정이므로 훅이 조용한 것은 예상된 동작입니다. 다시 켜면 캡처가 재개됩니다.","doctor.msg.hook-activity.disabled-env.summary":"이 shell 환경의 MEMESH_AUTO_CAPTURE=false 때문에 자동 캡처가 꺼져 있습니다. doctor는 자신의 환경만 볼 수 있습니다 — 에이전트가 이 변수 없이 실행 중이라면 그쪽 캡처는 영향을 받지 않습니다.","doctor.msg.hook-activity.not-wired.summary":"캡처 훅이 한 번도 실행되지 않았습니다 — 그리고 이 머신에는 캡처 훅(Stop / PostToolUse / PreCompact)이 연결된 것이 확인되지 않아, 실행될 것이 애초에 없습니다.","doctor.msg.hook-activity.not-wired.fix":"자동 캡처를 원하면 `memesh install-hooks`를 실행하세요. MCP 전용 설치(Codex / Gemini)라면 정상이며 무시해도 됩니다.","doctor.msg.hook-activity.stop-silent.summary":"{hook} 훅은 기록되고 있지만, 추적을 시작한 지 {hours}시간 동안 session-summary 훅은 한 번도 실행되지 않았습니다. 커밋 캡처에 가려져 세션 캡처가 고장 났을 수 있습니다.","doctor.msg.hook-activity.stop-silent.fix":"작업 세션을 한 번 끝내고 `memesh doctor`를 다시 실행하세요. 그래도 session-summary가 실행되지 않았다면 `memesh install-hooks`를 실행하고 에이전트를 재시작하세요.","doctor.msg.hook-activity.never-ran-legacy.summary":"하트비트를 기록한 훅은 없지만 추적 시작 이후 {captured}개의 자동 캡처 기억이 저장되었습니다. 하트비트 기능 이전의 구버전 훅이 아직 실행 중일 가능성이 높습니다.","doctor.msg.hook-activity.never-ran-legacy.fix":"memesh 훅을 현재 버전으로 업데이트하고(플러그인: `/plugin update memesh`, npm: `memesh install-hooks`) 에이전트를 재시작하세요.","doctor.msg.node-runtime.too-old.summary":"사용 중인 Node.js가 이 패키지가 지원하는 버전보다 오래되었습니다. {detail}","doctor.msg.node-runtime.too-old.fix":"Node.js를 {required} 이상으로 올린 뒤 `memesh doctor`를 다시 실행하세요.","doctor.msg.native-binding.node-too-old.summary":"이 Node 버전에 들어 있는 SQLite는 memesh에 너무 오래되어 의미로 검색하는 부분을 불러오지 못합니다. 완전한 버전은 Node 22.13부터입니다.","doctor.msg.native-binding.node-too-old.fix":"Node를 22.13 이상으로 올린 뒤 `memesh doctor`를 다시 실행하세요.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec가 설치되어 있지 않습니다. 기억은 그대로 저장되고 키워드로 찾을 수 있지만, 의미 기반 검색은 꺼집니다.","doctor.msg.native-binding.not-installed.fix":"@pcircle/memesh를 쓰는 폴더에서 `npm install`을 실행하세요.","doctor.msg.native-binding.load-failed.summary":"sqlite-vec를 불러오지 못했습니다: {detail}. 검색은 키워드만 사용합니다.","doctor.msg.native-binding.load-failed.fix":'실행: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"터미널에서 `memesh` 명령어를 쓸 수 없습니다. Claude Code 기능은 그대로 동작합니다 — 직접 `memesh`를 입력할 때만 영향이 있습니다.","doctor.msg.shell-cli.not-on-path.fix":"`npm install -g @pcircle/memesh`를 실행해 추가하세요. 두 설치는 같은 기억을 공유합니다.","doctor.msg.dashboard.missing.summary":"대시보드 파일이 없습니다.","doctor.msg.dashboard.missing.fix":"`cd dashboard && npm install && npm run build`로 만드세요.","doctor.msg.update-status.no-cache.summary":"memesh가 아직 새 버전 확인에 성공하지 못했습니다.","doctor.msg.update-status.no-cache.fix":"인터넷이 되는 상태에서 `memesh status`를 한 번 실행하세요. 결과가 저장되고 이 알림이 사라집니다.","doctor.msg.update-status.deprecated.summary":"버전 {version}은 제작자가 철회했습니다: {detail}","doctor.msg.update-status.deprecated.fix":"지금 바로 업데이트하세요 — `memesh update`를 실행하세요(또는 설치 방법에 맞게 업그레이드).","doctor.msg.update-status.deprecation-unknown.summary":"버전 {version}이 여전히 안전하게 쓸 수 있는지 확인하지 못했습니다: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"인터넷이 되는 상태에서 `memesh status`를 실행해 다시 시도하세요.","doctor.msg.update-status.update-available.summary":"새 버전이 있습니다: {latest} (현재 {current}).","doctor.msg.update-status.update-available.fix":"`memesh update`를 실행해 업그레이드하세요.","doctor.msg.update-status.stale.summary":"버전 {version}은 최신이지만 업데이트 정보가 오래되었습니다.","doctor.msg.update-status.stale.fix":"인터넷이 되는 상태에서 `memesh status`를 실행해 새로 고치세요.","doctor.msg.http-probe.bad-status.summary":"{url}의 로컬 서버가 오류로 응답했습니다(HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"`memesh serve`로 재시작하고 로그를 확인하세요.","doctor.msg.http-probe.no-server.summary":"{url}에서 실행 중인 로컬 서버가 없습니다.","doctor.msg.http-probe.no-server.fix":"대시보드를 쓰려면 `memesh serve`로 하나 시작하세요.","doctor.msg.skills-manifest.missing-dev.summary":"파일 무결성 목록을 찾을 수 없습니다(소스 코드에서 실행 중이면 정상입니다).","doctor.msg.skills-manifest.missing-dev.fix":"`npm run build`를 실행해 생성하세요.","doctor.msg.skills-manifest.unreadable.summary":"파일 무결성 목록을 읽을 수 없습니다({detail}).","doctor.msg.skills-manifest.unreadable.fix":"재설치: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"파일 무결성 목록이 비어 있습니다.","doctor.msg.skills-manifest.empty.fix":"재설치: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"일부 번들 파일이 배포된 내용과 일치하지 않습니다: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"재설치: `npm install -g @pcircle/memesh`. 새로 설치해도 또 생기면 보안 문제로 신고해 주세요.","doctor.msg.config-parse.not-object.summary":"{path}의 설정 파일이 예상 형식이 아니라서 모든 설정이 무시되고 있습니다.","doctor.msg.config-parse.not-object.fix":"{path}를 고치거나 삭제한 뒤 `memesh doctor`를 다시 실행하세요.","doctor.msg.config-parse.unreadable.summary":"{path}의 설정 파일을 읽을 수 없어({detail}) 모든 설정이 무시되고 있습니다.","doctor.msg.config-parse.unreadable.fix":"파일을 고치거나 일단 치워 두세요: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'의미 기반 검색이 "{provider}"로 설정되어 있지만 테스트에서 아무 결과도 나오지 않았습니다. 키워드 검색은 그대로 동작합니다.',"doctor.msg.embeddings.empty.fix":"자세한 내용은 `memesh doctor --probe`를 실행하거나 제공자 연결을 확인하세요.","doctor.msg.embeddings.threw.summary":'의미 기반 검색이 "{provider}"로 설정되어 있지만 테스트에 실패했습니다: {detail}. 키워드 검색은 그대로 동작합니다.',"doctor.msg.embeddings.threw.fix":"임베딩 제공자에 연결할 수 있는지 확인하거나(예: `ollama serve` 실행), embedder 설정을 제거해 키워드 전용 검색으로 전환하세요.","doctor.msg.llm.unreachable.summary":"AI 제공자({provider})가 응답하지 않았습니다: {detail}. AI 기능이 조용히 아무 일도 하지 않고 있습니다.","doctor.msg.llm.unreachable.fix":"API key와 연결을 확인한 뒤 `memesh doctor --probe`를 다시 실행하세요.","doctor.msg.llm.threw.summary":"AI 제공자({provider}) 테스트에 실패했습니다: {detail}. AI 기능이 조용히 아무 일도 하지 않고 있습니다.","doctor.msg.llm.threw.fix":"API key와 연결을 확인한 뒤 `memesh doctor --probe`를 다시 실행하세요.","doctor.msg.install-channel.unknown.summary":"memesh가 어떻게 설치되었는지 알 수 없습니다.","doctor.msg.install-channel.unknown.fix":"소스 체크아웃이라면 저장소 루트에서 실행하세요. 아니라면 `npm install -g @pcircle/memesh`로 다시 설치하세요.","doctor.msg.fts.unsegmented.summary":"키워드 색인에 옛 형식 항목이 {count}개 있습니다 — 일부 기억은 전체 원문이 정확히 일치해야만 검색됩니다.","doctor.msg.fts.unsegmented.fix":"`memesh reindex --fts`를 실행해 색인을 다시 만드세요.","doctor.msg.vector-index.stale.summary":"검색 색인을 다시 만들어야 합니다(검색 설정이 바뀌었습니다).","doctor.msg.vector-index.stale.fix":"`memesh reindex`를 실행해 다시 만드세요.","doctor.msg.vector-generation.open.summary":"완료되지 않은 색인 재구성이 디스크 공간을 차지하고 있습니다.","doctor.msg.vector-generation.open.fix":"`memesh reindex`로 마무리하거나 `memesh reindex --discard-generation`으로 공간을 회수하세요.","doctor.msg.database.broken.summary":"데이터베이스를 사용할 수 없습니다: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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":"아직 리콜 데이터가 없습니다. 다음 세션 후 추적이 시작됩니다.","recall.summary":"{used}개 사용 / {total}개 주입","analytics.loadFailed":"분석 데이터를 불러오지 못했습니다.","memory.noContent":"(내용 없음)","memory.archivedBadge":"보관됨","memory.factsCount":"사실 {count}개","common.error":"오류","common.serverUnreachable":"memesh 서버에 연결할 수 없습니다.","common.serverUnreachableAction":"`memesh serve`가 실행 중인지 확인한 뒤 이 페이지를 새로고침하세요.","common.responseUnreadable":"서버가 응답했지만 이 페이지가 내용을 읽을 수 없습니다. 대시보드와 서버 버전이 다를 수 있습니다.","common.responseUnreadableAction":"페이지를 새로고침하세요. 계속되면 `memesh doctor`를 실행하세요.","pm.title":"PM 지표","pm.decisionsPerWeek":"결정/주","pm.openDecisions":"미해결 결정(14일 초과)","pm.orphanRate":"연결되지 않은 메모리","pm.relationsTotal":"관계 총수","pm.stalePlans":"30일 이상 검토되지 않은 계획 {count}건","common.loading":"로딩 중…","common.noData":"데이터 없음","errors.unknown":"알 수 없는 오류","insights.noPreview":"이 제안에는 요약 텍스트가 없습니다","httpError.auth.missing-bearer":"이 서버는 액세스 토큰이 필요합니다. 토큰을 입력해 주세요.","httpError.auth.invalid-token":"액세스 토큰이 올바르지 않습니다. 확인 후 다시 시도해 주세요.","httpError.auth.not-configured":"서버에 액세스 토큰이 설정되어 있지 않습니다. `memesh serve`를 다시 시작하고 출력을 확인하세요.","httpError.validation.bad-body":"페이지가 보낸 요청을 서버가 읽을 수 없습니다. 페이지를 새로고침한 뒤 다시 시도하세요.","httpError.validation.bad-param":"요청의 일부 값이 올바르지 않습니다. 페이지를 새로고침한 뒤 다시 시도하세요.","httpError.route.retired":"서버가 더 이상 이 동작을 지원하지 않습니다. 페이지와 서버 버전이 다를 수 있습니다. 페이지를 새로고침하세요.","httpError.route.not-found":"서버가 이 요청을 인식하지 못합니다. 페이지와 서버 버전이 다를 수 있습니다. 페이지를 새로고침하세요.","httpError.resource.not-found":"해당 항목이 더 이상 존재하지 않습니다. 목록을 새로고침하세요.","httpError.payload.too-large":"전송한 데이터가 너무 큽니다(1 MB 초과). 더 작게 나눠서 시도하세요.","httpError.operation.failed":"서버가 이 작업을 완료하지 못했습니다.","httpError.llm.not-configured":"AI 제공업체가 설정되어 있지 않습니다. 먼저 설정에서 추가하세요.","httpError.rate.limited":"짧은 시간에 요청이 너무 많습니다. 잠시 후 다시 시도하세요.","httpError.server.internal":"서버에서 예기치 않은 오류가 발생했습니다.","settings.testError.auth":"API 키가 거부되었습니다. 키를 확인하고 다시 시도하세요.","settings.testError.network":"제공업체에 연결할 수 없습니다. 네트워크 연결을 확인하세요.","settings.testError.no_models":"제공업체가 응답했지만 사용 가능한 모델을 반환하지 않았습니다.","settings.testError.bad_host":"Ollama 주소는 이 컴퓨터(localhost)여야 합니다.","settings.testError.http":"제공업체가 오류를 반환했습니다 (HTTP {status}).","settings.testError.unknown":"알 수 없는 이유로 테스트에 실패했습니다.","time.justNow":"방금","time.hoursAgo":"{count}시간 전","time.today":"오늘","time.yesterday":"어제","time.daysAgo":"{count}일 전","time.lastWeek":"지난주","time.weeksAgo":"{count}주 전","time.lastMonth":"지난달","time.monthsAgo":"{count}개월 전","memory.access.frequent":"자주 사용 · {count}회","memory.access.recalls":"{count}회 회상","memory.access.never":"회상 안 됨","cluster.knowledge":"지식","cluster.activity":"활동","cluster.session":"세션","cluster.reference":"참조","cluster.all":"전체","browse.filterTime":"시간","browse.filterValue":"가치","browse.filterProject":"프로젝트","browse.filterSort":"정렬","browse.timeToday":"오늘","browse.timeWeek":"이번 주","browse.timeMonth":"이번 달","browse.timeOlder":"이전","browse.valueRecalled":"✓ 사용됨","browse.valueNever":"회상 안 됨","browse.sortMostRecalled":"자주 회상","browse.sortRecent":"최근 사용","browse.sortCreated":"생성 시간","browse.emptyFilter":"이 카테고리에 기억이 없습니다 — 필터를 변경해 보세요","lessons.stepsLabel":"단계","lessons.commitsCount":"{count}개 커밋","lessons.unstructured":"(구조화된 필드 없음 — 원본 기억 참조)","lessons.moreItems":"+{count}개","roadmap.title":"프로젝트 로드맵","roadmap.summary":"{count}개 기억 · {first} → {last}","roadmap.switchToList":"↩ 목록 보기","roadmap.switchToRoadmap":"🗺️ 로드맵 보기","roadmap.emptyProject":"이 프로젝트에는 아직 기억이 없습니다.","loop.label":"기억 루프","loop.subtitleHas":"지난 7일간 회상된 지식 기억","loop.subtitleNone":"이번 주 회상된 지식이 없습니다 — 교훈을 떠올려 보세요","loop.approxNote":"근사치 — 완전한 추적은 업그레이드 후 시작됩니다","loop.sparkLabel":"지난 30일","roadmap.milestones":"마일스톤","roadmap.keyLessons":"주요 교훈","radar.title":"지식 커버리지 레이더","radar.caption":"활성 지식 기억 (session 과 commit 제외)","radar.axis.lessons":"교훈","radar.axis.decisions":"결정","radar.axis.patterns":"패턴","radar.axis.bugs":"버그 수정","radar.axis.processes":"프로세스","radar.axis.architecture":"아키텍처","ageMatrix.title":"기억 연령 분포","ageMatrix.low":"낮음","ageMatrix.high":"높음","ageMatrix.legend":"색상 깊이 = 기억 밀도","ageMatrix.typeColumn":"유형","header.signalModeOn":"시그널","header.signalModeOff":"전체","header.signalModeOnHint":"session 과 commit 노이즈 숨김. 클릭하면 모두 표시.","header.signalModeOffHint":"session 과 commit 을 포함한 모든 기억 표시. 클릭하면 노이즈 숨김.","roadmap.phases":"단계","onboarding.title":"MeMesh 에 오신 것을 환영합니다","onboarding.body":"기억 저장소가 비어 있습니다. 30개 큐레이션된 투어로 시작하거나 첫 교훈을 저장하세요.","onboarding.llmHint":"LLM 불필요. 모든 기능은 FTS5만으로 작동합니다. LLM은 자동 교훈 생성을 위한 선택 사항이며, 나중에 설정에서 활성화할 수 있습니다.","onboarding.seedButton":"데모 투어 시작","onboarding.seedingButton":"시드 중…","onboarding.seedHint":"터미널 없이 여기서 30개 추가, 나중에 한 번에 삭제 가능","onboarding.cliReference":"CLI 를 선호하시나요?","onboarding.hintDemo":"30개 데모 기억을 시드(나중에 제거 가능)","onboarding.hintReset":"metadata.demo 태그가 있는 모든 항목 제거","onboarding.resetButton":"데모 제거","onboarding.resettingButton":"제거 중…","onboarding.resetConfirm":"모든 데모 기억을 제거하시겠습니까? 직접 저장한 항목은 유지됩니다.","onboarding.dismiss":"닫기","common.serverError":"서버가 오류를 반환했습니다 (HTTP {status}). 다시 시도해 보세요. 계속되면 `memesh doctor`를 실행하세요.","emptyLibrary.title":"메모리가 비어 있습니다","emptyLibrary.body":"아직 저장된 것이 없습니다. 30개 데모 투어를 불러와 MeMesh의 동작을 바로 확인해 보세요. 나중에 한 번에 삭제할 수 있습니다.","browse.truncated":"전체 {total}개 중 처음 {shown}개 표시 중 — 나머지는 검색이나 필터로 찾아보세요","browse.truncatedUnknownTotal":"처음 {shown}개 표시 중 — 전체 개수를 읽을 수 없어 더 있을 수 있습니다","graph.cappedNote":"전체 {total}개 중 상위 {shown}개만 표시 중(회상 횟수순). 그래프 반응성을 위해서입니다.","settings.testStoredKeyHint":"입력란을 비워 두면 저장된 키로 테스트합니다.","ageMatrix.bucket.week":"이번 주","ageMatrix.bucket.month":"이번 달","ageMatrix.bucket.quarter":"이번 분기","ageMatrix.bucket.older":"이전","settings.behaviourTitle":"동작 설정","settings.autoUpdateLabel":"자동 업데이트 정책","settings.autoUpdateOff":"끔 — 수동만","settings.autoUpdatePatch":"Patch — X.Y.Z+1 자동 적용","settings.autoUpdateMinor":"Minor — X.Y+1.0 자동 적용","settings.autoUpdateMajor":"Major — 모든 버전 변경 자동 적용","settings.autoUpdateHint":"세션 종료 후 트리거. MEMESH_AUTO_UPDATE 환경 변수가 우선.","errors.timeout":"요청 시간이 초과되었습니다","type.lesson_learned":"교훈","type.lesson":"교훈","type.mistake":"실수","type.decision":"결정","type.architecture_decision":"아키 결정","type.design_decision":"디자인 결정","type.pattern":"패턴","type.technical_pattern":"기술 패턴","type.best_practice":"베스트 프랙티스","type.bug_fix":"버그 수정","type.verification_result":"검증 결과","type.test_result":"테스트 결과","type.process":"프로세스","type.architecture":"아키텍처","type.infrastructure":"인프라","type.feature":"기능","type.release":"릴리스","type.refactoring":"리팩터링","type.commit":"커밋","type.session_keypoint":"세션 요점","type.session_identity":"세션 정체성","type.session-insight":"세션 인사이트","type.session-summary":"세션 요약","type.session-identity":"세션 정체성","type.weekly_summary":"주간 요약","type.weekly-summary":"주간 요약","type.note":"노트","type.plan":"계획","type.knowledge":"지식","type.workflow_checkpoint":"워크플로 마일스톤","type.concept":"개념","type.tool":"도구","type.person":"인물","relation.relates_to":"관련","relation.related-to":"관련","relation.depends_on":"의존","relation.implements":"구현","relation.learned_from":"학습 출처","relation.supersedes":"대체","relation.contradicts":"모순","relation.follows":"후속","relation.belongs-to-project":"프로젝트 소속","relation.evidences":"근거","relation.co-created":"공동 생성","relation.shares-name-tokens":"이름 유사","patterns.day.0":"일요일","patterns.day.1":"월요일","patterns.day.2":"화요일","patterns.day.3":"수요일","patterns.day.4":"목요일","patterns.day.5":"금요일","patterns.day.6":"토요일","telemetry.flow.dreamer":"주간 요약 (dreamer)","telemetry.flow.pattern_detector":"패턴 감지","telemetry.flow.digest_validator":"다이제스트 검증","telemetry.flow.guard_proposer":"가드 제안기","telemetry.flow.auto_tagger":"자동 태깅","telemetry.flow.failure_analyzer":"실패 분석","telemetry.flow.transcript_extractor":"대화 기록 추출","telemetry.flow.conflict_judge":"충돌 판정","telemetry.errorClass.auth":"인증 거부","telemetry.errorClass.rate_limit":"요청 제한","telemetry.errorClass.upstream":"제공자 장애","telemetry.errorClass.bad_request":"잘못된 요청","telemetry.errorClass.network":"네트워크","telemetry.errorClass.parse":"응답 해석 불가","telemetry.errorClass.unknown":"알 수 없음","lessons.severity.critical":"치명적","lessons.severity.major":"중대","lessons.severity.minor":"경미","memory.tooltip.project":"프로젝트","memory.tooltip.recalled":"{count}회 회상됨","memory.tooltip.hasRelations":"{count}개 기억과 연결됨","memory.tooltip.createdAt":"생성: {date}","graph.layerLabel":"그래프 계층","graph.layerWork":"작업","graph.layerAll":"전체","graph.layerWorkHint":"결정, 교훈, 계획 — 작업 그 자체.","graph.layerAllHint":"memesh가 저장한 모든 기억(자동 수집 포함).","graph.layerFellBack":"작업 항목이 {min}개 미만이라 전체 그래프를 대신 표시합니다. 결정과 교훈을 기록하면 이 화면이 채워집니다.","graph.evidenceFor":"{node}의 근거","graph.evidenceClose":"닫기","graph.evidenceLoading":"근거를 불러오는 중…","graph.evidenceFailed":"이 항목의 근거를 불러오지 못했습니다.","graph.evidenceEmpty":"이 항목에는 아직 연결된 근거가 없습니다. `memesh kg backfill`을 실행하면 커밋과 세션 기록에서 연결을 만듭니다.","graph.evidenceTruncated":"최근 {shown}개를 표시합니다. 더 있습니다.","graph.drift":"신선도","graph.driftHint":"오래된 정도로 색상 표시: 빨강=오래됨, 초록=최근 사용","common.unknown":"알 수 없음","insights.entitiesCount":"엔터티 {n}개","roadmap.viewToggle":"로드맵 보기","roadmap.viewTree":"트리","roadmap.viewMindmap":"마인드맵","roadmap.mindmapNeedsPhases":"마인드맵에는 7일 이내의 기억이 3개 이상 필요합니다.","roadmap.activePhase":"진행 중","roadmap.entryCount":"{count}개","roadmap.entriesCount":"{count}개","roadmap.otherGroup":"기타 ({count})","roadmap.lowSignalHidden":"(저신호 {count}개 숨김)","roadmap.resetHint":"확대/축소 및 위치 재설정 (배경 더블 클릭도 가능)","roadmap.zoomHint":"스크롤로 확대/축소 · 드래그로 이동 · {pct}%","roadmap.moreEntities":"외 {count}개","roadmap.viewDecisions":"결정","roadmap.densityTitle":"카테고리별 캡처 밀도","roadmap.densityNote":"memesh가 캡처한 것일 뿐, 일어난 모든 일은 아닙니다","roadmap.lineageSupersedes":"대체됨 {n}개","roadmap.lineageConflicts":"미해결 충돌 {n}개","adr.empty":'이 프로젝트에는 아직 기록된 결정이 없습니다. 타입 "decision"으로 하나 기록하면 히스토리와 함께 여기에 표시됩니다.',"adr.statusActive":"현행","adr.statusSuperseded":"대체됨","adr.supersedes":"대체된 결정","adr.supersededBy":"대체한 결정","nav.ariaLabel":"대시보드 섹션","feedback.descLabel":"피드백 내용","graph.canvasA11y":"지식 그래프(캔버스): 엔터티 {entities}개, 관계 {relations}개, 미연결 {orphans}개. 위의 유형 필터와 검색으로 비시각적으로 볼 수 있습니다."},pt:{"auth.title":"Autenticação necessária","auth.intro":"Este painel é protegido por um token bearer. Cole o valor de MEMESH_REMOTE_TOKEN (ou o conteúdo de <memeshDir>/remote-token) abaixo.","auth.tokenLabel":"Token","auth.empty":"O token não pode estar vazio.","auth.invalid":"Esse token não foi aceito. Verifique e tente novamente.","auth.submit":"Desbloquear painel","auth.tokenPlaceholder":"cole o token aqui","brand.subtitle":"powered by pcircle.com","header.connected":"Conectado","header.disconnected":"Desconectado","header.connecting":"Conectando…","header.memories":"memórias","telemetry.title":"Atividade do LLM","telemetry.lastNDays":"últimos {n}d","telemetry.loading":"carregando…","telemetry.empty":"Ainda não há atividade de IA neste período. As linhas aparecem automaticamente quando os recursos de IA em segundo plano (como resumos semanais e marcação automática) são executados.","telemetry.callsCount":"{n} chamadas","telemetry.attemptsCount":"{n} tentativas","telemetry.successRate":"sucesso","telemetry.medianLatency":"latência mediana","telemetry.fallbackUsed":"fallback usado {n}× ({pct} das chamadas)","telemetry.byProvider":"por provedor","telemetry.byModel":"por modelo","telemetry.byProject":"por projeto","telemetry.errors":"erros","insights.title":"O que o memesh fez por você","insights.subtitle":"recaps semanais e patterns gerados automaticamente, aguardando revisão","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"Todos","insights.refresh":"Atualizar","insights.loading":"carregando…","insights.emptyPending":"Nenhum insight pending. Execute `memesh dream run` para gerar weekly recaps.","insights.emptyNoLlm":"Configure um provedor de LLM nas Configurações para habilitar weekly recaps e detecção de patterns.","insights.emptyOther":"Nada aqui.","insights.sources":"fontes","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"Ver detalhes","insights.collapse":"Recolher","insights.accept":"Aceitar","insights.applying":"Aplicando…","insights.reject":"Rejeitar","insights.generatedBy":"Gerado por","insights.promptVersion":"Versão do prompt","insights.observations":"Observações resumidas","insights.tags":"Tags","insights.sourceIds":"Fontes","insights.validationWarnings":"Afirmações sinalizadas (LLM validator)","insights.validationClaim":"Afirmação","insights.validationReason":"Motivo","insights.runDream":"Executar weekly recap","insights.runDreamWithValidate":"Executar com validator (mais lento, maior qualidade)","banner.pendingInsights":"{n} novo(s) insight{s} aguardando sua revisão →","banner.dismiss":"Dispensar","banner.viewAll":"Ver todos","pattern.title":"Pattern","pattern.evidenceCount":"{n} evidência(s)","pattern.severity":"Severidade","pattern.severity.high":"alta","pattern.severity.medium":"média","pattern.severity.low":"baixa","pattern.description":"Descrição do pattern","tab.graph":"Grafo","tab.settings":"Configurações","tab.home":"Início","tab.memories":"Memórias","tab.project":"Projeto","memories.searchPlaceholder":"Filtre enquanto digita — pressione Enter para busca por relevância","memories.scopeLabel":"Escopo","memories.scopeWork":"Camada de trabalho","memories.scopeEvidence":"Evidência","memories.scopeAll":"Todas","memories.scopeArchived":"Arquivadas","memories.composition":"Composição","memories.rankedBy":"ordenadas por relevância","memories.backToList":"Voltar à lista","memories.workEmpty":"Ainda não há memórias da camada de trabalho — metas, decisões, lições e planos aparecem aqui à medida que são capturados.","memories.showAll":"Mostrar todas as memórias","memories.expand":"Mostrar detalhes","memories.collapse":"Ocultar detalhes","home.analyticsTitle":"Análise","home.analyticsHint":"Saúde, linha do tempo, padrões e uso — expande sob demanda","project.selectLabel":"Projeto","project.selectPrompt":"Escolha um projeto para ver seu histórico.","project.empty":"Ainda não há memórias de projeto. Trabalhe em um repositório git com os hooks do memesh instalados e a história dele aparecerá aqui.","guard.sourceLesson":"Lição de origem","guard.pattern":"Padrão de disparo","guard.message":"Aviso que será exibido","guard.shouldMatch":"Deve disparar em","guard.shouldNotMatch":"Deve ficar em silêncio em","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.active":"ativas","browse.archived":"arquivadas","browse.refresh":"Atualizar","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.archiveFailed":"Não foi possível arquivar a memória: {message}","browse.restoreFailed":"Não foi possível restaurar a memória: {message}","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","metrics.notMeasured":"Ainda não medido","metrics.health":"Saúde","metrics.healthNote":"Atividade, qualidade, frescura, lições","metrics.critical":"Lições críticas","metrics.criticalPartial":"de {tagged} classificadas · {total} lições no total","metrics.criticalAll":"de {total} lições, todas classificadas","metrics.criticalUnclassified":"{total} lições, nenhuma classificada por severidade","metrics.criticalNoLessons":"Ainda não há lições registadas","metrics.citation":"Citações","metrics.citationNote":"{cited} de {total} sessões citaram uma memória","metrics.citationNotMeasured":"O registo de citações começa na próxima sessão","metrics.reused":"Reutilizadas esta semana","metrics.reusedNote":"Aproximado — contado pelas datas de último acesso","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.entityMeta":"{type} · confiança {confidence}% · {days}d sem uso","settings.capabilities":"Capacidades","settings.smartMode":"Modo Inteligente","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Provedor LLM","settings.llmOptional.title":"O LLM é opcional","settings.llmOptional.body":"memesh funciona sem LLM. O modo Core padrão cobre busca textual, remember/recall manual, dashboard e captura de sessão via hooks.","settings.llmOptional.coreLabel":"Sem LLM (modo Core)","settings.llmOptional.coreFeatures":"busca por palavra-chave FTS5, remember/recall manual, dashboard, captura de sessão via hooks","settings.llmOptional.smartLabel":"Com LLM (modo Smart)","settings.llmOptional.smartFeatures":"lesson_learned automático a partir de falhas de sessão, auto-tag de novas entidades, resumo semanal + detecção de padrões","settings.apiKey":"Chave API","settings.fallbacks.title":"Provedores de reserva","settings.fallbacks.explainer":"Se o seu provedor principal estiver indisponível, o memesh tenta estes em ordem até um funcionar.","settings.fallbacks.privacyTitle":"Nota de privacidade","settings.fallbacks.privacyBody":"Adicionar um provedor de nuvem (OpenAI ou Anthropic) significa que, quando o provedor principal estiver fora do ar, o conteúdo da sua memória — que pode ser privado — é enviado para esse provedor de nuvem. Se você usa um provedor local por privacidade, adicione uma reserva de nuvem apenas se aceitar essa troca.","settings.fallbacks.empty":"Nenhum provedor de reserva ainda.","settings.fallbacks.add":"Adicionar provedor de reserva","settings.fallbacks.providerLabel":"Provedor","settings.fallbacks.modelLabel":"Modelo (opcional)","settings.fallbacks.modelPlaceholder":"ex.: gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"Uma chave está salva. Deixe em branco para mantê-la.","settings.fallbacks.remove":"Remover","settings.fallbacks.moveUp":"Mover para cima","settings.fallbacks.moveDown":"Mover para baixo","settings.fallbacks.priority":"Prioridade {n}","settings.fallbacks.save":"Salvar cadeia de reserva","settings.fallbacks.needsKey":"Insira uma chave de API, ou esta reserva de nuvem não poderá ser usada.","settings.model":"Modelo (opcional)","settings.save":"Salvar","settings.saving":"Salvando…","settings.saved":"Salvo.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Testar","settings.testing":"Testando…","settings.testPassed":"✓ Conexão OK · {count} modelos disponíveis","settings.testFailed":"Falha no teste de conexão","settings.suggested":"sugerido","settings.testRequired":"Teste a conexão antes de salvar","settings.language":"Idioma","settings.searchMode":"Modo de busca","settings.none":"Nenhum","settings.updates":"Atualizações","settings.updateChecking":"Verificando atualizações…","settings.updateUnavailable":"Não foi possível verificar atualizações agora","settings.updateNoSuccessfulChecks":"Ainda não há verificações de atualização bem-sucedidas","settings.upToDate":"Está na versão mais recente","settings.updateAvailable":"Atualização disponível","settings.updateStale":"O status em cache pode estar desatualizado","settings.updateCachedFallback":"Usando o último resultado em cache com sucesso","settings.updateDeprecatedNoTarget":"Obsoleto — sem destino de atualização ainda","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} foi marcado como OBSOLETO pelos mantenedores.","settings.updatePartialTitle":"⚠️ Verificação de atualização parcial","settings.updatePartialDescription":"{message}. O status de obsolescência é desconhecido nesta sessão — execute a verificação novamente quando estiver online.","settings.updatePartialSummary":"Parcial — status de obsolescência desconhecido","settings.updateDeprecatedTargetUnknown":"Obsoleto — verificando destino de atualização","settings.currentVersion":"Versão atual","settings.latestVersion":"Versão mais recente","settings.lastChecked":"Última verificação","settings.lastAttempted":"Última tentativa de verificação","settings.lastSuccessful":"Última verificação bem-sucedida","settings.updateSourceFresh":"Verificação atual","settings.updateSourceCached":"Usando resultado em cache","settings.updateSourceStale":"Usando resultado em cache desatualizado","settings.updateSourceUnavailable":"Sem resultado em cache","settings.updateCommand":"Comando de atualização","settings.checkNow":"Verificar agora","settings.updateLastError":"Erro na última verificação: {message}","settings.installMethod":"Forma de instalação","settings.installNpmGlobal":"instalação global via npm","settings.installNpmLocal":"instalação local do projeto","settings.installSourceCheckout":"checkout do código-fonte","settings.installUnknown":"desconhecida","settings.updateGuidanceNpmGlobal":"Esta instalação pode ser atualizada diretamente pelo MeMesh.","settings.updateGuidanceNpmLocal":"Atualize esta instalação pelo gerenciador de pacotes do projeto que instalou o MeMesh.","settings.updateGuidanceSourceCheckout":"Atualize este checkout pelo repositório de código-fonte e faça o build novamente.","settings.updateGuidanceUnknown":"Atualize esta instalação com a ferramenta ou fluxo que instalou o MeMesh.","graph.entities":"Entidades","graph.relations":"Relações","graph.orphans":"Isoladas","graph.search":"Buscar nós…","graph.matches":"correspondências","graph.focusMode":"Foco","graph.showAll":"Mostrar tudo","graph.clickHint":"Clique em um nó para focar","graph.interactHint":"Clique num nó para focar · arraste área vazia para deslocar · role para zoom","graph.resetView":"Redefinir vista","graph.resetViewHint":"Redefinir zoom e posição","graph.ageToday":"hoje","graph.ageDaysAgo":"há {count}d","graph.ageWeeksAgo":"há {count} sem","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","feedback.submitting":"Coletando diagnóstico…","doctorBanner.warnTitleSoft":"memesh tem notas de configuração","doctorBanner.failTitle":"A configuração do memesh está incompleta","doctorBanner.dismiss":"Fechar","doctorBanner.getHelp":"Obter ajuda","doctorBanner.helpHint":"Abre um GitHub issue com o diagnóstico pré-preenchido","doctorBanner.preambleForIssue":"O memesh doctor relatou o seguinte na minha instalação:","doctorBanner.moreCount":"…e mais {n} — execute `memesh doctor` para a lista completa","doctor.label.readme_locale_parity":"Traduções do README","doctor.label.config":"Arquivo de configuração","doctor.label.mcp-config":"Arquivo de conexão MCP","doctor.label.hooks-config":"Definições de hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Conexão com o Claude Code","doctor.label.hook-activity":"Captura automática","doctor.label.node-runtime":"Versão do Node.js","doctor.label.native-binding":"SQLite e busca vetorial","doctor.label.shell-cli":"Comando no terminal","doctor.label.dashboard":"Arquivos do painel","doctor.label.update-status":"Atualizações","doctor.label.http-probe":"Servidor local","doctor.label.skills-manifest":"Arquivos incluídos","doctor.label.config_parse":"Arquivo de configuração","doctor.label.embeddings_probe":"Busca por significado","doctor.label.llm_probe":"Provedor de IA","doctor.label.install-channel":"Método de instalação","doctor.label.fts_segmentation":"Índice de palavras-chave","doctor.label.vector_index":"Índice de busca","doctor.label.database":"Banco de dados","doctor.msg.readme-parity.unreadable.summary":"Não foi possível ler o README.md: {detail}","doctor.msg.readme-parity.drift.summary":"Alguns READMEs traduzidos ficaram fora de sincronia com o inglês: {detail}","doctor.msg.readme-parity.drift.fix":"Realinhe os READMEs listados com o README.md.","doctor.msg.config.invalid-json.summary":"O arquivo de configuração em {path} não é um JSON válido e está sendo ignorado.","doctor.msg.config.invalid-json.fix":"Corrija ou apague {path} e depois execute `memesh config list` para confirmar que ele carrega.","doctor.msg.mcp-config.missing.summary":"O arquivo que conecta o memesh ao Claude Code (.mcp.json) está faltando.","doctor.msg.mcp-config.missing.fix":"Reinstale o MeMesh para restaurá-lo.","doctor.msg.mcp-config.invalid-json.summary":"O .mcp.json está danificado (não é um JSON válido) e o Claude Code não consegue lê-lo.","doctor.msg.mcp-config.invalid-json.fix":"Corrija {path} ou reinstale o MeMesh.","doctor.msg.mcp-config.no-entry.summary":"O .mcp.json não contém mais a entrada do servidor memesh.","doctor.msg.mcp-config.no-entry.fix":"Reinstale o MeMesh para restaurá-la.","doctor.msg.mcp-config.entry-missing.summary":"O `.mcp.json` inicia um arquivo que não existe nesta instalação, então nenhuma ferramenta do memesh dentro do Claude Code consegue iniciar.","doctor.msg.mcp-config.entry-missing.fix":"Reinstale o MeMesh. Se você editou o `.mcp.json` à mão, aponte-o de volta para `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.hooks-config.missing.summary":"O hooks/hooks.json está faltando, então a captura automática de memória não funciona.","doctor.msg.hooks-config.missing.fix":"Reinstale o MeMesh para restaurá-lo.","doctor.msg.hooks-config.invalid-json.summary":"O hooks/hooks.json está danificado (não é um JSON válido).","doctor.msg.hooks-config.invalid-json.fix":"Corrija {path} ou reinstale o MeMesh.","doctor.msg.hooks-config.missing-types.summary":"O hooks/hooks.json não tem estes tipos de hook: {types}. Parte da captura automática não vai rodar.","doctor.msg.hooks-config.missing-types.fix":"Restaure a configuração de hooks original ou reinstale o MeMesh.","doctor.msg.hook-scripts.none.summary":"A configuração de hooks não tem nenhum script, então nada pode ser capturado automaticamente.","doctor.msg.hook-scripts.none.fix":"Reinstale o MeMesh.","doctor.msg.hook-scripts.missing.summary":"Estes scripts de hook estão faltando: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstale o MeMesh para restaurá-los.","doctor.msg.hook-scripts.not-executable.summary":"Estes scripts de hook existem, mas não têm permissão para executar: {files}","doctor.msg.hook-scripts.not-executable.fix":"Execute `chmod +x scripts/hooks/*.js`, ou `npm run build` se estiver usando o código-fonte.","doctor.msg.hook-wiring.no-marker.summary":"O memesh ainda não está conectado ao Claude Code, então nada é lembrado automaticamente.","doctor.msg.hook-wiring.no-marker.fix":"Execute `memesh install-hooks` uma vez e depois `memesh doctor` para confirmar.","doctor.msg.hook-wiring.script-missing.summary":"Um hook memesh ligado aponta para {path}, que já não existe — o agente invoca um ficheiro inexistente em cada evento correspondente. Normalmente é resíduo de um upgrade que aposentou o hook.","doctor.msg.hook-wiring.script-missing.fix":"Execute `memesh install-hooks` para religar (remove entradas aposentadas) e reinicie o agente.","doctor.msg.hook-wiring.marker-unreadable.summary":"O registro de conexão em {path} não pode ser lido.","doctor.msg.hook-wiring.marker-unreadable.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.marker-malformed.summary":"O registro de conexão está danificado.","doctor.msg.hook-wiring.marker-malformed.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.settings-missing.summary":"O arquivo de configurações do Claude Code ({path}) sumiu, então a conexão está quebrada.","doctor.msg.hook-wiring.settings-missing.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} está danificado (não é um JSON válido).","doctor.msg.hook-wiring.settings-invalid.fix":"Restaure de um backup, ou execute `memesh install-hooks` para recriá-lo.","doctor.msg.hook-wiring.entries-removed.summary":"As entradas do memesh foram removidas de {path}, então a conexão está quebrada.","doctor.msg.hook-wiring.entries-removed.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.root-moved.summary":"A conexão aponta para {path}, que não existe mais (o memesh provavelmente foi movido).","doctor.msg.hook-wiring.root-moved.fix":"Execute `memesh install-hooks` para atualizá-la.","doctor.msg.hook-activity.never-ran.summary":"Nenhum hook de captura foi executado nas {hours} horas desde que o acompanhamento começou, mesmo com a ligação dos hooks no lugar — nada está a ser guardado.","doctor.msg.hook-activity.never-ran.fix":"Termine uma sessão de trabalho e execute `memesh doctor` outra vez. Se continuar a dizer que nenhum hook correu, execute `memesh install-hooks` e reinicie o agente.","doctor.msg.hook-activity.stale.summary":"O último hook de captura correu há cerca de {hours} horas ({hook}). Se trabalhou desde então, a captura parou e nada dessas sessões foi guardado.","doctor.msg.hook-activity.stale.fix":"Reinicie o agente, termine uma sessão e execute `memesh doctor` outra vez. Se não recuperar, execute `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"O hook session-summary executou pela última vez há cerca de {hours} horas, e nenhuma escrita do Claude Code chegou nos últimos 3 dias. Se esta máquina passou a usar outro agente (Codex / Gemini), isto é esperado; se você ainda usa Claude Code aqui, a captura parou.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Se você ainda usa Claude Code nesta máquina: reinicie-o, termine uma sessão e execute `memesh doctor` de novo. Se não recuperar, execute `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Não foi possível ler a atividade dos hooks na base de dados: {detail}. O estado da captura é desconhecido, o que não é o mesmo que saudável.","doctor.msg.hook-activity.query-failed.fix":"Execute `memesh doctor --verbose` para ver o erro completo e verifique que ~/.memesh é legível e que há espaço em disco.","doctor.msg.hook-activity.stale-unknown.summary":'O timestamp da última execução do hook {hook} não pode ser lido (corrompido, ou gravado por uma máquina com relógio errado). O estado da captura é "desconhecido", o que não é o mesmo que "saudável".',"doctor.msg.hook-activity.stale-unknown.fix":"Termine uma sessão de trabalho e execute `memesh doctor` de novo — uma execução nova sobrescreve o timestamp inválido.","doctor.msg.hook-activity.disabled.summary":"A captura automática está desligada (MEMESH_AUTO_CAPTURE ou autoCapture na configuração) — deliberadamente, então o silêncio dos hooks é esperado. Reative para voltar a capturar sessões.","doctor.msg.hook-activity.disabled-env.summary":"A captura automática está desligada por MEMESH_AUTO_CAPTURE=false no ambiente deste shell. O doctor só enxerga o próprio ambiente — se o seu agente roda sem esta variável, a captura lá não é afetada.","doctor.msg.hook-activity.not-wired.summary":"Nenhum hook de captura jamais executou — e nenhum hook de captura (Stop / PostToolUse / PreCompact) está confirmado como ligado nesta máquina, então não há nada para executar.","doctor.msg.hook-activity.not-wired.fix":"Se quiser captura automática, execute `memesh install-hooks`. Se esta instalação é só MCP (Codex / Gemini), isto é esperado e pode ser ignorado.","doctor.msg.hook-activity.stop-silent.summary":"O hook {hook} está registando, mas o hook session-summary nunca executou nas {hours} horas desde que o rastreamento começou — a captura de sessões pode estar quebrada, escondida pela captura de commits.","doctor.msg.hook-activity.stop-silent.fix":"Termine uma sessão de trabalho e execute `memesh doctor` de novo. Se o session-summary continuar sem executar, execute `memesh install-hooks` e reinicie o agente.","doctor.msg.hook-activity.never-ran-legacy.summary":"Nenhum hook registou o heartbeat, mas {captured} memórias de captura automática chegaram desde que o rastreamento começou — hooks de uma versão anterior ao rastreamento provavelmente ainda estão a executar.","doctor.msg.hook-activity.never-ran-legacy.fix":"Atualize os hooks do memesh para a versão atual (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) e reinicie o agente.","doctor.msg.node-runtime.too-old.summary":"Seu Node.js é mais antigo do que este pacote suporta. {detail}","doctor.msg.node-runtime.too-old.fix":"Atualize o Node.js para {required} ou mais novo e execute `memesh doctor` de novo.","doctor.msg.native-binding.node-too-old.summary":"O SQLite embutido nesta versão do Node é antigo demais para o memesh — ele não consegue carregar a parte que busca por significado. A versão completa chegou no Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Atualize o Node para 22.13 ou mais recente e rode `memesh doctor` de novo.","doctor.msg.native-binding.not-installed.summary":"O sqlite-vec não está instalado. As memórias continuam sendo salvas e encontradas por palavra-chave — só a busca por significado fica desligada.","doctor.msg.native-binding.not-installed.fix":"Execute `npm install` na pasta que usa o @pcircle/memesh.","doctor.msg.native-binding.load-failed.summary":"O sqlite-vec não pôde ser carregado: {detail}. A busca volta a usar só palavras-chave.","doctor.msg.native-binding.load-failed.fix":'Execute: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"O comando `memesh` não está disponível no seu terminal. Os recursos do Claude Code continuam funcionando — isso só afeta digitar `memesh` você mesmo.","doctor.msg.shell-cli.not-on-path.fix":"Execute `npm install -g @pcircle/memesh` para adicioná-lo. As duas instalações compartilham a mesma memória.","doctor.msg.dashboard.missing.summary":"Os arquivos do painel estão faltando.","doctor.msg.dashboard.missing.fix":"Gere-os com `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"O memesh ainda não conseguiu verificar se há versões mais novas.","doctor.msg.update-status.no-cache.fix":"Execute `memesh status` uma vez enquanto estiver online — isso guarda a resposta e este aviso desaparece.","doctor.msg.update-status.deprecated.summary":"A versão {version} foi retirada pelos mantenedores: {detail}","doctor.msg.update-status.deprecated.fix":"Atualize agora — execute `memesh update` (ou siga o seu método de instalação).","doctor.msg.update-status.deprecation-unknown.summary":"Não foi possível confirmar se a versão {version} ainda é segura de usar: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Execute `memesh status` online para tentar de novo.","doctor.msg.update-status.update-available.summary":"Há uma versão mais nova disponível: {latest} (você tem a {current}).","doctor.msg.update-status.update-available.fix":"Execute `memesh update` para atualizar.","doctor.msg.update-status.stale.summary":"A versão {version} está atual, mas a informação de atualização está velha.","doctor.msg.update-status.stale.fix":"Execute `memesh status` online para atualizá-la.","doctor.msg.http-probe.bad-status.summary":"O servidor local em {url} respondeu com um erro (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Reinicie-o com `memesh serve` e confira os logs.","doctor.msg.http-probe.no-server.summary":"Nenhum servidor local está rodando em {url}.","doctor.msg.http-probe.no-server.fix":"Inicie um com `memesh serve` se quiser usar o painel.","doctor.msg.skills-manifest.missing-dev.summary":"Nenhuma lista de integridade de arquivos foi encontrada (normal ao rodar a partir do código-fonte).","doctor.msg.skills-manifest.missing-dev.fix":"Execute `npm run build` para gerá-la.","doctor.msg.skills-manifest.unreadable.summary":"A lista de integridade de arquivos não pode ser lida ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Reinstale: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"A lista de integridade de arquivos está vazia.","doctor.msg.skills-manifest.empty.fix":"Reinstale: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Alguns arquivos incluídos não batem com o que foi distribuído: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Reinstale: `npm install -g @pcircle/memesh`. Se acontecer de novo em uma instalação limpa, reporte como um problema de segurança.","doctor.msg.config-parse.not-object.summary":"O arquivo de configuração em {path} não está no formato esperado, então todas as configurações estão sendo ignoradas.","doctor.msg.config-parse.not-object.fix":"Corrija ou apague {path} e depois execute `memesh doctor` de novo.","doctor.msg.config-parse.unreadable.summary":"O arquivo de configuração em {path} não pode ser lido ({detail}), então todas as configurações estão sendo ignoradas.","doctor.msg.config-parse.unreadable.fix":"Corrija o arquivo, ou deixe-o de lado: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'A busca por significado está definida como "{provider}", mas não produziu nada em um teste. A busca por palavras-chave continua funcionando.',"doctor.msg.embeddings.empty.fix":"Execute `memesh doctor --probe` para detalhes, ou verifique a conexão com o provedor.","doctor.msg.embeddings.threw.summary":'A busca por significado está definida como "{provider}", mas falhou em um teste: {detail}. A busca por palavras-chave continua funcionando.',"doctor.msg.embeddings.threw.fix":"Verifique se o provedor de embeddings está acessível (ex.: rode `ollama serve`), ou remova a config do embedder para usar busca só por palavras-chave.","doctor.msg.llm.unreachable.summary":"O provedor de IA ({provider}) não respondeu: {detail}. Os recursos de IA estão parados em silêncio.","doctor.msg.llm.unreachable.fix":"Verifique a API key e a conexão e depois execute `memesh doctor --probe` de novo.","doctor.msg.llm.threw.summary":"O teste do provedor de IA ({provider}) falhou: {detail}. Os recursos de IA estão parados em silêncio.","doctor.msg.llm.threw.fix":"Verifique a API key e a conexão e depois execute `memesh doctor --probe` de novo.","doctor.msg.install-channel.unknown.summary":"Não foi possível saber como o memesh foi instalado.","doctor.msg.install-channel.unknown.fix":"Se for um checkout do código-fonte, execute a partir da raiz do repositório; caso contrário, reinstale com `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"O índice de palavras-chave tem {count} entradas em um formato antigo — algumas memórias só aparecem com o texto completo exato.","doctor.msg.fts.unsegmented.fix":"Execute `memesh reindex --fts` para reconstruir o índice.","doctor.msg.vector-index.stale.summary":"O índice de busca precisa ser reconstruído (as configurações de busca mudaram).","doctor.msg.vector-index.stale.fix":"Execute `memesh reindex` para reconstruí-lo.","doctor.msg.vector-generation.open.summary":"Uma reconstrução de índice inacabada está ocupando espaço em disco.","doctor.msg.vector-generation.open.fix":"Execute `memesh reindex` para concluí-la, ou `memesh reindex --discard-generation` para liberar o espaço.","doctor.msg.database.broken.summary":"O banco de dados não está utilizável: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"{used} usadas / {total} injetadas","analytics.loadFailed":"Não foi possível carregar a análise.","memory.noContent":"(sem conteúdo)","memory.archivedBadge":"arquivada","memory.factsCount":"{count} fatos","common.error":"Erro","common.serverUnreachable":"Não foi possível conectar ao servidor memesh.","common.serverUnreachableAction":"Verifique se `memesh serve` ainda está em execução e recarregue esta página.","common.responseUnreadable":"O servidor respondeu, mas esta página não conseguiu ler a resposta — o dashboard e o servidor podem estar fora de sincronia.","common.responseUnreadableAction":"Recarregue a página. Se persistir, execute `memesh doctor`.","pm.title":"Métricas de PM","pm.decisionsPerWeek":"decisões/semana","pm.openDecisions":"decisões abertas (>14 d)","pm.orphanRate":"Memórias sem ligação","pm.relationsTotal":"total de relações","pm.stalePlans":"{count} plano(s) sem revisão há mais de 30 dias","common.loading":"Carregando…","common.noData":"Sem dados","errors.unknown":"Erro desconhecido","insights.noPreview":"Esta proposta não tem texto de resumo","httpError.auth.missing-bearer":"Este servidor exige um token de acesso. Informe o token para continuar.","httpError.auth.invalid-token":"O token de acesso não foi aceito. Verifique e tente novamente.","httpError.auth.not-configured":"O servidor não tem token de acesso configurado. Reinicie o `memesh serve` e confira a saída.","httpError.validation.bad-body":"O servidor não conseguiu ler a requisição enviada pela página. Recarregue a página e tente de novo.","httpError.validation.bad-param":"Parte da requisição não é válida. Recarregue a página e tente de novo.","httpError.route.retired":"O servidor não oferece mais esta ação — a página e o servidor podem estar em versões diferentes. Recarregue a página.","httpError.route.not-found":"O servidor não reconhece esta requisição — a página e o servidor podem estar em versões diferentes. Recarregue a página.","httpError.resource.not-found":"Esse item não existe mais. Atualize a lista.","httpError.payload.too-large":"Os dados enviados são grandes demais (mais de 1 MB). Tente lotes menores.","httpError.operation.failed":"O servidor não conseguiu concluir esta ação.","httpError.llm.not-configured":"Nenhum provedor de IA configurado. Adicione um em Configurações primeiro.","httpError.rate.limited":"Muitas solicitações em pouco tempo. Aguarde um momento e tente novamente.","httpError.server.internal":"O servidor encontrou um erro inesperado.","settings.testError.auth":"A chave de API foi rejeitada. Verifique a chave e tente novamente.","settings.testError.network":"Não foi possível alcançar o provedor. Verifique sua conexão de rede.","settings.testError.no_models":"O provedor respondeu, mas não retornou modelos utilizáveis.","settings.testError.bad_host":"O endereço do Ollama precisa estar nesta máquina (localhost).","settings.testError.http":"O provedor retornou um erro (HTTP {status}).","settings.testError.unknown":"O teste falhou por motivo desconhecido.","time.justNow":"Agora","time.hoursAgo":"Há {count}h","time.today":"Hoje","time.yesterday":"Ontem","time.daysAgo":"Há {count}d","time.lastWeek":"Semana passada","time.weeksAgo":"Há {count}sem","time.lastMonth":"Mês passado","time.monthsAgo":"Há {count}m","memory.access.frequent":"Frequente · {count} usos","memory.access.recalls":"{count} usos","memory.access.never":"Nunca usado","cluster.knowledge":"Conhecimento","cluster.activity":"Atividade","cluster.session":"Sessões","cluster.reference":"Referência","cluster.all":"Todos","browse.filterTime":"Tempo","browse.filterValue":"Valor","browse.filterProject":"Projeto","browse.filterSort":"Ordenar","browse.timeToday":"Hoje","browse.timeWeek":"Esta semana","browse.timeMonth":"Este mês","browse.timeOlder":"Mais antigo","browse.valueRecalled":"✓ Usado","browse.valueNever":"Nunca usado","browse.sortMostRecalled":"Mais usado","browse.sortRecent":"Recente","browse.sortCreated":"Criado em","browse.emptyFilter":"Sem memórias nesta categoria — tente outro filtro","lessons.stepsLabel":"passos","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Sem campos estruturados — ver memória bruta)","lessons.moreItems":"+{count} mais","roadmap.title":"Roadmap do Projeto","roadmap.summary":"{count} memórias · {first} → {last}","roadmap.switchToList":"↩ Lista","roadmap.switchToRoadmap":"🗺️ Roadmap","roadmap.emptyProject":"Sem memórias neste projeto ainda.","loop.label":"Loop de memória","loop.subtitleHas":"memórias de conhecimento reutilizadas nos últimos 7 dias","loop.subtitleNone":"Nenhuma memória de conhecimento reutilizada esta semana","loop.approxNote":"Aproximação — rastreamento completo começa após atualização.","loop.sparkLabel":"Últimos 30 dias","roadmap.milestones":"Marcos","roadmap.keyLessons":"Lições principais","radar.title":"Radar de cobertura","radar.caption":"Memórias de conhecimento ativas (session e commit excluídos)","radar.axis.lessons":"Lições","radar.axis.decisions":"Decisões","radar.axis.patterns":"Padrões","radar.axis.bugs":"Correções","radar.axis.processes":"Processos","radar.axis.architecture":"Arquitetura","ageMatrix.title":"Distribuição de idade","ageMatrix.low":"Baixa","ageMatrix.high":"Alta","ageMatrix.legend":"profundidade da cor = densidade","ageMatrix.typeColumn":"Tipo","header.signalModeOn":"Sinal","header.signalModeOff":"Tudo","header.signalModeOnHint":"Ocultando ruído de session e commit. Clique para mostrar tudo.","header.signalModeOffHint":"Mostrando todas as memórias incluindo ruído. Clique para ocultar.","roadmap.phases":"Fases","onboarding.title":"Bem-vindo ao MeMesh","onboarding.body":"Seu armazenamento de memória está vazio. Comece com um tour de 30 entidades curadas ou registre sua primeira lição.","onboarding.llmHint":"LLM não é necessário. Tudo funciona apenas com FTS5. LLM é opcional para geração automática de lições — configure depois em Configurações.","onboarding.seedButton":"Experimentar o tour","onboarding.seedingButton":"Carregando…","onboarding.seedHint":"Adiciona 30 memórias aqui mesmo — sem precisar do terminal","onboarding.cliReference":"Prefere a CLI?","onboarding.hintDemo":"Insere 30 memórias de demonstração que você pode limpar depois","onboarding.hintReset":"Remove tudo marcado com metadata.demo","onboarding.resetButton":"Resetar demo","onboarding.resettingButton":"Removendo…","onboarding.resetConfirm":"Remover todas as memórias de demonstração? Suas entradas reais serão mantidas.","onboarding.dismiss":"Fechar","common.serverError":"O servidor retornou um erro (HTTP {status}). Tente novamente — se persistir, execute `memesh doctor`.","emptyLibrary.title":"Sua memória está vazia","emptyLibrary.body":"Nada foi armazenado ainda. Carregue o tour de demonstração com 30 entradas para ver o MeMesh em ação — você pode apagá-lo depois com um clique.","browse.truncated":"mostrando as primeiras {shown} de {total} memórias — use a busca ou os filtros para alcançar o restante","browse.truncatedUnknownTotal":"mostrando as primeiras {shown} memórias — o total está indisponível, então pode haver mais","graph.cappedNote":"Mostrando as {shown} principais de {total} entidades (mais recuperadas primeiro) para manter o grafo responsivo.","settings.testStoredKeyHint":"Deixe o campo vazio para testar a chave já salva.","ageMatrix.bucket.week":"Esta semana","ageMatrix.bucket.month":"Este mês","ageMatrix.bucket.quarter":"Este trimestre","ageMatrix.bucket.older":"Mais antigo","settings.behaviourTitle":"Comportamento","settings.autoUpdateLabel":"Política de auto-atualização","settings.autoUpdateOff":"Desligado — apenas manual","settings.autoUpdatePatch":"Patch — aplica X.Y.Z+1","settings.autoUpdateMinor":"Minor — aplica X.Y+1.0","settings.autoUpdateMajor":"Major — aplica qualquer bump","settings.autoUpdateHint":"Acionado após cada sessão. MEMESH_AUTO_UPDATE tem prioridade.","errors.timeout":"A solicitação expirou","type.lesson_learned":"Lição","type.lesson":"Lição","type.mistake":"Erro","type.decision":"Decisão","type.architecture_decision":"Decisão arq.","type.design_decision":"Decisão de design","type.pattern":"Padrão","type.technical_pattern":"Padrão técnico","type.best_practice":"Melhor prática","type.bug_fix":"Correção","type.verification_result":"Verificação","type.test_result":"Resultado de teste","type.process":"Processo","type.architecture":"Arquitetura","type.infrastructure":"Infraestrutura","type.feature":"Funcionalidade","type.release":"Lançamento","type.refactoring":"Refatoração","type.commit":"Commit","type.session_keypoint":"Ponto da sessão","type.session_identity":"Identidade da sessão","type.session-insight":"Insight da sessão","type.session-summary":"Resumo da sessão","type.session-identity":"Identidade da sessão","type.weekly_summary":"Resumo semanal","type.weekly-summary":"Resumo semanal","type.note":"Nota","type.plan":"Plano","type.knowledge":"Conhecimento","type.workflow_checkpoint":"Checkpoint","type.concept":"Conceito","type.tool":"Ferramenta","type.person":"Pessoa","relation.relates_to":"relaciona-se com","relation.related-to":"relacionado a","relation.depends_on":"depende de","relation.implements":"implementa","relation.learned_from":"aprendido de","relation.supersedes":"substitui","relation.contradicts":"contradiz","relation.follows":"segue","relation.belongs-to-project":"pertence ao projeto","relation.evidences":"evidencia","relation.co-created":"cocriado","relation.shares-name-tokens":"nomes semelhantes","patterns.day.0":"domingo","patterns.day.1":"segunda","patterns.day.2":"terça","patterns.day.3":"quarta","patterns.day.4":"quinta","patterns.day.5":"sexta","patterns.day.6":"sábado","telemetry.flow.dreamer":"Resumo semanal (dreamer)","telemetry.flow.pattern_detector":"Detector de padrões","telemetry.flow.digest_validator":"Validador de resumos","telemetry.flow.guard_proposer":"Propositor de guardas","telemetry.flow.auto_tagger":"Auto-tagger","telemetry.flow.failure_analyzer":"Analisador de falhas","telemetry.flow.transcript_extractor":"Minerador de transcrições","telemetry.flow.conflict_judge":"Juiz de conflitos","telemetry.errorClass.auth":"credencial rejeitada","telemetry.errorClass.rate_limit":"limite de taxa","telemetry.errorClass.upstream":"falha do provedor","telemetry.errorClass.bad_request":"requisição inválida","telemetry.errorClass.network":"rede","telemetry.errorClass.parse":"resposta ilegível","telemetry.errorClass.unknown":"desconhecido","lessons.severity.critical":"Crítico","lessons.severity.major":"Grave","lessons.severity.minor":"Menor","memory.tooltip.project":"Projeto","memory.tooltip.recalled":"Recuperado {count} vezes","memory.tooltip.hasRelations":"Ligado a {count} outras memórias","memory.tooltip.createdAt":"Criado em {date}","graph.layerLabel":"Camada do grafo","graph.layerWork":"Trabalho","graph.layerAll":"Tudo","graph.layerWorkHint":"Decisões, lições e planos — o trabalho em si.","graph.layerAllHint":"Todas as memórias que o memesh guardou, incluindo captura automática.","graph.layerFellBack":"Menos de {min} itens de trabalho até agora, por isso mostramos o grafo completo. Registe decisões e lições e esta vista preenche-se.","graph.evidenceFor":"Evidências de {node}","graph.evidenceClose":"Fechar","graph.evidenceLoading":"A carregar evidências…","graph.evidenceFailed":"Não foi possível carregar as evidências deste item.","graph.evidenceEmpty":"Ainda não há evidências ligadas a este item. Execute `memesh kg backfill` para criar essas ligações a partir de commits e capturas de sessão.","graph.evidenceTruncated":"A mostrar as {shown} mais recentes; existem mais.","graph.drift":"Frescor","graph.driftHint":"Colore os nós pela idade: vermelho = antigo, verde = usado recentemente","common.unknown":"desconhecido","insights.entitiesCount":"{n} entidades","roadmap.viewToggle":"Vista do roadmap","roadmap.viewTree":"Árvore","roadmap.viewMindmap":"Mapa mental","roadmap.mindmapNeedsPhases":"O mapa mental precisa de pelo menos 3 memórias numa janela de 7 dias.","roadmap.activePhase":"ativa","roadmap.entryCount":"{count} entrada","roadmap.entriesCount":"{count} entradas","roadmap.otherGroup":"Outros ({count})","roadmap.lowSignalHidden":"({count} de baixo sinal ocultas)","roadmap.resetHint":"Redefinir zoom e posição (duplo clique no fundo também redefine)","roadmap.zoomHint":"role para zoom · arraste para mover · {pct}%","roadmap.moreEntities":"+{count} mais","roadmap.viewDecisions":"Decisões","roadmap.densityTitle":"Densidade de captura por categoria","roadmap.densityNote":"o que o memesh capturou — não tudo o que aconteceu","roadmap.lineageSupersedes":"{n} substituídas","roadmap.lineageConflicts":"{n} conflitos não resolvidos","adr.empty":'Nenhuma decisão registrada neste projeto ainda. Registre uma com o tipo "decision" e ela aparece aqui com seu histórico.',"adr.statusActive":"ativa","adr.statusSuperseded":"substituída","adr.supersedes":"substitui","adr.supersededBy":"substituída por","nav.ariaLabel":"Seções do painel","feedback.descLabel":"Descrição do feedback","graph.canvasA11y":"Grafo de conhecimento (em canvas): {entities} entidades, {relations} relações, {orphans} sem ligação. Use os filtros de tipo e a busca acima para uma visão não visual."},fr:{"auth.title":"Authentification requise","auth.intro":"Ce tableau de bord est protégé par un jeton bearer. Collez la valeur de MEMESH_REMOTE_TOKEN (ou le contenu de <memeshDir>/remote-token) ci-dessous.","auth.tokenLabel":"Jeton","auth.empty":"Le jeton ne peut pas être vide.","auth.invalid":"Ce jeton n'a pas été accepté. Vérifiez-le et réessayez.","auth.submit":"Déverrouiller le tableau de bord","auth.tokenPlaceholder":"collez le jeton ici","brand.subtitle":"powered by pcircle.com","header.connected":"Connecté","header.disconnected":"Déconnecté","header.connecting":"Connexion…","header.memories":"mémoires","telemetry.title":"Activité du LLM","telemetry.lastNDays":"{n} derniers jours","telemetry.loading":"chargement…","telemetry.empty":"Aucune activité d'IA pour cette période. Les lignes apparaissent automatiquement lorsque les fonctions d'IA en arrière-plan (résumés hebdomadaires, étiquetage automatique…) s'exécutent.","telemetry.callsCount":"{n} appels","telemetry.attemptsCount":"{n} tentatives","telemetry.successRate":"succès","telemetry.medianLatency":"latence médiane","telemetry.fallbackUsed":"fallback utilisé {n}× ({pct} des appels)","telemetry.byProvider":"par fournisseur","telemetry.byModel":"par modèle","telemetry.byProject":"par projet","telemetry.errors":"erreurs","insights.title":"Ce que memesh a fait pour vous","insights.subtitle":"recaps hebdomadaires et patterns générés automatiquement, en attente de revue","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"Tous","insights.refresh":"Actualiser","insights.loading":"chargement…","insights.emptyPending":"Aucun insight pending. Exécutez `memesh dream run` pour générer un weekly recap.","insights.emptyNoLlm":"Configurez un fournisseur LLM dans les paramètres pour activer les weekly recaps et la détection de patterns.","insights.emptyOther":"Rien ici.","insights.sources":"sources","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"Voir le détail","insights.collapse":"Réduire","insights.accept":"Accepter","insights.applying":"Application…","insights.reject":"Rejeter","insights.generatedBy":"Généré par","insights.promptVersion":"Version du prompt","insights.observations":"Observations résumées","insights.tags":"Tags","insights.sourceIds":"Sources","insights.validationWarnings":"Affirmations signalées (LLM validator)","insights.validationClaim":"Affirmation","insights.validationReason":"Raison","insights.runDream":"Lancer le weekly recap","insights.runDreamWithValidate":"Lancer avec validator (plus lent, meilleure qualité)","banner.pendingInsights":"{n} nouveau(x) insight{s} en attente de revue →","banner.dismiss":"Ignorer","banner.viewAll":"Tout voir","pattern.title":"Pattern","pattern.evidenceCount":"{n} preuve(s)","pattern.severity":"Sévérité","pattern.severity.high":"élevée","pattern.severity.medium":"moyenne","pattern.severity.low":"faible","pattern.description":"Description du pattern","tab.graph":"Graphe","tab.settings":"Paramètres","tab.home":"Accueil","tab.memories":"Mémoires","tab.project":"Projet","memories.searchPlaceholder":"Filtrez en tapant — appuyez sur Entrée pour une recherche par pertinence","memories.scopeLabel":"Portée","memories.scopeWork":"Couche de travail","memories.scopeEvidence":"Preuves","memories.scopeAll":"Toutes","memories.scopeArchived":"Archivées","memories.composition":"Composition","memories.rankedBy":"classées par pertinence","memories.backToList":"Retour à la liste","memories.workEmpty":"Pas encore de mémoires de la couche de travail — objectifs, décisions, leçons et plans arrivent ici à mesure qu'ils sont capturés.","memories.showAll":"Afficher toutes les mémoires","memories.expand":"Afficher les détails","memories.collapse":"Masquer les détails","home.analyticsTitle":"Analyse","home.analyticsHint":"Santé, chronologie, patterns et utilisation — se déploie à la demande","project.selectLabel":"Projet","project.selectPrompt":"Choisissez un projet pour voir son historique.","project.empty":"Pas encore de mémoires de projet. Travaillez dans un dépôt git avec les hooks memesh installés et son histoire apparaîtra ici.","guard.sourceLesson":"Leçon d'origine","guard.pattern":"Motif de déclenchement","guard.message":"Avertissement affiché","guard.shouldMatch":"Doit se déclencher sur","guard.shouldNotMatch":"Doit rester silencieux sur","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.active":"actives","browse.archived":"archivées","browse.refresh":"Actualiser","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.archiveFailed":"Impossible d’archiver la mémoire : {message}","browse.restoreFailed":"Impossible de restaurer la mémoire : {message}","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","metrics.notMeasured":"Pas encore mesuré","metrics.health":"Santé","metrics.healthNote":"Activité, qualité, fraîcheur, leçons","metrics.critical":"Leçons critiques","metrics.criticalPartial":"sur {tagged} classées · {total} leçons au total","metrics.criticalAll":"sur {total} leçons, toutes classées","metrics.criticalUnclassified":"{total} leçons, aucune classée par gravité","metrics.criticalNoLessons":"Aucune leçon enregistrée pour le moment","metrics.citation":"Citations","metrics.citationNote":"{cited} sessions sur {total} ont cité une mémoire","metrics.citationNotMeasured":"Le suivi des citations démarre à la prochaine session","metrics.reused":"Réutilisées cette semaine","metrics.reusedNote":"Approximatif — d'après les dates de dernier accès","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.entityMeta":"{type} · confiance {confidence}% · {days} j sans usage","settings.capabilities":"Capacités","settings.smartMode":"Mode intelligent","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Fournisseur LLM","settings.llmOptional.title":"Le LLM est optionnel","settings.llmOptional.body":"memesh fonctionne sans LLM. Le mode Core par défaut couvre la recherche plein texte, remember/recall manuel, le tableau de bord et la capture de session via les hooks.","settings.llmOptional.coreLabel":"Sans LLM (mode Core)","settings.llmOptional.coreFeatures":"recherche par mot-clé FTS5, remember/recall manuel, tableau de bord, capture de session via hooks","settings.llmOptional.smartLabel":"Avec LLM (mode Smart)","settings.llmOptional.smartFeatures":"lesson_learned automatique à partir des échecs de session, auto-tag des nouvelles entités, récap hebdomadaire + détection de motifs","settings.apiKey":"Clé API","settings.fallbacks.title":"Fournisseurs de secours","settings.fallbacks.explainer":"Si votre fournisseur principal est indisponible, memesh essaie ceux-ci dans l’ordre jusqu’à ce que l’un fonctionne.","settings.fallbacks.privacyTitle":"Note de confidentialité","settings.fallbacks.privacyBody":"Ajouter un fournisseur cloud (OpenAI ou Anthropic) signifie que, lorsque votre fournisseur principal est hors service, le contenu de votre mémoire — qui peut être privé — est envoyé à ce fournisseur cloud. Si vous utilisez un fournisseur local pour la confidentialité, n’ajoutez un secours cloud que si vous acceptez ce compromis.","settings.fallbacks.empty":"Aucun fournisseur de secours pour l’instant.","settings.fallbacks.add":"Ajouter un fournisseur de secours","settings.fallbacks.providerLabel":"Fournisseur","settings.fallbacks.modelLabel":"Modèle (facultatif)","settings.fallbacks.modelPlaceholder":"ex. : gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"Une clé est enregistrée. Laissez vide pour la conserver.","settings.fallbacks.remove":"Supprimer","settings.fallbacks.moveUp":"Monter","settings.fallbacks.moveDown":"Descendre","settings.fallbacks.priority":"Priorité {n}","settings.fallbacks.save":"Enregistrer la chaîne de secours","settings.fallbacks.needsKey":"Saisissez une clé API, sinon ce secours cloud ne peut pas être utilisé.","settings.model":"Modèle (optionnel)","settings.save":"Enregistrer","settings.saving":"Enregistrement…","settings.saved":"Enregistré.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Tester","settings.testing":"Test en cours…","settings.testPassed":"✓ Connexion OK · {count} modèles disponibles","settings.testFailed":"Échec du test de connexion","settings.suggested":"suggéré","settings.testRequired":"Testez la connexion avant d'enregistrer","settings.language":"Langue","settings.searchMode":"Mode de recherche","settings.none":"Aucun","settings.updates":"Mises à jour","settings.updateChecking":"Vérification des mises à jour…","settings.updateUnavailable":"Impossible de vérifier les mises à jour pour le moment","settings.updateNoSuccessfulChecks":"Aucune vérification réussie des mises à jour pour le moment","settings.upToDate":"À jour","settings.updateAvailable":"Mise à jour disponible","settings.updateStale":"L’état en cache affiché est peut-être périmé","settings.updateCachedFallback":"Utilisation du dernier résultat en cache réussi","settings.updateDeprecatedNoTarget":"Obsolète — pas encore de cible de mise à niveau","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} est marqué OBSOLÈTE par les mainteneurs.","settings.updatePartialTitle":"⚠️ Vérification de mise à jour partielle","settings.updatePartialDescription":"{message}. Le statut d'obsolescence est inconnu pour cette session — relancez la vérification une fois en ligne.","settings.updatePartialSummary":"Partielle — statut d'obsolescence inconnu","settings.updateDeprecatedTargetUnknown":"Obsolète — recherche de la cible de mise à niveau","settings.currentVersion":"Version actuelle","settings.latestVersion":"Dernière version","settings.lastChecked":"Dernière vérification","settings.lastAttempted":"Dernière tentative de vérification","settings.lastSuccessful":"Dernière vérification réussie","settings.updateSourceFresh":"Vérification en direct","settings.updateSourceCached":"Résultat en cache","settings.updateSourceStale":"Résultat en cache périmé","settings.updateSourceUnavailable":"Aucun résultat en cache","settings.updateCommand":"Commande de mise à jour","settings.checkNow":"Vérifier maintenant","settings.updateLastError":"Erreur lors de la dernière vérification : {message}","settings.installMethod":"Méthode d’installation","settings.installNpmGlobal":"installation npm globale","settings.installNpmLocal":"installation locale au projet","settings.installSourceCheckout":"checkout du dépôt source","settings.installUnknown":"inconnue","settings.updateGuidanceNpmGlobal":"Cette installation peut être mise à jour directement depuis MeMesh.","settings.updateGuidanceNpmLocal":"Mettez cette installation à jour via le gestionnaire de paquets du projet qui a installé MeMesh.","settings.updateGuidanceSourceCheckout":"Mettez ce checkout source à jour depuis son dépôt puis reconstruisez-le.","settings.updateGuidanceUnknown":"Mettez cette installation à jour avec l’outil ou le flux qui a installé MeMesh.","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","graph.interactHint":"Cliquez sur un nœud pour cibler · glissez une zone vide pour déplacer · molette pour zoomer","graph.resetView":"Réinitialiser la vue","graph.resetViewHint":"Réinitialiser zoom et position","graph.ageToday":"aujourd’hui","graph.ageDaysAgo":"il y a {count} j","graph.ageWeeksAgo":"il y a {count} sem.","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","feedback.submitting":"Collecte des diagnostics…","doctorBanner.warnTitleSoft":"memesh a quelques notes de configuration","doctorBanner.failTitle":"La configuration de memesh est incomplète","doctorBanner.dismiss":"Fermer","doctorBanner.getHelp":"Obtenir de l'aide","doctorBanner.helpHint":"Ouvre un GitHub issue avec le diagnostic pré-rempli","doctorBanner.preambleForIssue":"memesh doctor a signalé ce qui suit sur mon installation :","doctorBanner.moreCount":"…et {n} de plus — exécutez `memesh doctor` pour la liste complète","doctor.label.readme_locale_parity":"Traductions du README","doctor.label.config":"Fichier de configuration","doctor.label.mcp-config":"Fichier de connexion MCP","doctor.label.hooks-config":"Définitions des hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Connexion à Claude Code","doctor.label.hook-activity":"Capture automatique","doctor.label.node-runtime":"Version de Node.js","doctor.label.native-binding":"SQLite et recherche vectorielle","doctor.label.shell-cli":"Commande du terminal","doctor.label.dashboard":"Fichiers du tableau de bord","doctor.label.update-status":"Mises à jour","doctor.label.http-probe":"Serveur local","doctor.label.skills-manifest":"Fichiers fournis","doctor.label.config_parse":"Fichier de configuration","doctor.label.embeddings_probe":"Recherche par le sens","doctor.label.llm_probe":"Fournisseur d'IA","doctor.label.install-channel":"Méthode d'installation","doctor.label.fts_segmentation":"Index de mots-clés","doctor.label.vector_index":"Index de recherche","doctor.label.database":"Base de données","doctor.msg.readme-parity.unreadable.summary":"Impossible de lire README.md : {detail}","doctor.msg.readme-parity.drift.summary":"Certains README traduits ne sont plus alignés avec la version anglaise : {detail}","doctor.msg.readme-parity.drift.fix":"Resynchronisez les README listés avec README.md.","doctor.msg.config.invalid-json.summary":"Le fichier de configuration {path} n'est pas un JSON valide, il est donc ignoré.","doctor.msg.config.invalid-json.fix":"Corrigez ou supprimez {path}, puis exécutez `memesh config list` pour vérifier qu'il se charge.","doctor.msg.mcp-config.missing.summary":"Le fichier qui relie memesh à Claude Code (.mcp.json) est introuvable.","doctor.msg.mcp-config.missing.fix":"Réinstallez MeMesh pour le restaurer.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json est endommagé (JSON invalide), Claude Code ne peut donc pas le lire.","doctor.msg.mcp-config.invalid-json.fix":"Corrigez {path} ou réinstallez MeMesh.","doctor.msg.mcp-config.no-entry.summary":".mcp.json ne contient plus l'entrée du serveur memesh.","doctor.msg.mcp-config.no-entry.fix":"Réinstallez MeMesh pour la restaurer.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` démarre un fichier absent de cette installation, donc aucun outil memesh dans Claude Code ne peut démarrer.","doctor.msg.mcp-config.entry-missing.fix":"Réinstallez MeMesh. Si vous avez modifié `.mcp.json` à la main, refaites-le pointer vers `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json est introuvable, la capture automatique de mémoire ne peut donc pas fonctionner.","doctor.msg.hooks-config.missing.fix":"Réinstallez MeMesh pour le restaurer.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json est endommagé (JSON invalide).","doctor.msg.hooks-config.invalid-json.fix":"Corrigez {path} ou réinstallez MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json ne contient pas ces types de hooks : {types}. Une partie de la capture automatique ne fonctionnera pas.","doctor.msg.hooks-config.missing-types.fix":"Restaurez la configuration de hooks d'origine ou réinstallez MeMesh.","doctor.msg.hook-scripts.none.summary":"La configuration des hooks ne contient aucun script, rien ne peut donc être capturé automatiquement.","doctor.msg.hook-scripts.none.fix":"Réinstallez MeMesh.","doctor.msg.hook-scripts.missing.summary":"Ces scripts de hook sont introuvables : {files}","doctor.msg.hook-scripts.missing.fix":"Réinstallez MeMesh pour les restaurer.","doctor.msg.hook-scripts.not-executable.summary":"Ces scripts de hook existent mais n'ont pas le droit de s'exécuter : {files}","doctor.msg.hook-scripts.not-executable.fix":"Exécutez `chmod +x scripts/hooks/*.js`, ou `npm run build` si vous utilisez le code source.","doctor.msg.hook-wiring.no-marker.summary":"memesh n'est pas encore relié à Claude Code, rien n'est donc mémorisé automatiquement.","doctor.msg.hook-wiring.no-marker.fix":"Exécutez `memesh install-hooks` une fois, puis `memesh doctor` pour vérifier.","doctor.msg.hook-wiring.script-missing.summary":"Un hook memesh câblé pointe vers {path}, qui n'existe plus — l'agent invoque un fichier manquant à chaque événement correspondant. Généralement un résidu d'une mise à niveau qui a retiré le hook.","doctor.msg.hook-wiring.script-missing.fix":"Lancez `memesh install-hooks` pour recâbler (les entrées retirées sont supprimées), puis redémarrez l'agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"Le registre de connexion {path} est illisible.","doctor.msg.hook-wiring.marker-unreadable.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.marker-malformed.summary":"Le registre de connexion est endommagé.","doctor.msg.hook-wiring.marker-malformed.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.settings-missing.summary":"Le fichier de réglages de Claude Code ({path}) a disparu, la connexion est donc rompue.","doctor.msg.hook-wiring.settings-missing.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} est endommagé (JSON invalide).","doctor.msg.hook-wiring.settings-invalid.fix":"Restaurez-le depuis une sauvegarde, ou exécutez `memesh install-hooks` pour le recréer.","doctor.msg.hook-wiring.entries-removed.summary":"Les entrées memesh ont été retirées de {path}, la connexion est donc rompue.","doctor.msg.hook-wiring.entries-removed.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.root-moved.summary":"La connexion pointe vers {path}, qui n'existe plus (memesh a probablement été déplacé).","doctor.msg.hook-wiring.root-moved.fix":"Exécutez `memesh install-hooks` pour la mettre à jour.","doctor.msg.hook-activity.never-ran.summary":"Aucun hook de capture n'a été exécuté depuis {hours} heures, date de début du suivi, alors que le câblage des hooks est en place — rien n'est mémorisé.","doctor.msg.hook-activity.never-ran.fix":"Terminez une session de travail puis relancez `memesh doctor`. Si le message persiste, exécutez `memesh install-hooks` et redémarrez votre agent.","doctor.msg.hook-activity.stale.summary":"Le dernier hook de capture s'est exécuté il y a environ {hours} heures ({hook}). Si vous avez travaillé depuis, la capture est arrêtée et rien de ces sessions n'a été enregistré.","doctor.msg.hook-activity.stale.fix":"Redémarrez votre agent, terminez une session puis relancez `memesh doctor`. Si cela ne se rétablit pas, exécutez `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Le hook session-summary a tourné pour la dernière fois il y a environ {hours} heures, et aucune écriture Claude Code n'est arrivée depuis 3 jours non plus. Si cette machine est passée à un autre agent (Codex / Gemini), c'est attendu ; si vous utilisez encore Claude Code ici, la capture s'est arrêtée.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Si vous utilisez encore Claude Code sur cette machine : redémarrez-le, terminez une session, puis relancez `memesh doctor`. S'il ne récupère pas, lancez `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Impossible de lire l'activité des hooks dans la base de données : {detail}. L'état de la capture est inconnu, ce qui n'est pas la même chose que sain.","doctor.msg.hook-activity.query-failed.fix":"Lancez `memesh doctor --verbose` pour voir l'erreur complète, et vérifiez que ~/.memesh est lisible et que le disque n'est pas plein.","doctor.msg.hook-activity.stale-unknown.summary":"L'horodatage de la dernière exécution du hook {hook} est illisible (corrompu, ou écrit par une machine à l'horloge déréglée). L'état de la capture est « inconnu », ce qui n'est pas la même chose que « sain ».","doctor.msg.hook-activity.stale-unknown.fix":"Terminez une session de travail puis relancez `memesh doctor` — une nouvelle exécution écrase l'horodatage invalide.","doctor.msg.hook-activity.disabled.summary":"La capture automatique est désactivée (MEMESH_AUTO_CAPTURE ou autoCapture dans la configuration) — délibérément, le silence des hooks est donc attendu. Réactivez-la pour reprendre la capture.","doctor.msg.hook-activity.disabled-env.summary":"La capture automatique est désactivée par MEMESH_AUTO_CAPTURE=false dans l'environnement de ce shell. doctor ne voit que son propre environnement — si votre agent tourne sans cette variable, la capture là-bas n'est pas affectée.","doctor.msg.hook-activity.not-wired.summary":"Aucun hook de capture n'a jamais tourné — et aucun hook de capture (Stop / PostToolUse / PreCompact) n'est confirmé câblé sur cette machine, il n'y a donc rien à exécuter.","doctor.msg.hook-activity.not-wired.fix":"Pour la capture automatique, lancez `memesh install-hooks`. Si cette installation est MCP uniquement (Codex / Gemini), c'est normal et vous pouvez l'ignorer.","doctor.msg.hook-activity.stop-silent.summary":"Le hook {hook} s'enregistre, mais le hook session-summary n'a jamais tourné une seule fois en {hours} heures de suivi — la capture de session est peut-être cassée, masquée par la capture des commits.","doctor.msg.hook-activity.stop-silent.fix":"Terminez une session de travail puis relancez `memesh doctor`. Si session-summary n'a toujours pas tourné, lancez `memesh install-hooks` et redémarrez l'agent.","doctor.msg.hook-activity.never-ran-legacy.summary":"Aucun hook n'a enregistré le heartbeat, mais {captured} mémoires de capture automatique sont arrivées depuis le début du suivi — des hooks d'une version antérieure au suivi tournent probablement encore.","doctor.msg.hook-activity.never-ran-legacy.fix":"Mettez à jour les hooks memesh vers la version actuelle (plugin : `/plugin update memesh` ; npm : `memesh install-hooks`), puis redémarrez l'agent.","doctor.msg.node-runtime.too-old.summary":"Votre Node.js est plus ancien que ce que ce paquet prend en charge. {detail}","doctor.msg.node-runtime.too-old.fix":"Mettez Node.js à niveau vers {required} ou plus récent, puis relancez `memesh doctor`.","doctor.msg.native-binding.node-too-old.summary":"Le SQLite intégré à cette version de Node est trop ancien pour memesh : il ne peut pas charger la partie qui recherche par sens. La version complète est arrivée avec Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Passez à Node 22.13 ou plus récent, puis relancez `memesh doctor`.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec n'est pas installé. Les mémoires sont toujours enregistrées et retrouvées par mot-clé — seule la recherche par sens est désactivée.","doctor.msg.native-binding.not-installed.fix":"Exécutez `npm install` dans le dossier qui utilise @pcircle/memesh.","doctor.msg.native-binding.load-failed.summary":"sqlite-vec n'a pas pu être chargé : {detail}. La recherche se limite aux mots-clés.","doctor.msg.native-binding.load-failed.fix":'Exécutez : cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"La commande `memesh` n'est pas disponible dans votre terminal. Les fonctions de Claude Code continuent de marcher — cela ne concerne que la saisie de `memesh` par vous-même.","doctor.msg.shell-cli.not-on-path.fix":"Exécutez `npm install -g @pcircle/memesh` pour l'ajouter. Les deux installations partagent la même mémoire.","doctor.msg.dashboard.missing.summary":"Les fichiers du tableau de bord sont introuvables.","doctor.msg.dashboard.missing.fix":"Générez-les avec `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"memesh n'a pas encore réussi à vérifier s'il existe des versions plus récentes.","doctor.msg.update-status.no-cache.fix":"Exécutez `memesh status` une fois en ligne — la réponse est mémorisée et cet avis disparaît.","doctor.msg.update-status.deprecated.summary":"La version {version} a été retirée par ses mainteneurs : {detail}","doctor.msg.update-status.deprecated.fix":"Mettez à jour maintenant — exécutez `memesh update` (ou suivez votre méthode d'installation).","doctor.msg.update-status.deprecation-unknown.summary":"Impossible de confirmer si la version {version} est encore sûre : {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Exécutez `memesh status` en ligne pour réessayer.","doctor.msg.update-status.update-available.summary":"Une version plus récente est disponible : {latest} (vous avez {current}).","doctor.msg.update-status.update-available.fix":"Exécutez `memesh update` pour mettre à jour.","doctor.msg.update-status.stale.summary":"La version {version} est à jour, mais les informations de mise à jour sont anciennes.","doctor.msg.update-status.stale.fix":"Exécutez `memesh status` en ligne pour les rafraîchir.","doctor.msg.http-probe.bad-status.summary":"Le serveur local à {url} a répondu par une erreur (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Redémarrez-le avec `memesh serve` et consultez les journaux.","doctor.msg.http-probe.no-server.summary":"Aucun serveur local ne tourne à {url}.","doctor.msg.http-probe.no-server.fix":"Démarrez-en un avec `memesh serve` si vous voulez le tableau de bord.","doctor.msg.skills-manifest.missing-dev.summary":"Aucune liste d'intégrité des fichiers trouvée (normal quand on exécute depuis le code source).","doctor.msg.skills-manifest.missing-dev.fix":"Exécutez `npm run build` pour la générer.","doctor.msg.skills-manifest.unreadable.summary":"La liste d'intégrité des fichiers est illisible ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Réinstallez : `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"La liste d'intégrité des fichiers est vide.","doctor.msg.skills-manifest.empty.fix":"Réinstallez : `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Certains fichiers fournis ne correspondent pas à ce qui a été livré : {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Réinstallez : `npm install -g @pcircle/memesh`. Si cela se reproduit sur une installation neuve, signalez-le comme un problème de sécurité.","doctor.msg.config-parse.not-object.summary":"Le fichier de configuration {path} n'a pas le format attendu, tous les réglages sont donc ignorés.","doctor.msg.config-parse.not-object.fix":"Corrigez ou supprimez {path}, puis relancez `memesh doctor`.","doctor.msg.config-parse.unreadable.summary":"Le fichier de configuration {path} est illisible ({detail}), tous les réglages sont donc ignorés.","doctor.msg.config-parse.unreadable.fix":"Corrigez le fichier, ou mettez-le de côté : mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":"La recherche par le sens est réglée sur « {provider} » mais n'a rien produit lors d'un test. La recherche par mots-clés fonctionne toujours.","doctor.msg.embeddings.empty.fix":"Exécutez `memesh doctor --probe` pour les détails, ou vérifiez la connexion au fournisseur.","doctor.msg.embeddings.threw.summary":"La recherche par le sens est réglée sur « {provider} » mais a échoué lors d'un test : {detail}. La recherche par mots-clés fonctionne toujours.","doctor.msg.embeddings.threw.fix":"Vérifiez que le fournisseur d'embeddings est joignable (p. ex. lancez `ollama serve`), ou retirez la config embedder pour une recherche par mots-clés seule.","doctor.msg.llm.unreachable.summary":"Le fournisseur d'IA ({provider}) n'a pas répondu : {detail}. Les fonctions IA ne font silencieusement rien.","doctor.msg.llm.unreachable.fix":"Vérifiez la API key et la connexion, puis relancez `memesh doctor --probe`.","doctor.msg.llm.threw.summary":"Le test du fournisseur d'IA ({provider}) a échoué : {detail}. Les fonctions IA ne font silencieusement rien.","doctor.msg.llm.threw.fix":"Vérifiez la API key et la connexion, puis relancez `memesh doctor --probe`.","doctor.msg.install-channel.unknown.summary":"Impossible de déterminer comment memesh a été installé.","doctor.msg.install-channel.unknown.fix":"S'il s'agit du code source, exécutez depuis la racine du dépôt ; sinon réinstallez avec `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"L'index de mots-clés contient {count} entrées dans un ancien format — certaines mémoires ne se trouvent qu'avec leur texte intégral exact.","doctor.msg.fts.unsegmented.fix":"Exécutez `memesh reindex --fts` pour reconstruire l'index.","doctor.msg.vector-index.stale.summary":"L'index de recherche doit être reconstruit (les réglages de recherche ont changé).","doctor.msg.vector-index.stale.fix":"Exécutez `memesh reindex` pour le reconstruire.","doctor.msg.vector-generation.open.summary":"Une reconstruction d'index inachevée occupe de l'espace disque.","doctor.msg.vector-generation.open.fix":"Lancez `memesh reindex` pour la terminer, ou `memesh reindex --discard-generation` pour libérer l'espace.","doctor.msg.database.broken.summary":"La base de données est inutilisable : {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"{used} utilisées / {total} injectées","analytics.loadFailed":"Impossible de charger les analyses.","memory.noContent":"(aucun contenu)","memory.archivedBadge":"archivée","memory.factsCount":"{count} faits","common.error":"Erreur","common.serverUnreachable":"Impossible de joindre le serveur memesh.","common.serverUnreachableAction":"Vérifiez que `memesh serve` tourne encore, puis rechargez cette page.","common.responseUnreadable":"Le serveur a répondu, mais cette page n'a pas pu lire la réponse — le tableau de bord et le serveur sont peut-être désynchronisés.","common.responseUnreadableAction":"Rechargez la page. Si cela persiste, exécutez `memesh doctor`.","pm.title":"Métriques PM","pm.decisionsPerWeek":"décisions/semaine","pm.openDecisions":"décisions ouvertes (>14 j)","pm.orphanRate":"Mémoires sans lien","pm.relationsTotal":"relations au total","pm.stalePlans":"{count} plan(s) non revu(s) depuis plus de 30 jours","common.loading":"Chargement…","common.noData":"Aucune donnée","errors.unknown":"Erreur inconnue","insights.noPreview":"Cette proposition n’a pas de texte de résumé","httpError.auth.missing-bearer":"Ce serveur exige un jeton d’accès. Saisissez votre jeton pour continuer.","httpError.auth.invalid-token":"Le jeton d’accès a été refusé. Vérifiez-le et réessayez.","httpError.auth.not-configured":"Aucun jeton d’accès n’est configuré sur le serveur. Redémarrez `memesh serve` et consultez sa sortie.","httpError.validation.bad-body":"Le serveur n’a pas pu lire la requête envoyée par la page. Rechargez la page et réessayez.","httpError.validation.bad-param":"Une partie de la requête n’est pas valide. Rechargez la page et réessayez.","httpError.route.retired":"Le serveur ne prend plus en charge cette action — la page et le serveur sont peut-être de versions différentes. Rechargez la page.","httpError.route.not-found":"Le serveur ne reconnaît pas cette requête — la page et le serveur sont peut-être de versions différentes. Rechargez la page.","httpError.resource.not-found":"Cet élément n’existe plus. Actualisez la liste.","httpError.payload.too-large":"Les données envoyées sont trop volumineuses (plus de 1 Mo). Essayez par lots plus petits.","httpError.operation.failed":"Le serveur n’a pas pu terminer cette action.","httpError.llm.not-configured":"Aucun fournisseur d’IA n’est configuré. Ajoutez-en un dans les Réglages.","httpError.rate.limited":"Trop de requêtes en peu de temps. Patientez un instant et réessayez.","httpError.server.internal":"Le serveur a rencontré une erreur inattendue.","settings.testError.auth":"La clé API a été refusée. Vérifiez la clé et réessayez.","settings.testError.network":"Impossible de joindre le fournisseur. Vérifiez votre connexion réseau.","settings.testError.no_models":"Le fournisseur a répondu mais n’a renvoyé aucun modèle utilisable.","settings.testError.bad_host":"L’adresse d’Ollama doit être sur cette machine (localhost).","settings.testError.http":"Le fournisseur a renvoyé une erreur (HTTP {status}).","settings.testError.unknown":"Le test a échoué pour une raison inconnue.","time.justNow":"À l'instant","time.hoursAgo":"Il y a {count}h","time.today":"Aujourd'hui","time.yesterday":"Hier","time.daysAgo":"Il y a {count}j","time.lastWeek":"Semaine dernière","time.weeksAgo":"Il y a {count}sem","time.lastMonth":"Mois dernier","time.monthsAgo":"Il y a {count}mo","memory.access.frequent":"Fréquent · {count} rappels","memory.access.recalls":"{count} rappels","memory.access.never":"Jamais rappelé","cluster.knowledge":"Connaissance","cluster.activity":"Activité","cluster.session":"Sessions","cluster.reference":"Référence","cluster.all":"Tout","browse.filterTime":"Temps","browse.filterValue":"Valeur","browse.filterProject":"Projet","browse.filterSort":"Trier","browse.timeToday":"Aujourd'hui","browse.timeWeek":"Cette semaine","browse.timeMonth":"Ce mois-ci","browse.timeOlder":"Plus ancien","browse.valueRecalled":"✓ Utilisé","browse.valueNever":"Jamais rappelé","browse.sortMostRecalled":"Plus rappelé","browse.sortRecent":"Récent","browse.sortCreated":"Créé","browse.emptyFilter":"Aucune mémoire dans cette catégorie — essayez un autre filtre","lessons.stepsLabel":"étapes","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Pas de champs structurés — voir mémoire brute)","lessons.moreItems":"+{count} de plus","roadmap.title":"Feuille de Route","roadmap.summary":"{count} mémoires · {first} → {last}","roadmap.switchToList":"↩ Vue Liste","roadmap.switchToRoadmap":"🗺️ Vue Roadmap","roadmap.emptyProject":"Aucune mémoire dans ce projet pour l'instant.","loop.label":"Boucle mémoire","loop.subtitleHas":"mémoires de connaissances rappelées ces 7 derniers jours","loop.subtitleNone":"Aucune mémoire rappelée cette semaine","loop.approxNote":"Approximation — suivi complet à partir de la mise à jour.","loop.sparkLabel":"30 derniers jours","roadmap.milestones":"Jalons","roadmap.keyLessons":"Leçons clés","radar.title":"Radar de couverture","radar.caption":"Mémoires actives (session et commit exclus)","radar.axis.lessons":"Leçons","radar.axis.decisions":"Décisions","radar.axis.patterns":"Patterns","radar.axis.bugs":"Bugs corrigés","radar.axis.processes":"Processus","radar.axis.architecture":"Architecture","ageMatrix.title":"Distribution par âge","ageMatrix.low":"Faible","ageMatrix.high":"Élevé","ageMatrix.legend":"profondeur = densité","ageMatrix.typeColumn":"Type","header.signalModeOn":"Signal","header.signalModeOff":"Tout","header.signalModeOnHint":"Masque le bruit session/commit. Cliquez pour tout afficher.","header.signalModeOffHint":"Affiche toutes les mémoires y compris le bruit. Cliquez pour masquer.","roadmap.phases":"Phases","onboarding.title":"Bienvenue dans MeMesh","onboarding.body":"Votre mémoire est vide. Commencez par une visite de 30 entités ou enregistrez votre première leçon.","onboarding.llmHint":"Aucun LLM requis. Tout fonctionne avec FTS5 seul. Un LLM est facultatif pour la génération automatique de leçons — configurez-le plus tard dans Paramètres.","onboarding.seedButton":"Lancer la visite démo","onboarding.seedingButton":"Chargement…","onboarding.seedHint":"Ajoute 30 mémoires ici même — pas besoin de terminal","onboarding.cliReference":"Vous préférez la CLI ?","onboarding.hintDemo":"Sème 30 mémoires de démonstration (effaçables plus tard)","onboarding.hintReset":"Supprime tout ce qui est marqué metadata.demo","onboarding.resetButton":"Réinitialiser la démo","onboarding.resettingButton":"Suppression…","onboarding.resetConfirm":"Supprimer toutes les mémoires de démo ? Vos entrées personnelles seront conservées.","onboarding.dismiss":"Fermer","common.serverError":"Le serveur a renvoyé une erreur (HTTP {status}). Réessayez — si cela persiste, exécutez `memesh doctor`.","emptyLibrary.title":"Votre mémoire est vide","emptyLibrary.body":"Rien n’est encore enregistré. Chargez la visite de démonstration (30 entrées) pour voir MeMesh en action — supprimable ensuite en un clic.","browse.truncated":"affichage des {shown} premières mémoires sur {total} — utilisez la recherche ou les filtres pour atteindre le reste","browse.truncatedUnknownTotal":"affichage des {shown} premières mémoires — le total est indisponible, il y en a peut-être d’autres","graph.cappedNote":"Affichage des {shown} entités les plus rappelées sur {total} pour garder le graphe fluide.","settings.testStoredKeyHint":"Laissez le champ vide pour tester la clé déjà enregistrée.","ageMatrix.bucket.week":"Cette semaine","ageMatrix.bucket.month":"Ce mois","ageMatrix.bucket.quarter":"Ce trimestre","ageMatrix.bucket.older":"Plus ancien","settings.behaviourTitle":"Comportement","settings.autoUpdateLabel":"Politique de mise à jour auto","settings.autoUpdateOff":"Désactivé — manuel uniquement","settings.autoUpdatePatch":"Patch — applique X.Y.Z+1","settings.autoUpdateMinor":"Minor — applique X.Y+1.0","settings.autoUpdateMajor":"Major — applique toute mise à jour","settings.autoUpdateHint":"Déclenché à la fin de chaque session. MEMESH_AUTO_UPDATE a priorité.","errors.timeout":"La requête a expiré","type.lesson_learned":"Leçon","type.lesson":"Leçon","type.mistake":"Erreur","type.decision":"Décision","type.architecture_decision":"Décision arch.","type.design_decision":"Décision de design","type.pattern":"Pattern","type.technical_pattern":"Pattern tech.","type.best_practice":"Bonne pratique","type.bug_fix":"Correction","type.verification_result":"Vérification","type.test_result":"Résultat de test","type.process":"Processus","type.architecture":"Architecture","type.infrastructure":"Infrastructure","type.feature":"Fonctionnalité","type.release":"Release","type.refactoring":"Refactoring","type.commit":"Commit","type.session_keypoint":"Point de session","type.session_identity":"Identité de session","type.session-insight":"Insight de session","type.session-summary":"Résumé de session","type.session-identity":"Identité de session","type.weekly_summary":"Résumé hebdo","type.weekly-summary":"Résumé hebdo","type.note":"Note","type.plan":"Plan","type.knowledge":"Connaissance","type.workflow_checkpoint":"Jalon","type.concept":"Concept","type.tool":"Outil","type.person":"Personne","relation.relates_to":"lié à","relation.related-to":"lié à","relation.depends_on":"dépend de","relation.implements":"implémente","relation.learned_from":"appris de","relation.supersedes":"remplace","relation.contradicts":"contredit","relation.follows":"suit","relation.belongs-to-project":"appartient au projet","relation.evidences":"étaye","relation.co-created":"co-créé","relation.shares-name-tokens":"noms similaires","patterns.day.0":"dimanche","patterns.day.1":"lundi","patterns.day.2":"mardi","patterns.day.3":"mercredi","patterns.day.4":"jeudi","patterns.day.5":"vendredi","patterns.day.6":"samedi","telemetry.flow.dreamer":"Récap hebdo (dreamer)","telemetry.flow.pattern_detector":"Détecteur de patterns","telemetry.flow.digest_validator":"Validateur de digest","telemetry.flow.guard_proposer":"Proposeur de gardes","telemetry.flow.auto_tagger":"Auto-tagger","telemetry.flow.failure_analyzer":"Analyseur d'échecs","telemetry.flow.transcript_extractor":"Extracteur de transcriptions","telemetry.flow.conflict_judge":"Juge de conflits","telemetry.errorClass.auth":"authentification refusée","telemetry.errorClass.rate_limit":"limite de débit","telemetry.errorClass.upstream":"panne du fournisseur","telemetry.errorClass.bad_request":"requête invalide","telemetry.errorClass.network":"réseau","telemetry.errorClass.parse":"réponse illisible","telemetry.errorClass.unknown":"inconnu","lessons.severity.critical":"Critique","lessons.severity.major":"Majeur","lessons.severity.minor":"Mineur","memory.tooltip.project":"Projet","memory.tooltip.recalled":"Rappelé {count} fois","memory.tooltip.hasRelations":"Lié à {count} autres mémoires","memory.tooltip.createdAt":"Créé le {date}","graph.layerLabel":"Couche du graphe","graph.layerWork":"Travail","graph.layerAll":"Tout","graph.layerWorkHint":"Décisions, leçons et plans — le travail lui-même.","graph.layerAllHint":"Toutes les mémoires enregistrées par memesh, y compris la capture automatique.","graph.layerFellBack":"Moins de {min} éléments de travail pour l'instant : le graphe complet est affiché à la place. Enregistrez des décisions et des leçons et cette vue se remplira.","graph.evidenceFor":"Preuves pour {node}","graph.evidenceClose":"Fermer","graph.evidenceLoading":"Chargement des preuves…","graph.evidenceFailed":"Impossible de charger les preuves de cet élément.","graph.evidenceEmpty":"Aucune preuve liée à cet élément pour le moment. Lancez `memesh kg backfill` pour créer ces liens à partir des commits et des captures de session.","graph.evidenceTruncated":"Affichage des {shown} plus récentes ; il y en a d'autres.","graph.drift":"Fraîcheur","graph.driftHint":"Colore les nœuds selon l'âge : rouge = ancien, vert = utilisé récemment","common.unknown":"inconnu","insights.entitiesCount":"{n} entités","roadmap.viewToggle":"Vue de la feuille de route","roadmap.viewTree":"Arbre","roadmap.viewMindmap":"Carte mentale","roadmap.mindmapNeedsPhases":"La carte mentale nécessite au moins 3 mémoires sur une fenêtre de 7 jours.","roadmap.activePhase":"active","roadmap.entryCount":"{count} entrée","roadmap.entriesCount":"{count} entrées","roadmap.otherGroup":"Autres ({count})","roadmap.lowSignalHidden":"({count} à signal faible masquées)","roadmap.resetHint":"Réinitialiser zoom et position (double-clic sur le fond aussi)","roadmap.zoomHint":"molette pour zoomer · glisser pour déplacer · {pct}%","roadmap.moreEntities":"+{count} de plus","roadmap.viewDecisions":"Décisions","roadmap.densityTitle":"Densité de capture par catégorie","roadmap.densityNote":"ce que memesh a capturé — pas tout ce qui s'est passé","roadmap.lineageSupersedes":"{n} remplacées","roadmap.lineageConflicts":"{n} conflits non résolus","adr.empty":"Aucune décision enregistrée pour ce projet pour le moment. Enregistrez-en une avec le type « decision » et elle apparaît ici avec son historique.","adr.statusActive":"active","adr.statusSuperseded":"remplacée","adr.supersedes":"remplace","adr.supersededBy":"remplacée par","nav.ariaLabel":"Sections du tableau de bord","feedback.descLabel":"Description du retour","graph.canvasA11y":"Graphe de connaissances (canvas) : {entities} entités, {relations} relations, {orphans} sans lien. Utilisez les filtres de type et la recherche ci-dessus pour une vue non visuelle."},de:{"auth.title":"Authentifizierung erforderlich","auth.intro":"Dieses Dashboard ist durch ein Bearer-Token geschützt. Fügen Sie unten den Wert von MEMESH_REMOTE_TOKEN (oder den Inhalt von <memeshDir>/remote-token) ein.","auth.tokenLabel":"Token","auth.empty":"Token darf nicht leer sein.","auth.invalid":"Dieses Token wurde nicht akzeptiert. Bitte prüfen und erneut versuchen.","auth.submit":"Dashboard entsperren","auth.tokenPlaceholder":"Token hier einfügen","brand.subtitle":"powered by pcircle.com","header.connected":"Verbunden","header.disconnected":"Getrennt","header.connecting":"Verbinden…","header.memories":"Erinnerungen","telemetry.title":"LLM-Aktivität","telemetry.lastNDays":"letzte {n} Tage","telemetry.loading":"lädt…","telemetry.empty":"In diesem Zeitraum noch keine KI-Aktivität. Einträge erscheinen automatisch, sobald die KI-Funktionen im Hintergrund (z. B. Wochenzusammenfassungen, automatisches Tagging) laufen.","telemetry.callsCount":"{n} Aufrufe","telemetry.attemptsCount":"{n} Versuche","telemetry.successRate":"Erfolg","telemetry.medianLatency":"mediane Latenz","telemetry.fallbackUsed":"Fallback {n}× verwendet ({pct} der Aufrufe)","telemetry.byProvider":"nach Provider","telemetry.byModel":"nach Modell","telemetry.byProject":"nach Projekt","telemetry.errors":"Fehler","insights.title":"Was memesh für dich getan hat","insights.subtitle":"automatisch generierte weekly recaps und erkannte patterns – warten auf Review","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"Alle","insights.refresh":"Aktualisieren","insights.loading":"lädt…","insights.emptyPending":"Keine pending Insights. Führe `memesh dream run` aus, um einen weekly recap zu erzeugen.","insights.emptyNoLlm":"Konfiguriere einen LLM-Provider in den Einstellungen, um weekly recaps und Pattern-Erkennung zu aktivieren.","insights.emptyOther":"Nichts hier.","insights.sources":"Quellen","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"Details anzeigen","insights.collapse":"Einklappen","insights.accept":"Übernehmen","insights.applying":"Wird angewendet…","insights.reject":"Ablehnen","insights.generatedBy":"Erzeugt von","insights.promptVersion":"Prompt-Version","insights.observations":"Zusammenfassende Beobachtungen","insights.tags":"Tags","insights.sourceIds":"Quell-Entities","insights.validationWarnings":"Markierte Aussagen (LLM-validator)","insights.validationClaim":"Aussage","insights.validationReason":"Grund","insights.runDream":"Weekly recap ausführen","insights.runDreamWithValidate":"Mit validator ausführen (langsamer, höhere Qualität)","banner.pendingInsights":"{n} neue(r) Insight(s) wartet auf dein Review →","banner.dismiss":"Schließen","banner.viewAll":"Alle anzeigen","pattern.title":"Pattern","pattern.evidenceCount":"{n} Belege","pattern.severity":"Schweregrad","pattern.severity.high":"hoch","pattern.severity.medium":"mittel","pattern.severity.low":"niedrig","pattern.description":"Pattern-Beschreibung","tab.graph":"Graph","tab.settings":"Einstellungen","tab.home":"Start","tab.memories":"Erinnerungen","tab.project":"Projekt","memories.searchPlaceholder":"Beim Tippen filtern — Enter für Suche nach Relevanz","memories.scopeLabel":"Bereich","memories.scopeWork":"Arbeitsebene","memories.scopeEvidence":"Belege","memories.scopeAll":"Alle","memories.scopeArchived":"Archiviert","memories.composition":"Zusammensetzung","memories.rankedBy":"nach Relevanz sortiert","memories.backToList":"Zurück zur Liste","memories.workEmpty":"Noch keine Erinnerungen der Arbeitsebene — Ziele, Entscheidungen, Lektionen und Pläne landen hier, sobald sie erfasst werden.","memories.showAll":"Alle Erinnerungen anzeigen","memories.expand":"Details anzeigen","memories.collapse":"Details ausblenden","home.analyticsTitle":"Analyse","home.analyticsHint":"Gesundheit, Zeitleiste, Patterns und Nutzung — klappt bei Bedarf aus","project.selectLabel":"Projekt","project.selectPrompt":"Wähle ein Projekt, um seine Historie zu sehen.","project.empty":"Noch keine Projekt-Erinnerungen. Arbeite in einem git-Repository mit installierten memesh-Hooks und seine Geschichte erscheint hier.","guard.sourceLesson":"Quell-Lektion","guard.pattern":"Auslösemuster","guard.message":"Angezeigte Warnung","guard.shouldMatch":"Muss auslösen bei","guard.shouldNotMatch":"Muss stumm bleiben bei","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.active":"aktiv","browse.archived":"archiviert","browse.refresh":"Aktualisieren","browse.noMatch":"Keine passenden Erinnerungen:","browse.prev":"← Zurück","browse.next":"Weiter →","browse.archive":"Archivieren","browse.restore":"Wiederherstellen","browse.confirmArchive":"Diese Erinnerung archivieren?","browse.archiveFailed":"Speicher konnte nicht archiviert werden: {message}","browse.restoreFailed":"Speicher konnte nicht wiederhergestellt werden: {message}","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","metrics.notMeasured":"Noch nicht gemessen","metrics.health":"Gesundheit","metrics.healthNote":"Aktivität, Qualität, Frische, Lehren","metrics.critical":"Kritische Lehren","metrics.criticalPartial":"von {tagged} eingestuften · {total} Lehren insgesamt","metrics.criticalAll":"von {total} Lehren, alle eingestuft","metrics.criticalUnclassified":"{total} Lehren, keine nach Schweregrad eingestuft","metrics.criticalNoLessons":"Noch keine Lehren erfasst","metrics.citation":"Zitate","metrics.citationNote":"{cited} von {total} Sitzungen zitierten eine Erinnerung","metrics.citationNotMeasured":"Die Zitat-Erfassung beginnt mit der nächsten Sitzung","metrics.reused":"Diese Woche genutzt","metrics.reusedNote":"Näherungswert — aus den letzten Zugriffszeiten","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.entityMeta":"{type} · Konfidenz {confidence}% · {days} Tage ungenutzt","settings.capabilities":"Fähigkeiten","settings.smartMode":"Smart-Modus","settings.core":"Basis","settings.embeddings":"Embeddings","settings.llmProvider":"LLM-Anbieter","settings.llmOptional.title":"LLM ist optional","settings.llmOptional.body":"memesh funktioniert ohne LLM. Der Standard-Core-Modus bietet Volltextsuche, manuelles remember/recall, Dashboard und Session-Erfassung über Hooks.","settings.llmOptional.coreLabel":"Ohne LLM (Core-Modus)","settings.llmOptional.coreFeatures":"FTS5-Stichwortsuche, manuelles remember/recall, Dashboard, Session-Erfassung via Hooks","settings.llmOptional.smartLabel":"Mit LLM (Smart-Modus)","settings.llmOptional.smartFeatures":"automatische lesson_learned aus Session-Fehlern, Auto-Tagging neuer Entitäten, Wochen-Recap + Mustererkennung","settings.apiKey":"API-Schlüssel","settings.fallbacks.title":"Fallback-Anbieter","settings.fallbacks.explainer":"Wenn Ihr Hauptanbieter nicht verfügbar ist, versucht memesh diese der Reihe nach, bis einer funktioniert.","settings.fallbacks.privacyTitle":"Datenschutzhinweis","settings.fallbacks.privacyBody":"Das Hinzufügen eines Cloud-Anbieters (OpenAI oder Anthropic) bedeutet, dass bei einem Ausfall Ihres Hauptanbieters Ihre Speicherinhalte — die privat sein können — an diesen Cloud-Anbieter gesendet werden. Wenn Sie aus Datenschutzgründen einen lokalen Anbieter nutzen, fügen Sie einen Cloud-Fallback nur hinzu, wenn Sie diesen Kompromiss akzeptieren.","settings.fallbacks.empty":"Noch keine Fallback-Anbieter.","settings.fallbacks.add":"Fallback-Anbieter hinzufügen","settings.fallbacks.providerLabel":"Anbieter","settings.fallbacks.modelLabel":"Modell (optional)","settings.fallbacks.modelPlaceholder":"z. B. gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"Ein Schlüssel ist gespeichert. Leer lassen, um ihn zu behalten.","settings.fallbacks.remove":"Entfernen","settings.fallbacks.moveUp":"Nach oben","settings.fallbacks.moveDown":"Nach unten","settings.fallbacks.priority":"Priorität {n}","settings.fallbacks.save":"Fallback-Kette speichern","settings.fallbacks.needsKey":"Geben Sie einen API-Schlüssel ein, sonst kann dieser Cloud-Fallback nicht verwendet werden.","settings.model":"Modell (optional)","settings.save":"Speichern","settings.saving":"Speichern…","settings.saved":"Gespeichert.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Testen","settings.testing":"Teste…","settings.testPassed":"✓ Verbindung OK · {count} Modelle verfügbar","settings.testFailed":"Verbindungstest fehlgeschlagen","settings.suggested":"empfohlen","settings.testRequired":"Bitte Verbindung vor dem Speichern testen","settings.language":"Sprache","settings.searchMode":"Suchmodus","settings.none":"Keine","settings.updates":"Updates","settings.updateChecking":"Suche nach Updates…","settings.updateUnavailable":"Updates können gerade nicht geprüft werden","settings.updateNoSuccessfulChecks":"Es gibt noch keine erfolgreiche Update-Prüfung","settings.upToDate":"Auf dem neuesten Stand","settings.updateAvailable":"Update verfügbar","settings.updateStale":"Der angezeigte Cache-Status ist möglicherweise veraltet","settings.updateCachedFallback":"Es wird das zuletzt erfolgreich gecachte Ergebnis verwendet","settings.updateDeprecatedNoTarget":"Veraltet — noch kein Upgrade-Ziel verfügbar","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} wurde von den Maintainern als VERALTET markiert.","settings.updatePartialTitle":"⚠️ Update-Prüfung unvollständig","settings.updatePartialDescription":"{message}. Veraltungsstatus ist in dieser Sitzung unbekannt — Prüfung online erneut ausführen.","settings.updatePartialSummary":"Teilweise — Veraltungsstatus unbekannt","settings.updateDeprecatedTargetUnknown":"Veraltet — Upgrade-Ziel wird ermittelt","settings.currentVersion":"Aktuelle Version","settings.latestVersion":"Neueste Version","settings.lastChecked":"Zuletzt geprüft","settings.lastAttempted":"Letzter Prüfversuch","settings.lastSuccessful":"Letzte erfolgreiche Prüfung","settings.updateSourceFresh":"Frische Prüfung","settings.updateSourceCached":"Zwischengespeichertes Ergebnis","settings.updateSourceStale":"Veraltetes Cache-Ergebnis","settings.updateSourceUnavailable":"Kein Cache-Ergebnis","settings.updateCommand":"Update-Befehl","settings.checkNow":"Jetzt prüfen","settings.updateLastError":"Fehler bei der letzten Prüfung: {message}","settings.installMethod":"Installationsart","settings.installNpmGlobal":"globale npm-Installation","settings.installNpmLocal":"projektlokale Paketinstallation","settings.installSourceCheckout":"Source-Checkout","settings.installUnknown":"unbekannt","settings.updateGuidanceNpmGlobal":"Diese Installation kann direkt aus MeMesh heraus aktualisiert werden.","settings.updateGuidanceNpmLocal":"Aktualisiere diese Installation über den Paketmanager des Projekts, das MeMesh installiert hat.","settings.updateGuidanceSourceCheckout":"Aktualisiere diesen Source-Checkout aus dem Repository und baue ihn neu.","settings.updateGuidanceUnknown":"Aktualisiere diese Installation mit dem Tool oder Ablauf, der MeMesh installiert hat.","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","graph.interactHint":"Knoten anklicken für Fokus · leere Fläche ziehen zum Schwenken · scrollen zum Zoomen","graph.resetView":"Ansicht zurücksetzen","graph.resetViewHint":"Zoom und Position zurücksetzen","graph.ageToday":"heute","graph.ageDaysAgo":"vor {count} Tagen","graph.ageWeeksAgo":"vor {count} Wochen","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","feedback.submitting":"Diagnose wird erfasst…","doctorBanner.warnTitleSoft":"memesh hat Einrichtungshinweise","doctorBanner.failTitle":"memesh-Einrichtung ist unvollständig","doctorBanner.dismiss":"Schließen","doctorBanner.getHelp":"Hilfe bekommen","doctorBanner.helpHint":"Öffnet ein GitHub Issue mit vorausgefülltem Diagnosebericht","doctorBanner.preambleForIssue":"memesh doctor hat in meiner Installation Folgendes gemeldet:","doctorBanner.moreCount":"…und {n} weitere — führen Sie `memesh doctor` für die vollständige Liste aus","doctor.label.readme_locale_parity":"README-Übersetzungen","doctor.label.config":"Konfigurationsdatei","doctor.label.mcp-config":"MCP-Verbindungsdatei","doctor.label.hooks-config":"Hook-Definitionen","doctor.label.hook-scripts":"Hook-Skripte","doctor.label.hook-wiring":"Verbindung zu Claude Code","doctor.label.hook-activity":"Automatische Erfassung","doctor.label.node-runtime":"Node.js-Version","doctor.label.native-binding":"SQLite und Vektorsuche","doctor.label.shell-cli":"Terminal-Befehl","doctor.label.dashboard":"Dashboard-Dateien","doctor.label.update-status":"Updates","doctor.label.http-probe":"Lokaler Server","doctor.label.skills-manifest":"Mitgelieferte Dateien","doctor.label.config_parse":"Konfigurationsdatei","doctor.label.embeddings_probe":"Bedeutungsbasierte Suche","doctor.label.llm_probe":"KI-Anbieter","doctor.label.install-channel":"Installationsart","doctor.label.fts_segmentation":"Stichwort-Index","doctor.label.vector_index":"Suchindex","doctor.label.database":"Datenbank","doctor.msg.readme-parity.unreadable.summary":"README.md konnte nicht gelesen werden: {detail}","doctor.msg.readme-parity.drift.summary":"Einige übersetzte READMEs sind nicht mehr auf dem Stand der englischen Version: {detail}","doctor.msg.readme-parity.drift.fix":"Gleichen Sie die aufgelisteten READMEs wieder mit README.md ab.","doctor.msg.config.invalid-json.summary":"Die Konfigurationsdatei unter {path} ist kein gültiges JSON und wird deshalb ignoriert.","doctor.msg.config.invalid-json.fix":"Reparieren oder löschen Sie {path} und prüfen Sie mit `memesh config list`, ob sie geladen wird.","doctor.msg.mcp-config.missing.summary":"Die Datei, die memesh mit Claude Code verbindet (.mcp.json), fehlt.","doctor.msg.mcp-config.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json ist beschädigt (kein gültiges JSON), Claude Code kann sie deshalb nicht lesen.","doctor.msg.mcp-config.invalid-json.fix":"Reparieren Sie {path} oder installieren Sie MeMesh neu.","doctor.msg.mcp-config.no-entry.summary":".mcp.json enthält den memesh-Servereintrag nicht mehr.","doctor.msg.mcp-config.no-entry.fix":"Installieren Sie MeMesh neu, um ihn wiederherzustellen.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` startet eine Datei, die in dieser Installation fehlt — daher startet kein memesh-Werkzeug in Claude Code.","doctor.msg.mcp-config.entry-missing.fix":"Installieren Sie MeMesh neu. Wenn Sie `.mcp.json` von Hand geändert haben, richten Sie es wieder auf `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js` aus.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json fehlt, die automatische Erinnerungs-Erfassung kann deshalb nicht laufen.","doctor.msg.hooks-config.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json ist beschädigt (kein gültiges JSON).","doctor.msg.hooks-config.invalid-json.fix":"Reparieren Sie {path} oder installieren Sie MeMesh neu.","doctor.msg.hooks-config.missing-types.summary":"In hooks/hooks.json fehlen diese Hook-Typen: {types}. Ein Teil der automatischen Erfassung läuft nicht.","doctor.msg.hooks-config.missing-types.fix":"Stellen Sie die mitgelieferte Hook-Konfiguration wieder her oder installieren Sie MeMesh neu.","doctor.msg.hook-scripts.none.summary":"Die Hook-Konfiguration enthält keine Skripte, es kann also nichts automatisch erfasst werden.","doctor.msg.hook-scripts.none.fix":"Installieren Sie MeMesh neu.","doctor.msg.hook-scripts.missing.summary":"Diese Hook-Skripte fehlen: {files}","doctor.msg.hook-scripts.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.hook-scripts.not-executable.summary":"Diese Hook-Skripte existieren, dürfen aber nicht ausgeführt werden: {files}","doctor.msg.hook-scripts.not-executable.fix":"Führen Sie `chmod +x scripts/hooks/*.js` aus, oder `npm run build` in einem Quellcode-Checkout.","doctor.msg.hook-wiring.no-marker.summary":"memesh ist noch nicht mit Claude Code verbunden, es wird also nichts automatisch gemerkt.","doctor.msg.hook-wiring.no-marker.fix":"Führen Sie einmal `memesh install-hooks` aus, danach `memesh doctor` zur Kontrolle.","doctor.msg.hook-wiring.script-missing.summary":"Ein verdrahteter memesh-Hook zeigt auf {path}, das nicht mehr existiert — der Agent ruft bei jedem passenden Ereignis eine fehlende Datei auf. Meist ein Rückstand eines Upgrades, das den Hook stillgelegt hat.","doctor.msg.hook-wiring.script-missing.fix":"Führen Sie `memesh install-hooks` aus (stillgelegte Einträge werden entfernt) und starten Sie den Agenten neu.","doctor.msg.hook-wiring.marker-unreadable.summary":"Der Verbindungsvermerk unter {path} kann nicht gelesen werden.","doctor.msg.hook-wiring.marker-unreadable.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.marker-malformed.summary":"Der Verbindungsvermerk ist beschädigt.","doctor.msg.hook-wiring.marker-malformed.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.settings-missing.summary":"Die Claude-Code-Einstellungsdatei ({path}) ist weg, die Verbindung ist deshalb unterbrochen.","doctor.msg.hook-wiring.settings-missing.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} ist beschädigt (kein gültiges JSON).","doctor.msg.hook-wiring.settings-invalid.fix":"Stellen Sie die Datei aus einem Backup wieder her, oder führen Sie `memesh install-hooks` aus, um sie neu anzulegen.","doctor.msg.hook-wiring.entries-removed.summary":"Die memesh-Einträge wurden aus {path} entfernt, die Verbindung ist deshalb unterbrochen.","doctor.msg.hook-wiring.entries-removed.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.root-moved.summary":"Die Verbindung zeigt auf {path}, das es nicht mehr gibt (memesh wurde vermutlich verschoben).","doctor.msg.hook-wiring.root-moved.fix":"Führen Sie `memesh install-hooks` aus, um sie zu aktualisieren.","doctor.msg.hook-activity.never-ran.summary":"Seit Beginn der Aufzeichnung vor {hours} Stunden wurde kein Capture-Hook ausgeführt, obwohl die Hook-Verdrahtung vorhanden ist — nichts wird gespeichert.","doctor.msg.hook-activity.never-ran.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus. Steht dort weiterhin, dass kein Hook lief, führen Sie `memesh install-hooks` aus und starten Sie den Agenten neu.","doctor.msg.hook-activity.stale.summary":"Der letzte Capture-Hook lief vor etwa {hours} Stunden ({hook}). Wenn Sie seitdem gearbeitet haben, ist die Erfassung gestoppt und nichts aus diesen Sitzungen wurde gespeichert.","doctor.msg.hook-activity.stale.fix":"Starten Sie den Agenten neu, beenden Sie eine Sitzung und führen Sie `memesh doctor` erneut aus. Erholt es sich nicht, führen Sie `memesh install-hooks` aus.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Der session-summary-Hook lief zuletzt vor etwa {hours} Stunden, und in den letzten 3 Tagen kamen auch keine Claude-Code-Schreibvorgänge an. Ist diese Maschine zu einem anderen Agenten (Codex / Gemini) gewechselt, ist das erwartet; nutzen Sie hier noch Claude Code, ist die Erfassung gestoppt.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Wenn Sie auf dieser Maschine noch Claude Code nutzen: neu starten, eine Sitzung beenden und `memesh doctor` erneut ausführen. Erholt es sich nicht, führen Sie `memesh install-hooks` aus.","doctor.msg.hook-activity.query-failed.summary":"Die Hook-Aktivität konnte nicht aus der Datenbank gelesen werden: {detail}. Der Zustand der Erfassung ist unbekannt, und das ist nicht dasselbe wie gesund.","doctor.msg.hook-activity.query-failed.fix":"Führen Sie `memesh doctor --verbose` für den vollständigen Fehler aus und prüfen Sie, ob ~/.memesh lesbar und die Festplatte nicht voll ist.","doctor.msg.hook-activity.stale-unknown.summary":'Der Zeitstempel des letzten Laufs des {hook}-Hooks ist unlesbar (beschädigt, oder von einer Maschine mit falscher Uhr geschrieben). Der Capture-Zustand ist „unbekannt", und das ist nicht dasselbe wie „gesund".',"doctor.msg.hook-activity.stale-unknown.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus — ein frischer Lauf überschreibt den defekten Zeitstempel.","doctor.msg.hook-activity.disabled.summary":"Die automatische Erfassung ist ausgeschaltet (MEMESH_AUTO_CAPTURE oder autoCapture in der Konfiguration) — absichtlich, daher ist die Stille der Hooks zu erwarten. Zum Fortsetzen wieder einschalten.","doctor.msg.hook-activity.disabled-env.summary":"Die automatische Erfassung ist durch MEMESH_AUTO_CAPTURE=false in der Umgebung dieser Shell ausgeschaltet. doctor sieht nur seine eigene Umgebung — läuft Ihr Agent ohne diese Variable, ist die Erfassung dort nicht betroffen.","doctor.msg.hook-activity.not-wired.summary":"Es ist noch nie ein Capture-Hook gelaufen — und auf dieser Maschine ist kein Capture-Hook (Stop / PostToolUse / PreCompact) nachweislich verdrahtet, es gibt also nichts auszuführen.","doctor.msg.hook-activity.not-wired.fix":"Für automatische Erfassung führen Sie `memesh install-hooks` aus. Bei einer reinen MCP-Installation (Codex / Gemini) ist das erwartet und kann ignoriert werden.","doctor.msg.hook-activity.stop-silent.summary":"Der {hook}-Hook stempelt, aber der session-summary-Hook ist in den {hours} Stunden seit Beginn der Aufzeichnung kein einziges Mal gelaufen — die Sitzungserfassung ist womöglich kaputt, verdeckt durch die Commit-Erfassung.","doctor.msg.hook-activity.stop-silent.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus. Läuft session-summary dann immer noch nicht, führen Sie `memesh install-hooks` aus und starten Sie den Agenten neu.","doctor.msg.hook-activity.never-ran-legacy.summary":"Kein Hook hat den Heartbeat gestempelt, aber seit Beginn der Aufzeichnung sind {captured} automatisch erfasste Erinnerungen angekommen — Hooks aus einer Version vor dem Heartbeat-Tracking laufen wahrscheinlich noch.","doctor.msg.hook-activity.never-ran-legacy.fix":"Aktualisieren Sie die memesh-Hooks auf die aktuelle Version (Plugin: `/plugin update memesh`; npm: `memesh install-hooks`) und starten Sie den Agenten neu.","doctor.msg.node-runtime.too-old.summary":"Ihr Node.js ist älter, als dieses Paket unterstützt. {detail}","doctor.msg.node-runtime.too-old.fix":"Aktualisieren Sie Node.js auf {required} oder neuer und führen Sie `memesh doctor` erneut aus.","doctor.msg.native-binding.node-too-old.summary":"Das in dieser Node-Version eingebaute SQLite ist zu alt für memesh — es kann den Teil für die Suche nach Bedeutung nicht laden. Die vollständige Fassung kam mit Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Aktualisieren Sie Node auf 22.13 oder neuer und führen Sie `memesh doctor` erneut aus.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec ist nicht installiert. Erinnerungen werden weiterhin gespeichert und über Stichwörter gefunden — nur die Suche nach Bedeutung ist aus.","doctor.msg.native-binding.not-installed.fix":"Führen Sie `npm install` in dem Ordner aus, der @pcircle/memesh verwendet.","doctor.msg.native-binding.load-failed.summary":"sqlite-vec konnte nicht geladen werden: {detail}. Die Suche nutzt nur noch Stichwörter.","doctor.msg.native-binding.load-failed.fix":'Ausführen: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"Der Befehl `memesh` ist in Ihrem Terminal nicht verfügbar. Die Claude-Code-Funktionen laufen weiter — es betrifft nur das eigene Eintippen von `memesh`.","doctor.msg.shell-cli.not-on-path.fix":"Führen Sie `npm install -g @pcircle/memesh` aus, um ihn hinzuzufügen. Beide Installationen teilen sich dieselben Erinnerungen.","doctor.msg.dashboard.missing.summary":"Die Dashboard-Dateien fehlen.","doctor.msg.dashboard.missing.fix":"Erzeugen Sie sie mit `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"memesh konnte noch nicht prüfen, ob es neuere Versionen gibt.","doctor.msg.update-status.no-cache.fix":"Führen Sie einmal online `memesh status` aus — das Ergebnis wird gespeichert und dieser Hinweis verschwindet.","doctor.msg.update-status.deprecated.summary":"Version {version} wurde von ihren Betreuern zurückgezogen: {detail}","doctor.msg.update-status.deprecated.fix":"Aktualisieren Sie jetzt — führen Sie `memesh update` aus (oder folgen Sie Ihrer Installationsart).","doctor.msg.update-status.deprecation-unknown.summary":"Es ließ sich nicht bestätigen, ob Version {version} noch sicher ist: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Führen Sie online `memesh status` aus, um es erneut zu versuchen.","doctor.msg.update-status.update-available.summary":"Eine neuere Version ist verfügbar: {latest} (Sie haben {current}).","doctor.msg.update-status.update-available.fix":"Führen Sie `memesh update` aus, um zu aktualisieren.","doctor.msg.update-status.stale.summary":"Version {version} ist aktuell, aber die Update-Informationen sind alt.","doctor.msg.update-status.stale.fix":"Führen Sie online `memesh status` aus, um sie zu erneuern.","doctor.msg.http-probe.bad-status.summary":"Der lokale Server unter {url} hat mit einem Fehler geantwortet (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Starten Sie ihn mit `memesh serve` neu und sehen Sie in die Logs.","doctor.msg.http-probe.no-server.summary":"Unter {url} läuft kein lokaler Server.","doctor.msg.http-probe.no-server.fix":"Starten Sie einen mit `memesh serve`, wenn Sie das Dashboard möchten.","doctor.msg.skills-manifest.missing-dev.summary":"Keine Datei-Integritätsliste gefunden (normal, wenn Sie aus dem Quellcode starten).","doctor.msg.skills-manifest.missing-dev.fix":"Führen Sie `npm run build` aus, um sie zu erzeugen.","doctor.msg.skills-manifest.unreadable.summary":"Die Datei-Integritätsliste kann nicht gelesen werden ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Neu installieren: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"Die Datei-Integritätsliste ist leer.","doctor.msg.skills-manifest.empty.fix":"Neu installieren: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Einige mitgelieferte Dateien stimmen nicht mit dem Ausgelieferten überein: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Neu installieren: `npm install -g @pcircle/memesh`. Passiert es auch bei einer frischen Installation wieder, melden Sie es als Sicherheitsproblem.","doctor.msg.config-parse.not-object.summary":"Die Konfigurationsdatei unter {path} hat nicht das erwartete Format, alle Einstellungen werden deshalb ignoriert.","doctor.msg.config-parse.not-object.fix":"Reparieren oder löschen Sie {path} und führen Sie `memesh doctor` erneut aus.","doctor.msg.config-parse.unreadable.summary":"Die Konfigurationsdatei unter {path} kann nicht gelesen werden ({detail}), alle Einstellungen werden deshalb ignoriert.","doctor.msg.config-parse.unreadable.fix":"Reparieren Sie die Datei, oder legen Sie sie beiseite: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'Die bedeutungsbasierte Suche ist auf „{provider}" eingestellt, lieferte im Test aber nichts. Die Stichwortsuche funktioniert weiterhin.',"doctor.msg.embeddings.empty.fix":"Führen Sie `memesh doctor --probe` für Details aus, oder prüfen Sie die Verbindung zum Anbieter.","doctor.msg.embeddings.threw.summary":'Die bedeutungsbasierte Suche ist auf „{provider}" eingestellt, schlug im Test aber fehl: {detail}. Die Stichwortsuche funktioniert weiterhin.',"doctor.msg.embeddings.threw.fix":"Prüfen Sie, ob der Embedding-Anbieter erreichbar ist (z. B. `ollama serve` starten), oder entfernen Sie die embedder-Konfiguration für reine Keyword-Suche.","doctor.msg.llm.unreachable.summary":"Der KI-Anbieter ({provider}) hat nicht geantwortet: {detail}. Die KI-Funktionen tun still und leise nichts.","doctor.msg.llm.unreachable.fix":"Prüfen Sie den API key und die Verbindung und führen Sie dann `memesh doctor --probe` erneut aus.","doctor.msg.llm.threw.summary":"Der Test des KI-Anbieters ({provider}) schlug fehl: {detail}. Die KI-Funktionen tun still und leise nichts.","doctor.msg.llm.threw.fix":"Prüfen Sie den API key und die Verbindung und führen Sie dann `memesh doctor --probe` erneut aus.","doctor.msg.install-channel.unknown.summary":"Es ließ sich nicht feststellen, wie memesh installiert wurde.","doctor.msg.install-channel.unknown.fix":"Bei einem Quellcode-Checkout starten Sie aus dem Repo-Stammverzeichnis; andernfalls installieren Sie neu mit `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"Der Stichwort-Index enthält {count} Einträge in einem alten Format — manche Erinnerungen werden nur über ihren exakten Volltext gefunden.","doctor.msg.fts.unsegmented.fix":"Führen Sie `memesh reindex --fts` aus, um den Index neu aufzubauen.","doctor.msg.vector-index.stale.summary":"Der Suchindex muss neu aufgebaut werden (die Sucheinstellungen haben sich geändert).","doctor.msg.vector-index.stale.fix":"Führen Sie `memesh reindex` aus, um ihn neu aufzubauen.","doctor.msg.vector-generation.open.summary":"Ein unvollendeter Index-Neuaufbau belegt Speicherplatz.","doctor.msg.vector-generation.open.fix":"Führe `memesh reindex` aus, um ihn abzuschließen, oder `memesh reindex --discard-generation`, um den Platz freizugeben.","doctor.msg.database.broken.summary":"Die Datenbank ist nicht nutzbar: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"{used} verwendet / {total} injiziert","analytics.loadFailed":"Analysen konnten nicht geladen werden.","memory.noContent":"(kein Inhalt)","memory.archivedBadge":"archiviert","memory.factsCount":"{count} Fakten","common.error":"Fehler","common.serverUnreachable":"Der memesh-Server ist nicht erreichbar.","common.serverUnreachableAction":"Prüfe, ob `memesh serve` noch läuft, und lade diese Seite neu.","common.responseUnreadable":"Der Server hat geantwortet, aber diese Seite konnte die Antwort nicht lesen — Dashboard und Server sind womöglich nicht auf demselben Stand.","common.responseUnreadableAction":"Lade die Seite neu. Tritt das weiter auf, führe `memesh doctor` aus.","pm.title":"PM-Kennzahlen","pm.decisionsPerWeek":"Entscheidungen/Woche","pm.openDecisions":"offene Entscheidungen (>14 T.)","pm.orphanRate":"Unverknüpfte Erinnerungen","pm.relationsTotal":"Relationen gesamt","pm.stalePlans":"{count} Plan/Pläne seit über 30 Tagen nicht überprüft","common.loading":"Laden…","common.noData":"Keine Daten","errors.unknown":"Unbekannter Fehler","insights.noPreview":"Dieser Vorschlag hat keinen Zusammenfassungstext","httpError.auth.missing-bearer":"Dieser Server verlangt ein Zugriffstoken. Gib dein Token ein, um fortzufahren.","httpError.auth.invalid-token":"Das Zugriffstoken wurde nicht akzeptiert. Prüfe es und versuche es erneut.","httpError.auth.not-configured":"Auf dem Server ist kein Zugriffstoken eingerichtet. Starte `memesh serve` neu und prüfe die Ausgabe.","httpError.validation.bad-body":"Der Server konnte die Anfrage der Seite nicht lesen. Lade die Seite neu und versuche es erneut.","httpError.validation.bad-param":"Ein Teil der Anfrage ist ungültig. Lade die Seite neu und versuche es erneut.","httpError.route.retired":"Der Server unterstützt diese Aktion nicht mehr — Seite und Server haben womöglich unterschiedliche Versionen. Lade die Seite neu.","httpError.route.not-found":"Der Server kennt diese Anfrage nicht — Seite und Server haben womöglich unterschiedliche Versionen. Lade die Seite neu.","httpError.resource.not-found":"Dieses Element existiert nicht mehr. Aktualisiere die Liste.","httpError.payload.too-large":"Die gesendeten Daten sind zu groß (über 1 MB). Versuche kleinere Pakete.","httpError.operation.failed":"Der Server konnte diese Aktion nicht abschließen.","httpError.llm.not-configured":"Kein KI-Anbieter eingerichtet. Füge zuerst einen in den Einstellungen hinzu.","httpError.rate.limited":"Zu viele Anfragen in kurzer Zeit. Warten Sie einen Moment und versuchen Sie es erneut.","httpError.server.internal":"Auf dem Server ist ein unerwarteter Fehler aufgetreten.","settings.testError.auth":"Der API-Schlüssel wurde abgelehnt. Prüfe den Schlüssel und versuche es erneut.","settings.testError.network":"Der Anbieter ist nicht erreichbar. Prüfe deine Netzwerkverbindung.","settings.testError.no_models":"Der Anbieter hat geantwortet, aber keine nutzbaren Modelle zurückgegeben.","settings.testError.bad_host":"Die Ollama-Adresse muss auf diesem Rechner liegen (localhost).","settings.testError.http":"Der Anbieter hat einen Fehler zurückgegeben (HTTP {status}).","settings.testError.unknown":"Der Test ist aus unbekanntem Grund fehlgeschlagen.","time.justNow":"Gerade eben","time.hoursAgo":"Vor {count} Std","time.today":"Heute","time.yesterday":"Gestern","time.daysAgo":"Vor {count} T","time.lastWeek":"Letzte Woche","time.weeksAgo":"Vor {count} W","time.lastMonth":"Letzter Monat","time.monthsAgo":"Vor {count} M","memory.access.frequent":"Häufig · {count} Abrufe","memory.access.recalls":"{count} Abrufe","memory.access.never":"Nie abgerufen","cluster.knowledge":"Wissen","cluster.activity":"Aktivität","cluster.session":"Sitzungen","cluster.reference":"Referenz","cluster.all":"Alle","browse.filterTime":"Zeit","browse.filterValue":"Wert","browse.filterProject":"Projekt","browse.filterSort":"Sortieren","browse.timeToday":"Heute","browse.timeWeek":"Diese Woche","browse.timeMonth":"Dieser Monat","browse.timeOlder":"Älter","browse.valueRecalled":"✓ Verwendet","browse.valueNever":"Nie abgerufen","browse.sortMostRecalled":"Häufigste","browse.sortRecent":"Zuletzt","browse.sortCreated":"Erstellt","browse.emptyFilter":"Keine Erinnerungen in dieser Kategorie — anderen Filter probieren","lessons.stepsLabel":"Schritte","lessons.commitsCount":"{count} Commits","lessons.unstructured":"(Keine strukturierten Felder — siehe Rohspeicher)","lessons.moreItems":"+{count} weitere","roadmap.title":"Projekt-Roadmap","roadmap.summary":"{count} Erinnerungen · {first} → {last}","roadmap.switchToList":"↩ Listenansicht","roadmap.switchToRoadmap":"🗺️ Roadmap-Ansicht","roadmap.emptyProject":"Noch keine Erinnerungen in diesem Projekt.","loop.label":"Memory-Loop","loop.subtitleHas":"Wissens-Erinnerungen in den letzten 7 Tagen wiederverwendet","loop.subtitleNone":"Diese Woche keine Wissens-Erinnerungen abgerufen","loop.approxNote":"Annäherung — vollständige Verfolgung beginnt nach Upgrade.","loop.sparkLabel":"Letzte 30 Tage","roadmap.milestones":"Meilensteine","roadmap.keyLessons":"Wichtige Lektionen","radar.title":"Wissensabdeckung","radar.caption":"Aktive Wissens-Erinnerungen (session und commit ausgeschlossen)","radar.axis.lessons":"Lektionen","radar.axis.decisions":"Entscheidungen","radar.axis.patterns":"Muster","radar.axis.bugs":"Bugfixes","radar.axis.processes":"Prozesse","radar.axis.architecture":"Architektur","ageMatrix.title":"Altersverteilung","ageMatrix.low":"Niedrig","ageMatrix.high":"Hoch","ageMatrix.legend":"Farbtiefe = Dichte","ageMatrix.typeColumn":"Typ","header.signalModeOn":"Signal","header.signalModeOff":"Alle","header.signalModeOnHint":"Session-/Commit-Rauschen ausgeblendet. Klick zeigt alles.","header.signalModeOffHint":"Alle Erinnerungen inklusive Rauschen. Klick blendet aus.","roadmap.phases":"Phasen","onboarding.title":"Willkommen bei MeMesh","onboarding.body":"Ihr Memory-Store ist leer. Starten Sie mit einer kuratierten 30-Entitäts-Tour oder speichern Sie Ihre erste Lektion.","onboarding.llmHint":"Kein LLM erforderlich. Alles funktioniert nur mit FTS5. Ein LLM ist optional für automatische Lektionsgenerierung — später in den Einstellungen konfigurieren.","onboarding.seedButton":"Demo-Tour starten","onboarding.seedingButton":"Wird geladen…","onboarding.seedHint":"Fügt direkt hier 30 Erinnerungen hinzu — kein Terminal nötig","onboarding.cliReference":"Lieber per CLI?","onboarding.hintDemo":"Fügt 30 Demo-Erinnerungen ein (später löschbar)","onboarding.hintReset":"Entfernt alle mit metadata.demo markierten Einträge","onboarding.resetButton":"Demo zurücksetzen","onboarding.resettingButton":"Wird entfernt…","onboarding.resetConfirm":"Alle Demo-Erinnerungen entfernen? Ihre echten Einträge bleiben erhalten.","onboarding.dismiss":"Schließen","common.serverError":"Der Server hat einen Fehler gemeldet (HTTP {status}). Versuchen Sie es erneut — falls es weiter auftritt, führen Sie `memesh doctor` aus.","emptyLibrary.title":"Ihr Speicher ist leer","emptyLibrary.body":"Noch ist nichts gespeichert. Laden Sie die Demo-Tour mit 30 Einträgen, um MeMesh in Aktion zu sehen — später mit einem Klick löschbar.","browse.truncated":"die ersten {shown} von {total} Erinnerungen werden angezeigt — nutzen Sie Suche oder Filter für den Rest","browse.truncatedUnknownTotal":"die ersten {shown} Erinnerungen werden angezeigt — die Gesamtzahl ist nicht verfügbar, es könnten mehr sein","graph.cappedNote":"Es werden die {shown} meistabgerufenen von {total} Entitäten angezeigt, damit der Graph flüssig bleibt.","settings.testStoredKeyHint":"Feld leer lassen, um den bereits gespeicherten Schlüssel zu testen.","ageMatrix.bucket.week":"Diese Woche","ageMatrix.bucket.month":"Dieser Monat","ageMatrix.bucket.quarter":"Dieses Quartal","ageMatrix.bucket.older":"Älter","settings.behaviourTitle":"Verhalten","settings.autoUpdateLabel":"Auto-Update-Richtlinie","settings.autoUpdateOff":"Aus — nur manuell","settings.autoUpdatePatch":"Patch — wendet X.Y.Z+1 an","settings.autoUpdateMinor":"Minor — wendet X.Y+1.0 an","settings.autoUpdateMajor":"Major — wendet jede Version an","settings.autoUpdateHint":"Wird nach jeder Sitzung ausgelöst. MEMESH_AUTO_UPDATE hat Vorrang.","errors.timeout":"Zeitüberschreitung der Anfrage","type.lesson_learned":"Lektion","type.lesson":"Lektion","type.mistake":"Fehler","type.decision":"Entscheidung","type.architecture_decision":"Arch.-Entsch.","type.design_decision":"Design-Entsch.","type.pattern":"Muster","type.technical_pattern":"Tech. Muster","type.best_practice":"Best Practice","type.bug_fix":"Bugfix","type.verification_result":"Verifikation","type.test_result":"Testergebnis","type.process":"Prozess","type.architecture":"Architektur","type.infrastructure":"Infrastruktur","type.feature":"Feature","type.release":"Release","type.refactoring":"Refactoring","type.commit":"Commit","type.session_keypoint":"Sitzungs-Kernpunkt","type.session_identity":"Sitzungsidentität","type.session-insight":"Sitzungs-Insight","type.session-summary":"Sitzungszusammenfassung","type.session-identity":"Sitzungsidentität","type.weekly_summary":"Wochenübersicht","type.weekly-summary":"Wochenübersicht","type.note":"Notiz","type.plan":"Plan","type.knowledge":"Wissen","type.workflow_checkpoint":"Meilenstein","type.concept":"Konzept","type.tool":"Werkzeug","type.person":"Person","relation.relates_to":"bezieht sich auf","relation.related-to":"verwandt mit","relation.depends_on":"hängt ab von","relation.implements":"implementiert","relation.learned_from":"gelernt aus","relation.supersedes":"ersetzt","relation.contradicts":"widerspricht","relation.follows":"folgt auf","relation.belongs-to-project":"gehört zum Projekt","relation.evidences":"belegt","relation.co-created":"gemeinsam erstellt","relation.shares-name-tokens":"ähnliche Namen","patterns.day.0":"Sonntag","patterns.day.1":"Montag","patterns.day.2":"Dienstag","patterns.day.3":"Mittwoch","patterns.day.4":"Donnerstag","patterns.day.5":"Freitag","patterns.day.6":"Samstag","telemetry.flow.dreamer":"Wochenrückblick (Dreamer)","telemetry.flow.pattern_detector":"Mustererkennung","telemetry.flow.digest_validator":"Digest-Validierung","telemetry.flow.guard_proposer":"Guard-Vorschlagsdienst","telemetry.flow.auto_tagger":"Auto-Tagger","telemetry.flow.failure_analyzer":"Fehleranalyse","telemetry.flow.transcript_extractor":"Transkript-Extraktor","telemetry.flow.conflict_judge":"Konfliktrichter","telemetry.errorClass.auth":"Auth abgelehnt","telemetry.errorClass.rate_limit":"Rate-Limit","telemetry.errorClass.upstream":"Anbieterausfall","telemetry.errorClass.bad_request":"ungültige Anfrage","telemetry.errorClass.network":"Netzwerk","telemetry.errorClass.parse":"unlesbare Antwort","telemetry.errorClass.unknown":"unbekannt","lessons.severity.critical":"Kritisch","lessons.severity.major":"Schwer","lessons.severity.minor":"Gering","memory.tooltip.project":"Projekt","memory.tooltip.recalled":"{count}-mal abgerufen","memory.tooltip.hasRelations":"Mit {count} weiteren Erinnerungen verknüpft","memory.tooltip.createdAt":"Erstellt am {date}","graph.layerLabel":"Graph-Ebene","graph.layerWork":"Arbeit","graph.layerAll":"Alles","graph.layerWorkHint":"Entscheidungen, Lehren und Pläne — die Arbeit selbst.","graph.layerAllHint":"Alle von memesh gespeicherten Erinnerungen, inklusive automatischer Erfassung.","graph.layerFellBack":"Bisher weniger als {min} Arbeitseinträge, daher wird der vollständige Graph gezeigt. Halte Entscheidungen und Lehren fest, dann füllt sich diese Ansicht.","graph.evidenceFor":"Belege für {node}","graph.evidenceClose":"Schließen","graph.evidenceLoading":"Belege werden geladen…","graph.evidenceFailed":"Die Belege für diesen Eintrag konnten nicht geladen werden.","graph.evidenceEmpty":"Zu diesem Eintrag sind noch keine Belege verknüpft. Führe `memesh kg backfill` aus, um diese Verknüpfungen aus Commits und Sitzungsaufzeichnungen zu ziehen.","graph.evidenceTruncated":"Zeigt die {shown} neuesten; es gibt mehr.","graph.drift":"Frische","graph.driftHint":"Färbt Knoten nach Alter: Rot = veraltet, Grün = kürzlich genutzt","common.unknown":"unbekannt","insights.entitiesCount":"{n} Entitäten","roadmap.viewToggle":"Roadmap-Ansicht","roadmap.viewTree":"Baum","roadmap.viewMindmap":"Mindmap","roadmap.mindmapNeedsPhases":"Die Mindmap braucht mindestens 3 Erinnerungen innerhalb von 7 Tagen.","roadmap.activePhase":"aktiv","roadmap.entryCount":"{count} Eintrag","roadmap.entriesCount":"{count} Einträge","roadmap.otherGroup":"Sonstige ({count})","roadmap.lowSignalHidden":"({count} mit schwachem Signal ausgeblendet)","roadmap.resetHint":"Zoom und Position zurücksetzen (Doppelklick auf den Hintergrund geht auch)","roadmap.zoomHint":"scrollen zum Zoomen · ziehen zum Schwenken · {pct}%","roadmap.moreEntities":"+{count} weitere","roadmap.viewDecisions":"Entscheidungen","roadmap.densityTitle":"Erfassungsdichte nach Kategorie","roadmap.densityNote":"was memesh erfasst hat — nicht alles, was passiert ist","roadmap.lineageSupersedes":"{n} ersetzt","roadmap.lineageConflicts":"{n} ungelöste Konflikte","adr.empty":'Für dieses Projekt sind noch keine Entscheidungen erfasst. Erfasse eine mit dem Typ „decision", und sie erscheint hier mit ihrer Historie.',"adr.statusActive":"aktiv","adr.statusSuperseded":"ersetzt","adr.supersedes":"ersetzt","adr.supersededBy":"ersetzt durch","nav.ariaLabel":"Dashboard-Bereiche","feedback.descLabel":"Feedback-Beschreibung","graph.canvasA11y":"Wissensgraph (Canvas): {entities} Entitäten, {relations} Beziehungen, {orphans} ohne Verbindung. Nutzen Sie die Typfilter und die Suche oben für eine nicht-visuelle Ansicht."},vi:{"auth.title":"Yêu cầu xác thực","auth.intro":"Bảng điều khiển này được bảo vệ bằng bearer token. Dán giá trị của MEMESH_REMOTE_TOKEN (hoặc nội dung của <memeshDir>/remote-token) bên dưới.","auth.tokenLabel":"Token","auth.empty":"Token không được để trống.","auth.invalid":"Mã thông báo này không được chấp nhận. Hãy kiểm tra và thử lại.","auth.submit":"Mở khóa bảng điều khiển","auth.tokenPlaceholder":"dán token vào đây","brand.subtitle":"powered by pcircle.com","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","telemetry.title":"Hoạt động LLM","telemetry.lastNDays":"{n} ngày qua","telemetry.loading":"đang tải…","telemetry.empty":"Chưa có hoạt động AI trong khoảng thời gian này. Các dòng sẽ tự xuất hiện khi các tính năng AI chạy nền (như tóm tắt hằng tuần và tự gắn thẻ) hoạt động.","telemetry.callsCount":"{n} lệnh gọi","telemetry.attemptsCount":"{n} lần thử","telemetry.successRate":"thành công","telemetry.medianLatency":"độ trễ trung vị","telemetry.fallbackUsed":"fallback dùng {n}× ({pct} số lệnh gọi)","telemetry.byProvider":"theo nhà cung cấp","telemetry.byModel":"theo mô hình","telemetry.byProject":"theo dự án","telemetry.errors":"lỗi","insights.title":"memesh đã làm gì cho bạn","insights.subtitle":"các weekly recap và pattern được tạo tự động, đang chờ bạn xem xét","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"Tất cả","insights.refresh":"Làm mới","insights.loading":"đang tải…","insights.emptyPending":"Không có insight nào pending. Chạy `memesh dream run` để tạo weekly recap.","insights.emptyNoLlm":"Cấu hình một nhà cung cấp LLM trong phần Cài đặt để bật weekly recap và phát hiện pattern.","insights.emptyOther":"Không có gì ở đây.","insights.sources":"nguồn","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"Xem chi tiết","insights.collapse":"Thu gọn","insights.accept":"Chấp nhận","insights.applying":"Đang áp dụng…","insights.reject":"Từ chối","insights.generatedBy":"Tạo bởi","insights.promptVersion":"Phiên bản prompt","insights.observations":"Tóm tắt quan sát","insights.tags":"Thẻ","insights.sourceIds":"Entity nguồn","insights.validationWarnings":"Nhận định bị gắn cờ (LLM validator)","insights.validationClaim":"Nhận định","insights.validationReason":"Lý do","insights.runDream":"Chạy weekly recap","insights.runDreamWithValidate":"Chạy kèm validator (chậm hơn, chất lượng cao hơn)","banner.pendingInsights":"{n} insight mới đang chờ bạn xem xét →","banner.dismiss":"Bỏ qua","banner.viewAll":"Xem tất cả","pattern.title":"Pattern","pattern.evidenceCount":"{n} bằng chứng","pattern.severity":"Mức nghiêm trọng","pattern.severity.high":"cao","pattern.severity.medium":"trung bình","pattern.severity.low":"thấp","pattern.description":"Mô tả pattern","tab.graph":"Đồ thị","tab.settings":"Cài đặt","tab.home":"Trang chủ","tab.memories":"Ký ức","tab.project":"Dự án","memories.searchPlaceholder":"Lọc ngay khi gõ — nhấn Enter để tìm theo độ liên quan","memories.scopeLabel":"Phạm vi","memories.scopeWork":"Lớp công việc","memories.scopeEvidence":"Bằng chứng","memories.scopeAll":"Tất cả","memories.scopeArchived":"Đã lưu trữ","memories.composition":"Thành phần","memories.rankedBy":"xếp theo độ liên quan","memories.backToList":"Quay lại danh sách","memories.workEmpty":"Chưa có ký ức lớp công việc — mục tiêu, quyết định, bài học và kế hoạch sẽ xuất hiện ở đây khi được ghi lại.","memories.showAll":"Hiện tất cả ký ức","memories.expand":"Hiện chi tiết","memories.collapse":"Ẩn chi tiết","home.analyticsTitle":"Phân tích","home.analyticsHint":"Sức khỏe, dòng thời gian, pattern và mức sử dụng — mở rộng khi cần","project.selectLabel":"Dự án","project.selectPrompt":"Chọn một dự án để xem lịch sử của nó.","project.empty":"Chưa có ký ức dự án. Hãy làm việc trong một kho git đã cài hooks memesh và câu chuyện của nó sẽ xuất hiện ở đây.","guard.sourceLesson":"Bài học nguồn","guard.pattern":"Mẫu kích hoạt","guard.message":"Cảnh báo sẽ hiển thị","guard.shouldMatch":"Phải kích hoạt với","guard.shouldNotMatch":"Phải im lặng vớ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.active":"hoạt động","browse.archived":"đã lưu trữ","browse.refresh":"Làm mới","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.archiveFailed":"Không thể lưu trữ ký ức: {message}","browse.restoreFailed":"Không thể khôi phục ký ức: {message}","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ớ","metrics.notMeasured":"Chưa đo được","metrics.health":"Sức khoẻ","metrics.healthNote":"Hoạt động, chất lượng, độ mới, bài học","metrics.critical":"Bài học nghiêm trọng","metrics.criticalPartial":"trong {tagged} mục đã phân loại · tổng {total} bài học","metrics.criticalAll":"trong tổng {total} bài học, đã phân loại hết","metrics.criticalUnclassified":"{total} bài học, chưa phân loại theo mức độ","metrics.criticalNoLessons":"Chưa ghi nhận bài học nào","metrics.citation":"Trích dẫn","metrics.citationNote":"{cited} trong {total} phiên có trích dẫn ký ức","metrics.citationNotMeasured":"Việc theo dõi trích dẫn bắt đầu từ phiên sau","metrics.reused":"Dùng lại tuần này","metrics.reusedNote":"Ước tính — dựa trên thời điểm truy cập cuối","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.entityMeta":"{type} · độ tin cậy {confidence}% · không dùng {days} ngày","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.llmOptional.title":"LLM là tùy chọn","settings.llmOptional.body":"memesh hoạt động mà không cần LLM. Chế độ Core mặc định bao gồm tìm kiếm toàn văn, remember/recall thủ công, dashboard và ghi nhận session qua hooks.","settings.llmOptional.coreLabel":"Không có LLM (chế độ Core)","settings.llmOptional.coreFeatures":"tìm kiếm từ khóa FTS5, remember/recall thủ công, dashboard, ghi nhận session qua hooks","settings.llmOptional.smartLabel":"Có LLM (chế độ Smart)","settings.llmOptional.smartFeatures":"tự động tạo lesson_learned từ lỗi session, tự động gắn nhãn entity mới, tóm tắt tuần + nhận diện mẫu hình","settings.apiKey":"Khóa API","settings.fallbacks.title":"Nhà cung cấp dự phòng","settings.fallbacks.explainer":"Nếu nhà cung cấp chính không khả dụng, memesh sẽ thử lần lượt các nhà cung cấp này cho đến khi có một cái hoạt động.","settings.fallbacks.privacyTitle":"Lưu ý về quyền riêng tư","settings.fallbacks.privacyBody":"Thêm nhà cung cấp đám mây (OpenAI hoặc Anthropic) nghĩa là khi nhà cung cấp chính ngừng hoạt động, nội dung bộ nhớ của bạn — có thể là riêng tư — sẽ được gửi đến nhà cung cấp đám mây đó. Nếu bạn dùng nhà cung cấp cục bộ vì quyền riêng tư, chỉ thêm dự phòng đám mây nếu bạn chấp nhận đánh đổi này.","settings.fallbacks.empty":"Chưa có nhà cung cấp dự phòng.","settings.fallbacks.add":"Thêm nhà cung cấp dự phòng","settings.fallbacks.providerLabel":"Nhà cung cấp","settings.fallbacks.modelLabel":"Mô hình (tùy chọn)","settings.fallbacks.modelPlaceholder":"ví dụ: gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"Đã lưu một khóa. Để trống để giữ khóa đó.","settings.fallbacks.remove":"Xóa","settings.fallbacks.moveUp":"Di chuyển lên","settings.fallbacks.moveDown":"Di chuyển xuống","settings.fallbacks.priority":"Ưu tiên {n}","settings.fallbacks.save":"Lưu chuỗi dự phòng","settings.fallbacks.needsKey":"Nhập khóa API, nếu không dự phòng đám mây này không thể dùng được.","settings.model":"Mô hình (tùy chọn)","settings.save":"Lưu","settings.saving":"Đang lưu…","settings.saved":"Đã lưu.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Kiểm tra","settings.testing":"Đang kiểm tra…","settings.testPassed":"✓ Kết nối OK · {count} mô hình có sẵn","settings.testFailed":"Kiểm tra kết nối thất bại","settings.suggested":"đề xuất","settings.testRequired":"Vui lòng kiểm tra kết nối trước khi lưu","settings.language":"Ngôn ngữ","settings.searchMode":"Chế độ tìm kiếm","settings.none":"Không có","settings.updates":"Cập nhật","settings.updateChecking":"Đang kiểm tra bản cập nhật…","settings.updateUnavailable":"Hiện chưa thể kiểm tra bản cập nhật","settings.updateNoSuccessfulChecks":"Chưa có lần kiểm tra cập nhật nào thành công","settings.upToDate":"Đã là bản mới nhất","settings.updateAvailable":"Có bản cập nhật mới","settings.updateStale":"Trạng thái lưu đệm hiển thị có thể đã cũ","settings.updateCachedFallback":"Đang dùng kết quả lưu đệm thành công gần nhất","settings.updateDeprecatedNoTarget":"Đã ngừng dùng — chưa có phiên bản nâng cấp","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} đã bị maintainer đánh dấu NGỪNG DÙNG (DEPRECATED).","settings.updatePartialTitle":"⚠️ Kiểm tra cập nhật chưa hoàn tất","settings.updatePartialDescription":"{message}. Phiên này chưa thể xác định trạng thái ngừng dùng — hãy chạy lại khi có mạng.","settings.updatePartialSummary":"Một phần — chưa xác nhận trạng thái ngừng dùng","settings.updateDeprecatedTargetUnknown":"Đã ngừng dùng — đang tìm phiên bản nâng cấp","settings.currentVersion":"Phiên bản hiện tại","settings.latestVersion":"Phiên bản mới nhất","settings.lastChecked":"Lần kiểm tra gần nhất","settings.lastAttempted":"Lần thử kiểm tra gần nhất","settings.lastSuccessful":"Lần kiểm tra thành công gần nhất","settings.updateSourceFresh":"Kiểm tra mới","settings.updateSourceCached":"Đang dùng kết quả lưu đệm","settings.updateSourceStale":"Đang dùng kết quả lưu đệm đã cũ","settings.updateSourceUnavailable":"Không có kết quả lưu đệm","settings.updateCommand":"Lệnh cập nhật","settings.checkNow":"Kiểm tra ngay","settings.updateLastError":"Lỗi kiểm tra gần nhất: {message}","settings.installMethod":"Kiểu cài đặt","settings.installNpmGlobal":"cài đặt npm toàn cục","settings.installNpmLocal":"cài đặt cục bộ trong dự án","settings.installSourceCheckout":"bản checkout mã nguồn","settings.installUnknown":"không rõ","settings.updateGuidanceNpmGlobal":"Bản cài đặt này có thể được cập nhật trực tiếp từ MeMesh.","settings.updateGuidanceNpmLocal":"Hãy cập nhật bản cài đặt này bằng trình quản lý gói của dự án đã cài MeMesh.","settings.updateGuidanceSourceCheckout":"Hãy cập nhật bản checkout mã nguồn này từ kho lưu trữ rồi build lại.","settings.updateGuidanceUnknown":"Hãy cập nhật bản cài đặt này bằng công cụ hoặc quy trình đã dùng để cài MeMesh.","graph.entities":"Thực thể","graph.relations":"Quan hệ","graph.orphans":"Nút 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","graph.interactHint":"Nhấp một nút để tập trung · kéo vùng trống để di chuyển · cuộn để thu phóng","graph.resetView":"Đặt lại chế độ xem","graph.resetViewHint":"Đặt lại thu phóng và vị trí","graph.ageToday":"hôm nay","graph.ageDaysAgo":"{count} ngày trước","graph.ageWeeksAgo":"{count} tuần trước","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","feedback.submitting":"Đang thu thập chẩn đoán…","doctorBanner.warnTitleSoft":"memesh có vài ghi chú cài đặt","doctorBanner.failTitle":"Cài đặt memesh chưa hoàn tất","doctorBanner.dismiss":"Đóng","doctorBanner.getHelp":"Nhận trợ giúp","doctorBanner.helpHint":"Mở một GitHub issue với chẩn đoán đã điền sẵn","doctorBanner.preambleForIssue":"memesh doctor báo cáo những vấn đề sau trên cài đặt của tôi:","doctorBanner.moreCount":"…và {n} mục nữa — chạy `memesh doctor` để xem danh sách đầy đủ","doctor.label.readme_locale_parity":"Bản dịch README","doctor.label.config":"Tệp cấu hình","doctor.label.mcp-config":"Tệp kết nối MCP","doctor.label.hooks-config":"Định nghĩa hook","doctor.label.hook-scripts":"Script hook","doctor.label.hook-wiring":"Kết nối với Claude Code","doctor.label.hook-activity":"Tự động ghi nhớ","doctor.label.node-runtime":"Phiên bản Node.js","doctor.label.native-binding":"SQLite và tìm kiếm vector","doctor.label.shell-cli":"Lệnh trong terminal","doctor.label.dashboard":"Tệp bảng điều khiển","doctor.label.update-status":"Cập nhật","doctor.label.http-probe":"Máy chủ cục bộ","doctor.label.skills-manifest":"Tệp đi kèm","doctor.label.config_parse":"Tệp cấu hình","doctor.label.embeddings_probe":"Tìm kiếm theo nghĩa","doctor.label.llm_probe":"Nhà cung cấp AI","doctor.label.install-channel":"Cách cài đặt","doctor.label.fts_segmentation":"Chỉ mục từ khóa","doctor.label.vector_index":"Chỉ mục tìm kiếm","doctor.label.database":"Cơ sở dữ liệu","doctor.msg.readme-parity.unreadable.summary":"Không đọc được README.md: {detail}","doctor.msg.readme-parity.drift.summary":"Một số README bản dịch đã lệch so với bản tiếng Anh: {detail}","doctor.msg.readme-parity.drift.fix":"Đồng bộ lại các README được liệt kê với README.md.","doctor.msg.config.invalid-json.summary":"Tệp cấu hình tại {path} không phải JSON hợp lệ nên đang bị bỏ qua.","doctor.msg.config.invalid-json.fix":"Sửa hoặc xóa {path}, rồi chạy `memesh config list` để xác nhận nó tải được.","doctor.msg.mcp-config.missing.summary":"Tệp nối memesh với Claude Code (.mcp.json) đã biến mất.","doctor.msg.mcp-config.missing.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json bị hỏng (không phải JSON hợp lệ) nên Claude Code không đọc được.","doctor.msg.mcp-config.invalid-json.fix":"Sửa {path} hoặc cài lại MeMesh.","doctor.msg.mcp-config.no-entry.summary":".mcp.json không còn mục máy chủ memesh nữa.","doctor.msg.mcp-config.no-entry.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` khởi chạy một tệp không có trong bản cài này, nên mọi công cụ memesh trong Claude Code đều không khởi động được.","doctor.msg.mcp-config.entry-missing.fix":"Cài lại MeMesh. Nếu bạn tự sửa `.mcp.json`, hãy trỏ nó về `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json đã biến mất nên tính năng ghi nhớ tự động không chạy được.","doctor.msg.hooks-config.missing.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json bị hỏng (không phải JSON hợp lệ).","doctor.msg.hooks-config.invalid-json.fix":"Sửa {path} hoặc cài lại MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json thiếu các loại hook sau: {types}. Một phần ghi nhận tự động sẽ không chạy.","doctor.msg.hooks-config.missing-types.fix":"Khôi phục cấu hình hook gốc hoặc cài đặt lại MeMesh.","doctor.msg.hook-scripts.none.summary":"Cấu hình hook không có script nào nên không thể ghi tự động thứ gì.","doctor.msg.hook-scripts.none.fix":"Cài lại MeMesh.","doctor.msg.hook-scripts.missing.summary":"Các script hook sau đã biến mất: {files}","doctor.msg.hook-scripts.missing.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.hook-scripts.not-executable.summary":"Các script hook sau tồn tại nhưng không được phép chạy: {files}","doctor.msg.hook-scripts.not-executable.fix":"Chạy `chmod +x scripts/hooks/*.js`, hoặc `npm run build` nếu dùng mã nguồn.","doctor.msg.hook-wiring.no-marker.summary":"memesh chưa được nối với Claude Code nên chưa có gì được ghi nhớ tự động.","doctor.msg.hook-wiring.no-marker.fix":"Chạy `memesh install-hooks` một lần, rồi chạy `memesh doctor` để xác nhận.","doctor.msg.hook-wiring.script-missing.summary":"Một hook memesh đã đấu nối trỏ tới {path}, nhưng tệp này không còn tồn tại — agent gọi một tệp không có ở mỗi sự kiện tương ứng. Thường là tàn dư của bản nâng cấp đã loại bỏ hook đó.","doctor.msg.hook-wiring.script-missing.fix":"Chạy `memesh install-hooks` để đấu nối lại (các mục đã loại bỏ sẽ bị xoá), rồi khởi động lại agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"Không đọc được bản ghi kết nối tại {path}.","doctor.msg.hook-wiring.marker-unreadable.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.marker-malformed.summary":"Bản ghi kết nối bị hỏng.","doctor.msg.hook-wiring.marker-malformed.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.settings-missing.summary":"Tệp cài đặt của Claude Code ({path}) đã biến mất nên kết nối bị đứt.","doctor.msg.hook-wiring.settings-missing.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} bị hỏng (không phải JSON hợp lệ).","doctor.msg.hook-wiring.settings-invalid.fix":"Khôi phục từ bản sao lưu, hoặc chạy `memesh install-hooks` để tạo lại.","doctor.msg.hook-wiring.entries-removed.summary":"Các mục memesh đã bị gỡ khỏi {path} nên kết nối bị đứt.","doctor.msg.hook-wiring.entries-removed.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.root-moved.summary":"Kết nối trỏ tới {path}, nơi này không còn tồn tại (memesh có lẽ đã bị di chuyển).","doctor.msg.hook-wiring.root-moved.fix":"Chạy `memesh install-hooks` để cập nhật.","doctor.msg.hook-activity.never-ran.summary":"Không có hook thu thập nào chạy trong {hours} giờ kể từ khi bắt đầu theo dõi, dù đấu nối hook vẫn ổn — không có gì được ghi nhớ.","doctor.msg.hook-activity.never-ran.fix":"Hoàn tất một phiên làm việc rồi chạy lại `memesh doctor`. Nếu vẫn báo chưa có hook nào chạy, chạy `memesh install-hooks` rồi khởi động lại agent.","doctor.msg.hook-activity.stale.summary":"Hook thu thập cuối cùng chạy khoảng {hours} giờ trước ({hook}). Nếu bạn đã làm việc kể từ đó, việc thu thập đã dừng và không có gì từ các phiên đó được lưu.","doctor.msg.hook-activity.stale.fix":"Khởi động lại agent, kết thúc một phiên rồi chạy lại `memesh doctor`. Nếu không khôi phục, chạy `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Hook session-summary chạy lần cuối khoảng {hours} giờ trước, và 3 ngày qua cũng không có ghi nào từ Claude Code. Nếu máy này đã chuyển sang agent khác (Codex / Gemini), điều này là bình thường; nếu bạn vẫn dùng Claude Code ở đây, thu thập đã dừng.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Nếu bạn vẫn dùng Claude Code trên máy này: khởi động lại, kết thúc một phiên rồi chạy lại `memesh doctor`. Nếu không hồi phục, chạy `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Không đọc được hoạt động hook từ cơ sở dữ liệu: {detail}. Tình trạng thu thập là không rõ, và điều đó không giống với bình thường.","doctor.msg.hook-activity.query-failed.fix":"Chạy `memesh doctor --verbose` để xem lỗi đầy đủ, và kiểm tra ~/.memesh đọc được và đĩa còn chỗ trống.","doctor.msg.hook-activity.stale-unknown.summary":'Không đọc được thời điểm chạy gần nhất của hook {hook} (dữ liệu hỏng, hoặc do một máy lệch đồng hồ ghi). Tình trạng thu thập hiện là "không rõ", và điều đó không giống "khỏe mạnh".',"doctor.msg.hook-activity.stale-unknown.fix":"Kết thúc một phiên làm việc rồi chạy lại `memesh doctor` — lần chạy mới sẽ ghi đè dấu thời gian hỏng.","doctor.msg.hook-activity.disabled.summary":"Thu thập tự động đang tắt (MEMESH_AUTO_CAPTURE hoặc autoCapture trong cấu hình) — do chủ ý, nên hook im lặng là điều dự kiến. Bật lại để tiếp tục thu thập phiên.","doctor.msg.hook-activity.disabled-env.summary":"Thu thập tự động bị tắt bởi MEMESH_AUTO_CAPTURE=false trong môi trường shell này. doctor chỉ thấy được môi trường của chính nó — nếu agent của bạn chạy không có biến này, thu thập ở đó không bị ảnh hưởng.","doctor.msg.hook-activity.not-wired.summary":"Chưa có hook thu thập nào từng chạy — và trên máy này không xác nhận được hook thu thập nào (Stop / PostToolUse / PreCompact) đã đấu nối, nên không có gì để chạy.","doctor.msg.hook-activity.not-wired.fix":"Nếu muốn thu thập tự động, chạy `memesh install-hooks`. Nếu bản cài này chỉ dùng MCP (Codex / Gemini), đây là bình thường và có thể bỏ qua.","doctor.msg.hook-activity.stop-silent.summary":"Hook {hook} vẫn đang ghi dấu, nhưng hook session-summary chưa từng chạy lần nào trong {hours} giờ kể từ khi bắt đầu theo dõi — thu thập phiên có thể đã hỏng, bị che bởi thu thập commit.","doctor.msg.hook-activity.stop-silent.fix":"Kết thúc một phiên làm việc rồi chạy lại `memesh doctor`. Nếu session-summary vẫn chưa chạy, chạy `memesh install-hooks` và khởi động lại agent.","doctor.msg.hook-activity.never-ran-legacy.summary":"Chưa hook nào ghi dấu nhịp tim, nhưng từ khi bắt đầu theo dõi đã có {captured} ký ức thu thập tự động — nhiều khả năng hook từ phiên bản trước khi có theo dõi nhịp tim vẫn đang chạy.","doctor.msg.hook-activity.never-ran-legacy.fix":"Cập nhật hook memesh lên phiên bản hiện tại (plugin: `/plugin update memesh`; npm: `memesh install-hooks`), rồi khởi động lại agent.","doctor.msg.node-runtime.too-old.summary":"Node.js của bạn cũ hơn mức gói này hỗ trợ. {detail}","doctor.msg.node-runtime.too-old.fix":"Nâng cấp Node.js lên {required} trở lên, rồi chạy lại `memesh doctor`.","doctor.msg.native-binding.node-too-old.summary":"SQLite tích hợp trong bản Node này quá cũ với memesh — nó không tải được phần tìm kiếm theo ý nghĩa. Bản đầy đủ có từ Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Nâng Node lên 22.13 trở lên rồi chạy lại `memesh doctor`.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec chưa được cài. Ký ức vẫn được lưu và tìm bằng từ khoá — chỉ tìm theo ý nghĩa là tắt.","doctor.msg.native-binding.not-installed.fix":"Chạy `npm install` trong thư mục dùng @pcircle/memesh.","doctor.msg.native-binding.load-failed.summary":"Không tải được sqlite-vec: {detail}. Tìm kiếm chỉ còn dùng từ khoá.","doctor.msg.native-binding.load-failed.fix":'Chạy: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"Lệnh `memesh` không có sẵn trong terminal của bạn. Các tính năng Claude Code vẫn hoạt động — chỉ ảnh hưởng khi bạn tự gõ `memesh`.","doctor.msg.shell-cli.not-on-path.fix":"Chạy `npm install -g @pcircle/memesh` để thêm. Hai bản cài dùng chung một bộ nhớ.","doctor.msg.dashboard.missing.summary":"Tệp bảng điều khiển đã biến mất.","doctor.msg.dashboard.missing.fix":"Tạo lại bằng `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"memesh chưa kiểm tra được có phiên bản mới hơn hay không.","doctor.msg.update-status.no-cache.fix":"Chạy `memesh status` một lần khi có mạng — kết quả được lưu và thông báo này sẽ biến mất.","doctor.msg.update-status.deprecated.summary":"Phiên bản {version} đã bị nhóm phát triển rút lại: {detail}","doctor.msg.update-status.deprecated.fix":"Cập nhật ngay — chạy `memesh update` (hoặc làm theo cách cài đặt của bạn).","doctor.msg.update-status.deprecation-unknown.summary":"Không xác nhận được phiên bản {version} còn an toàn để dùng hay không: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Chạy `memesh status` khi có mạng để thử lại.","doctor.msg.update-status.update-available.summary":"Đã có phiên bản mới hơn: {latest} (bạn đang dùng {current}).","doctor.msg.update-status.update-available.fix":"Chạy `memesh update` để nâng cấp.","doctor.msg.update-status.stale.summary":"Phiên bản {version} là mới nhất, nhưng thông tin cập nhật đã cũ.","doctor.msg.update-status.stale.fix":"Chạy `memesh status` khi có mạng để làm mới.","doctor.msg.http-probe.bad-status.summary":"Máy chủ cục bộ tại {url} trả về lỗi (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Khởi động lại bằng `memesh serve` và xem log.","doctor.msg.http-probe.no-server.summary":"Không có máy chủ cục bộ nào đang chạy tại {url}.","doctor.msg.http-probe.no-server.fix":"Muốn dùng bảng điều khiển thì khởi động bằng `memesh serve`.","doctor.msg.skills-manifest.missing-dev.summary":"Không tìm thấy danh sách kiểm tra toàn vẹn tệp (bình thường khi chạy từ mã nguồn).","doctor.msg.skills-manifest.missing-dev.fix":"Chạy `npm run build` để tạo.","doctor.msg.skills-manifest.unreadable.summary":"Không đọc được danh sách kiểm tra toàn vẹn tệp ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Cài lại: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"Danh sách kiểm tra toàn vẹn tệp bị trống.","doctor.msg.skills-manifest.empty.fix":"Cài lại: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Một số tệp đi kèm không khớp với bản phát hành: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Cài lại: `npm install -g @pcircle/memesh`. Nếu cài mới mà vẫn bị, hãy báo cáo như một vấn đề bảo mật.","doctor.msg.config-parse.not-object.summary":"Tệp cấu hình tại {path} không đúng định dạng mong đợi nên mọi thiết lập đang bị bỏ qua.","doctor.msg.config-parse.not-object.fix":"Sửa hoặc xóa {path}, rồi chạy lại `memesh doctor`.","doctor.msg.config-parse.unreadable.summary":"Không đọc được tệp cấu hình tại {path} ({detail}) nên mọi thiết lập đang bị bỏ qua.","doctor.msg.config-parse.unreadable.fix":"Sửa tệp, hoặc tạm dời nó đi: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'Tìm kiếm theo nghĩa được đặt là "{provider}" nhưng khi thử không cho ra gì. Tìm kiếm từ khóa vẫn hoạt động.',"doctor.msg.embeddings.empty.fix":"Chạy `memesh doctor --probe` để xem chi tiết, hoặc kiểm tra kết nối tới nhà cung cấp.","doctor.msg.embeddings.threw.summary":'Tìm kiếm theo nghĩa được đặt là "{provider}" nhưng thử bị lỗi: {detail}. Tìm kiếm từ khóa vẫn hoạt động.',"doctor.msg.embeddings.threw.fix":"Kiểm tra xem nhà cung cấp embedding có kết nối được không (ví dụ chạy `ollama serve`), hoặc xóa cấu hình embedder để dùng tìm kiếm chỉ theo từ khóa.","doctor.msg.llm.unreachable.summary":"Nhà cung cấp AI ({provider}) không trả lời: {detail}. Các tính năng AI đang âm thầm không làm gì cả.","doctor.msg.llm.unreachable.fix":"Kiểm tra API key và kết nối, rồi chạy lại `memesh doctor --probe`.","doctor.msg.llm.threw.summary":"Thử nhà cung cấp AI ({provider}) bị lỗi: {detail}. Các tính năng AI đang âm thầm không làm gì cả.","doctor.msg.llm.threw.fix":"Kiểm tra API key và kết nối, rồi chạy lại `memesh doctor --probe`.","doctor.msg.install-channel.unknown.summary":"Không xác định được memesh đã được cài bằng cách nào.","doctor.msg.install-channel.unknown.fix":"Nếu là mã nguồn, hãy chạy từ thư mục gốc của repo; nếu không, cài lại bằng `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"Chỉ mục từ khóa có {count} mục ở định dạng cũ — một số ký ức chỉ tìm thấy khi khớp đúng toàn bộ nguyên văn.","doctor.msg.fts.unsegmented.fix":"Chạy `memesh reindex --fts` để xây lại chỉ mục.","doctor.msg.vector-index.stale.summary":"Chỉ mục tìm kiếm cần được xây lại (thiết lập tìm kiếm đã thay đổi).","doctor.msg.vector-index.stale.fix":"Chạy `memesh reindex` để xây lại.","doctor.msg.vector-generation.open.summary":"Một lần xây lại chỉ mục chưa hoàn tất đang chiếm dung lượng đĩa.","doctor.msg.vector-generation.open.fix":"Chạy `memesh reindex` để hoàn tất, hoặc `memesh reindex --discard-generation` để thu hồi dung lượng.","doctor.msg.database.broken.summary":"Cơ sở dữ liệu không dùng được: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"đã dùng {used} / đã đưa vào {total}","analytics.loadFailed":"Không thể tải dữ liệu phân tích.","memory.noContent":"(không có nội dung)","memory.archivedBadge":"đã lưu trữ","memory.factsCount":"{count} dữ kiện","common.error":"Lỗi","common.serverUnreachable":"Không kết nối được máy chủ memesh.","common.serverUnreachableAction":"Hãy kiểm tra `memesh serve` còn đang chạy không, rồi tải lại trang này.","common.responseUnreadable":"Máy chủ đã phản hồi nhưng trang này không đọc được nội dung — phiên bản dashboard và máy chủ có thể không khớp.","common.responseUnreadableAction":"Tải lại trang. Nếu vẫn xảy ra, hãy chạy `memesh doctor`.","pm.title":"Chỉ số PM","pm.decisionsPerWeek":"quyết định/tuần","pm.openDecisions":"quyết định chưa xử lý (>14 ngày)","pm.orphanRate":"Ký ức chưa liên kết","pm.relationsTotal":"tổng số quan hệ","pm.stalePlans":"{count} kế hoạch chưa được xem lại hơn 30 ngày","common.loading":"Đang tải…","common.noData":"Không có dữ liệu","errors.unknown":"Lỗi không xác định","insights.noPreview":"Đề xuất này không có nội dung tóm tắt","httpError.auth.missing-bearer":"Máy chủ này cần mã truy cập. Hãy nhập mã để tiếp tục.","httpError.auth.invalid-token":"Mã truy cập không được chấp nhận. Kiểm tra lại và thử lần nữa.","httpError.auth.not-configured":"Máy chủ chưa thiết lập mã truy cập. Khởi động lại `memesh serve` và xem đầu ra của nó.","httpError.validation.bad-body":"Máy chủ không đọc được yêu cầu trang gửi. Tải lại trang rồi thử lại.","httpError.validation.bad-param":"Một phần của yêu cầu không hợp lệ. Tải lại trang rồi thử lại.","httpError.route.retired":"Máy chủ không còn hỗ trợ thao tác này — trang và máy chủ có thể khác phiên bản. Hãy tải lại trang.","httpError.route.not-found":"Máy chủ không nhận ra yêu cầu này — trang và máy chủ có thể khác phiên bản. Hãy tải lại trang.","httpError.resource.not-found":"Mục này không còn tồn tại. Hãy làm mới danh sách.","httpError.payload.too-large":"Dữ liệu gửi đi quá lớn (hơn 1 MB). Hãy chia thành phần nhỏ hơn.","httpError.operation.failed":"Máy chủ không thể hoàn tất thao tác này.","httpError.llm.not-configured":"Chưa thiết lập nhà cung cấp AI. Hãy thêm trong phần Cài đặt trước.","httpError.rate.limited":"Quá nhiều yêu cầu trong thời gian ngắn. Vui lòng đợi một lát rồi thử lại.","httpError.server.internal":"Máy chủ gặp lỗi không mong muốn.","settings.testError.auth":"Khóa API bị từ chối. Kiểm tra khóa và thử lại.","settings.testError.network":"Không kết nối được với nhà cung cấp. Kiểm tra kết nối mạng.","settings.testError.no_models":"Nhà cung cấp có phản hồi nhưng không trả về mô hình dùng được.","settings.testError.bad_host":"Địa chỉ Ollama phải nằm trên máy này (localhost).","settings.testError.http":"Nhà cung cấp trả về lỗi (HTTP {status}).","settings.testError.unknown":"Kiểm tra thất bại vì lý do không rõ.","time.justNow":"Vừa xong","time.hoursAgo":"{count} giờ trước","time.today":"Hôm nay","time.yesterday":"Hôm qua","time.daysAgo":"{count} ngày trước","time.lastWeek":"Tuần trước","time.weeksAgo":"{count} tuần trước","time.lastMonth":"Tháng trước","time.monthsAgo":"{count} tháng trước","memory.access.frequent":"Thường dùng · {count} lần","memory.access.recalls":"{count} lần","memory.access.never":"Chưa dùng","cluster.knowledge":"Kiến thức","cluster.activity":"Hoạt động","cluster.session":"Phiên","cluster.reference":"Tham chiếu","cluster.all":"Tất cả","browse.filterTime":"Thời gian","browse.filterValue":"Giá trị","browse.filterProject":"Dự án","browse.filterSort":"Sắp xếp","browse.timeToday":"Hôm nay","browse.timeWeek":"Tuần này","browse.timeMonth":"Tháng này","browse.timeOlder":"Cũ hơn","browse.valueRecalled":"✓ Đã dùng","browse.valueNever":"Chưa dùng","browse.sortMostRecalled":"Dùng nhiều nhất","browse.sortRecent":"Gần đây","browse.sortCreated":"Tạo lúc","browse.emptyFilter":"Không có ký ức trong danh mục này — thử bộ lọc khác","lessons.stepsLabel":"bước","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Không có trường có cấu trúc — xem bộ nhớ thô)","lessons.moreItems":"+{count} nữa","roadmap.title":"Lộ Trình Dự Án","roadmap.summary":"{count} ký ức · {first} → {last}","roadmap.switchToList":"↩ Xem danh sách","roadmap.switchToRoadmap":"🗺️ Xem lộ trình","roadmap.emptyProject":"Chưa có ký ức nào trong dự án này.","loop.label":"Vòng lặp ký ức","loop.subtitleHas":"ký ức kiến thức được nhớ lại trong 7 ngày qua","loop.subtitleNone":"Tuần này chưa có ký ức nào được nhớ lại","loop.approxNote":"Xấp xỉ — theo dõi đầy đủ bắt đầu sau khi nâng cấp.","loop.sparkLabel":"30 ngày qua","roadmap.milestones":"Cột mốc","roadmap.keyLessons":"Bài học chính","radar.title":"Radar phủ kiến thức","radar.caption":"Ký ức kiến thức hoạt động (không tính session và commit)","radar.axis.lessons":"Bài học","radar.axis.decisions":"Quyết định","radar.axis.patterns":"Mẫu","radar.axis.bugs":"Sửa lỗi","radar.axis.processes":"Quy trình","radar.axis.architecture":"Kiến trúc","ageMatrix.title":"Phân bố tuổi ký ức","ageMatrix.low":"Thấp","ageMatrix.high":"Cao","ageMatrix.legend":"độ đậm = mật độ","ageMatrix.typeColumn":"Loại","header.signalModeOn":"Tín hiệu","header.signalModeOff":"Tất cả","header.signalModeOnHint":"Ẩn nhiễu session và commit. Nhấp để hiện tất cả.","header.signalModeOffHint":"Đang hiện tất cả ký ức bao gồm nhiễu. Nhấp để ẩn.","roadmap.phases":"Giai đoạn","onboarding.title":"Chào mừng đến với MeMesh","onboarding.body":"Bộ nhớ của bạn đang trống. Bắt đầu với tour 30 thực thể được tuyển chọn hoặc lưu bài học đầu tiên.","onboarding.llmHint":"Không cần LLM. Mọi thứ đều hoạt động chỉ với FTS5. LLM là tùy chọn để tự động tạo bài học — có thể cấu hình sau trong Cài đặt.","onboarding.seedButton":"Bắt đầu tour demo","onboarding.seedingButton":"Đang nạp…","onboarding.seedHint":"Thêm 30 ký ức ngay tại đây — không cần mở terminal","onboarding.cliReference":"Thích dùng CLI?","onboarding.hintDemo":"Khởi tạo 30 ký ức demo, có thể xóa sau","onboarding.hintReset":"Xóa tất cả mục có metadata.demo","onboarding.resetButton":"Xóa demo","onboarding.resettingButton":"Đang xóa…","onboarding.resetConfirm":"Xóa toàn bộ ký ức demo? Các mục bạn tự lưu vẫn được giữ lại.","onboarding.dismiss":"Đóng","common.serverError":"Máy chủ báo lỗi (HTTP {status}). Hãy thử lại — nếu vẫn xảy ra, chạy `memesh doctor`.","emptyLibrary.title":"Bộ nhớ của bạn đang trống","emptyLibrary.body":"Chưa có gì được lưu. Hãy nạp bản demo 30 mục để xem MeMesh hoạt động — có thể xóa sau chỉ với một cú nhấp.","browse.truncated":"đang hiển thị {shown} ký ức đầu tiên trong tổng số {total} — dùng tìm kiếm hoặc bộ lọc để xem phần còn lại","browse.truncatedUnknownTotal":"đang hiển thị {shown} ký ức đầu tiên — không đọc được tổng số, nên có thể còn nữa","graph.cappedNote":"Chỉ hiển thị {shown} thực thể hàng đầu trong {total} (theo số lần gợi nhớ) để giữ đồ thị mượt mà.","settings.testStoredKeyHint":"Để trống ô này để kiểm tra khóa đã lưu.","ageMatrix.bucket.week":"Tuần này","ageMatrix.bucket.month":"Tháng này","ageMatrix.bucket.quarter":"Quý này","ageMatrix.bucket.older":"Cũ hơn","settings.behaviourTitle":"Hành vi","settings.autoUpdateLabel":"Chính sách tự động cập nhật","settings.autoUpdateOff":"Tắt — chỉ thủ công","settings.autoUpdatePatch":"Patch — áp dụng X.Y.Z+1","settings.autoUpdateMinor":"Minor — áp dụng X.Y+1.0","settings.autoUpdateMajor":"Major — áp dụng mọi cấp","settings.autoUpdateHint":"Kích hoạt sau mỗi phiên. MEMESH_AUTO_UPDATE ưu tiên.","errors.timeout":"Yêu cầu đã hết thời gian chờ","type.lesson_learned":"Bài học","type.lesson":"Bài học","type.mistake":"Sai sót","type.decision":"Quyết định","type.architecture_decision":"QĐ kiến trúc","type.design_decision":"QĐ thiết kế","type.pattern":"Mẫu","type.technical_pattern":"Mẫu kỹ thuật","type.best_practice":"Best practice","type.bug_fix":"Sửa lỗi","type.verification_result":"Kết quả xác minh","type.test_result":"Kết quả kiểm thử","type.process":"Quy trình","type.architecture":"Kiến trúc","type.infrastructure":"Hạ tầng","type.feature":"Tính năng","type.release":"Bản phát hành","type.refactoring":"Tái cấu trúc","type.commit":"Commit","type.session_keypoint":"Điểm chính phiên","type.session_identity":"Danh tính phiên","type.session-insight":"Insight phiên","type.session-summary":"Tóm tắt phiên","type.session-identity":"Danh tính phiên","type.weekly_summary":"Tóm tắt tuần","type.weekly-summary":"Tóm tắt tuần","type.note":"Ghi chú","type.plan":"Kế hoạch","type.knowledge":"Kiến thức","type.workflow_checkpoint":"Mốc","type.concept":"Khái niệm","type.tool":"Công cụ","type.person":"Người","relation.relates_to":"liên quan đến","relation.related-to":"liên quan đến","relation.depends_on":"phụ thuộc vào","relation.implements":"hiện thực","relation.learned_from":"học từ","relation.supersedes":"thay thế","relation.contradicts":"mâu thuẫn","relation.follows":"tiếp nối","relation.belongs-to-project":"thuộc dự án","relation.evidences":"dẫn chứng","relation.co-created":"cùng tạo","relation.shares-name-tokens":"tên tương tự","patterns.day.0":"Chủ nhật","patterns.day.1":"Thứ hai","patterns.day.2":"Thứ ba","patterns.day.3":"Thứ tư","patterns.day.4":"Thứ năm","patterns.day.5":"Thứ sáu","patterns.day.6":"Thứ bảy","telemetry.flow.dreamer":"Tóm tắt tuần (dreamer)","telemetry.flow.pattern_detector":"Bộ phát hiện mẫu","telemetry.flow.digest_validator":"Bộ kiểm tra tóm tắt","telemetry.flow.guard_proposer":"Trình đề xuất guard","telemetry.flow.auto_tagger":"Gắn thẻ tự động","telemetry.flow.failure_analyzer":"Phân tích thất bại","telemetry.flow.transcript_extractor":"Khai thác bản ghi","telemetry.flow.conflict_judge":"Phán định xung đột","telemetry.errorClass.auth":"xác thực bị từ chối","telemetry.errorClass.rate_limit":"giới hạn tốc độ","telemetry.errorClass.upstream":"nhà cung cấp gặp sự cố","telemetry.errorClass.bad_request":"yêu cầu không hợp lệ","telemetry.errorClass.network":"mạng","telemetry.errorClass.parse":"phản hồi không đọc được","telemetry.errorClass.unknown":"không rõ","lessons.severity.critical":"Nghiêm trọng","lessons.severity.major":"Lớn","lessons.severity.minor":"Nhỏ","memory.tooltip.project":"Dự án","memory.tooltip.recalled":"Đã nhớ lại {count} lần","memory.tooltip.hasRelations":"Liên kết với {count} ký ức khác","memory.tooltip.createdAt":"Tạo lúc {date}","graph.layerLabel":"Lớp đồ thị","graph.layerWork":"Công việc","graph.layerAll":"Tất cả","graph.layerWorkHint":"Quyết định, bài học và kế hoạch — chính là công việc.","graph.layerAllHint":"Mọi ký ức memesh đã lưu, gồm cả ghi nhận tự động.","graph.layerFellBack":"Hiện có chưa tới {min} mục công việc nên hiển thị đồ thị đầy đủ. Ghi lại quyết định và bài học thì khung nhìn này sẽ đầy dần.","graph.evidenceFor":"Bằng chứng cho {node}","graph.evidenceClose":"Đóng","graph.evidenceLoading":"Đang tải bằng chứng…","graph.evidenceFailed":"Không tải được bằng chứng cho mục này.","graph.evidenceEmpty":"Mục này chưa có bằng chứng liên kết. Chạy `memesh kg backfill` để tạo liên kết từ commit và ghi nhận phiên làm việc.","graph.evidenceTruncated":"Đang hiển thị {shown} mục mới nhất; còn nhiều hơn.","graph.drift":"Độ mới","graph.driftHint":"Tô màu theo độ mới: đỏ = lâu không dùng, xanh lá = mới dùng gần đây","common.unknown":"không rõ","insights.entitiesCount":"{n} thực thể","roadmap.viewToggle":"Chế độ xem lộ trình","roadmap.viewTree":"Cây","roadmap.viewMindmap":"Sơ đồ tư duy","roadmap.mindmapNeedsPhases":"Sơ đồ tư duy cần ít nhất 3 ký ức trong vòng 7 ngày.","roadmap.activePhase":"đang diễn ra","roadmap.entryCount":"{count} mục","roadmap.entriesCount":"{count} mục","roadmap.otherGroup":"Khác ({count})","roadmap.lowSignalHidden":"(đã ẩn {count} tín hiệu thấp)","roadmap.resetHint":"Đặt lại thu phóng và vị trí (nhấp đúp nền cũng được)","roadmap.zoomHint":"cuộn để thu phóng · kéo để di chuyển · {pct}%","roadmap.moreEntities":"+{count} nữa","roadmap.viewDecisions":"Quyết định","roadmap.densityTitle":"Mật độ ghi nhận theo danh mục","roadmap.densityNote":"những gì memesh ghi nhận được — không phải mọi thứ đã xảy ra","roadmap.lineageSupersedes":"{n} đã bị thay thế","roadmap.lineageConflicts":"{n} xung đột chưa được giải quyết","adr.empty":'Dự án này chưa ghi nhận quyết định nào. Ghi lại một quyết định với loại "decision" và nó sẽ xuất hiện ở đây cùng lịch sử của nó.',"adr.statusActive":"hiện hành","adr.statusSuperseded":"đã bị thay thế","adr.supersedes":"thay thế","adr.supersededBy":"bị thay thế bởi","nav.ariaLabel":"Các mục bảng điều khiển","feedback.descLabel":"Nội dung phản hồi","graph.canvasA11y":"Đồ thị tri thức (vẽ trên canvas): {entities} thực thể, {relations} quan hệ, {orphans} chưa kết nối. Dùng bộ lọc loại và tìm kiếm ở trên để xem không trực quan."},es:{"auth.title":"Autenticación requerida","auth.intro":"Este panel está protegido por un token bearer. Pega el valor de MEMESH_REMOTE_TOKEN (o el contenido de <memeshDir>/remote-token) a continuación.","auth.tokenLabel":"Token","auth.empty":"El token no puede estar vacío.","auth.invalid":"Ese token no fue aceptado. Compruébalo e inténtalo de nuevo.","auth.submit":"Desbloquear panel","auth.tokenPlaceholder":"pega el token aquí","brand.subtitle":"powered by pcircle.com","header.connected":"Conectado","header.disconnected":"Desconectado","header.connecting":"Conectando…","header.memories":"memorias","telemetry.title":"Actividad del LLM","telemetry.lastNDays":"últimos {n}d","telemetry.loading":"cargando…","telemetry.empty":"Aún no hay actividad de IA en este período. Las filas aparecen automáticamente cuando se ejecutan las funciones de IA en segundo plano (como resúmenes semanales y etiquetado automático).","telemetry.callsCount":"{n} llamadas","telemetry.attemptsCount":"{n} intentos","telemetry.successRate":"éxito","telemetry.medianLatency":"latencia mediana","telemetry.fallbackUsed":"fallback usado {n}× ({pct} de las llamadas)","telemetry.byProvider":"por proveedor","telemetry.byModel":"por modelo","telemetry.byProject":"por proyecto","telemetry.errors":"errores","insights.title":"Lo que memesh hizo por ti","insights.subtitle":"recaps semanales y patterns generados automáticamente, esperando revisión","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"Todos","insights.refresh":"Actualizar","insights.loading":"cargando…","insights.emptyPending":"No hay insights pending. Ejecuta `memesh dream run` para generar weekly recaps.","insights.emptyNoLlm":"Configura un proveedor de LLM en Ajustes para activar weekly recaps y detección de patterns.","insights.emptyOther":"Nada por aquí.","insights.sources":"fuentes","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"Ver detalle","insights.collapse":"Contraer","insights.accept":"Aceptar","insights.applying":"Aplicando…","insights.reject":"Rechazar","insights.generatedBy":"Generado por","insights.promptVersion":"Versión del prompt","insights.observations":"Observaciones resumidas","insights.tags":"Etiquetas","insights.sourceIds":"Fuentes","insights.validationWarnings":"Afirmaciones marcadas (LLM validator)","insights.validationClaim":"Afirmación","insights.validationReason":"Motivo","insights.runDream":"Ejecutar weekly recap","insights.runDreamWithValidate":"Ejecutar con validator (más lento, mayor calidad)","banner.pendingInsights":"{n} nuevo(s) insight{s} esperando tu revisión →","banner.dismiss":"Descartar","banner.viewAll":"Ver todos","pattern.title":"Pattern","pattern.evidenceCount":"{n} evidencia(s)","pattern.severity":"Severidad","pattern.severity.high":"alta","pattern.severity.medium":"media","pattern.severity.low":"baja","pattern.description":"Descripción del pattern","tab.graph":"Grafo","tab.settings":"Configuración","tab.home":"Inicio","tab.memories":"Memorias","tab.project":"Proyecto","memories.searchPlaceholder":"Filtra mientras escribes — pulsa Enter para una búsqueda por relevancia","memories.scopeLabel":"Ámbito","memories.scopeWork":"Capa de trabajo","memories.scopeEvidence":"Evidencia","memories.scopeAll":"Todas","memories.scopeArchived":"Archivadas","memories.composition":"Composición","memories.rankedBy":"ordenadas por relevancia","memories.backToList":"Volver a la lista","memories.workEmpty":"Aún no hay memorias de la capa de trabajo — metas, decisiones, lecciones y planes aparecen aquí a medida que se capturan.","memories.showAll":"Mostrar todas las memorias","memories.expand":"Mostrar detalles","memories.collapse":"Ocultar detalles","home.analyticsTitle":"Análisis","home.analyticsHint":"Salud, línea de tiempo, patrones y uso — se expande bajo demanda","project.selectLabel":"Proyecto","project.selectPrompt":"Elige un proyecto para ver su historial.","project.empty":"Aún no hay memorias de proyecto. Trabaja en un repositorio git con los hooks de memesh instalados y su historia aparecerá aquí.","guard.sourceLesson":"Lección de origen","guard.pattern":"Patrón de activación","guard.message":"Advertencia que mostrará","guard.shouldMatch":"Debe activarse con","guard.shouldNotMatch":"Debe permanecer en silencio con","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.active":"activas","browse.archived":"archivadas","browse.refresh":"Actualizar","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.archiveFailed":"No se pudo archivar la memoria: {message}","browse.restoreFailed":"No se pudo restaurar la memoria: {message}","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","metrics.notMeasured":"Aún sin medir","metrics.health":"Salud","metrics.healthNote":"Actividad, calidad, frescura, lecciones","metrics.critical":"Lecciones críticas","metrics.criticalPartial":"de {tagged} clasificadas · {total} lecciones en total","metrics.criticalAll":"de {total} lecciones, todas clasificadas","metrics.criticalUnclassified":"{total} lecciones, ninguna clasificada por gravedad","metrics.criticalNoLessons":"Todavía no hay lecciones registradas","metrics.citation":"Citas","metrics.citationNote":"{cited} de {total} sesiones citaron una memoria","metrics.citationNotMeasured":"El registro de citas empieza en la próxima sesión","metrics.reused":"Reutilizadas esta semana","metrics.reusedNote":"Aproximado — según las fechas de último acceso","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.entityMeta":"{type} · confianza {confidence}% · {days} d sin uso","settings.capabilities":"Capacidades","settings.smartMode":"Modo inteligente","settings.core":"Base","settings.embeddings":"Embeddings","settings.llmProvider":"Proveedor LLM","settings.llmOptional.title":"LLM es opcional","settings.llmOptional.body":"memesh funciona sin LLM. El modo Core por defecto cubre búsqueda de texto completo, remember/recall manual, dashboard y captura de sesión mediante hooks.","settings.llmOptional.coreLabel":"Sin LLM (modo Core)","settings.llmOptional.coreFeatures":"búsqueda por palabra clave FTS5, remember/recall manual, dashboard, captura de sesión vía hooks","settings.llmOptional.smartLabel":"Con LLM (modo Smart)","settings.llmOptional.smartFeatures":"lesson_learned automático a partir de fallos de sesión, auto-etiquetado de nuevas entidades, resumen semanal + detección de patrones","settings.apiKey":"Clave API","settings.fallbacks.title":"Proveedores de respaldo","settings.fallbacks.explainer":"Si tu proveedor principal no está disponible, memesh prueba estos en orden hasta que uno funcione.","settings.fallbacks.privacyTitle":"Nota de privacidad","settings.fallbacks.privacyBody":"Añadir un proveedor en la nube (OpenAI o Anthropic) significa que, cuando tu proveedor principal esté caído, el contenido de tu memoria —que puede ser privado— se envía a ese proveedor en la nube. Si usas un proveedor local por privacidad, añade un respaldo en la nube solo si aceptas esta contrapartida.","settings.fallbacks.empty":"Aún no hay proveedores de respaldo.","settings.fallbacks.add":"Añadir proveedor de respaldo","settings.fallbacks.providerLabel":"Proveedor","settings.fallbacks.modelLabel":"Modelo (opcional)","settings.fallbacks.modelPlaceholder":"p. ej., gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"Hay una clave guardada. Déjalo en blanco para conservarla.","settings.fallbacks.remove":"Quitar","settings.fallbacks.moveUp":"Subir","settings.fallbacks.moveDown":"Bajar","settings.fallbacks.priority":"Prioridad {n}","settings.fallbacks.save":"Guardar cadena de respaldo","settings.fallbacks.needsKey":"Introduce una clave de API, o este respaldo en la nube no podrá usarse.","settings.model":"Modelo (opcional)","settings.save":"Guardar","settings.saving":"Guardando…","settings.saved":"Guardado.","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"Probar","settings.testing":"Probando…","settings.testPassed":"✓ Conexión OK · {count} modelos disponibles","settings.testFailed":"Error en la prueba de conexión","settings.suggested":"sugerido","settings.testRequired":"Pruebe la conexión antes de guardar","settings.language":"Idioma","settings.searchMode":"Modo de búsqueda","settings.none":"Ninguno","settings.updates":"Actualizaciones","settings.updateChecking":"Buscando actualizaciones…","settings.updateUnavailable":"No se pudo comprobar si hay actualizaciones ahora","settings.updateNoSuccessfulChecks":"Aún no hay comprobaciones de actualización correctas","settings.upToDate":"Ya está al día","settings.updateAvailable":"Actualización disponible","settings.updateStale":"El estado en caché mostrado puede estar desactualizado","settings.updateCachedFallback":"Usando el último resultado en caché correcto","settings.updateDeprecatedNoTarget":"Obsoleto — aún sin destino de actualización","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} fue marcado como OBSOLETO por los mantenedores.","settings.updatePartialTitle":"⚠️ Verificación de actualización parcial","settings.updatePartialDescription":"{message}. El estado de obsolescencia es desconocido en esta sesión — vuelva a ejecutar la verificación cuando esté en línea.","settings.updatePartialSummary":"Parcial — estado de obsolescencia desconocido","settings.updateDeprecatedTargetUnknown":"Obsoleto — buscando destino de actualización","settings.currentVersion":"Versión actual","settings.latestVersion":"Última versión","settings.lastChecked":"Última comprobación","settings.lastAttempted":"Último intento de comprobación","settings.lastSuccessful":"Última comprobación correcta","settings.updateSourceFresh":"Comprobación reciente","settings.updateSourceCached":"Usando resultado en caché","settings.updateSourceStale":"Usando resultado en caché desactualizado","settings.updateSourceUnavailable":"Sin resultado en caché","settings.updateCommand":"Comando de actualización","settings.checkNow":"Comprobar ahora","settings.updateLastError":"Error de la última comprobación: {message}","settings.installMethod":"Método de instalación","settings.installNpmGlobal":"instalación global con npm","settings.installNpmLocal":"instalación local del proyecto","settings.installSourceCheckout":"checkout del código fuente","settings.installUnknown":"desconocido","settings.updateGuidanceNpmGlobal":"Esta instalación se puede actualizar directamente desde MeMesh.","settings.updateGuidanceNpmLocal":"Actualiza esta instalación desde el gestor de paquetes del proyecto que instaló MeMesh.","settings.updateGuidanceSourceCheckout":"Actualiza este checkout desde su repositorio y vuelve a compilar.","settings.updateGuidanceUnknown":"Actualiza esta instalación con la herramienta o el flujo que instaló MeMesh.","graph.entities":"Entidades","graph.relations":"Relaciones","graph.orphans":"Huérfanos","graph.search":"Buscar nodos…","graph.matches":"coincidencias","graph.focusMode":"Enfoque","graph.showAll":"Mostrar todo","graph.clickHint":"Haz clic en un nodo para enfocar","graph.interactHint":"Clic en un nodo para enfocar · arrastra el área vacía para desplazar · rueda para zoom","graph.resetView":"Restablecer vista","graph.resetViewHint":"Restablecer zoom y posición","graph.ageToday":"hoy","graph.ageDaysAgo":"hace {count} d","graph.ageWeeksAgo":"hace {count} sem","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","feedback.submitting":"Recopilando diagnóstico…","doctorBanner.warnTitleSoft":"memesh tiene notas de configuración","doctorBanner.failTitle":"La configuración de memesh está incompleta","doctorBanner.dismiss":"Cerrar","doctorBanner.getHelp":"Obtener ayuda","doctorBanner.helpHint":"Abre un issue en GitHub con el diagnóstico ya rellenado","doctorBanner.preambleForIssue":"memesh doctor informó lo siguiente en mi instalación:","doctorBanner.moreCount":"…y {n} más — ejecuta `memesh doctor` para ver la lista completa","doctor.label.readme_locale_parity":"Traducciones del README","doctor.label.config":"Archivo de configuración","doctor.label.mcp-config":"Archivo de conexión MCP","doctor.label.hooks-config":"Definiciones de hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Conexión con Claude Code","doctor.label.hook-activity":"Captura automática","doctor.label.node-runtime":"Versión de Node.js","doctor.label.native-binding":"SQLite y búsqueda vectorial","doctor.label.shell-cli":"Comando de terminal","doctor.label.dashboard":"Archivos del panel","doctor.label.update-status":"Actualizaciones","doctor.label.http-probe":"Servidor local","doctor.label.skills-manifest":"Archivos incluidos","doctor.label.config_parse":"Archivo de configuración","doctor.label.embeddings_probe":"Búsqueda por significado","doctor.label.llm_probe":"Proveedor de IA","doctor.label.install-channel":"Método de instalación","doctor.label.fts_segmentation":"Índice de palabras clave","doctor.label.vector_index":"Índice de búsqueda","doctor.label.database":"Base de datos","doctor.msg.readme-parity.unreadable.summary":"No se pudo leer README.md: {detail}","doctor.msg.readme-parity.drift.summary":"Algunos README traducidos se desincronizaron del inglés: {detail}","doctor.msg.readme-parity.drift.fix":"Vuelve a sincronizar los README listados con README.md.","doctor.msg.config.invalid-json.summary":"El archivo de configuración en {path} no es JSON válido, así que se está ignorando.","doctor.msg.config.invalid-json.fix":"Arregla o borra {path}, y luego ejecuta `memesh config list` para confirmar que carga.","doctor.msg.mcp-config.missing.summary":"Falta el archivo que conecta memesh con Claude Code (.mcp.json).","doctor.msg.mcp-config.missing.fix":"Reinstala MeMesh para restaurarlo.","doctor.msg.mcp-config.invalid-json.summary":".mcp.json está dañado (no es JSON válido), así que Claude Code no puede leerlo.","doctor.msg.mcp-config.invalid-json.fix":"Arregla {path} o reinstala MeMesh.","doctor.msg.mcp-config.no-entry.summary":".mcp.json ya no contiene la entrada del servidor memesh.","doctor.msg.mcp-config.no-entry.fix":"Reinstala MeMesh para restaurarla.","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` arranca un archivo que no está en esta instalación, así que ninguna herramienta de memesh dentro de Claude Code puede iniciarse.","doctor.msg.mcp-config.entry-missing.fix":"Reinstala MeMesh. Si editaste `.mcp.json` a mano, vuelve a apuntarlo a `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.hooks-config.missing.summary":"Falta hooks/hooks.json, así que la captura automática de memoria no puede funcionar.","doctor.msg.hooks-config.missing.fix":"Reinstala MeMesh para restaurarlo.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json está dañado (no es JSON válido).","doctor.msg.hooks-config.invalid-json.fix":"Arregla {path} o reinstala MeMesh.","doctor.msg.hooks-config.missing-types.summary":"A hooks/hooks.json le faltan estos tipos de hook: {types}. Parte de la captura automática no se ejecutará.","doctor.msg.hooks-config.missing-types.fix":"Restaura la configuración de hooks original o reinstala MeMesh.","doctor.msg.hook-scripts.none.summary":"La configuración de hooks no tiene ningún script, así que nada puede capturarse automáticamente.","doctor.msg.hook-scripts.none.fix":"Reinstala MeMesh.","doctor.msg.hook-scripts.missing.summary":"Faltan estos scripts de hook: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstala MeMesh para restaurarlos.","doctor.msg.hook-scripts.not-executable.summary":"Estos scripts de hook existen pero no tienen permiso para ejecutarse: {files}","doctor.msg.hook-scripts.not-executable.fix":"Ejecuta `chmod +x scripts/hooks/*.js`, o `npm run build` si usas el código fuente.","doctor.msg.hook-wiring.no-marker.summary":"memesh aún no está conectado con Claude Code, así que nada se recuerda automáticamente.","doctor.msg.hook-wiring.no-marker.fix":"Ejecuta `memesh install-hooks` una vez, y luego `memesh doctor` para confirmar.","doctor.msg.hook-wiring.script-missing.summary":"Un hook memesh conectado apunta a {path}, que ya no existe — el agente invoca un archivo inexistente en cada evento correspondiente. Suele ser residuo de una actualización que retiró el hook.","doctor.msg.hook-wiring.script-missing.fix":"Ejecuta `memesh install-hooks` para reconectar (elimina entradas retiradas) y reinicia el agente.","doctor.msg.hook-wiring.marker-unreadable.summary":"El registro de conexión en {path} no se puede leer.","doctor.msg.hook-wiring.marker-unreadable.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.marker-malformed.summary":"El registro de conexión está dañado.","doctor.msg.hook-wiring.marker-malformed.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.settings-missing.summary":"El archivo de ajustes de Claude Code ({path}) desapareció, así que la conexión está rota.","doctor.msg.hook-wiring.settings-missing.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} está dañado (no es JSON válido).","doctor.msg.hook-wiring.settings-invalid.fix":"Restáuralo desde una copia de seguridad, o ejecuta `memesh install-hooks` para recrearlo.","doctor.msg.hook-wiring.entries-removed.summary":"Las entradas de memesh fueron eliminadas de {path}, así que la conexión está rota.","doctor.msg.hook-wiring.entries-removed.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.root-moved.summary":"La conexión apunta a {path}, que ya no existe (probablemente memesh se movió).","doctor.msg.hook-wiring.root-moved.fix":"Ejecuta `memesh install-hooks` para actualizarla.","doctor.msg.hook-activity.never-ran.summary":"Ningún hook de captura se ha ejecutado en las {hours} horas desde que empezó el seguimiento, aun con el cableado de hooks en su sitio — no se está guardando nada.","doctor.msg.hook-activity.never-ran.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor`. Si sigue diciendo que ningún hook se ejecutó, ejecuta `memesh install-hooks` y reinicia el agente.","doctor.msg.hook-activity.stale.summary":"El último hook de captura se ejecutó hace unas {hours} horas ({hook}). Si has trabajado desde entonces, la captura se detuvo y nada de esas sesiones se guardó.","doctor.msg.hook-activity.stale.fix":"Reinicia el agente, termina una sesión y vuelve a ejecutar `memesh doctor`. Si no se recupera, ejecuta `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"El hook session-summary se ejecutó por última vez hace unas {hours} horas, y tampoco llegó ninguna escritura de Claude Code en los últimos 3 días. Si esta máquina pasó a otro agente (Codex / Gemini), es lo esperado; si todavía usas Claude Code aquí, la captura se detuvo.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Si todavía usas Claude Code en esta máquina: reinícialo, termina una sesión y vuelve a ejecutar `memesh doctor`. Si no se recupera, ejecuta `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"No se pudo leer la actividad de los hooks en la base de datos: {detail}. El estado de la captura es desconocido, que no es lo mismo que sano.","doctor.msg.hook-activity.query-failed.fix":"Ejecuta `memesh doctor --verbose` para ver el error completo y comprueba que ~/.memesh se puede leer y que hay espacio en disco.","doctor.msg.hook-activity.stale-unknown.summary":"La marca de tiempo de la última ejecución del hook {hook} no se puede leer (corrupta, o escrita por una máquina con el reloj mal). El estado de la captura es «desconocido», que no es lo mismo que «sano».","doctor.msg.hook-activity.stale-unknown.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor` — una ejecución nueva sobrescribe la marca de tiempo dañada.","doctor.msg.hook-activity.disabled.summary":"La captura automática está desactivada (MEMESH_AUTO_CAPTURE o autoCapture en la configuración) — deliberadamente, así que el silencio de los hooks es lo esperado. Reactívala para volver a capturar sesiones.","doctor.msg.hook-activity.disabled-env.summary":"La captura automática está desactivada por MEMESH_AUTO_CAPTURE=false en el entorno de este shell. doctor solo ve su propio entorno — si tu agente corre sin esta variable, la captura allí no se ve afectada.","doctor.msg.hook-activity.not-wired.summary":"Ningún hook de captura se ha ejecutado nunca — y ningún hook de captura (Stop / PostToolUse / PreCompact) está confirmado como conectado en esta máquina, así que no hay nada que ejecutar.","doctor.msg.hook-activity.not-wired.fix":"Si quieres captura automática, ejecuta `memesh install-hooks`. Si esta instalación es solo MCP (Codex / Gemini), esto es lo esperado y puedes ignorarlo.","doctor.msg.hook-activity.stop-silent.summary":"El hook {hook} está sellando, pero el hook session-summary no se ha ejecutado ni una vez en las {hours} horas desde que empezó el seguimiento — la captura de sesiones puede estar rota, oculta tras la captura de commits.","doctor.msg.hook-activity.stop-silent.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor`. Si session-summary sigue sin ejecutarse, ejecuta `memesh install-hooks` y reinicia el agente.","doctor.msg.hook-activity.never-ran-legacy.summary":"Ningún hook ha sellado el latido, pero {captured} memorias de captura automática llegaron desde que empezó el seguimiento — probablemente siguen ejecutándose hooks de una versión anterior al seguimiento.","doctor.msg.hook-activity.never-ran-legacy.fix":"Actualiza los hooks de memesh a la versión actual (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) y reinicia el agente.","doctor.msg.node-runtime.too-old.summary":"Tu Node.js es más antiguo de lo que este paquete admite. {detail}","doctor.msg.node-runtime.too-old.fix":"Actualiza Node.js a {required} o más nuevo, y luego ejecuta `memesh doctor` de nuevo.","doctor.msg.native-binding.node-too-old.summary":"El SQLite integrado en esta versión de Node es demasiado antiguo para memesh: no puede cargar la parte que busca por significado. La versión completa llegó en Node 22.13.","doctor.msg.native-binding.node-too-old.fix":"Actualiza Node a 22.13 o posterior y vuelve a ejecutar `memesh doctor`.","doctor.msg.native-binding.not-installed.summary":"sqlite-vec no está instalado. Los recuerdos se siguen guardando y encontrando por palabra clave — solo se apaga la búsqueda por significado.","doctor.msg.native-binding.not-installed.fix":"Ejecuta `npm install` en la carpeta que usa @pcircle/memesh.","doctor.msg.native-binding.load-failed.summary":"No se pudo cargar sqlite-vec: {detail}. La búsqueda vuelve a usar solo palabras clave.","doctor.msg.native-binding.load-failed.fix":'Ejecuta: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"El comando `memesh` no está disponible en tu terminal. Las funciones de Claude Code siguen funcionando — esto solo afecta a escribir `memesh` tú mismo.","doctor.msg.shell-cli.not-on-path.fix":"Ejecuta `npm install -g @pcircle/memesh` para añadirlo. Ambas instalaciones comparten la misma memoria.","doctor.msg.dashboard.missing.summary":"Faltan los archivos del panel.","doctor.msg.dashboard.missing.fix":"Constrúyelos con `cd dashboard && npm install && npm run build`.","doctor.msg.update-status.no-cache.summary":"memesh aún no ha podido comprobar si hay versiones más nuevas.","doctor.msg.update-status.no-cache.fix":"Ejecuta `memesh status` una vez con conexión — eso guarda la respuesta y este aviso desaparece.","doctor.msg.update-status.deprecated.summary":"La versión {version} fue retirada por sus mantenedores: {detail}","doctor.msg.update-status.deprecated.fix":"Actualiza ahora — ejecuta `memesh update` (o sigue tu método de instalación).","doctor.msg.update-status.deprecation-unknown.summary":"No se pudo confirmar si la versión {version} sigue siendo segura: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"Ejecuta `memesh status` con conexión para reintentarlo.","doctor.msg.update-status.update-available.summary":"Hay una versión más nueva disponible: {latest} (tienes la {current}).","doctor.msg.update-status.update-available.fix":"Ejecuta `memesh update` para actualizar.","doctor.msg.update-status.stale.summary":"La versión {version} está al día, pero la información de actualizaciones es vieja.","doctor.msg.update-status.stale.fix":"Ejecuta `memesh status` con conexión para refrescarla.","doctor.msg.http-probe.bad-status.summary":"El servidor local en {url} respondió con un error (HTTP {status}).","doctor.msg.http-probe.bad-status.fix":"Reinícialo con `memesh serve` y revisa los registros.","doctor.msg.http-probe.no-server.summary":"No hay ningún servidor local corriendo en {url}.","doctor.msg.http-probe.no-server.fix":"Arranca uno con `memesh serve` si quieres el panel.","doctor.msg.skills-manifest.missing-dev.summary":"No se encontró la lista de integridad de archivos (normal al ejecutar desde el código fuente).","doctor.msg.skills-manifest.missing-dev.fix":"Ejecuta `npm run build` para generarla.","doctor.msg.skills-manifest.unreadable.summary":"La lista de integridad de archivos no se puede leer ({detail}).","doctor.msg.skills-manifest.unreadable.fix":"Reinstala: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.empty.summary":"La lista de integridad de archivos está vacía.","doctor.msg.skills-manifest.empty.fix":"Reinstala: `npm install -g @pcircle/memesh`.","doctor.msg.skills-manifest.verify-failed.summary":"Algunos archivos incluidos no coinciden con lo distribuido: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"Reinstala: `npm install -g @pcircle/memesh`. Si vuelve a pasar en una instalación limpia, repórtalo como un problema de seguridad.","doctor.msg.config-parse.not-object.summary":"El archivo de configuración en {path} no tiene el formato esperado, así que todos los ajustes se están ignorando.","doctor.msg.config-parse.not-object.fix":"Arregla o borra {path}, y luego ejecuta `memesh doctor` de nuevo.","doctor.msg.config-parse.unreadable.summary":"El archivo de configuración en {path} no se puede leer ({detail}), así que todos los ajustes se están ignorando.","doctor.msg.config-parse.unreadable.fix":"Arregla el archivo, o apártalo: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'La búsqueda por significado está configurada como "{provider}", pero no produjo nada en una prueba. La búsqueda por palabras clave sigue funcionando.',"doctor.msg.embeddings.empty.fix":"Ejecuta `memesh doctor --probe` para más detalle, o revisa la conexión con el proveedor.","doctor.msg.embeddings.threw.summary":'La búsqueda por significado está configurada como "{provider}", pero falló en una prueba: {detail}. La búsqueda por palabras clave sigue funcionando.',"doctor.msg.embeddings.threw.fix":"Revisa que el proveedor de embeddings esté accesible (p. ej. ejecuta `ollama serve`), o quita la config del embedder para usar solo búsqueda por palabras clave.","doctor.msg.llm.unreachable.summary":"El proveedor de IA ({provider}) no respondió: {detail}. Las funciones de IA no están haciendo nada, en silencio.","doctor.msg.llm.unreachable.fix":"Revisa la API key y la conexión, y luego ejecuta `memesh doctor --probe` de nuevo.","doctor.msg.llm.threw.summary":"La prueba del proveedor de IA ({provider}) falló: {detail}. Las funciones de IA no están haciendo nada, en silencio.","doctor.msg.llm.threw.fix":"Revisa la API key y la conexión, y luego ejecuta `memesh doctor --probe` de nuevo.","doctor.msg.install-channel.unknown.summary":"No se pudo saber cómo se instaló memesh.","doctor.msg.install-channel.unknown.fix":"Si es un checkout del código fuente, ejecuta desde la raíz del repositorio; si no, reinstala con `npm install -g @pcircle/memesh`.","doctor.msg.fts.unsegmented.summary":"El índice de palabras clave tiene {count} entradas en un formato antiguo — algunas memorias solo aparecen con su texto completo exacto.","doctor.msg.fts.unsegmented.fix":"Ejecuta `memesh reindex --fts` para reconstruir el índice.","doctor.msg.vector-index.stale.summary":"El índice de búsqueda necesita reconstruirse (cambiaron los ajustes de búsqueda).","doctor.msg.vector-index.stale.fix":"Ejecuta `memesh reindex` para reconstruirlo.","doctor.msg.vector-generation.open.summary":"Una reconstrucción de índice sin terminar está ocupando espacio en disco.","doctor.msg.vector-generation.open.fix":"Ejecuta `memesh reindex` para terminarla, o `memesh reindex --discard-generation` para liberar el espacio.","doctor.msg.database.broken.summary":"La base de datos no se puede usar: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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.","recall.summary":"{used} usadas / {total} inyectadas","analytics.loadFailed":"No se pudieron cargar las analíticas.","memory.noContent":"(sin contenido)","memory.archivedBadge":"archivada","memory.factsCount":"{count} datos","common.error":"Error","common.serverUnreachable":"No se pudo conectar con el servidor de memesh.","common.serverUnreachableAction":"Comprueba que `memesh serve` siga en ejecución y recarga esta página.","common.responseUnreadable":"El servidor respondió, pero esta página no pudo leer la respuesta: el dashboard y el servidor pueden estar desincronizados.","common.responseUnreadableAction":"Recarga la página. Si persiste, ejecuta `memesh doctor`.","pm.title":"Métricas de PM","pm.decisionsPerWeek":"decisiones/semana","pm.openDecisions":"decisiones abiertas (>14 d)","pm.orphanRate":"Memorias sin enlazar","pm.relationsTotal":"relaciones en total","pm.stalePlans":"{count} plan(es) sin revisar desde hace más de 30 días","common.loading":"Cargando…","common.noData":"Sin datos","errors.unknown":"Error desconocido","insights.noPreview":"Esta propuesta no tiene texto de resumen","httpError.auth.missing-bearer":"Este servidor requiere un token de acceso. Introduce tu token para continuar.","httpError.auth.invalid-token":"El token de acceso no fue aceptado. Verifícalo e inténtalo de nuevo.","httpError.auth.not-configured":"El servidor no tiene un token de acceso configurado. Reinicia `memesh serve` y revisa su salida.","httpError.validation.bad-body":"El servidor no pudo leer la solicitud que envió la página. Recarga la página e inténtalo de nuevo.","httpError.validation.bad-param":"Parte de la solicitud no es válida. Recarga la página e inténtalo de nuevo.","httpError.route.retired":"El servidor ya no admite esta acción: la página y el servidor pueden tener versiones distintas. Recarga la página.","httpError.route.not-found":"El servidor no reconoce esta solicitud: la página y el servidor pueden tener versiones distintas. Recarga la página.","httpError.resource.not-found":"Ese elemento ya no existe. Actualiza la lista.","httpError.payload.too-large":"Los datos enviados son demasiado grandes (más de 1 MB). Prueba con lotes más pequeños.","httpError.operation.failed":"El servidor no pudo completar esta acción.","httpError.llm.not-configured":"No hay proveedor de IA configurado. Añade uno en Ajustes primero.","httpError.rate.limited":"Demasiadas solicitudes en poco tiempo. Espera un momento e inténtalo de nuevo.","httpError.server.internal":"El servidor encontró un error inesperado.","settings.testError.auth":"La clave de API fue rechazada. Verifica la clave e inténtalo de nuevo.","settings.testError.network":"No se pudo contactar con el proveedor. Comprueba tu conexión de red.","settings.testError.no_models":"El proveedor respondió pero no devolvió modelos utilizables.","settings.testError.bad_host":"La dirección de Ollama debe estar en esta máquina (localhost).","settings.testError.http":"El proveedor devolvió un error (HTTP {status}).","settings.testError.unknown":"La prueba falló por un motivo desconocido.","time.justNow":"Ahora","time.hoursAgo":"Hace {count}h","time.today":"Hoy","time.yesterday":"Ayer","time.daysAgo":"Hace {count}d","time.lastWeek":"Semana pasada","time.weeksAgo":"Hace {count}sem","time.lastMonth":"Mes pasado","time.monthsAgo":"Hace {count}mes","memory.access.frequent":"Frecuente · {count} usos","memory.access.recalls":"{count} usos","memory.access.never":"Nunca usado","cluster.knowledge":"Conocimiento","cluster.activity":"Actividad","cluster.session":"Sesiones","cluster.reference":"Referencia","cluster.all":"Todo","browse.filterTime":"Tiempo","browse.filterValue":"Valor","browse.filterProject":"Proyecto","browse.filterSort":"Ordenar","browse.timeToday":"Hoy","browse.timeWeek":"Esta semana","browse.timeMonth":"Este mes","browse.timeOlder":"Más antiguo","browse.valueRecalled":"✓ Usado","browse.valueNever":"Nunca usado","browse.sortMostRecalled":"Más usado","browse.sortRecent":"Reciente","browse.sortCreated":"Creado","browse.emptyFilter":"Sin memorias en esta categoría — prueba otro filtro","lessons.stepsLabel":"pasos","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Sin campos estructurados — ver memoria sin procesar)","lessons.moreItems":"+{count} más","roadmap.title":"Hoja de Ruta","roadmap.summary":"{count} memorias · {first} → {last}","roadmap.switchToList":"↩ Vista de Lista","roadmap.switchToRoadmap":"🗺️ Vista de Hoja de Ruta","roadmap.emptyProject":"Sin memorias en este proyecto todavía.","loop.label":"Bucle de memoria","loop.subtitleHas":"memorias de conocimiento reusadas en los últimos 7 días","loop.subtitleNone":"Ninguna memoria reutilizada esta semana","loop.approxNote":"Aproximación — seguimiento completo comienza después de la actualización.","loop.sparkLabel":"Últimos 30 días","roadmap.milestones":"Hitos","roadmap.keyLessons":"Lecciones clave","radar.title":"Radar de cobertura","radar.caption":"Memorias de conocimiento activas (session y commit excluidos)","radar.axis.lessons":"Lecciones","radar.axis.decisions":"Decisiones","radar.axis.patterns":"Patrones","radar.axis.bugs":"Correcciones","radar.axis.processes":"Procesos","radar.axis.architecture":"Arquitectura","ageMatrix.title":"Distribución por edad","ageMatrix.low":"Bajo","ageMatrix.high":"Alto","ageMatrix.legend":"profundidad = densidad","ageMatrix.typeColumn":"Tipo","header.signalModeOn":"Señal","header.signalModeOff":"Todo","header.signalModeOnHint":"Ocultando ruido de session y commit. Clic para mostrar todo.","header.signalModeOffHint":"Mostrando todas las memorias incluido ruido. Clic para ocultar.","roadmap.phases":"Fases","onboarding.title":"Bienvenido a MeMesh","onboarding.body":"Tu almacén de memoria está vacío. Empieza con un tour de 30 entidades curadas o guarda tu primera lección.","onboarding.llmHint":"No se requiere LLM. Todo funciona solo con FTS5. Un LLM es opcional para la generación automática de lecciones — configúralo más tarde en Configuración.","onboarding.seedButton":"Iniciar el tour demo","onboarding.seedingButton":"Cargando…","onboarding.seedHint":"Añade 30 memorias aquí mismo — sin abrir terminal","onboarding.cliReference":"¿Prefieres la CLI?","onboarding.hintDemo":"Siembra 30 memorias demo que puedes limpiar después","onboarding.hintReset":"Elimina todo lo marcado con metadata.demo","onboarding.resetButton":"Resetear demo","onboarding.resettingButton":"Eliminando…","onboarding.resetConfirm":"¿Eliminar todas las memorias demo? Tus entradas reales se conservarán.","onboarding.dismiss":"Cerrar","common.serverError":"El servidor devolvió un error (HTTP {status}). Inténtalo de nuevo — si persiste, ejecuta `memesh doctor`.","emptyLibrary.title":"Tu memoria está vacía","emptyLibrary.body":"Aún no hay nada guardado. Carga el tour de demostración de 30 entradas para ver MeMesh en acción — puedes borrarlo luego con un clic.","browse.truncated":"mostrando las primeras {shown} de {total} memorias — usa la búsqueda o los filtros para llegar al resto","browse.truncatedUnknownTotal":"mostrando las primeras {shown} memorias — el total no está disponible, así que puede haber más","graph.cappedNote":"Mostrando las {shown} entidades más recordadas de {total} para mantener el grafo fluido.","settings.testStoredKeyHint":"Deja el campo vacío para probar la clave ya guardada.","ageMatrix.bucket.week":"Esta semana","ageMatrix.bucket.month":"Este mes","ageMatrix.bucket.quarter":"Este trimestre","ageMatrix.bucket.older":"Más antiguo","settings.behaviourTitle":"Comportamiento","settings.autoUpdateLabel":"Política de auto-actualización","settings.autoUpdateOff":"Apagado — solo manual","settings.autoUpdatePatch":"Patch — aplica X.Y.Z+1","settings.autoUpdateMinor":"Minor — aplica X.Y+1.0","settings.autoUpdateMajor":"Major — aplica cualquier cambio","settings.autoUpdateHint":"Activado tras cada sesión. MEMESH_AUTO_UPDATE tiene prioridad.","errors.timeout":"La solicitud agotó el tiempo de espera","type.lesson_learned":"Lección","type.lesson":"Lección","type.mistake":"Error","type.decision":"Decisión","type.architecture_decision":"Dec. arq.","type.design_decision":"Decisión de diseño","type.pattern":"Patrón","type.technical_pattern":"Patrón téc.","type.best_practice":"Buena práctica","type.bug_fix":"Corrección","type.verification_result":"Verificación","type.test_result":"Resultado de prueba","type.process":"Proceso","type.architecture":"Arquitectura","type.infrastructure":"Infraestructura","type.feature":"Característica","type.release":"Lanzamiento","type.refactoring":"Refactorización","type.commit":"Commit","type.session_keypoint":"Punto clave de sesión","type.session_identity":"Identidad de sesión","type.session-insight":"Insight de sesión","type.session-summary":"Resumen de sesión","type.session-identity":"Identidad de sesión","type.weekly_summary":"Resumen semanal","type.weekly-summary":"Resumen semanal","type.note":"Nota","type.plan":"Plan","type.knowledge":"Conocimiento","type.workflow_checkpoint":"Hito","type.concept":"Concepto","type.tool":"Herramienta","type.person":"Persona","relation.relates_to":"se relaciona con","relation.related-to":"relacionado con","relation.depends_on":"depende de","relation.implements":"implementa","relation.learned_from":"aprendido de","relation.supersedes":"reemplaza","relation.contradicts":"contradice","relation.follows":"sigue a","relation.belongs-to-project":"pertenece al proyecto","relation.evidences":"evidencia","relation.co-created":"cocreado","relation.shares-name-tokens":"nombres similares","patterns.day.0":"domingo","patterns.day.1":"lunes","patterns.day.2":"martes","patterns.day.3":"miércoles","patterns.day.4":"jueves","patterns.day.5":"viernes","patterns.day.6":"sábado","telemetry.flow.dreamer":"Resumen semanal (dreamer)","telemetry.flow.pattern_detector":"Detector de patrones","telemetry.flow.digest_validator":"Validador de resúmenes","telemetry.flow.guard_proposer":"Propositor de guardas","telemetry.flow.auto_tagger":"Auto-etiquetado","telemetry.flow.failure_analyzer":"Analizador de fallos","telemetry.flow.transcript_extractor":"Minero de transcripciones","telemetry.flow.conflict_judge":"Juez de conflictos","telemetry.errorClass.auth":"credencial rechazada","telemetry.errorClass.rate_limit":"límite de tasa","telemetry.errorClass.upstream":"fallo del proveedor","telemetry.errorClass.bad_request":"solicitud inválida","telemetry.errorClass.network":"red","telemetry.errorClass.parse":"respuesta ilegible","telemetry.errorClass.unknown":"desconocido","lessons.severity.critical":"Crítico","lessons.severity.major":"Mayor","lessons.severity.minor":"Menor","memory.tooltip.project":"Proyecto","memory.tooltip.recalled":"Recuperado {count} veces","memory.tooltip.hasRelations":"Vinculado a {count} otras memorias","memory.tooltip.createdAt":"Creado el {date}","graph.layerLabel":"Capa del grafo","graph.layerWork":"Trabajo","graph.layerAll":"Todo","graph.layerWorkHint":"Decisiones, lecciones y planes: el trabajo en sí.","graph.layerAllHint":"Todas las memorias que memesh ha guardado, incluida la captura automática.","graph.layerFellBack":"Hay menos de {min} elementos de trabajo, así que se muestra el grafo completo. Registra decisiones y lecciones y esta vista se irá llenando.","graph.evidenceFor":"Evidencia de {node}","graph.evidenceClose":"Cerrar","graph.evidenceLoading":"Cargando evidencia…","graph.evidenceFailed":"No se pudo cargar la evidencia de este elemento.","graph.evidenceEmpty":"Todavía no hay evidencia enlazada a este elemento. Ejecuta `memesh kg backfill` para crear esos enlaces desde los commits y las capturas de sesión.","graph.evidenceTruncated":"Mostrando las {shown} más recientes; hay más.","graph.drift":"Frescura","graph.driftHint":"Colorea los nodos por antigüedad: rojo = antiguo, verde = usado recientemente","common.unknown":"desconocido","insights.entitiesCount":"{n} entidades","roadmap.viewToggle":"Vista de hoja de ruta","roadmap.viewTree":"Árbol","roadmap.viewMindmap":"Mapa mental","roadmap.mindmapNeedsPhases":"El mapa mental necesita al menos 3 memorias en una ventana de 7 días.","roadmap.activePhase":"activa","roadmap.entryCount":"{count} entrada","roadmap.entriesCount":"{count} entradas","roadmap.otherGroup":"Otros ({count})","roadmap.lowSignalHidden":"({count} de señal baja ocultas)","roadmap.resetHint":"Restablecer zoom y posición (doble clic en el fondo también)","roadmap.zoomHint":"rueda para zoom · arrastra para mover · {pct}%","roadmap.moreEntities":"+{count} más","roadmap.viewDecisions":"Decisiones","roadmap.densityTitle":"Densidad de captura por categoría","roadmap.densityNote":"lo que memesh capturó — no todo lo que pasó","roadmap.lineageSupersedes":"{n} reemplazadas","roadmap.lineageConflicts":"{n} conflictos sin resolver","adr.empty":"Aún no hay decisiones registradas para este proyecto. Registra una con el tipo «decision» y aparecerá aquí con su historial.","adr.statusActive":"activa","adr.statusSuperseded":"reemplazada","adr.supersedes":"reemplaza","adr.supersededBy":"reemplazada por","nav.ariaLabel":"Secciones del panel","feedback.descLabel":"Descripción del comentario","graph.canvasA11y":"Grafo de conocimiento (en lienzo): {entities} entidades, {relations} relaciones, {orphans} sin conexión. Usa los filtros de tipo y la búsqueda de arriba para una vista no visual."},th:{"auth.title":"ต้องมีการยืนยันตัวตน","auth.intro":"แดชบอร์ดนี้ได้รับการป้องกันด้วย bearer token วางค่าของ MEMESH_REMOTE_TOKEN (หรือเนื้อหาของ <memeshDir>/remote-token) ด้านล่าง","auth.tokenLabel":"โทเค็น","auth.empty":"โทเค็นต้องไม่ว่างเปล่า","auth.invalid":"โทเค็นนี้ไม่ได้รับการยอมรับ กรุณาตรวจสอบแล้วลองใหม่อีกครั้ง","auth.submit":"ปลดล็อกแดชบอร์ด","auth.tokenPlaceholder":"วางโทเค็นที่นี่","brand.subtitle":"powered by pcircle.com","header.connected":"เชื่อมต่อแล้ว","header.disconnected":"ไม่ได้เชื่อมต่อ","header.connecting":"กำลังเชื่อมต่อ…","header.memories":"ความทรงจำ","telemetry.title":"กิจกรรม LLM","telemetry.lastNDays":"{n} วันล่าสุด","telemetry.loading":"กำลังโหลด…","telemetry.empty":"ยังไม่มีกิจกรรม AI ในช่วงนี้ แถวข้อมูลจะปรากฏโดยอัตโนมัติเมื่อฟีเจอร์ AI เบื้องหลัง (เช่น สรุปรายสัปดาห์และการติดแท็กอัตโนมัติ) ทำงาน","telemetry.callsCount":"{n} การเรียก","telemetry.attemptsCount":"{n} ครั้งที่พยายาม","telemetry.successRate":"สำเร็จ","telemetry.medianLatency":"เวลาตอบสนองมัธยฐาน","telemetry.fallbackUsed":"ใช้ fallback {n}× ({pct} ของการเรียก)","telemetry.byProvider":"ตามผู้ให้บริการ","telemetry.byModel":"ตามโมเดล","telemetry.byProject":"ตามโครงการ","telemetry.errors":"ข้อผิดพลาด","insights.title":"memesh ทำอะไรให้คุณบ้าง","insights.subtitle":"weekly recap และ pattern ที่ระบบสร้างอัตโนมัติ รอให้คุณตรวจสอบ","insights.statPending":"pending","insights.statApplied":"applied","insights.statRejected":"rejected","insights.filter.pending":"Pending","insights.filter.applied":"Applied","insights.filter.rejected":"Rejected","insights.filter.all":"ทั้งหมด","insights.refresh":"รีเฟรช","insights.loading":"กำลังโหลด…","insights.emptyPending":"ไม่มี insight ที่ pending รัน `memesh dream run` เพื่อสร้าง weekly recap","insights.emptyNoLlm":"ตั้งค่าผู้ให้บริการ LLM ในหน้าการตั้งค่าเพื่อเปิดใช้งาน weekly recap และการตรวจจับ pattern","insights.emptyOther":"ไม่มีข้อมูลที่นี่","insights.sources":"แหล่งที่มา","insights.status.pending":"pending","insights.status.applied":"applied","insights.status.rejected":"rejected","insights.viewDetail":"ดูรายละเอียด","insights.collapse":"ย่อ","insights.accept":"ยอมรับ","insights.applying":"กำลังนำไปใช้…","insights.reject":"ปฏิเสธ","insights.generatedBy":"สร้างโดย","insights.promptVersion":"เวอร์ชัน prompt","insights.observations":"สรุปการสังเกต","insights.tags":"แท็ก","insights.sourceIds":"entity ต้นทาง","insights.validationWarnings":"ข้อความที่ถูกตั้งคำถาม (LLM validator)","insights.validationClaim":"ข้อความ","insights.validationReason":"เหตุผล","insights.runDream":"รัน weekly recap","insights.runDreamWithValidate":"รันพร้อม validator (ช้ากว่าแต่คุณภาพสูงกว่า)","banner.pendingInsights":"มี insight ใหม่ {n} รายการรอให้คุณตรวจสอบ →","banner.dismiss":"ปิด","banner.viewAll":"ดูทั้งหมด","pattern.title":"Pattern","pattern.evidenceCount":"หลักฐาน {n} รายการ","pattern.severity":"ระดับความรุนแรง","pattern.severity.high":"สูง","pattern.severity.medium":"กลาง","pattern.severity.low":"ต่ำ","pattern.description":"คำอธิบาย pattern","tab.graph":"กราฟ","tab.settings":"ตั้งค่า","tab.home":"หน้าแรก","tab.memories":"ความทรงจำ","tab.project":"โปรเจกต์","memories.searchPlaceholder":"กรองขณะพิมพ์ — กด Enter เพื่อค้นหาตามความเกี่ยวข้อง","memories.scopeLabel":"ขอบเขต","memories.scopeWork":"เลเยอร์งาน","memories.scopeEvidence":"หลักฐาน","memories.scopeAll":"ทั้งหมด","memories.scopeArchived":"เก็บถาวร","memories.composition":"องค์ประกอบ","memories.rankedBy":"จัดอันดับตามความเกี่ยวข้อง","memories.backToList":"กลับไปที่รายการ","memories.workEmpty":"ยังไม่มีความทรงจำในเลเยอร์งาน — เป้าหมาย การตัดสินใจ บทเรียน และแผนจะปรากฏที่นี่เมื่อถูกบันทึก","memories.showAll":"แสดงความทรงจำทั้งหมด","memories.expand":"แสดงรายละเอียด","memories.collapse":"ซ่อนรายละเอียด","home.analyticsTitle":"วิเคราะห์","home.analyticsHint":"สุขภาพ ไทม์ไลน์ รูปแบบ และการใช้งาน — ขยายเมื่อต้องการ","project.selectLabel":"โปรเจกต์","project.selectPrompt":"เลือกโปรเจกต์เพื่อดูประวัติของมัน","project.empty":"ยังไม่มีความทรงจำของโปรเจกต์ ทำงานใน git repository ที่ติดตั้ง memesh hooks แล้วเรื่องราวของมันจะปรากฏที่นี่","guard.sourceLesson":"บทเรียนต้นทาง","guard.pattern":"รูปแบบทริกเกอร์","guard.message":"คำเตือนที่จะแสดง","guard.shouldMatch":"ต้องทริกเกอร์เมื่อ","guard.shouldNotMatch":"ต้องเงียบเมื่อ","search.button":"ค้นหา","search.searching":"กำลังค้นหา…","search.results":"ผลลัพธ์","search.result":"ผลลัพธ์","search.noResults":"ไม่พบผลลัพธ์สำหรับ","search.facts":"ข้อเท็จจริง","browse.title":"ความทรงจำทั้งหมด","browse.active":"ใช้งานอยู่","browse.archived":"เก็บถาวร","browse.refresh":"รีเฟรช","browse.noMatch":"ไม่พบความทรงจำที่ตรงกัน:","browse.prev":"← ก่อนหน้า","browse.next":"ถัดไป →","browse.archive":"เก็บถาวร","browse.restore":"กู้คืน","browse.confirmArchive":"เก็บถาวรความทรงจำนี้?","browse.archiveFailed":"เก็บถาวรไม่สำเร็จ: {message}","browse.restoreFailed":"กู้คืนไม่สำเร็จ: {message}","analytics.totalMemories":"ความทรงจำทั้งหมด","analytics.knowledgeFacts":"ข้อเท็จจริง","analytics.connections":"การเชื่อมต่อ","analytics.topics":"หัวข้อ","analytics.insights":"ข้อมูลเชิงลึก","analytics.thisWeek":"สัปดาห์นี้","analytics.new":"ใหม่","analytics.stale":"ไม่ได้ใช้งาน (30+ วัน)","analytics.archivedLabel":"เก็บถาวร","analytics.mostRecalled":"ถูกเรียกดูมากที่สุด","health.title":"สุขภาพหน่วยความจำ","metrics.notMeasured":"ยังไม่ได้วัด","metrics.health":"สุขภาพ","metrics.healthNote":"กิจกรรม คุณภาพ ความสดใหม่ บทเรียน","metrics.critical":"บทเรียนร้ายแรง","metrics.criticalPartial":"จาก {tagged} รายการที่จัดประเภทแล้ว · ทั้งหมด {total} บทเรียน","metrics.criticalAll":"จากทั้งหมด {total} บทเรียน จัดประเภทครบแล้ว","metrics.criticalUnclassified":"{total} บทเรียน ยังไม่ได้จัดระดับความร้ายแรง","metrics.criticalNoLessons":"ยังไม่มีบทเรียนที่บันทึกไว้","metrics.citation":"การอ้างอิง","metrics.citationNote":"{cited} จาก {total} เซสชันอ้างอิงความทรงจำ","metrics.citationNotMeasured":"การติดตามการอ้างอิงจะเริ่มในเซสชันถัดไป","metrics.reused":"ใช้ซ้ำสัปดาห์นี้","metrics.reusedNote":"ค่าประมาณ — นับจากเวลาที่เข้าถึงล่าสุด","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.entityMeta":"{type} · ความเชื่อมั่น {confidence}% · ไม่ได้ใช้มา {days} วัน","settings.capabilities":"ความสามารถ","settings.smartMode":"โหมดอัจฉริยะ","settings.core":"พื้นฐาน","settings.embeddings":"Embeddings","settings.llmProvider":"ผู้ให้บริการ LLM","settings.llmOptional.title":"LLM เป็นตัวเลือก","settings.llmOptional.body":"memesh ทำงานได้โดยไม่ต้องใช้ LLM โหมด Core เริ่มต้นครอบคลุมการเรียกคืนข้อความเต็ม remember/recall ด้วยตนเอง แดชบอร์ด และการจับ session ผ่าน hooks","settings.llmOptional.coreLabel":"ไม่มี LLM (โหมด Core)","settings.llmOptional.coreFeatures":"การค้นหาคำสำคัญ FTS5, remember/recall ด้วยตนเอง, แดชบอร์ด, การจับ session ผ่าน hooks","settings.llmOptional.smartLabel":"มี LLM (โหมด Smart)","settings.llmOptional.smartFeatures":"lesson_learned อัตโนมัติจากความล้มเหลวของ session, การติดแท็กอัตโนมัติของ entity ใหม่, สรุปประจำสัปดาห์และการตรวจจับรูปแบบ","settings.apiKey":"คีย์ API","settings.fallbacks.title":"ผู้ให้บริการสำรอง","settings.fallbacks.explainer":"หากผู้ให้บริการหลักไม่พร้อมใช้งาน memesh จะลองใช้รายการเหล่านี้ตามลำดับจนกว่าจะมีตัวที่ใช้งานได้","settings.fallbacks.privacyTitle":"หมายเหตุความเป็นส่วนตัว","settings.fallbacks.privacyBody":"การเพิ่มผู้ให้บริการบนคลาวด์ (OpenAI หรือ Anthropic) หมายความว่าเมื่อผู้ให้บริการหลักใช้งานไม่ได้ เนื้อหาความจำของคุณ ซึ่งอาจเป็นข้อมูลส่วนตัว จะถูกส่งไปยังผู้ให้บริการคลาวด์นั้น หากคุณใช้ผู้ให้บริการภายในเครื่องเพื่อความเป็นส่วนตัว ให้เพิ่มตัวสำรองบนคลาวด์เฉพาะเมื่อคุณยอมรับข้อแลกเปลี่ยนนี้","settings.fallbacks.empty":"ยังไม่มีผู้ให้บริการสำรอง","settings.fallbacks.add":"เพิ่มผู้ให้บริการสำรอง","settings.fallbacks.providerLabel":"ผู้ให้บริการ","settings.fallbacks.modelLabel":"โมเดล (ไม่บังคับ)","settings.fallbacks.modelPlaceholder":"เช่น gpt-4o-mini","settings.fallbacks.apiKeyStoredHint":"มีคีย์ที่บันทึกไว้แล้ว เว้นว่างไว้เพื่อเก็บคีย์เดิม","settings.fallbacks.remove":"ลบ","settings.fallbacks.moveUp":"เลื่อนขึ้น","settings.fallbacks.moveDown":"เลื่อนลง","settings.fallbacks.priority":"ลำดับความสำคัญ {n}","settings.fallbacks.save":"บันทึกลำดับสำรอง","settings.fallbacks.needsKey":"กรอกคีย์ API มิฉะนั้นจะใช้ตัวสำรองบนคลาวด์นี้ไม่ได้","settings.model":"โมเดล (ไม่บังคับ)","settings.save":"บันทึก","settings.saving":"กำลังบันทึก…","settings.saved":"บันทึกแล้ว","settings.removeProvider":"Remove provider","settings.removeProviderHint":"Drops apiKey + model. Falls back to env-var auto-detect or Core Mode (no LLM).","settings.removeProviderConfirm":"Remove the configured LLM provider? This drops the saved API key and model. memesh will fall back to env-var auto-detection (ANTHROPIC_API_KEY > OPENAI_API_KEY > OLLAMA_HOST) or run in Core Mode if no credential is found.","settings.providerRemoved":"Provider removed. memesh now runs in Core Mode or via env-var auto-detect.","settings.test":"ทดสอบ","settings.testing":"กำลังทดสอบ…","settings.testPassed":"✓ เชื่อมต่อสำเร็จ · มี {count} โมเดล","settings.testFailed":"การทดสอบการเชื่อมต่อล้มเหลว","settings.suggested":"แนะนำ","settings.testRequired":"โปรดทดสอบการเชื่อมต่อก่อนบันทึก","settings.language":"ภาษา","settings.searchMode":"โหมดการค้นหา","settings.none":"ไม่มี","settings.updates":"การอัปเดต","settings.updateChecking":"กำลังตรวจหาการอัปเดต…","settings.updateUnavailable":"ไม่สามารถตรวจสอบการอัปเดตได้ในขณะนี้","settings.updateNoSuccessfulChecks":"ยังไม่มีการตรวจสอบอัปเดตที่สำเร็จ","settings.upToDate":"เป็นเวอร์ชันล่าสุดแล้ว","settings.updateAvailable":"มีเวอร์ชันอัปเดต","settings.updateStale":"สถานะแคชที่แสดงอาจล้าสมัยแล้ว","settings.updateCachedFallback":"กำลังใช้ผลลัพธ์แคชล่าสุดที่ตรวจสอบสำเร็จ","settings.updateDeprecatedNoTarget":"เลิกใช้แล้ว — ยังไม่มีเวอร์ชันสำหรับอัปเกรด","settings.updateDeprecatedTitle":"⚠️ MeMesh {version} ถูกผู้ดูแลทำเครื่องหมายเป็น DEPRECATED (เลิกใช้แล้ว)","settings.updatePartialTitle":"⚠️ การตรวจสอบอัปเดตไม่สมบูรณ์","settings.updatePartialDescription":"{message}. ไม่สามารถยืนยันสถานะเลิกใช้ในเซสชันนี้ — โปรดเรียกใช้ใหม่เมื่อออนไลน์","settings.updatePartialSummary":"บางส่วน — ไม่ทราบสถานะการเลิกใช้","settings.updateDeprecatedTargetUnknown":"เลิกใช้แล้ว — กำลังหาเวอร์ชันสำหรับอัปเกรด","settings.currentVersion":"เวอร์ชันปัจจุบัน","settings.latestVersion":"เวอร์ชันล่าสุด","settings.lastChecked":"ตรวจสอบล่าสุด","settings.lastAttempted":"พยายามตรวจสอบล่าสุด","settings.lastSuccessful":"ตรวจสอบสำเร็จล่าสุด","settings.updateSourceFresh":"ตรวจสอบสด","settings.updateSourceCached":"ใช้ผลลัพธ์จากแคช","settings.updateSourceStale":"ใช้ผลลัพธ์แคชที่ล้าสมัย","settings.updateSourceUnavailable":"ไม่มีผลลัพธ์แคช","settings.updateCommand":"คำสั่งอัปเดต","settings.checkNow":"ตรวจสอบตอนนี้","settings.updateLastError":"ข้อผิดพลาดจากการตรวจสอบล่าสุด: {message}","settings.installMethod":"วิธีติดตั้ง","settings.installNpmGlobal":"ติดตั้ง npm แบบทั้งระบบ","settings.installNpmLocal":"ติดตั้งภายในโปรเจกต์","settings.installSourceCheckout":"เช็กเอาต์ซอร์สโค้ด","settings.installUnknown":"ไม่ทราบ","settings.updateGuidanceNpmGlobal":"การติดตั้งนี้อัปเดตจาก MeMesh ได้โดยตรง","settings.updateGuidanceNpmLocal":"ให้อัปเดตการติดตั้งนี้ผ่านตัวจัดการแพ็กเกจของโปรเจกต์ที่ติดตั้ง MeMesh","settings.updateGuidanceSourceCheckout":"ให้อัปเดต source checkout นี้จาก repository แล้ว build ใหม่","settings.updateGuidanceUnknown":"ให้อัปเดตการติดตั้งนี้ด้วยเครื่องมือหรือขั้นตอนที่ใช้ติดตั้ง MeMesh","graph.entities":"เอนทิตี","graph.relations":"ความสัมพันธ์","graph.orphans":"โหนดโดดเดี่ยว","graph.search":"ค้นหาโหนด…","graph.matches":"รายการที่ตรงกัน","graph.focusMode":"โฟกัส","graph.showAll":"แสดงทั้งหมด","graph.clickHint":"คลิกโหนดเพื่อโฟกัส","graph.interactHint":"คลิกโหนดเพื่อโฟกัส · ลากพื้นที่ว่างเพื่อเลื่อน · เลื่อนเพื่อซูม","graph.resetView":"รีเซ็ตมุมมอง","graph.resetViewHint":"รีเซ็ตการซูมและตำแหน่ง","graph.ageToday":"วันนี้","graph.ageDaysAgo":"{count} วันที่แล้ว","graph.ageWeeksAgo":"{count} สัปดาห์ที่แล้ว","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","feedback.submitting":"กำลังรวบรวมการวินิจฉัย…","doctorBanner.warnTitleSoft":"memesh มีบันทึกการตั้งค่า","doctorBanner.failTitle":"การตั้งค่า memesh ยังไม่สมบูรณ์","doctorBanner.dismiss":"ปิด","doctorBanner.getHelp":"ขอความช่วยเหลือ","doctorBanner.helpHint":"เปิด GitHub issue พร้อมข้อมูลการวินิจฉัยที่กรอกไว้แล้ว","doctorBanner.preambleForIssue":"memesh doctor รายงานสิ่งต่อไปนี้บนการติดตั้งของฉัน:","doctorBanner.moreCount":"…และอีก {n} รายการ — รัน `memesh doctor` เพื่อดูรายการทั้งหมด","doctor.label.readme_locale_parity":"คำแปล README","doctor.label.config":"ไฟล์ตั้งค่า","doctor.label.mcp-config":"ไฟล์เชื่อมต่อ MCP","doctor.label.hooks-config":"ข้อกำหนด hook","doctor.label.hook-scripts":"สคริปต์ hook","doctor.label.hook-wiring":"การเชื่อมต่อกับ Claude Code","doctor.label.hook-activity":"บันทึกอัตโนมัติ","doctor.label.node-runtime":"เวอร์ชัน Node.js","doctor.label.native-binding":"SQLite และการค้นหาแบบเวกเตอร์","doctor.label.shell-cli":"คำสั่งในเทอร์มินัล","doctor.label.dashboard":"ไฟล์แดชบอร์ด","doctor.label.update-status":"การอัปเดต","doctor.label.http-probe":"เซิร์ฟเวอร์ในเครื่อง","doctor.label.skills-manifest":"ไฟล์ที่มาพร้อมแพ็กเกจ","doctor.label.config_parse":"ไฟล์ตั้งค่า","doctor.label.embeddings_probe":"การค้นหาตามความหมาย","doctor.label.llm_probe":"ผู้ให้บริการ AI","doctor.label.install-channel":"วิธีติดตั้ง","doctor.label.fts_segmentation":"ดัชนีคำสำคัญ","doctor.label.vector_index":"ดัชนีการค้นหา","doctor.label.database":"ฐานข้อมูล","doctor.msg.readme-parity.unreadable.summary":"อ่าน README.md ไม่ได้: {detail}","doctor.msg.readme-parity.drift.summary":"README ฉบับแปลบางไฟล์ไม่ตรงกับฉบับภาษาอังกฤษแล้ว: {detail}","doctor.msg.readme-parity.drift.fix":"ปรับ README ที่ระบุให้ตรงกับ README.md อีกครั้ง","doctor.msg.config.invalid-json.summary":"ไฟล์ตั้งค่าที่ {path} ไม่ใช่ JSON ที่ถูกต้อง จึงถูกข้ามไป","doctor.msg.config.invalid-json.fix":"แก้หรือลบ {path} แล้วรัน `memesh config list` เพื่อยืนยันว่าโหลดได้","doctor.msg.mcp-config.missing.summary":"ไฟล์ที่เชื่อม memesh กับ Claude Code (.mcp.json) หายไป","doctor.msg.mcp-config.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.mcp-config.invalid-json.summary":".mcp.json เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง) Claude Code จึงอ่านไม่ได้","doctor.msg.mcp-config.invalid-json.fix":"แก้ {path} หรือติดตั้ง MeMesh ใหม่","doctor.msg.mcp-config.no-entry.summary":".mcp.json ไม่มีรายการเซิร์ฟเวอร์ memesh แล้ว","doctor.msg.mcp-config.no-entry.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.mcp-config.entry-missing.summary":"`.mcp.json` สั่งเปิดไฟล์ที่ไม่มีอยู่ในการติดตั้งนี้ เครื่องมือ memesh ทุกตัวใน Claude Code จึงเริ่มทำงานไม่ได้","doctor.msg.mcp-config.entry-missing.fix":"ติดตั้ง MeMesh ใหม่ ถ้าคุณแก้ `.mcp.json` เอง ให้ชี้กลับไปที่ `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json หายไป การบันทึกความจำอัตโนมัติจึงทำงานไม่ได้","doctor.msg.hooks-config.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง)","doctor.msg.hooks-config.invalid-json.fix":"แก้ {path} หรือติดตั้ง MeMesh ใหม่","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json ขาด hook ประเภทเหล่านี้: {types} การบันทึกอัตโนมัติบางส่วนจะไม่ทำงาน","doctor.msg.hooks-config.missing-types.fix":"กู้คืนการตั้งค่า hook ดั้งเดิม หรือติดตั้ง MeMesh ใหม่","doctor.msg.hook-scripts.none.summary":"การตั้งค่า hook ไม่มีสคริปต์เลย จึงบันทึกอะไรอัตโนมัติไม่ได้","doctor.msg.hook-scripts.none.fix":"ติดตั้ง MeMesh ใหม่","doctor.msg.hook-scripts.missing.summary":"สคริปต์ hook เหล่านี้หายไป: {files}","doctor.msg.hook-scripts.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.hook-scripts.not-executable.summary":"สคริปต์ hook เหล่านี้มีอยู่ แต่ไม่ได้รับอนุญาตให้รัน: {files}","doctor.msg.hook-scripts.not-executable.fix":"รัน `chmod +x scripts/hooks/*.js` หรือถ้าใช้ซอร์สโค้ดให้รัน `npm run build`","doctor.msg.hook-wiring.no-marker.summary":"memesh ยังไม่ได้เชื่อมกับ Claude Code จึงยังไม่มีอะไรถูกจดจำอัตโนมัติ","doctor.msg.hook-wiring.no-marker.fix":"รัน `memesh install-hooks` หนึ่งครั้ง แล้วรัน `memesh doctor` เพื่อยืนยัน","doctor.msg.hook-wiring.script-missing.summary":"hook ของ memesh ที่เชื่อมต่อไว้ชี้ไปที่ {path} ซึ่งไม่มีอยู่แล้ว — agent จะเรียกไฟล์ที่หายไปทุกครั้งที่เกิดเหตุการณ์ที่ตรงกัน มักเป็นซากจากการอัปเกรดที่เลิกใช้ hook นั้น","doctor.msg.hook-wiring.script-missing.fix":"รัน `memesh install-hooks` เพื่อเชื่อมต่อใหม่ (รายการที่เลิกใช้จะถูกลบ) แล้วรีสตาร์ต agent","doctor.msg.hook-wiring.marker-unreadable.summary":"อ่านบันทึกการเชื่อมต่อที่ {path} ไม่ได้","doctor.msg.hook-wiring.marker-unreadable.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.marker-malformed.summary":"บันทึกการเชื่อมต่อเสียหาย","doctor.msg.hook-wiring.marker-malformed.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.settings-missing.summary":"ไฟล์ตั้งค่าของ Claude Code ({path}) หายไป การเชื่อมต่อจึงขาด","doctor.msg.hook-wiring.settings-missing.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.settings-invalid.summary":"{path} เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง)","doctor.msg.hook-wiring.settings-invalid.fix":"กู้คืนจากไฟล์สำรอง หรือรัน `memesh install-hooks` เพื่อสร้างใหม่","doctor.msg.hook-wiring.entries-removed.summary":"รายการ memesh ถูกลบออกจาก {path} การเชื่อมต่อจึงขาด","doctor.msg.hook-wiring.entries-removed.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.root-moved.summary":"การเชื่อมต่อชี้ไปที่ {path} ซึ่งไม่มีอยู่แล้ว (memesh อาจถูกย้ายที่)","doctor.msg.hook-wiring.root-moved.fix":"รัน `memesh install-hooks` เพื่ออัปเดต","doctor.msg.hook-activity.never-ran.summary":"ไม่มี hook เก็บข้อมูลทำงานเลยตลอด {hours} ชั่วโมงนับตั้งแต่เริ่มติดตาม ทั้งที่การเชื่อมต่อ hook ปกติดี — ไม่มีอะไรถูกจดจำไว้เลย","doctor.msg.hook-activity.never-ran.fix":"ทำงานให้จบหนึ่งเซสชัน แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังบอกว่าไม่มี hook ทำงาน ให้รัน `memesh install-hooks` แล้วรีสตาร์ท agent","doctor.msg.hook-activity.stale.summary":"hook เก็บข้อมูลครั้งล่าสุดทำงานเมื่อประมาณ {hours} ชั่วโมงที่แล้ว ({hook}) ถ้าคุณทำงานหลังจากนั้น แปลว่าการเก็บข้อมูลหยุดไปแล้วและไม่มีอะไรจากเซสชันเหล่านั้นถูกบันทึก","doctor.msg.hook-activity.stale.fix":"รีสตาร์ท agent จบหนึ่งเซสชัน แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังไม่กลับมา ให้รัน `memesh install-hooks`","doctor.msg.hook-activity.stale-unconfirmed.summary":"hook session-summary รันครั้งล่าสุดประมาณ {hours} ชั่วโมงก่อน และ 3 วันที่ผ่านมาก็ไม่มีการเขียนจาก Claude Code เลย ถ้าเครื่องนี้ย้ายไปใช้ agent อื่น (Codex / Gemini) นี่เป็นเรื่องปกติ แต่ถ้ายังใช้ Claude Code ที่นี่ การเก็บบันทึกหยุดแล้ว","doctor.msg.hook-activity.stale-unconfirmed.fix":"ถ้ายังใช้ Claude Code บนเครื่องนี้: รีสตาร์ต จบเซสชันหนึ่งครั้ง แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังไม่ฟื้น ให้รัน `memesh install-hooks`","doctor.msg.hook-activity.query-failed.summary":'อ่านประวัติการทำงานของ hook จากฐานข้อมูลไม่ได้: {detail} สถานะการเก็บข้อมูลตอนนี้คือ "ไม่ทราบ" ซึ่งไม่เหมือนกับ "ปกติ"',"doctor.msg.hook-activity.query-failed.fix":"รัน `memesh doctor --verbose` เพื่อดูข้อความผิดพลาดเต็ม และตรวจว่า ~/.memesh อ่านได้และดิสก์ไม่เต็ม","doctor.msg.hook-activity.stale-unknown.summary":'อ่านเวลาการรันล่าสุดของ hook {hook} ไม่ได้ (ข้อมูลเสีย หรือถูกบันทึกโดยเครื่องที่นาฬิกาเพี้ยน) สถานะการเก็บบันทึกตอนนี้คือ "ไม่ทราบ" ซึ่งไม่เหมือนกับ "ปกติ"',"doctor.msg.hook-activity.stale-unknown.fix":"จบเซสชันงานหนึ่งครั้งแล้วรัน `memesh doctor` อีกครั้ง — การรันครั้งใหม่จะเขียนทับเวลาที่เสีย","doctor.msg.hook-activity.disabled.summary":"การเก็บบันทึกอัตโนมัติถูกปิดอยู่ (MEMESH_AUTO_CAPTURE หรือ autoCapture ในการตั้งค่า) — เป็นการตั้งใจ ดังนั้น hook เงียบจึงเป็นเรื่องที่คาดไว้ เปิดกลับเพื่อกลับมาเก็บบันทึกเซสชัน","doctor.msg.hook-activity.disabled-env.summary":"การเก็บบันทึกอัตโนมัติถูกปิดโดย MEMESH_AUTO_CAPTURE=false ในสภาพแวดล้อมของ shell นี้ doctor เห็นได้เฉพาะสภาพแวดล้อมของตัวเอง — ถ้า agent ของคุณรันโดยไม่มีตัวแปรนี้ การเก็บบันทึกฝั่งนั้นไม่ได้รับผลกระทบ","doctor.msg.hook-activity.not-wired.summary":"ไม่มี hook เก็บบันทึกใดเคยรันเลย — และบนเครื่องนี้ไม่พบการเชื่อมต่อ hook เก็บบันทึก (Stop / PostToolUse / PreCompact) ที่ยืนยันได้ จึงไม่มีอะไรให้รัน","doctor.msg.hook-activity.not-wired.fix":"ถ้าต้องการเก็บบันทึกอัตโนมัติ ให้รัน `memesh install-hooks` ถ้าการติดตั้งนี้ใช้เฉพาะ MCP (Codex / Gemini) นี่เป็นเรื่องปกติและข้ามได้","doctor.msg.hook-activity.stop-silent.summary":"hook {hook} ยังประทับเวลาอยู่ แต่ hook session-summary ไม่เคยรันเลยสักครั้งตลอด {hours} ชั่วโมงนับตั้งแต่เริ่มติดตาม — การเก็บบันทึกเซสชันอาจพังอยู่ โดยถูกการเก็บบันทึก commit บังไว้","doctor.msg.hook-activity.stop-silent.fix":"จบเซสชันงานหนึ่งครั้งแล้วรัน `memesh doctor` อีกครั้ง ถ้า session-summary ยังไม่รัน ให้รัน `memesh install-hooks` แล้วรีสตาร์ต agent","doctor.msg.hook-activity.never-ran-legacy.summary":"ไม่มี hook ใดประทับเวลาหัวใจเต้นเลย แต่นับตั้งแต่เริ่มติดตามมีความทรงจำจากการเก็บบันทึกอัตโนมัติ {captured} รายการเข้ามา — น่าจะเป็น hook รุ่นเก่าก่อนมีระบบติดตามที่ยังรันอยู่","doctor.msg.hook-activity.never-ran-legacy.fix":"อัปเดต hook ของ memesh เป็นรุ่นปัจจุบัน (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) แล้วรีสตาร์ต agent","doctor.msg.node-runtime.too-old.summary":"Node.js ของคุณเก่ากว่าที่แพ็กเกจนี้รองรับ {detail}","doctor.msg.node-runtime.too-old.fix":"อัปเกรด Node.js เป็น {required} ขึ้นไป แล้วรัน `memesh doctor` อีกครั้ง","doctor.msg.native-binding.node-too-old.summary":"SQLite ที่มากับ Node รุ่นนี้เก่าเกินไปสำหรับ memesh จึงโหลดส่วนที่ค้นหาตามความหมายไม่ได้ รุ่นที่สมบูรณ์มีตั้งแต่ Node 22.13","doctor.msg.native-binding.node-too-old.fix":"อัปเกรด Node เป็น 22.13 ขึ้นไป แล้วรัน `memesh doctor` อีกครั้ง","doctor.msg.native-binding.not-installed.summary":"ยังไม่ได้ติดตั้ง sqlite-vec ความทรงจำยังถูกบันทึกและค้นด้วยคำสำคัญได้ เพียงแต่ปิดการค้นหาตามความหมาย","doctor.msg.native-binding.not-installed.fix":"รัน `npm install` ในโฟลเดอร์ที่ใช้ @pcircle/memesh","doctor.msg.native-binding.load-failed.summary":"โหลด sqlite-vec ไม่สำเร็จ: {detail} การค้นหาจะใช้คำสำคัญอย่างเดียว","doctor.msg.native-binding.load-failed.fix":'รัน: cd "{root}" && npm install --omit=dev',"doctor.msg.shell-cli.not-on-path.summary":"ใช้คำสั่ง `memesh` ในเทอร์มินัลไม่ได้ ฟีเจอร์ของ Claude Code ยังทำงานปกติ — กระทบแค่ตอนคุณพิมพ์ `memesh` เองเท่านั้น","doctor.msg.shell-cli.not-on-path.fix":"รัน `npm install -g @pcircle/memesh` เพื่อเพิ่มคำสั่ง ทั้งสองการติดตั้งใช้ความจำชุดเดียวกัน","doctor.msg.dashboard.missing.summary":"ไฟล์แดชบอร์ดหายไป","doctor.msg.dashboard.missing.fix":"สร้างด้วย `cd dashboard && npm install && npm run build`","doctor.msg.update-status.no-cache.summary":"memesh ยังเช็กไม่สำเร็จว่ามีเวอร์ชันใหม่กว่าหรือไม่","doctor.msg.update-status.no-cache.fix":"รัน `memesh status` หนึ่งครั้งตอนต่อเน็ต — ผลจะถูกเก็บไว้และข้อความนี้จะหายไป","doctor.msg.update-status.deprecated.summary":"เวอร์ชัน {version} ถูกผู้ดูแลถอนออกแล้ว: {detail}","doctor.msg.update-status.deprecated.fix":"อัปเดตทันที — รัน `memesh update` (หรือทำตามวิธีติดตั้งของคุณ)","doctor.msg.update-status.deprecation-unknown.summary":"ยืนยันไม่ได้ว่าเวอร์ชัน {version} ยังปลอดภัยอยู่หรือไม่: {detail}","doctor.msg.update-status.deprecation-unknown.fix":"รัน `memesh status` ตอนต่อเน็ตเพื่อลองใหม่","doctor.msg.update-status.update-available.summary":"มีเวอร์ชันใหม่กว่า: {latest} (คุณใช้ {current} อยู่)","doctor.msg.update-status.update-available.fix":"รัน `memesh update` เพื่ออัปเกรด","doctor.msg.update-status.stale.summary":"เวอร์ชัน {version} เป็นรุ่นล่าสุดแล้ว แต่ข้อมูลอัปเดตเก่าไปหน่อย","doctor.msg.update-status.stale.fix":"รัน `memesh status` ตอนต่อเน็ตเพื่อรีเฟรช","doctor.msg.http-probe.bad-status.summary":"เซิร์ฟเวอร์ในเครื่องที่ {url} ตอบกลับมาเป็นข้อผิดพลาด (HTTP {status})","doctor.msg.http-probe.bad-status.fix":"รีสตาร์ตด้วย `memesh serve` แล้วดูล็อก","doctor.msg.http-probe.no-server.summary":"ไม่มีเซิร์ฟเวอร์ในเครื่องรันอยู่ที่ {url}","doctor.msg.http-probe.no-server.fix":"ถ้าอยากใช้แดชบอร์ด ให้เริ่มด้วย `memesh serve`","doctor.msg.skills-manifest.missing-dev.summary":"ไม่พบรายการตรวจสอบความครบถ้วนของไฟล์ (เป็นเรื่องปกติเมื่อรันจากซอร์สโค้ด)","doctor.msg.skills-manifest.missing-dev.fix":"รัน `npm run build` เพื่อสร้าง","doctor.msg.skills-manifest.unreadable.summary":"อ่านรายการตรวจสอบความครบถ้วนของไฟล์ไม่ได้ ({detail})","doctor.msg.skills-manifest.unreadable.fix":"ติดตั้งใหม่: `npm install -g @pcircle/memesh`","doctor.msg.skills-manifest.empty.summary":"รายการตรวจสอบความครบถ้วนของไฟล์ว่างเปล่า","doctor.msg.skills-manifest.empty.fix":"ติดตั้งใหม่: `npm install -g @pcircle/memesh`","doctor.msg.skills-manifest.verify-failed.summary":"ไฟล์ที่มาพร้อมแพ็กเกจบางไฟล์ไม่ตรงกับที่จัดส่ง: {detail}","doctor.msg.skills-manifest.verify-failed.fix":"ติดตั้งใหม่: `npm install -g @pcircle/memesh` ถ้าติดตั้งใหม่แล้วยังเกิดอีก ให้รายงานเป็นปัญหาความปลอดภัย","doctor.msg.config-parse.not-object.summary":"ไฟล์ตั้งค่าที่ {path} ไม่ได้อยู่ในรูปแบบที่คาดไว้ การตั้งค่าทั้งหมดจึงถูกข้ามไป","doctor.msg.config-parse.not-object.fix":"แก้หรือลบ {path} แล้วรัน `memesh doctor` อีกครั้ง","doctor.msg.config-parse.unreadable.summary":"อ่านไฟล์ตั้งค่าที่ {path} ไม่ได้ ({detail}) การตั้งค่าทั้งหมดจึงถูกข้ามไป","doctor.msg.config-parse.unreadable.fix":"แก้ไฟล์ หรือย้ายออกไปก่อน: mv {path} {path}.bak","doctor.msg.embeddings.empty.summary":'การค้นหาตามความหมายตั้งเป็น "{provider}" แต่ทดสอบแล้วไม่ได้ผลลัพธ์อะไรเลย การค้นหาด้วยคำสำคัญยังใช้ได้',"doctor.msg.embeddings.empty.fix":"รัน `memesh doctor --probe` เพื่อดูรายละเอียด หรือเช็กการเชื่อมต่อกับผู้ให้บริการ","doctor.msg.embeddings.threw.summary":'การค้นหาตามความหมายตั้งเป็น "{provider}" แต่ทดสอบแล้วล้มเหลว: {detail} การค้นหาด้วยคำสำคัญยังใช้ได้',"doctor.msg.embeddings.threw.fix":"ตรวจสอบว่าผู้ให้บริการ embedding เชื่อมต่อได้ (เช่น รัน `ollama serve`) หรือลบการตั้งค่า embedder เพื่อใช้การค้นหาด้วยคีย์เวิร์ดอย่างเดียว","doctor.msg.llm.unreachable.summary":"ผู้ให้บริการ AI ({provider}) ไม่ตอบกลับ: {detail} ฟีเจอร์ AI กำลังนิ่งเงียบโดยไม่ทำอะไรเลย","doctor.msg.llm.unreachable.fix":"เช็ก API key และการเชื่อมต่อ แล้วรัน `memesh doctor --probe` อีกครั้ง","doctor.msg.llm.threw.summary":"ทดสอบผู้ให้บริการ AI ({provider}) ล้มเหลว: {detail} ฟีเจอร์ AI กำลังนิ่งเงียบโดยไม่ทำอะไรเลย","doctor.msg.llm.threw.fix":"เช็ก API key และการเชื่อมต่อ แล้วรัน `memesh doctor --probe` อีกครั้ง","doctor.msg.install-channel.unknown.summary":"บอกไม่ได้ว่า memesh ถูกติดตั้งมาอย่างไร","doctor.msg.install-channel.unknown.fix":"ถ้าเป็นซอร์สโค้ด ให้รันจากโฟลเดอร์รากของ repo ไม่อย่างนั้นให้ติดตั้งใหม่ด้วย `npm install -g @pcircle/memesh`","doctor.msg.fts.unsegmented.summary":"ดัชนีคำสำคัญมี {count} รายการที่เป็นรูปแบบเก่า — ความจำบางส่วนจะเจอก็ต่อเมื่อพิมพ์ข้อความเต็มตรงเป๊ะเท่านั้น","doctor.msg.fts.unsegmented.fix":"รัน `memesh reindex --fts` เพื่อสร้างดัชนีใหม่","doctor.msg.vector-index.stale.summary":"ดัชนีการค้นหาต้องสร้างใหม่ (การตั้งค่าการค้นหาเปลี่ยนไป)","doctor.msg.vector-index.stale.fix":"รัน `memesh reindex` เพื่อสร้างใหม่","doctor.msg.vector-generation.open.summary":"การสร้างดัชนีใหม่ที่ยังไม่เสร็จกำลังใช้พื้นที่ดิสก์อยู่","doctor.msg.vector-generation.open.fix":"รัน `memesh reindex` เพื่อทำให้เสร็จ หรือ `memesh reindex --discard-generation` เพื่อคืนพื้นที่","doctor.msg.database.broken.summary":"ฐานข้อมูลใช้งานไม่ได้: {detail}","doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","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":"ยังไม่มีข้อมูล การติดตามจะเริ่มหลังเซสชันถัดไป","recall.summary":"ใช้แล้ว {used} / ใส่เข้าไป {total}","analytics.loadFailed":"โหลดข้อมูลวิเคราะห์ไม่สำเร็จ","memory.noContent":"(ไม่มีเนื้อหา)","memory.archivedBadge":"เก็บถาวรแล้ว","memory.factsCount":"{count} ข้อเท็จจริง","common.error":"ข้อผิดพลาด","common.serverUnreachable":"ไม่สามารถเชื่อมต่อเซิร์ฟเวอร์ memesh ได้","common.serverUnreachableAction":"ตรวจสอบว่า `memesh serve` ยังทำงานอยู่ แล้วโหลดหน้านี้ใหม่","common.responseUnreadable":"เซิร์ฟเวอร์ตอบกลับแล้ว แต่หน้านี้อ่านคำตอบไม่ได้ — เวอร์ชันของแดชบอร์ดกับเซิร์ฟเวอร์อาจไม่ตรงกัน","common.responseUnreadableAction":"โหลดหน้านี้ใหม่ หากยังเกิดขึ้นอีก ให้รัน `memesh doctor`","pm.title":"ตัวชี้วัด PM","pm.decisionsPerWeek":"การตัดสินใจ/สัปดาห์","pm.openDecisions":"การตัดสินใจค้าง (>14 วัน)","pm.orphanRate":"ความจำที่ไม่ได้เชื่อมโยง","pm.relationsTotal":"ความสัมพันธ์ทั้งหมด","pm.stalePlans":"แผน {count} รายการไม่ได้ทบทวนเกิน 30 วัน","common.loading":"กำลังโหลด…","common.noData":"ไม่มีข้อมูล","errors.unknown":"เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ","insights.noPreview":"ข้อเสนอนี้ไม่มีข้อความสรุป","httpError.auth.missing-bearer":"เซิร์ฟเวอร์นี้ต้องใช้โทเค็นการเข้าถึง กรุณากรอกโทเค็นเพื่อดำเนินการต่อ","httpError.auth.invalid-token":"โทเค็นการเข้าถึงไม่ถูกต้อง กรุณาตรวจสอบแล้วลองอีกครั้ง","httpError.auth.not-configured":"เซิร์ฟเวอร์ยังไม่ได้ตั้งค่าโทเค็นการเข้าถึง กรุณารีสตาร์ท `memesh serve` แล้วดูข้อความที่แสดง","httpError.validation.bad-body":"เซิร์ฟเวอร์อ่านคำขอที่หน้านี้ส่งไปไม่ได้ กรุณารีเฟรชหน้าแล้วลองอีกครั้ง","httpError.validation.bad-param":"ข้อมูลบางส่วนในคำขอไม่ถูกต้อง กรุณารีเฟรชหน้าแล้วลองอีกครั้ง","httpError.route.retired":"เซิร์ฟเวอร์ไม่รองรับการทำงานนี้แล้ว หน้าเว็บกับเซิร์ฟเวอร์อาจเป็นคนละเวอร์ชัน กรุณารีเฟรชหน้า","httpError.route.not-found":"เซิร์ฟเวอร์ไม่รู้จักคำขอนี้ หน้าเว็บกับเซิร์ฟเวอร์อาจเป็นคนละเวอร์ชัน กรุณารีเฟรชหน้า","httpError.resource.not-found":"รายการนี้ไม่มีอยู่แล้ว กรุณารีเฟรชรายการ","httpError.payload.too-large":"ข้อมูลที่ส่งใหญ่เกินไป (เกิน 1 MB) กรุณาแบ่งเป็นชุดเล็กลง","httpError.operation.failed":"เซิร์ฟเวอร์ไม่สามารถทำงานนี้ให้เสร็จได้","httpError.llm.not-configured":"ยังไม่ได้ตั้งค่าผู้ให้บริการ AI กรุณาเพิ่มในหน้าตั้งค่าก่อน","httpError.rate.limited":"มีคำขอมากเกินไปในช่วงเวลาสั้น ๆ กรุณารอสักครู่แล้วลองใหม่อีกครั้ง","httpError.server.internal":"เซิร์ฟเวอร์เกิดข้อผิดพลาดที่ไม่คาดคิด","settings.testError.auth":"คีย์ API ถูกปฏิเสธ กรุณาตรวจสอบคีย์แล้วลองอีกครั้ง","settings.testError.network":"ติดต่อผู้ให้บริการไม่ได้ กรุณาตรวจสอบการเชื่อมต่อเครือข่าย","settings.testError.no_models":"ผู้ให้บริการตอบกลับแต่ไม่ได้ส่งโมเดลที่ใช้งานได้มา","settings.testError.bad_host":"ที่อยู่ Ollama ต้องอยู่บนเครื่องนี้ (localhost)","settings.testError.http":"ผู้ให้บริการส่งข้อผิดพลาดกลับมา (HTTP {status})","settings.testError.unknown":"การทดสอบล้มเหลวโดยไม่ทราบสาเหตุ","time.justNow":"เมื่อสักครู่","time.hoursAgo":"{count} ชั่วโมงที่แล้ว","time.today":"วันนี้","time.yesterday":"เมื่อวาน","time.daysAgo":"{count} วันที่แล้ว","time.lastWeek":"สัปดาห์ที่แล้ว","time.weeksAgo":"{count} สัปดาห์ที่แล้ว","time.lastMonth":"เดือนที่แล้ว","time.monthsAgo":"{count} เดือนที่แล้ว","memory.access.frequent":"ใช้บ่อย · {count} ครั้ง","memory.access.recalls":"{count} ครั้ง","memory.access.never":"ไม่เคยเรียก","cluster.knowledge":"ความรู้","cluster.activity":"กิจกรรม","cluster.session":"เซสชัน","cluster.reference":"อ้างอิง","cluster.all":"ทั้งหมด","browse.filterTime":"เวลา","browse.filterValue":"มูลค่า","browse.filterProject":"โปรเจกต์","browse.filterSort":"จัดเรียง","browse.timeToday":"วันนี้","browse.timeWeek":"สัปดาห์นี้","browse.timeMonth":"เดือนนี้","browse.timeOlder":"เก่ากว่า","browse.valueRecalled":"✓ ใช้แล้ว","browse.valueNever":"ไม่เคยเรียก","browse.sortMostRecalled":"ใช้มากที่สุด","browse.sortRecent":"ล่าสุด","browse.sortCreated":"สร้างเมื่อ","browse.emptyFilter":"ไม่มีหน่วยความจำในหมวดนี้ — ลองตัวกรองอื่น","lessons.stepsLabel":"ขั้น","lessons.commitsCount":"{count} commits","lessons.unstructured":"(ไม่มีฟิลด์ที่มีโครงสร้าง — ดูหน่วยความจำดิบ)","lessons.moreItems":"+{count} เพิ่มเติม","roadmap.title":"แผนที่โครงการ","roadmap.summary":"{count} ความทรงจำ · {first} → {last}","roadmap.switchToList":"↩ มุมมองรายการ","roadmap.switchToRoadmap":"🗺️ มุมมองแผนที่","roadmap.emptyProject":"ยังไม่มีความทรงจำในโครงการนี้","loop.label":"ลูปความทรงจำ","loop.subtitleHas":"ความทรงจำเชิงความรู้ที่ถูกเรียกในช่วง 7 วันที่ผ่านมา","loop.subtitleNone":"สัปดาห์นี้ยังไม่มีความทรงจำที่ถูกเรียก","loop.approxNote":"ค่าประมาณ — การติดตามเต็มรูปแบบเริ่มหลังการอัพเกรด","loop.sparkLabel":"30 วันล่าสุด","roadmap.milestones":"เหตุการณ์สำคัญ","roadmap.keyLessons":"บทเรียนสำคัญ","radar.title":"เรดาร์ความครอบคลุม","radar.caption":"ความทรงจำที่ใช้งาน (ไม่รวม session และ commit)","radar.axis.lessons":"บทเรียน","radar.axis.decisions":"การตัดสินใจ","radar.axis.patterns":"แพทเทิร์น","radar.axis.bugs":"แก้ไขบั๊ก","radar.axis.processes":"กระบวนการ","radar.axis.architecture":"สถาปัตยกรรม","ageMatrix.title":"การกระจายอายุ","ageMatrix.low":"ต่ำ","ageMatrix.high":"สูง","ageMatrix.legend":"ความเข้ม = ความหนาแน่น","ageMatrix.typeColumn":"ประเภท","header.signalModeOn":"สัญญาณ","header.signalModeOff":"ทั้งหมด","header.signalModeOnHint":"ซ่อนสัญญาณรบกวน session และ commit คลิกเพื่อแสดงทั้งหมด","header.signalModeOffHint":"แสดงความทรงจำทั้งหมดรวมถึงสัญญาณรบกวน คลิกเพื่อซ่อน","roadmap.phases":"ระยะ","onboarding.title":"ยินดีต้อนรับสู่ MeMesh","onboarding.body":"ที่เก็บความทรงจำว่างเปล่า เริ่มด้วยทัวร์ 30 รายการที่คัดสรรแล้วหรือบันทึกบทเรียนแรก","onboarding.llmHint":"ไม่ต้องใช้ LLM ทุกอย่างทำงานด้วย FTS5 อย่างเดียว LLM เป็นตัวเลือกสำหรับสร้างบทเรียนอัตโนมัติ ตั้งค่าภายหลังในหน้าตั้งค่าได้","onboarding.seedButton":"เริ่มทัวร์ตัวอย่าง","onboarding.seedingButton":"กำลังโหลด…","onboarding.seedHint":"เพิ่ม 30 ความทรงจำที่นี่เลย — ไม่ต้องเปิดเทอร์มินัล","onboarding.cliReference":"ชอบใช้ CLI ใช่ไหม?","onboarding.hintDemo":"ใส่ 30 ความทรงจำตัวอย่าง ลบทีหลังได้","onboarding.hintReset":"ลบทุกอย่างที่ติด metadata.demo","onboarding.resetButton":"ล้างข้อมูลตัวอย่าง","onboarding.resettingButton":"กำลังลบ…","onboarding.resetConfirm":"ลบความทรงจำตัวอย่างทั้งหมดหรือไม่? รายการที่คุณบันทึกเองจะยังอยู่","onboarding.dismiss":"ปิด","common.serverError":"เซิร์ฟเวอร์ตอบกลับข้อผิดพลาด (HTTP {status}) ลองอีกครั้ง — หากยังเกิดซ้ำ ให้รัน `memesh doctor`","emptyLibrary.title":"ความทรงจำของคุณยังว่างเปล่า","emptyLibrary.body":"ยังไม่มีข้อมูลบันทึกไว้ โหลดทัวร์ตัวอย่าง 30 รายการเพื่อดูการทำงานของ MeMesh — ลบทีหลังได้ในคลิกเดียว","browse.truncated":"กำลังแสดง {shown} รายการแรกจากทั้งหมด {total} — ใช้การค้นหาหรือตัวกรองเพื่อดูที่เหลือ","browse.truncatedUnknownTotal":"กำลังแสดง {shown} รายการแรก — อ่านจำนวนทั้งหมดไม่ได้ จึงอาจมีมากกว่านี้","graph.cappedNote":"แสดงเฉพาะ {shown} อันดับแรกจาก {total} เอนทิตี (เรียงตามการเรียกคืน) เพื่อให้กราฟลื่นไหล","settings.testStoredKeyHint":"เว้นช่องนี้ว่างเพื่อทดสอบคีย์ที่บันทึกไว้แล้ว","ageMatrix.bucket.week":"สัปดาห์นี้","ageMatrix.bucket.month":"เดือนนี้","ageMatrix.bucket.quarter":"ไตรมาสนี้","ageMatrix.bucket.older":"เก่ากว่า","settings.behaviourTitle":"การทำงาน","settings.autoUpdateLabel":"นโยบายอัพเดตอัตโนมัติ","settings.autoUpdateOff":"ปิด — ด้วยตนเองเท่านั้น","settings.autoUpdatePatch":"Patch — ใช้ X.Y.Z+1","settings.autoUpdateMinor":"Minor — ใช้ X.Y+1.0","settings.autoUpdateMajor":"Major — ใช้ทุกระดับ","settings.autoUpdateHint":"ทำงานหลังแต่ละเซสชัน MEMESH_AUTO_UPDATE มีลำดับความสำคัญ","errors.timeout":"คำขอหมดเวลา","type.lesson_learned":"บทเรียน","type.lesson":"บทเรียน","type.mistake":"ความผิดพลาด","type.decision":"การตัดสินใจ","type.architecture_decision":"ตัดสินใจสถาปัตย์","type.design_decision":"ตัดสินใจด้านดีไซน์","type.pattern":"แพทเทิร์น","type.technical_pattern":"แพทเทิร์นเทคนิค","type.best_practice":"แนวปฏิบัติที่ดี","type.bug_fix":"แก้บั๊ก","type.verification_result":"ผลการตรวจสอบ","type.test_result":"ผลการทดสอบ","type.process":"กระบวนการ","type.architecture":"สถาปัตยกรรม","type.infrastructure":"โครงสร้างพื้นฐาน","type.feature":"ฟีเจอร์","type.release":"รีลีส","type.refactoring":"รีแฟคเตอร์","type.commit":"คอมมิต","type.session_keypoint":"ประเด็นสำคัญของเซสชัน","type.session_identity":"ตัวตนของเซสชัน","type.session-insight":"ข้อคิดจากเซสชัน","type.session-summary":"สรุปเซสชัน","type.session-identity":"ตัวตนของเซสชัน","type.weekly_summary":"สรุปรายสัปดาห์","type.weekly-summary":"สรุปรายสัปดาห์","type.note":"โน้ต","type.plan":"แผน","type.knowledge":"ความรู้","type.workflow_checkpoint":"เหตุการณ์สำคัญ","type.concept":"แนวคิด","type.tool":"เครื่องมือ","type.person":"บุคคล","relation.relates_to":"เกี่ยวข้องกับ","relation.related-to":"เกี่ยวข้องกับ","relation.depends_on":"ขึ้นอยู่กับ","relation.implements":"อิมพลีเมนต์","relation.learned_from":"เรียนรู้จาก","relation.supersedes":"แทนที่","relation.contradicts":"ขัดแย้งกับ","relation.follows":"ต่อจาก","relation.belongs-to-project":"อยู่ในโครงการ","relation.evidences":"เป็นหลักฐานของ","relation.co-created":"สร้างร่วมกัน","relation.shares-name-tokens":"ชื่อคล้ายกัน","patterns.day.0":"วันอาทิตย์","patterns.day.1":"วันจันทร์","patterns.day.2":"วันอังคาร","patterns.day.3":"วันพุธ","patterns.day.4":"วันพฤหัสบดี","patterns.day.5":"วันศุกร์","patterns.day.6":"วันเสาร์","telemetry.flow.dreamer":"สรุปรายสัปดาห์ (dreamer)","telemetry.flow.pattern_detector":"ตัวตรวจจับแพทเทิร์น","telemetry.flow.digest_validator":"ตัวตรวจสอบสรุป","telemetry.flow.guard_proposer":"ตัวเสนอการ์ด","telemetry.flow.auto_tagger":"แท็กอัตโนมัติ","telemetry.flow.failure_analyzer":"วิเคราะห์ความล้มเหลว","telemetry.flow.transcript_extractor":"ขุดข้อมูลบันทึกการสนทนา","telemetry.flow.conflict_judge":"ตัดสินข้อขัดแย้ง","telemetry.errorClass.auth":"การยืนยันตัวถูกปฏิเสธ","telemetry.errorClass.rate_limit":"ติดขีดจำกัดอัตรา","telemetry.errorClass.upstream":"ผู้ให้บริการขัดข้อง","telemetry.errorClass.bad_request":"คำขอไม่ถูกต้อง","telemetry.errorClass.network":"เครือข่าย","telemetry.errorClass.parse":"อ่านคำตอบไม่ได้","telemetry.errorClass.unknown":"ไม่ทราบ","lessons.severity.critical":"วิกฤต","lessons.severity.major":"รุนแรง","lessons.severity.minor":"เล็กน้อย","memory.tooltip.project":"โครงการ","memory.tooltip.recalled":"ถูกเรียกคืน {count} ครั้ง","memory.tooltip.hasRelations":"เชื่อมโยงกับความทรงจำอื่น {count} รายการ","memory.tooltip.createdAt":"สร้างเมื่อ {date}","graph.layerLabel":"ชั้นของกราฟ","graph.layerWork":"งาน","graph.layerAll":"ทั้งหมด","graph.layerWorkHint":"การตัดสินใจ บทเรียน และแผน — ตัวงานเอง","graph.layerAllHint":"ความทรงจำทั้งหมดที่ memesh เก็บไว้ รวมถึงการบันทึกอัตโนมัติ","graph.layerFellBack":"ตอนนี้มีรายการงานไม่ถึง {min} รายการ จึงแสดงกราฟทั้งหมดแทน บันทึกการตัดสินใจและบทเรียนแล้วมุมมองนี้จะค่อย ๆ เต็มขึ้น","graph.evidenceFor":"หลักฐานของ {node}","graph.evidenceClose":"ปิด","graph.evidenceLoading":"กำลังโหลดหลักฐาน…","graph.evidenceFailed":"โหลดหลักฐานของรายการนี้ไม่สำเร็จ","graph.evidenceEmpty":"ยังไม่มีหลักฐานเชื่อมกับรายการนี้ รัน `memesh kg backfill` เพื่อสร้างการเชื่อมโยงจาก commit และบันทึกเซสชัน","graph.evidenceTruncated":"แสดง {shown} รายการล่าสุด ยังมีอีก","graph.drift":"ความสดใหม่","graph.driftHint":"ระบายสีตามอายุ: แดง = ไม่ได้ใช้นาน, เขียว = ใช้ล่าสุด","common.unknown":"ไม่ทราบ","insights.entitiesCount":"{n} เอนทิตี","roadmap.viewToggle":"มุมมองแผนที่","roadmap.viewTree":"ต้นไม้","roadmap.viewMindmap":"มายด์แมป","roadmap.mindmapNeedsPhases":"มายด์แมปต้องมีความทรงจำอย่างน้อย 3 รายการภายใน 7 วัน","roadmap.activePhase":"กำลังดำเนิน","roadmap.entryCount":"{count} รายการ","roadmap.entriesCount":"{count} รายการ","roadmap.otherGroup":"อื่น ๆ ({count})","roadmap.lowSignalHidden":"(ซ่อน {count} รายการสัญญาณต่ำ)","roadmap.resetHint":"รีเซ็ตการซูมและตำแหน่ง (ดับเบิลคลิกพื้นหลังก็ได้)","roadmap.zoomHint":"เลื่อนเพื่อซูม · ลากเพื่อเลื่อน · {pct}%","roadmap.moreEntities":"อีก {count} รายการ","roadmap.viewDecisions":"การตัดสินใจ","roadmap.densityTitle":"ความหนาแน่นของการบันทึกตามหมวดหมู่","roadmap.densityNote":"สิ่งที่ memesh บันทึกไว้ — ไม่ใช่ทุกอย่างที่เกิดขึ้น","roadmap.lineageSupersedes":"ถูกแทนที่แล้ว {n} รายการ","roadmap.lineageConflicts":"ความขัดแย้งที่ยังไม่ได้แก้ไข {n} รายการ","adr.empty":'โครงการนี้ยังไม่มีการตัดสินใจที่บันทึกไว้ บันทึกหนึ่งรายการด้วยประเภท "decision" แล้วรายการนั้นจะปรากฏที่นี่พร้อมประวัติของมัน',"adr.statusActive":"ใช้งานอยู่","adr.statusSuperseded":"ถูกแทนที่แล้ว","adr.supersedes":"แทนที่","adr.supersededBy":"ถูกแทนที่โดย","nav.ariaLabel":"ส่วนต่าง ๆ ของแดชบอร์ด","feedback.descLabel":"รายละเอียดข้อเสนอแนะ","graph.canvasA11y":"กราฟความรู้ (วาดบนแคนวาส): {entities} เอนทิตี, {relations} ความสัมพันธ์, {orphans} ที่ไม่เชื่อมต่อ ใช้ตัวกรองประเภทและการค้นหาด้านบนเพื่อดูแบบไม่ใช้ภาพ"}},Rr={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 Et="en";function jr(){const t=localStorage.getItem("memesh-locale");if(t&&Yt[t])return t;const s=navigator.language;if(s.startsWith("zh-TW")||s.startsWith("zh-Hant"))return"zh-TW";if(s.startsWith("zh"))return"zh-CN";const o=s.split("-")[0];return Yt[o]?o:"en"}function zr(){return Et=jr(),Et}function Dr(t){Et=t,localStorage.setItem("memesh-locale",t)}function r(t,s){const o=Yt[Et]?.[t]||Yt.en[t]||t;return s?o.replace(/\{(\w+)\}/g,(a,n)=>{const i=s[n];return i===void 0?`{${n}}`:String(i)}):o}function ke(){return Et}function to(){return Object.entries(Rr).map(([t,s])=>({code:t,name:s}))}const Ts="memesh.signalMode",is="memesh:signal-mode-changed",Nr=!0;function ls(){try{const t=localStorage.getItem(Ts);if(t==="true")return!0;if(t==="false")return!1}catch{}return Nr}function Ir(t){try{localStorage.setItem(Ts,String(t))}catch{}}function Ps(){const[t,s]=v(ls);te(()=>{function a(i){const m=i.detail;m&&typeof m.value=="boolean"?s(m.value):s(ls())}function n(i){i.key===Ts&&s(ls())}return window.addEventListener(is,a),window.addEventListener("storage",n),()=>{window.removeEventListener(is,a),window.removeEventListener("storage",n)}},[]);function o(a){Ir(a),s(a),window.dispatchEvent(new CustomEvent(is,{detail:{value:a}}))}return[t,o]}function Hr({health:t,error:s}){const[o,a]=Ps();return e("div",{class:"header",children:[e("div",{class:"header-brand",children:[e("h1",{children:"MeMesh"}),e("small",{children:r("brand.subtitle")})]}),e("div",{class:"header-right",children:e("div",{class:"header-meta",children:[e("button",{type:"button",class:"signal-toggle",onClick:()=>a(!o),"aria-pressed":o,title:r(o?"header.signalModeOnHint":"header.signalModeOffHint"),style:{fontSize:11,padding:"4px 10px",borderRadius:"var(--radius)",border:`1px solid ${o?"rgba(143, 242, 92, 0.4)":"var(--border)"}`,background:o?"var(--life-soft)":"transparent",color:o?"var(--life)":"var(--text-2)",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{marginRight:4},children:o?"●":"○"}),r(o?"header.signalModeOn":"header.signalModeOff")]}),t?e(de,{children:[e("span",{children:[e("span",{class:"dot dot-ok"}),r("header.connected")]}),e("span",{class:"badge-version",children:["v",t.version," · ",t.entity_count.toLocaleString(ke())," ",r("header.memories")]})]}):s?e("span",{children:[e("span",{class:"dot dot-err"}),r("header.disconnected")]}):e("span",{style:{color:"var(--text-3)"},children:r("header.connecting")})]})})]})}function Or({tabs:t,active:s,onSelect:o}){const a=ne(null),n=ne([]),[i,m]=v(!1),d=ze(()=>{const l=a.current;l&&m(l.scrollLeft+l.clientWidth<l.scrollWidth-1)},[]);te(()=>{d();const l=a.current;if(l)return l.addEventListener("scroll",d,{passive:!0}),window.addEventListener("resize",d),()=>{l.removeEventListener("scroll",d),window.removeEventListener("resize",d)}},[d,t.length]);const u=(l,h)=>{let c;if(l.key==="ArrowRight"||l.key==="ArrowDown")c=(h+1)%t.length;else if(l.key==="ArrowLeft"||l.key==="ArrowUp")c=(h-1+t.length)%t.length;else if(l.key==="Home")c=0;else if(l.key==="End")c=t.length-1;else return;l.preventDefault(),o(t[c].key),n.current[c]?.focus(),n.current[c]?.scrollIntoView({block:"nearest",inline:"nearest"})};return e("nav",{"aria-label":r("nav.ariaLabel"),style:{position:"relative"},children:[e("div",{ref:a,class:"nav",role:"tablist","aria-label":r("nav.ariaLabel"),children:t.map(({key:l,label:h},c)=>{const g=l===s;return e("button",{ref:f=>{n.current[c]=f},id:`tab-${l}`,role:"tab","aria-selected":g?"true":"false","aria-controls":`panel-${l}`,tabIndex:g?0:-1,class:`nav-btn ${g?"active":""}`,onClick:()=>o(l),onKeyDown:f=>u(f,c),children:h},l)})}),i&&e("div",{"aria-hidden":"true",class:"nav-overflow-fade"})]})}const Br=1e4,xs="memesh_token";function ws(){try{return localStorage.getItem(xs)}catch{return null}}function Fr(t){try{t?localStorage.setItem(xs,t):localStorage.removeItem(xs)}catch{}}class Rs extends Error{constructor(){super("auth_required"),this.name="AuthRequiredError"}}class Ko extends Error{constructor(s){super(`HTTP ${s}`),this.name="HttpError",this.status=s}}class Xt extends Error{constructor(s){super(s),this.name="NetworkError"}}class Vo extends Error{constructor(s){super(s),this.name="RateLimitError"}}function so(t){if(typeof t.errorCode=="string"&&t.errorCode){const s=`httpError.${t.errorCode}`,o=r(s);if(o!==s)return new Error(o)}return new Error(typeof t.error=="string"&&t.error?t.error:r("errors.unknown"))}async function Z(t,s,o){const a=new AbortController,n=setTimeout(()=>a.abort(),Br);try{const i={"Content-Type":"application/json"},m=ws();m&&(i.Authorization=`Bearer ${m}`);const d={method:t,headers:i,signal:a.signal};o&&(d.body=JSON.stringify(o));const u=await fetch(s,d);if(u.status===401)throw window.dispatchEvent(new Event("memesh:auth-required")),new Rs;if(!u.ok){if(u.status===429)throw new Vo(r("httpError.rate.limited"));let h=null;try{h=await u.json()}catch{}throw h&&typeof h=="object"&&h.success===!1?so(h):new Ko(u.status)}const l=await u.json();if(!l.success)throw so(l);return l.data}catch(i){throw i instanceof Error&&i.name==="AbortError"?new Xt(r("errors.timeout")):i instanceof TypeError?new Xt(i.message):i}finally{clearTimeout(n)}}async function $o(){const t=await Z("GET","/v1/projects");if(!Array.isArray(t))throw console.warn("[memesh dashboard] /v1/projects answered with a shape this bundle cannot read:",t),new Error("unreadable projects payload");return t}async function qr(){return Z("GET","/v1/graph")}async function Ur(){return Z("GET","/v1/graph?layer=work")}async function Wr(t){return Z("GET",`/v1/graph/evidence?node=${encodeURIComponent(t)}`)}function at(t){return t instanceof Vo?"ratelimited":t instanceof Xt?"unreachable":"unreadable"}function Ue(t){return t==="unreachable"?`${r("common.serverUnreachable")} ${r("common.serverUnreachableAction")}`:t==="ratelimited"?r("httpError.rate.limited"):`${r("common.responseUnreadable")} ${r("common.responseUnreadableAction")}`}function He(t){return t instanceof Xt?Ue("unreachable"):t instanceof Rs?r("auth.title"):t instanceof Ko?r("common.serverError",{status:t.status}):t instanceof Error&&t.message?t.message:r("errors.unknown")}const Kr=/^(Steps|Commits|Branch|Diff stats|Compaction reason|Tool calls|Plan ".+" completed)[:\s]/;function Vr(t){return Kr.test(t.trim())}const pt={lesson_learned:"#DBB155",concept:"#3ACED6",pattern:"#59C5F5",technical_pattern:"#59C5F5",commit:"#A8AFFF",session_keypoint:"#52D0B3",session_identity:"#E39BDC",workflow_checkpoint:"#82BAFF",feature:"#EFA464",bug_fix:"#FB9890",tool:"#C9A3F5",person:"#F496BB",note:"#BCBE5E"},$r={lesson_learned:"knowledge",lesson:"knowledge",mistake:"knowledge",decision:"knowledge",architecture_decision:"knowledge",design_decision:"knowledge",pattern:"knowledge",technical_pattern:"knowledge",best_practice:"knowledge",bug_fix:"knowledge",verification_result:"knowledge",test_result:"knowledge",process:"knowledge",architecture:"knowledge",infrastructure:"knowledge",feature:"knowledge",release:"knowledge",refactoring:"knowledge",commit:"activity",session_keypoint:"session",session_identity:"session","session-insight":"session","session-summary":"session","session-identity":"session",weekly_summary:"activity","weekly-summary":"activity",note:"reference",plan:"reference",knowledge:"reference",workflow_checkpoint:"reference"};function _s(t){return $r[t]??"reference"}const Jt={knowledge:pt.lesson_learned,activity:pt.commit,session:pt.session_keypoint,reference:pt.note};function Ge(t){const s=`type.${t}`,o=r(s);return o===s?t:o}function Gr(t){const s=`relation.${t}`,o=r(s);return o===s?t:o}function vt(t,s=new Date){if(!t)return"—";const o=new Date(t);if(Number.isNaN(o.getTime()))return"—";const a=s.getTime()-o.getTime(),n=Math.floor(a/864e5);if(n<0)return o.toLocaleDateString(ke(),{month:"short",day:"numeric"});if(n===0){const i=Math.floor(a/36e5);return i<1?r("time.justNow"):i<24?r("time.hoursAgo",{count:i}):r("time.today")}return n===1?r("time.yesterday"):n<7?r("time.daysAgo",{count:n}):n<14?r("time.lastWeek"):n<30?r("time.weeksAgo",{count:Math.floor(n/7)}):n<60?r("time.lastMonth"):n<365?r("time.monthsAgo",{count:Math.floor(n/30)}):o.toLocaleDateString(ke(),{year:"numeric",month:"short",day:"numeric"})}function Go(t,s=new Date){if(!t)return"older";const o=s.getTime()-new Date(t).getTime(),a=Math.floor(o/864e5);return a<1?"today":a<7?"week":a<30?"month":"older"}const oo="project:";function Qt(t){const s=t.tags?.find(o=>o.startsWith(oo));return s?s.slice(oo.length):null}function Yr(t){if(!t||t.length===0)return"";const s=t.filter(a=>a.length>30&&!Vr(a)),o=s.length>0?s:t;return o.slice(0,3).reduce((a,n)=>n.length>a.length?n:a,o[0])}function Xe(t){const s=t.title?.trim();if(s)return s;const o=Yr(t.observations);if(o)return o;const a=t.created_at?new Date(t.created_at).toLocaleDateString(ke(),{year:"numeric",month:"short",day:"numeric"}):"";return a?`${Ge(t.type)} · ${a}`:Ge(t.type)}function Yo(t){const s=t??0;return s===0?{count:s,label:r("memory.access.never"),tone:"none"}:s>=20?{count:s,label:r("memory.access.frequent",{count:s}),tone:"high"}:s>=5?{count:s,label:r("memory.access.recalls",{count:s}),tone:"medium"}:{count:s,label:r("memory.access.recalls",{count:s}),tone:"low"}}function Xr(t){if((t.tags??[]).some(i=>i==="plan-completion"||i.startsWith("plan:")))return"plan-completion";const a=(t.observations??[]).join(" ");return/(^|\s)Error:/.test(a)&&(/(^|\s)Fix:/.test(a)||/(^|\s)Root cause:/.test(a))?"failure":"freeform"}function Jr(t){if(!t)return null;for(const s of t){const o=/^severity:(high|medium|low)$/i.exec(s);if(o)return o[1].toLowerCase()}return null}function ro(t){switch(t){case"high":return"var(--danger)";case"medium":return"var(--warning)";case"low":return"var(--text-2)";default:return"var(--text-3)"}}function Qr(t){const{proposal:s,detail:o,expanded:a,inFlight:n,onToggleExpand:i,onAccept:m,onReject:d,formatRelative:u,statusBadgeStyle:l,statusLabel:h}=t,c=s.status==="pending",g=Jr(o?.proposed_digest?.tags),f=l(s.status);return e("div",{class:"card",style:{padding:14,borderLeft:"3px solid var(--warning)",background:"var(--warning-soft)"},children:[e("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:12,flexWrap:"wrap"},children:[e("div",{style:{flex:"1 1 60%",minWidth:240},children:[e("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[e("span",{class:"badge badge-type",style:{textTransform:"none"},children:["#",s.id]}),e("span",{class:"tag",style:{fontSize:11,background:"var(--warning)",color:"var(--bg-0)",fontWeight:600},children:r("pattern.title")}),e("span",{style:{fontWeight:600},children:s.digest_name}),e("span",{class:"tag",style:{fontSize:11},children:s.project}),e("span",{class:"tag",style:{fontSize:11,color:"var(--text-2)"},children:r("pattern.evidenceCount",{n:String(s.source_count)})}),g&&e("span",{class:"tag",style:{fontSize:11,color:ro(g),borderColor:ro(g)},children:[r("pattern.severity"),": ",r(`pattern.severity.${g}`)]}),e("span",{class:"tag",style:{fontSize:11,...f},children:h(s.status)})]}),e("div",{style:{marginTop:6,color:"var(--text-2)",fontSize:13,lineHeight:1.5},children:s.digest_observations_preview!==null?e(de,{children:[s.digest_observations_preview,"…"]}):e("span",{style:{fontStyle:"italic",color:"var(--text-3)"},children:r("insights.noPreview")})}),e("div",{style:{marginTop:4,color:"var(--text-3)",fontSize:11},children:u(s.created_at)})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[e("button",{class:"btn btn-ghost",onClick:()=>i(s.id),disabled:n,"aria-expanded":a,children:r(a?"insights.collapse":"insights.viewDetail")}),c&&e(de,{children:[e("button",{class:"btn btn-primary",onClick:()=>m(s.id),disabled:n,children:r(n?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>d(s.id),disabled:n,style:{color:"var(--danger)"},children:r("insights.reject")})]})]})]}),o&&o.proposed_digest&&e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:13},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:11},children:[r("insights.generatedBy"),": ",e("code",{children:o.llm_model??r("common.unknown")})," "," "," ",r("insights.promptVersion"),": ",e("code",{children:o.prompt_version})]}),Array.isArray(o.proposed_digest.validation_warnings)&&o.proposed_digest.validation_warnings.length>0&&e("div",{style:{marginBottom:10,padding:10,borderRadius:"var(--radius-xs)",borderLeft:"3px solid var(--warning)",background:"var(--warning-soft)"},children:[e("div",{style:{fontWeight:600,color:"var(--warning)",marginBottom:6},children:["⚠ ",r("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:o.proposed_digest.validation_warnings.map((b,M)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[r("insights.validationClaim"),": "]}),e("code",{style:{fontSize:12},children:b.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[r("insights.validationReason"),": "]}),e("span",{children:b.reason})]})]},M))})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:[r("pattern.description"),":"]}),e("ol",{style:{margin:"4px 0 0 18px",padding:0},children:o.proposed_digest.observations.map((b,M)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:b},M))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[r("insights.tags"),":"]})," ",o.proposed_digest.tags.map(b=>e("span",{class:"tag",style:{marginLeft:4,fontSize:11},children:b},b))]}),e("div",{style:{color:"var(--text-3)",fontSize:11,marginTop:6},children:[r("insights.sourceIds"),": ",o.source_ids.length," (",o.source_ids.slice(0,8).join(", "),o.source_ids.length>8?"…":"",")"]})]})]})}function no(t){return t?vt(t.includes(" ")?t.replace(" ","T")+"Z":t):""}function ao(t){switch(t){case"pending":return{background:"var(--warning-soft)",color:"var(--warning)"};case"applied":return{background:"rgba(143,242,92,0.12)",color:"var(--life)"};case"rejected":return{background:"var(--danger-soft)",color:"var(--danger)"};default:return{background:"var(--neutral-soft)",color:"var(--text-3)"}}}function io(t){const s=`insights.status.${t}`,o=r(s);return o===s?t:o}function Zr(){const[t,s]=v([]),[o,a]=v("pending"),[n,i]=v(new Map),[m,d]=v(!1),[u,l]=v(""),[h,c]=v(null),[g,f]=v(new Set),[b,M]=v(null),k=ze(async()=>{d(!0),l("");try{const _=await Z("GET","/v1/dream/proposals?status=all");Array.isArray(_)?s(_):(console.warn("[memesh dashboard] /v1/dream/proposals answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",_),s([]),l(Ue("unreadable")))}catch(_){console.warn("[memesh dashboard] /v1/dream/proposals failed to load:",_),l(Ue(at(_)))}finally{d(!1)}},[]);te(()=>{k()},[k]),te(()=>{Z("GET","/v1/config").then(_=>c(!!_?.capabilities?.llm)).catch(()=>c(!1))},[]);const y=o==="all"?t:t.filter(_=>_.status===o),L=ze(async _=>{if(n.has(_)){const R=new Map(n);R.delete(_),i(R);return}try{const R=await Z("GET",`/v1/dream/proposals/${_}`),ae=new Map(n);ae.set(_,R),i(ae)}catch(R){l(He(R))}},[n]),N=_=>{f(R=>{const ae=new Set(R);return ae.add(_),ae})},W=_=>{f(R=>{const ae=new Set(R);return ae.delete(_),ae})},U=ze(async _=>{N(_);try{await Z("POST",`/v1/dream/proposals/${_}/accept`),window.dispatchEvent(new Event("memesh:data-changed")),await k()}catch(R){l(He(R))}finally{W(_)}},[k]),p=ze(async _=>{N(_);try{await Z("POST",`/v1/dream/proposals/${_}/reject`,{reason:"rejected via dashboard"}),window.dispatchEvent(new Event("memesh:data-changed")),await k()}catch(R){l(He(R))}finally{W(_)}},[k]),w=ze(async _=>{M(_),l("");try{await Z("POST","/v1/dream/run",{maxLlmCalls:3,validate:_==="validate"}),window.dispatchEvent(new Event("memesh:data-changed")),await k()}catch(R){l(He(R))}finally{M(null)}},[k]),B=t.filter(_=>_.status==="pending").length,T=t.filter(_=>_.status==="applied").length,Y=t.filter(_=>_.status==="rejected").length;return e("div",{style:{display:"flex",flexDirection:"column",gap:16},children:[e("div",{class:"card",style:{padding:16},children:[e("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",flexWrap:"wrap",gap:8},children:[e("h2",{style:{margin:0,fontSize:18},children:r("insights.title")}),e("span",{style:{color:"var(--text-2)",fontSize:13},children:r("insights.subtitle")})]}),e("div",{style:{marginTop:10,display:"flex",gap:16,flexWrap:"wrap",color:"var(--text-2)",fontSize:13},children:[e("span",{children:[e("strong",{style:{color:"var(--life)",fontFamily:"var(--mono)"},children:B})," ",r("insights.statPending")]}),e("span",{children:[e("strong",{style:{fontFamily:"var(--mono)"},children:T})," ",r("insights.statApplied")]}),e("span",{children:[e("strong",{style:{fontFamily:"var(--mono)"},children:Y})," ",r("insights.statRejected")]})]}),h&&e("div",{style:{marginTop:12,display:"flex",gap:8,flexWrap:"wrap"},children:[e("button",{class:"btn btn-primary",onClick:()=>w("plain"),disabled:b!==null,"aria-busy":b==="plain",children:b==="plain"?`${r("insights.runDream")}…`:r("insights.runDream")}),e("button",{class:"btn btn-ghost",onClick:()=>w("validate"),disabled:b!==null,"aria-busy":b==="validate",children:b==="validate"?`${r("insights.runDreamWithValidate")}…`:r("insights.runDreamWithValidate")})]})]}),e("div",{style:{display:"flex",gap:8,flexWrap:"wrap"},role:"group","aria-label":r("insights.title"),children:[["pending","applied","rejected","all"].map(_=>{const R=o===_;return e("button",{class:"tag","aria-pressed":R,style:{padding:"4px 10px",borderRadius:"var(--radius-xs)",cursor:"pointer",border:"1px solid "+(R?"var(--life)":"var(--border)"),background:R?"rgba(143,242,92,0.12)":"transparent",color:R?"var(--life)":"var(--text-2)"},onClick:()=>a(_),children:r(`insights.filter.${_}`)},_)}),e("button",{class:"btn btn-ghost",onClick:k,style:{marginLeft:"auto"},children:r("insights.refresh")})]}),u&&e("div",{class:"card",role:"alert",style:{padding:12,color:"var(--danger)"},children:u}),m&&e("div",{style:{color:"var(--text-3)",fontSize:13},children:r("insights.loading")}),!m&&y.length===0&&e("div",{class:"card",style:{padding:16,textAlign:"center",color:"var(--text-2)"},children:r(o!=="pending"?"insights.emptyOther":h===!1?"insights.emptyNoLlm":"insights.emptyPending")}),y.map(_=>{const R=n.get(_.id),ae=n.has(_.id),Ce=_.status==="pending",ge=g.has(_.id);if(_.kind==="pattern_emergent")return e(Qr,{proposal:_,detail:R,expanded:ae,inFlight:ge,onToggleExpand:L,onAccept:U,onReject:p,formatRelative:no,statusBadgeStyle:ao,statusLabel:io},_.id);const pe=_.digest_observations_preview;return e("div",{class:"card",style:{padding:14},children:[e("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:12,flexWrap:"wrap"},children:[e("div",{style:{flex:"1 1 60%",minWidth:240},children:[e("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[e("span",{class:"badge badge-type",style:{textTransform:"none",fontFamily:"var(--mono)"},children:["#",_.id]}),e("span",{style:{fontWeight:600},children:_.digest_name}),e("span",{class:"tag",style:{fontSize:11},children:_.project}),e("span",{class:"tag",style:{fontSize:11},children:_.cluster_key}),e("span",{class:"tag",style:{fontSize:11,color:"var(--text-2)"},children:[_.source_count," ",r("insights.sources")]}),e("span",{class:"tag",style:{fontSize:11,...ao(_.status)},children:io(_.status)})]}),e("div",{style:{marginTop:6,color:"var(--text-2)",fontSize:13,lineHeight:1.5},children:pe!==null?e(de,{children:[pe,"…"]}):e("span",{style:{fontStyle:"italic",color:"var(--text-3)"},children:r("insights.noPreview")})}),e("div",{style:{marginTop:4,color:"var(--text-3)",fontSize:11},children:no(_.created_at)})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[e("button",{class:"btn btn-ghost",onClick:()=>L(_.id),disabled:ge,"aria-expanded":ae,children:r(ae?"insights.collapse":"insights.viewDetail")}),Ce&&e(de,{children:[e("button",{class:"btn btn-primary",onClick:()=>U(_.id),disabled:ge,children:r(ge?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>p(_.id),disabled:ge,style:{color:"var(--danger)"},children:r("insights.reject")})]})]})]}),R&&R.proposed_digest&&_.kind==="relation"&&(()=>{const D=R.proposed_digest,[P,q]=D.relation_type==="supersedes"&&D.direction==="b_supersedes_a"?[D.b?.name,D.a?.name]:[D.a?.name,D.b?.name];return e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:13},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:11},children:[r("insights.generatedBy"),": ",e("code",{children:R.llm_model??r("common.unknown")})," · ",r("insights.promptVersion"),": ",e("code",{children:R.prompt_version})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:D.verdict}),D.severity&&e("span",{class:"tag",style:{marginLeft:8,fontSize:11},children:D.severity})]}),e("div",{style:{marginBottom:8,fontFamily:"var(--mono)",fontSize:12},children:[P," —",D.relation_type,"→ ",q]}),D.rationale&&e("div",{style:{marginBottom:8,lineHeight:1.5},children:D.rationale}),D.recommended_action&&e("div",{style:{marginBottom:8,color:"var(--text-2)",lineHeight:1.5},children:["→ ",D.recommended_action]}),(D.excerpts?.a||D.excerpts?.b)&&e("div",{style:{marginBottom:4,color:"var(--text-2)",fontSize:12},children:[e("div",{children:[e("code",{children:"A"})," ",D.a?.name,": “",D.excerpts?.a,"”"]}),e("div",{children:[e("code",{children:"B"})," ",D.b?.name,": “",D.excerpts?.b,"”"]})]})]})})(),R&&R.proposed_digest&&_.kind==="guard"&&(()=>{const D=R.proposed_digest;return e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:13},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:11},children:[r("insights.generatedBy"),": ",e("code",{children:R.llm_model??r("common.unknown")})," · ",r("insights.promptVersion"),": ",e("code",{children:R.prompt_version})]}),e("div",{style:{marginBottom:8},children:[e("span",{class:"tag",style:{fontSize:11},children:D.guard?.tool}),e("span",{style:{marginLeft:8,color:"var(--text-3)",fontSize:11},children:[r("guard.sourceLesson"),":"]})," ",e("span",{style:{fontSize:12},children:D.source_lesson?.title||D.source_lesson?.name})]}),e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,color:"var(--text-3)",marginBottom:2},children:r("guard.pattern")}),e("code",{style:{fontFamily:"var(--mono)",fontSize:12,wordBreak:"break-all"},children:D.guard?.pattern})]}),e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,color:"var(--text-3)",marginBottom:2},children:r("guard.message")}),e("div",{style:{lineHeight:1.5},children:D.guard?.message})]}),D.guard?.should_match?.length||D.guard?.should_not_match?.length?e("div",{style:{fontSize:12,color:"var(--text-2)"},children:[D.guard?.should_match?.length?e("div",{style:{marginBottom:4},children:[e("span",{style:{color:"var(--text-3)",fontSize:11},children:[r("guard.shouldMatch"),":"]})," ",D.guard.should_match.map((P,q)=>e("code",{style:{fontFamily:"var(--mono)",fontSize:11,marginRight:8},children:P},q))]}):null,D.guard?.should_not_match?.length?e("div",{children:[e("span",{style:{color:"var(--text-3)",fontSize:11},children:[r("guard.shouldNotMatch"),":"]})," ",D.guard.should_not_match.map((P,q)=>e("code",{style:{fontFamily:"var(--mono)",fontSize:11,marginRight:8},children:P},q))]}):null]}):null]})})(),R&&R.proposed_digest&&_.kind!=="relation"&&_.kind!=="guard"&&e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:13},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:11},children:[r("insights.generatedBy"),": ",e("code",{children:R.llm_model??r("common.unknown")})," · ",r("insights.promptVersion"),": ",e("code",{children:R.prompt_version})]}),Array.isArray(R.proposed_digest.validation_warnings)&&R.proposed_digest.validation_warnings.length>0&&e("div",{style:{marginBottom:10,padding:10,borderRadius:"var(--radius-xs)",borderLeft:"3px solid var(--warning)",background:"var(--warning-soft)"},children:[e("div",{style:{fontWeight:600,color:"var(--warning)",marginBottom:6},children:["⚠ ",r("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:R.proposed_digest.validation_warnings.map((D,P)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[r("insights.validationClaim"),": "]}),e("code",{style:{fontSize:12},children:D.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[r("insights.validationReason"),": "]}),e("span",{children:D.reason})]})]},P))})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:[r("insights.observations"),":"]}),e("ol",{style:{margin:"4px 0 0 18px",padding:0},children:R.proposed_digest.observations.map((D,P)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:D},P))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[r("insights.tags"),":"]})," ",R.proposed_digest.tags.map(D=>e("span",{class:"tag",style:{marginLeft:4,fontSize:11},children:D},D))]}),e("div",{style:{color:"var(--text-3)",fontSize:11,marginTop:6},children:[r("insights.sourceIds"),": ",r("insights.entitiesCount",{n:R.source_ids.length})," (",R.source_ids.slice(0,8).join(", "),R.source_ids.length>8?"…":"",")"]})]})]},_.id)})]})}function lo(t){return t>=80?"var(--success)":t>=60?"var(--life)":t>=40?"var(--warning)":"var(--danger)"}function en(t){return t>=80?r("health.excellent"):t>=60?r("health.good"):t>=40?r("health.fair"):r("health.poor")}const tn=["activity","quality","freshness","lessons"];function sn({score:t,factors:s}){const o=lo(t);return e("div",{class:"card",children:[e("div",{class:"card-title",children:r("health.title")}),e("div",{style:{display:"flex",gap:"24px",alignItems:"center"},children:[e("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",flexShrink:0},children:[e("div",{style:{width:"80px",height:"80px",borderRadius:"50%",border:`3px solid ${o}`,display:"flex",alignItems:"center",justifyContent:"center"},children:e("span",{style:{fontFamily:"var(--mono)",fontSize:"24px",fontWeight:700,color:o,letterSpacing:"-0.02em"},children:t})}),e("span",{style:{marginTop:"6px",fontSize:"11px",fontWeight:500,color:"var(--text-2)"},children:en(t)})]}),e("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:"10px"},children:tn.map(a=>{const n=s[a],i=Math.round(n.score/n.weight*100),m=lo(i);return e("div",{children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"4px"},children:[e("span",{style:{fontSize:"12px",color:"var(--text-2)"},children:r(`health.${a}`)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:"11px",color:"var(--text-3)"},children:[i,"%"]})]}),e("div",{style:{height:"4px",borderRadius:"2px",background:"var(--bg-0)",overflow:"hidden"},children:e("div",{style:{height:"100%",width:`${i}%`,borderRadius:"2px",background:m,transition:"width 600ms ease-out"}})})]},a)})})]})]})}const mt=220,Ve=36,$e=2;function on({trend:t}){if(!t||t.length===0)return e("svg",{width:mt,height:Ve,style:{display:"block"},children:e("line",{x1:0,y1:Ve/2,x2:mt,y2:Ve/2,stroke:"rgba(255,255,255,0.06)",strokeWidth:1})});if(t.length===1){const m=mt/2,d=Ve/2;return e("svg",{width:mt,height:Ve,style:{display:"block"},children:[e("line",{x1:$e,y1:Ve-$e,x2:mt-$e,y2:Ve-$e,stroke:"rgba(255,255,255,0.06)",strokeWidth:1}),e("circle",{cx:m,cy:d,r:3,fill:"var(--life)"})]})}const s=Math.max(1,...t.map(m=>m.count)),o=(mt-$e*2)/(t.length-1),a=t.map((m,d)=>{const u=$e+d*o,l=Ve-$e-m.count/s*(Ve-$e*2);return`${u.toFixed(1)},${l.toFixed(1)}`}),n=`M${a[0]} L${a.slice(1).join(" L")}`,i=`${n} L${$e+(t.length-1)*o},${Ve-$e} L${$e},${Ve-$e} Z`;return e("svg",{width:mt,height:Ve,style:{display:"block"},children:[e("path",{d:i,fill:"rgba(143, 242, 92, 0.12)"}),e("path",{d:n,fill:"none",stroke:"var(--life)",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"}),t.map((m,d)=>{const[u,l]=a[d].split(",");return d===t.length-1?e("circle",{cx:u,cy:l,r:2.5,fill:"var(--life)"},d):null})]})}function rn({metric:t}){const{reusedThisWeek:s,trend:o,computedFrom:a}=t,n=a==="last_accessed_at_approximation",i=o.slice(0,Math.max(0,o.length-7)).slice(-7).reduce((u,l)=>u+l.count,0),m=o.slice(-7).reduce((u,l)=>u+l.count,0),d=i>0?Math.round((m-i)/i*100):null;return e("div",{class:"card",style:{display:"flex",gap:24,alignItems:"center",flexWrap:"wrap",padding:"20px 24px",background:"var(--life-soft)",border:"1px solid rgba(143, 242, 92, 0.18)"},children:[e("div",{style:{flex:"1 1 200px",minWidth:200},children:[e("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.08em",color:"var(--text-2)",fontWeight:600,marginBottom:6},children:r("loop.label")}),e("div",{style:{display:"flex",alignItems:"baseline",gap:12},children:[e("div",{style:{fontSize:84,fontWeight:700,lineHeight:1,color:s>0?"var(--life)":"var(--text-2)",fontFamily:"var(--font-ui)",letterSpacing:"-0.03em"},children:s>0?s.toLocaleString(ke()):"—"}),d!==null&&d!==0&&e("span",{style:{fontSize:12,fontWeight:600,fontFamily:"var(--mono)",color:d>0?"var(--success)":"var(--danger)"},children:[d>0?"↑":"↓"," ",Math.abs(d),"%"]})]}),e("div",{style:{fontSize:13,color:"var(--text-1)",marginTop:4},children:s>0?r("loop.subtitleHas"):r("loop.subtitleNone")}),n&&e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:6,fontStyle:"italic"},children:r("loop.approxNote")})]}),e("div",{style:{flex:"0 0 auto",display:"flex",flexDirection:"column",alignItems:"flex-end",gap:4},children:[e(on,{trend:o}),e("div",{style:{fontSize:10,color:"var(--text-3)",fontFamily:"var(--mono)"},children:r("loop.sparkLabel")})]})]})}function Xo(t,s){const o=getComputedStyle(t),a={};for(const n of s)a[n]=o.getPropertyValue(n).trim();return a}function cs(t,s){const o=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(t.trim());if(!o)return t;const a=parseInt(o[1],16),n=parseInt(o[2],16),i=parseInt(o[3],16);return`rgba(${a}, ${n}, ${i}, ${s})`}const jt=8,nn=8,an=20,zt=8,Jo=120,Qo="rgba(143, 242, 92, 0.3)",ln=1.5;function co(t,s){t.style.width="";const o=window.devicePixelRatio||1,n=t.getBoundingClientRect().width,i=Jo,m=n-zt-nn,d=i-jt-an;if(s.length===0||m<=0||d<=0)return;t.width=n*o,t.height=i*o,t.style.width=`${n}px`,t.style.height=`${i}px`;const u=t.getContext("2d");if(!u)return;u.scale(o,o);const l=Xo(t,["--life","--text-3","--font-ui"]),h=l["--life"],c=l["--text-3"],g=`9px ${l["--font-ui"]}`,f=Math.max(1,...s.map(N=>N.created)),b=Math.max(1,...s.map(N=>N.recalled)),M=Math.max(f,b),k=s.length,y=1,L=Math.max(1,(m-y*(k-1))/k);u.fillStyle=Qo;for(let N=0;N<k;N++){const U=s[N].created/M*d,p=zt+N*(L+y),w=jt+d-U;u.fillRect(p,w,L,U)}u.beginPath(),u.strokeStyle=h,u.lineWidth=ln,u.lineJoin="round",u.lineCap="round";for(let N=0;N<k;N++){const W=s[N],U=zt+N*(L+y)+L/2,p=jt+d-W.recalled/M*d;N===0?u.moveTo(U,p):u.lineTo(U,p)}u.stroke(),u.fillStyle=c,u.font=g,u.textAlign="center",u.textBaseline="top";for(let N=0;N<k;N+=7){const W=s[N],U=W.date.split("-"),p=U.length>=3?`${U[1]}-${U[2]}`:W.date,w=zt+N*(L+y)+L/2,B=jt+d+4;u.fillText(p,w,B)}}function cn({data:t}){const s=ne(null);te(()=>{const n=s.current;if(!n)return;co(n,t);const i=new ResizeObserver(()=>co(n,t));return i.observe(n),()=>i.disconnect()},[t]);const o=t.reduce((n,i)=>n+i.created,0),a=t.reduce((n,i)=>n+i.recalled,0);return e("div",{class:"card",children:[e("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:14},children:[e("div",{class:"card-title",style:{marginBottom:0},children:r("timeline.title")}),e("div",{style:{display:"flex",alignItems:"center",gap:12,fontSize:11,color:"var(--text-2)"},children:[e("span",{style:{display:"flex",alignItems:"center",gap:4},children:[e("span",{style:{display:"inline-block",width:10,height:10,borderRadius:"var(--radius-hairline)",background:Qo}}),r("timeline.created"),e("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:o})]}),e("span",{style:{display:"flex",alignItems:"center",gap:4},children:[e("span",{style:{display:"inline-block",width:10,height:2,borderRadius:"var(--radius-hairline)",background:"var(--life)"}}),r("timeline.recalled"),e("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:a})]})]})]}),e("canvas",{ref:s,style:{width:"100%",height:`${Jo}px`,display:"block"}})]})}const ds=["week","month","quarter","older"];function dn(t){return r(`ageMatrix.bucket.${t}`)}const mn=["lesson_learned","lesson","mistake","decision","architecture_decision","pattern","technical_pattern","best_practice","bug_fix","workflow_checkpoint","process","architecture","feature"];function un(t,s){return t===0||s===0?"rgba(255,255,255,0.03)":`rgba(143, 242, 92, ${(.12+Math.min(t/s,1)*.55).toFixed(2)})`}function hn({data:t}){if(!t||t.length===0)return null;const s=new Map;for(const n of t)s.has(n.type)||s.set(n.type,new Map),s.get(n.type).set(n.bucket,n.count);const o=mn.filter(n=>s.has(n)),a=Math.max(1,...t.map(n=>n.count));return e("div",{class:"card",children:[e("div",{class:"card-title",style:{marginBottom:16},children:r("ageMatrix.title")}),e("div",{style:{overflowX:"auto"},children:e("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:12,tableLayout:"fixed"},children:[e("colgroup",{children:[e("col",{style:{width:"28%"}}),ds.map(n=>e("col",{style:{width:"18%"}},n))]}),e("thead",{children:e("tr",{children:[e("th",{style:{textAlign:"left",padding:"4px 8px",color:"var(--text-2)",fontWeight:400},children:r("ageMatrix.typeColumn")}),ds.map(n=>e("th",{style:{textAlign:"center",padding:"4px 6px",color:"var(--text-2)",fontWeight:400},children:dn(n)},n))]})}),e("tbody",{children:o.map(n=>{const i=s.get(n),m=Array.from(i.values()).reduce((d,u)=>d+u,0);return e("tr",{children:[e("td",{style:{padding:"5px 8px",color:"var(--text-1)",fontSize:11,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:[Ge(n),e("span",{style:{color:"var(--text-3)",marginLeft:4},children:["(",m,")"]})]}),ds.map(d=>{const u=i.get(d)??0;return e("td",{style:{textAlign:"center",padding:"5px 6px",background:un(u,a),borderRadius:"var(--radius-xs)",color:u>0?"var(--life)":"var(--text-3)",fontFamily:"var(--mono)",fontWeight:u>0?600:400,fontSize:11,transition:"background 0.2s"},children:u>0?u:"·"},d)})]},n)})})]})}),e("div",{style:{marginTop:10,fontSize:11,color:"var(--text-3)",display:"flex",alignItems:"center",gap:6},children:[e("span",{children:r("ageMatrix.low")}),[.15,.35,.55,.7].map(n=>e("span",{style:{display:"inline-block",width:14,height:10,borderRadius:"var(--radius-hairline)",background:`rgba(143,242,92,${n})`}},n)),e("span",{children:r("ageMatrix.high")}),e("span",{style:{marginLeft:8},children:["— ",r("ageMatrix.legend")]})]})]})}function mo(t){return r(`radar.axis.${t}`)}const ft=220,Zo=ft/2,er=ft/2,Dt=80,Nt=14,ms=48;function It(t,s){const o=(t-90)*(Math.PI/180);return[Zo+s*Math.cos(o),er+s*Math.sin(o)]}function gn({data:t}){if(!t||t.length===0)return null;const s=t.length,o=Math.max(1,...t.map(d=>d.count)),a=t.map((d,u)=>360/s*u),n=t.map((d,u)=>{const l=d.count/o,h=Nt+l*(Dt-Nt);return It(a[u],h)}),i=n.map((d,u)=>`${u===0?"M":"L"}${d[0].toFixed(1)},${d[1].toFixed(1)}`).join(" ")+" Z",m=[.25,.5,.75,1];return e("div",{class:"card",children:[e("div",{class:"card-title",style:{marginBottom:8},children:r("radar.title")}),e("div",{style:{display:"flex",alignItems:"center",gap:16,flexWrap:"wrap"},children:[e("svg",{width:ft+ms*2,height:ft,viewBox:`${-ms} 0 ${ft+ms*2} ${ft}`,style:{flexShrink:0},children:[m.map(d=>{const u=a.map(l=>{const h=Nt+d*(Dt-Nt),[c,g]=It(l,h);return`${c.toFixed(1)},${g.toFixed(1)}`});return e("polygon",{points:u.join(" "),fill:"none",stroke:"rgba(255,255,255,0.06)",strokeWidth:1},d)}),a.map((d,u)=>{const[l,h]=It(d,Dt);return e("line",{x1:Zo,y1:er,x2:l.toFixed(1),y2:h.toFixed(1),stroke:"rgba(255,255,255,0.06)",strokeWidth:1},u)}),e("path",{d:i,fill:"rgba(143,242,92,0.15)",stroke:"var(--life)",strokeWidth:1.5,strokeLinejoin:"round"}),n.map(([d,u],l)=>e("circle",{cx:d.toFixed(1),cy:u.toFixed(1),r:3,fill:"var(--life)"},l)),t.map((d,u)=>{const l=a[u],[h,c]=It(l,Dt+18),g=mo(d.axis);return e("text",{x:h.toFixed(1),y:c.toFixed(1),textAnchor:"middle",dominantBaseline:"middle",fontSize:9,fill:"var(--text-2)",fontFamily:"var(--font-ui)",children:g},u)})]}),e("div",{style:{flex:1,minWidth:120},children:[t.map(d=>{const u=o>0?d.count/o:0;return e("div",{style:{marginBottom:8},children:[e("div",{style:{display:"flex",justifyContent:"space-between",fontSize:11,marginBottom:3},children:[e("span",{style:{color:"var(--text-1)"},children:mo(d.axis)}),e("span",{style:{color:"var(--life)",fontFamily:"var(--mono)",fontSize:10},children:d.count})]}),e("div",{style:{height:3,background:"rgba(255,255,255,0.06)",borderRadius:"var(--radius-hairline)",overflow:"hidden"},children:e("div",{style:{width:`${(u*100).toFixed(1)}%`,height:"100%",background:"var(--life)",borderRadius:"var(--radius-hairline)",transition:"width 0.3s"}})})]},d.axis)}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:6},children:r("radar.caption")})]})]})]})}function pn({data:t}){const{workSchedule:s,toolPreferences:o,focusAreas:a,workflow:n,strengths:i,learningAreas:m}=t,d=new Map;for(const c of s.hourDistribution)d.set(c.hour,c.count);const u=Math.max(1,...s.hourDistribution.map(c=>c.count)),l=[...s.hourDistribution].sort((c,g)=>g.count-c.count).slice(0,3).map(c=>`${c.hour.toString().padStart(2,"0")}:00`),h=[...s.dayDistribution].sort((c,g)=>g.count-c.count).slice(0,2).map(c=>r(`patterns.day.${c.dayNum}`));return e("div",{class:"card",children:[e("div",{class:"card-title",children:r("patterns.title")}),e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:r("patterns.workSchedule")}),e("div",{style:{display:"flex",gap:2,flexWrap:"wrap"},children:Array.from({length:24},(c,g)=>{const f=d.get(g)||0,b=f/u;return e("div",{title:`${g.toString().padStart(2,"0")}:00 — ${f}`,style:{width:18,height:18,borderRadius:"var(--radius-xs)",background:b>0?`rgba(143, 242, 92, ${.1+b*.7})`:"var(--bg-0)",border:"1px solid var(--border-subtle)",fontSize:9,display:"flex",alignItems:"center",justifyContent:"center",color:b>.5?"var(--bg-0)":"var(--text-3)",fontFamily:"var(--mono)"},children:g},g)})}),e("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:6,fontFamily:"var(--mono)"},children:[r("patterns.peakHours"),": ",l.join(", "),h.length>0&&e("span",{children:[" · ",r("patterns.busiestDays"),": ",h.join(", ")]})]})]}),o.length>0&&e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:r("patterns.tools")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:o.slice(0,10).map(c=>e("span",{class:"tag",style:{fontSize:11,padding:"2px 8px"},children:[c.tool," ",e("span",{style:{opacity:.5},children:["(",c.sessions,")"]})]},c.tool))})]}),e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:r("patterns.workflow")}),e("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:8},children:[e("div",{class:"stat",style:{padding:12},children:[e("div",{class:"stat-val",style:{fontSize:18},children:n.avgSessionMinutes>0?`${Math.round(n.avgSessionMinutes)}m`:"—"}),e("div",{class:"stat-lbl",children:r("patterns.avgSession")})]}),e("div",{class:"stat",style:{padding:12},children:[e("div",{class:"stat-val",style:{fontSize:18},children:n.totalSessions>0?n.commitsPerSession.toFixed(1):"—"}),e("div",{class:"stat-lbl",children:r("patterns.commitsPerSession")})]})]})]}),a.length>0&&e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:r("patterns.focus")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:a.slice(0,12).map(c=>e("span",{class:"tag",style:{fontSize:11,padding:"2px 8px"},children:[Ge(c.type)," ",e("span",{style:{opacity:.5},children:["(",c.count,")"]})]},c.type))})]}),(i.length>0||m.length>0)&&e("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12},children:[e("div",{children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:r("patterns.strengths")}),i.slice(0,5).map(c=>e("div",{style:{marginBottom:6},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:3},children:[e("span",{style:{fontSize:12,color:"var(--text-1)"},children:Ge(c.type)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:11,color:"var(--life)"},children:[Math.round(c.avgConfidence*100),"%"]})]}),e("div",{style:{height:3,borderRadius:"var(--radius-hairline)",background:"var(--bg-0)"},children:e("div",{style:{height:"100%",width:`${Math.round(c.avgConfidence*100)}%`,borderRadius:"var(--radius-hairline)",background:"rgba(143, 242, 92, 0.5)",transition:"width 600ms ease-out"}})})]},c.type)),i.length===0&&e("div",{style:{fontSize:11,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]}),e("div",{children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:r("patterns.learning")}),m.slice(0,5).map(c=>e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:6,fontSize:12},children:[e("span",{style:{color:"var(--text-1)"},children:c.tag}),e("span",{style:{fontFamily:"var(--mono)",fontSize:11,color:"var(--text-3)"},children:c.count})]},c.tag)),m.length===0&&e("div",{style:{fontSize:11,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]})]})]})}function fn(t){const s=`telemetry.flow.${t}`,o=r(s);return o===s?t:o}function yn(t){const s=`telemetry.errorClass.${t}`,o=r(s);return o===s?t:o}function uo(t){return`${Math.round(t*100)}%`}function vn(t){return t==null?"—":t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`}function bn(){const[t,s]=v(null),[o,a]=v(null),[n,i]=v(!0),[m,d]=v(30);return te(()=>{let u=!1;return i(!0),Z("GET",`/v1/telemetry?window=${m}`).then(l=>{if(!u){if(!Array.isArray(l?.summaries)){console.warn("[memesh dashboard] /v1/telemetry answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",l),a("unreadable"),s(null);return}a(null),s(l)}}).catch(l=>{u||(console.warn("[memesh dashboard] /v1/telemetry failed to load:",l),a(at(l)))}).finally(()=>{u||i(!1)}),()=>{u=!0}},[m]),e("div",{class:"card",style:{padding:16},children:[e("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",marginBottom:8,flexWrap:"wrap",gap:8},children:[e("span",{class:"card-title",style:{margin:0},children:r("telemetry.title")}),e("div",{style:{display:"flex",gap:4,fontSize:12},children:[7,30,90].map(u=>e("button",{class:"btn btn-ghost",style:{padding:"2px 8px",fontSize:11,border:"1px solid "+(m===u?"var(--life)":"var(--border)"),color:m===u?"var(--life)":"var(--text-2)",background:m===u?"rgba(143,242,92,0.10)":"transparent"},onClick:()=>d(u),children:r("telemetry.lastNDays",{n:u})},u))})]}),n&&e("div",{style:{color:"var(--text-3)",fontSize:13},children:r("telemetry.loading")}),!n&&o&&e("div",{class:"error-box",role:"alert",style:{fontSize:13},children:Ue(o)}),!n&&!o&&t&&t.summaries.length===0&&e("div",{style:{color:"var(--text-2)",fontSize:13,padding:8},children:r("telemetry.empty")}),!n&&!o&&t&&t.summaries.length>0&&e("div",{style:{display:"flex",flexDirection:"column",gap:12},children:t.summaries.map(u=>{const l=u.total_attempts>0?u.successes/u.total_attempts:0,h=u.total_calls>0?u.fallback_used/u.total_calls:0,c=Object.entries(u.by_provider),g=Object.entries(u.by_model),f=Object.entries(u.by_project),b=Object.entries(u.by_error_class).sort((M,k)=>k[1]-M[1]);return e("div",{style:{padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",borderLeft:`2px solid ${l>=.9?"var(--life)":l>=.5?"var(--warning)":"var(--danger)"}`},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"baseline",marginBottom:6},children:[e("span",{style:{fontWeight:600},children:fn(u.flow)}),e("span",{style:{fontSize:12,color:"var(--text-3)"},children:[r("telemetry.callsCount",{n:u.total_calls})," · ",r("telemetry.attemptsCount",{n:u.total_attempts})]})]}),e("div",{style:{display:"flex",gap:16,flexWrap:"wrap",fontSize:13,marginBottom:6},children:[e("span",{children:[e("span",{style:{color:"var(--text-3)"},children:[r("telemetry.successRate"),": "]}),e("strong",{style:{color:l>=.9?"var(--life)":l>=.5?"var(--warning)":"var(--danger)"},children:uo(l)})]}),e("span",{children:[e("span",{style:{color:"var(--text-3)"},children:[r("telemetry.medianLatency"),": "]}),e("strong",{children:vn(u.median_latency_ms)})]}),u.fallback_used>0&&e("span",{style:{color:"var(--warning)"},children:["⚠️ ",r("telemetry.fallbackUsed",{n:u.fallback_used,pct:uo(h)})]})]}),c.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[r("telemetry.byProvider"),":"," ",c.map(([M,k])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[M," ",k.ok,"/",k.ok+k.fail]},M))]}),g.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[r("telemetry.byModel"),":"," ",g.map(([M,k])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[M," ",k.ok,"/",k.ok+k.fail]},M))]}),f.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[r("telemetry.byProject"),":"," ",f.map(([M,k])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[M," ",k.ok,"/",k.ok+k.fail]},M))]}),b.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)"},children:[r("telemetry.errors"),":"," ",b.map(([M,k])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11,background:M==="auth"?"var(--danger-soft)":"var(--warning-soft)",color:M==="auth"?"var(--danger)":"var(--warning)"},children:[yn(M)," ×",k]},M))]})]},u.flow)})})]})}function ho(t){return typeof t?.velocity?.decisionsPerWeek=="number"&&typeof t.staleness?.openDecisionCount=="number"&&typeof t.staleness?.stalePlanCount=="number"&&typeof t.connectedness?.orphanRate=="number"&&typeof t.connectedness?.totalRelations=="number"}function kn(){const[t,s]=v(null),[o,a]=v(null);if(te(()=>{Z("GET","/v1/analytics/pm").then(m=>{m!==null&&!ho(m)&&console.warn("[PmAnalyticsPanel] /v1/analytics/pm answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",m),s(m)}).catch(m=>a(String(m)))},[]),o)return console.warn("[PmAnalyticsPanel]",o),null;if(!ho(t))return null;const n=(t.connectedness.orphanRate*100).toFixed(1),i=t.connectedness.orphanRate>.7?"var(--danger)":t.connectedness.orphanRate>.4?"var(--warning)":"var(--success)";return e("div",{class:"card",style:{marginTop:8,padding:16},children:[e("div",{class:"card-title",style:{marginBottom:12},children:r("pm.title")}),e("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, 1fr)",gap:12},children:[e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)"},children:t.velocity.decisionsPerWeek.toFixed(1)}),e("div",{style:{fontSize:11,color:"var(--text-2)",marginTop:2},children:r("pm.decisionsPerWeek")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)"},children:t.staleness.openDecisionCount}),e("div",{style:{fontSize:11,color:"var(--text-2)",marginTop:2},children:r("pm.openDecisions")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)",color:i},children:[n,"%"]}),e("div",{style:{fontSize:11,color:"var(--text-2)",marginTop:2},children:r("pm.orphanRate")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)"},children:t.connectedness.totalRelations}),e("div",{style:{fontSize:11,color:"var(--text-2)",marginTop:2},children:r("pm.relationsTotal")})]})]}),t.staleness.stalePlanCount>0&&e("div",{style:{marginTop:10,fontSize:12,color:"var(--warning)"},children:r("pm.stalePlans",{count:t.staleness.stalePlanCount})})]})}const xn=["activity","quality","freshness","lessons"];function wn(t){return typeof t?.totalEntities=="number"&&typeof t.totalObservations=="number"&&typeof t.totalRelations=="number"&&typeof t.totalTags=="number"&&Array.isArray(t.tagDistribution)}function us(t,s,o){return!o&&s!==null&&console.warn(`[memesh dashboard] ${t} answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:`,s),o}function _n(t){if(typeof t?.healthScore!="number")return!1;const s=t.healthFactors;if(!s)return!1;for(const o of xn)if(typeof s[o]?.score!="number"||typeof s[o]?.weight!="number")return!1;return Array.isArray(t.loopMetric?.trend)&&Array.isArray(t.timeline)}function Mn(t){return Array.isArray(t?.workSchedule?.hourDistribution)&&Array.isArray(t.workSchedule?.dayDistribution)&&Array.isArray(t.toolPreferences)&&Array.isArray(t.focusAreas)&&Array.isArray(t.strengths)&&Array.isArray(t.learningAreas)&&typeof t.workflow?.avgSessionMinutes=="number"&&typeof t.workflow?.totalSessions=="number"&&typeof t.workflow?.commitsPerSession=="number"}function Sn(){const[t,s]=v(null),[o,a]=v(null),[n,i]=v(null),[m,d]=v(!0),[u,l]=v(null),h=ze(()=>{d(!0);let c=!1,g=!1;const f=b=>M=>(console.warn(`[memesh dashboard] ${b} failed to load:`,M),at(M)==="unreachable"?c=!0:g=!0,null);Promise.all([Z("GET","/v1/stats").catch(f("/v1/stats")),Z("GET","/v1/analytics").catch(f("/v1/analytics")),Z("GET","/v1/patterns").catch(f("/v1/patterns"))]).then(([b,M,k])=>{const y=us("/v1/stats",b,wn(b)),L=us("/v1/analytics",M,_n(M)),N=us("/v1/patterns",k,Mn(k));(b!==null&&!y||M!==null&&!L||k!==null&&!N)&&(g=!0),s(y?b:null),a(L?M:null),i(N?k:null),l(c?"unreachable":g?"unreadable":null)}).finally(()=>d(!1))},[]);return te(()=>{h()},[h]),m?e("div",{class:"empty",children:e("div",{class:"loading"})}):!t&&!o?e("div",{class:"error-box",role:"alert",children:u?Ue(u):`${r("common.error")}: ${r("analytics.loadFailed")}`}):e("div",{children:[t&&e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalEntities.toLocaleString(ke())}),e("div",{class:"stat-lbl",children:r("analytics.totalMemories")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalObservations.toLocaleString(ke())}),e("div",{class:"stat-lbl",children:r("analytics.knowledgeFacts")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalRelations.toLocaleString(ke())}),e("div",{class:"stat-lbl",children:r("analytics.connections")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalTags.toLocaleString(ke())}),e("div",{class:"stat-lbl",children:r("analytics.topics")})]})]}),o&&e("div",{style:{marginTop:8},children:e(rn,{metric:o.loopMetric})}),o&&e("div",{style:{marginTop:8},children:e(sn,{score:o.healthScore,factors:o.healthFactors})}),o&&e("div",{style:{marginTop:8},children:e(cn,{data:o.timeline})}),o&&e("div",{style:{marginTop:8,display:"grid",gridTemplateColumns:"minmax(0, 1.4fr) minmax(0, 1fr)",gap:8},children:[e(hn,{data:Array.isArray(o.ageMatrix)?o.ageMatrix:[]}),e(gn,{data:Array.isArray(o.knowledgeRadar)?o.knowledgeRadar:[]})]}),n&&e("div",{style:{marginTop:8},children:e(pn,{data:n})}),e("div",{style:{marginTop:8},children:e(bn,{})}),e(kn,{}),t&&(()=>{const c=["auto_saved","auto-tracked","session_end","session:","source:","scope:","date:","urgency:"],g=t.tagDistribution.filter(f=>!c.some(b=>f.tag.startsWith(b))&&!/^\d{4}-\d{2}-\d{2}/.test(f.tag));return g.length>0?e("div",{class:"card",style:{marginTop:8},children:[e("div",{class:"card-title",children:r("analytics.topics")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:g.slice(0,30).map(f=>e("span",{class:"tag",style:{fontSize:Math.max(11,Math.min(15,10+Math.log2(f.count+1)))+"px"},children:[f.tag," ",e("span",{style:{opacity:.5},children:["(",f.count,")"]})]},f.tag))})]}):null})()]})}function Cn(t){return t==="warning"?"var(--warning)":t==="muted"?"var(--text-2)":"var(--life)"}function An(t){if(!t||typeof t!="object"||typeof t.healthScore!="number")return!1;const s=t.criticalLessons;if(!s||typeof s.critical!="number"||typeof s.severityTagged!="number"||typeof s.total!="number")return!1;const o=t.citationCompliance;return!(o!=null&&(typeof o.cited!="number"||typeof o.total!="number")||!t.loopMetric||typeof t.loopMetric.reusedThisWeek!="number")}function En(t,s){const o=l=>l.toLocaleString(s),a={key:"health",label:r("metrics.health"),value:`${t.healthScore}`,note:r("metrics.healthNote"),tone:t.healthScore>=60?"life":t.healthScore>=40?"warning":"muted"},n=t.criticalLessons,i=n.severityTagged===0?{key:"critical",label:r("metrics.critical"),value:null,note:n.total===0?r("metrics.criticalNoLessons"):r("metrics.criticalUnclassified",{total:o(n.total)}),tone:"muted"}:{key:"critical",label:r("metrics.critical"),value:o(n.critical),note:n.severityTagged<n.total?r("metrics.criticalPartial",{tagged:o(n.severityTagged),total:o(n.total)}):r("metrics.criticalAll",{total:o(n.total)}),tone:n.critical>0?"warning":"life"},m=t.citationCompliance,d=m===null?{key:"citation",label:r("metrics.citation"),value:null,note:r("metrics.citationNotMeasured"),tone:"muted"}:{key:"citation",label:r("metrics.citation"),value:`${Math.round(m.cited/m.total*100)}%`,note:r("metrics.citationNote",{cited:o(m.cited),total:o(m.total)})},u={key:"loop",label:r("metrics.reused"),value:o(t.loopMetric.reusedThisWeek),note:r("metrics.reusedNote")};return[a,i,d,u]}function Ln(){const[t,s]=v({phase:"loading"});if(te(()=>{let a=!1;return Z("GET","/v1/analytics").then(n=>{if(!a){if(!An(n)){console.warn("[memesh dashboard] /v1/analytics answered without the groups this row reads — stale server or version skew:",n),s({phase:"failed",failure:"unreadable"});return}s({phase:"loaded",data:n})}}).catch(n=>{a||(console.warn("[memesh dashboard] /v1/analytics failed to load for the metrics row:",n),s({phase:"failed",failure:at(n)}))}),()=>{a=!0}},[]),t.phase==="loading")return e("div",{class:"stats-row","aria-busy":"true",children:e("div",{class:"stat",children:e("div",{class:"loading"})})});if(t.phase==="failed")return e("div",{role:"alert",class:"card",style:{marginBottom:8,fontSize:12,color:"var(--text-2)"},children:Ue(t.failure)});const o=En(t.data,ke());return e("div",{class:"stats-row",children:o.map(a=>e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{color:Cn(a.tone),fontSize:a.value===null?13:void 0},children:a.value??r("metrics.notMeasured")}),e("div",{class:"stat-lbl",children:a.label}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:2},children:a.note})]},a.key))})}function Tn(){const[t,s]=v(!1),[o,a]=v(!1);function n(){const i=!t;s(i),i&&a(!0)}return e("div",{children:[e(Ln,{}),e(Zr,{}),e("div",{class:"card",style:{marginTop:8},children:[e("button",{onClick:n,"aria-expanded":t,"aria-controls":"home-analytics",style:{display:"flex",alignItems:"center",gap:8,width:"100%",background:"none",border:"none",cursor:"pointer",padding:0,color:"var(--text-0)",font:"600 13px var(--font-ui)",textAlign:"left"},children:[e("svg",{width:"12",height:"12",viewBox:"0 0 16 16","aria-hidden":"true",style:{transform:t?"rotate(90deg)":"none",transition:"transform 150ms",color:"var(--text-2)",flexShrink:0},children:e("path",{d:"M6 4 L10 8 L6 12",stroke:"currentColor",strokeWidth:"1.5",fill:"none",strokeLinecap:"round",strokeLinejoin:"round"})}),r("home.analyticsTitle"),!t&&e("span",{style:{fontWeight:400,fontSize:12,color:"var(--text-3)"},children:r("home.analyticsHint")})]}),e("div",{id:"home-analytics",hidden:!t,style:{marginTop:t?14:0},children:o&&e(Sn,{})})]})]})}const ve=1.5;function Pn(t){switch(t){case"lesson_learned":case"lesson":case"mistake":return"lesson";case"decision":case"architecture_decision":case"design_decision":return"decision";case"pattern":case"technical_pattern":case"best_practice":return"pattern";case"bug_fix":case"verification_result":case"test_result":return"bug";case"architecture":case"infrastructure":return"architecture";case"feature":case"release":case"refactoring":return"feature";case"commit":return"commit";case"session_keypoint":case"session_identity":case"session-insight":case"session-summary":case"session-identity":return"session";case"workflow_checkpoint":return"milestone";case"weekly-summary":case"weekly_summary":return"calendar";case"note":case"plan":case"knowledge":case"process":return"note";default:return"dot"}}const Rn={lesson:e(de,{children:[e("path",{d:"M6 9.5 a4 4 0 1 1 4 0 v1 a1 1 0 0 1 -1 1 h-2 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:ve,strokeLinejoin:"round"}),e("path",{d:"M7 13 h2",stroke:"currentColor",strokeWidth:ve,strokeLinecap:"round"}),e("path",{d:"M7 14.5 h2",stroke:"currentColor",strokeWidth:ve,strokeLinecap:"round"})]}),decision:e(de,{children:[e("circle",{cx:"8",cy:"8",r:"5.5",fill:"none",stroke:"currentColor",strokeWidth:ve}),e("circle",{cx:"8",cy:"8",r:"2",fill:"none",stroke:"currentColor",strokeWidth:ve}),e("path",{d:"M8 0.5 v3 M8 12.5 v3 M0.5 8 h3 M12.5 8 h3",stroke:"currentColor",strokeWidth:ve,strokeLinecap:"round"})]}),pattern:e("path",{d:"M3 3 h4 v1.5 a1.5 1.5 0 0 0 3 0 V3 h3 v3 h-1.5 a1.5 1.5 0 0 0 0 3 H13 v4 h-4 v-1.5 a1.5 1.5 0 0 0 -3 0 V13 H3 v-4 h1.5 a1.5 1.5 0 0 0 0 -3 H3 z",fill:"none",stroke:"currentColor",strokeWidth:ve,strokeLinejoin:"round"}),bug:e(de,{children:[e("ellipse",{cx:"8",cy:"9",rx:"3.5",ry:"4",fill:"none",stroke:"currentColor",strokeWidth:ve}),e("path",{d:"M8 5 v-1 M5.5 6.5 L4 5 M10.5 6.5 L12 5 M4.5 9 H2.5 M11.5 9 H13.5 M5 11.5 L3.5 13 M11 11.5 L12.5 13",stroke:"currentColor",strokeWidth:ve,strokeLinecap:"round"})]}),architecture:e(de,{children:[e("rect",{x:"2",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:ve}),e("rect",{x:"9",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:ve}),e("rect",{x:"5.5",y:"2",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:ve})]}),feature:e(de,{children:e("path",{d:"M8 2 L9.5 6.5 L14 8 L9.5 9.5 L8 14 L6.5 9.5 L2 8 L6.5 6.5 z",fill:"none",stroke:"currentColor",strokeWidth:ve,strokeLinejoin:"round"})}),commit:e(de,{children:e("path",{d:"M5 2 L4 14 M11 2 L10 14 M2.5 6 H13.5 M2.5 10 H13.5",stroke:"currentColor",strokeWidth:ve,strokeLinecap:"round"})}),session:e(de,{children:[e("circle",{cx:"8",cy:"9",r:"5",fill:"none",stroke:"currentColor",strokeWidth:ve}),e("path",{d:"M8 9 V5.5 M8 9 L10.5 11",stroke:"currentColor",strokeWidth:ve,strokeLinecap:"round"}),e("path",{d:"M6.5 2 H9.5",stroke:"currentColor",strokeWidth:ve,strokeLinecap:"round"})]}),milestone:e(de,{children:[e("path",{d:"M4 2 V14",stroke:"currentColor",strokeWidth:ve,strokeLinecap:"round"}),e("path",{d:"M4 3 H12 L10 6 L12 9 H4 z",fill:"none",stroke:"currentColor",strokeWidth:ve,strokeLinejoin:"round"})]}),calendar:e(de,{children:[e("rect",{x:"2",y:"3",width:"12",height:"11",rx:"1",fill:"none",stroke:"currentColor",strokeWidth:ve}),e("path",{d:"M2 6.5 H14 M5 1.5 V4.5 M11 1.5 V4.5",stroke:"currentColor",strokeWidth:ve,strokeLinecap:"round"})]}),note:e(de,{children:[e("path",{d:"M4 2 H10 L13 5 V14 H4 z",fill:"none",stroke:"currentColor",strokeWidth:ve,strokeLinejoin:"round"}),e("path",{d:"M10 2 V5 H13",fill:"none",stroke:"currentColor",strokeWidth:ve,strokeLinejoin:"round"}),e("path",{d:"M6 8.5 H11 M6 11 H11",stroke:"currentColor",strokeWidth:ve,strokeLinecap:"round"})]}),dot:e("circle",{cx:"8",cy:"8",r:"2",fill:"currentColor"})};function Zt({type:t,size:s=16,color:o,ariaLabel:a}){const n=Pn(t),i=a??Ge(t);return e("svg",{width:s,height:s,viewBox:"0 0 16 16",role:"img","aria-label":i,style:{color:o??"currentColor",flexShrink:0,display:"inline-block",verticalAlign:"text-bottom"},children:[e("title",{children:i}),Rn[n]]})}function go(t,s){return t.length>s?t.slice(0,s)+"…":t}function jn(t){if(!t)return"";const s=new Date(t);if(Number.isNaN(s.getTime()))return t.slice(0,16).replace("T"," ");const o=a=>String(a).padStart(2,"0");return`${s.getFullYear()}-${o(s.getMonth()+1)}-${o(s.getDate())} ${o(s.getHours())}:${o(s.getMinutes())}`}const zn={high:{bg:"var(--life-soft)",fg:"var(--life)"},medium:{bg:"var(--life-soft)",fg:"var(--life)"},low:{bg:"var(--border-subtle)",fg:"var(--text-2)"},none:{bg:"var(--border-subtle)",fg:"var(--text-3)"}};function Kt({entity:t,actions:s,highlight:o}){const a=Xe(t)||r("memory.noContent"),n=t.observations?.length??0,i=t.archived||t.status==="archived",m=Qt(t),d=Yo(t.access_count),u=zn[d.tone],l=vt(t.last_accessed_at||t.created_at),h=(t.relations?.length??0)>0;return e("div",{class:"mem-row",style:i?{opacity:.45}:void 0,children:[e("div",{class:"mem-time",style:{textAlign:"center"},children:[e("div",{style:{height:20,display:"flex",alignItems:"center",justifyContent:"center",color:"var(--text-2)"},children:e(Zt,{type:t.type,size:18})}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:2},children:l})]}),e("div",{class:"mem-body",children:[e("div",{class:"mem-preview",title:t.name,children:o?e(Dn,{text:go(a,160),term:o}):go(a,160)}),e("div",{class:"mem-meta",style:{flexWrap:"wrap",gap:6},children:[e("span",{class:"badge badge-type",children:Ge(t.type)}),i&&e("span",{class:"badge badge-archived",children:r("memory.archivedBadge")}),m&&e("span",{class:"tag",style:{background:"var(--life-soft)",color:"var(--life)",display:"inline-flex",alignItems:"center",gap:4},title:r("memory.tooltip.project"),children:[e("svg",{width:"11",height:"11",viewBox:"0 0 16 16","aria-hidden":"true",style:{flexShrink:0},children:e("path",{d:"M2 4 a1 1 0 0 1 1 -1 h4 l2 2 h5 a1 1 0 0 1 1 1 v6 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"})}),m]}),d.tone!=="none"&&e("span",{class:"tag",style:{background:u.bg,color:u.fg,fontWeight:d.tone==="high"?600:400},title:r("memory.tooltip.recalled",{count:d.count}),children:["✓ ",d.label]}),h&&e("span",{class:"tag",style:{opacity:.7},title:r("memory.tooltip.hasRelations",{count:t.relations.length}),children:["→ ",t.relations.length]}),e("span",{style:{color:"var(--text-3)",fontSize:10,fontFamily:"var(--mono)",opacity:.85},title:r("memory.tooltip.createdAt",{date:t.created_at}),children:["· ",jn(t.created_at)]}),n>1&&e("span",{style:{color:"var(--text-3)",fontSize:11},children:["· ",r("memory.factsCount",{count:n})]}),t.tags?.filter(c=>!c.startsWith("project:")&&!/^\d{4}-\d{2}-\d{2}/.test(c)).slice(0,3).map(c=>e("span",{class:"tag",children:c},c))]})]}),s&&e("div",{class:"mem-actions",children:s})]})}function Dn({text:t,term:s}){if(!s)return e(de,{children:t});const o=[],a=t.toLowerCase(),n=s.toLowerCase();let i=0;for(;i<t.length;){const m=a.indexOf(n,i);if(m===-1){o.push(t.slice(i));break}m>i&&o.push(t.slice(i,m)),o.push(e("mark",{children:t.slice(m,m+n.length)})),i=m+n.length}return e(de,{children:o})}function js(){const[t,s]=v(!1),[o,a]=v("");async function n(){a(""),s(!0);try{await Z("POST","/v1/demo/seed"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(i){a(He(i))}finally{s(!1)}}return e("div",{class:"empty",style:{padding:"32px 20px"},children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-0)",marginBottom:6},children:r("emptyLibrary.title")}),e("div",{style:{fontSize:13,lineHeight:1.55,color:"var(--text-1)",maxWidth:480,margin:"0 auto 14px"},children:r("emptyLibrary.body")}),e("button",{type:"button",class:"btn btn-primary",onClick:()=>void n(),disabled:t,style:{minWidth:160},children:r(t?"onboarding.seedingButton":"onboarding.seedButton")}),e("div",{style:{fontSize:12,color:"var(--text-3)",marginTop:8},children:r("onboarding.seedHint")}),o&&e("div",{role:"alert",style:{marginTop:10,fontSize:12,color:"var(--danger)"},children:o})]})}function Oe({label:t,active:s,onClick:o,count:a,dot:n}){return e("button",{onClick:o,"aria-pressed":s,style:{padding:"4px 10px",borderRadius:"var(--radius)",border:"1px solid",borderColor:s?"var(--life)":"var(--border)",background:s?"var(--life-soft)":"transparent",color:s?"var(--life)":"var(--text-2)",fontSize:11,cursor:"pointer",whiteSpace:"nowrap",fontFamily:"var(--font-ui)",display:"inline-flex",alignItems:"center",gap:6},children:[n&&e("span",{"aria-hidden":"true",style:{width:8,height:8,borderRadius:"var(--radius-hairline)",background:n,flexShrink:0}}),t,a!==void 0&&e("span",{style:{opacity:.6,fontFamily:"var(--mono)",fontSize:10},children:a})]})}function Nn(t){const s=[];let o=null;for(const a of t){const n=a.trim();n.startsWith("Error:")?(o&&s.push(o),o={error:n.slice(6).trim(),rootCause:"",fix:"",prevention:""}):n.startsWith("Root cause:")?(o||(o={error:"",rootCause:"",fix:"",prevention:""}),o.rootCause=n.slice(11).trim()):n.startsWith("Fix:")||n.startsWith("Solution")?(o||(o={error:"",rootCause:"",fix:"",prevention:""}),o.fix=n.replace(/^(Fix|Solution\s*\d*):/i,"").trim()):n.startsWith("Prevention:")&&(o||(o={error:"",rootCause:"",fix:"",prevention:""}),o.prevention=n.slice(11).trim())}return o&&s.push(o),s}function In(t){const s=t.observations??[],o=s[0]?.match(/^Plan "(.+?)" completed \((\d+) steps?\)/),a=s.find(i=>i.startsWith("Steps:"))?.slice(6).trim()??"",n=s.find(i=>i.startsWith("Commits:"))?.slice(8).trim()??"";return{planName:o?.[1]??Xe(t),stepCount:o?parseInt(o[2],10):0,steps:a,commits:n?n.split(",").map(i=>i.trim()).filter(Boolean):[]}}const po={critical:"var(--danger)",major:"var(--warning)",minor:"var(--info)"};function Hn(t){const s=t.tags??[];return s.includes("severity:critical")?"critical":s.includes("severity:major")?"major":s.includes("severity:minor")?"minor":null}function On({entity:t}){const s=Hn(t);return s?e("span",{class:"badge",style:{background:`${po[s]}18`,color:po[s]},children:r(`lessons.severity.${s}`)}):null}function Ht({label:t,color:s,text:o}){return e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,fontWeight:600,color:s,marginBottom:2,fontFamily:"var(--font-ui)"},children:t}),e("div",{style:{fontSize:13,lineHeight:1.55},children:o})]})}function Bn({entity:t}){const s=Nn(t.observations??[]);return s.length===0?e("div",{style:{fontSize:12,color:"var(--text-3)",fontStyle:"italic"},children:r("lessons.unstructured")}):e(de,{children:s.map((o,a)=>e("div",{style:{marginTop:a>0?12:0,paddingTop:a>0?12:0,borderTop:a>0?"1px dashed var(--border-subtle)":"none"},children:[o.error&&e(Ht,{label:r("lessons.error"),color:"var(--danger)",text:o.error}),o.rootCause&&e(Ht,{label:r("lessons.rootCause"),color:"var(--warning)",text:o.rootCause}),o.fix&&e(Ht,{label:r("lessons.fix"),color:"var(--success)",text:o.fix}),o.prevention&&e(Ht,{label:r("lessons.prevention"),color:"var(--info)",text:o.prevention})]},a))})}function Fn({entity:t}){const s=In(t);return e("div",{children:[e("div",{style:{fontSize:12,color:"var(--text-3)",marginBottom:6,fontFamily:"var(--font-ui)"},children:[e("span",{style:{fontFamily:"var(--mono)"},children:s.stepCount})," ",r("lessons.stepsLabel")," · ",r("lessons.commitsCount",{count:s.commits.length})]}),s.steps&&e("div",{style:{fontSize:13,color:"var(--text-1)",lineHeight:1.55},children:s.steps}),s.commits.length>0&&e("div",{style:{marginTop:8,fontSize:11,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[s.commits.slice(0,6).join(" · "),s.commits.length>6&&e("span",{children:[" · +",s.commits.length-6]})]})]})}function qn({entity:t}){const s=t.observations??[];return s.length===0?e("div",{style:{fontSize:12,color:"var(--text-3)",fontStyle:"italic"},children:r("lessons.unstructured")}):e("ul",{style:{fontSize:13,lineHeight:1.6,margin:0,paddingLeft:18,color:"var(--text-1)"},children:[s.slice(0,8).map((o,a)=>e("li",{style:{marginBottom:3},children:o},a)),s.length>8&&e("li",{style:{color:"var(--text-3)",listStyle:"none"},children:r("lessons.moreItems",{count:s.length-8})})]})}function Un({entity:t}){const s=Xr(t);return e("div",{style:{padding:"10px 0 4px 40px",fontFamily:"var(--font-memory)"},children:s==="failure"?e(Bn,{entity:t}):s==="plan-completion"?e(Fn,{entity:t}):e(qn,{entity:t})})}const Wn=new Set(["lesson_learned","lesson","mistake"]),Kn=new Set([...Wn,"decision","milestone","pattern","technical_pattern","goal","plan","task-state"]),Vn=new Set(["commit","session-insight","session-summary","session_keypoint","session-identity","session_identity","weekly-summary","weekly_summary","workflow_checkpoint"]);function fo(t){return Kn.has(t)?"work":Vn.has(t)?"evidence":"knowledge"}function $n(t){const s=/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2}):(\d{2})$/.exec(t??"");if(!s)return null;const o=Date.UTC(+s[1],+s[2]-1,+s[3],+s[4],+s[5],+s[6]);if(!Number.isFinite(o))return null;const a=new Date(o);return a.getUTCFullYear()!==+s[1]||a.getUTCMonth()!==+s[2]-1||a.getUTCDate()!==+s[3]||a.getUTCHours()!==+s[4]||a.getUTCMinutes()!==+s[5]||a.getUTCSeconds()!==+s[6]?null:o}const hs=30,yo=2e3,Gn=30,vo=["knowledge","activity","session","reference"];function _t(t){return!!t.archived||t.status==="archived"}function Ms(t){if(!t)return null;const s=$n(t);if(s!==null)return s;const o=Date.parse(t);return Number.isNaN(o)?null:o}function Mt(t){return Ms(t.last_accessed_at||t.created_at)}function gs(t,s){return t===null?s===null?0:1:s===null?-1:s-t}function Yn(t){const s=Mt(t);return s===null?null:new Date(s).toISOString()}function Xn({health:t}){const[s,o]=v([]),[a,n]=v([]),[i,m]=v(""),[d,u]=v(!0),[l,h]=v(""),[c,g]=v(0),[f]=Ps(),[b,M]=v({kind:"layer",v:f?"work":"all"}),[k,y]=v("all"),[L,N]=v("all"),[W,U]=v("all"),[p,w]=v("most-recalled"),[B,T]=v(null),[Y,_]=v(!1),[R,ae]=v(()=>new Set),Ce=ne(0),ge=ne(0);async function pe(){const A=++Ce.current;u(!0),h("");try{const[G,oe]=await Promise.all([Z("GET",`/v1/entities?limit=${yo}&status=all`),$o().catch(()=>[])]);if(A!==Ce.current)return;Array.isArray(G)?o(G):(console.warn("[memesh dashboard] /v1/entities answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",G),o([]),h(Ue("unreadable"))),n(oe),g(0),window.dispatchEvent(new Event("memesh:data-changed"))}catch(G){if(A!==Ce.current)return;console.warn("[memesh dashboard] /v1/entities failed to load:",G),h(Ue(at(G)))}finally{A===Ce.current&&u(!1)}}te(()=>{pe()},[]),te(()=>{g(0)},[i,b,k,L,W,p]);function D(){ge.current++,T(null),_(!1)}function P(A){M(A),D()}te(()=>{M(A=>A.kind==="layer"&&(A.v==="work"||A.v==="all")?{kind:"layer",v:f?"work":"all"}:A)},[f]);const q=be(()=>s.filter(A=>!_t(A)),[s]),K=be(()=>s.filter(_t),[s]),J=be(()=>{const A={work:0,evidence:0};for(const G of q){const oe=fo(G.type);oe==="work"?A.work++:oe==="evidence"&&A.evidence++}return A},[q]),he=be(()=>{const A={knowledge:0,activity:0,session:0,reference:0};for(const G of q)A[_s(G.type)]++;return A},[q]);function fe(A){return b.kind==="archived"?_t(A):_t(A)?!1:b.kind==="cluster"?_s(A.type)===b.v:b.v==="all"?!0:fo(A.type)===b.v}const se=be(()=>{const A=i.toLowerCase();return s.filter(G=>!(!fe(G)||k!=="all"&&Go(Yn(G))!==k||L==="recalled"&&(G.access_count??0)===0||L==="never"&&(G.access_count??0)>0||W!=="all"&&Qt(G)!==W||A&&![G.name,G.title??"",G.type,...G.observations??[],...G.tags??[]].join(" ").toLowerCase().includes(A)))},[s,b,k,L,W,i]),ce=be(()=>{const A=[...se];return p==="most-recalled"?A.sort((G,oe)=>(oe.access_count??0)-(G.access_count??0)||gs(Mt(G),Mt(oe))):p==="created"?A.sort((G,oe)=>gs(Ms(G.created_at),Ms(oe.created_at))):A.sort((G,oe)=>gs(Mt(G),Mt(oe))),A},[se,p]),we=Math.ceil(ce.length/hs),Pe=ce.slice(c*hs,(c+1)*hs);async function Ne(){const A=i.trim();if(!A)return;const G=++ge.current;_(!0),h("");try{const oe=await Z("POST","/v1/recall",{query:A,limit:Gn}),Qe=Array.isArray(oe)?oe:oe.entities;if(G!==ge.current)return;if(!Array.isArray(Qe)){console.warn("[memesh dashboard] /v1/recall answered with a shape this bundle cannot read:",oe),h(Ue("unreadable"));return}T(Qe)}catch(oe){if(G!==ge.current)return;h(He(oe))}finally{G===ge.current&&_(!1)}}async function Be(A){if(confirm(r("browse.confirmArchive")))try{await Z("POST","/v1/forget",{name:A}),pe()}catch(G){h(r("browse.archiveFailed",{message:He(G)}))}}async function De(A){try{await Z("POST","/v1/remember",{name:A,type:"restored"}),pe()}catch(G){h(r("browse.restoreFailed",{message:He(G)}))}}function Ae(A){ae(G=>{const oe=new Set(G);return oe.has(A)?oe.delete(A):oe.add(A),oe})}function Fe(A,G){const oe=R.has(A.id),Qe=_t(A);return e("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"12px 0"},children:[e(Kt,{entity:A,highlight:G,actions:e(de,{children:[e(On,{entity:A}),e("button",{class:"btn btn-sm",style:{padding:"6px 8px",minHeight:28},"aria-expanded":oe,"aria-controls":`mem-detail-${A.id}`,"aria-label":r(oe?"memories.collapse":"memories.expand"),onClick:()=>Ae(A.id),children:e("svg",{width:"12",height:"12",viewBox:"0 0 16 16","aria-hidden":"true",style:{transform:oe?"rotate(90deg)":"none",transition:"transform 150ms"},children:e("path",{d:"M6 4 L10 8 L6 12",stroke:"currentColor",strokeWidth:"1.5",fill:"none",strokeLinecap:"round",strokeLinejoin:"round"})})}),Qe?e("button",{class:"btn btn-sm",onClick:()=>De(A.name),children:r("browse.restore")}):e("button",{class:"btn btn-danger btn-sm",onClick:()=>Be(A.name),children:r("browse.archive")})]})}),oe&&e("div",{id:`mem-detail-${A.id}`,children:e(Un,{entity:A})})]},A.id)}const Je=i!==""||k!=="all"||L!=="all"||W!=="all",ut=B!==null,it=q.length;return e("div",{children:e("div",{class:"card",children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:12},children:[e("div",{children:[e("div",{class:"card-title",style:{margin:0},children:r("browse.title")}),!d&&e("div",{style:{fontSize:12,color:"var(--text-3)",marginTop:2},children:[e("span",{style:{fontFamily:"var(--mono)"},children:it.toLocaleString(ke())})," ",r("browse.active"),K.length>0?e(de,{children:[" · ",e("span",{style:{fontFamily:"var(--mono)"},children:K.length})," ",r("browse.archived")]}):"",s.length>=yo&&(t==null?e("span",{children:[" · ",r("browse.truncatedUnknownTotal",{shown:s.length.toLocaleString(ke())})]}):t.entity_count>s.length?e("span",{children:[" · ",r("browse.truncated",{shown:s.length.toLocaleString(ke()),total:t.entity_count.toLocaleString(ke())})]}):null)]})]}),e("button",{class:"btn btn-sm",onClick:pe,title:r("browse.refresh"),children:"↻"})]}),e("div",{class:"search-bar",style:{marginBottom:10},children:[e("input",{type:"search",placeholder:r("memories.searchPlaceholder"),value:i,onInput:A=>{m(A.target.value),D()},onKeyDown:A=>A.key==="Enter"&&Ne()}),e("button",{class:"btn",onClick:Ne,disabled:Y||!i.trim(),children:r(Y?"search.searching":"search.button")})]}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:8,alignItems:"center"},children:[e("span",{style:{fontSize:11,color:"var(--text-3)",marginRight:4},children:r("memories.scopeLabel")}),e(Oe,{label:r("memories.scopeWork"),active:b.kind==="layer"&&b.v==="work",onClick:()=>P({kind:"layer",v:"work"}),count:J.work}),e(Oe,{label:r("memories.scopeEvidence"),active:b.kind==="layer"&&b.v==="evidence",onClick:()=>P({kind:"layer",v:"evidence"}),count:J.evidence}),e(Oe,{label:r("memories.scopeAll"),active:b.kind==="layer"&&b.v==="all",onClick:()=>P({kind:"layer",v:"all"}),count:it}),e("span",{style:{width:1,alignSelf:"stretch",background:"var(--border-subtle)",margin:"0 6px"}}),e(Oe,{label:r("memories.scopeArchived"),active:b.kind==="archived",onClick:()=>P({kind:"archived"}),count:K.length})]}),it>0&&e("div",{style:{marginBottom:8},children:[e("div",{"aria-hidden":"true",style:{display:"flex",height:6,borderRadius:"var(--radius-hairline)",overflow:"hidden",background:"var(--bg-0)",marginBottom:6},children:vo.map(A=>he[A]>0&&e("span",{style:{flex:he[A],background:Jt[A]}},A))}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"center"},children:[e("span",{style:{fontSize:11,color:"var(--text-3)",marginRight:4},children:r("memories.composition")}),vo.map(A=>e(Oe,{label:r(`cluster.${A}`),dot:Jt[A],count:he[A],active:b.kind==="cluster"&&b.v===A,onClick:()=>P(b.kind==="cluster"&&b.v===A?{kind:"layer",v:"all"}:{kind:"cluster",v:A})},A))]})]}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:6},children:[e("span",{style:{fontSize:11,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:r("browse.filterTime")}),e(Oe,{label:r("browse.timeToday"),active:k==="today",onClick:()=>y(k==="today"?"all":"today")}),e(Oe,{label:r("browse.timeWeek"),active:k==="week",onClick:()=>y(k==="week"?"all":"week")}),e(Oe,{label:r("browse.timeMonth"),active:k==="month",onClick:()=>y(k==="month"?"all":"month")}),e(Oe,{label:r("browse.timeOlder"),active:k==="older",onClick:()=>y(k==="older"?"all":"older")}),e("span",{style:{width:1,background:"var(--border-subtle)",margin:"0 6px"}}),e("span",{style:{fontSize:11,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:r("browse.filterValue")}),e(Oe,{label:r("browse.valueRecalled"),active:L==="recalled",onClick:()=>N(L==="recalled"?"all":"recalled")}),e(Oe,{label:r("browse.valueNever"),active:L==="never",onClick:()=>N(L==="never"?"all":"never")})]}),a.length>0&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:6},children:[e("span",{style:{fontSize:11,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:r("browse.filterProject")}),e(Oe,{label:r("cluster.all"),active:W==="all",onClick:()=>U("all")}),a.map(A=>e(Oe,{label:A.name,count:A.count,active:W===A.name,onClick:()=>U(A.name)},A.name))]}),e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:14,paddingBottom:12,borderBottom:"1px solid var(--border-subtle)"},children:[e("span",{style:{fontSize:11,color:"var(--text-3)"},children:r("browse.filterSort")}),e("select",{value:p,onChange:A=>w(A.target.value),style:{padding:"3px 8px",fontSize:12},children:[e("option",{value:"most-recalled",children:r("browse.sortMostRecalled")}),e("option",{value:"recent",children:r("browse.sortRecent")}),e("option",{value:"created",children:r("browse.sortCreated")})]})]}),l&&e("div",{class:"error-box",role:"alert",style:{marginBottom:12},children:l}),(d||Y)&&e("div",{class:"empty",children:e("div",{class:"loading"})}),!d&&!Y&&ut&&e("div",{children:[e("div",{role:"status",style:{display:"flex",alignItems:"center",gap:10,fontSize:12,color:"var(--text-3)",marginBottom:8},children:[e("span",{children:[e("span",{style:{fontFamily:"var(--mono)"},children:B.length})," ",B.length!==1?r("search.results"):r("search.result")," · ",r("memories.rankedBy")]}),e("button",{class:"btn btn-sm",onClick:D,children:["✕ ",r("memories.backToList")]})]}),B.length===0?e("div",{class:"empty",role:"status",children:[r("search.noResults"),' "',i,'"']}):B.map(A=>Fe(A,i))]}),!d&&!Y&&!ut&&(s.length===0?!l&&e(js,{}):ce.length===0?e("div",{class:"empty",children:b.kind==="layer"&&b.v==="work"&&!Je?e(de,{children:[e("div",{style:{marginBottom:10},children:r("memories.workEmpty")}),e(Oe,{label:r("memories.showAll"),active:!1,onClick:()=>P({kind:"layer",v:"all"})})]}):i?e(de,{children:[r("browse.noMatch"),' "',i,'"']}):e(de,{children:r("browse.emptyFilter")})}):e("div",{children:[Pe.map(A=>Fe(A,i)),we>1&&e("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:12,padding:"16px 0",fontSize:13},children:[e("button",{class:"btn btn-sm",disabled:c===0,onClick:()=>g(A=>A-1),children:r("browse.prev")}),e("span",{style:{color:"var(--text-3)",fontFamily:"var(--mono)",fontSize:12},children:[c+1," / ",we]}),e("button",{class:"btn btn-sm",disabled:c>=we-1,onClick:()=>g(A=>A+1),children:r("browse.next")})]})]}))]})})}const ps=["knowledge","activity","session","reference"],bo=34,Jn=60,Ot=1440*60*1e3;function Qn(t){const s=t/Ot;return s<=31?Ot:s<=217?7*Ot:30*Ot}function Zn(t){const s=t.map(d=>new Date(d.created_at).getTime()).filter(d=>Number.isFinite(d));if(s.length===0)return[];const o=Math.min(...s),a=Math.max(...s),n=Qn(Math.max(a-o,1)),i=Math.min(Math.floor((a-o)/n)+1,Jn),m=Array.from({length:i},(d,u)=>({startMs:o+u*n,counts:{knowledge:0,activity:0,session:0,reference:0},total:0}));for(const d of t){const u=new Date(d.created_at).getTime();if(!Number.isFinite(u))continue;const l=Math.min(Math.floor((u-o)/n),i-1);m[l].counts[_s(d.type)]++,m[l].total++}return m}function ea({entities:t}){const s=be(()=>Zn(t),[t]),o=be(()=>{const n={knowledge:0,activity:0,session:0,reference:0};for(const i of s)for(const m of ps)n[m]+=i.counts[m];return n},[s]);if(s.length===0)return null;const a=Math.max(...s.map(n=>n.total),1);return e("div",{style:{marginBottom:14},children:[e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"baseline",marginBottom:4},children:[e("span",{style:{fontSize:11,color:"var(--text-2)",fontFamily:"var(--font-ui)"},children:r("roadmap.densityTitle")}),e("span",{style:{fontSize:10,color:"var(--text-3)"},children:r("roadmap.densityNote")})]}),e("div",{"aria-hidden":"true",style:{display:"flex",alignItems:"flex-end",gap:1,height:bo,background:"var(--bg-0)",borderRadius:"var(--radius-hairline)",padding:"2px 2px 0"},children:s.map((n,i)=>e("div",{style:{flex:1,display:"flex",flexDirection:"column",justifyContent:"flex-end",minWidth:0},children:ps.map(m=>n.counts[m]>0&&e("div",{style:{height:Math.max(n.counts[m]/a*(bo-2),1),background:Jt[m],borderRadius:"var(--radius-hairline)"}},m))},i))}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:10,marginTop:4},children:ps.map(n=>o[n]>0&&e("span",{style:{display:"inline-flex",alignItems:"center",gap:5,fontSize:11,color:"var(--text-2)",fontFamily:"var(--font-ui)"},children:[e("span",{"aria-hidden":"true",style:{width:8,height:8,borderRadius:"var(--radius-hairline)",background:Jt[n],flexShrink:0}}),r(`cluster.${n}`),e("span",{style:{fontFamily:"var(--mono)",fontSize:10,opacity:.7},children:o[n]})]},n))})]})}const ta=new Set(["decision","design_decision","architecture_decision"]),sa=new Set(["supersedes","contradicts"]),ko=new Set(["release","feature"]),oa=.65,ra=new Set(["release"]),na=new Set(["lesson_learned","lesson","mistake","bug_fix"]),aa={release:0,architecture:1,architecture_decision:1,infrastructure:1,plan:2,feature:3,decision:4,design_decision:4,bug_fix:5,refactoring:6,"weekly-summary":7,weekly_summary:7,lesson_learned:8,lesson:8,mistake:8,principle:9,best_practice:10,technical_pattern:10,pattern:10};function ia(t){if(t.length<3)return[];const a=[...t].sort((d,u)=>d.created_at.localeCompare(u.created_at)),n=[];let i=[a[0]];for(let d=1;d<a.length;d++){const u=a[d-1].created_at,l=a[d].created_at;(new Date(l).getTime()-new Date(u).getTime())/864e5<=7?i.push(a[d]):(n.push(i),i=[a[d]])}n.push(i);const m=[];for(const d of n){if(d.length<3)continue;const u=d.map(l=>({e:l,p:aa[l.type]??99})).sort((l,h)=>l.p-h.p)[0];u.p!==99&&m.push({startIso:d[0].created_at,endIso:d[d.length-1].created_at,entityCount:d.length,label:Xe(u.e),anchorId:u.e.id})}return m}const la={release:0,architecture:1,architecture_decision:1,infrastructure:2,plan:3,feature:4,decision:5,design_decision:5,pattern:6,technical_pattern:6,best_practice:7,lesson_learned:8,lesson:8,mistake:8,bug_fix:9,refactoring:10,process:11,workflow_checkpoint:11,note:12,knowledge:13,verification_result:14,test_result:14,"weekly-summary":15,weekly_summary:15,commit:90,session_keypoint:91,session_identity:92,"session-identity":92,"session-insight":93,"session-summary":94};function bt(t){return la[t]??50}function ca(t,s=new Date){const o=new Map;for(const n of t){const i=n.last_accessed_at||n.created_at,m=Go(i,s);let d,u,l;if(m==="today")d="today",u=r("time.today"),l=Number.MAX_SAFE_INTEGER;else if(m==="week"){const c=i.slice(0,10);d=`week:${c}`,u=vt(i,s),l=new Date(c).getTime()}else if(m==="month"){const c=i.slice(0,10),g=new Date(c),f=new Date(g);f.setDate(g.getDate()-g.getDay());const b=f.toISOString().slice(0,10);d=`month:${b}`,u=vt(b,s),l=f.getTime()}else{const c=i.slice(0,7);d=`older:${c}`;const g=new Date(c+"-01");u=g.toLocaleDateString(ke(),{year:"numeric",month:"long"}),l=g.getTime()}let h=o.get(d);h||(h={key:d,label:u,sort:l,entries:[]},o.set(d,h)),h.entries.push(n)}const a=Array.from(o.values()).sort((n,i)=>i.sort-n.sort);for(const n of a)n.entries.sort((i,m)=>{const d=bt(i.type)-bt(m.type);return d!==0?d:m.created_at.localeCompare(i.created_at)});return a}function da({projectName:t,entities:s,onSwitchToList:o}){const[a,n]=v("tree"),i=be(()=>{if(s.length===0)return{total:0,first:null,last:null,types:[]};const p=[...s].sort((B,T)=>B.created_at.localeCompare(T.created_at)),w=new Map;for(const B of s)w.set(B.type,(w.get(B.type)??0)+1);return{total:s.length,first:p[0].created_at,last:p[p.length-1].created_at,types:Array.from(w.entries()).sort((B,T)=>T[1]-B[1])}},[s]),m=be(()=>ca(s),[s]),d=be(()=>s.filter(p=>{if(!ko.has(p.type))return!1;if(ra.has(p.type))return!0;const w=p.metadata?.signal_score;return typeof w!="number"?!0:w>=oa}).sort((p,w)=>w.created_at.localeCompare(p.created_at)).slice(0,6),[s]),u=be(()=>s.filter(w=>ko.has(w.type)).length-d.length,[s,d]),l=be(()=>s.filter(p=>na.has(p.type)).sort((p,w)=>(w.access_count??0)-(p.access_count??0)).slice(0,5),[s]),h=be(()=>ia(s),[s]),c=ne(new Map),g=p=>w=>{w?c.current.set(p,w):c.current.delete(p)},f=p=>{const w=c.current.get(p);w&&(w.scrollIntoView({behavior:"smooth",block:"center"}),w.style.transition="background 0.2s",w.style.background="var(--life-soft)",window.setTimeout(()=>{w.style.background=""},1400))},b=be(()=>{const p=new Map;for(const w of s)p.set(w.name,w.id);return p},[s]),M=be(()=>{const p=[];for(const w of s)for(const B of w.relations??[]){if(!sa.has(B.type))continue;const T=b.get(B.to);T!==void 0&&T!==w.id&&p.push({from:w.id,to:T,type:B.type})}return p},[s,b]),k=ne(null),[y,L]=v([]),N=ne(()=>{});N.current=()=>{const p=k.current;if(!p||M.length===0||a!=="tree"){L(T=>T.length===0?T:[]);return}const w=p.getBoundingClientRect().top,B=[];for(const T of M){const Y=c.current.get(T.from),_=c.current.get(T.to);if(!Y||!_)continue;const R=Y.getBoundingClientRect(),ae=_.getBoundingClientRect(),Ce=Math.round(R.top-w+R.height/2),ge=Math.round(ae.top-w+ae.height/2);B.push({d:`M 14 ${Ce} C 0 ${Ce}, 0 ${ge}, 14 ${ge}`,type:T.type})}L(T=>T.length===B.length&&T.every((_,R)=>_.d===B[R].d&&_.type===B[R].type)?T:B)},te(()=>{N.current()}),te(()=>{const p=()=>N.current();return window.addEventListener("resize",p),()=>window.removeEventListener("resize",p)},[]);const W=y.filter(p=>p.type==="supersedes").length,U=y.filter(p=>p.type==="contradicts").length;return s.length===0?e("div",{class:"empty",children:[e("span",{class:"empty-icon",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",color:"var(--text-3)"},children:e("svg",{width:"32",height:"32",viewBox:"0 0 16 16","aria-hidden":"true",children:[e("path",{d:"M2 4 L6 2 L10 4 L14 2 V12 L10 14 L6 12 L2 14 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"}),e("path",{d:"M6 2 V12 M10 4 V14",stroke:"currentColor",strokeWidth:"1.5"})]})}),r("roadmap.emptyProject")]}):e("div",{children:[e("div",{style:{padding:"14px 16px",background:"var(--border-subtle)",border:"1px solid rgba(143, 242, 92, 0.12)",borderRadius:"var(--radius-sm)",marginBottom:14},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",flexWrap:"wrap",gap:8},children:[e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:18,fontWeight:600,color:"var(--text-0)",display:"inline-flex",alignItems:"center",gap:8},children:[e("svg",{width:"18",height:"18",viewBox:"0 0 16 16","aria-hidden":"true",style:{color:"var(--life)"},children:e("path",{d:"M2 4 a1 1 0 0 1 1 -1 h4 l2 2 h5 a1 1 0 0 1 1 1 v6 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"})}),e("span",{children:t}),e("span",{style:{color:"var(--text-3)",fontWeight:400,fontSize:13},children:["· ",r("roadmap.title")]})]}),e("div",{style:{fontSize:12,color:"var(--text-2)",marginTop:4},children:r("roadmap.summary",{count:i.total,first:i.first?i.first.slice(0,10):"—",last:i.last?i.last.slice(0,10):"—"})})]}),e("div",{style:{display:"flex",gap:8,alignItems:"center",flexShrink:0},children:[e("div",{role:"tablist","aria-label":r("roadmap.viewToggle"),style:{display:"inline-flex",background:"var(--border-subtle)",borderRadius:"var(--radius-xs)",padding:2,border:"1px solid var(--border-subtle)"},children:["tree","mindmap","decisions"].map(p=>{const w=a===p,B=p==="tree"?`🌲 ${r("roadmap.viewTree")}`:p==="mindmap"?`🧠 ${r("roadmap.viewMindmap")}`:`⚖️ ${r("roadmap.viewDecisions")}`;return e("button",{role:"tab","aria-selected":w,onClick:()=>n(p),style:{padding:"4px 10px",background:w?"rgba(143,242,92,0.15)":"transparent",color:w?"var(--life)":"var(--text-2)",border:"none",borderRadius:"var(--radius-hairline)",fontSize:11,fontFamily:"inherit",cursor:"pointer",fontWeight:w?600:400},children:B},p)})}),o&&e("button",{class:"btn btn-sm",onClick:o,children:r("roadmap.switchToList")})]})]}),i.types.length>0&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginTop:10},children:[i.types.slice(0,8).map(([p,w])=>e("span",{class:"tag",style:{fontSize:11,background:"var(--border-subtle)"},children:[Ge(p)," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)"},children:w})]},p)),i.types.length>8&&e("span",{class:"tag",style:{opacity:.5,fontSize:11},children:["+",i.types.length-8]})]})]}),e(ea,{entities:s}),a!=="decisions"&&h.length>0&&e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:14,padding:"12px 14px",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-sm)",background:"rgba(255, 255, 255, 0.02)",overflowX:"auto"},children:[e("span",{style:{fontSize:10,textTransform:"uppercase",letterSpacing:"0.08em",color:"var(--text-3)",fontWeight:600,flexShrink:0},children:r("roadmap.phases")}),h.map((p,w)=>e("button",{onClick:()=>p.anchorId!==void 0&&f(p.anchorId),disabled:p.anchorId===void 0,style:{flexShrink:0,display:"flex",flexDirection:"column",alignItems:"flex-start",gap:2,padding:"6px 10px",background:w===h.length-1?"var(--life-soft)":"transparent",border:"1px solid",borderColor:w===h.length-1?"rgba(143, 242, 92, 0.3)":"var(--border-subtle)",borderRadius:"var(--radius-xs)",color:"var(--text-1)",cursor:p.anchorId!==void 0?"pointer":"default",fontFamily:"inherit",textAlign:"left",minWidth:100},title:`${p.startIso.slice(0,10)} → ${p.endIso.slice(0,10)}`,children:[e("span",{style:{fontSize:11,fontWeight:600,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:240},children:p.label}),e("span",{style:{fontSize:10,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[p.entityCount," · ",vt(p.startIso)]})]},`${p.startIso}-${p.label}`))]}),a==="mindmap"&&h.length>0&&e(ua,{projectName:t,phases:h,entities:s,onNodeClick:p=>{n("tree"),window.requestAnimationFrame(()=>f(p))}}),a==="mindmap"&&h.length===0&&e("div",{class:"empty",style:{padding:24},children:[r("roadmap.emptyProject")," — ",r("roadmap.mindmapNeedsPhases")]}),a==="decisions"&&e(ma,{entities:s,onJump:p=>{n("tree"),window.requestAnimationFrame(()=>f(p))}}),a==="tree"&&e("div",{style:{display:"grid",gridTemplateColumns:"minmax(0, 1fr) 280px",gap:16,alignItems:"start"},children:[e("div",{style:{position:"relative",minWidth:0},children:[(W>0||U>0)&&e("div",{style:{fontSize:10,color:"var(--text-3)",marginBottom:6,fontFamily:"var(--font-ui)"},children:[W>0&&e("span",{style:{marginRight:10},children:["— ",r("roadmap.lineageSupersedes",{n:W})]}),U>0&&e("span",{style:{color:"var(--warning)"},children:["⋯ ",r("roadmap.lineageConflicts",{n:U})]})]}),h.length>0?e("div",{ref:k,style:{position:"relative",paddingLeft:28},children:[e("div",{"aria-hidden":"true",style:{position:"absolute",left:8,top:4,bottom:4,width:2,background:"var(--border-subtle)"}}),y.length>0&&e("svg",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,width:28,height:"100%",overflow:"visible",pointerEvents:"none"},children:y.map((p,w)=>e("path",{d:p.d,fill:"none",stroke:p.type==="contradicts"?"var(--warning)":"var(--text-3)",strokeWidth:1.5,strokeDasharray:p.type==="contradicts"?"3 3":void 0,opacity:.8},w))}),(()=>{const p=h.map(()=>[]),w=[];for(const T of s){const Y=h.findIndex(_=>T.created_at>=_.startIso&&T.created_at<=_.endIso);Y>=0?p[Y].push(T):w.push(T)}for(const T of p)T.sort((Y,_)=>{const R=bt(Y.type)-bt(_.type);return R!==0?R:_.created_at.localeCompare(Y.created_at)});const B=h.map((T,Y)=>({phase:T,entries:p[Y],idx:Y})).reverse();return e(de,{children:[B.map(({phase:T,entries:Y},_)=>{const R=_===0;return e("div",{style:{position:"relative",marginBottom:22},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:-28,top:4,width:14,height:14,borderRadius:"50%",background:R?"transparent":"var(--life)",border:"2px solid var(--life)",boxSizing:"border-box"}}),e("button",{onClick:()=>T.anchorId!==void 0&&f(T.anchorId),disabled:T.anchorId===void 0,style:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:2,padding:0,background:"transparent",border:"none",color:"inherit",cursor:T.anchorId!==void 0?"pointer":"default",fontFamily:"inherit",textAlign:"left",width:"100%"},children:[e("span",{style:{fontSize:13,fontWeight:600,color:"var(--text-0)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:"100%"},children:[T.label,R&&e("span",{style:{marginLeft:8,fontSize:10,color:"var(--life)",fontFamily:"var(--mono)",fontWeight:500},children:r("roadmap.activePhase")})]}),e("span",{style:{fontSize:11,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[T.startIso.slice(0,10)," → ",T.endIso.slice(0,10)," · ",Y.length===1?r("roadmap.entryCount",{count:1}):r("roadmap.entriesCount",{count:Y.length})]})]}),e("div",{style:{marginTop:8},children:Y.map((ae,Ce)=>{const ge=Ce===Y.length-1;return e("div",{ref:g(ae.id),style:{position:"relative",paddingLeft:24,paddingTop:6,paddingBottom:6},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,bottom:ge?"50%":0,width:1,background:"var(--border-subtle)"}}),e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:"50%",width:18,height:1,background:"var(--border-subtle)",transform:"translateY(-50%)"}}),e(Kt,{entity:ae})]},ae.id)})})]},`${T.startIso}-${T.label}`)}),w.length>0&&e("div",{style:{position:"relative",marginBottom:22},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:-28,top:4,width:12,height:12,borderRadius:"50%",background:"var(--text-3)",opacity:.4}}),e("div",{style:{fontSize:12,color:"var(--text-2)",fontFamily:"var(--mono)",marginBottom:8},children:r("roadmap.otherGroup",{count:w.length})}),w.map((T,Y)=>{const _=Y===w.length-1;return e("div",{ref:g(T.id),style:{position:"relative",paddingLeft:24,paddingTop:6,paddingBottom:6},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,bottom:_?"50%":0,width:1,background:"var(--border-subtle)"}}),e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:"50%",width:18,height:1,background:"var(--border-subtle)",transform:"translateY(-50%)"}}),e(Kt,{entity:T})]},T.id)})]})]})})()]}):m.map(p=>e("div",{style:{marginBottom:18},children:[e("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:8,paddingBottom:6,borderBottom:"1px solid var(--border-subtle)"},children:[e("span",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--life)",fontFamily:"var(--mono)"},children:p.label}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:p.entries.length})]}),p.entries.map(w=>e("div",{ref:g(w.id),style:{borderBottom:"1px solid var(--border-subtle)",padding:"12px 0"},children:e(Kt,{entity:w})},w.id))]},p.key))]}),e("div",{style:{display:"flex",flexDirection:"column",gap:14,position:"sticky",top:16},children:[d.length>0&&e("div",{class:"card",style:{padding:14},children:[e("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--text-2)",marginBottom:10,display:"flex",alignItems:"center",gap:4},children:[r("roadmap.milestones"),u>0&&e("span",{style:{fontSize:10,fontWeight:400,opacity:.55,textTransform:"none",letterSpacing:0},children:r("roadmap.lowSignalHidden",{count:u})})]}),d.map(p=>e("button",{onClick:()=>f(p.id),style:{display:"flex",alignItems:"flex-start",gap:8,width:"100%",textAlign:"left",padding:"6px 0",background:"transparent",border:"none",borderTop:"1px solid var(--border-subtle)",color:"inherit",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{flexShrink:0,color:"var(--life)"},children:e(Zt,{type:p.type,size:14})}),e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:12,color:"var(--text-1)",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:Xe(p)}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:2},children:vt(p.created_at)})]})]},p.id))]}),l.length>0&&e("div",{class:"card",style:{padding:14},children:[e("div",{style:{fontSize:11,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--text-2)",marginBottom:10},children:r("roadmap.keyLessons")}),l.map(p=>{const w=Yo(p.access_count);return e("button",{onClick:()=>f(p.id),style:{display:"flex",alignItems:"flex-start",gap:8,width:"100%",textAlign:"left",padding:"6px 0",background:"transparent",border:"none",borderTop:"1px solid var(--border-subtle)",color:"inherit",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{flexShrink:0,color:"var(--text-2)"},children:e(Zt,{type:p.type,size:14})}),e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:12,color:"var(--text-1)",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:Xe(p)}),e("div",{style:{fontSize:10,color:w.tone==="high"?"var(--life)":"var(--text-3)",marginTop:2,fontFamily:"var(--mono)"},children:w.tone!=="none"?w.label:r("memory.access.never")})]})]},p.id)})]})]})]})]})}function ma({entities:t,onJump:s}){const[o,a]=v(()=>new Set),n=l=>a(h=>{const c=new Set(h);return c.has(l)?c.delete(l):c.add(l),c}),i=be(()=>t.filter(l=>ta.has(l.type)).sort((l,h)=>h.created_at.localeCompare(l.created_at)),[t]),m=be(()=>{const l=new Map;for(const h of t)l.set(h.name,h);return l},[t]),d=be(()=>{const l=new Map;for(const h of t)for(const c of h.relations??[]){if(c.type!=="supersedes")continue;const g=l.get(c.to)??[];g.push(h),l.set(c.to,g)}return l},[t]);if(i.length===0)return e("div",{class:"empty",style:{padding:24},children:r("adr.empty")});const u=l=>{const h=m.get(l);return h?e("button",{onClick:()=>s(h.id),style:{background:"transparent",border:"none",padding:0,cursor:"pointer",color:"var(--life)",fontSize:"inherit",fontFamily:"inherit",textDecoration:"underline"},children:Xe(h)}):e("span",{style:{color:"var(--text-2)"},children:l})};return e("div",{style:{display:"flex",flexDirection:"column",gap:10},children:i.map(l=>{const h=d.get(l.name)??[],c=h.length>0||!!l.archived||l.status==="archived",g=o.has(l.id),f=`adr-body-${l.id}`,b=(l.relations??[]).filter(M=>M.type==="supersedes").map(M=>M.to);return e("div",{style:{border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-sm)",padding:"10px 12px",opacity:c?.75:1},children:[e("button",{"aria-expanded":g,"aria-controls":f,onClick:()=>n(l.id),style:{display:"flex",alignItems:"center",gap:8,width:"100%",background:"transparent",border:"none",padding:0,cursor:"pointer",color:"inherit",textAlign:"left",fontFamily:"inherit"},children:[e("span",{"aria-hidden":"true",style:{color:"var(--text-3)",fontSize:10,width:10,flexShrink:0},children:g?"▾":"▸"}),e(Zt,{type:l.type,size:14}),e("span",{style:{fontFamily:"var(--font-memory)",fontSize:15,color:"var(--text-0)",flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:Xe(l)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:10,color:"var(--text-3)",flexShrink:0},children:l.created_at.slice(0,10)}),e("span",{style:{fontSize:10,padding:"2px 8px",borderRadius:9999,flexShrink:0,background:c?"var(--neutral-soft)":"var(--life-soft)",color:c?"var(--text-2)":"var(--life)"},children:r(c?"adr.statusSuperseded":"adr.statusActive")})]}),g&&e("div",{id:f,style:{marginTop:8,paddingLeft:18},children:[l.observations.map((M,k)=>e("p",{style:{fontFamily:"var(--font-memory)",fontSize:15,lineHeight:1.6,color:"var(--text-1)",margin:"0 0 6px"},children:M},k)),(b.length>0||h.length>0)&&e("div",{style:{fontSize:11,color:"var(--text-2)",marginTop:6,display:"flex",flexDirection:"column",gap:3},children:[b.map(M=>e("span",{children:[r("adr.supersedes")," → ",u(M)]},`s-${M}`)),h.map(M=>e("span",{children:[r("adr.supersededBy")," → ",u(M.name)]},`b-${M.id}`))]})]})]},l.id)})})}function ua({projectName:t,phases:s,entities:o,onNodeClick:a}){const n=s.map(()=>[]);for(const P of o){const q=s.findIndex(K=>P.created_at>=K.startIso&&P.created_at<=K.endIso);q>=0&&n[q].push(P)}for(const P of n)P.sort((q,K)=>{const J=bt(q.type)-bt(K.type);return J!==0?J:K.created_at.localeCompare(q.created_at)});const i=6,m=n.map(P=>({shown:P.slice(0,i),extra:Math.max(0,P.length-i)})),d=900,u=600,l=d/2,h=u/2,c=170,g=230,f=30,b=P=>2*Math.PI*P/s.length-Math.PI/2,M=ne(null),[k,y]=v(1),[L,N]=v(0),[W,U]=v(0),p=ne(k),w=ne({x:L,y:W});p.current=k,w.current={x:L,y:W};const B=ne({active:!1,lastX:0,lastY:0}),[T,Y]=v(!1),_=.25,R=4,ae=(P,q)=>{const K=M.current;if(!K)return{x:0,y:0};const J=K.getBoundingClientRect();return J.width===0||J.height===0?{x:0,y:0}:{x:(P-J.left)/J.width*d,y:(q-J.top)/J.height*u}};te(()=>{const P=M.current;if(!P)return;const q=K=>{K.preventDefault();const J=p.current,he=w.current,fe=Math.exp(-K.deltaY*.0015),se=Math.max(_,Math.min(R,J*fe));if(se===J)return;const{x:ce,y:we}=ae(K.clientX,K.clientY),Pe=(ce-he.x)/J,Ne=(we-he.y)/J;y(se),N(ce-Pe*se),U(we-Ne*se)};return P.addEventListener("wheel",q,{passive:!1}),()=>P.removeEventListener("wheel",q)},[]);const Ce=P=>{let K=P.target;for(;K&&K!==M.current;){if(K.style?.cursor==="pointer")return;K=K.parentElement}P.preventDefault(),B.current.active=!0,B.current.lastX=P.clientX,B.current.lastY=P.clientY,Y(!0)},ge=P=>{if(!B.current.active)return;const q=M.current;if(!q)return;const K=q.getBoundingClientRect();if(K.width===0||K.height===0)return;const J=(P.clientX-B.current.lastX)/K.width*d,he=(P.clientY-B.current.lastY)/K.height*u;B.current.lastX=P.clientX,B.current.lastY=P.clientY,N(fe=>fe+J),U(fe=>fe+he)},pe=()=>{B.current.active&&(B.current.active=!1,Y(!1))},D=()=>{y(1),N(0),U(0)};return e("div",{style:{position:"relative",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-sm)",background:"rgba(255,255,255,0.02)",overflow:"hidden",marginBottom:14},children:[e("button",{onClick:D,title:r("roadmap.resetHint"),style:{position:"absolute",top:8,right:8,zIndex:2,padding:"4px 10px",fontSize:11,fontFamily:"inherit",background:"rgba(0,0,0,0.4)",color:"var(--text-1)",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-xs)",cursor:"pointer"},children:r("graph.resetView")}),e("div",{style:{position:"absolute",bottom:8,left:12,zIndex:2,fontSize:10,fontFamily:"var(--mono)",color:"var(--text-3)",pointerEvents:"none"},children:r("roadmap.zoomHint",{pct:Math.round(k*100)})}),e("svg",{ref:M,viewBox:`0 0 ${d} ${u}`,width:"100%",style:{display:"block",minHeight:600,cursor:T?"grabbing":"grab",userSelect:"none",touchAction:"none"},onMouseDown:Ce,onMouseMove:ge,onMouseUp:pe,onMouseLeave:pe,onDblClick:D,children:e("g",{transform:`translate(${L} ${W}) scale(${k})`,children:[s.map((P,q)=>{const K=b(q),J=l+c*Math.cos(K),he=h+c*Math.sin(K);return e("path",{d:`M ${l} ${h} Q ${(l+J)/2} ${(h+he)/2-10} ${J} ${he}`,fill:"none",stroke:"rgba(143, 242, 92, 0.4)",strokeWidth:1.5},`p-${q}`)}),s.map((P,q)=>{const{shown:K}=m[q],J=b(q),he=l+c*Math.cos(J),fe=h+c*Math.sin(J),se=Math.PI/6;return K.map((ce,we)=>{const Pe=K.length===1?.5:we/(K.length-1),Ne=J-se/2+se*Pe,Be=g+f*(we%3),De=l+Be*Math.cos(Ne),Ae=h+Be*Math.sin(Ne);return e("path",{d:`M ${he} ${fe} Q ${(he+De)/2} ${(fe+Ae)/2} ${De} ${Ae}`,fill:"none",stroke:"rgba(255,255,255,0.18)",strokeWidth:1},`e-${q}-${ce.id}`)})}),e("g",{children:[e("circle",{cx:l,cy:h,r:42,fill:"rgba(143, 242, 92, 0.18)",stroke:"var(--life)",strokeWidth:1.5}),e("text",{x:l,y:h,textAnchor:"middle",dominantBaseline:"central",fontSize:11,fontWeight:600,fill:"var(--text-0)",style:{pointerEvents:"none"},children:t.length>14?t.slice(0,12)+"…":t})]}),s.map((P,q)=>{const K=b(q),J=l+c*Math.cos(K),he=h+c*Math.sin(K),fe=P.label.length>18?P.label.slice(0,16)+"…":P.label;return e("g",{role:P.anchorId!==void 0?"button":void 0,tabIndex:P.anchorId!==void 0?0:void 0,"aria-label":P.anchorId!==void 0?P.label:void 0,style:{cursor:P.anchorId!==void 0?"pointer":"default"},onClick:()=>P.anchorId!==void 0&&a(P.anchorId),onKeyDown:se=>{P.anchorId!==void 0&&(se.key==="Enter"||se.key===" ")&&(se.preventDefault(),a(P.anchorId))},children:[e("circle",{cx:J,cy:he,r:28,fill:"rgba(143, 242, 92, 0.10)",stroke:"var(--life)",strokeWidth:1.25}),e("text",{x:J,y:he-4,textAnchor:"middle",fontSize:10,fontWeight:600,fill:"var(--text-0)",style:{pointerEvents:"none"},children:[e("tspan",{x:J,dy:0,children:fe}),e("tspan",{x:J,dy:12,fontSize:9,fill:"var(--text-3)",fontWeight:400,fontFamily:"var(--mono)",children:[P.entityCount," · ",P.startIso.slice(5,10)]})]})]},`phase-${q}`)}),s.map((P,q)=>{const{shown:K,extra:J}=m[q],he=b(q),fe=Math.PI/6;return e("g",{children:[K.map((se,ce)=>{const we=K.length===1?.5:ce/(K.length-1),Pe=he-fe/2+fe*we,Ne=g+f*(ce%3),Be=l+Ne*Math.cos(Pe),De=h+Ne*Math.sin(Pe),Ae=Xe(se),Fe=Ae.length>22?Ae.slice(0,20)+"…":Ae;return e("g",{role:"button",tabIndex:0,"aria-label":`${Ae} (${Ge(se.type)})`,style:{cursor:"pointer"},onClick:()=>a(se.id),onKeyDown:Je=>{(Je.key==="Enter"||Je.key===" ")&&(Je.preventDefault(),a(se.id))},children:[e("title",{children:`${Ae} (${se.type})`}),e("circle",{cx:Be,cy:De,r:4,fill:"var(--text-2)"}),e("text",{x:Be,y:De-8,textAnchor:Math.cos(Pe)>.2?"start":Math.cos(Pe)<-.2?"end":"middle",fontSize:9,fill:"var(--text-1)",style:{pointerEvents:"none"},children:Fe})]},se.id)}),J>0&&(()=>{const se=he+fe/2+.05,ce=g+f*2+10,we=l+ce*Math.cos(se),Pe=h+ce*Math.sin(se);return e("text",{x:we,y:Pe,textAnchor:"middle",fontSize:9,fill:"var(--text-3)",fontStyle:"italic",children:r("roadmap.moreEntities",{count:J})})})()]},`leaves-${q}`)})]})})]})}const ha=2e3;function ga(){try{return new URLSearchParams(window.location.search).get("project")}catch{return null}}function pa(t){try{const s=new URL(window.location.href);s.searchParams.set("project",t),history.replaceState(null,"",s)}catch{}}function fa(t,s){if(!s)return[];const o=m=>!!m.archived||m.status==="archived",a=t.filter(m=>!o(m)&&Qt(m)===s),n=new Set;for(const m of a)for(const d of m.relations??[])(d.type==="supersedes"||d.type==="contradicts")&&n.add(d.to);const i=t.filter(m=>o(m)&&n.has(m.name)&&Qt(m)===s);return[...a,...i].sort((m,d)=>d.created_at.localeCompare(m.created_at))}function ya({health:t}){const[s,o]=v([]),[a,n]=v([]),[i,m]=v(ga),[d,u]=v(!0),[l,h]=v(""),[c,g]=v(""),f=ne(0);te(()=>{const M=++f.current;Promise.all([Z("GET",`/v1/entities?limit=${ha}&status=all`),$o().then(k=>({ok:!0,list:k}),k=>({ok:!1,failure:at(k)}))]).then(([k,y])=>{M===f.current&&(Array.isArray(k)?o(k):(o([]),h(Ue("unreadable"))),y.ok?(n(y.list),y.list.length===1&&m(L=>L??y.list[0].name)):g(Ue(y.failure)))}).catch(k=>{M===f.current&&h(Ue(at(k)))}).finally(()=>{M===f.current&&u(!1)})},[]);const b=be(()=>fa(s,i),[s,i]);return d?e("div",{class:"empty",children:e("div",{class:"loading"})}):l?e("div",{class:"error-box",role:"alert",children:l}):s.length===0&&t==null?e("div",{class:"empty",children:e("div",{class:"loading"})}):t?.entity_count===0?e(js,{}):c?e("div",{class:"error-box",role:"alert",children:c}):a.length===0?e("div",{class:"empty",children:r("project.empty")}):e("div",{children:[e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:12,alignItems:"center"},children:[e("span",{style:{fontSize:11,color:"var(--text-3)",marginRight:4},children:r("project.selectLabel")}),a.map(M=>e(Oe,{label:M.name,count:M.count,active:i===M.name,onClick:()=>{m(M.name),pa(M.name)}},M.name))]}),i?e("div",{class:"card",children:e(da,{projectName:i,entities:b})}):e("div",{class:"empty",children:r("project.selectPrompt")})]})}const va=[["ollama","Ollama (Local)"],["openai","OpenAI"],["anthropic","Anthropic (Claude)"]];function ba(t){const s={provider:t.provider};return t.model.trim()&&(s.model=t.model.trim()),t.provider!=="ollama"&&(t.apiKey.trim()?s.apiKey=t.apiKey.trim():t.hasStoredKey&&t.originalIndex!==null&&(s.keepKeyFrom=t.originalIndex)),s}function ka(t){return typeof t?.config=="object"&&t.config!==null}function xa(t){return typeof t?.checkSucceeded=="boolean"&&typeof t.freshness=="string"&&typeof t.updateAvailable=="boolean"}function xo(t){return t&&t.charAt(0).toUpperCase()+t.slice(1)}function wo(t){if(t.errorCode){const s=/^http_(\d+)$/.exec(t.errorCode),o=s?"settings.testError.http":`settings.testError.${t.errorCode}`,a=s?r(o,{status:s[1]}):r(o);if(a!==o)return t.error?`${a} — ${t.error}`:a}return t.error||r("settings.testFailed")}function _o(t,s){if(!s)return"—";const o=new Date(s);return Number.isNaN(o.getTime())?s:o.toLocaleString(t)}function wa(t){switch(t){case"npm-global":return r("settings.installNpmGlobal");case"npm-local":return r("settings.installNpmLocal");case"source-checkout":return r("settings.installSourceCheckout");default:return r("settings.installUnknown")}}function _a(t){switch(t){case"npm-global":return r("settings.updateGuidanceNpmGlobal");case"npm-local":return r("settings.updateGuidanceNpmLocal");case"source-checkout":return r("settings.updateGuidanceSourceCheckout");default:return r("settings.updateGuidanceUnknown")}}function Ma({locale:t,onLocaleChange:s}){const[o,a]=v(null),[n,i]=v(null),[m,d]=v(""),[u,l]=v(""),[h,c]=v(""),[g,f]=v(""),[b,M]=v(""),[k,y]=v(!1),[L,N]=v(!1),[W,U]=v(""),[p,w]=v(null),[B,T]=v(!1),[Y,_]=v(!0),[R,ae]=v(!0),[Ce,ge]=v(!1),[pe,D]=v([]),[P,q]=v([]),[K,J]=v(null),[he,fe]=v(!1),[se,ce]=v("");async function we(C=!0,j=!1){j?ge(!0):ae(!0);try{const V=await Z("GET",C?"/v1/update-status":"/v1/update-status?cached=1");if(!xa(V)){console.warn("[memesh dashboard] /v1/update-status answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",V),j||i(null);return}i(V)}catch{j||i(null)}finally{j?ge(!1):ae(!1)}}te(()=>{let C=!1;return Z("GET","/v1/config").then(j=>{if(!ka(j)){j!==null&&console.warn("[memesh dashboard] /v1/config answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",j),a(null);return}a(j);const O=j.config.llm?.provider||"",V=j.config.llm?.model||"";d(O),c(V),f(O),M(V),y(!!j.config.llm?.apiKey);const X=(j.config.llmFallbacks??[]).map((je,ot)=>({provider:je.provider,model:je.model??"",apiKey:"",hasStoredKey:!!je.apiKey,originalIndex:ot}));D(X),q(X.map(()=>null))}).catch(j=>{console.warn("[memesh dashboard] /v1/config failed to load:",j),a(null)}).finally(()=>_(!1)),(async()=>(await we(!1),C||we(!0,!0)))(),()=>{C=!0}},[]);async function Pe(){T(!0),U(""),w(null);try{const C=await Z("POST","/v1/config/test",{provider:m,...u?{apiKey:u}:{}});w(C),C.valid&&!h&&C.suggested&&c(C.suggested)}catch(C){w({valid:!1,error:He(C)})}finally{T(!1)}}function Ne(C){d(C),w(null),c("")}function Be(C){l(C),w(null)}async function De(){N(!0),U("");try{const C={provider:m};h&&(C.model=h),u&&(C.apiKey=u),await Z("POST","/v1/config",{llm:C}),U(r("settings.saved")),u&&y(!0),l(""),w(null),f(m),M(h)}catch(C){U(r("common.error")+": "+He(C))}finally{N(!1)}}async function Ae(){if(confirm(r("settings.removeProviderConfirm"))){N(!0),U("");try{await Z("POST","/v1/config",{llm:null}),d(""),c(""),l(""),f(""),M(""),y(!1),w(null),U(r("settings.providerRemoved"))}catch(C){U(r("common.error")+": "+He(C))}finally{N(!1)}}}async function Fe(C,j){U("");try{await Z("POST","/v1/config",C),a(O=>O&&j(O)),U(r("settings.saved"))}catch(O){U(r("common.error")+": "+He(O))}}function Je(C,j){D(O=>O.map((V,X)=>X===C?{...V,...j}:V)),q(O=>O.map((V,X)=>X===C?null:V))}function ut(C,j){D(O=>O.map((V,X)=>X===C?{...V,provider:j,model:"",apiKey:"",hasStoredKey:!1,originalIndex:null}:V)),q(O=>O.map((V,X)=>X===C?null:V))}function it(){D(C=>[...C,{provider:"ollama",model:"",apiKey:"",hasStoredKey:!1,originalIndex:null}]),q(C=>[...C,null]),ce("")}function A(C){D(j=>j.filter((O,V)=>V!==C)),q(j=>j.filter((O,V)=>V!==C)),ce("")}function G(C,j){const O=C+j;D(V=>{if(O<0||O>=V.length)return V;const X=V.slice();return[X[C],X[O]]=[X[O],X[C]],X}),q(V=>{if(O<0||O>=V.length)return V;const X=V.slice();return[X[C],X[O]]=[X[O],X[C]],X}),ce("")}async function oe(C){const j=pe[C];if(j){J(C),ce("");try{const O=j.apiKey.trim(),V=await Z("POST","/v1/config/test",{provider:j.provider,...O?{apiKey:O}:j.hasStoredKey&&j.originalIndex!==null?{fallbackIndex:j.originalIndex}:{}});q(X=>X.map((je,ot)=>ot===C?V:je))}catch(O){q(V=>V.map((X,je)=>je===C?{valid:!1,error:He(O)}:X))}finally{J(null)}}}async function Qe(){fe(!0),ce("");try{const C=pe.map(ba);await Z("POST","/v1/config",{llmFallbacks:C}),D(j=>j.map((O,V)=>{const X=O.provider!=="ollama"&&(O.hasStoredKey||!!O.apiKey.trim());return{...O,hasStoredKey:X,originalIndex:X?V:null,apiKey:""}})),ce(r("settings.saved"))}catch(C){ce(r("common.error")+": "+He(C))}finally{fe(!1)}}if(Y)return e("div",{class:"empty",children:e("div",{class:"loading"})});const lt=o?.capabilities,kt=lt?.searchLevel?r("settings.smartMode"):r("settings.core"),et=R||Ce&&!n,Lt=R||Ce,ht=!!n?.currentVersionDeprecated,ss=!!(n?.latestVersion&&n.latestVersion!==n.currentVersion),S=!!(ht&&n?.latestVersion&&n.latestVersion===n.currentVersion&&n?.freshness==="fresh"),I=!!(n?.checkSucceeded&&n?.lastError),F=et?r("settings.updateChecking"):n?ht?r(ss?"settings.updateAvailable":S?"settings.updateDeprecatedNoTarget":"settings.updateDeprecatedTargetUnknown"):n.freshness==="unavailable"?r("settings.updateNoSuccessfulChecks"):!n.checkSucceeded&&n.freshness==="stale"?r("settings.updateStale"):!n.checkSucceeded&&n.freshness==="cached"?r("settings.updateCachedFallback"):n.updateAvailable?r("settings.updateAvailable"):r(I?"settings.updatePartialSummary":"settings.upToDate"):r("settings.updateUnavailable"),H=n?ht?"var(--danger)":n.freshness==="unavailable"||!n.checkSucceeded&&n.freshness==="stale"?"var(--warning)":!n.checkSucceeded&&n.freshness==="cached"||n.updateAvailable?"var(--info)":I?"var(--warning)":"var(--success)":"var(--warning)",ee=n?.freshness==="stale"?r("settings.updateSourceStale"):n?.source==="cache"?r("settings.updateSourceCached"):n?.source==="fresh"?r("settings.updateSourceFresh"):r("settings.updateSourceUnavailable"),re=wa(n?.installChannel),ye=_a(n?.installChannel),Re=et?r("common.loading"):_o(t,n?.lastAttemptAt||null),Ee=et?r("common.loading"):_o(t,n?.lastSuccessfulCheckAt||null),Le=!!n?.lastSuccessfulCheckAt,tt=!!n?.lastError&&!et;return e("div",{children:[e("div",{class:"card",children:[e("div",{class:"card-title",children:r("settings.capabilities")}),e("div",{class:"stats-row",style:{marginBottom:0},children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:18},children:kt}),e("div",{class:"stat-lbl",children:r("settings.searchMode")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:14},children:xo(lt?.embeddings||"—")}),e("div",{class:"stat-lbl",children:r("settings.embeddings")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:14},children:xo(lt?.llm?.provider||r("settings.none"))}),e("div",{class:"stat-lbl",children:r("settings.llmProvider")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:14,fontFamily:"var(--mono)"},children:lt?.llm?.model||"—"}),e("div",{class:"stat-lbl",children:r("settings.model")})]})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:r("settings.llmProvider")}),e("div",{style:{padding:"10px 12px",marginBottom:14,background:"var(--bg-2)",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-sm)",fontSize:12,lineHeight:1.55,color:"var(--text-2)"},children:[e("div",{style:{fontWeight:600,color:"var(--text-1)",marginBottom:4},children:r("settings.llmOptional.title")}),e("div",{style:{marginBottom:6},children:r("settings.llmOptional.body")}),e("div",{children:[e("strong",{children:r("settings.llmOptional.coreLabel")})," — ",r("settings.llmOptional.coreFeatures")]}),e("div",{children:[e("strong",{children:r("settings.llmOptional.smartLabel")})," — ",r("settings.llmOptional.smartFeatures")]})]}),e("form",{onSubmit:C=>{C.preventDefault(),De()},children:[e("div",{style:{display:"flex",gap:16,marginBottom:14,flexWrap:"wrap"},children:[["anthropic","Anthropic (Claude)"],["openai","OpenAI"],["ollama","Ollama (Local)"]].map(([C,j])=>e("label",{style:{display:"flex",alignItems:"center",gap:5,cursor:"pointer",fontSize:13},children:[e("input",{type:"radio",name:"provider",value:C,checked:m===C,onChange:()=>Ne(C)}),j]},C))}),m&&m!=="ollama"&&e("div",{style:{marginBottom:12},children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:r("settings.apiKey")}),e("div",{style:{display:"flex",gap:8},children:[e("input",{type:"password",autoComplete:"off",placeholder:m==="anthropic"?"sk-ant-api03-…":"sk-…",value:u,onInput:C=>Be(C.target.value),style:{flex:1}}),e("button",{type:"button",class:"btn",onClick:()=>void Pe(),disabled:m===""||B||m!=="ollama"&&u===""&&!(k&&m===g),title:k&&m===g&&u===""?r("settings.testStoredKeyHint"):void 0,style:{flexShrink:0},children:r(B?"settings.testing":"settings.test")})]})]}),m==="ollama"&&e("div",{style:{marginBottom:12},children:e("button",{type:"button",class:"btn",onClick:()=>void Pe(),disabled:B,children:r(B?"settings.testing":"settings.test")})}),p&&e("div",{role:p.valid?"status":"alert",style:{marginBottom:12,padding:"8px 10px",borderRadius:"var(--radius-xs)",fontSize:12,background:p.valid?"var(--life-soft)":"var(--danger-soft)",border:`1px solid ${p.valid?"rgba(143, 242, 92, 0.4)":"rgba(255, 122, 107, 0.4)"}`,color:p.valid?"var(--life)":"var(--danger)"},children:p.valid?r("settings.testPassed",{count:p.models?.length??0}):`✗ ${wo(p)}`}),p?.valid&&p.models&&p.models.length>0&&e("div",{style:{marginBottom:14},children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:[r("settings.model"),p.suggested&&e("span",{style:{marginLeft:6,color:"var(--text-3)",fontWeight:400},children:["(",r("settings.suggested"),": ",e("span",{style:{color:"var(--life)"},children:p.suggested}),")"]})]}),e("select",{value:h,onChange:C=>c(C.target.value),style:{width:"100%"},children:p.models.map(C=>e("option",{value:C.id,children:[C.id,C.created?` — ${C.created.slice(0,10)}`:""]},C.id))})]}),(()=>{const j=(m!==g||!!u||h!==b)&&!p?.valid;return e("div",{style:{display:"flex",gap:10,alignItems:"center",flexWrap:"wrap"},children:[e("button",{class:"btn btn-primary",type:"submit",disabled:!m||L||j,children:r(L?"settings.saving":"settings.save")}),k&&e("button",{type:"button",class:"btn",onClick:Ae,disabled:L,style:{borderColor:"var(--danger)",color:"var(--danger)",background:"transparent"},title:r("settings.removeProviderHint"),children:r("settings.removeProvider")}),j&&e("span",{style:{fontSize:11,color:"var(--text-3)"},children:r("settings.testRequired")}),W&&e("span",{role:W.startsWith(r("common.error"))?"alert":"status",style:{fontSize:12,color:W.startsWith(r("common.error"))?"var(--danger)":"var(--success)"},children:W})]})})()]})]}),e("div",{class:"card","data-testid":"settings-fallbacks",children:[e("div",{class:"card-title",children:r("settings.fallbacks.title")}),e("div",{style:{fontSize:12,color:"var(--text-2)",lineHeight:1.55,marginBottom:12},children:r("settings.fallbacks.explainer")}),e("div",{role:"note",style:{padding:"10px 12px",marginBottom:14,background:"var(--warning-soft)",border:"1px solid rgba(255, 171, 64, 0.4)",borderRadius:"var(--radius-sm)",fontSize:12,lineHeight:1.55,color:"var(--text-0)"},"data-testid":"settings-fallbacks-privacy",children:[e("div",{style:{fontWeight:600,color:"var(--warning)",marginBottom:4},children:r("settings.fallbacks.privacyTitle")}),e("div",{children:r("settings.fallbacks.privacyBody")})]}),pe.length===0&&e("div",{style:{fontSize:12,color:"var(--text-3)",marginBottom:12},children:r("settings.fallbacks.empty")}),e("div",{style:{display:"grid",gap:12},children:pe.map((C,j)=>{const O=C.provider!=="ollama",V=P[j],X=O&&!C.apiKey.trim()&&!C.hasStoredKey;return e("div",{"data-testid":"fallback-entry",style:{border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--bg-2)",padding:"12px"},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:10,gap:8,flexWrap:"wrap"},children:[e("span",{style:{fontSize:11,color:"var(--text-2)",fontFamily:"var(--mono)"},children:r("settings.fallbacks.priority",{n:j+1})}),e("div",{style:{display:"flex",gap:6},children:[e("button",{type:"button",class:"btn btn-sm",onClick:()=>G(j,-1),disabled:j===0,"aria-label":r("settings.fallbacks.moveUp"),title:r("settings.fallbacks.moveUp"),children:"↑"}),e("button",{type:"button",class:"btn btn-sm",onClick:()=>G(j,1),disabled:j===pe.length-1,"aria-label":r("settings.fallbacks.moveDown"),title:r("settings.fallbacks.moveDown"),children:"↓"}),e("button",{type:"button",class:"btn btn-sm",onClick:()=>A(j),style:{borderColor:"var(--danger)",color:"var(--danger)",background:"transparent"},children:r("settings.fallbacks.remove")})]})]}),e("div",{style:{display:"flex",gap:10,flexWrap:"wrap",alignItems:"flex-end"},children:[e("div",{children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:r("settings.fallbacks.providerLabel")}),e("select",{"aria-label":r("settings.fallbacks.providerLabel"),value:C.provider,onChange:je=>ut(j,je.target.value),style:{fontSize:13,padding:"6px 10px",borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--bg-input)",color:"var(--text-1)",cursor:"pointer"},children:va.map(([je,ot])=>e("option",{value:je,children:ot},je))})]}),e("div",{style:{flex:1,minWidth:160},children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:r("settings.fallbacks.modelLabel")}),e("input",{type:"text",value:C.model,placeholder:r("settings.fallbacks.modelPlaceholder"),onInput:je=>Je(j,{model:je.target.value}),style:{width:"100%",fontFamily:"var(--mono)"}})]})]}),O&&e("div",{style:{marginTop:10},children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:r("settings.apiKey")}),e("input",{type:"password",autoComplete:"off",placeholder:C.provider==="anthropic"?"sk-ant-api03-…":"sk-…",value:C.apiKey,onInput:je=>Je(j,{apiKey:je.target.value}),style:{width:"100%"}}),C.hasStoredKey&&!C.apiKey.trim()&&e("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:4},children:r("settings.fallbacks.apiKeyStoredHint")}),X&&e("div",{style:{fontSize:11,color:"var(--warning)",marginTop:4},children:r("settings.fallbacks.needsKey")})]}),e("div",{style:{display:"flex",gap:10,alignItems:"center",marginTop:10,flexWrap:"wrap"},children:[e("button",{type:"button",class:"btn btn-sm",onClick:()=>void oe(j),disabled:K===j,children:r(K===j?"settings.testing":"settings.test")}),V&&e("span",{role:V.valid?"status":"alert",style:{fontSize:12,color:V.valid?"var(--success)":"var(--danger)"},children:V.valid?r("settings.testPassed",{count:V.models?.length??0}):`✗ ${wo(V)}`})]})]},j)})}),e("div",{style:{display:"flex",gap:10,alignItems:"center",marginTop:14,flexWrap:"wrap"},children:[e("button",{type:"button",class:"btn",onClick:it,children:r("settings.fallbacks.add")}),e("button",{type:"button",class:"btn btn-primary",onClick:()=>void Qe(),disabled:he,children:r(he?"settings.saving":"settings.fallbacks.save")}),se&&e("span",{role:se.startsWith(r("common.error"))?"alert":"status",style:{fontSize:12,color:se.startsWith(r("common.error"))?"var(--danger)":"var(--success)"},children:se})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:r("settings.updates")}),n?.currentVersionDeprecated&&n.deprecationMessage&&e("div",{style:{background:"var(--danger-soft)",border:"1px solid rgba(255, 122, 107, 0.4)",borderRadius:"var(--radius-xs)",padding:"10px 12px",marginBottom:12,fontSize:12,color:"var(--text-0)",lineHeight:1.55},"data-testid":"settings-deprecation-warning",children:[e("strong",{style:{color:"var(--danger)"},children:r("settings.updateDeprecatedTitle",{version:n.currentVersion})}),e("div",{style:{marginTop:4,opacity:.9},children:n.deprecationMessage})]}),n&&n.checkSucceeded&&n.lastError&&e("div",{style:{background:"var(--warning-soft)",border:"1px solid rgba(255, 171, 64, 0.4)",borderRadius:"var(--radius-xs)",padding:"10px 12px",marginBottom:12,fontSize:12,color:"var(--text-0)",lineHeight:1.55},"data-testid":"settings-update-partial-warning",children:[e("strong",{style:{color:"var(--warning)"},children:r("settings.updatePartialTitle")}),e("div",{style:{marginTop:4,opacity:.9},children:r("settings.updatePartialDescription",{message:n.lastError??""})})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,alignItems:"baseline",marginBottom:12,flexWrap:"wrap"},children:[e("div",{style:{color:H,fontSize:13,fontWeight:600},children:F}),e("div",{style:{display:"flex",gap:10,alignItems:"center",flexWrap:"wrap"},children:[!et&&n&&e("div",{style:{fontSize:11,color:"var(--text-2)"},children:ee}),e("button",{class:"btn btn-sm",type:"button",onClick:()=>{we(!0,!!n)},disabled:Lt,children:r(Lt?"settings.updateChecking":"settings.checkNow")})]})]}),e("div",{style:{display:"grid",gap:10},children:[e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:r("settings.installMethod")}),e("span",{style:{color:"var(--text-0)"},children:et?r("common.loading"):re})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:r("settings.currentVersion")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:n?.currentVersion||"—"})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:r("settings.latestVersion")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:n?.latestVersion||"—"})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:r("settings.lastAttempted")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:Re})]}),Le&&e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:r("settings.lastSuccessful")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:Ee})]}),!R&&e("div",{style:{color:"var(--text-2)",fontSize:12,lineHeight:1.5,marginTop:2},children:ye}),tt&&e("div",{style:{color:"var(--warning)",fontSize:12,lineHeight:1.5},children:r("settings.updateLastError",{message:n?.lastError||""})}),n?.recommendedCommand&&e("div",{style:{display:"grid",gap:6,marginTop:4},children:[e("span",{style:{color:"var(--text-2)",fontSize:12},children:r("settings.updateCommand")}),e("code",{style:{color:"var(--text-0)",background:"var(--bg-input)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:"8px 10px",fontSize:12,fontFamily:"var(--mono)"},children:n.recommendedCommand})]})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:r("settings.behaviourTitle")}),e("div",{style:{marginTop:8},children:[e("label",{id:"settings-autoupdate-label",style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:r("settings.autoUpdateLabel")}),e("select",{"aria-labelledby":"settings-autoupdate-label",value:o?.config.autoUpdate??"off",onChange:async C=>{const j=C.target.value;await Fe({autoUpdate:j},O=>({...O,config:{...O.config,autoUpdate:j}}))},style:{fontSize:13,padding:"6px 10px",borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--bg-input)",color:"var(--text-1)",cursor:"pointer"},children:[e("option",{value:"off",children:r("settings.autoUpdateOff")}),e("option",{value:"patch",children:r("settings.autoUpdatePatch")}),e("option",{value:"minor",children:r("settings.autoUpdateMinor")}),e("option",{value:"major",children:r("settings.autoUpdateMajor")})]}),e("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:4},children:r("settings.autoUpdateHint")})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:r("settings.language")}),e("select",{"aria-label":r("settings.language"),value:t,onChange:C=>{const j=C.target.value;Dr(j),s(j);const O=to().find(V=>V.code===j)?.name;O&&Z("POST","/v1/config",{language:O}).catch(()=>{})},style:{fontSize:13,padding:"6px 10px",borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--bg-input)",color:"var(--text-1)",cursor:"pointer"},children:to().map(C=>e("option",{value:C.code,children:C.name},C.code))})]})]})}function Sa({node:t,nodeTitle:s,onClose:o}){const[a,n]=v({phase:"loading"});return te(()=>{let i=!1;return n({phase:"loading"}),Wr(t).then(m=>{i||n({phase:"loaded",data:m})}).catch(m=>{i||(console.warn("[memesh dashboard] evidence drill-down failed:",m),n({phase:"failed"}))}),()=>{i=!0}},[t]),e("div",{style:{marginTop:12,padding:12,background:"var(--bg-2)",border:"1px solid var(--border)",borderRadius:"var(--radius)"},children:[e("div",{style:{display:"flex",alignItems:"baseline",gap:8,marginBottom:8},children:[e("strong",{style:{fontSize:13},children:r("graph.evidenceFor",{node:s})}),e("button",{type:"button",onClick:o,style:{marginLeft:"auto",background:"transparent",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",color:"var(--text-2)",fontSize:11,padding:"2px 8px",cursor:"pointer"},children:r("graph.evidenceClose")})]}),a.phase==="loading"&&e("div",{style:{color:"var(--text-2)",fontSize:12},children:r("graph.evidenceLoading")}),a.phase==="failed"&&e("div",{role:"alert",style:{color:"var(--danger)",fontSize:12},children:r("graph.evidenceFailed")}),a.phase==="loaded"&&a.data.entities.length===0&&e("div",{style:{color:"var(--text-2)",fontSize:12},children:r("graph.evidenceEmpty")}),a.phase==="loaded"&&a.data.entities.length>0&&e(de,{children:[e("ul",{style:{listStyle:"none",margin:0,padding:0,display:"grid",gap:6},children:a.data.entities.map(i=>e("li",{style:{display:"flex",gap:8,alignItems:"baseline",fontSize:12},children:[e("span",{style:{color:"var(--text-3)",fontSize:11,minWidth:96},children:Ge(i.type)}),e("span",{style:{color:"var(--text-1)"},children:Xe(i)})]},i.name))}),a.data.truncated&&e("div",{style:{marginTop:8,color:"var(--text-2)",fontSize:11},children:r("graph.evidenceTruncated",{shown:a.data.entities.length})})]})]})}function tr(t){return Array.isArray(t?.entities)&&Array.isArray(t.relations)}function Ca(t){return tr(t)&&typeof t.evidenceCounts=="object"&&t.evidenceCounts!==null&&!Array.isArray(t.evidenceCounts)}const Mo=3,So=5,sr={decision:"--life","session-insight":"--text-2"},or="--text-1",Aa=["--life","--life-hover","--text-0","--text-1","--text-2","--text-3","--bg-0","--bg-1","--font-ui","--mono"];function Ea(t){const s=sr[t];return s?`var(${s})`:pt[t]??`var(${or})`}function La(t,s){const o=sr[t];return o?s[o]??"":pt[t]??s[or]??""}function Ta(t){const s=Math.max(0,Math.min(1,(t-.15)/.85)),o=Math.round(248+-105*s),a=Math.round(113+129*s),n=Math.round(113+-21*s);return`rgb(${o},${a},${n})`}function Pa(t){const s=Number.isFinite(t)&&t>0?t:0;return s===0?3.5:Math.min(9,3.5+Math.log2(s+1)*1.2)}function Ra(t,s=.55){const o=/^#([0-9a-f]{6})$/i.exec(t.trim());if(o){const n=parseInt(o[1],16),i=Math.round((n>>16&255)*s),m=Math.round((n>>8&255)*s),d=Math.round((n&255)*s);return`rgb(${i},${m},${d})`}const a=/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/.exec(t.trim());return a?`rgb(${Math.round(+a[1]*s)},${Math.round(+a[2]*s)},${Math.round(+a[3]*s)})`:t}function Co(t){let s=5381;for(let o=0;o<t.length;o++)s=(s<<5)+s+t.charCodeAt(o)>>>0;return s}function ja(t){if(!t)return .15;const s=Date.now()-new Date(t).getTime();return Math.max(.15,1-Math.min(1,s/(30*864e5)))}function za(t){const s=Date.now()-new Date(t).getTime(),o=Math.floor(s/864e5);return o<1?r("graph.ageToday"):o<7?r("graph.ageDaysAgo",{count:o}):o<30?r("graph.ageWeeksAgo",{count:Math.floor(o/7)}):r("graph.ageDaysAgo",{count:o})}function fs(t,s){return t.length>s?t.slice(0,s-2)+"...":t}const Ao=440,Bt=4,Da=1500;function Na(t,s=Da){return t.length<=s?t:[...t].sort((o,a)=>(a.access_count??0)-(o.access_count??0)||(a.last_accessed_at??a.created_at).localeCompare(o.last_accessed_at??o.created_at)).slice(0,s)}function Ia(){const[t,s]=v(null),[o,a]=v("work"),[n,i]=v("work"),[m,d]=v(!1),[u,l]=v({}),[h,c]=v(null),[g,f]=v(0),[b,M]=v(!0),[k,y]=v(null),[L,N]=v({}),[W]=Ps(),[U,p]=v(""),[w,B]=v(null),[T,Y]=v(!1),_=ne(null),R=ne([]),ae=ne([]),Ce=ne(new Set),ge=ne(0),pe=ne({scale:1,panX:0,panY:0}),D=ne({active:!1,startScreenX:0,startScreenY:0,startPanX:0,startPanY:0,moved:!1}),P=ne({node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1}),q=ne(null),K=ne({x:0,y:0,node:null}),J=ne(800),he=ne({}),fe=ne(L),se=ne(U),ce=ne(w),we=ne(T),Pe=ne(W);te(()=>{fe.current=L},[L]),te(()=>{if(!t)return;const S=new Set(t.noiseTypes??[]);N(I=>{const F={...I};let H=!1;for(const ee of S){const re=!W;F[ee]!==re&&(F[ee]=re,H=!0)}return H?F:I})},[W,t]),te(()=>{se.current=U},[U]),te(()=>{ce.current=w},[w]),te(()=>{we.current=T},[T]),te(()=>{Pe.current=W},[W]);const Ne=ze(S=>{if(!tr(S)){console.warn("[memesh dashboard] /v1/graph answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",S),y("unreadable"),s(null);return}y(null);const I=Na(S.entities);I.length<S.entities.length&&console.info(`[memesh dashboard] graph capped at ${I.length} of ${S.entities.length} entities — the O(n²) simulation freezes the tab beyond this; showing the most-recalled nodes.`),f(S.entities.length),s({...S,entities:I});const F=new Set(Array.isArray(S.noiseTypes)?S.noiseTypes:[]),H={},ee=Pe.current;I.forEach(re=>{H[re.type]=H[re.type]??(ee?!F.has(re.type):!0)}),N(H)},[]);te(()=>{let S=!1;M(!0),c(null);const I=()=>qr().then(H=>{S||(i("all"),l({}),Ne(H))}),F=o==="all"?(d(!1),I()):Ur().then(H=>{if(!S){if(!Ca(H)){console.warn("[memesh dashboard] /v1/graph?layer=work answered with a shape this bundle cannot render:",H),y("unreadable"),s(null);return}if(H.entities.length<Mo)return d(!0),I();d(!1),i("work"),l(H.evidenceCounts),Ne({...H,noiseTypes:[]})}});return Promise.resolve(F).catch(H=>{S||(console.warn("[memesh dashboard] graph failed to load:",H),y(at(H)))}).finally(()=>{S||M(!1)}),()=>{S=!0}},[o,Ne]);const Be=be(()=>{const S=new Map;if(!t)return S;for(const I of t.entities){const F=Xe(I);S.set(I.name,{display:F,search:`${I.name} ${F}`.toLowerCase()})}return S},[t]);te(()=>{if(!t||b)return;const S=_.current;if(!S)return;he.current=Xo(S,Aa);const I=S.parentElement?.getBoundingClientRect(),F=I?Math.floor(I.width)-24:800,H=Ao,ee=window.devicePixelRatio||1;S.width=F*ee,S.height=H*ee,S.style.width=F+"px",S.style.height=H+"px",J.current=F;const re=new Set;t.relations.forEach(z=>{re.add(z.from),re.add(z.to)});const ye=2.399963229728653,Re=F/2,Ee=H/2,Le=[...new Set(t.entities.map(z=>z.type))].sort(),tt=new Map,C=F*.42,j=H*.42;Le.forEach((z,Q)=>{const x=Math.sqrt((Q+1)/Le.length),ie=Q*ye;tt.set(z,{x:Re+Math.cos(ie)*C*x,y:Ee+Math.sin(ie)*j*x})});const O=new Map;for(const z of Le)t.entities.filter(Q=>Q.type===z).map(Q=>Q.name).sort().forEach((Q,x)=>O.set(Q,x));const V=Math.min(F,H)*.18,X=new Map;t.entities.forEach(z=>{const Q=z.last_accessed_at||z.created_at,x=tt.get(z.type),ie=O.get(z.name),me=Co(z.name),qe=ie*ye+me%100/100,Ye=Math.min(V,14+Math.sqrt(ie)*16+me%7),gt=Be.get(z.name);X.set(z.name,{id:z.name,display:gt.display,searchText:gt.search,type:z.type,x:Math.min(F-16,Math.max(16,x.x+Math.cos(qe)*Ye)),y:Math.min(H-16,Math.max(16,x.y+Math.sin(qe)*Ye)),vx:0,vy:0,radius:Pa(z.access_count),recency:ja(Q),isOrphan:!re.has(z.name),lastDate:Q,accessCount:Math.max(0,z.access_count??0),evidenceCount:u[z.name]??0,badge:null})});const je=Array.from(X.values()).sort(n==="work"?(z,Q)=>Q.recency-z.recency||Q.evidenceCount-z.evidenceCount||z.id.localeCompare(Q.id):(z,Q)=>Q.accessCount-z.accessCount||Q.recency-z.recency||z.id.localeCompare(Q.id));R.current=Array.from(X.values()),ae.current=t.relations.filter(z=>X.has(z.from)&&X.has(z.to));const ot=new Set;for(const z of ae.current){const Q=Co(z.from+" "+z.to);((Q^Q>>>16)&3)===0&&ot.add(z)}const ar=z=>{const Q=new Map,x=z.map(me=>{const qe=X.get(me.from),Ye=X.get(me.to),gt=Math.sqrt(Math.log2(qe.accessCount+2)*Math.log2(Ye.accessCount+2));return{e:me,p:gt*Math.min(qe.recency,Ye.recency)}}).sort((me,qe)=>qe.p-me.p),ie=new Set;for(const{e:me}of x){if(ie.size>=128)break;const qe=Q.get(me.from)??0,Ye=Q.get(me.to)??0;qe>=5||Ye>=5||(ie.add(me),Q.set(me.from,qe+1),Q.set(me.to,Ye+1))}return ie};let Ds=null;const xt=z=>{if(fe.current[z.type]===!1)return!1;const x=ce.current;return x?z.id===x?!0:ae.current.some(me=>me.from===x&&me.to===z.id||me.to===x&&me.from===z.id):!0},ir=z=>{const Q=X.get(z.from),x=X.get(z.to);return!Q||!x?!1:xt(Q)&&xt(x)},lr=z=>{const Q=se.current.toLowerCase();return Q?z.searchText.includes(Q):!1};let ct=1;const cr=.005,dr=()=>{ct=.3};window.__graphReheat=dr;const Ns=()=>{const z=R.current,Q=ae.current,x=S.getContext("2d");if(!x)return;const ie=he.current,me=window.devicePixelRatio||1;ct=Math.max(0,ct-cr);const qe=ct>0,Ye=.85,gt=2e3*ct,mr=80,ur=.02*ct,Is=.02*ct,hr=z.length>200,Hs=F/2,Os=H/2,Tt=new Map(z.map(E=>[E.id,E]));if(qe){for(let E=0;E<z.length;E++)for(let $=E+1;$<z.length;$++){const le=z[$].x-z[E].x,Te=z[$].y-z[E].y,xe=le*le+Te*Te;if(hr&&xe>9e4)continue;const Me=Math.sqrt(xe)||1,We=gt/(Me*Me),Ze=le/Me*We,Ke=Te/Me*We;z[E].vx-=Ze,z[E].vy-=Ke,z[$].vx+=Ze,z[$].vy+=Ke}for(const E of Q){const $=Tt.get(E.from),le=Tt.get(E.to);if(!$||!le)continue;const Te=le.x-$.x,xe=le.y-$.y,Me=Math.sqrt(Te*Te+xe*xe)||1,We=(Me-mr)*ur,Ze=Te/Me*We,Ke=xe/Me*We;$.vx+=Ze,$.vy+=Ke,le.vx-=Ze,le.vy-=Ke}for(const E of z)E.vx+=(Hs-E.x)*Is,E.vy+=(Os-E.y)*Is}let wt=P.current.node;if(wt&&!z.includes(wt)&&(P.current.node=null,wt=null),!(!qe&&!wt&&z.every(E=>E.vx===0&&E.vy===0)))for(const E of z){if(wt===E)continue;E.vx*=Ye,E.vy*=Ye,Math.abs(E.vx)<.01&&Math.abs(E.vy)<.01&&(E.vx=0,E.vy=0),E.x+=E.vx,E.y+=E.vy;const $=100;E.x<-$?E.x=-$:E.x>F+$&&(E.x=F+$),E.y<-$?E.y=-$:E.y>H+$&&(E.y=H+$)}const Bs=se.current.toLowerCase();if(Bs){const E=z.filter($=>$.searchText.includes(Bs));if(E.length===1){const $=E[0],le=Hs-$.x,Te=Os-$.y,xe=.05;for(const Me of z)Me.x+=le*xe,Me.y+=Te*xe}}x.setTransform(me,0,0,me,0,0),x.clearRect(0,0,F,H);const Ie=pe.current;x.setTransform(Ie.scale*me,0,0,Ie.scale*me,Ie.panX*me,Ie.panY*me);const Pt=Q.filter(ir),gr=Pt.length<30,Fs=(ce.current??"")+"|"+Object.keys(fe.current).filter(E=>fe.current[E]===!1).sort().join(",");Fs!==Ds&&(Ds=Fs,Ce.current=ar(Pt));const pr=Ce.current,fr=Pt.length>400,qs=ce.current!==null;for(const E of Pt){const $=Tt.get(E.from),le=Tt.get(E.to);if(!$||!le)continue;const Te=pr.has(E);if(!Te&&!qs){if(fr&&!ot.has(E))continue;x.globalAlpha=Math.min($.recency,le.recency)*.22}else x.globalAlpha=Math.min($.recency,le.recency)*.7;if(x.strokeStyle=cs(ie["--life"],Te||qs?.5:.35),x.lineWidth=1,x.setLineDash([]),x.beginPath(),x.moveTo($.x,$.y),x.lineTo(le.x,le.y),x.stroke(),gr){const xe=($.x+le.x)/2,Me=($.y+le.y)/2,We=x.globalAlpha;x.globalAlpha=Math.max(.6,Math.min($.recency,le.recency)),x.font=`${9/Ie.scale}px ${ie["--font-ui"]}`,x.fillStyle=ie["--text-2"],x.fillText(Gr(E.type),xe+2,Me-2),x.globalAlpha=We}}x.globalAlpha=1;const yr=z.filter(xt),vr=Ie.scale<.75?3:Ie.scale<1.5?12:28,os=new Set;if(!we.current)for(const E of je){if(os.size>=vr)break;if(!xt(E))continue;const $=E.x*Ie.scale+Ie.panX,le=E.y*Ie.scale+Ie.panY;$<-20||$>F+20||le<-20||le>H+20||os.add(E)}const br=q.current;for(const E of yr){const $=br===E,le=lr(E),Te=ce.current===E.id,xe=Te?10:$?9:E.radius;E.badge=null;const Me=$||le?1:E.recency;x.globalAlpha=Me,x.beginPath(),x.arc(E.x,E.y,xe,0,Math.PI*2);const We=we.current?Ta(E.recency):La(E.type,ie);x.fillStyle=We,x.fill(),E.isOrphan||(x.strokeStyle=Ra(We),x.lineWidth=1,x.stroke()),E.isOrphan&&(x.setLineDash([3,3]),x.strokeStyle=ie["--text-3"],x.lineWidth=1,x.stroke(),x.setLineDash([])),le&&(x.globalAlpha=1,x.strokeStyle=ie["--life-hover"],x.lineWidth=2,x.beginPath(),x.arc(E.x,E.y,xe+3,0,Math.PI*2),x.stroke()),$&&!le&&(x.globalAlpha=1,x.strokeStyle=ie["--life-hover"],x.lineWidth=2,x.beginPath(),x.arc(E.x,E.y,xe,0,Math.PI*2),x.stroke());const Ze=$||le||Te||os.has(E);if(Ze){const Ke=$||le||Te;x.globalAlpha=Ke?1:Math.max(.7,E.recency),x.font=`${10/Ie.scale}px ${ie["--font-ui"]}`;const rt=le||Te?fs(E.display,48):fs(E.display,20);x.strokeStyle=ie["--bg-0"],x.lineWidth=3/Ie.scale,x.strokeText(rt,E.x+xe+4,E.y+3),x.fillStyle=Ke?ie["--text-1"]:ie["--text-2"],x.fillText(rt,E.x+xe+4,E.y+3),x.globalAlpha=Me}if(E.evidenceCount>0&&Ze){const Ke=So/Ie.scale,rt=E.x+xe*.8,rs=E.y-xe*.8;E.badge={x:rt,y:rs},x.globalAlpha=1,x.beginPath(),x.arc(rt,rs,Ke,0,Math.PI*2),x.fillStyle=ie["--bg-0"],x.fill(),x.strokeStyle=ie["--life"],x.lineWidth=1/Ie.scale,x.stroke(),x.font=`${7/Ie.scale}px ${ie["--mono"]}`,x.fillStyle=ie["--life"],x.textAlign="center",x.textBaseline="middle",x.fillText(E.evidenceCount>99?"99+":String(E.evidenceCount),rt,rs),x.textAlign="start",x.textBaseline="alphabetic",x.globalAlpha=Me}}x.globalAlpha=1;const dt=K.current;if(dt.node&&xt(dt.node)){x.setTransform(me,0,0,me,0,0);const E=dt.x+12,$=dt.y-10,le=Ge(dt.node.type),Te=za(dt.node.lastDate),xe=fs(dt.node.display,64),Me=`${le} | ${Te}`;x.font=`11px ${ie["--font-ui"]}`;const We=x.measureText(xe).width,Ze=x.measureText(Me).width,Ke=Math.max(We,Ze)+12,rt=34;x.fillStyle=cs(ie["--bg-1"],.92),x.strokeStyle=cs(ie["--life"],.3),x.lineWidth=1,x.beginPath(),x.roundRect(E-4,$-18,Ke,rt,4),x.fill(),x.stroke(),x.fillStyle=ie["--text-0"],x.fillText(xe,E,$-4),x.fillStyle=ie["--text-2"],x.font=`10px ${ie["--mono"]}`,x.fillText(Me,E,$+10)}ge.current=requestAnimationFrame(Ns)};return ge.current=requestAnimationFrame(Ns),()=>cancelAnimationFrame(ge.current)},[t,b,n,u,Be]);const De=ze((S,I)=>{const F=R.current,H=fe.current,ee=ce.current,re=pe.current.scale||1,ye=12/re,Re=ye*ye;for(let Ee=F.length-1;Ee>=0;Ee--){const Le=F[Ee];if(H[Le.type]===!1||ee&&Le.id!==ee&&!ae.current.some(O=>O.from===ee&&O.to===Le.id||O.to===ee&&O.from===Le.id))continue;const tt=Le.x-S,C=Le.y-I;if(tt*tt+C*C<Re)return Le;if(Le.badge){const j=So/re,O=Le.badge.x-S,V=Le.badge.y-I;if(O*O+V*V<j*j)return Le}}return null},[]),Ae=ze(S=>{const I=_.current;if(!I)return{x:0,y:0};const F=I.getBoundingClientRect();return{x:S.clientX-F.left,y:S.clientY-F.top}},[]),Fe=ze((S,I)=>{const F=pe.current;return{x:(S-F.panX)/F.scale,y:(I-F.panY)/F.scale}},[]),Je=ze(S=>{_.current?.setPointerCapture?.(S.pointerId);const I=Ae(S),F=Fe(I.x,I.y),H=De(F.x,F.y);if(H)window.__graphReheat?.(),P.current={node:H,offsetX:F.x-H.x,offsetY:F.y-H.y,startX:I.x,startY:I.y,dragged:!1},D.current.active=!1;else{const ee=pe.current;D.current={active:!0,startScreenX:I.x,startScreenY:I.y,startPanX:ee.panX,startPanY:ee.panY,moved:!1},P.current={node:null,offsetX:0,offsetY:0,startX:I.x,startY:I.y,dragged:!1};const re=_.current;re&&(re.style.cursor="grabbing")}},[De,Ae,Fe]),ut=ze(S=>{const I=Ae(S),F=Fe(I.x,I.y),H=P.current,ee=D.current;if(H.node){const Re=I.x-H.startX,Ee=I.y-H.startY;Re*Re+Ee*Ee>Bt*Bt&&(H.dragged=!0),H.node.x=F.x-H.offsetX,H.node.y=F.y-H.offsetY,H.node.vx=0,H.node.vy=0}else if(ee.active){const Re=I.x-ee.startScreenX,Ee=I.y-ee.startScreenY;Re*Re+Ee*Ee>Bt*Bt&&(ee.moved=!0),pe.current.panX=ee.startPanX+Re,pe.current.panY=ee.startPanY+Ee}const re=De(F.x,F.y);q.current=re,K.current=re?{x:I.x,y:I.y,node:re}:{x:0,y:0,node:null};const ye=_.current;ye&&(H.node||ee.active?ye.style.cursor="grabbing":re?ye.style.cursor=ce.current?"pointer":"grab":ye.style.cursor="grab")},[De,Ae,Fe]),it=ze(S=>{_.current?.releasePointerCapture?.(S.pointerId);const I=P.current,F=D.current,H=Ae(S),ee=Fe(H.x,H.y);if(I.node&&!I.dragged){B(Re=>Re===I.node.id?null:I.node.id);const ye=I.node;c(Re=>Re?.id===ye.id?null:ye)}else!I.node&&F.active&&!F.moved&&(De(ee.x,ee.y)||(B(null),c(null)));P.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1},D.current.active=!1,D.current.moved=!1;const re=_.current;if(re){const ye=De(ee.x,ee.y);re.style.cursor=ye&&ce.current?"pointer":"grab"}},[De,Ae,Fe]),A=ze(()=>{P.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1},D.current.active=!1,D.current.moved=!1,q.current=null,K.current={x:0,y:0,node:null};const S=_.current;S&&(S.style.cursor="default")},[]),G=ze(S=>{S.preventDefault();const I=_.current;if(!I)return;const F=I.getBoundingClientRect(),H=S.clientX-F.left,ee=S.clientY-F.top,re=pe.current,ye=re.scale,Re=Math.exp(-S.deltaY*.0015),Ee=Math.max(.25,Math.min(4,ye*Re));if(Ee===ye)return;const Le=(H-re.panX)/ye,tt=(ee-re.panY)/ye;re.scale=Ee,re.panX=H-Le*Ee,re.panY=ee-tt*Ee},[]),oe=ze(()=>{pe.current={scale:1,panX:0,panY:0}},[]);if(te(()=>{if(b||!t)return;const S=_.current;if(!S)return;const I=F=>G(F);return S.addEventListener("wheel",I,{passive:!1}),()=>S.removeEventListener("wheel",I)},[t,b,G]),b)return e("div",{class:"empty",children:e("div",{class:"loading"})});if(k)return e("div",{class:"error-box",role:"alert",children:Ue(k)});if(!t)return e("div",{class:"error-box",role:"alert",children:[r("common.error"),": ",r("common.noData")]});const Qe=new Map;t.entities.forEach(S=>Qe.set(S.type,(Qe.get(S.type)||0)+1));const lt=new Set(t.entities.map(S=>S.name)),kt=new Set;t.relations.forEach(S=>{!lt.has(S.from)||!lt.has(S.to)||(kt.add(S.from),kt.add(S.to))});const et=t.entities.filter(S=>!kt.has(S.name)).length,Lt=U?[...Be.values()].filter(S=>S.search.includes(U.toLowerCase())).length:0,ht=w?t.entities.find(S=>S.name===w):null;if(t.entities.length===0)return e("div",{children:[e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:"0"}),e("div",{class:"stat-lbl",children:r("graph.entities")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:"0"}),e("div",{class:"stat-lbl",children:r("graph.relations")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:"0"}),e("div",{class:"stat-lbl",children:r("graph.orphans")})]})]}),e("div",{class:"card",style:{padding:12},children:[e("span",{class:"card-title",style:{margin:0},children:r("tab.graph")}),e(js,{})]})]});const ss=g>t.entities.length;return e("div",{children:[e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:g.toLocaleString(ke())}),e("div",{class:"stat-lbl",children:r("graph.entities")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.relations.length.toLocaleString(ke())}),e("div",{class:"stat-lbl",children:r("graph.relations")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:et.toLocaleString(ke())}),e("div",{class:"stat-lbl",children:r("graph.orphans")})]})]}),ss&&e("div",{role:"status",style:{fontSize:11,color:"var(--text-2)",margin:"0 0 8px"},children:r("graph.cappedNote",{shown:t.entities.length.toLocaleString(ke()),total:g.toLocaleString(ke())})}),e("div",{style:{display:"flex",alignItems:"center",gap:8,margin:"0 0 8px"},children:[e("div",{role:"group","aria-label":r("graph.layerLabel"),style:{display:"flex",gap:4},children:["work","all"].map(S=>e("button",{type:"button","aria-pressed":o===S,onClick:()=>a(S),style:{fontSize:11,padding:"3px 10px",borderRadius:"var(--radius)",cursor:"pointer",border:`1px solid ${o===S?"var(--life)":"var(--border)"}`,background:o===S?"var(--life-soft)":"transparent",color:o===S?"var(--life)":"var(--text-2)"},children:r(S==="work"?"graph.layerWork":"graph.layerAll")},S))}),e("span",{style:{fontSize:11,color:"var(--text-2)"},children:r(n==="work"?"graph.layerWorkHint":"graph.layerAllHint")})]}),m&&e("div",{role:"status",style:{fontSize:11,color:"var(--text-2)",margin:"0 0 8px"},children:r("graph.layerFellBack",{min:Mo})}),e("div",{class:"card",style:{padding:12},children:[e("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:8,flexWrap:"nowrap",overflowX:"auto",paddingBottom:4,scrollbarWidth:"thin"},children:[e("span",{class:"card-title",style:{margin:0,flexShrink:0},children:r("tab.graph")}),Array.from(Qe.entries()).map(([S,I])=>{const F=L[S]!==!1,H=Ea(S);return e("label",{style:{display:"inline-flex",alignItems:"center",gap:4,fontSize:11,color:"var(--text-1)",opacity:F?1:.4,cursor:"pointer",userSelect:"none"},children:[e("input",{type:"checkbox",checked:F,onChange:()=>N(ee=>({...ee,[S]:!ee[S]})),style:{accentColor:H,width:13,height:13,cursor:"pointer"}}),e("span",{style:{width:8,height:8,borderRadius:"50%",background:H,display:"inline-block",flexShrink:0}}),Ge(S)," (",I,")"]},S)})]}),e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8,flexWrap:"wrap"},children:[e("input",{type:"text",placeholder:r("graph.search"),value:U,onInput:S=>p(S.target.value),style:{flex:"1 1 160px",minWidth:120,maxWidth:260,padding:"4px 8px",background:"var(--bg-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-xs)",color:"var(--text-0)",fontSize:12,fontFamily:"var(--font-ui)"}}),U&&e("span",{style:{fontSize:11,fontFamily:"var(--mono)",color:"var(--text-2)"},children:[Lt," ",r("graph.matches")]}),e("button",{onClick:oe,title:r("graph.resetViewHint"),style:{marginLeft:"auto",padding:"3px 10px",background:"var(--border-subtle)",border:"1px solid var(--border)",borderRadius:"var(--radius-xs)",color:"var(--text-2)",fontSize:11,cursor:"pointer"},children:r("graph.resetView")}),e("button",{onClick:()=>Y(S=>!S),title:r("graph.driftHint"),"aria-pressed":T,style:{padding:"3px 10px",background:T?"rgba(143,242,92,0.15)":"var(--border-subtle)",border:`1px solid ${T?"rgba(143,242,92,0.4)":"var(--border)"}`,borderRadius:"var(--radius-xs)",color:T?"var(--life)":"var(--text-2)",fontSize:11,cursor:"pointer",display:"flex",alignItems:"center",gap:6},children:[e("span",{style:{display:"inline-block",width:32,height:6,borderRadius:"var(--radius-hairline)",background:"linear-gradient(to right, #F87171, var(--life))"}}),r("graph.drift")]})]}),ht&&e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8,padding:"4px 10px",background:"var(--life-soft)",borderRadius:"var(--radius-xs)",fontSize:12},children:[e("span",{style:{color:"var(--life)",fontWeight:600},children:[r("graph.focusMode"),":"]}),e("span",{style:{color:"var(--text-0)"},children:Xe(ht)}),e("button",{onClick:()=>B(null),style:{marginLeft:"auto",padding:"2px 8px",background:"rgba(143, 242, 92, 0.12)",border:"1px solid rgba(143, 242, 92, 0.2)",borderRadius:"var(--radius-hairline)",color:"var(--life)",fontSize:11,cursor:"pointer"},children:r("graph.showAll")})]}),!w&&e("div",{style:{fontSize:11,color:"var(--text-3)",marginBottom:6},children:r("graph.interactHint")}),e("canvas",{ref:_,role:"img",tabIndex:0,"aria-label":r("graph.canvasA11y",{entities:g.toLocaleString(ke()),relations:t.relations.length.toLocaleString(ke()),orphans:et.toLocaleString(ke())}),style:{width:"100%",height:Ao,borderRadius:"var(--radius-sm)",background:"var(--bg-0)",cursor:"grab",touchAction:"none"},onPointerDown:Je,onPointerMove:ut,onPointerUp:it,onPointerCancel:A,onPointerLeave:A}),n==="work"&&h&&e(Sa,{node:h.id,nodeTitle:h.display,onClose:()=>c(null)})]})]})}const Ha=["bug","feature","question"],Eo={bug:"feedback.bug",feature:"feedback.feature",question:"feedback.question"};function Oa({health:t}){const[s,o]=v(!1),[a,n]=v("bug"),[i,m]=v(""),[d,u]=v(!0),[l,h]=v(!1),c=ne(null),g=ne(null),f=ne(null),b=()=>{o(!1),g.current?.focus()};te(()=>{if(!s)return;f.current?.focus();const y=N=>{const W=N.target;g.current?.contains(W)||c.current&&!c.current.contains(W)&&o(!1)},L=N=>{N.key==="Escape"&&(N.preventDefault(),b())};return document.addEventListener("mousedown",y),document.addEventListener("keydown",L),()=>{document.removeEventListener("mousedown",y),document.removeEventListener("keydown",L)}},[s]);function M(y){const L=y.checks.find(w=>w.id==="install_id"),U=y.checks.filter(w=>w.id!=="install_id").sort((w,B)=>{const T={fail:0,warn:1,pass:2};return(T[w.status]??3)-(T[B.status]??3)}).map(w=>{const B=w.status==="fail"?"❌":w.status==="warn"?"⚠️":"✅",T=w.fix?` _Fix: ${w.fix}_`:"";return`- ${B} **${w.label}**: ${w.summary}${T}`}),p=L?`
|
|
14
|
+
_Anonymous install ID: \`${(L.summary.match(/[0-9a-f-]{36}/)??["(unavailable)"])[0]}\` — included only because you checked "Include system info"._
|
|
15
|
+
`:"";return`**Diagnostics** (overall: ${y.status})${p}
|
|
16
|
+
${U.join(`
|
|
17
|
+
`)}`}const k=async()=>{if(!(!i.trim()||l)){h(!0);try{const y=`feedback,from-dashboard,${a}`;let L=i.trim();if(d&&t){L+=`
|
|
17
18
|
|
|
18
19
|
---
|
|
19
20
|
**System Info**
|
|
20
21
|
- Version: \`${t.version}\`
|
|
21
22
|
- Entities: ${t.entity_count}
|
|
22
23
|
- Platform: \`${navigator.platform}\`
|
|
23
|
-
- User Agent: \`${navigator.userAgent}\``;try{const
|
|
24
|
+
- User Agent: \`${navigator.userAgent}\``;try{const U=await Z("GET","/v1/doctor");L+=`
|
|
24
25
|
|
|
25
|
-
${
|
|
26
|
+
${M(U)}`}catch{}}const N=r(Eo[a]),W=`https://github.com/PCIRCLE-AI/memesh/issues/new?title=${encodeURIComponent(`[${N}] `)}&body=${encodeURIComponent(L)}&labels=${encodeURIComponent(y)}`;window.open(W,"_blank"),m(""),o(!1)}finally{h(!1)}}};return e(de,{children:[e("button",{ref:g,class:"fb-btn",onClick:()=>o(!s),"aria-haspopup":"dialog","aria-expanded":s,"aria-controls":"fb-panel",children:r("feedback.button")}),s&&e("div",{class:"fb-panel",ref:c,role:"dialog",id:"fb-panel","aria-labelledby":"fb-title",children:[e("h3",{class:"fb-title",id:"fb-title",children:r("feedback.title")}),e("div",{class:"fb-types",children:Ha.map(y=>e("label",{class:`fb-type ${a===y?"selected":""}`,children:[e("input",{type:"radio",name:"fb-type",value:y,checked:a===y,onChange:()=>n(y)}),r(Eo[y])]},y))}),e("textarea",{ref:f,class:"fb-desc","aria-label":r("feedback.descLabel"),placeholder:r("feedback.placeholder"),value:i,onInput:y=>m(y.target.value)}),e("label",{class:"fb-sys-row",children:[e("input",{type:"checkbox",checked:d,onChange:()=>u(!d)}),r("feedback.includeSys")]}),e("button",{class:"btn btn-primary fb-submit",onClick:k,disabled:l,children:r(l?"feedback.submitting":"feedback.submit")})]})]})}function Ba({currentToken:t,onSubmit:s,rejected:o=!1}){const[a,n]=v(t??""),[i,m]=v(!1);function d(c){c.preventDefault(),m(!0),a.trim()&&s(a.trim())}const u=i&&!a.trim(),l=o&&!u,h=u||l?"auth-prompt-error":void 0;return e("div",{class:"auth-prompt-shell","data-testid":"auth-prompt",children:e("form",{class:"auth-prompt-card",onSubmit:d,children:[e("h1",{children:r("auth.title")}),e("p",{children:r("auth.intro")}),e("label",{children:[e("span",{children:r("auth.tokenLabel")}),e("input",{type:"password",autocomplete:"off",value:a,onInput:c=>n(c.target.value),placeholder:r("auth.tokenPlaceholder"),"aria-invalid":h!==void 0,"aria-describedby":h,autofocus:!0})]}),u&&e("p",{class:"auth-prompt-error",id:h,role:"alert",children:r("auth.empty")}),l&&e("p",{class:"auth-prompt-error",id:h,role:"alert",children:r("auth.invalid")}),e("button",{type:"submit",class:"auth-prompt-submit",children:r("auth.submit")})]})})}const Lo="memesh.onboardingDismissed";function Fa({health:t}){const[s,o]=v(()=>{try{return localStorage.getItem(Lo)==="true"}catch{return!1}}),[a,n]=v(null),[i,m]=v("");if(te(()=>{t&&t.entity_count>0&&o(!0)},[t?.entity_count]),!t||t.entity_count>0||s)return null;function d(){o(!0);try{localStorage.setItem(Lo,"true")}catch{}}async function u(){m(""),n("seed");try{await Z("POST","/v1/demo/seed"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(h){m(He(h))}finally{n(null)}}async function l(){if(confirm(r("onboarding.resetConfirm"))){m(""),n("reset");try{await Z("POST","/v1/demo/reset"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(h){m(He(h))}finally{n(null)}}}return e("div",{role:"region","aria-label":r("onboarding.title"),style:{position:"relative",margin:"12px auto 8px",maxWidth:920,padding:"14px 18px",border:"1px solid rgba(143, 242, 92, 0.28)",borderRadius:"var(--radius)",background:"var(--life-soft)",color:"var(--text-1)"},children:[e("button",{type:"button",onClick:d,"aria-label":r("onboarding.dismiss"),style:{position:"absolute",top:8,right:10,background:"transparent",border:"none",color:"var(--text-3)",fontSize:18,lineHeight:1,cursor:"pointer",padding:4},children:"×"}),e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-0)",marginBottom:6},children:r("onboarding.title")}),e("div",{style:{fontSize:13,lineHeight:1.55,color:"var(--text-1)"},children:r("onboarding.body")}),e("div",{style:{fontSize:11,lineHeight:1.55,color:"var(--text-3)",marginTop:4},children:r("onboarding.llmHint")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:10,marginTop:12,alignItems:"center"},children:[e("button",{type:"button",class:"btn btn-primary",onClick:u,disabled:a!==null,style:{minWidth:160},children:r(a==="seed"?"onboarding.seedingButton":"onboarding.seedButton")}),e("span",{style:{fontSize:12,color:"var(--text-3)"},children:r("onboarding.seedHint")})]}),e("details",{style:{marginTop:10,fontSize:12,color:"var(--text-3)"},children:[e("summary",{style:{cursor:"pointer"},children:r("onboarding.cliReference")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:12,marginTop:8},children:[e("code",{style:{padding:"6px 10px",background:"rgba(0, 0, 0, 0.3)",border:"1px solid rgba(143, 242, 92, 0.20)",borderRadius:"var(--radius-xs)",color:"var(--life)",fontFamily:"var(--mono)",fontSize:12},children:"memesh demo"}),e("span",{style:{fontSize:12,color:"var(--text-3)"},children:r("onboarding.hintDemo")})]}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:12,marginTop:8,alignItems:"center"},children:[e("code",{style:{padding:"6px 10px",background:"rgba(0, 0, 0, 0.3)",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-xs)",color:"var(--text-2)",fontFamily:"var(--mono)",fontSize:12},children:"memesh demo --reset --yes"}),e("button",{type:"button",class:"btn",onClick:l,disabled:a!==null,style:{fontSize:11,padding:"4px 10px"},children:r(a==="reset"?"onboarding.resettingButton":"onboarding.resetButton")}),e("span",{style:{fontSize:12,color:"var(--text-3)"},children:r("onboarding.hintReset")})]})]}),i&&e("div",{role:"alert",style:{marginTop:10,fontSize:12,color:"var(--danger)"},children:i})]})}const To="memesh.doctorBanner.dismissedSig";function zs(t,s,o){const a=r(t,o);return a===t?s:a}function qa(t){return t.code?zs(`doctor.msg.${t.code}.summary`,t.summary,t.params):t.summary}function Ua(t){if(t.fix)return t.code?zs(`doctor.msg.${t.code}.fix`,t.fix,t.params):t.fix}function Wa(t){return zs(`doctor.label.${t.id}`,t.label)}const Ka=new Set(["update-status.no-cache","update-status.stale","update-status.deprecation-unknown","hook-activity.not-wired","shell-cli.not-on-path","skills-manifest.missing-dev","install-channel.unknown","http-probe.no-server","readme-parity.unreadable","readme-parity.drift"]);function Va(t){if(t.status==="fail")return!0;if(t.status!=="warn"||t.code&&Ka.has(t.code)||!t.fix)return!1;const s=t.fix.trim().toLowerCase();return!(!s||s==="no action needed"||s.startsWith("no action"))}function $a(){const[t,s]=v(null),[o,a]=v(()=>{try{return localStorage.getItem(To)??""}catch{return""}});if(te(()=>{let g=!0;const f=()=>{Z("GET","/v1/doctor").then(M=>{g&&s(Array.isArray(M?.checks)?M:null)}).catch(()=>{})};f();const b=()=>f();return window.addEventListener("memesh:data-changed",b),()=>{g=!1,window.removeEventListener("memesh:data-changed",b)}},[]),!t||t.status==="PASS")return null;const n=t.checks.filter(Va);if(n.length===0)return null;const i=n.map(g=>`${g.id}:${g.status}:${g.code??""}:${g.params?.hook??""}`).sort().join("|");if(i===o)return null;function m(){a(i);try{localStorage.setItem(To,i)}catch{}}function d(){const g=n.map(k=>{const y=k.status==="fail"?"❌":"⚠️",L=k.fix?` _Fix: ${k.fix}_`:"";return`- ${y} **${k.label}**: ${k.summary}${L}`}),f=`${r("doctorBanner.preambleForIssue")}
|
|
26
27
|
|
|
27
|
-
${
|
|
28
|
-
`)}`,
|
|
29
|
-
<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);--neutral-soft: rgba(160, 160, 160, .1);--font: "Satoshi", -apple-system, system-ui, sans-serif;--mono: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;--radius: 8px;--radius-sm: 6px;--radius-xs: 4px;--radius-hairline: 2px}*,*: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:var(--radius-hairline)}.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)}.nav-overflow-fade{position:absolute;top:0;right:0;bottom:0;width:32px;pointer-events:none;background:linear-gradient(to right,transparent,var(--bg-0))}.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:var(--bg-0)}.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:var(--bg-0);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:var(--radius-hairline)}.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}}.auth-prompt-shell{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;background:var(--bg-0)}.auth-prompt-card{background:var(--bg-card);border:1px solid var(--border);border-radius:8px;padding:28px 32px;max-width:440px;width:100%;display:flex;flex-direction:column;gap:16px}.auth-prompt-card h1{font-size:16px;margin:0}.auth-prompt-card p{font-size:13px;line-height:1.55;opacity:.85;margin:0}.auth-prompt-card label{display:flex;flex-direction:column;gap:6px;font-size:12px}.auth-prompt-card input{background:var(--bg-input);border:1px solid var(--border);border-radius:4px;padding:10px 12px;color:inherit;font-family:var(--mono);font-size:13px}.auth-prompt-card input:focus{outline:none;border-color:var(--border-focus)}.auth-prompt-error{color:var(--danger);font-size:12px;margin:0}.auth-prompt-submit{background:var(--border-focus);color:var(--bg-0);border:none;border-radius:4px;padding:10px 14px;font-size:13px;cursor:pointer;font-weight:500}.auth-prompt-submit:hover{filter:brightness(1.1)}</style>
|
|
28
|
+
${g.join(`
|
|
29
|
+
`)}`,M=`https://github.com/PCIRCLE-AI/memesh/issues/new?title=${encodeURIComponent("[Bug] memesh doctor reported issues")}&body=${encodeURIComponent(f)}&labels=${encodeURIComponent("feedback,from-dashboard,bug,doctor-warning")}`;window.open(M,"_blank")}const u=t.status==="FAIL",l=u?"var(--danger)":"var(--warning)",h=u?"var(--danger-soft)":"var(--warning-soft)";return e("div",{role:"alert",style:{position:"relative",margin:"12px auto 0",maxWidth:920,padding:"12px 16px",border:`1px solid ${l}`,borderRadius:"var(--radius)",background:h,color:"var(--text-1)"},children:[e("button",{type:"button",onClick:m,"aria-label":r("doctorBanner.dismiss"),style:{position:"absolute",top:6,right:8,background:"transparent",border:"none",color:"var(--text-3)",fontSize:18,lineHeight:1,cursor:"pointer",padding:4},children:"×"}),e("div",{style:{fontSize:13,fontWeight:600,color:l,marginBottom:6},children:r(u?"doctorBanner.failTitle":"doctorBanner.warnTitleSoft")}),e("ul",{style:{margin:"6px 0 10px",paddingLeft:18,fontSize:12,lineHeight:1.5,color:"var(--text-2)"},children:[n.slice(0,3).map(g=>{const f=Ua(g);return e("li",{children:[e("strong",{children:[Wa(g),":"]})," ",qa(g),f&&e(de,{children:[" — ",e("em",{style:{color:"var(--text-3)"},children:f})]})]},g.id)}),n.length>3&&e("li",{style:{color:"var(--text-3)"},children:r("doctorBanner.moreCount",{n:n.length-3})})]}),u&&e("div",{style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap"},children:[e("button",{type:"button",class:"btn",onClick:d,style:{fontSize:12,padding:"4px 12px"},children:r("doctorBanner.getHelp")}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:r("doctorBanner.helpHint")})]})]})}const Po="memesh.insightsBanner.dismissed";function Ga({currentTab:t,onNavigateToInsights:s}){const[o,a]=v(0),[n,i]=v(()=>{try{return sessionStorage.getItem(Po)==="true"}catch{return!1}});if(te(()=>{let u=!0;const l=()=>{Z("GET","/v1/dream/proposals?status=pending").then(c=>{if(!u)return;const g=Array.isArray(c)?c:c?.data??[];a(g.length)}).catch(()=>{})};l();const h=()=>l();return window.addEventListener("memesh:data-changed",h),()=>{u=!1,window.removeEventListener("memesh:data-changed",h)}},[]),t==="Home"||n||o===0)return null;function m(u){u.stopPropagation(),i(!0);try{sessionStorage.setItem(Po,"true")}catch{}}const d=r("banner.pendingInsights",{n:o,s:o===1?"":"s"});return e("div",{role:"button","aria-label":r("banner.viewAll"),onClick:s,onKeyDown:u=>{(u.key==="Enter"||u.key===" ")&&(u.preventDefault(),s())},tabIndex:0,style:{position:"relative",margin:"12px auto 0",maxWidth:920,padding:"10px 40px 10px 16px",border:"1px solid rgba(143, 242, 92, 0.32)",borderRadius:"var(--radius)",background:"var(--life-soft)",color:"var(--text-1)",cursor:"pointer",fontSize:13,lineHeight:1.5,display:"flex",alignItems:"center",justifyContent:"space-between",gap:8},children:[e("span",{style:{flex:1},children:[e("span",{style:{marginRight:6},"aria-hidden":"true",children:"💡"}),d]}),e("button",{type:"button",onClick:m,"aria-label":r("banner.dismiss"),style:{position:"absolute",top:6,right:8,background:"transparent",border:"none",color:"var(--text-3)",fontSize:18,lineHeight:1,cursor:"pointer",padding:4},children:"×"})]})}const rr=["Home","Memories","Project","Graph","Settings"],Ya={Home:"tab.home",Memories:"tab.memories",Project:"tab.project",Graph:"tab.graph",Settings:"tab.settings"},Xa={Insights:"Home",Analytics:"Home",Search:"Memories",Browse:"Memories",Manage:"Memories",Lessons:"Memories"},nr="memesh.tab";function Ja(){const t=s=>s?rr.includes(s)?s:Xa[s]??null:null;try{const s=new URLSearchParams(window.location.search),o=t(s.get("tab"));if(o)return o;const a=t(localStorage.getItem(nr));if(a)return a}catch{}return"Home"}function Qa(){const[t,s]=v(()=>zr()),[o,a]=v(Ja),[n,i]=v(()=>new Set);te(()=>{i(y=>y.has(o)?y:new Set(y).add(o))},[o]);const m=y=>n.has(y)||o===y;te(()=>{try{localStorage.setItem(nr,o)}catch{}try{const y=new URL(window.location.href);y.searchParams.set("tab",o),history.replaceState(null,"",y)}catch{}},[o]);const[d,u]=v(null),[l,h]=v(""),[c,g]=v(!1);te(()=>{const y=()=>g(!0);return window.addEventListener("memesh:auth-required",y),()=>window.removeEventListener("memesh:auth-required",y)},[]);const[f,b]=v(!1),M=ze(()=>{Z("GET","/v1/health").then(y=>{u(y),h(""),g(!1)}).catch(y=>{if(y instanceof Rs){b(ws()!==null),g(!0),h("");return}h(y.message)})},[]);te(()=>{M();const y=()=>M();return window.addEventListener("memesh:data-changed",y),()=>window.removeEventListener("memesh:data-changed",y)},[M]);const k=rr.map(y=>({key:y,label:r(Ya[y])}));return c?e(Ba,{currentToken:ws(),rejected:f,onSubmit:y=>{Fr(y),b(!1),g(!1),M()}}):e("div",{class:"shell",children:[e(Hr,{health:d,error:l}),e("div",{class:"notice-slot",children:[e($a,{}),e(Fa,{health:d}),e(Ga,{currentTab:o,onNavigateToInsights:()=>a("Home")})]}),e(Or,{tabs:k,active:o,onSelect:y=>a(y)}),e("div",{class:"main",children:[e("div",{id:"panel-Home",role:"tabpanel","aria-labelledby":"tab-Home",class:`panel ${o==="Home"?"active":""}`,children:o==="Home"&&e(Tn,{})}),e("div",{id:"panel-Memories",role:"tabpanel","aria-labelledby":"tab-Memories",class:`panel ${o==="Memories"?"active":""}`,children:m("Memories")&&e(Xn,{health:d})}),e("div",{id:"panel-Project",role:"tabpanel","aria-labelledby":"tab-Project",class:`panel ${o==="Project"?"active":""}`,children:m("Project")&&e(ya,{health:d})}),e("div",{id:"panel-Graph",role:"tabpanel","aria-labelledby":"tab-Graph",class:`panel ${o==="Graph"?"active":""}`,children:o==="Graph"&&e(Ia,{})}),e("div",{id:"panel-Settings",role:"tabpanel","aria-labelledby":"tab-Settings",class:`panel ${o==="Settings"?"active":""}`,children:o==="Settings"&&e(Ma,{locale:t,onLocaleChange:s})})]}),e(Oa,{health:d})]})}Ar(e(Qa,{}),document.getElementById("app"));</script>
|
|
30
|
+
<style rel="stylesheet" crossorigin>:root{--bg-0: #09090A;--bg-1: #0F0F11;--bg-2: #151518;--bg-card: rgba(15, 15, 17, .9);--bg-hover: #1B1B1F;--bg-input: #0F0F11;--border: rgba(255, 255, 255, .08);--border-subtle: rgba(255, 255, 255, .04);--border-focus: #8FF25C;--text-0: #EDEDEE;--text-1: #B4B5B7;--text-2: #7E8083;--text-3: #4B4D51;--life: #8FF25C;--life-soft: rgba(143, 242, 92, .08);--life-hover: #A9FF75;--amber: #E4C590;--amber-soft: rgba(228, 197, 144, .08);--success: #8FF25C;--success-soft: rgba(143, 242, 92, .08);--danger: #FF7A6B;--danger-soft: rgba(255, 122, 107, .08);--warning: #FFAB40;--warning-soft: rgba(255, 171, 64, .08);--info: #6FB7D9;--info-soft: rgba(111, 183, 217, .08);--neutral-soft: rgba(160, 160, 160, .1);--font-ui: "Bricolage Grotesque", -apple-system, system-ui, sans-serif;--font-memory: "Newsreader", "Songti TC", Georgia, serif;--mono: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;--radius: 8px;--radius-sm: 6px;--radius-xs: 4px;--radius-hairline: 2px;--t-heartbeat: 3.2s;--t-germinate: .45s;--t-replay-max: 2.5s;--t-pulse: .6s}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}html{font-size:14px}body{font-family:var(--font-ui);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:var(--radius-hairline)}.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(--life);animation:heartbeat var(--t-heartbeat) ease-in-out infinite}@keyframes heartbeat{0%,to{box-shadow:0 0 2px #8ff25c59}50%{box-shadow:0 0 8px 2px #8ff25c80}}@media(prefers-reduced-motion:reduce){.dot-ok{animation:none;box-shadow:0 0 6px #8ff25c66}}.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)}.notice-slot>*~*{display:none}.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-ui);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(--life);border-bottom-color:var(--life)}.nav-overflow-fade{position:absolute;top:0;right:0;bottom:0;width:32px;pointer-events:none;background:linear-gradient(to right,transparent,var(--bg-0))}.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:#8ff25c33;box-shadow:0 4px 20px #8ff25c0a}.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-ui);outline:none;transition:border-color .15s}input:focus,textarea:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--life-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-ui);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(--life);border-color:var(--life);color:var(--bg-0)}.btn-primary:hover{background:var(--life-hover)}.btn-danger{color:var(--danger);border-color:#ff7a6b33;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(--life)}.badge-archived{background:var(--danger-soft);color:var(--danger)}.badge-type{background:var(--life-soft);color:var(--life)}.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:#8ff25c33;box-shadow:0 2px 12px #8ff25c0a}.stat-val{font:700 24px/1.1 var(--mono);color:var(--life);letter-spacing:-.02em}.stat-lbl{font:500 10px/1 var(--font-ui);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-family:var(--font-memory);font-size:15px;line-height:1.6;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(--life)}.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(--life);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,122,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(--life);color:var(--bg-0);border:none;padding:9px 16px;border-radius:9999px;cursor:pointer;font:600 12px var(--font-ui);box-shadow:0 4px 14px #8ff25c40;transition:transform .15s,box-shadow .15s;z-index:50}.fb-btn:hover{transform:translateY(-2px);box-shadow:0 6px 20px #8ff25c59}.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-ui);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-ui);color:var(--text-2);transition:border-color .15s,background .15s}.fb-type:hover{border-color:var(--text-3)}.fb-type.selected{border-color:var(--life);background:var(--life-soft);color:var(--life)}.fb-type input{accent-color:var(--life)}.fb-desc{width:100%;height:80px;padding:9px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);font:400 13px var(--font-ui);resize:vertical;outline:none;margin-bottom:10px;background:var(--bg-0);color:var(--text-0)}.fb-desc:focus{border-color:var(--life)}.fb-desc::placeholder{color:var(--text-3)}.fb-sys-row{display:flex;align-items:center;gap:6px;font:400 12px var(--font-ui);color:var(--text-2);margin-bottom:12px;cursor:pointer}.fb-sys-row input{accent-color:var(--life)}.fb-submit{width:100%;justify-content:center}mark{background:#8ff25c26;color:inherit;padding:1px 2px;border-radius:var(--radius-hairline)}.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}}.auth-prompt-shell{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;background:var(--bg-0)}.auth-prompt-card{background:var(--bg-card);border:1px solid var(--border);border-radius:8px;padding:28px 32px;max-width:440px;width:100%;display:flex;flex-direction:column;gap:16px}.auth-prompt-card h1{font-size:16px;margin:0}.auth-prompt-card p{font-size:13px;line-height:1.55;opacity:.85;margin:0}.auth-prompt-card label{display:flex;flex-direction:column;gap:6px;font-size:12px}.auth-prompt-card input{background:var(--bg-input);border:1px solid var(--border);border-radius:4px;padding:10px 12px;color:inherit;font-family:var(--mono);font-size:13px}.auth-prompt-card input:focus{outline:none;border-color:var(--border-focus)}.auth-prompt-error{color:var(--danger);font-size:12px;margin:0}.auth-prompt-submit{background:var(--border-focus);color:var(--bg-0);border:none;border-radius:4px;padding:10px 14px;font-size:13px;cursor:pointer;font-weight:500}.auth-prompt-submit:hover{filter:brightness(1.1)}</style>
|
|
30
31
|
</head>
|
|
31
32
|
<body>
|
|
32
33
|
<div id="app"></div>
|