@pcircle/memesh 4.3.0 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/README.de.md +35 -12
  4. package/README.es.md +13 -9
  5. package/README.fr.md +33 -10
  6. package/README.ja.md +13 -9
  7. package/README.ko.md +14 -10
  8. package/README.md +18 -11
  9. package/README.pt.md +32 -9
  10. package/README.th.md +18 -8
  11. package/README.vi.md +34 -11
  12. package/README.zh-CN.md +14 -10
  13. package/README.zh-TW.md +14 -10
  14. package/dashboard/dist/index.html +10 -10
  15. package/dist/cli/view-live.js +2 -2
  16. package/dist/cli/view.js +1 -1
  17. package/dist/core/analytics.d.ts +4 -0
  18. package/dist/core/analytics.d.ts.map +1 -1
  19. package/dist/core/analytics.js +8 -8
  20. package/dist/core/analytics.js.map +1 -1
  21. package/dist/core/auto-tagger.d.ts.map +1 -1
  22. package/dist/core/auto-tagger.js.map +1 -1
  23. package/dist/core/config.d.ts +5 -2
  24. package/dist/core/config.d.ts.map +1 -1
  25. package/dist/core/config.js +28 -13
  26. package/dist/core/config.js.map +1 -1
  27. package/dist/core/demo.d.ts +1 -0
  28. package/dist/core/demo.d.ts.map +1 -1
  29. package/dist/core/demo.js +24 -0
  30. package/dist/core/demo.js.map +1 -1
  31. package/dist/core/digest-validator.d.ts.map +1 -1
  32. package/dist/core/digest-validator.js +3 -1
  33. package/dist/core/digest-validator.js.map +1 -1
  34. package/dist/core/doctor.d.ts +2 -0
  35. package/dist/core/doctor.d.ts.map +1 -1
  36. package/dist/core/doctor.js +70 -60
  37. package/dist/core/doctor.js.map +1 -1
  38. package/dist/core/dreamer.d.ts +21 -1
  39. package/dist/core/dreamer.d.ts.map +1 -1
  40. package/dist/core/dreamer.js +86 -8
  41. package/dist/core/dreamer.js.map +1 -1
  42. package/dist/core/embedder.d.ts +1 -4
  43. package/dist/core/embedder.d.ts.map +1 -1
  44. package/dist/core/embedder.js +5 -92
  45. package/dist/core/embedder.js.map +1 -1
  46. package/dist/core/failure-analyzer.d.ts.map +1 -1
  47. package/dist/core/failure-analyzer.js +2 -1
  48. package/dist/core/failure-analyzer.js.map +1 -1
  49. package/dist/core/llm-client.d.ts.map +1 -1
  50. package/dist/core/llm-client.js.map +1 -1
  51. package/dist/core/llm-validator.d.ts +1 -0
  52. package/dist/core/llm-validator.d.ts.map +1 -1
  53. package/dist/core/llm-validator.js +33 -10
  54. package/dist/core/llm-validator.js.map +1 -1
  55. package/dist/core/operations.d.ts.map +1 -1
  56. package/dist/core/operations.js +10 -3
  57. package/dist/core/operations.js.map +1 -1
  58. package/dist/core/output-language.d.ts +6 -0
  59. package/dist/core/output-language.d.ts.map +1 -0
  60. package/dist/core/output-language.js +25 -0
  61. package/dist/core/output-language.js.map +1 -0
  62. package/dist/core/patterns.d.ts +0 -1
  63. package/dist/core/patterns.d.ts.map +1 -1
  64. package/dist/core/patterns.js +1 -5
  65. package/dist/core/patterns.js.map +1 -1
  66. package/dist/core/transcript-extractor.d.ts +89 -0
  67. package/dist/core/transcript-extractor.d.ts.map +1 -0
  68. package/dist/core/transcript-extractor.js +437 -0
  69. package/dist/core/transcript-extractor.js.map +1 -0
  70. package/dist/core/transcript-source.d.ts +21 -0
  71. package/dist/core/transcript-source.d.ts.map +1 -0
  72. package/dist/core/transcript-source.js +142 -0
  73. package/dist/core/transcript-source.js.map +1 -0
  74. package/dist/core/types.d.ts +4 -0
  75. package/dist/core/types.d.ts.map +1 -1
  76. package/dist/core/verifier.js +1 -1
  77. package/dist/core/verifier.js.map +1 -1
  78. package/dist/db.d.ts.map +1 -1
  79. package/dist/db.js +10 -0
  80. package/dist/db.js.map +1 -1
  81. package/dist/skills-manifest.json +11 -11
  82. package/dist/transports/cli/cli.d.ts.map +1 -1
  83. package/dist/transports/cli/cli.js +229 -65
  84. package/dist/transports/cli/cli.js.map +1 -1
  85. package/dist/transports/http/server.d.ts +7 -0
  86. package/dist/transports/http/server.d.ts.map +1 -1
  87. package/dist/transports/http/server.js +145 -50
  88. package/dist/transports/http/server.js.map +1 -1
  89. package/dist/transports/mcp/handlers.d.ts +1 -1
  90. package/dist/transports/mcp/handlers.d.ts.map +1 -1
  91. package/dist/transports/mcp/handlers.js +3 -2
  92. package/dist/transports/mcp/handlers.js.map +1 -1
  93. package/dist/transports/schemas.d.ts.map +1 -1
  94. package/dist/transports/schemas.js.map +1 -1
  95. package/package.json +2 -11
  96. package/scripts/hooks/post-commit.js +8 -2
  97. package/scripts/hooks/pre-compact.js +9 -0
  98. package/scripts/hooks/session-start.js +1 -1
  99. package/skills/agentic-orchestration/SKILL.md +1 -1
  100. package/skills/memesh/SKILL.md +2 -0
@@ -9,24 +9,24 @@
9
9
  <link rel="preconnect" href="https://api.fontshare.com" crossorigin />
10
10
  <link href="https://api.fontshare.com/v2/css?f[]=satoshi@400,500,600,700&display=swap" rel="stylesheet" />
11
11
  <link href="https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet" />
12
- <script type="module" crossorigin>(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))o(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const d of i.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&o(d)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function o(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();var ft,Z,Ts,Pe,Kt,As,Ps,yt,ot,Ve,Rs,Ht,Lt,Tt,ut={},ht=[],on=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,bt=Array.isArray;function Ae(t,s){for(var n in s)t[n]=s[n];return t}function It(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function ln(t,s,n){var o,r,i,d={};for(i in s)i=="key"?o=s[i]:i=="ref"?r=s[i]:d[i]=s[i];if(arguments.length>2&&(d.children=arguments.length>3?ft.call(arguments,2):n),typeof t=="function"&&t.defaultProps!=null)for(i in t.defaultProps)d[i]===void 0&&(d[i]=t.defaultProps[i]);return lt(t,d,o,r,null)}function lt(t,s,n,o,r){var i={type:t,props:s,key:n,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:r??++Ts,__i:-1,__u:0};return r==null&&Z.vnode!=null&&Z.vnode(i),i}function ie(t){return t.children}function ct(t,s){this.props=t,this.context=s}function Ne(t,s){if(s==null)return t.__?Ne(t.__,t.__i+1):null;for(var n;s<t.__k.length;s++)if((n=t.__k[s])!=null&&n.__e!=null)return n.__e;return typeof t.type=="function"?Ne(t):null}function cn(t){if(t.__P&&t.__d){var s=t.__v,n=s.__e,o=[],r=[],i=Ae({},s);i.__v=s.__v+1,Z.vnode&&Z.vnode(i),Bt(t.__P,i,s,t.__n,t.__P.namespaceURI,32&s.__u?[n]:null,o,n??Ne(s),!!(32&s.__u),r),i.__v=s.__v,i.__.__k[i.__i]=i,Hs(o,i,r),s.__e=s.__=null,i.__e!=n&&Es(i)}}function Es(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}),Es(t)}function Yt(t){(!t.__d&&(t.__d=!0)&&Pe.push(t)&&!gt.__r++||Kt!=Z.debounceRendering)&&((Kt=Z.debounceRendering)||As)(gt)}function gt(){try{for(var t,s=1;Pe.length;)Pe.length>s&&Pe.sort(Ps),t=Pe.shift(),s=Pe.length,cn(t)}finally{Pe.length=gt.__r=0}}function Ds(t,s,n,o,r,i,d,c,g,u,m){var l,y,b,h,p,w,v,f=o&&o.__k||ht,_=s.length;for(g=dn(n,s,f,g,_),l=0;l<_;l++)(b=n.__k[l])!=null&&(y=b.__i!=-1&&f[b.__i]||ut,b.__i=l,w=Bt(t,b,y,r,i,d,c,g,u,m),h=b.__e,b.ref&&y.ref!=b.ref&&(y.ref&&zt(y.ref,null,b),m.push(b.ref,b.__c||h,b)),p==null&&h!=null&&(p=h),(v=!!(4&b.__u))||y.__k===b.__k?(g=Fs(b,g,t,v),v&&y.__e&&(y.__e=null)):typeof b.type=="function"&&w!==void 0?g=w:h&&(g=h.nextSibling),b.__u&=-7);return n.__e=p,g}function dn(t,s,n,o,r){var i,d,c,g,u,m=n.length,l=m,y=0;for(t.__k=new Array(r),i=0;i<r;i++)(d=s[i])!=null&&typeof d!="boolean"&&typeof d!="function"?(typeof d=="string"||typeof d=="number"||typeof d=="bigint"||d.constructor==String?d=t.__k[i]=lt(null,d,null,null,null):bt(d)?d=t.__k[i]=lt(ie,{children:d},null,null,null):d.constructor===void 0&&d.__b>0?d=t.__k[i]=lt(d.type,d.props,d.key,d.ref?d.ref:null,d.__v):t.__k[i]=d,g=i+y,d.__=t,d.__b=t.__b+1,c=null,(u=d.__i=un(d,n,g,l))!=-1&&(l--,(c=n[u])&&(c.__u|=2)),c==null||c.__v==null?(u==-1&&(r>m?y--:r<m&&y++),typeof d.type!="function"&&(d.__u|=4)):u!=g&&(u==g-1?y--:u==g+1?y++:(u>g?y--:y++,d.__u|=4))):t.__k[i]=null;if(l)for(i=0;i<m;i++)(c=n[i])!=null&&(2&c.__u)==0&&(c.__e==o&&(o=Ne(c)),Bs(c,c));return o}function Fs(t,s,n,o){var r,i;if(typeof t.type=="function"){for(r=t.__k,i=0;r&&i<r.length;i++)r[i]&&(r[i].__=t,s=Fs(r[i],s,n,o));return s}t.__e!=s&&(o&&(s&&t.type&&!s.parentNode&&(s=Ne(t)),n.insertBefore(t.__e,s||null)),s=t.__e);do s=s&&s.nextSibling;while(s!=null&&s.nodeType==8);return s}function un(t,s,n,o){var r,i,d,c=t.key,g=t.type,u=s[n],m=u!=null&&(2&u.__u)==0;if(u===null&&c==null||m&&c==u.key&&g==u.type)return n;if(o>(m?1:0)){for(r=n-1,i=n+1;r>=0||i<s.length;)if((u=s[d=r>=0?r--:i++])!=null&&(2&u.__u)==0&&c==u.key&&g==u.type)return d}return-1}function Xt(t,s,n){s[0]=="-"?t.setProperty(s,n??""):t[s]=n==null?"":typeof n!="number"||on.test(s)?n:n+"px"}function et(t,s,n,o,r){var i,d;e:if(s=="style")if(typeof n=="string")t.style.cssText=n;else{if(typeof o=="string"&&(t.style.cssText=o=""),o)for(s in o)n&&s in n||Xt(t.style,s,"");if(n)for(s in n)o&&n[s]==o[s]||Xt(t.style,s,n[s])}else if(s[0]=="o"&&s[1]=="n")i=s!=(s=s.replace(Rs,"$1")),d=s.toLowerCase(),s=d in t||s=="onFocusOut"||s=="onFocusIn"?d.slice(2):s.slice(2),t.l||(t.l={}),t.l[s+i]=n,n?o?n[Ve]=o[Ve]:(n[Ve]=Ht,t.addEventListener(s,i?Tt:Lt,i)):t.removeEventListener(s,i?Tt:Lt,i);else{if(r=="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]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&s[4]!="-"?t.removeAttribute(s):t.setAttribute(s,s=="popover"&&n==1?"":n))}}function Zt(t){return function(s){if(this.l){var n=this.l[s.type+t];if(s[ot]==null)s[ot]=Ht++;else if(s[ot]<n[Ve])return;return n(Z.event?Z.event(s):s)}}}function Bt(t,s,n,o,r,i,d,c,g,u){var m,l,y,b,h,p,w,v,f,_,A,B,j,Q,q,ee=s.type;if(s.constructor!==void 0)return null;128&n.__u&&(g=!!(32&n.__u),i=[c=s.__e=n.__e]),(m=Z.__b)&&m(s);e:if(typeof ee=="function")try{if(v=s.props,f=ee.prototype&&ee.prototype.render,_=(m=ee.contextType)&&o[m.__c],A=m?_?_.props.value:m.__:o,n.__c?w=(l=s.__c=n.__c).__=l.__E:(f?s.__c=l=new ee(v,A):(s.__c=l=new ct(v,A),l.constructor=ee,l.render=gn),_&&_.sub(l),l.state||(l.state={}),l.__n=o,y=l.__d=!0,l.__h=[],l._sb=[]),f&&l.__s==null&&(l.__s=l.state),f&&ee.getDerivedStateFromProps!=null&&(l.__s==l.state&&(l.__s=Ae({},l.__s)),Ae(l.__s,ee.getDerivedStateFromProps(v,l.__s))),b=l.props,h=l.state,l.__v=s,y)f&&ee.getDerivedStateFromProps==null&&l.componentWillMount!=null&&l.componentWillMount(),f&&l.componentDidMount!=null&&l.__h.push(l.componentDidMount);else{if(f&&ee.getDerivedStateFromProps==null&&v!==b&&l.componentWillReceiveProps!=null&&l.componentWillReceiveProps(v,A),s.__v==n.__v||!l.__e&&l.shouldComponentUpdate!=null&&l.shouldComponentUpdate(v,l.__s,A)===!1){s.__v!=n.__v&&(l.props=v,l.state=l.__s,l.__d=!1),s.__e=n.__e,s.__k=n.__k,s.__k.some(function(ne){ne&&(ne.__=s)}),ht.push.apply(l.__h,l._sb),l._sb=[],l.__h.length&&d.push(l);break e}l.componentWillUpdate!=null&&l.componentWillUpdate(v,l.__s,A),f&&l.componentDidUpdate!=null&&l.__h.push(function(){l.componentDidUpdate(b,h,p)})}if(l.context=A,l.props=v,l.__P=t,l.__e=!1,B=Z.__r,j=0,f)l.state=l.__s,l.__d=!1,B&&B(s),m=l.render(l.props,l.state,l.context),ht.push.apply(l.__h,l._sb),l._sb=[];else do l.__d=!1,B&&B(s),m=l.render(l.props,l.state,l.context),l.state=l.__s;while(l.__d&&++j<25);l.state=l.__s,l.getChildContext!=null&&(o=Ae(Ae({},o),l.getChildContext())),f&&!y&&l.getSnapshotBeforeUpdate!=null&&(p=l.getSnapshotBeforeUpdate(b,h)),Q=m!=null&&m.type===ie&&m.key==null?Is(m.props.children):m,c=Ds(t,bt(Q)?Q:[Q],s,n,o,r,i,d,c,g,u),l.base=s.__e,s.__u&=-161,l.__h.length&&d.push(l),w&&(l.__E=l.__=null)}catch(ne){if(s.__v=null,g||i!=null)if(ne.then){for(s.__u|=g?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;i[i.indexOf(c)]=null,s.__e=c}else{for(q=i.length;q--;)It(i[q]);At(s)}else s.__e=n.__e,s.__k=n.__k,ne.then||At(s);Z.__e(ne,s,n)}else i==null&&s.__v==n.__v?(s.__k=n.__k,s.__e=n.__e):c=s.__e=hn(n.__e,s,n,o,r,i,d,g,u);return(m=Z.diffed)&&m(s),128&s.__u?void 0:c}function At(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(At))}function Hs(t,s,n){for(var o=0;o<n.length;o++)zt(n[o],n[++o],n[++o]);Z.__c&&Z.__c(s,t),t.some(function(r){try{t=r.__h,r.__h=[],t.some(function(i){i.call(r)})}catch(i){Z.__e(i,r.__v)}})}function Is(t){return typeof t!="object"||t==null||t.__b>0?t:bt(t)?t.map(Is):Ae({},t)}function hn(t,s,n,o,r,i,d,c,g){var u,m,l,y,b,h,p,w=n.props||ut,v=s.props,f=s.type;if(f=="svg"?r="http://www.w3.org/2000/svg":f=="math"?r="http://www.w3.org/1998/Math/MathML":r||(r="http://www.w3.org/1999/xhtml"),i!=null){for(u=0;u<i.length;u++)if((b=i[u])&&"setAttribute"in b==!!f&&(f?b.localName==f:b.nodeType==3)){t=b,i[u]=null;break}}if(t==null){if(f==null)return document.createTextNode(v);t=document.createElementNS(r,f,v.is&&v),c&&(Z.__m&&Z.__m(s,i),c=!1),i=null}if(f==null)w===v||c&&t.data==v||(t.data=v);else{if(i=i&&ft.call(t.childNodes),!c&&i!=null)for(w={},u=0;u<t.attributes.length;u++)w[(b=t.attributes[u]).name]=b.value;for(u in w)b=w[u],u=="dangerouslySetInnerHTML"?l=b:u=="children"||u in v||u=="value"&&"defaultValue"in v||u=="checked"&&"defaultChecked"in v||et(t,u,null,b,r);for(u in v)b=v[u],u=="children"?y=b:u=="dangerouslySetInnerHTML"?m=b:u=="value"?h=b:u=="checked"?p=b:c&&typeof b!="function"||w[u]===b||et(t,u,b,w[u],r);if(m)c||l&&(m.__html==l.__html||m.__html==t.innerHTML)||(t.innerHTML=m.__html),s.__k=[];else if(l&&(t.innerHTML=""),Ds(s.type=="template"?t.content:t,bt(y)?y:[y],s,n,o,f=="foreignObject"?"http://www.w3.org/1999/xhtml":r,i,d,i?i[0]:n.__k&&Ne(n,0),c,g),i!=null)for(u=i.length;u--;)It(i[u]);c||(u="value",f=="progress"&&h==null?t.removeAttribute("value"):h!=null&&(h!==t[u]||f=="progress"&&!h||f=="option"&&h!=w[u])&&et(t,u,h,w[u],r),u="checked",p!=null&&p!=t[u]&&et(t,u,p,w[u],r))}return t}function zt(t,s,n){try{if(typeof t=="function"){var o=typeof t.__u=="function";o&&t.__u(),o&&s==null||(t.__u=t(s))}else t.current=s}catch(r){Z.__e(r,n)}}function Bs(t,s,n){var o,r;if(Z.unmount&&Z.unmount(t),(o=t.ref)&&(o.current&&o.current!=t.__e||zt(o,null,s)),(o=t.__c)!=null){if(o.componentWillUnmount)try{o.componentWillUnmount()}catch(i){Z.__e(i,s)}o.base=o.__P=null}if(o=t.__k)for(r=0;r<o.length;r++)o[r]&&Bs(o[r],s,n||typeof t.type!="function");n||It(t.__e),t.__c=t.__=t.__e=void 0}function gn(t,s,n){return this.constructor(t,n)}function mn(t,s,n){var o,r,i,d;s==document&&(s=document.documentElement),Z.__&&Z.__(t,s),r=(o=!1)?null:s.__k,i=[],d=[],Bt(s,t=s.__k=ln(ie,null,[t]),r||ut,ut,s.namespaceURI,r?null:s.firstChild?ft.call(s.childNodes):null,i,r?r.__e:s.firstChild,o,d),Hs(i,t,d)}ft=ht.slice,Z={__e:function(t,s,n,o){for(var r,i,d;s=s.__;)if((r=s.__c)&&!r.__)try{if((i=r.constructor)&&i.getDerivedStateFromError!=null&&(r.setState(i.getDerivedStateFromError(t)),d=r.__d),r.componentDidCatch!=null&&(r.componentDidCatch(t,o||{}),d=r.__d),d)return r.__E=r}catch(c){t=c}throw t}},Ts=0,ct.prototype.setState=function(t,s){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=Ae({},this.state),typeof t=="function"&&(t=t(Ae({},n),this.props)),t&&Ae(n,t),t!=null&&this.__v&&(s&&this._sb.push(s),Yt(this))},ct.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),Yt(this))},ct.prototype.render=ie,Pe=[],As=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ps=function(t,s){return t.__v.__b-s.__v.__b},gt.__r=0,yt=Math.random().toString(8),ot="__d"+yt,Ve="__a"+yt,Rs=/(PointerCapture)$|Capture$/i,Ht=0,Lt=Zt(!1),Tt=Zt(!0);var pn=0;function e(t,s,n,o,r,i){s||(s={});var d,c,g=s;if("ref"in g)for(c in g={},s)c=="ref"?d=s[c]:g[c]=s[c];var u={type:t,props:g,key:n,ref:d,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--pn,__i:-1,__u:0,__source:r,__self:i};if(typeof t=="function"&&(d=t.defaultProps))for(c in d)g[c]===void 0&&(g[c]=d[c]);return Z.vnode&&Z.vnode(u),u}var $e,oe,vt,Qt,Ge=0,zs=[],le=Z,Jt=le.__b,es=le.__r,ts=le.diffed,ss=le.__c,ns=le.unmount,as=le.__;function jt(t,s){le.__h&&le.__h(oe,t,Ge||s),Ge=0;var n=oe.__H||(oe.__H={__:[],__h:[]});return t>=n.__.length&&n.__.push({}),n.__[t]}function k(t){return Ge=1,fn(Os,t)}function fn(t,s,n){var o=jt($e++,2);if(o.t=t,!o.__c&&(o.__=[Os(void 0,s),function(c){var g=o.__N?o.__N[0]:o.__[0],u=o.t(g,c);g!==u&&(o.__N=[u,o.__[1]],o.__c.setState({}))}],o.__c=oe,!oe.__f)){var r=function(c,g,u){if(!o.__c.__H)return!0;var m=o.__c.__H.__.filter(function(y){return y.__c});if(m.every(function(y){return!y.__N}))return!i||i.call(this,c,g,u);var l=o.__c.props!==c;return m.some(function(y){if(y.__N){var b=y.__[0];y.__=y.__N,y.__N=void 0,b!==y.__[0]&&(l=!0)}}),i&&i.call(this,c,g,u)||l};oe.__f=!0;var i=oe.shouldComponentUpdate,d=oe.componentWillUpdate;oe.componentWillUpdate=function(c,g,u){if(this.__e){var m=i;i=void 0,r(c,g,u),i=m}d&&d.call(this,c,g,u)},oe.shouldComponentUpdate=r}return o.__N||o.__}function K(t,s){var n=jt($e++,3);!le.__s&&js(n.__H,s)&&(n.__=t,n.u=s,oe.__H.__h.push(n))}function re(t){return Ge=5,Me(function(){return{current:t}},[])}function Me(t,s){var n=jt($e++,7);return js(n.__H,s)&&(n.__=t(),n.__H=s,n.__h=t),n.__}function ye(t,s){return Ge=8,Me(function(){return t},s)}function bn(){for(var t;t=zs.shift();){var s=t.__H;if(t.__P&&s)try{s.__h.some(dt),s.__h.some(Pt),s.__h=[]}catch(n){s.__h=[],le.__e(n,t.__v)}}}le.__b=function(t){oe=null,Jt&&Jt(t)},le.__=function(t,s){t&&s.__k&&s.__k.__m&&(t.__m=s.__k.__m),as&&as(t,s)},le.__r=function(t){es&&es(t),$e=0;var s=(oe=t.__c).__H;s&&(vt===oe?(s.__h=[],oe.__h=[],s.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(s.__h.some(dt),s.__h.some(Pt),s.__h=[],$e=0)),vt=oe},le.diffed=function(t){ts&&ts(t);var s=t.__c;s&&s.__H&&(s.__H.__h.length&&(zs.push(s)!==1&&Qt===le.requestAnimationFrame||((Qt=le.requestAnimationFrame)||yn)(bn)),s.__H.__.some(function(n){n.u&&(n.__H=n.u),n.u=void 0})),vt=oe=null},le.__c=function(t,s){s.some(function(n){try{n.__h.some(dt),n.__h=n.__h.filter(function(o){return!o.__||Pt(o)})}catch(o){s.some(function(r){r.__h&&(r.__h=[])}),s=[],le.__e(o,n.__v)}}),ss&&ss(t,s)},le.unmount=function(t){ns&&ns(t);var s,n=t.__c;n&&n.__H&&(n.__H.__.some(function(o){try{dt(o)}catch(r){s=r}}),n.__H=void 0,s&&le.__e(s,n.__v))};var rs=typeof requestAnimationFrame=="function";function yn(t){var s,n=function(){clearTimeout(o),rs&&cancelAnimationFrame(s),setTimeout(t)},o=setTimeout(n,35);rs&&(s=requestAnimationFrame(n))}function dt(t){var s=oe,n=t.__c;typeof n=="function"&&(t.__c=void 0,n()),oe=s}function Pt(t){var s=oe;t.__c=t.__(),oe=s}function js(t,s){return!t||t.length!==s.length||s.some(function(n,o){return n!==t[o]})}function Os(t,s){return typeof s=="function"?s(t):s}const mt={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.ai","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 LLM activity recorded in this window. Smart-Mode flows write rows automatically once dream / auto-tagger / failure-analyzer 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 entity name, observation content, or tags. Supports FTS5 full-text + vector similarity.","search.facts":"facts","browse.title":"All Memories","browse.manage":"Manage Memories","browse.active":"active","browse.archived":"archived","browse.filter":"Filter by content, type, or tag…","browse.refresh":"Refresh","browse.noMemories":"No memories yet","browse.noMatch":"No memories matching","browse.prev":"← Prev","browse.next":"Next →","browse.archive":"Archive","browse.restore":"Restore","browse.confirmArchive":"Archive this memory?","browse.moreArchived":"more archived memories","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 (95.40% R@5 on LongMemEval-S), 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.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:","doctor.capabilities.summary":"LLM/embedding configuration detected","doctor.capabilities.fix":'Configure via "memesh config set llm.provider <provider>"',"doctor.config.summary":"Config file status","doctor.config.fix":'Fix or remove the config file, then run "memesh config list"',"doctor.dashboard.summary":"Dashboard artifact exists","doctor.dashboard.fix":'Run "npm run build:dashboard" to rebuild the dashboard',"doctor.database.summary":"Database accessibility status","doctor.database.fix":'Check database permissions, path, or run "memesh doctor" for detailed diagnosis',"doctor.hook-activity.summary":"No recent memesh-attributed activity (last 24h)","doctor.hook-activity.fix":"Open a Claude Code session that uses ≥3 tools and ends naturally (not user_interrupt), or commit something. Then reopen the dashboard.","doctor.hook-scripts.summary":"Hook script files verification","doctor.hook-scripts.fix":"Reinstall MeMesh or restore missing hook files from package","doctor.hook-wiring.summary":"Hooks integration status in Claude Code","doctor.hook-wiring.fix":'Run "memesh install-hooks" to wire hooks into Claude Code settings',"doctor.hooks-config.summary":"Hooks configuration file status","doctor.hooks-config.fix":"Reinstall MeMesh or restore .claude-plugin/hooks.json","doctor.http-probe.summary":"HTTP server availability check","doctor.http-probe.fix":"Check if port is available or database is accessible","doctor.install_id.summary":"Anonymous install ID status","doctor.install_id.fix":'Run "memesh" once to generate install ID',"doctor.mcp-config.summary":"MCP server configuration status","doctor.mcp-config.fix":"Restore .mcp.json from package or reinstall MeMesh","doctor.skills-manifest.summary":"Skills directory structure validation","doctor.skills-manifest.fix":"Reinstall MeMesh or restore .claude-plugin/skills directory","doctor.update_status.summary":"Update available: {version}","doctor.update_status.fix":'Run "memesh update" to upgrade',"doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","doctor.vector_index.summary":"Search index needs rebuilding","doctor.vector_index.fix":'Run "memesh reindex" to restore full search',"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":"KG orphan rate","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","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<br/>(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 (95.40% R@5). 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","ageMatrix.bucket.week":"This week","ageMatrix.bucket.month":"This month","ageMatrix.bucket.quarter":"This quarter","ageMatrix.bucket.older":"Older","ageMatrix.type.lesson_learned":"Lesson","ageMatrix.type.lesson":"Lesson","ageMatrix.type.mistake":"Mistake","ageMatrix.type.decision":"Decision","ageMatrix.type.architecture_decision":"Arch decision","ageMatrix.type.pattern":"Pattern","ageMatrix.type.technical_pattern":"Tech pattern","ageMatrix.type.best_practice":"Best practice","ageMatrix.type.bug_fix":"Bug fix","ageMatrix.type.workflow_checkpoint":"Workflow milestone","ageMatrix.type.process":"Process","ageMatrix.type.architecture":"Architecture","ageMatrix.type.feature":"Feature","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.","settings.agenticLabel":"Enable agentic orchestration (experimental)","settings.agenticHint":"Surfaces background-agent nudges on Bash and shows the verifiability banner. Opt-in only.","errors.timeout":"Request timed out"},"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.ai","header.connected":"已連線","header.disconnected":"已斷線","header.connecting":"連線中…","header.memories":"筆記憶","tab.insights":"洞察","telemetry.title":"LLM activity","telemetry.lastNDays":"last {n}d","telemetry.loading":"載入中…","telemetry.empty":"這段期間沒有 LLM 活動紀錄。dream / auto-tagger / failure-analyzer 執行後,Smart-Mode 流程會自動寫入資料。","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":"搜尋","insights.title":"memesh 為你做了什麼","insights.subtitle":"自動產生的週報整理與發現的模式,等你 review","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":"Configure an LLM provider in Settings to enable weekly recaps and pattern detection.","insights.emptyOther":"沒有資料。","insights.sources":"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":"來源 entities","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":"可依實體名稱、觀察內容或標籤搜尋。支援 FTS5 全文檢索 + 向量相似度搜尋。","search.facts":"筆事實","browse.title":"所有記憶","browse.manage":"管理記憶","browse.active":"使用中","browse.archived":"已封存","browse.filter":"依內容、類型或標籤篩選…","browse.refresh":"重新整理","browse.noMemories":"尚無記憶","browse.noMatch":"找不到符合的記憶:","browse.prev":"← 上一頁","browse.next":"下一頁 →","browse.archive":"封存","browse.restore":"還原","browse.confirmArchive":"確定要封存此記憶?","browse.moreArchived":"筆已封存的記憶","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 關鍵字搜尋(LongMemEval-S 上 95.40% R@5)、手動 remember/recall、儀表板、hook 自動捕捉 session","settings.llmOptional.smartLabel":"有 LLM(智慧模式)","settings.llmOptional.smartFeatures":"自動從 session 失敗萃取 lesson_learned、新 entity 自動標籤、週報整理 + 模式發現","settings.apiKey":"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 在我的安裝上回報以下狀況:","doctor.capabilities.summary":"LLM/嵌入配置已偵測","doctor.capabilities.fix":'透過 "memesh config set llm.provider <provider>" 配置',"doctor.config.summary":"配置檔案狀態","doctor.config.fix":'修復或移除配置檔案,然後執行 "memesh config list"',"doctor.dashboard.summary":"儀表板檔案存在","doctor.dashboard.fix":'執行 "npm run build:dashboard" 重建儀表板',"doctor.database.summary":"資料庫存取狀態","doctor.database.fix":'檢查資料庫權限、路徑,或執行 "memesh doctor" 取得詳細診斷',"doctor.hook-activity.summary":"過去 24 小時內未偵測到 memesh 活動","doctor.hook-activity.fix":"開啟一個使用工具的 Claude Code session,或提交一次後重新打開儀表板","doctor.hook-scripts.summary":"Hook 腳本檔案驗證","doctor.hook-scripts.fix":"重新安裝 MeMesh 或從套件還原缺失的 hook 檔案","doctor.hook-wiring.summary":"Claude Code 中的 Hooks 整合狀態","doctor.hook-wiring.fix":'執行 "memesh install-hooks" 將 hooks 接線至 Claude Code 設定',"doctor.hooks-config.summary":"Hooks 配置檔案狀態","doctor.hooks-config.fix":"重新安裝 MeMesh 或還原 .claude-plugin/hooks.json","doctor.http-probe.summary":"HTTP 伺服器可用性檢查","doctor.http-probe.fix":"檢查連接埠是否可用或資料庫是否可存取","doctor.install_id.summary":"匿名安裝 ID 狀態","doctor.install_id.fix":'執行一次 "memesh" 以產生安裝 ID',"doctor.mcp-config.summary":"MCP 伺服器配置狀態","doctor.mcp-config.fix":"從套件還原 .mcp.json 或重新安裝 MeMesh","doctor.skills-manifest.summary":"Skills 目錄結構驗證","doctor.skills-manifest.fix":"重新安裝 MeMesh 或還原 .claude-plugin/skills 目錄","doctor.update_status.summary":"有新版本:{version}","doctor.update_status.fix":'執行 "memesh update" 進行更新',"doctor.update_status.prerelease":"正在使用預發布版本({current}),npm 最新版為 {latest}","doctor.vector_index.summary":"搜尋索引需要重建","doctor.vector_index.fix":'執行 "memesh reindex" 即可修復',"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":"KG 孤立率","pm.relationsTotal":"關聯總數","pm.stalePlans":"{count} 個計畫超過 30 天未回顧","common.loading":"載入中…","common.noData":"沒有資料","errors.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":"顯示有效知識記憶<br/>(排除 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 運作(95.40% R@5)。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":"關閉","ageMatrix.bucket.week":"本週","ageMatrix.bucket.month":"本月","ageMatrix.bucket.quarter":"本季","ageMatrix.bucket.older":"更早","ageMatrix.type.lesson_learned":"教訓","ageMatrix.type.lesson":"教訓","ageMatrix.type.mistake":"錯誤","ageMatrix.type.decision":"決策","ageMatrix.type.architecture_decision":"架構決策","ageMatrix.type.pattern":"模式","ageMatrix.type.technical_pattern":"技術模式","ageMatrix.type.best_practice":"最佳實踐","ageMatrix.type.bug_fix":"問題修復","ageMatrix.type.workflow_checkpoint":"流程里程碑","ageMatrix.type.process":"流程","ageMatrix.type.architecture":"架構","ageMatrix.type.feature":"功能","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 環境變數優先。","settings.agenticLabel":"啟用 agentic orchestration(實驗性)","settings.agenticHint":"在 Bash 操作時顯示背景代理建議,並啟用可驗證性提示橫幅。Opt-in。","errors.timeout":"請求逾時"},"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.ai","header.connected":"已连接","header.disconnected":"已断开","header.connecting":"连接中…","header.memories":"条记忆","tab.insights":"洞察","telemetry.title":"LLM activity","telemetry.lastNDays":"last {n}d","telemetry.loading":"加载中…","telemetry.empty":"此时间段内没有 LLM 活动记录。dream / auto-tagger / failure-analyzer 运行后,Smart-Mode 流程会自动写入数据。","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":"搜索","insights.title":"memesh 为你做了什么","insights.subtitle":"自动生成的周报整理与发现的模式,等你 review","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":"Configure an LLM provider in Settings to enable weekly recaps and pattern detection.","insights.emptyOther":"没有数据。","insights.sources":"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":"来源 entities","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":"可按实体名称、观察内容或标签搜索。支持 FTS5 全文检索 + 向量相似度搜索。","search.facts":"条事实","browse.title":"所有记忆","browse.manage":"管理记忆","browse.active":"活跃","browse.archived":"已归档","browse.filter":"按内容、类型或标签筛选…","browse.refresh":"刷新","browse.noMemories":"暂无记忆","browse.noMatch":"没有匹配的记忆:","browse.prev":"← 上一页","browse.next":"下一页 →","browse.archive":"归档","browse.restore":"恢复","browse.confirmArchive":"确定要归档此记忆?","browse.moreArchived":"条已归档记忆","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 关键字搜索(LongMemEval-S 上 95.40% R@5)、手动 remember/recall、仪表板、hook 自动捕捉 session","settings.llmOptional.smartLabel":"有 LLM(智能模式)","settings.llmOptional.smartFeatures":"自动从 session 失败萃取 lesson_learned、新 entity 自动标签、周报整理 + 模式发现","settings.apiKey":"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 在我的安装上报告以下情况:","doctor.capabilities.summary":"LLM/embedding configuration detected","doctor.capabilities.fix":'Configure via "memesh config set llm.provider <provider>"',"doctor.config.summary":"Config file status","doctor.config.fix":'Fix or remove the config file, then run "memesh config list"',"doctor.dashboard.summary":"Dashboard artifact exists","doctor.dashboard.fix":'Run "npm run build:dashboard" to rebuild the dashboard',"doctor.database.summary":"Database accessibility status","doctor.database.fix":'Check database permissions, path, or run "memesh doctor" for detailed diagnosis',"doctor.hook-activity.summary":"过去 24 小时内未检测到 memesh 相关活动","doctor.hook-activity.fix":"开启一个使用 ≥3 个工具的 Claude Code session,或提交一次,然后重新打开仪表板","doctor.hook-scripts.summary":"Hook script files verification","doctor.hook-scripts.fix":"Reinstall MeMesh or restore missing hook files from package","doctor.hook-wiring.summary":"Hooks integration status in Claude Code","doctor.hook-wiring.fix":'Run "memesh install-hooks" to wire hooks into Claude Code settings',"doctor.hooks-config.summary":"Hooks configuration file status","doctor.hooks-config.fix":"Reinstall MeMesh or restore .claude-plugin/hooks.json","doctor.http-probe.summary":"HTTP server availability check","doctor.http-probe.fix":"Check if port is available or database is accessible","doctor.install_id.summary":"Anonymous install ID status","doctor.install_id.fix":'Run "memesh" once to generate install ID',"doctor.mcp-config.summary":"MCP server configuration status","doctor.mcp-config.fix":"Restore .mcp.json from package or reinstall MeMesh","doctor.skills-manifest.summary":"Skills directory structure validation","doctor.skills-manifest.fix":"Reinstall MeMesh or restore .claude-plugin/skills directory","doctor.update_status.summary":"Update available: {version}","doctor.update_status.fix":'Run "memesh update" to upgrade',"doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","doctor.vector_index.summary":"Search index needs rebuilding","doctor.vector_index.fix":'Run "memesh reindex" to restore full search',"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":"KG 孤立率","pm.relationsTotal":"关系总数","pm.stalePlans":"{count} 个计划超过 30 天未回顾","common.loading":"加载中…","common.noData":"没有数据","errors.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":"显示有效知识记忆<br/>(排除 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 运作(95.40% R@5)。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":"关闭","ageMatrix.bucket.week":"本周","ageMatrix.bucket.month":"本月","ageMatrix.bucket.quarter":"本季","ageMatrix.bucket.older":"更早","ageMatrix.type.lesson_learned":"教训","ageMatrix.type.lesson":"教训","ageMatrix.type.mistake":"错误","ageMatrix.type.decision":"决策","ageMatrix.type.architecture_decision":"架构决策","ageMatrix.type.pattern":"模式","ageMatrix.type.technical_pattern":"技术模式","ageMatrix.type.best_practice":"最佳实践","ageMatrix.type.bug_fix":"问题修复","ageMatrix.type.workflow_checkpoint":"流程里程碑","ageMatrix.type.process":"流程","ageMatrix.type.architecture":"架构","ageMatrix.type.feature":"功能","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 环境变量优先。","settings.agenticLabel":"启用 agentic orchestration(实验性)","settings.agenticHint":"在 Bash 操作时显示后台代理建议,并启用可验证性提示横幅。Opt-in。","errors.timeout":"请求超时"},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.ai","header.connected":"接続中","header.disconnected":"切断","header.connecting":"接続しています…","header.memories":"件のメモリ","tab.insights":"Insights","telemetry.title":"LLM アクティビティ","telemetry.lastNDays":"直近 {n} 日","telemetry.loading":"読み込み中…","telemetry.empty":"この期間に LLM アクティビティの記録はありません。dream / auto-tagger / failure-analyzer が動作すると、Smart-Mode フローが自動的に行を書き込みます。","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":"エンティティ名、観察内容、タグで検索できます。FTS5全文検索 + ベクトル類似度に対応しています。","search.facts":"件の事実","browse.title":"すべてのメモリ","browse.manage":"メモリを管理","browse.active":"アクティブ","browse.archived":"アーカイブ済み","browse.filter":"内容、タイプ、タグで絞り込み…","browse.refresh":"更新","browse.noMemories":"メモリがありません","browse.noMatch":"一致するメモリがありません:","browse.prev":"← 前へ","browse.next":"次へ →","browse.archive":"アーカイブ","browse.restore":"復元","browse.confirmArchive":"このメモリをアーカイブしますか?","browse.moreArchived":"件のアーカイブ済みメモリ","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 キーワード検索(LongMemEval-S で 95.40% R@5)、手動 remember/recall、ダッシュボード、フックによるセッションキャプチャ","settings.llmOptional.smartLabel":"LLM あり(スマートモード)","settings.llmOptional.smartFeatures":"セッション失敗から lesson_learned を自動抽出、新規エンティティの自動タグ付け、週次まとめとパターン検出","settings.apiKey":"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 が私のインストールで以下を検出しました:","doctor.capabilities.summary":"LLM/embedding configuration detected","doctor.capabilities.fix":'Configure via "memesh config set llm.provider <provider>"',"doctor.config.summary":"Config file status","doctor.config.fix":'Fix or remove the config file, then run "memesh config list"',"doctor.dashboard.summary":"Dashboard artifact exists","doctor.dashboard.fix":'Run "npm run build:dashboard" to rebuild the dashboard',"doctor.database.summary":"Database accessibility status","doctor.database.fix":'Check database permissions, path, or run "memesh doctor" for detailed diagnosis',"doctor.hook-activity.summary":"過去24時間にmemesh関連のアクティビティはありません","doctor.hook-activity.fix":"3つ以上のツールを使うClaude Codeセッションを開く、もしくはコミットを行ってから、ダッシュボードを再度開いてください","doctor.hook-scripts.summary":"Hook script files verification","doctor.hook-scripts.fix":"Reinstall MeMesh or restore missing hook files from package","doctor.hook-wiring.summary":"Hooks integration status in Claude Code","doctor.hook-wiring.fix":'Run "memesh install-hooks" to wire hooks into Claude Code settings',"doctor.hooks-config.summary":"Hooks configuration file status","doctor.hooks-config.fix":"Reinstall MeMesh or restore .claude-plugin/hooks.json","doctor.http-probe.summary":"HTTP server availability check","doctor.http-probe.fix":"Check if port is available or database is accessible","doctor.install_id.summary":"Anonymous install ID status","doctor.install_id.fix":'Run "memesh" once to generate install ID',"doctor.mcp-config.summary":"MCP server configuration status","doctor.mcp-config.fix":"Restore .mcp.json from package or reinstall MeMesh","doctor.skills-manifest.summary":"Skills directory structure validation","doctor.skills-manifest.fix":"Reinstall MeMesh or restore .claude-plugin/skills directory","doctor.update_status.summary":"Update available: {version}","doctor.update_status.fix":'Run "memesh update" to upgrade',"doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","doctor.vector_index.summary":"Search index needs rebuilding","doctor.vector_index.fix":'Run "memesh reindex" to restore full search',"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":"KG 孤立率","pm.relationsTotal":"リレーション総数","pm.stalePlans":"30日以上見直されていないプランが {count} 件","common.loading":"読み込み中…","common.noData":"データがありません","errors.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":"有効な知識メモリ<br/>(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 のみで動作します(95.40% R@5)。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":"閉じる","ageMatrix.bucket.week":"今週","ageMatrix.bucket.month":"今月","ageMatrix.bucket.quarter":"今四半期","ageMatrix.bucket.older":"それ以前","ageMatrix.type.lesson_learned":"教訓","ageMatrix.type.lesson":"教訓","ageMatrix.type.mistake":"ミス","ageMatrix.type.decision":"決定","ageMatrix.type.architecture_decision":"アーキ決定","ageMatrix.type.pattern":"パターン","ageMatrix.type.technical_pattern":"技術パターン","ageMatrix.type.best_practice":"ベストプラクティス","ageMatrix.type.bug_fix":"バグ修正","ageMatrix.type.workflow_checkpoint":"ワークフロー","ageMatrix.type.process":"プロセス","ageMatrix.type.architecture":"アーキテクチャ","ageMatrix.type.feature":"機能","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 環境変数が優先。","settings.agenticLabel":"agentic orchestration を有効化(実験的)","settings.agenticHint":"Bash 操作時にバックグラウンドエージェントの提案を表示。Opt-in。","errors.timeout":"リクエストがタイムアウトしました"},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.ai","header.connected":"연결됨","header.disconnected":"연결 끊김","header.connecting":"연결 중…","header.memories":"개의 기억","tab.insights":"Insights","telemetry.title":"LLM 활동","telemetry.lastNDays":"최근 {n}일","telemetry.loading":"불러오는 중…","telemetry.empty":"이 기간에 기록된 LLM 활동이 없습니다. dream / auto-tagger / failure-analyzer가 실행되면 Smart-Mode 플로우가 자동으로 행을 기록합니다.","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":"엔티티 이름, 관찰 내용 또는 태그로 검색할 수 있습니다. FTS5 전체 텍스트 + 벡터 유사도 검색을 지원합니다.","search.facts":"개의 사실","browse.title":"모든 기억","browse.manage":"기억 관리","browse.active":"활성","browse.archived":"보관됨","browse.filter":"내용, 유형 또는 태그로 필터링…","browse.refresh":"새로고침","browse.noMemories":"기억이 없습니다","browse.noMatch":"일치하는 기억이 없습니다:","browse.prev":"← 이전","browse.next":"다음 →","browse.archive":"보관","browse.restore":"복원","browse.confirmArchive":"이 기억을 보관하시겠습니까?","browse.moreArchived":"개의 보관된 기억","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 키워드 검색(LongMemEval-S에서 95.40% R@5), 수동 remember/recall, 대시보드, 훅 기반 세션 캡처","settings.llmOptional.smartLabel":"LLM 사용(스마트 모드)","settings.llmOptional.smartFeatures":"세션 실패에서 lesson_learned 자동 추출, 새 엔티티 자동 태깅, 주간 요약과 패턴 감지","settings.apiKey":"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가 내 설치에서 다음을 발견했습니다:","doctor.capabilities.summary":"LLM/embedding configuration detected","doctor.capabilities.fix":'Configure via "memesh config set llm.provider <provider>"',"doctor.config.summary":"Config file status","doctor.config.fix":'Fix or remove the config file, then run "memesh config list"',"doctor.dashboard.summary":"Dashboard artifact exists","doctor.dashboard.fix":'Run "npm run build:dashboard" to rebuild the dashboard',"doctor.database.summary":"Database accessibility status","doctor.database.fix":'Check database permissions, path, or run "memesh doctor" for detailed diagnosis',"doctor.hook-activity.summary":"지난 24시간 동안 memesh 관련 활동이 없었습니다","doctor.hook-activity.fix":"도구를 3개 이상 사용하는 Claude Code 세션을 열거나 커밋한 후, 대시보드를 다시 여세요","doctor.hook-scripts.summary":"Hook script files verification","doctor.hook-scripts.fix":"Reinstall MeMesh or restore missing hook files from package","doctor.hook-wiring.summary":"Hooks integration status in Claude Code","doctor.hook-wiring.fix":'Run "memesh install-hooks" to wire hooks into Claude Code settings',"doctor.hooks-config.summary":"Hooks configuration file status","doctor.hooks-config.fix":"Reinstall MeMesh or restore .claude-plugin/hooks.json","doctor.http-probe.summary":"HTTP server availability check","doctor.http-probe.fix":"Check if port is available or database is accessible","doctor.install_id.summary":"Anonymous install ID status","doctor.install_id.fix":'Run "memesh" once to generate install ID',"doctor.mcp-config.summary":"MCP server configuration status","doctor.mcp-config.fix":"Restore .mcp.json from package or reinstall MeMesh","doctor.skills-manifest.summary":"Skills directory structure validation","doctor.skills-manifest.fix":"Reinstall MeMesh or restore .claude-plugin/skills directory","doctor.update_status.summary":"Update available: {version}","doctor.update_status.fix":'Run "memesh update" to upgrade',"doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","doctor.vector_index.summary":"Search index needs rebuilding","doctor.vector_index.fix":'Run "memesh reindex" to restore full search',"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":"KG 고아율","pm.relationsTotal":"관계 총수","pm.stalePlans":"30일 이상 검토되지 않은 계획 {count}건","common.loading":"로딩 중…","common.noData":"데이터 없음","errors.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":"활성 지식 기억<br/>(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만으로 작동합니다(95.40% R@5). 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":"닫기","ageMatrix.bucket.week":"이번 주","ageMatrix.bucket.month":"이번 달","ageMatrix.bucket.quarter":"이번 분기","ageMatrix.bucket.older":"이전","ageMatrix.type.lesson_learned":"교훈","ageMatrix.type.lesson":"교훈","ageMatrix.type.mistake":"실수","ageMatrix.type.decision":"결정","ageMatrix.type.architecture_decision":"아키 결정","ageMatrix.type.pattern":"패턴","ageMatrix.type.technical_pattern":"기술 패턴","ageMatrix.type.best_practice":"베스트 프랙티스","ageMatrix.type.bug_fix":"버그 수정","ageMatrix.type.workflow_checkpoint":"워크플로 마일스톤","ageMatrix.type.process":"프로세스","ageMatrix.type.architecture":"아키텍처","ageMatrix.type.feature":"기능","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 환경 변수가 우선.","settings.agenticLabel":"agentic orchestration 활성화 (실험적)","settings.agenticHint":"Bash 작업 시 백그라운드 에이전트 제안 표시. Opt-in.","errors.timeout":"요청 시간이 초과되었습니다"},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.ai","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":"Nenhuma atividade do LLM registrada nessa janela. Os fluxos do Smart-Mode gravam linhas automaticamente assim que dream / auto-tagger / failure-analyzer forem 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 da entidade, conteúdo da observação ou tags. Suporta texto completo FTS5 + similaridade vetorial.","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 (95,40% R@5 no LongMemEval-S), 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.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:","doctor.capabilities.summary":"LLM/embedding configuration detected","doctor.capabilities.fix":'Configure via "memesh config set llm.provider <provider>"',"doctor.config.summary":"Config file status","doctor.config.fix":'Fix or remove the config file, then run "memesh config list"',"doctor.dashboard.summary":"Dashboard artifact exists","doctor.dashboard.fix":'Run "npm run build:dashboard" to rebuild the dashboard',"doctor.database.summary":"Database accessibility status","doctor.database.fix":'Check database permissions, path, or run "memesh doctor" for detailed diagnosis',"doctor.hook-activity.summary":"Nenhuma atividade atribuída ao memesh nas últimas 24h","doctor.hook-activity.fix":"Abra uma sessão Claude Code que use ≥3 ferramentas, ou faça um commit, e reabra o painel","doctor.hook-scripts.summary":"Hook script files verification","doctor.hook-scripts.fix":"Reinstall MeMesh or restore missing hook files from package","doctor.hook-wiring.summary":"Hooks integration status in Claude Code","doctor.hook-wiring.fix":'Run "memesh install-hooks" to wire hooks into Claude Code settings',"doctor.hooks-config.summary":"Hooks configuration file status","doctor.hooks-config.fix":"Reinstall MeMesh or restore .claude-plugin/hooks.json","doctor.http-probe.summary":"HTTP server availability check","doctor.http-probe.fix":"Check if port is available or database is accessible","doctor.install_id.summary":"Anonymous install ID status","doctor.install_id.fix":'Run "memesh" once to generate install ID',"doctor.mcp-config.summary":"MCP server configuration status","doctor.mcp-config.fix":"Restore .mcp.json from package or reinstall MeMesh","doctor.skills-manifest.summary":"Skills directory structure validation","doctor.skills-manifest.fix":"Reinstall MeMesh or restore .claude-plugin/skills directory","doctor.update_status.summary":"Update available: {version}","doctor.update_status.fix":'Run "memesh update" to upgrade',"doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","doctor.vector_index.summary":"Search index needs rebuilding","doctor.vector_index.fix":'Run "memesh reindex" to restore full search',"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":"taxa de órfãos no KG","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","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<br/>(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 (95.40% R@5). 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","ageMatrix.bucket.week":"Esta semana","ageMatrix.bucket.month":"Este mês","ageMatrix.bucket.quarter":"Este trimestre","ageMatrix.bucket.older":"Mais antigo","ageMatrix.type.lesson_learned":"Lição","ageMatrix.type.lesson":"Lição","ageMatrix.type.mistake":"Erro","ageMatrix.type.decision":"Decisão","ageMatrix.type.architecture_decision":"Decisão arq.","ageMatrix.type.pattern":"Padrão","ageMatrix.type.technical_pattern":"Padrão técnico","ageMatrix.type.best_practice":"Melhor prática","ageMatrix.type.bug_fix":"Correção","ageMatrix.type.workflow_checkpoint":"Checkpoint","ageMatrix.type.process":"Processo","ageMatrix.type.architecture":"Arquitetura","ageMatrix.type.feature":"Funcionalidade","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.","settings.agenticLabel":"Ativar agentic orchestration (experimental)","settings.agenticHint":"Mostra sugestões de agente em Bash. Opt-in apenas.","errors.timeout":"A solicitação expirou"},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.ai","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é du LLM enregistrée sur cette période. Les flux Smart-Mode écrivent automatiquement des lignes dès que dream / auto-tagger / failure-analyzer 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 d’entité, contenu d’observation ou tags. Prend en charge le plein texte FTS5 + la similarité vectorielle.","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 (95,40 % R@5 sur LongMemEval-S), 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.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 :","doctor.capabilities.summary":"LLM/embedding configuration detected","doctor.capabilities.fix":'Configure via "memesh config set llm.provider <provider>"',"doctor.config.summary":"Config file status","doctor.config.fix":'Fix or remove the config file, then run "memesh config list"',"doctor.dashboard.summary":"Dashboard artifact exists","doctor.dashboard.fix":'Run "npm run build:dashboard" to rebuild the dashboard',"doctor.database.summary":"Database accessibility status","doctor.database.fix":'Check database permissions, path, or run "memesh doctor" for detailed diagnosis',"doctor.hook-activity.summary":"Aucune activité memesh ces dernières 24 heures","doctor.hook-activity.fix":"Ouvrez une session Claude Code utilisant ≥3 outils, ou faites un commit, puis rouvrez le tableau de bord","doctor.hook-scripts.summary":"Hook script files verification","doctor.hook-scripts.fix":"Reinstall MeMesh or restore missing hook files from package","doctor.hook-wiring.summary":"Hooks integration status in Claude Code","doctor.hook-wiring.fix":'Run "memesh install-hooks" to wire hooks into Claude Code settings',"doctor.hooks-config.summary":"Hooks configuration file status","doctor.hooks-config.fix":"Reinstall MeMesh or restore .claude-plugin/hooks.json","doctor.http-probe.summary":"HTTP server availability check","doctor.http-probe.fix":"Check if port is available or database is accessible","doctor.install_id.summary":"Anonymous install ID status","doctor.install_id.fix":'Run "memesh" once to generate install ID',"doctor.mcp-config.summary":"MCP server configuration status","doctor.mcp-config.fix":"Restore .mcp.json from package or reinstall MeMesh","doctor.skills-manifest.summary":"Skills directory structure validation","doctor.skills-manifest.fix":"Reinstall MeMesh or restore .claude-plugin/skills directory","doctor.update_status.summary":"Update available: {version}","doctor.update_status.fix":'Run "memesh update" to upgrade',"doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","doctor.vector_index.summary":"Search index needs rebuilding","doctor.vector_index.fix":'Run "memesh reindex" to restore full search',"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":"taux d'orphelins du KG","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","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<br/>(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 (95,40 % R@5). 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","ageMatrix.bucket.week":"Cette semaine","ageMatrix.bucket.month":"Ce mois","ageMatrix.bucket.quarter":"Ce trimestre","ageMatrix.bucket.older":"Plus ancien","ageMatrix.type.lesson_learned":"Leçon","ageMatrix.type.lesson":"Leçon","ageMatrix.type.mistake":"Erreur","ageMatrix.type.decision":"Décision","ageMatrix.type.architecture_decision":"Décision arch.","ageMatrix.type.pattern":"Pattern","ageMatrix.type.technical_pattern":"Pattern tech.","ageMatrix.type.best_practice":"Bonne pratique","ageMatrix.type.bug_fix":"Correction","ageMatrix.type.workflow_checkpoint":"Jalon","ageMatrix.type.process":"Processus","ageMatrix.type.architecture":"Architecture","ageMatrix.type.feature":"Fonctionnalité","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é.","settings.agenticLabel":"Activer agentic orchestration (expérimental)","settings.agenticHint":"Affiche des suggestions d'agent en Bash. Opt-in.","errors.timeout":"La requête a expiré"},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.ai","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 wurde keine LLM-Aktivität aufgezeichnet. Smart-Mode-Flows schreiben automatisch Einträge, sobald dream / auto-tagger / failure-analyzer 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":"Suchen Sie nach Entitätsname, Beobachtungsinhalt oder Tags. Unterstützt FTS5-Volltext + Vektorähnlichkeit.","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 (95,40 % R@5 auf LongMemEval-S), 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.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:","doctor.capabilities.summary":"LLM/embedding configuration detected","doctor.capabilities.fix":'Configure via "memesh config set llm.provider <provider>"',"doctor.config.summary":"Config file status","doctor.config.fix":'Fix or remove the config file, then run "memesh config list"',"doctor.dashboard.summary":"Dashboard artifact exists","doctor.dashboard.fix":'Run "npm run build:dashboard" to rebuild the dashboard',"doctor.database.summary":"Database accessibility status","doctor.database.fix":'Check database permissions, path, or run "memesh doctor" for detailed diagnosis',"doctor.hook-activity.summary":"Keine memesh-Aktivität in den letzten 24 Stunden","doctor.hook-activity.fix":"Starten Sie eine Claude-Code-Session mit ≥3 Tools oder committen Sie etwas und öffnen Sie das Dashboard erneut","doctor.hook-scripts.summary":"Hook script files verification","doctor.hook-scripts.fix":"Reinstall MeMesh or restore missing hook files from package","doctor.hook-wiring.summary":"Hooks integration status in Claude Code","doctor.hook-wiring.fix":'Run "memesh install-hooks" to wire hooks into Claude Code settings',"doctor.hooks-config.summary":"Hooks configuration file status","doctor.hooks-config.fix":"Reinstall MeMesh or restore .claude-plugin/hooks.json","doctor.http-probe.summary":"HTTP server availability check","doctor.http-probe.fix":"Check if port is available or database is accessible","doctor.install_id.summary":"Anonymous install ID status","doctor.install_id.fix":'Run "memesh" once to generate install ID',"doctor.mcp-config.summary":"MCP server configuration status","doctor.mcp-config.fix":"Restore .mcp.json from package or reinstall MeMesh","doctor.skills-manifest.summary":"Skills directory structure validation","doctor.skills-manifest.fix":"Reinstall MeMesh or restore .claude-plugin/skills directory","doctor.update_status.summary":"Update available: {version}","doctor.update_status.fix":'Run "memesh update" to upgrade',"doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","doctor.vector_index.summary":"Search index needs rebuilding","doctor.vector_index.fix":'Run "memesh reindex" to restore full search',"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":"KG-Verwaisungsrate","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","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<br/>(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 (95,40 % R@5). 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","ageMatrix.bucket.week":"Diese Woche","ageMatrix.bucket.month":"Dieser Monat","ageMatrix.bucket.quarter":"Dieses Quartal","ageMatrix.bucket.older":"Älter","ageMatrix.type.lesson_learned":"Lektion","ageMatrix.type.lesson":"Lektion","ageMatrix.type.mistake":"Fehler","ageMatrix.type.decision":"Entscheidung","ageMatrix.type.architecture_decision":"Arch.-Entsch.","ageMatrix.type.pattern":"Muster","ageMatrix.type.technical_pattern":"Tech. Muster","ageMatrix.type.best_practice":"Best Practice","ageMatrix.type.bug_fix":"Bugfix","ageMatrix.type.workflow_checkpoint":"Meilenstein","ageMatrix.type.process":"Prozess","ageMatrix.type.architecture":"Architektur","ageMatrix.type.feature":"Feature","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.","settings.agenticLabel":"agentic orchestration aktivieren (experimentell)","settings.agenticHint":"Zeigt Hintergrund-Agent-Vorschläge in Bash. Opt-in.","errors.timeout":"Zeitüberschreitung der Anfrage"},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.ai","header.connected":"Đã kết nối","header.disconnected":"Mất kết nối","header.connecting":"Đang kết nối…","header.memories":"ký ức","tab.insights":"Insights","telemetry.title":"Hoạt động LLM","telemetry.lastNDays":"{n} ngày qua","telemetry.loading":"đang tải…","telemetry.empty":"Không có hoạt động LLM nào được ghi nhận trong khoảng thời gian này. Các flow Smart-Mode sẽ tự động ghi dữ liệu khi dream / auto-tagger / failure-analyzer chạy.","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 thực thể, nội dung quan sát hoặc thẻ. Hỗ trợ tìm kiếm toàn văn FTS5 + độ tương đồng vector.","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 (95,40% R@5 trên LongMemEval-S), 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.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:","doctor.capabilities.summary":"LLM/embedding configuration detected","doctor.capabilities.fix":'Configure via "memesh config set llm.provider <provider>"',"doctor.config.summary":"Config file status","doctor.config.fix":'Fix or remove the config file, then run "memesh config list"',"doctor.dashboard.summary":"Dashboard artifact exists","doctor.dashboard.fix":'Run "npm run build:dashboard" to rebuild the dashboard',"doctor.database.summary":"Database accessibility status","doctor.database.fix":'Check database permissions, path, or run "memesh doctor" for detailed diagnosis',"doctor.hook-activity.summary":"Không có hoạt động memesh trong 24 giờ qua","doctor.hook-activity.fix":"Mở một phiên Claude Code sử dụng ≥3 công cụ, hoặc thực hiện một commit, rồi mở lại bảng điều khiển","doctor.hook-scripts.summary":"Hook script files verification","doctor.hook-scripts.fix":"Reinstall MeMesh or restore missing hook files from package","doctor.hook-wiring.summary":"Hooks integration status in Claude Code","doctor.hook-wiring.fix":'Run "memesh install-hooks" to wire hooks into Claude Code settings',"doctor.hooks-config.summary":"Hooks configuration file status","doctor.hooks-config.fix":"Reinstall MeMesh or restore .claude-plugin/hooks.json","doctor.http-probe.summary":"HTTP server availability check","doctor.http-probe.fix":"Check if port is available or database is accessible","doctor.install_id.summary":"Anonymous install ID status","doctor.install_id.fix":'Run "memesh" once to generate install ID',"doctor.mcp-config.summary":"MCP server configuration status","doctor.mcp-config.fix":"Restore .mcp.json from package or reinstall MeMesh","doctor.skills-manifest.summary":"Skills directory structure validation","doctor.skills-manifest.fix":"Reinstall MeMesh or restore .claude-plugin/skills directory","doctor.update_status.summary":"Update available: {version}","doctor.update_status.fix":'Run "memesh update" to upgrade',"doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","doctor.vector_index.summary":"Search index needs rebuilding","doctor.vector_index.fix":'Run "memesh reindex" to restore full search',"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":"tỷ lệ mồ côi trong KG","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","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<br/>(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 (95,40% R@5). 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","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","ageMatrix.type.lesson_learned":"Bài học","ageMatrix.type.lesson":"Bài học","ageMatrix.type.mistake":"Sai sót","ageMatrix.type.decision":"Quyết định","ageMatrix.type.architecture_decision":"QĐ kiến trúc","ageMatrix.type.pattern":"Mẫu","ageMatrix.type.technical_pattern":"Mẫu kỹ thuật","ageMatrix.type.best_practice":"Best practice","ageMatrix.type.bug_fix":"Sửa lỗi","ageMatrix.type.workflow_checkpoint":"Mốc","ageMatrix.type.process":"Quy trình","ageMatrix.type.architecture":"Kiến trúc","ageMatrix.type.feature":"Tính năng","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.","settings.agenticLabel":"Bật agentic orchestration (thử nghiệm)","settings.agenticHint":"Hiển thị gợi ý agent trong Bash. Opt-in.","errors.timeout":"Yêu cầu đã hết thời gian chờ"},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.ai","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":"No se registró actividad del LLM en esta ventana. Los flujos Smart-Mode escriben filas automáticamente cuando se ejecutan dream / auto-tagger / failure-analyzer.","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 de entidad, contenido de observación o etiquetas. Admite texto completo FTS5 + similitud vectorial.","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 (95,40 % R@5 en LongMemEval-S), 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.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:","doctor.capabilities.summary":"LLM/embedding configuration detected","doctor.capabilities.fix":'Configure via "memesh config set llm.provider <provider>"',"doctor.config.summary":"Config file status","doctor.config.fix":'Fix or remove the config file, then run "memesh config list"',"doctor.dashboard.summary":"Dashboard artifact exists","doctor.dashboard.fix":'Run "npm run build:dashboard" to rebuild the dashboard',"doctor.database.summary":"Database accessibility status","doctor.database.fix":'Check database permissions, path, or run "memesh doctor" for detailed diagnosis',"doctor.hook-activity.summary":"Sin actividad de memesh en las últimas 24 h","doctor.hook-activity.fix":"Abra una sesión de Claude Code que use ≥3 herramientas, o haga un commit, y vuelva a abrir el panel","doctor.hook-scripts.summary":"Hook script files verification","doctor.hook-scripts.fix":"Reinstall MeMesh or restore missing hook files from package","doctor.hook-wiring.summary":"Hooks integration status in Claude Code","doctor.hook-wiring.fix":'Run "memesh install-hooks" to wire hooks into Claude Code settings',"doctor.hooks-config.summary":"Hooks configuration file status","doctor.hooks-config.fix":"Reinstall MeMesh or restore .claude-plugin/hooks.json","doctor.http-probe.summary":"HTTP server availability check","doctor.http-probe.fix":"Check if port is available or database is accessible","doctor.install_id.summary":"Anonymous install ID status","doctor.install_id.fix":'Run "memesh" once to generate install ID',"doctor.mcp-config.summary":"MCP server configuration status","doctor.mcp-config.fix":"Restore .mcp.json from package or reinstall MeMesh","doctor.skills-manifest.summary":"Skills directory structure validation","doctor.skills-manifest.fix":"Reinstall MeMesh or restore .claude-plugin/skills directory","doctor.update_status.summary":"Update available: {version}","doctor.update_status.fix":'Run "memesh update" to upgrade',"doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","doctor.vector_index.summary":"Search index needs rebuilding","doctor.vector_index.fix":'Run "memesh reindex" to restore full search',"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":"tasa de huérfanos del KG","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","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<br/>(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 (95,40 % R@5). 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","ageMatrix.bucket.week":"Esta semana","ageMatrix.bucket.month":"Este mes","ageMatrix.bucket.quarter":"Este trimestre","ageMatrix.bucket.older":"Más antiguo","ageMatrix.type.lesson_learned":"Lección","ageMatrix.type.lesson":"Lección","ageMatrix.type.mistake":"Error","ageMatrix.type.decision":"Decisión","ageMatrix.type.architecture_decision":"Dec. arq.","ageMatrix.type.pattern":"Patrón","ageMatrix.type.technical_pattern":"Patrón téc.","ageMatrix.type.best_practice":"Buena práctica","ageMatrix.type.bug_fix":"Corrección","ageMatrix.type.workflow_checkpoint":"Hito","ageMatrix.type.process":"Proceso","ageMatrix.type.architecture":"Arquitectura","ageMatrix.type.feature":"Característica","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.","settings.agenticLabel":"Activar agentic orchestration (experimental)","settings.agenticHint":"Muestra sugerencias de agente en Bash. Opt-in.","errors.timeout":"La solicitud agotó el tiempo de espera"},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.ai","header.connected":"เชื่อมต่อแล้ว","header.disconnected":"ไม่ได้เชื่อมต่อ","header.connecting":"กำลังเชื่อมต่อ…","header.memories":"ความทรงจำ","tab.insights":"Insights","telemetry.title":"กิจกรรม LLM","telemetry.lastNDays":"{n} วันล่าสุด","telemetry.loading":"กำลังโหลด…","telemetry.empty":"ไม่มีบันทึกกิจกรรม LLM ในช่วงเวลานี้ ฟลาว Smart-Mode จะเขียนข้อมูลโดยอัตโนมัติเมื่อ dream / auto-tagger / failure-analyzer ทำงาน","telemetry.callsCount":"{n} การเรียก","telemetry.attemptsCount":"{n} ครั้งที่พยายาม","telemetry.successRate":"สำเร็จ","telemetry.medianLatency":"เวลาตอบสนองมัธยฐาน","telemetry.fallbackUsed":"ใช้ fallback {n}× ({pct} ของการเรียก)","telemetry.byProvider":"ตามผู้ให้บริการ","telemetry.byModel":"by model","telemetry.byProject":"by project","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":"ค้นหาตามชื่อเอนทิตี เนื้อหาข้อสังเกต หรือแท็ก รองรับการค้นหาข้อความเต็ม FTS5 + ความคล้ายคลึงแบบเวกเตอร์","search.facts":"ข้อเท็จจริง","browse.title":"ความทรงจำทั้งหมด","browse.manage":"จัดการความทรงจำ","browse.active":"ใช้งานอยู่","browse.archived":"เก็บถาวร","browse.filter":"กรองตามเนื้อหา ประเภท หรือแท็ก…","browse.refresh":"รีเฟรช","browse.noMemories":"ยังไม่มีความทรงจำ","browse.noMatch":"ไม่พบความทรงจำที่ตรงกัน:","browse.prev":"← ก่อนหน้า","browse.next":"ถัดไป →","browse.archive":"เก็บถาวร","browse.restore":"กู้คืน","browse.confirmArchive":"เก็บถาวรความทรงจำนี้?","browse.moreArchived":"ความทรงจำที่เก็บถาวร","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 (95.40% R@5 บน LongMemEval-S), remember/recall ด้วยตนเอง, แดชบอร์ด, การจับ session ผ่าน hooks","settings.llmOptional.smartLabel":"มี LLM (โหมด Smart)","settings.llmOptional.smartFeatures":"lesson_learned อัตโนมัติจากความล้มเหลวของ session, การติดแท็กอัตโนมัติของ entity ใหม่, สรุปประจำสัปดาห์และการตรวจจับรูปแบบ","settings.apiKey":"คีย์ 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 รายงานสิ่งต่อไปนี้บนการติดตั้งของฉัน:","doctor.capabilities.summary":"LLM/embedding configuration detected","doctor.capabilities.fix":'Configure via "memesh config set llm.provider <provider>"',"doctor.config.summary":"Config file status","doctor.config.fix":'Fix or remove the config file, then run "memesh config list"',"doctor.dashboard.summary":"Dashboard artifact exists","doctor.dashboard.fix":'Run "npm run build:dashboard" to rebuild the dashboard',"doctor.database.summary":"Database accessibility status","doctor.database.fix":'Check database permissions, path, or run "memesh doctor" for detailed diagnosis',"doctor.hook-activity.summary":"ไม่พบกิจกรรม memesh ในช่วง 24 ชั่วโมงที่ผ่านมา","doctor.hook-activity.fix":"เปิด Claude Code session ที่ใช้เครื่องมือ ≥3 รายการ หรือทำการ commit แล้วเปิดแดชบอร์ดอีกครั้ง","doctor.hook-scripts.summary":"Hook script files verification","doctor.hook-scripts.fix":"Reinstall MeMesh or restore missing hook files from package","doctor.hook-wiring.summary":"Hooks integration status in Claude Code","doctor.hook-wiring.fix":'Run "memesh install-hooks" to wire hooks into Claude Code settings',"doctor.hooks-config.summary":"Hooks configuration file status","doctor.hooks-config.fix":"Reinstall MeMesh or restore .claude-plugin/hooks.json","doctor.http-probe.summary":"HTTP server availability check","doctor.http-probe.fix":"Check if port is available or database is accessible","doctor.install_id.summary":"Anonymous install ID status","doctor.install_id.fix":'Run "memesh" once to generate install ID',"doctor.mcp-config.summary":"MCP server configuration status","doctor.mcp-config.fix":"Restore .mcp.json from package or reinstall MeMesh","doctor.skills-manifest.summary":"Skills directory structure validation","doctor.skills-manifest.fix":"Reinstall MeMesh or restore .claude-plugin/skills directory","doctor.update_status.summary":"Update available: {version}","doctor.update_status.fix":'Run "memesh update" to upgrade',"doctor.update_status.prerelease":"Running pre-release version ({current}), npm latest is {latest}","doctor.vector_index.summary":"Search index needs rebuilding","doctor.vector_index.fix":'Run "memesh reindex" to restore full search',"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":"อัตรากำพร้าใน KG","pm.relationsTotal":"ความสัมพันธ์ทั้งหมด","pm.stalePlans":"แผน {count} รายการไม่ได้ทบทวนเกิน 30 วัน","common.loading":"กำลังโหลด…","common.noData":"ไม่มีข้อมูล","errors.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":"ความทรงจำที่ใช้งาน<br/>(ไม่รวม 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 อย่างเดียว (95.40% R@5) 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":"ปิด","ageMatrix.bucket.week":"สัปดาห์นี้","ageMatrix.bucket.month":"เดือนนี้","ageMatrix.bucket.quarter":"ไตรมาสนี้","ageMatrix.bucket.older":"เก่ากว่า","ageMatrix.type.lesson_learned":"บทเรียน","ageMatrix.type.lesson":"บทเรียน","ageMatrix.type.mistake":"ความผิดพลาด","ageMatrix.type.decision":"การตัดสินใจ","ageMatrix.type.architecture_decision":"ตัดสินใจสถาปัตย์","ageMatrix.type.pattern":"แพทเทิร์น","ageMatrix.type.technical_pattern":"แพทเทิร์นเทคนิค","ageMatrix.type.best_practice":"แนวปฏิบัติที่ดี","ageMatrix.type.bug_fix":"แก้บั๊ก","ageMatrix.type.workflow_checkpoint":"เหตุการณ์สำคัญ","ageMatrix.type.process":"กระบวนการ","ageMatrix.type.architecture":"สถาปัตยกรรม","ageMatrix.type.feature":"ฟีเจอร์","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 มีลำดับความสำคัญ","settings.agenticLabel":"เปิดใช้ agentic orchestration (ทดลอง)","settings.agenticHint":"แสดงคำแนะนำ agent ใน Bash. Opt-in.","errors.timeout":"คำขอหมดเวลา"}},vn={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 pt="en";function kn(){const t=localStorage.getItem("memesh-locale");if(t&&mt[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 n=s.split("-")[0];return mt[n]?n:"en"}function xn(){return pt=kn(),pt}function wn(t){pt=t,localStorage.setItem("memesh-locale",t)}function a(t,s){const n=mt[pt]?.[t]||mt.en[t]||t;return s?n.replace(/\{(\w+)\}/g,(o,r)=>{const i=s[r];return i===void 0?`{${r}}`:String(i)}):n}function Mn(){return Object.entries(vn).map(([t,s])=>({code:t,name:s}))}const Ot="memesh.signalMode",kt="memesh:signal-mode-changed",_n=!0;function xt(){try{const t=localStorage.getItem(Ot);if(t==="true")return!0;if(t==="false")return!1}catch{}return _n}function Sn(t){try{localStorage.setItem(Ot,String(t))}catch{}}function Nt(){const[t,s]=k(xt);K(()=>{function o(i){const d=i.detail;d&&typeof d.value=="boolean"?s(d.value):s(xt())}function r(i){i.key===Ot&&s(xt())}return window.addEventListener(kt,o),window.addEventListener("storage",r),()=>{window.removeEventListener(kt,o),window.removeEventListener("storage",r)}},[]);function n(o){Sn(o),s(o),window.dispatchEvent(new CustomEvent(kt,{detail:{value:o}}))}return[t,n]}function Cn({health:t,error:s}){const[n,o]=Nt();return e("div",{class:"header",children:[e("div",{class:"header-brand",children:[e("h1",{children:"MeMesh LLM Memory"}),e("small",{children:a("brand.subtitle")})]}),e("div",{class:"header-right",children:e("div",{class:"header-meta",children:[e("button",{type:"button",class:"signal-toggle",onClick:()=>o(!n),"aria-pressed":n,title:a(n?"header.signalModeOnHint":"header.signalModeOffHint"),style:{fontSize:11,padding:"4px 10px",borderRadius:12,border:`1px solid ${n?"rgba(0, 214, 180, 0.4)":"rgba(255, 255, 255, 0.08)"}`,background:n?"rgba(0, 214, 180, 0.12)":"transparent",color:n?"var(--accent)":"var(--text-2)",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{marginRight:4},children:n?"●":"○"}),a(n?"header.signalModeOn":"header.signalModeOff")]}),t?e(ie,{children:[e("span",{children:[e("span",{class:"dot dot-ok"}),a("header.connected")]}),e("span",{class:"badge-version",children:["v",t.version," · ",t.entity_count.toLocaleString()," ",a("header.memories")]})]}):s?e("span",{children:[e("span",{class:"dot dot-err"}),a("header.disconnected")]}):e("span",{style:{color:"var(--text-3)"},children:a("header.connecting")})]})})]})}function Ln({tabs:t,active:s,onSelect:n}){return e("nav",{class:"nav",children:t.map(({key:o,label:r})=>e("button",{class:`nav-btn ${o===s?"active":""}`,onClick:()=>n(o),children:r},o))})}const Tn=1e4,Rt="memesh_token";function Et(){try{return localStorage.getItem(Rt)}catch{return null}}function An(t){try{t?localStorage.setItem(Rt,t):localStorage.removeItem(Rt)}catch{}}class Ns extends Error{constructor(){super("auth_required"),this.name="AuthRequiredError"}}class Pn extends Error{constructor(s){super(`HTTP ${s}`),this.name="HttpError",this.status=s}}class Dt extends Error{constructor(s){super(s),this.name="NetworkError"}}async function V(t,s,n){const o=new AbortController,r=setTimeout(()=>o.abort(),Tn);try{const i={"Content-Type":"application/json"},d=Et();d&&(i.Authorization=`Bearer ${d}`);const c={method:t,headers:i,signal:o.signal};n&&(c.body=JSON.stringify(n));const g=await fetch(s,c);if(g.status===401)throw window.dispatchEvent(new Event("memesh:auth-required")),new Ns;if(!g.ok)throw new Pn(g.status);const u=await g.json();if(!u.success)throw new Error(u.error||a("errors.unknown"));return u.data}catch(i){throw i.name==="AbortError"?new Dt(a("errors.timeout")):i instanceof TypeError?new Dt(i.message):i}finally{clearTimeout(r)}}async function Ws(){const t=await V("GET","/v1/projects");return Array.isArray(t)?t:[]}async function Rn(){return V("GET","/v1/graph")}async function En(){const t=await V("GET","/v1/entities?type=lesson_learned&limit=100");return Array.isArray(t)?t:[]}const Dn={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 is(t){return Dn[t]??"reference"}function Re(t,s=new Date){if(!t)return"—";const n=new Date(t);if(Number.isNaN(n.getTime()))return"—";const o=s.getTime()-n.getTime(),r=Math.floor(o/864e5);if(r<0)return n.toLocaleDateString(void 0,{month:"short",day:"numeric"});if(r===0){const i=Math.floor(o/36e5);return i<1?a("time.justNow"):i<24?a("time.hoursAgo",{count:i}):a("time.today")}return r===1?a("time.yesterday"):r<7?a("time.daysAgo",{count:r}):r<14?a("time.lastWeek"):r<30?a("time.weeksAgo",{count:Math.floor(r/7)}):r<60?a("time.lastMonth"):r<365?a("time.monthsAgo",{count:Math.floor(r/30)}):n.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function Us(t,s=new Date){if(!t)return"older";const n=s.getTime()-new Date(t).getTime(),o=Math.floor(n/864e5);return o<1?"today":o<7?"week":o<30?"month":"older"}const os="project:";function Ue(t){const s=t.tags?.find(n=>n.startsWith(os));return s?s.slice(os.length):null}function Fn(t){if(!t||t.length===0)return"";const s=t.filter(o=>o.length>30&&!/^(Steps|Commits|Plan ".+" completed)/.test(o.trim())),n=s.length>0?s:t;return n.slice(0,3).reduce((o,r)=>r.length>o.length?r:o,n[0])}function Ye(t){const s=t??0;return s===0?{count:s,label:a("memory.access.never"),tone:"none"}:s>=20?{count:s,label:a("memory.access.frequent",{count:s}),tone:"high"}:s>=5?{count:s,label:a("memory.access.recalls",{count:s}),tone:"medium"}:{count:s,label:a("memory.access.recalls",{count:s}),tone:"low"}}function Hn(t){if((t.tags??[]).some(i=>i==="plan-completion"||i.startsWith("plan:")))return"plan-completion";const o=(t.observations??[]).join(" ");return/(^|\s)Error:/.test(o)&&(/(^|\s)Fix:/.test(o)||/(^|\s)Root cause:/.test(o))?"failure":"freeform"}const te=1.5;function In(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 Bn={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:te,strokeLinejoin:"round"}),e("path",{d:"M7 13 h2",stroke:"currentColor",strokeWidth:te,strokeLinecap:"round"}),e("path",{d:"M7 14.5 h2",stroke:"currentColor",strokeWidth:te,strokeLinecap:"round"})]}),decision:e(ie,{children:[e("circle",{cx:"8",cy:"8",r:"5.5",fill:"none",stroke:"currentColor",strokeWidth:te}),e("circle",{cx:"8",cy:"8",r:"2",fill:"none",stroke:"currentColor",strokeWidth:te}),e("path",{d:"M8 0.5 v3 M8 12.5 v3 M0.5 8 h3 M12.5 8 h3",stroke:"currentColor",strokeWidth:te,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:te,strokeLinejoin:"round"}),bug:e(ie,{children:[e("ellipse",{cx:"8",cy:"9",rx:"3.5",ry:"4",fill:"none",stroke:"currentColor",strokeWidth:te}),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:te,strokeLinecap:"round"})]}),architecture:e(ie,{children:[e("rect",{x:"2",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:te}),e("rect",{x:"9",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:te}),e("rect",{x:"5.5",y:"2",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:te})]}),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:te,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:te,strokeLinecap:"round"})}),session:e(ie,{children:[e("circle",{cx:"8",cy:"9",r:"5",fill:"none",stroke:"currentColor",strokeWidth:te}),e("path",{d:"M8 9 V5.5 M8 9 L10.5 11",stroke:"currentColor",strokeWidth:te,strokeLinecap:"round"}),e("path",{d:"M6.5 2 H9.5",stroke:"currentColor",strokeWidth:te,strokeLinecap:"round"})]}),milestone:e(ie,{children:[e("path",{d:"M4 2 V14",stroke:"currentColor",strokeWidth:te,strokeLinecap:"round"}),e("path",{d:"M4 3 H12 L10 6 L12 9 H4 z",fill:"none",stroke:"currentColor",strokeWidth:te,strokeLinejoin:"round"})]}),calendar:e(ie,{children:[e("rect",{x:"2",y:"3",width:"12",height:"11",rx:"1",fill:"none",stroke:"currentColor",strokeWidth:te}),e("path",{d:"M2 6.5 H14 M5 1.5 V4.5 M11 1.5 V4.5",stroke:"currentColor",strokeWidth:te,strokeLinecap:"round"})]}),note:e(ie,{children:[e("path",{d:"M4 2 H10 L13 5 V14 H4 z",fill:"none",stroke:"currentColor",strokeWidth:te,strokeLinejoin:"round"}),e("path",{d:"M10 2 V5 H13",fill:"none",stroke:"currentColor",strokeWidth:te,strokeLinejoin:"round"}),e("path",{d:"M6 8.5 H11 M6 11 H11",stroke:"currentColor",strokeWidth:te,strokeLinecap:"round"})]}),dot:e("circle",{cx:"8",cy:"8",r:"2",fill:"currentColor"})},zn={lesson:"Lesson",decision:"Decision",pattern:"Pattern",bug:"Bug fix",architecture:"Architecture",feature:"Feature",commit:"Commit",session:"Session",milestone:"Milestone",calendar:"Weekly summary",note:"Note",dot:"Memory"};function Ke({type:t,size:s=16,color:n,ariaLabel:o}){const r=In(t),i=o??zn[r];return e("svg",{width:s,height:s,viewBox:"0 0 16 16",role:"img","aria-label":i,style:{color:n??"currentColor",flexShrink:0,display:"inline-block",verticalAlign:"text-bottom"},children:[e("title",{children:i}),Bn[r]]})}function ls(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 n=o=>String(o).padStart(2,"0");return`${s.getFullYear()}-${n(s.getMonth()+1)}-${n(s.getDate())} ${n(s.getHours())}:${n(s.getMinutes())}`}const On={high:{bg:"rgba(0, 214, 180, 0.18)",fg:"#00D6B4"},medium:{bg:"rgba(0, 214, 180, 0.10)",fg:"#00D6B4"},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 je({entity:t,actions:s,highlight:n}){const o=Fn(t.observations)||a("memory.noContent"),r=t.observations?.length??0,i=t.archived||t.status==="archived",d=Ue(t),c=Ye(t.access_count),g=On[c.tone],u=Re(t.last_accessed_at||t.created_at),m=(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(Ke,{type:t.type,size:18})}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:2},children:u})]}),e("div",{class:"mem-body",children:[e("div",{class:"mem-preview",children:n?e(Nn,{text:ls(o,160),term:n}):ls(o,160)}),e("div",{class:"mem-meta",style:{flexWrap:"wrap",gap:6},children:[e("span",{class:"badge badge-type",children:t.type}),i&&e("span",{class:"badge badge-archived",children:a("memory.archivedBadge")}),d&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.12)",color:"var(--accent)",display:"inline-flex",alignItems:"center",gap:4},title:"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"})}),d]}),c.tone!=="none"&&e("span",{class:"tag",style:{background:g.bg,color:g.fg,fontWeight:c.tone==="high"?600:400},title:`Recalled ${c.count} times`,children:["✓ ",c.label]}),m&&e("span",{class:"tag",style:{opacity:.7},title:"has relations",children:["→ ",t.relations.length]}),e("span",{style:{color:"var(--text-3)",fontSize:11},children:t.name}),e("span",{style:{color:"var(--text-3)",fontSize:10,fontFamily:"var(--mono)",opacity:.85},title:`created ${t.created_at}`,children:["· ",jn(t.created_at)]}),r>1&&e("span",{style:{color:"var(--text-3)",fontSize:11},children:["· ",a("memory.factsCount",{count:r})]}),t.tags?.filter(l=>!l.startsWith("project:")&&!/^\d{4}-\d{2}-\d{2}/.test(l)).slice(0,3).map(l=>e("span",{class:"tag",children:l},l))]})]}),s&&e("div",{class:"mem-actions",children:s})]})}function Nn({text:t,term:s}){if(!s)return e(ie,{children:t});const n=[],o=t.toLowerCase(),r=s.toLowerCase();let i=0;for(;i<t.length;){const d=o.indexOf(r,i);if(d===-1){n.push(t.slice(i));break}d>i&&n.push(t.slice(i,d)),n.push(e("mark",{children:t.slice(d,d+r.length)})),i=d+r.length}return e(ie,{children:n})}function Wn(){const[t,s]=k(""),[n,o]=k(null),[r,i]=k(!1),[d,c]=k("");async function g(){if(t.trim()){i(!0),c("");try{const u=await V("POST","/v1/recall",{query:t.trim(),limit:30}),m=Array.isArray(u)?u:u.entities||[];o(m)}catch(u){c(u.message)}finally{i(!1)}}}return e("div",{children:e("div",{class:"card",children:[e("div",{class:"card-title",children:a("search.title")}),e("div",{class:"search-bar",children:[e("input",{type:"search",placeholder:a("search.placeholder"),value:t,onInput:u=>s(u.target.value),onKeyDown:u=>u.key==="Enter"&&g()}),e("button",{class:"btn btn-primary",onClick:g,disabled:r,children:a(r?"search.searching":"search.button")})]}),!r&&n===null&&!d&&e("div",{class:"empty",style:{padding:"32px 20px",color:"var(--text-3)"},children:e("div",{style:{fontSize:13,lineHeight:1.6},children:a("search.hint")})}),d&&e("div",{class:"error-box",role:"alert",children:d}),r&&e("div",{class:"empty",children:e("div",{class:"loading"})}),!r&&n!==null&&n.length===0&&e("div",{class:"empty",children:[e("span",{class:"empty-icon",children:"🔍"}),a("search.noResults"),' "',t,'"']}),!r&&n&&n.length>0&&e("div",{children:[e("div",{style:{fontSize:12,color:"var(--text-3)",marginBottom:12},children:[n.length," ",n.length!==1?a("search.results"):a("search.result")]}),n.map(u=>e("div",{class:"card",style:{padding:14},children:e(je,{entity:u,highlight:t})},u.id))]})]})})}const cs=new Set(["release","feature"]),Un=.65,qn=new Set(["release"]),Vn=new Set(["lesson_learned","lesson","mistake","bug_fix"]),$n={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 Gn(t){if(t.length<3)return[];const o=[...t].sort((c,g)=>c.created_at.localeCompare(g.created_at)),r=[];let i=[o[0]];for(let c=1;c<o.length;c++){const g=o[c-1].created_at,u=o[c].created_at;(new Date(u).getTime()-new Date(g).getTime())/864e5<=7?i.push(o[c]):(r.push(i),i=[o[c]])}r.push(i);const d=[];for(const c of r){if(c.length<3)continue;const g=c.map(u=>({e:u,p:$n[u.type]??99})).sort((u,m)=>u.p-m.p)[0];g.p!==99&&d.push({startIso:c[0].created_at,endIso:c[c.length-1].created_at,entityCount:c.length,label:g.e.name,anchorId:g.e.id})}return d}const Kn={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 We(t){return Kn[t]??50}function Yn(t,s=new Date){const n=new Map;for(const r of t){const i=r.last_accessed_at||r.created_at,d=Us(i,s);let c,g,u;if(d==="today")c="today",g=a("time.today"),u=Number.MAX_SAFE_INTEGER;else if(d==="week"){const l=i.slice(0,10);c=`week:${l}`,g=Re(i,s),u=new Date(l).getTime()}else if(d==="month"){const l=i.slice(0,10),y=new Date(l),b=new Date(y);b.setDate(y.getDate()-y.getDay());const h=b.toISOString().slice(0,10);c=`month:${h}`,g=Re(h,s),u=b.getTime()}else{const l=i.slice(0,7);c=`older:${l}`;const y=new Date(l+"-01");g=y.toLocaleDateString(void 0,{year:"numeric",month:"long"}),u=y.getTime()}let m=n.get(c);m||(m={key:c,label:g,sort:u,entries:[]},n.set(c,m)),m.entries.push(r)}const o=Array.from(n.values()).sort((r,i)=>i.sort-r.sort);for(const r of o)r.entries.sort((i,d)=>{const c=We(i.type)-We(d.type);return c!==0?c:d.created_at.localeCompare(i.created_at)});return o}function Xn({projectName:t,entities:s,onSwitchToList:n}){const[o,r]=k("tree"),i=Me(()=>{if(s.length===0)return{total:0,first:null,last:null,types:[]};const h=[...s].sort((w,v)=>w.created_at.localeCompare(v.created_at)),p=new Map;for(const w of s)p.set(w.type,(p.get(w.type)??0)+1);return{total:s.length,first:h[0].created_at,last:h[h.length-1].created_at,types:Array.from(p.entries()).sort((w,v)=>v[1]-w[1])}},[s]),d=Me(()=>Yn(s),[s]),c=Me(()=>s.filter(h=>{if(!cs.has(h.type))return!1;if(qn.has(h.type))return!0;const p=h.metadata?.signal_score;return typeof p!="number"?!0:p>=Un}).sort((h,p)=>p.created_at.localeCompare(h.created_at)).slice(0,6),[s]),g=Me(()=>s.filter(p=>cs.has(p.type)).length-c.length,[s,c]),u=Me(()=>s.filter(h=>Vn.has(h.type)).sort((h,p)=>(p.access_count??0)-(h.access_count??0)).slice(0,5),[s]),m=Me(()=>Gn(s),[s]),l=re(new Map),y=h=>p=>{p?l.current.set(h,p):l.current.delete(h)},b=h=>{const p=l.current.get(h);p&&(p.scrollIntoView({behavior:"smooth",block:"center"}),p.style.transition="background 0.2s",p.style.background="rgba(0, 214, 180, 0.08)",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"})]})}),a("roadmap.emptyProject")]}):e("div",{children:[e("div",{style:{padding:"14px 16px",background:"rgba(0, 214, 180, 0.04)",border:"1px solid rgba(0, 214, 180, 0.12)",borderRadius:6,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:["· ",a("roadmap.title")]})]}),e("div",{style:{fontSize:12,color:"var(--text-2)",marginTop:4},children:a("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":"Roadmap view",style:{display:"inline-flex",background:"rgba(255,255,255,0.04)",borderRadius:4,padding:2,border:"1px solid var(--border-subtle)"},children:["tree","mindmap"].map(h=>{const p=o===h;return e("button",{role:"tab","aria-selected":p,onClick:()=>r(h),style:{padding:"4px 10px",background:p?"rgba(0,214,180,0.15)":"transparent",color:p?"var(--accent)":"var(--text-2)",border:"none",borderRadius:3,fontSize:11,fontFamily:"inherit",cursor:"pointer",fontWeight:p?600:400},children:h==="tree"?"🌲 Tree":"🧠 Mindmap"},h)})}),n&&e("button",{class:"btn btn-sm",onClick:n,children:a("roadmap.switchToList")})]})]}),i.types.length>0&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginTop:10},children:[i.types.slice(0,8).map(([h,p])=>e("span",{class:"tag",style:{fontSize:11,background:"rgba(255,255,255,0.04)"},children:[h," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)"},children:p})]},h)),i.types.length>8&&e("span",{class:"tag",style:{opacity:.5,fontSize:11},children:["+",i.types.length-8]})]})]}),m.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:6,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:a("roadmap.phases")}),m.map((h,p)=>e("button",{onClick:()=>h.anchorId!==void 0&&b(h.anchorId),disabled:h.anchorId===void 0,style:{flexShrink:0,display:"flex",flexDirection:"column",alignItems:"flex-start",gap:2,padding:"6px 10px",background:p===m.length-1?"rgba(0, 214, 180, 0.08)":"transparent",border:"1px solid",borderColor:p===m.length-1?"rgba(0, 214, 180, 0.3)":"var(--border-subtle)",borderRadius:4,color:"var(--text-1)",cursor:h.anchorId!==void 0?"pointer":"default",fontFamily:"inherit",textAlign:"left",minWidth:100},title:`${h.startIso.slice(0,10)} → ${h.endIso.slice(0,10)}`,children:[e("span",{style:{fontSize:11,fontWeight:600,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:240},children:h.label}),e("span",{style:{fontSize:10,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[h.entityCount," · ",Re(h.startIso)]})]},`${h.startIso}-${h.label}`))]}),o==="mindmap"&&m.length>0&&e(Zn,{projectName:t,phases:m,entities:s,onNodeClick:h=>{r("tree"),window.requestAnimationFrame(()=>b(h))}}),o==="mindmap"&&m.length===0&&e("div",{class:"empty",style:{padding:24},children:[a("roadmap.emptyProject")," — mindmap requires ≥3 entities within a 7-day window."]}),o==="tree"&&e("div",{style:{display:"grid",gridTemplateColumns:"minmax(0, 1fr) 280px",gap:16,alignItems:"start"},children:[e("div",{style:{position:"relative",minWidth:0},children:m.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 h=m.map(()=>[]),p=[];for(const v of s){const f=m.findIndex(_=>v.created_at>=_.startIso&&v.created_at<=_.endIso);f>=0?h[f].push(v):p.push(v)}for(const v of h)v.sort((f,_)=>{const A=We(f.type)-We(_.type);return A!==0?A:_.created_at.localeCompare(f.created_at)});const w=m.map((v,f)=>({phase:v,entries:h[f],idx:f})).reverse();return e(ie,{children:[w.map(({phase:v,entries:f,idx:_},A)=>{const B=A===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:B?"transparent":"var(--accent)",border:"2px solid var(--accent)",boxSizing:"border-box"}}),e("button",{onClick:()=>v.anchorId!==void 0&&b(v.anchorId),disabled:v.anchorId===void 0,style:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:2,padding:0,background:"transparent",border:"none",color:"inherit",cursor:v.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:[v.label,B&&e("span",{style:{marginLeft:8,fontSize:10,color:"var(--accent)",fontFamily:"var(--mono)",fontWeight:500},children:"active"})]}),e("span",{style:{fontSize:11,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[v.startIso.slice(0,10)," → ",v.endIso.slice(0,10)," · ",f.length," ",f.length===1?"entry":"entries"]})]}),e("div",{style:{marginTop:8},children:f.map((j,Q)=>{const q=Q===f.length-1;return e("div",{ref:y(j.id),style:{position:"relative",paddingLeft:24,paddingTop:6,paddingBottom:6},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,bottom:q?"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(je,{entity:j})]},j.id)})})]},`${v.startIso}-${v.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:["Other (",p.length,")"]}),p.map((v,f)=>{const _=f===p.length-1;return e("div",{ref:y(v.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(je,{entity:v})]},v.id)})]})]})})()]}):d.map(h=>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:h.label}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:h.entries.length})]}),h.entries.map(p=>e("div",{ref:y(p.id),style:{borderBottom:"1px solid var(--border-subtle)",padding:"12px 0"},children:e(je,{entity:p})},p.id))]},h.key))}),e("div",{style:{display:"flex",flexDirection:"column",gap:14,position:"sticky",top:16},children:[c.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:[a("roadmap.milestones"),g>0&&e("span",{style:{fontSize:"0.7rem",fontWeight:400,opacity:.55,textTransform:"none",letterSpacing:0},children:["(",g," low-signal hidden)"]})]}),c.map(h=>e("button",{onClick:()=>b(h.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(Ke,{type:h.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:h.name}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:2},children:Re(h.created_at)})]})]},h.id))]}),u.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:a("roadmap.keyLessons")}),u.map(h=>{const p=Ye(h.access_count);return e("button",{onClick:()=>b(h.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(Ke,{type:h.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:h.name}),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:a("memory.access.never")})]})]},h.id)})]})]})]})]})}function Zn({projectName:t,phases:s,entities:n,onNodeClick:o}){const r=s.map(()=>[]);for(const I of n){const W=s.findIndex(z=>I.created_at>=z.startIso&&I.created_at<=z.endIso);W>=0&&r[W].push(I)}for(const I of r)I.sort((W,z)=>{const x=We(W.type)-We(z.type);return x!==0?x:z.created_at.localeCompare(W.created_at)});const i=6,d=r.map(I=>({shown:I.slice(0,i),extra:Math.max(0,I.length-i)})),c=900,g=600,u=c/2,m=g/2,l=170,y=230,b=30,h=I=>2*Math.PI*I/s.length-Math.PI/2,p=re(null),[w,v]=k(1),[f,_]=k(0),[A,B]=k(0),j=re(w),Q=re({x:f,y:A});j.current=w,Q.current={x:f,y:A};const q=re({active:!1,lastX:0,lastY:0}),[ee,ne]=k(!1),S=.25,R=4,G=(I,W)=>{const z=p.current;if(!z)return{x:0,y:0};const x=z.getBoundingClientRect();return x.width===0||x.height===0?{x:0,y:0}:{x:(I-x.left)/x.width*c,y:(W-x.top)/x.height*g}};K(()=>{const I=p.current;if(!I)return;const W=z=>{z.preventDefault();const x=j.current,E=Q.current,U=Math.exp(-z.deltaY*.0015),ae=Math.max(S,Math.min(R,x*U));if(ae===x)return;const{x:de,y:ve}=G(z.clientX,z.clientY),M=(de-E.x)/x,F=(ve-E.y)/x;v(ae),_(de-M*ae),B(ve-F*ae)};return I.addEventListener("wheel",W,{passive:!1}),()=>I.removeEventListener("wheel",W)},[]);const be=I=>{let z=I.target;for(;z&&z!==p.current;){if(z.style?.cursor==="pointer")return;z=z.parentElement}I.preventDefault(),q.current.active=!0,q.current.lastX=I.clientX,q.current.lastY=I.clientY,ne(!0)},se=I=>{if(!q.current.active)return;const W=p.current;if(!W)return;const z=W.getBoundingClientRect();if(z.width===0||z.height===0)return;const x=(I.clientX-q.current.lastX)/z.width*c,E=(I.clientY-q.current.lastY)/z.height*g;q.current.lastX=I.clientX,q.current.lastY=I.clientY,_(U=>U+x),B(U=>U+E)},he=()=>{q.current.active&&(q.current.active=!1,ne(!1))},ce=()=>{v(1),_(0),B(0)};return e("div",{style:{position:"relative",border:"1px solid var(--border-subtle)",borderRadius:6,background:"rgba(255,255,255,0.02)",overflow:"hidden",marginBottom:14},children:[e("button",{onClick:ce,title:"Reset view (also: double-click background)",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:4,cursor:"pointer"},children:"Reset view"}),e("div",{style:{position:"absolute",bottom:8,left:12,zIndex:2,fontSize:10,fontFamily:"var(--mono)",color:"var(--text-3)",pointerEvents:"none"},children:["scroll to zoom · drag to pan · ",Math.round(w*100),"%"]}),e("svg",{ref:p,viewBox:`0 0 ${c} ${g}`,width:"100%",style:{display:"block",minHeight:600,cursor:ee?"grabbing":"grab",userSelect:"none",touchAction:"none"},onMouseDown:be,onMouseMove:se,onMouseUp:he,onMouseLeave:he,onDblClick:ce,children:e("g",{transform:`translate(${f} ${A}) scale(${w})`,children:[s.map((I,W)=>{const z=h(W),x=u+l*Math.cos(z),E=m+l*Math.sin(z);return e("path",{d:`M ${u} ${m} Q ${(u+x)/2} ${(m+E)/2-10} ${x} ${E}`,fill:"none",stroke:"rgba(0, 214, 180, 0.4)",strokeWidth:1.5},`p-${W}`)}),s.map((I,W)=>{const{shown:z}=d[W],x=h(W),E=u+l*Math.cos(x),U=m+l*Math.sin(x),ae=Math.PI/6;return z.map((de,ve)=>{const M=z.length===1?.5:ve/(z.length-1),F=x-ae/2+ae*M,D=y+b*(ve%3),H=u+D*Math.cos(F),N=m+D*Math.sin(F);return e("path",{d:`M ${E} ${U} Q ${(E+H)/2} ${(U+N)/2} ${H} ${N}`,fill:"none",stroke:"rgba(255,255,255,0.18)",strokeWidth:1},`e-${W}-${de.id}`)})}),e("g",{children:[e("circle",{cx:u,cy:m,r:42,fill:"rgba(0, 214, 180, 0.18)",stroke:"var(--accent)",strokeWidth:1.5}),e("text",{x:u,y:m,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((I,W)=>{const z=h(W),x=u+l*Math.cos(z),E=m+l*Math.sin(z),U=I.label.length>18?I.label.slice(0,16)+"…":I.label;return e("g",{style:{cursor:I.anchorId!==void 0?"pointer":"default"},onClick:()=>I.anchorId!==void 0&&o(I.anchorId),children:[e("circle",{cx:x,cy:E,r:28,fill:"rgba(0, 214, 180, 0.10)",stroke:"var(--accent)",strokeWidth:1.25}),e("text",{x,y:E-4,textAnchor:"middle",fontSize:10,fontWeight:600,fill:"var(--text-0)",style:{pointerEvents:"none"},children:[e("tspan",{x,dy:0,children:U}),e("tspan",{x,dy:12,fontSize:9,fill:"var(--text-3)",fontWeight:400,children:[I.entityCount," · ",I.startIso.slice(5,10)]})]})]},`phase-${W}`)}),s.map((I,W)=>{const{shown:z,extra:x}=d[W],E=h(W),U=Math.PI/6;return e("g",{children:[z.map((ae,de)=>{const ve=z.length===1?.5:de/(z.length-1),M=E-U/2+U*ve,F=y+b*(de%3),D=u+F*Math.cos(M),H=m+F*Math.sin(M),N=ae.name.length>22?ae.name.slice(0,20)+"…":ae.name;return e("g",{style:{cursor:"pointer"},onClick:()=>o(ae.id),children:[e("title",{children:`${ae.name} (${ae.type})`}),e("circle",{cx:D,cy:H,r:4,fill:"var(--text-2)"}),e("text",{x:D,y:H-8,textAnchor:Math.cos(M)>.2?"start":Math.cos(M)<-.2?"end":"middle",fontSize:9,fill:"var(--text-1)",style:{pointerEvents:"none"},children:N})]},ae.id)}),x>0&&(()=>{const ae=E+U/2+.05,de=y+b*2+10,ve=u+de*Math.cos(ae),M=m+de*Math.sin(ae);return e("text",{x:ve,y:M,textAnchor:"middle",fontSize:9,fill:"var(--text-3)",fontStyle:"italic",children:["+",x," more"]})})()]},`leaves-${W}`)})]})})]})}function Xe(t){return t instanceof Dt?"unreachable":"unreadable"}function Ie(t){return t==="unreachable"?`${a("common.serverUnreachable")} ${a("common.serverUnreachableAction")}`:`${a("common.responseUnreadable")} ${a("common.responseUnreadableAction")}`}const wt="memesh.browse.viewMode",Mt=30;function we({label:t,active:s,onClick:n,count:o}){return e("button",{onClick:n,style:{padding:"4px 10px",borderRadius:14,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,o!==void 0&&e("span",{style:{marginLeft:6,opacity:.6,fontFamily:"var(--mono)",fontSize:10},children:o})]})}function ds({manage:t}){const[s,n]=k([]),[o,r]=k([]),[i,d]=k(""),[c,g]=k(!0),[u,m]=k(""),[l,y]=k(0),[b]=Nt(),[h,p]=k(b?"knowledge":"all"),[w,v]=k("all"),[f,_]=k("all"),[A,B]=k("all"),[j,Q]=k("most-recalled"),[q,ee]=k(()=>{try{return localStorage.getItem(wt)==="list"?"list":"roadmap"}catch{return"roadmap"}}),ne=re(0);async function S(){const x=++ne.current;g(!0),m("");try{const[E,U]=await Promise.all([V("GET","/v1/entities?limit=2000&status=all"),Ws().catch(()=>[])]);if(x!==ne.current)return;Array.isArray(E)?n(E):(console.warn("[memesh dashboard] /v1/entities answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",E),n([]),m(Ie("unreadable"))),r(U),y(0),window.dispatchEvent(new Event("memesh:data-changed"))}catch(E){if(x!==ne.current)return;console.warn("[memesh dashboard] /v1/entities failed to load:",E),m(Ie(Xe(E)))}finally{x===ne.current&&g(!1)}}K(()=>{S()},[]),K(()=>{y(0)},[i,h,w,f,A,j]),K(()=>{(h==="knowledge"||h==="all")&&p(b?"knowledge":"all")},[b]);const R=Me(()=>{const x={all:0,knowledge:0,activity:0,reference:0,session:0};for(const E of s)E.archived||E.status==="archived"||(x.all++,x[is(E.type)]++);return x},[s]),G=Me(()=>{const x=i.toLowerCase();return s.filter(E=>!(h!=="all"&&is(E.type)!==h||w!=="all"&&Us(E.last_accessed_at||E.created_at)!==w||f==="recalled"&&(E.access_count??0)===0||f==="never"&&(E.access_count??0)>0||A!=="all"&&Ue(E)!==A||x&&![E.name,E.type,...E.observations??[],...E.tags??[]].join(" ").toLowerCase().includes(x)))},[s,h,w,f,A,i]),be=Me(()=>{const x=[...G];return j==="most-recalled"?x.sort((E,U)=>(U.access_count??0)-(E.access_count??0)||(U.last_accessed_at??U.created_at).localeCompare(E.last_accessed_at??E.created_at)):j==="created"?x.sort((E,U)=>U.created_at.localeCompare(E.created_at)):x.sort((E,U)=>(U.last_accessed_at??U.created_at).localeCompare(E.last_accessed_at??E.created_at)),x},[G,j]),se=be.filter(x=>!x.archived&&x.status!=="archived"),he=be.filter(x=>x.archived||x.status==="archived"),ce=Math.ceil(se.length/Mt),I=se.slice(l*Mt,(l+1)*Mt);async function W(x){if(confirm(a("browse.confirmArchive")))try{await V("POST","/v1/forget",{name:x}),S()}catch(E){m(a("browse.archiveFailed",{message:E.message}))}}async function z(x){try{await V("POST","/v1/remember",{name:x,type:"restored"}),S()}catch(E){m(a("browse.restoreFailed",{message:E.message}))}}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:a(t?"browse.manage":"browse.title")}),!c&&e("div",{style:{fontSize:12,color:"var(--text-3)",marginTop:2},children:[se.length.toLocaleString()," ",a("browse.active"),he.length>0?` · ${he.length} ${a("browse.archived")}`:""]})]}),e("div",{style:{display:"flex",gap:8},children:[e("input",{type:"search",placeholder:a("browse.filter"),value:i,onInput:x=>d(x.target.value),style:{width:240}}),e("button",{class:"btn btn-sm",onClick:S,title:a("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:a("browse.filterCategory")}),e(we,{label:a("cluster.knowledge"),active:h==="knowledge",onClick:()=>p("knowledge"),count:R.knowledge}),e(we,{label:a("cluster.activity"),active:h==="activity",onClick:()=>p("activity"),count:R.activity}),e(we,{label:a("cluster.session"),active:h==="session",onClick:()=>p("session"),count:R.session}),e(we,{label:a("cluster.reference"),active:h==="reference",onClick:()=>p("reference"),count:R.reference}),e(we,{label:a("cluster.all"),active:h==="all",onClick:()=>p("all"),count:R.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:a("browse.filterTime")}),e(we,{label:a("browse.timeToday"),active:w==="today",onClick:()=>v(w==="today"?"all":"today")}),e(we,{label:a("browse.timeWeek"),active:w==="week",onClick:()=>v(w==="week"?"all":"week")}),e(we,{label:a("browse.timeMonth"),active:w==="month",onClick:()=>v(w==="month"?"all":"month")}),e(we,{label:a("browse.timeOlder"),active:w==="older",onClick:()=>v(w==="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:a("browse.filterValue")}),e(we,{label:a("browse.valueRecalled"),active:f==="recalled",onClick:()=>_(f==="recalled"?"all":"recalled")}),e(we,{label:a("browse.valueNever"),active:f==="never",onClick:()=>_(f==="never"?"all":"never")})]}),o.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:a("browse.filterProject")}),e(we,{label:a("cluster.all"),active:A==="all",onClick:()=>B("all")}),o.map(x=>e(we,{label:x.name,count:x.count,active:A===x.name,onClick:()=>B(x.name)},x.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:a("browse.filterSort")}),e("select",{value:j,onChange:x=>Q(x.target.value),style:{padding:"3px 8px",fontSize:12},children:[e("option",{value:"most-recalled",children:a("browse.sortMostRecalled")}),e("option",{value:"recent",children:a("browse.sortRecent")}),e("option",{value:"created",children:a("browse.sortCreated")})]})]}),u&&e("div",{class:"error-box",role:"alert",style:{marginBottom:12},children:u}),c&&e("div",{class:"empty",children:e("div",{class:"loading"})}),!c&&A!=="all"&&q==="roadmap"&&!t&&e(Xn,{projectName:A,entities:se,onSwitchToList:()=>{ee("list");try{localStorage.setItem(wt,"list")}catch{}}}),!c&&(A==="all"||q==="list"||t)&&se.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"})]})}),i?`${a("browse.noMatch")} "${i}"`:a("browse.emptyFilter")]}),!c&&(A==="all"||q==="list"||t)&&I.length>0&&e("div",{children:[A!=="all"&&q==="list"&&!t&&e("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:8},children:e("button",{class:"btn btn-sm",onClick:()=>{ee("roadmap");try{localStorage.setItem(wt,"roadmap")}catch{}},children:a("roadmap.switchToRoadmap")})}),I.map(x=>e("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"14px 0"},children:e(je,{entity:x,highlight:i,actions:t?e("button",{class:"btn btn-danger btn-sm",onClick:()=>W(x.name),children:a("browse.archive")}):void 0})},x.id)),ce>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:l===0,onClick:()=>y(x=>x-1),children:a("browse.prev")}),e("span",{style:{color:"var(--text-3)",fontFamily:"var(--mono)",fontSize:12},children:[l+1," / ",ce]}),e("button",{class:"btn btn-sm",disabled:l>=ce-1,onClick:()=>y(x=>x+1),children:a("browse.next")})]})]}),!c&&he.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:[a("browse.archived")," (",he.length,")"]}),he.slice(0,10).map(x=>e("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"14px 0"},children:e(je,{entity:x,highlight:i,actions:e("button",{class:"btn btn-sm",onClick:()=>z(x.name),children:a("browse.restore")})})},x.id)),he.length>10&&e("div",{style:{fontSize:12,color:"var(--text-3)",padding:"12px 0",textAlign:"center"},children:["+",he.length-10," ",a("browse.moreArchived")]})]})]})})}function us(t){return t>=80?"var(--success)":t>=60?"var(--accent)":t>=40?"var(--warning)":"var(--danger)"}function Qn(t){return t>=80?a("health.excellent"):t>=60?a("health.good"):t>=40?a("health.fair"):a("health.poor")}const Jn=["activity","quality","freshness","lessons"];function ea({score:t,factors:s}){const n=us(t);return e("div",{class:"card",children:[e("div",{class:"card-title",children:a("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 ${n}`,display:"flex",alignItems:"center",justifyContent:"center"},children:e("span",{style:{fontFamily:"var(--mono)",fontSize:"24px",fontWeight:700,color:n,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:Jn.map(o=>{const r=s[o],i=Math.round(r.score/r.weight*100),d=us(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:a(`health.${o}`)}),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:d,transition:"width 600ms ease-out"}})})]},o)})})]})]})}const He=220,_e=36,Se=2;function ta({trend:t}){if(!t||t.length===0)return e("svg",{width:He,height:_e,style:{display:"block"},children:e("line",{x1:0,y1:_e/2,x2:He,y2:_e/2,stroke:"rgba(255,255,255,0.06)",strokeWidth:1})});if(t.length===1){const d=He/2,c=_e/2;return e("svg",{width:He,height:_e,style:{display:"block"},children:[e("line",{x1:Se,y1:_e-Se,x2:He-Se,y2:_e-Se,stroke:"rgba(255,255,255,0.06)",strokeWidth:1}),e("circle",{cx:d,cy:c,r:3,fill:"#00D6B4"})]})}const s=Math.max(1,...t.map(d=>d.count)),n=(He-Se*2)/(t.length-1),o=t.map((d,c)=>{const g=Se+c*n,u=_e-Se-d.count/s*(_e-Se*2);return`${g.toFixed(1)},${u.toFixed(1)}`}),r=`M${o[0]} L${o.slice(1).join(" L")}`,i=`${r} L${Se+(t.length-1)*n},${_e-Se} L${Se},${_e-Se} Z`;return e("svg",{width:He,height:_e,style:{display:"block"},children:[e("path",{d:i,fill:"rgba(0, 214, 180, 0.12)"}),e("path",{d:r,fill:"none",stroke:"#00D6B4",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"}),t.map((d,c)=>{const[g,u]=o[c].split(",");return c===t.length-1?e("circle",{cx:g,cy:u,r:2.5,fill:"#00D6B4"},c):null})]})}function sa({metric:t}){const{reusedThisWeek:s,trend:n,computedFrom:o}=t,r=o==="last_accessed_at_approximation",i=n.slice(0,Math.max(0,n.length-7)).slice(-7).reduce((g,u)=>g+u.count,0),d=n.slice(-7).reduce((g,u)=>g+u.count,0),c=i>0?Math.round((d-i)/i*100):null;return e("div",{class:"card",style:{display:"flex",gap:24,alignItems:"center",flexWrap:"wrap",padding:"20px 24px",background:"linear-gradient(135deg, rgba(0, 214, 180, 0.06) 0%, rgba(0, 214, 180, 0.02) 100%)",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:a("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:"Satoshi, system-ui, sans-serif",letterSpacing:"-0.03em"},children:s>0?s.toLocaleString():"—"}),c!==null&&c!==0&&e("span",{style:{fontSize:12,fontWeight:600,fontFamily:"var(--mono)",color:c>0?"#4ADE80":"#F87171"},children:[c>0?"↑":"↓"," ",Math.abs(c),"%"]})]}),e("div",{style:{fontSize:13,color:"var(--text-1)",marginTop:4},children:s>0?a("loop.subtitleHas"):a("loop.subtitleNone")}),r&&e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:6,fontStyle:"italic"},children:a("loop.approxNote")})]}),e("div",{style:{flex:"0 0 auto",display:"flex",flexDirection:"column",alignItems:"flex-end",gap:4},children:[e(ta,{trend:n}),e("div",{style:{fontSize:10,color:"var(--text-3)",fontFamily:"var(--mono)"},children:a("loop.sparkLabel")})]})]})}const tt=8,na=8,aa=20,st=8,qs=120,Vs="rgba(0, 214, 180, 0.3)",$s="#00D6B4",ra=1.5,ia="#4A5260",oa="9px Satoshi, system-ui, sans-serif";function hs(t,s){t.style.width="";const n=window.devicePixelRatio||1,r=t.getBoundingClientRect().width,i=qs,d=r-st-na,c=i-tt-aa;if(s.length===0||d<=0||c<=0)return;t.width=r*n,t.height=i*n,t.style.width=`${r}px`,t.style.height=`${i}px`;const g=t.getContext("2d");if(!g)return;g.scale(n,n);const u=Math.max(1,...s.map(p=>p.created)),m=Math.max(1,...s.map(p=>p.recalled)),l=Math.max(u,m),y=s.length,b=1,h=Math.max(1,(d-b*(y-1))/y);g.fillStyle=Vs;for(let p=0;p<y;p++){const v=s[p].created/l*c,f=st+p*(h+b),_=tt+c-v;g.fillRect(f,_,h,v)}g.beginPath(),g.strokeStyle=$s,g.lineWidth=ra,g.lineJoin="round",g.lineCap="round";for(let p=0;p<y;p++){const w=s[p],v=st+p*(h+b)+h/2,f=tt+c-w.recalled/l*c;p===0?g.moveTo(v,f):g.lineTo(v,f)}g.stroke(),g.fillStyle=ia,g.font=oa,g.textAlign="center",g.textBaseline="top";for(let p=0;p<y;p+=7){const w=s[p],v=w.date.split("-"),f=v.length>=3?`${v[1]}-${v[2]}`:w.date,_=st+p*(h+b)+h/2,A=tt+c+4;g.fillText(f,_,A)}}function la({data:t}){const s=re(null);K(()=>{const r=s.current;if(!r)return;hs(r,t);const i=new ResizeObserver(()=>hs(r,t));return i.observe(r),()=>i.disconnect()},[t]);const n=t.reduce((r,i)=>r+i.created,0),o=t.reduce((r,i)=>r+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:a("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:2,background:Vs}}),a("timeline.created"),e("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:n})]}),e("span",{style:{display:"flex",alignItems:"center",gap:4},children:[e("span",{style:{display:"inline-block",width:10,height:2,borderRadius:1,background:$s}}),a("timeline.recalled"),e("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:o})]})]})]}),e("canvas",{ref:s,style:{width:"100%",height:`${qs}px`,display:"block"}})]})}const _t=["week","month","quarter","older"];function ca(t){return a(`ageMatrix.bucket.${t}`)}const da=["lesson_learned","lesson","mistake","decision","architecture_decision","pattern","technical_pattern","best_practice","bug_fix","workflow_checkpoint","process","architecture","feature"];function ua(t){return a(`ageMatrix.type.${t}`)}function ha(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 ga({data:t}){if(!t||t.length===0)return null;const s=new Map;for(const r of t)s.has(r.type)||s.set(r.type,new Map),s.get(r.type).set(r.bucket,r.count);const n=da.filter(r=>s.has(r)),o=Math.max(1,...t.map(r=>r.count));return e("div",{class:"card",children:[e("div",{class:"card-title",style:{marginBottom:16},children:a("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%"}}),_t.map(r=>e("col",{style:{width:"18%"}},r))]}),e("thead",{children:e("tr",{children:[e("th",{style:{textAlign:"left",padding:"4px 8px",color:"var(--text-2)",fontWeight:400},children:a("ageMatrix.typeColumn")}),_t.map(r=>e("th",{style:{textAlign:"center",padding:"4px 6px",color:"var(--text-2)",fontWeight:400},children:ca(r)},r))]})}),e("tbody",{children:n.map(r=>{const i=s.get(r),d=Array.from(i.values()).reduce((c,g)=>c+g,0);return e("tr",{children:[e("td",{style:{padding:"5px 8px",color:"var(--text-1)",fontSize:11,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:[ua(r),e("span",{style:{color:"var(--text-3)",marginLeft:4},children:["(",d,")"]})]}),_t.map(c=>{const g=i.get(c)??0;return e("td",{style:{textAlign:"center",padding:"5px 6px",background:ha(g,o),borderRadius:4,color:g>0?"var(--accent)":"var(--text-3)",fontFamily:"var(--mono)",fontWeight:g>0?600:400,fontSize:11,transition:"background 0.2s"},children:g>0?g:"·"},c)})]},r)})})]})}),e("div",{style:{marginTop:10,fontSize:11,color:"var(--text-3)",display:"flex",alignItems:"center",gap:6},children:[e("span",{children:a("ageMatrix.low")}),[.15,.35,.55,.7].map(r=>e("span",{style:{display:"inline-block",width:14,height:10,borderRadius:2,background:`rgba(0,214,180,${r})`}},r)),e("span",{children:a("ageMatrix.high")}),e("span",{style:{marginLeft:8},children:["— ",a("ageMatrix.legend")]})]})]})}function gs(t){return a(`radar.axis.${t}`)}const ze=220,Gs=ze/2,Ks=ze/2,nt=80,at=14;function rt(t,s){const n=(t-90)*(Math.PI/180);return[Gs+s*Math.cos(n),Ks+s*Math.sin(n)]}function ma({data:t}){if(!t||t.length===0)return null;const s=t.length,n=Math.max(1,...t.map(c=>c.count)),o=t.map((c,g)=>360/s*g),r=t.map((c,g)=>{const u=c.count/n,m=at+u*(nt-at);return rt(o[g],m)}),i=r.map((c,g)=>`${g===0?"M":"L"}${c[0].toFixed(1)},${c[1].toFixed(1)}`).join(" ")+" Z",d=[.25,.5,.75,1];return e("div",{class:"card",children:[e("div",{class:"card-title",style:{marginBottom:8},children:a("radar.title")}),e("div",{style:{display:"flex",alignItems:"center",gap:16,flexWrap:"wrap"},children:[e("svg",{width:ze,height:ze,viewBox:`0 0 ${ze} ${ze}`,style:{flexShrink:0},children:[d.map(c=>{const g=o.map(u=>{const m=at+c*(nt-at),[l,y]=rt(u,m);return`${l.toFixed(1)},${y.toFixed(1)}`});return e("polygon",{points:g.join(" "),fill:"none",stroke:"rgba(255,255,255,0.06)",strokeWidth:1},c)}),o.map((c,g)=>{const[u,m]=rt(c,nt);return e("line",{x1:Gs,y1:Ks,x2:u.toFixed(1),y2:m.toFixed(1),stroke:"rgba(255,255,255,0.06)",strokeWidth:1},g)}),e("path",{d:i,fill:"rgba(0,214,180,0.15)",stroke:"#00D6B4",strokeWidth:1.5,strokeLinejoin:"round"}),r.map(([c,g],u)=>e("circle",{cx:c.toFixed(1),cy:g.toFixed(1),r:3,fill:"#00D6B4"},u)),t.map((c,g)=>{const u=o[g],[m,l]=rt(u,nt+18),y=gs(c.axis);return e("text",{x:m.toFixed(1),y:l.toFixed(1),textAnchor:"middle",dominantBaseline:"middle",fontSize:9,fill:"var(--text-2)",fontFamily:"Satoshi, system-ui, sans-serif",children:y},g)})]}),e("div",{style:{flex:1,minWidth:120},children:[t.map(c=>{const g=n>0?c.count/n: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:gs(c.axis)}),e("span",{style:{color:"var(--accent)",fontFamily:"var(--mono)",fontSize:10},children:c.count})]}),e("div",{style:{height:3,background:"rgba(255,255,255,0.06)",borderRadius:2,overflow:"hidden"},children:e("div",{style:{width:`${(g*100).toFixed(1)}%`,height:"100%",background:"#00D6B4",borderRadius:2,transition:"width 0.3s"}})})]},c.axis)}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:6},children:a("radar.caption")})]})]})]})}function pa({data:t}){const{workSchedule:s,toolPreferences:n,focusAreas:o,workflow:r,strengths:i,learningAreas:d}=t,c=new Map;for(const l of s.hourDistribution)c.set(l.hour,l.count);const g=Math.max(1,...s.hourDistribution.map(l=>l.count)),u=[...s.hourDistribution].sort((l,y)=>y.count-l.count).slice(0,3).map(l=>`${l.hour.toString().padStart(2,"0")}:00`),m=[...s.dayDistribution].sort((l,y)=>y.count-l.count).slice(0,2).map(l=>l.day);return e("div",{class:"card",children:[e("div",{class:"card-title",children:a("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:a("patterns.workSchedule")}),e("div",{style:{display:"flex",gap:2,flexWrap:"wrap"},children:Array.from({length:24},(l,y)=>{const b=c.get(y)||0,h=b/g;return e("div",{title:`${y.toString().padStart(2,"0")}:00 — ${b}`,style:{width:18,height:18,borderRadius:"var(--radius-xs)",background:h>0?`rgba(0, 214, 180, ${.1+h*.7})`:"var(--bg-0)",border:"1px solid var(--border-subtle)",fontSize:8,display:"flex",alignItems:"center",justifyContent:"center",color:h>.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:[a("patterns.peakHours"),": ",u.join(", "),m.length>0&&e("span",{children:[" · ",a("patterns.busiestDays"),": ",m.join(", ")]})]})]}),n.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:a("patterns.tools")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:n.slice(0,10).map(l=>e("span",{class:"tag",style:{fontSize:11,padding:"2px 8px"},children:[l.tool," ",e("span",{style:{opacity:.5},children:["(",l.sessions,")"]})]},l.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:a("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:r.avgSessionMinutes>0?`${Math.round(r.avgSessionMinutes)}m`:"—"}),e("div",{class:"stat-lbl",children:a("patterns.avgSession")})]}),e("div",{class:"stat",style:{padding:12},children:[e("div",{class:"stat-val",style:{fontSize:18},children:r.totalSessions>0?r.commitsPerSession.toFixed(1):"—"}),e("div",{class:"stat-lbl",children:a("patterns.commitsPerSession")})]})]})]}),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:a("patterns.focus")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:o.slice(0,12).map(l=>e("span",{class:"tag",style:{fontSize:11,padding:"2px 8px"},children:[l.type," ",e("span",{style:{opacity:.5},children:["(",l.count,")"]})]},l.type))})]}),(i.length>0||d.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:a("patterns.strengths")}),i.slice(0,5).map(l=>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:l.type}),e("span",{style:{fontFamily:"var(--mono)",fontSize:11,color:"var(--accent)"},children:[Math.round(l.avgConfidence*100),"%"]})]}),e("div",{style:{height:3,borderRadius:2,background:"var(--bg-0)"},children:e("div",{style:{height:"100%",width:`${Math.round(l.avgConfidence*100)}%`,borderRadius:2,background:"rgba(0, 214, 180, 0.5)",transition:"width 600ms ease-out"}})})]},l.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:a("patterns.learning")}),d.slice(0,5).map(l=>e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:6,fontSize:12},children:[e("span",{style:{color:"var(--text-1)"},children:l.tag}),e("span",{style:{fontFamily:"var(--mono)",fontSize:11,color:"var(--text-3)"},children:l.count})]},l.tag)),d.length===0&&e("div",{style:{fontSize:11,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]})]})]})}const fa={dreamer:"Weekly recap (dreamer)",pattern_detector:"Pattern detector",consolidator:"Consolidator",auto_tagger:"Auto-tagger",failure_analyzer:"Failure analyzer"};function ms(t){return`${Math.round(t*100)}%`}function ba(t){return t==null?"—":t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`}function ya(){const[t,s]=k(null),[n,o]=k(""),[r,i]=k(null),[d,c]=k(!0),[g,u]=k(30);return K(()=>{let m=!1;return c(!0),o(""),V("GET",`/v1/telemetry?window=${g}`).then(l=>{if(!m){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),i("unreadable"),s(null);return}i(null),s(l)}}).catch(l=>{m||(console.warn("[memesh dashboard] /v1/telemetry failed to load:",l),i(Xe(l)),o(l instanceof Error?l.message:String(l)))}).finally(()=>{m||c(!1)}),()=>{m=!0}},[g]),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:a("telemetry.title")}),e("div",{style:{display:"flex",gap:4,fontSize:12},children:[7,30,90].map(m=>e("button",{class:"btn btn-ghost",style:{padding:"2px 8px",fontSize:11,border:"1px solid "+(g===m?"var(--accent)":"var(--border)"),color:g===m?"var(--accent)":"var(--text-2)",background:g===m?"rgba(0,214,180,0.10)":"transparent"},onClick:()=>u(m),children:a("telemetry.lastNDays",{n:m})},m))})]}),d&&e("div",{style:{color:"var(--text-3)",fontSize:13},children:a("telemetry.loading")}),!d&&r&&e("div",{class:"error-box",role:"alert",style:{fontSize:13},children:Ie(r)}),!d&&!r&&t&&t.summaries.length===0&&e("div",{style:{color:"var(--text-2)",fontSize:13,padding:8},children:a("telemetry.empty")}),!d&&!r&&t&&t.summaries.length>0&&e("div",{style:{display:"flex",flexDirection:"column",gap:12},children:t.summaries.map(m=>{const l=m.total_attempts>0?m.successes/m.total_attempts:0,y=m.total_calls>0?m.fallback_used/m.total_calls:0,b=fa[m.flow]??m.flow,h=Object.entries(m.by_provider),p=Object.entries(m.by_model),w=Object.entries(m.by_project),v=Object.entries(m.by_error_class).sort((f,_)=>_[1]-f[1]);return e("div",{style:{padding:12,background:"var(--bg-1)",borderRadius:4,borderLeft:`2px solid ${l>=.9?"var(--accent)":l>=.5?"#FFC800":"#FF5050"}`},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"baseline",marginBottom:6},children:[e("span",{style:{fontWeight:600},children:b}),e("span",{style:{fontSize:12,color:"var(--text-3)"},children:[a("telemetry.callsCount",{n:m.total_calls})," · ",a("telemetry.attemptsCount",{n:m.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:[a("telemetry.successRate"),": "]}),e("strong",{style:{color:l>=.9?"var(--accent)":l>=.5?"#FFC800":"#FF5050"},children:ms(l)})]}),e("span",{children:[e("span",{style:{color:"var(--text-3)"},children:[a("telemetry.medianLatency"),": "]}),e("strong",{children:ba(m.median_latency_ms)})]}),m.fallback_used>0&&e("span",{style:{color:"#FFC800"},children:["⚠️ ",a("telemetry.fallbackUsed",{n:m.fallback_used,pct:ms(y)})]})]}),h.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[a("telemetry.byProvider"),":"," ",h.map(([f,_])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[f," ",_.ok,"/",_.ok+_.fail]},f))]}),p.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[a("telemetry.byModel"),":"," ",p.map(([f,_])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[f," ",_.ok,"/",_.ok+_.fail]},f))]}),w.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[a("telemetry.byProject"),":"," ",w.map(([f,_])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[f," ",_.ok,"/",_.ok+_.fail]},f))]}),v.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)"},children:[a("telemetry.errors"),":"," ",v.map(([f,_])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11,background:f==="auth"?"rgba(255,80,80,0.12)":"rgba(255,200,0,0.10)",color:f==="auth"?"#FF5050":"#FFC800"},children:[f," ×",_]},f))]})]},m.flow)})})]})}function ps(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 va(){const[t,s]=k(null),[n,o]=k(null);if(K(()=>{V("GET","/v1/analytics/pm").then(d=>{d!==null&&!ps(d)&&console.warn("[PmAnalyticsPanel] /v1/analytics/pm answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",d),s(d)}).catch(d=>o(String(d)))},[]),n)return console.warn("[PmAnalyticsPanel]",n),null;if(!ps(t))return null;const r=(t.connectedness.orphanRate*100).toFixed(1),i=t.connectedness.orphanRate>.7?"#ef4444":t.connectedness.orphanRate>.4?"#f59e0b":"#22c55e";return e("div",{class:"card",style:{marginTop:8,padding:16},children:[e("div",{class:"card-title",style:{marginBottom:12},children:a("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:a("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:a("pm.openDecisions")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)",color:i},children:[r,"%"]}),e("div",{style:{fontSize:11,color:"var(--text-2)",marginTop:2},children:a("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:a("pm.relationsTotal")})]})]}),t.staleness.stalePlanCount>0&&e("div",{style:{marginTop:10,fontSize:12,color:"#f59e0b"},children:a("pm.stalePlans",{count:t.staleness.stalePlanCount})})]})}const ka=["activity","quality","freshness","lessons"];function xa(t){return typeof t?.totalEntities=="number"&&typeof t.totalObservations=="number"&&typeof t.totalRelations=="number"&&typeof t.totalTags=="number"&&Array.isArray(t.tagDistribution)}function St(t,s,n){return!n&&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),n}function wa(t){if(typeof t?.healthScore!="number")return!1;const s=t.healthFactors;if(!s)return!1;for(const n of ka)if(typeof s[n]?.score!="number"||typeof s[n]?.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 _a(){const[t,s]=k(null),[n,o]=k(null),[r,i]=k(null),[d,c]=k(!0),[g,u]=k(null),m=ye(()=>{c(!0);let l=!1,y=!1;const b=h=>p=>(console.warn(`[memesh dashboard] ${h} failed to load:`,p),Xe(p)==="unreachable"?l=!0:y=!0,null);Promise.all([V("GET","/v1/stats").catch(b("/v1/stats")),V("GET","/v1/analytics").catch(b("/v1/analytics")),V("GET","/v1/patterns").catch(b("/v1/patterns"))]).then(([h,p,w])=>{const v=St("/v1/stats",h,xa(h)),f=St("/v1/analytics",p,wa(p)),_=St("/v1/patterns",w,Ma(w));(h!==null&&!v||p!==null&&!f||w!==null&&!_)&&(y=!0),s(v?h:null),o(f?p:null),i(_?w:null),u(l?"unreachable":y?"unreadable":null)}).finally(()=>c(!1))},[]);return K(()=>{m()},[m]),d?e("div",{class:"empty",children:e("div",{class:"loading"})}):!t&&!n?e("div",{class:"error-box",role:"alert",children:g?Ie(g):`${a("common.error")}: ${a("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()}),e("div",{class:"stat-lbl",children:a("analytics.totalMemories")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalObservations.toLocaleString()}),e("div",{class:"stat-lbl",children:a("analytics.knowledgeFacts")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalRelations.toLocaleString()}),e("div",{class:"stat-lbl",children:a("analytics.connections")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalTags.toLocaleString()}),e("div",{class:"stat-lbl",children:a("analytics.topics")})]})]}),n&&e("div",{style:{marginTop:8},children:e(sa,{metric:n.loopMetric})}),n&&e("div",{style:{marginTop:8},children:e(ea,{score:n.healthScore,factors:n.healthFactors})}),n&&e("div",{style:{marginTop:8},children:e(la,{data:n.timeline})}),n&&e("div",{style:{marginTop:8,display:"grid",gridTemplateColumns:"minmax(0, 1.4fr) minmax(0, 1fr)",gap:8},children:[e(ga,{data:Array.isArray(n.ageMatrix)?n.ageMatrix:[]}),e(ma,{data:Array.isArray(n.knowledgeRadar)?n.knowledgeRadar:[]})]}),r&&e("div",{style:{marginTop:8},children:e(pa,{data:r})}),e("div",{style:{marginTop:8},children:e(ya,{})}),e(va,{}),t&&(()=>{const l=["auto_saved","auto-tracked","session_end","session:","source:","scope:","date:","urgency:"],y=t.tagDistribution.filter(b=>!l.some(h=>b.tag.startsWith(h))&&!/^\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:a("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})()]})}function Sa(t){return typeof t?.config=="object"&&t.config!==null}function Ca(t){return typeof t?.checkSucceeded=="boolean"&&typeof t.freshness=="string"&&typeof t.updateAvailable=="boolean"}function fs(t){return t&&t.charAt(0).toUpperCase()+t.slice(1)}function bs(t,s){if(!s)return"—";const n=new Date(s);return Number.isNaN(n.getTime())?s:n.toLocaleString(t)}function La(t){switch(t){case"npm-global":return a("settings.installNpmGlobal");case"npm-local":return a("settings.installNpmLocal");case"source-checkout":return a("settings.installSourceCheckout");default:return a("settings.installUnknown")}}function Ta(t){switch(t){case"npm-global":return a("settings.updateGuidanceNpmGlobal");case"npm-local":return a("settings.updateGuidanceNpmLocal");case"source-checkout":return a("settings.updateGuidanceSourceCheckout");default:return a("settings.updateGuidanceUnknown")}}function Aa({locale:t,onLocaleChange:s}){const[n,o]=k(null),[r,i]=k(null),[d,c]=k(""),[g,u]=k(""),[m,l]=k(""),[y,b]=k(""),[h,p]=k(""),[w,v]=k(!1),[f,_]=k(!1),[A,B]=k(""),[j,Q]=k(null),[q,ee]=k(!1),[ne,S]=k(!0),[R,G]=k(!0),[be,se]=k(!1);async function he(P=!0,C=!1){C?se(!0):G(!0);try{const L=await V("GET",P?"/v1/update-status":"/v1/update-status?cached=1");if(!Ca(L)){console.warn("[memesh dashboard] /v1/update-status answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",L),C||i(null);return}i(L)}catch{C||i(null)}finally{C?se(!1):G(!1)}}K(()=>{let P=!1;return V("GET","/v1/config").then(C=>{if(!Sa(C)){C!==null&&console.warn("[memesh dashboard] /v1/config answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",C),o(null);return}o(C);const $=C.config.llm?.provider||"",L=C.config.llm?.model||"";c($),l(L),b($),p(L),v(!!C.config.llm?.apiKey)}).catch(C=>{console.warn("[memesh dashboard] /v1/config failed to load:",C),o(null)}).finally(()=>S(!1)),(async()=>(await he(!1),P||he(!0,!0)))(),()=>{P=!0}},[]);async function ce(){ee(!0),B(""),Q(null);try{const P=await V("POST","/v1/config/test",{provider:d,...g?{apiKey:g}:{}});Q(P),P.valid&&!m&&P.suggested&&l(P.suggested)}catch(P){Q({valid:!1,error:P.message})}finally{ee(!1)}}function I(P){c(P),Q(null),l("")}function W(P){u(P),Q(null)}async function z(){_(!0),B("");try{const P={provider:d};m&&(P.model=m),g&&(P.apiKey=g),await V("POST","/v1/config",{llm:P}),B(a("settings.saved")),g&&v(!0),u(""),Q(null),b(d),p(m)}catch(P){B(a("common.error")+": "+P.message)}finally{_(!1)}}async function x(){if(confirm(a("settings.removeProviderConfirm"))){_(!0),B("");try{await V("POST","/v1/config",{llm:null}),c(""),l(""),u(""),b(""),p(""),v(!1),Q(null),B(a("settings.providerRemoved"))}catch(P){B(a("common.error")+": "+P.message)}finally{_(!1)}}}async function E(P,C){B("");try{await V("POST","/v1/config",P),o($=>$&&C($)),B(a("settings.saved"))}catch($){B(a("common.error")+": "+$.message)}}if(ne)return e("div",{class:"empty",children:e("div",{class:"loading"})});const U=n?.capabilities,ae=U?.searchLevel?a("settings.smartMode"):a("settings.core"),de=R||be&&!r,ve=R||be,M=!!r?.currentVersionDeprecated,F=!!(r?.latestVersion&&r.latestVersion!==r.currentVersion),D=!!(M&&r?.latestVersion&&r.latestVersion===r.currentVersion&&r?.freshness==="fresh"),H=!!(r?.checkSucceeded&&r?.lastError),N=de?a("settings.updateChecking"):r?M?a(F?"settings.updateAvailable":D?"settings.updateDeprecatedNoTarget":"settings.updateDeprecatedTargetUnknown"):r.freshness==="unavailable"?a("settings.updateNoSuccessfulChecks"):!r.checkSucceeded&&r.freshness==="stale"?a("settings.updateStale"):!r.checkSucceeded&&r.freshness==="cached"?a("settings.updateCachedFallback"):r.updateAvailable?a("settings.updateAvailable"):a(H?"settings.updatePartialSummary":"settings.upToDate"):a("settings.updateUnavailable"),Y=r?M?"var(--danger)":r.freshness==="unavailable"||!r.checkSucceeded&&r.freshness==="stale"?"var(--warning)":!r.checkSucceeded&&r.freshness==="cached"||r.updateAvailable?"var(--info)":H?"var(--warning)":"var(--success)":"var(--warning)",X=r?.freshness==="stale"?a("settings.updateSourceStale"):r?.source==="cache"?a("settings.updateSourceCached"):r?.source==="fresh"?a("settings.updateSourceFresh"):a("settings.updateSourceUnavailable"),pe=La(r?.installChannel),ue=Ta(r?.installChannel),xe=de?a("common.loading"):bs(t,r?.lastAttemptAt||null),ke=de?a("common.loading"):bs(t,r?.lastSuccessfulCheckAt||null),Be=!!r?.lastSuccessfulCheckAt,Ze=!!r?.lastError&&!de;return e("div",{children:[e("div",{class:"card",children:[e("div",{class:"card-title",children:a("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:ae}),e("div",{class:"stat-lbl",children:a("settings.searchMode")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:14},children:fs(U?.embeddings||"—")}),e("div",{class:"stat-lbl",children:a("settings.embeddings")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:14},children:fs(U?.llm?.provider||a("settings.none"))}),e("div",{class:"stat-lbl",children:a("settings.llmProvider")})]})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:a("settings.llmProvider")}),e("div",{style:{padding:"10px 12px",marginBottom:14,background:"var(--bg-2)",border:"1px solid var(--border-subtle)",borderRadius:6,fontSize:12,lineHeight:1.55,color:"var(--text-2)"},children:[e("div",{style:{fontWeight:600,color:"var(--text-1)",marginBottom:4},children:a("settings.llmOptional.title")}),e("div",{style:{marginBottom:6},children:a("settings.llmOptional.body")}),e("div",{children:[e("strong",{children:a("settings.llmOptional.coreLabel")})," — ",a("settings.llmOptional.coreFeatures")]}),e("div",{children:[e("strong",{children:a("settings.llmOptional.smartLabel")})," — ",a("settings.llmOptional.smartFeatures")]})]}),e("form",{onSubmit:P=>{P.preventDefault(),z()},children:[e("div",{style:{display:"flex",gap:16,marginBottom:14},children:[["anthropic","Anthropic (Claude)"],["openai","OpenAI"],["ollama","Ollama (Local)"]].map(([P,C])=>e("label",{style:{display:"flex",alignItems:"center",gap:5,cursor:"pointer",fontSize:13},children:[e("input",{type:"radio",name:"provider",value:P,checked:d===P,onChange:()=>I(P)}),C]},P))}),d&&d!=="ollama"&&e("div",{style:{marginBottom:12},children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:a("settings.apiKey")}),e("div",{style:{display:"flex",gap:8},children:[e("input",{type:"password",autoComplete:"off",placeholder:d==="anthropic"?"sk-ant-api03-…":"sk-…",value:g,onInput:P=>W(P.target.value),style:{flex:1}}),e("button",{type:"button",class:"btn",onClick:()=>void ce(),disabled:d===""||q||d!=="ollama"&&g==="",style:{flexShrink:0},children:a(q?"settings.testing":"settings.test")})]})]}),d==="ollama"&&e("div",{style:{marginBottom:12},children:e("button",{type:"button",class:"btn",onClick:()=>void ce(),disabled:q,children:a(q?"settings.testing":"settings.test")})}),j&&e("div",{style:{marginBottom:12,padding:"8px 10px",borderRadius:4,fontSize:12,background:j.valid?"rgba(0, 214, 180, 0.08)":"rgba(255, 107, 107, 0.08)",border:`1px solid ${j.valid?"rgba(0, 214, 180, 0.4)":"rgba(255, 107, 107, 0.4)"}`,color:j.valid?"var(--accent)":"var(--danger)"},children:j.valid?a("settings.testPassed",{count:j.models?.length??0}):`✗ ${j.error||a("settings.testFailed")}`}),j?.valid&&j.models&&j.models.length>0&&e("div",{style:{marginBottom:14},children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:[a("settings.model"),j.suggested&&e("span",{style:{marginLeft:6,color:"var(--text-3)",fontWeight:400},children:["(",a("settings.suggested"),": ",e("span",{style:{color:"var(--accent)"},children:j.suggested}),")"]})]}),e("select",{value:m,onChange:P=>l(P.target.value),style:{width:"100%"},children:j.models.map(P=>e("option",{value:P.id,children:[P.id,P.created?` — ${P.created.slice(0,10)}`:""]},P.id))})]}),(()=>{const C=(d!==y||!!g||m!==h)&&!j?.valid;return e("div",{style:{display:"flex",gap:10,alignItems:"center",flexWrap:"wrap"},children:[e("button",{class:"btn btn-primary",type:"submit",disabled:!d||f||C,children:a(f?"settings.saving":"settings.save")}),w&&e("button",{type:"button",class:"btn",onClick:x,disabled:f,style:{borderColor:"var(--danger)",color:"var(--danger)",background:"transparent"},title:a("settings.removeProviderHint"),children:a("settings.removeProvider")}),C&&e("span",{style:{fontSize:11,color:"var(--text-3)"},children:a("settings.testRequired")}),A&&e("span",{style:{fontSize:12,color:A.startsWith(a("common.error"))?"var(--danger)":"var(--success)"},children:A})]})})()]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:a("settings.updates")}),r?.currentVersionDeprecated&&r.deprecationMessage&&e("div",{style:{background:"rgba(255, 107, 107, 0.08)",border:"1px solid rgba(255, 107, 107, 0.4)",borderRadius:4,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:a("settings.updateDeprecatedTitle",{version:r.currentVersion})}),e("div",{style:{marginTop:4,opacity:.9},children:r.deprecationMessage})]}),r&&r.checkSucceeded&&r.lastError&&e("div",{style:{background:"rgba(255, 200, 87, 0.08)",border:"1px solid rgba(255, 200, 87, 0.4)",borderRadius:4,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:a("settings.updatePartialTitle")}),e("div",{style:{marginTop:4,opacity:.9},children:a("settings.updatePartialDescription",{message:r.lastError??""})})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,alignItems:"baseline",marginBottom:12,flexWrap:"wrap"},children:[e("div",{style:{color:Y,fontSize:13,fontWeight:600},children:N}),e("div",{style:{display:"flex",gap:10,alignItems:"center",flexWrap:"wrap"},children:[!de&&r&&e("div",{style:{fontSize:11,color:"var(--text-2)"},children:X}),e("button",{class:"btn btn-sm",type:"button",onClick:()=>{he(!0,!!r)},disabled:ve,children:a(ve?"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:a("settings.installMethod")}),e("span",{style:{color:"var(--text-0)"},children:de?a("common.loading"):pe})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:a("settings.currentVersion")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:r?.currentVersion||"—"})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:a("settings.latestVersion")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:r?.latestVersion||"—"})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:a("settings.lastAttempted")}),e("span",{style:{color:"var(--text-0)"},children:xe})]}),Be&&e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:12},children:[e("span",{style:{color:"var(--text-2)"},children:a("settings.lastSuccessful")}),e("span",{style:{color:"var(--text-0)"},children:ke})]}),!R&&e("div",{style:{color:"var(--text-2)",fontSize:12,lineHeight:1.5,marginTop:2},children:ue}),Ze&&e("div",{style:{color:"var(--warning)",fontSize:12,lineHeight:1.5},children:a("settings.updateLastError",{message:r?.lastError||""})}),r?.recommendedCommand&&e("div",{style:{display:"grid",gap:6,marginTop:4},children:[e("span",{style:{color:"var(--text-2)",fontSize:12},children:a("settings.updateCommand")}),e("code",{style:{color:"var(--text-0)",background:"var(--bg-input)",border:"1px solid var(--border)",borderRadius:6,padding:"8px 10px",fontSize:12,fontFamily:"var(--mono)"},children:r.recommendedCommand})]})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:a("settings.behaviourTitle")}),e("div",{style:{marginTop:8},children:[e("label",{style:{fontSize:12,color:"var(--text-2)",display:"block",marginBottom:4},children:a("settings.autoUpdateLabel")}),e("select",{value:n?.config.autoUpdate??"off",onChange:async P=>{const C=P.target.value;await E({autoUpdate:C},$=>({...$,config:{...$.config,autoUpdate:C}}))},style:{fontSize:13,padding:"6px 10px",borderRadius:6,border:"1px solid var(--border)",background:"var(--bg-input)",color:"var(--text-1)",cursor:"pointer"},children:[e("option",{value:"off",children:a("settings.autoUpdateOff")}),e("option",{value:"patch",children:a("settings.autoUpdatePatch")}),e("option",{value:"minor",children:a("settings.autoUpdateMinor")}),e("option",{value:"major",children:a("settings.autoUpdateMajor")})]}),e("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:4},children:a("settings.autoUpdateHint")})]}),e("div",{style:{marginTop:16,paddingTop:14,borderTop:"1px solid var(--border-subtle)"},children:e("label",{style:{display:"flex",alignItems:"flex-start",gap:8,cursor:"pointer"},children:[e("input",{type:"checkbox",checked:!!n?.config.enableAgenticOrchestration,onChange:async P=>{const C=P.target.checked;await E({enableAgenticOrchestration:C},$=>({...$,config:{...$.config,enableAgenticOrchestration:C}}))},style:{marginTop:2}}),e("span",{children:[e("span",{style:{fontSize:13,color:"var(--text-1)"},children:a("settings.agenticLabel")}),e("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:2},children:a("settings.agenticHint")})]})]})})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:a("settings.language")}),e("select",{value:t,onChange:P=>{const C=P.target.value;wn(C),s(C)},style:{fontSize:13,padding:"6px 10px",borderRadius:6,border:"1px solid var(--border)",background:"var(--bg-input)",color:"var(--text-1)",cursor:"pointer"},children:Mn().map(P=>e("option",{value:P.code,children:P.name},P.code))})]})]})}function Pa(t){return Array.isArray(t?.entities)&&Array.isArray(t.relations)}const Ra={decision:"#00D6B4",pattern:"#60A5FA",lesson_learned:"#FFB84D",commit:"#A78BFA","session-insight":"#7A828E",session_keypoint:"#4ADE80",session_identity:"#F472B6",workflow_checkpoint:"#38BDF8",feature:"#FB923C",bug_fix:"#F87171",concept:"#00D6B4",tool:"#818CF8",person:"#E879F9",note:"#94A3B8"},Ea="#B8BEC6";function ys(t){return Ra[t]||Ea}function Da(t){const s=Math.max(0,Math.min(1,(t-.15)/.85)),n=Math.round(248+-248*s),o=Math.round(113+101*s),r=Math.round(113+67*s);return`rgb(${n},${o},${r})`}function Fa(t){const s=t??0;return s===0?5:Math.min(14,5+Math.log2(s+1)*2)}function Ha(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 Ia(t){const s=Date.now()-new Date(t).getTime(),n=Math.floor(s/864e5);return n<1?a("graph.ageToday"):n<7?a("graph.ageDaysAgo",{count:n}):n<30?a("graph.ageWeeksAgo",{count:Math.floor(n/7)}):a("graph.ageDaysAgo",{count:n})}const vs=440,it=4;function Ba(){const[t,s]=k(null),[n,o]=k(!0),[r,i]=k(null),[d,c]=k({}),[g]=Nt(),[u,m]=k(""),[l,y]=k(null),[b,h]=k(!1),p=re(null),w=re([]),v=re([]),f=re(0),_=re({scale:1,panX:0,panY:0}),A=re({active:!1,startScreenX:0,startScreenY:0,startPanX:0,startPanY:0,moved:!1}),B=re({node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1}),j=re(null),Q=re({x:0,y:0,node:null}),q=re(800),ee=re(d),ne=re(u),S=re(l),R=re(b);K(()=>{ee.current=d},[d]),K(()=>{if(!t)return;const M=new Set(t.noiseTypes??[]);c(F=>{const D={...F};let H=!1;for(const N of M){const Y=!g;D[N]!==Y&&(D[N]=Y,H=!0)}return H?D:F})},[g,t]),K(()=>{ne.current=u},[u]),K(()=>{S.current=l},[l]),K(()=>{R.current=b},[b]),K(()=>{Rn().then(M=>{if(!Pa(M)){console.warn("[memesh dashboard] /v1/graph answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",M),i("unreadable"),s(null);return}i(null),s(M);const F=new Set(Array.isArray(M.noiseTypes)?M.noiseTypes:[]),D={};M.entities.forEach(H=>{D[H.type]=D[H.type]??(g?!F.has(H.type):!0)}),c(D)}).catch(M=>{console.warn("[memesh dashboard] /v1/graph failed to load:",M),i(Xe(M))}).finally(()=>o(!1))},[]),K(()=>{if(!t||n)return;const M=p.current;if(!M)return;const F=M.parentElement?.getBoundingClientRect(),D=F?Math.floor(F.width)-24:800,H=vs,N=window.devicePixelRatio||1;M.width=D*N,M.height=H*N,M.style.width=D+"px",M.style.height=H+"px",q.current=D;const Y=new Set;t.relations.forEach(C=>{Y.add(C.from),Y.add(C.to)});const X=new Map;t.entities.forEach(C=>{const $=C.last_accessed_at||C.created_at;X.set(C.name,{id:C.name,type:C.type,x:Math.random()*D*.8+D*.1,y:Math.random()*H*.8+H*.1,vx:0,vy:0,radius:Fa(C.access_count),recency:Ha($),isOrphan:!Y.has(C.name),lastDate:$})}),w.current=Array.from(X.values()),v.current=t.relations.filter(C=>X.has(C.from)&&X.has(C.to));const pe=C=>{if(ee.current[C.type]===!1)return!1;const L=S.current;return L?C.id===L?!0:v.current.some(Ee=>Ee.from===L&&Ee.to===C.id||Ee.to===L&&Ee.from===C.id):!0},ue=C=>{const $=X.get(C.from),L=X.get(C.to);return!$||!L?!1:pe($)&&pe(L)},xe=C=>{const $=ne.current.toLowerCase();return $?C.id.toLowerCase().includes($):!1};let ke=1;const Be=.005,Ze=()=>{ke=.3};window.__graphReheat=Ze;const P=()=>{const C=w.current,$=v.current,L=M.getContext("2d");if(!L)return;const Ce=window.devicePixelRatio||1;ke=Math.max(0,ke-Be);const Ee=ke>0,Wt=.85,Zs=2e3*ke,Qs=80,Js=.02*ke,Ut=.02*ke,en=C.length>200,qt=D/2,Vt=H/2,Qe=new Map(C.map(T=>[T.id,T]));if(Ee){for(let T=0;T<C.length;T++)for(let O=T+1;O<C.length;O++){const J=C[O].x-C[T].x,fe=C[O].y-C[T].y,ge=J*J+fe*fe;if(en&&ge>9e4)continue;const me=Math.sqrt(ge)||1,Le=Zs/(me*me),Te=J/me*Le,Fe=fe/me*Le;C[T].vx-=Te,C[T].vy-=Fe,C[O].vx+=Te,C[O].vy+=Fe}for(const T of $){const O=Qe.get(T.from),J=Qe.get(T.to);if(!O||!J)continue;const fe=J.x-O.x,ge=J.y-O.y,me=Math.sqrt(fe*fe+ge*ge)||1,Le=(me-Qs)*Js,Te=fe/me*Le,Fe=ge/me*Le;O.vx+=Te,O.vy+=Fe,J.vx-=Te,J.vy-=Fe}for(const T of C)T.vx+=(qt-T.x)*Ut,T.vy+=(Vt-T.y)*Ut}let qe=B.current.node;if(qe&&!C.includes(qe)&&(B.current.node=null,qe=null),!(!Ee&&!qe&&C.every(T=>T.vx===0&&T.vy===0)))for(const T of C){if(qe===T)continue;T.vx*=Wt,T.vy*=Wt,Math.abs(T.vx)<.01&&Math.abs(T.vy)<.01&&(T.vx=0,T.vy=0),T.x+=T.vx,T.y+=T.vy;const O=100;T.x<-O?T.x=-O:T.x>D+O&&(T.x=D+O),T.y<-O?T.y=-O:T.y>H+O&&(T.y=H+O)}const $t=ne.current.toLowerCase();if($t){const T=C.filter(O=>O.id.toLowerCase().includes($t));if(T.length===1){const O=T[0],J=qt-O.x,fe=Vt-O.y,ge=.05;for(const me of C)me.x+=J*ge,me.y+=fe*ge}}L.setTransform(Ce,0,0,Ce,0,0),L.clearRect(0,0,D,H);const Je=_.current;L.setTransform(Je.scale*Ce,0,0,Je.scale*Ce,Je.panX*Ce,Je.panY*Ce);const Gt=$.filter(ue),tn=Gt.length<30;for(const T of Gt){const O=Qe.get(T.from),J=Qe.get(T.to);if(!O||!J)continue;const fe=Math.min(O.recency,J.recency)*.6;if(L.globalAlpha=fe,L.strokeStyle="rgba(0, 214, 180, 0.4)",L.lineWidth=1,L.setLineDash([]),L.beginPath(),L.moveTo(O.x,O.y),L.lineTo(J.x,J.y),L.stroke(),tn){const ge=(O.x+J.x)/2,me=(O.y+J.y)/2;L.font="9px Satoshi, system-ui, sans-serif",L.fillStyle="#7A828E",L.fillText(T.type,ge+2,me-2)}}L.globalAlpha=1;const sn=C.filter(pe),nn=j.current;for(const T of sn){const O=nn===T,J=xe(T),fe=S.current===T.id,ge=fe?10:O?9:T.radius,me=O||J?1:T.recency;if(L.globalAlpha=me,L.beginPath(),L.arc(T.x,T.y,ge,0,Math.PI*2),L.fillStyle=R.current?Da(T.recency):ys(T.type),L.fill(),T.isOrphan&&(L.setLineDash([3,3]),L.strokeStyle="#4A5260",L.lineWidth=1,L.stroke(),L.setLineDash([])),J&&(L.globalAlpha=1,L.strokeStyle="#00F0CA",L.lineWidth=2,L.beginPath(),L.arc(T.x,T.y,ge+3,0,Math.PI*2),L.stroke()),O&&!J&&(L.globalAlpha=1,L.strokeStyle="#fff",L.lineWidth=2,L.beginPath(),L.arc(T.x,T.y,ge,0,Math.PI*2),L.stroke()),O||J||fe){L.globalAlpha=1,L.fillStyle="#B8BEC6",L.font="10px Satoshi, system-ui, sans-serif";const Te=J||fe?T.id:T.id.length>20?T.id.slice(0,18)+"...":T.id;L.fillText(Te,T.x+ge+4,T.y+3)}}L.globalAlpha=1;const De=Q.current;if(De.node&&pe(De.node)){L.setTransform(Ce,0,0,Ce,0,0);const T=De.x+12,O=De.y-10,J=De.node.id,fe=De.node.type,ge=Ia(De.node.lastDate),me=J,Le=`${fe} | ${ge}`;L.font="11px Satoshi, system-ui, sans-serif";const Te=L.measureText(me).width,Fe=L.measureText(Le).width,an=Math.max(Te,Fe)+12,rn=34;L.fillStyle="rgba(13, 16, 20, 0.92)",L.strokeStyle="rgba(0, 214, 180, 0.3)",L.lineWidth=1,L.beginPath(),L.roundRect(T-4,O-18,an,rn,4),L.fill(),L.stroke(),L.fillStyle="#F0F2F4",L.fillText(me,T,O-4),L.fillStyle="#7A828E",L.font="10px Geist Mono, JetBrains Mono, monospace",L.fillText(Le,T,O+10)}f.current=requestAnimationFrame(P)};return f.current=requestAnimationFrame(P),()=>cancelAnimationFrame(f.current)},[t,n]);const G=ye((M,F)=>{const D=w.current,H=ee.current,N=S.current,X=12/(_.current.scale||1),pe=X*X;for(let ue=D.length-1;ue>=0;ue--){const xe=D[ue];if(H[xe.type]===!1||N&&xe.id!==N&&!v.current.some(P=>P.from===N&&P.to===xe.id||P.to===N&&P.from===xe.id))continue;const ke=xe.x-M,Be=xe.y-F;if(ke*ke+Be*Be<pe)return xe}return null},[]),be=ye(M=>{const F=p.current;if(!F)return{x:0,y:0};const D=F.getBoundingClientRect();return{x:M.clientX-D.left,y:M.clientY-D.top}},[]),se=ye((M,F)=>{const D=_.current;return{x:(M-D.panX)/D.scale,y:(F-D.panY)/D.scale}},[]),he=ye(M=>{const F=be(M),D=se(F.x,F.y),H=G(D.x,D.y);if(H)window.__graphReheat?.(),B.current={node:H,offsetX:D.x-H.x,offsetY:D.y-H.y,startX:F.x,startY:F.y,dragged:!1},A.current.active=!1;else{const N=_.current;A.current={active:!0,startScreenX:F.x,startScreenY:F.y,startPanX:N.panX,startPanY:N.panY,moved:!1},B.current={node:null,offsetX:0,offsetY:0,startX:F.x,startY:F.y,dragged:!1};const Y=p.current;Y&&(Y.style.cursor="grabbing")}},[G,be,se]),ce=ye(M=>{const F=be(M),D=se(F.x,F.y),H=B.current,N=A.current;if(H.node){const pe=F.x-H.startX,ue=F.y-H.startY;pe*pe+ue*ue>it*it&&(H.dragged=!0),H.node.x=D.x-H.offsetX,H.node.y=D.y-H.offsetY,H.node.vx=0,H.node.vy=0}else if(N.active){const pe=F.x-N.startScreenX,ue=F.y-N.startScreenY;pe*pe+ue*ue>it*it&&(N.moved=!0),_.current.panX=N.startPanX+pe,_.current.panY=N.startPanY+ue}const Y=G(D.x,D.y);j.current=Y,Q.current=Y?{x:F.x,y:F.y,node:Y}:{x:0,y:0,node:null};const X=p.current;X&&(H.node||N.active?X.style.cursor="grabbing":Y?X.style.cursor=S.current?"pointer":"grab":X.style.cursor="grab")},[G,be,se]),I=ye(M=>{const F=B.current,D=A.current,H=be(M),N=se(H.x,H.y);F.node&&!F.dragged?y(X=>X===F.node.id?null:F.node.id):!F.node&&D.active&&!D.moved&&(G(N.x,N.y)||y(null)),B.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1},A.current.active=!1,A.current.moved=!1;const Y=p.current;if(Y){const X=G(N.x,N.y);Y.style.cursor=X&&S.current?"pointer":"grab"}},[G,be,se]),W=ye(()=>{B.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1},A.current.active=!1,A.current.moved=!1,j.current=null,Q.current={x:0,y:0,node:null};const M=p.current;M&&(M.style.cursor="default")},[]),z=ye(M=>{M.preventDefault();const F=p.current;if(!F)return;const D=F.getBoundingClientRect(),H=M.clientX-D.left,N=M.clientY-D.top,Y=_.current,X=Y.scale,pe=Math.exp(-M.deltaY*.0015),ue=Math.max(.25,Math.min(4,X*pe));if(ue===X)return;const xe=(H-Y.panX)/X,ke=(N-Y.panY)/X;Y.scale=ue,Y.panX=H-xe*ue,Y.panY=N-ke*ue},[]),x=ye(()=>{_.current={scale:1,panX:0,panY:0}},[]);if(K(()=>{if(n||!t)return;const M=p.current;if(!M)return;const F=D=>z(D);return M.addEventListener("wheel",F,{passive:!1}),()=>M.removeEventListener("wheel",F)},[t,n,z]),n)return e("div",{class:"empty",children:e("div",{class:"loading"})});if(r)return e("div",{class:"error-box",role:"alert",children:Ie(r)});if(!t)return e("div",{class:"error-box",role:"alert",children:[a("common.error"),": ",a("common.noData")]});const E=new Map;t.entities.forEach(M=>E.set(M.type,(E.get(M.type)||0)+1));const U=new Set;t.relations.forEach(M=>{U.add(M.from),U.add(M.to)});const ae=t.entities.filter(M=>!U.has(M.name)).length,de=u?t.entities.filter(M=>M.name.toLowerCase().includes(u.toLowerCase())).length:0,ve=l?t.entities.find(M=>M.name===l):null;return e("div",{children:[e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.entities.length.toLocaleString()}),e("div",{class:"stat-lbl",children:a("graph.entities")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.relations.length.toLocaleString()}),e("div",{class:"stat-lbl",children:a("graph.relations")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:ae.toLocaleString()}),e("div",{class:"stat-lbl",children:a("graph.orphans")})]})]}),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:a("tab.graph")}),Array.from(E.entries()).map(([M,F])=>{const D=d[M]!==!1,H=ys(M);return e("label",{style:{display:"inline-flex",alignItems:"center",gap:4,fontSize:11,color:"#B8BEC6",opacity:D?1:.4,cursor:"pointer",userSelect:"none"},children:[e("input",{type:"checkbox",checked:D,onChange:()=>c(N=>({...N,[M]:!N[M]})),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}}),M," (",F,")"]},M)})]}),e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8,flexWrap:"wrap"},children:[e("input",{type:"text",placeholder:a("graph.search"),value:u,onInput:M=>m(M.target.value),style:{width:260,padding:"4px 8px",background:"#080A0C",border:"1px solid rgba(0, 214, 180, 0.08)",borderRadius:4,color:"#F0F2F4",fontSize:12,fontFamily:"Satoshi, system-ui, sans-serif",outline:"none"}}),u&&e("span",{style:{fontSize:11,fontFamily:"Geist Mono, JetBrains Mono, monospace",color:"#7A828E"},children:[de," ",a("graph.matches")]}),e("button",{onClick:x,title:a("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:4,color:"#7A828E",fontSize:11,cursor:"pointer"},children:a("graph.resetView")}),e("button",{onClick:()=>h(M=>!M),style:{padding:"3px 10px",background:b?"rgba(0,214,180,0.15)":"rgba(255,255,255,0.04)",border:`1px solid ${b?"rgba(0,214,180,0.4)":"rgba(255,255,255,0.08)"}`,borderRadius:4,color:b?"#00D6B4":"#7A828E",fontSize:11,cursor:"pointer",display:"flex",alignItems:"center",gap:6},children:[e("span",{style:{display:"inline-block",width:32,height:6,borderRadius:3,background:"linear-gradient(to right, #F87171, #00D6B4)"}}),"Drift"]})]}),ve&&e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8,padding:"4px 10px",background:"rgba(0, 214, 180, 0.08)",borderRadius:4,fontSize:12},children:[e("span",{style:{color:"#00D6B4",fontWeight:600},children:[a("graph.focusMode"),":"]}),e("span",{style:{color:"#F0F2F4"},children:ve.name}),e("button",{onClick:()=>y(null),style:{marginLeft:"auto",padding:"2px 8px",background:"rgba(0, 214, 180, 0.12)",border:"1px solid rgba(0, 214, 180, 0.2)",borderRadius:3,color:"#00D6B4",fontSize:11,cursor:"pointer"},children:a("graph.showAll")})]}),!l&&e("div",{style:{fontSize:11,color:"#4A5260",marginBottom:6},children:a("graph.interactHint")}),e("canvas",{ref:p,style:{width:"100%",height:vs,borderRadius:"var(--radius-sm)",background:"#080A0C",cursor:"grab"},onMouseDown:he,onMouseMove:ce,onMouseUp:I,onMouseLeave:W})]})]})}function Oe({type:t,children:s}){return e("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[e(Ke,{type:t,size:16}),s]})}function za(t){const s=[];let n=null;for(const o of t){const r=o.trim();r.startsWith("Error:")?(n&&s.push(n),n={error:r.slice(6).trim(),rootCause:"",fix:"",prevention:""}):r.startsWith("Root cause:")?(n||(n={error:"",rootCause:"",fix:"",prevention:""}),n.rootCause=r.slice(11).trim()):r.startsWith("Fix:")||r.startsWith("Solution")?(n||(n={error:"",rootCause:"",fix:"",prevention:""}),n.fix=r.replace(/^(Fix|Solution\s*\d*):/i,"").trim()):r.startsWith("Prevention:")&&(n||(n={error:"",rootCause:"",fix:"",prevention:""}),n.prevention=r.slice(11).trim())}return n&&s.push(n),s}function ja(t){const s=t.observations??[],n=s[0]?.match(/^Plan "(.+?)" completed \((\d+) steps?\)/),o=s.find(i=>i.startsWith("Steps:"))?.slice(6).trim()??"",r=s.find(i=>i.startsWith("Commits:"))?.slice(8).trim()??"";return{planName:n?.[1]??t.name,stepCount:n?parseInt(n[2],10):0,steps:o,commits:r?r.split(",").map(i=>i.trim()).filter(Boolean):[]}}const Ct={critical:"#FF6B6B",major:"#FFB84D",minor:"#60A5FA"};function Ys(t){const s=t.tags??[];return s.includes("severity:critical")?"critical":s.includes("severity:major")?"major":s.includes("severity:minor")?"minor":null}function Oa({entity:t}){const s=za(t.observations??[]),n=Ys(t),o=Ue(t),r=Ye(t.access_count),i=n?Ct[n]:"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(Oe,{type:"lesson_learned",children:t.name})}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},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]}),n&&e("span",{class:"badge",style:{background:`${Ct[n]}18`,color:Ct[n]},children:n}),r.tone!=="none"&&e("span",{class:"tag",style:{background:r.tone==="high"?"rgba(0, 214, 180, 0.18)":"rgba(0, 214, 180, 0.10)",color:"var(--accent)",fontWeight:r.tone==="high"?600:400},children:["✓ ",r.label]}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:Re(t.last_accessed_at||t.created_at)})]})]}),s.length===0&&e("div",{style:{fontSize:12,color:"var(--text-3)",fontStyle:"italic"},children:a("lessons.unstructured")}),s.map((d,c)=>e("div",{style:{marginTop:c>0?14:0,paddingTop:c>0?14:0,borderTop:c>0?"1px dashed var(--border-subtle)":"none"},children:[d.error&&e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--danger)",marginBottom:2},children:a("lessons.error")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:d.error})]}),d.rootCause&&e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--warning)",marginBottom:2},children:a("lessons.rootCause")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:d.rootCause})]}),d.fix&&e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--success)",marginBottom:2},children:a("lessons.fix")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:d.fix})]}),d.prevention&&e("div",{children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--info)",marginBottom:2},children:a("lessons.prevention")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:d.prevention})]})]},c))]})}function Na({entity:t}){const s=ja(t),n=Ue(t),o=Ye(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(Oe,{type:"plan",children:s.planName})}),e("div",{style:{fontSize:12,color:"var(--text-3)",marginTop:2},children:[s.stepCount," ",a("lessons.stepsLabel")," · ",a("lessons.commitsCount",{count:s.commits.length})]})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0},children:[n&&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"})}),n]}),o.tone!=="none"&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.10)",color:"var(--accent)"},children:["✓ ",o.label]}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:Re(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 Wa({entity:t}){const s=t.observations??[],n=Ue(t),o=Ye(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(Oe,{type:"note",children:t.name})}),e("div",{style:{display:"flex",gap:6,flexShrink:0},children:[n&&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"})}),n]}),o.tone!=="none"&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.10)",color:"var(--accent)"},children:["✓ ",o.label]}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:Re(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((r,i)=>e("li",{style:{marginBottom:3},children:r.length>200?r.slice(0,200)+"…":r},i)),s.length>6&&e("li",{style:{color:"var(--text-3)",listStyle:"none"},children:a("lessons.moreItems",{count:s.length-6})})]})]})}function Ua(){const[t,s]=k([]),[n,o]=k([]),[r,i]=k(!0),[d,c]=k(""),[g,u]=k("failure"),[m,l]=k(""),[y,b]=k("all");K(()=>{Promise.all([En(),Ws().catch(()=>[])]).then(([f,_])=>{s(f),o(_)}).catch(f=>c(f.message)).finally(()=>i(!1))},[]);const h=Me(()=>{const f={failure:[],"plan-completion":[],freeform:[]};for(const _ of t)f[Hn(_)].push(_);for(const _ of Object.keys(f))f[_].sort((A,B)=>(B.access_count??0)-(A.access_count??0)||B.created_at.localeCompare(A.created_at));return f},[t]),p=Me(()=>{const f=h[g],_=m.toLowerCase();return f.filter(A=>y!=="all"&&Ue(A)!==y?!1:_?[A.name,...A.observations??[],...A.tags??[]].join(" ").toLowerCase().includes(_):!0)},[h,g,m,y]);if(r)return e("div",{class:"empty",children:e("div",{class:"loading"})});if(d)return e("div",{class:"error-box",role:"alert",children:[a("common.error"),": ",d]});const w=t.reduce((f,_)=>f+(_.access_count??0),0),v=h.failure.filter(f=>Ys(f)==="critical").length;return e("div",{children:[e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:h.failure.length}),e("div",{class:"stat-lbl",children:a("lessons.tabFailure")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{color:v>0?"#FF6B6B":void 0},children:v}),e("div",{class:"stat-lbl",children:"Critical"})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:h["plan-completion"].length}),e("div",{class:"stat-lbl",children:a("lessons.tabPlan")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:w}),e("div",{class:"stat-lbl",children:a("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:g==="failure"?"rgba(0, 214, 180, 0.18)":"transparent",borderColor:g==="failure"?"rgba(0, 214, 180, 0.5)":"rgba(255,255,255,0.08)",color:g==="failure"?"var(--accent)":"var(--text-2)"},onClick:()=>u("failure"),children:[e(Oe,{type:"lesson_learned",children:a("lessons.tabFailure")})," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)",marginLeft:6},children:h.failure.length})]}),e("button",{class:"btn btn-sm",style:{background:g==="plan-completion"?"rgba(0, 214, 180, 0.18)":"transparent",borderColor:g==="plan-completion"?"rgba(0, 214, 180, 0.5)":"rgba(255,255,255,0.08)",color:g==="plan-completion"?"var(--accent)":"var(--text-2)"},onClick:()=>u("plan-completion"),children:[e(Oe,{type:"plan",children:a("lessons.tabPlan")})," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)",marginLeft:6},children:h["plan-completion"].length})]}),e("button",{class:"btn btn-sm",style:{background:g==="freeform"?"rgba(0, 214, 180, 0.18)":"transparent",borderColor:g==="freeform"?"rgba(0, 214, 180, 0.5)":"rgba(255,255,255,0.08)",color:g==="freeform"?"var(--accent)":"var(--text-2)"},onClick:()=>u("freeform"),children:[e(Oe,{type:"note",children:a("lessons.tabFreeform")})," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)",marginLeft:6},children:h.freeform.length})]})]}),e("div",{style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap"},children:[e("input",{type:"search",placeholder:a("lessons.searchPlaceholder"),value:m,onInput:f=>l(f.target.value),style:{flex:1,minWidth:240,padding:"4px 8px",fontSize:12}}),n.length>0&&e("select",{value:y,onChange:f=>b(f.target.value),style:{padding:"3px 8px",fontSize:12},children:[e("option",{value:"all",children:a("lessons.allProjects")}),n.map(f=>e("option",{value:f.name,children:[f.name," (",f.count,")"]},f.name))]})]}),e("div",{style:{marginTop:8,fontSize:11,color:"var(--text-3)"},children:a("lessons.showing",{visible:p.length,total:h[g].length})})]}),e("div",{style:{marginTop:14},children:p.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(Ke,{type:g==="failure"?"lesson_learned":g==="plan-completion"?"plan":"note",size:28})}),m?a("lessons.noMatch",{query:m}):a("lessons.emptyCategory")]}):p.map(f=>g==="failure"?e(Oa,{entity:f},f.id):g==="plan-completion"?e(Na,{entity:f},f.id):e(Wa,{entity:f},f.id))})]})}function qa(t){if(!t)return null;for(const s of t){const n=/^severity:(high|medium|low)$/i.exec(s);if(n)return n[1].toLowerCase()}return null}function ks(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 Va(t){const{proposal:s,detail:n,expanded:o,inFlight:r,onToggleExpand:i,onAccept:d,onReject:c,formatRelative:g,statusBadgeStyle:u,statusLabel:m}=t,l=s.status==="pending",y=qa(n?.proposed_digest?.tags),b=u(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:"#080A0C",fontWeight:600},children:a("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:a("pattern.evidenceCount",{n:String(s.source_count)})}),y&&e("span",{class:"tag",style:{fontSize:11,color:ks(y),borderColor:ks(y)},children:[a("pattern.severity"),": ",a(`pattern.severity.${y}`)]}),e("span",{class:"tag",style:{fontSize:11,...b},children:m(s.status)})]}),e("div",{style:{marginTop:6,color:"var(--text-2)",fontSize:13,lineHeight:1.5},children:[s.digest_observations_preview,s.digest_observations_preview==="(empty)"?"":"…"]}),e("div",{style:{marginTop:4,color:"var(--text-3)",fontSize:11},children:g(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:r,"aria-expanded":o,children:a(o?"insights.collapse":"insights.viewDetail")}),l&&e(ie,{children:[e("button",{class:"btn btn-primary",onClick:()=>d(s.id),disabled:r,children:a(r?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>c(s.id),disabled:r,style:{color:"var(--danger)"},children:a("insights.reject")})]})]})]}),n&&n.proposed_digest&&e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:4,fontSize:13},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:11},children:[a("insights.generatedBy"),": ",e("code",{children:n.llm_model??"unknown"})," "," "," ",a("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:4,borderLeft:"3px solid var(--warning, #FFC800)",background:"rgba(255,200,0,0.08)"},children:[e("div",{style:{fontWeight:600,color:"var(--warning, #FFC800)",marginBottom:6},children:["⚠ ",a("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:n.proposed_digest.validation_warnings.map((h,p)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[a("insights.validationClaim"),": "]}),e("code",{style:{fontSize:12},children:h.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[a("insights.validationReason"),": "]}),e("span",{children:h.reason})]})]},p))})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:[a("pattern.description"),":"]}),e("ol",{style:{margin:"4px 0 0 18px",padding:0},children:n.proposed_digest.observations.map((h,p)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:h},p))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[a("insights.tags"),":"]})," ",n.proposed_digest.tags.map(h=>e("span",{class:"tag",style:{marginLeft:4,fontSize:11},children:h},h))]}),e("div",{style:{color:"var(--text-3)",fontSize:11,marginTop:6},children:[a("insights.sourceIds"),": ",n.source_ids.length," (",n.source_ids.slice(0,8).join(", "),n.source_ids.length>8?"…":"",")"]})]})]})}function xs(t){if(!t)return"";const s=new Date(t.replace(" ","T")+"Z").getTime();if(Number.isNaN(s))return t;const n=(Date.now()-s)/1e3;return n<60?`${Math.floor(n)}s ago`:n<3600?`${Math.floor(n/60)}m ago`:n<86400?`${Math.floor(n/3600)}h ago`:`${Math.floor(n/86400)}d ago`}function ws(t){switch(t){case"pending":return{background:"rgba(255,200,0,0.12)",color:"#FFC800"};case"applied":return{background:"rgba(0,214,180,0.12)",color:"var(--accent)"};case"rejected":return{background:"rgba(255,80,80,0.12)",color:"#FF5050"};default:return{background:"rgba(160,160,160,0.10)",color:"var(--text-3)"}}}function Ms(t){const s=`insights.status.${t}`,n=a(s);return n===s?t:n}function $a(){const[t,s]=k([]),[n,o]=k("pending"),[r,i]=k(new Map),[d,c]=k(!1),[g,u]=k(""),[m,l]=k(null),[y,b]=k(new Set),[h,p]=k(null),w=ye(async()=>{c(!0),u("");try{const S=await V("GET","/v1/dream/proposals?status=all");Array.isArray(S)?s(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),s([]),u(Ie("unreadable")))}catch(S){console.warn("[memesh dashboard] /v1/dream/proposals failed to load:",S),u(Ie(Xe(S)))}finally{c(!1)}},[]);K(()=>{w()},[w]),K(()=>{V("GET","/v1/config").then(S=>l(!!S?.capabilities?.llm)).catch(()=>l(!1))},[]);const v=n==="all"?t:t.filter(S=>S.status===n),f=ye(async S=>{if(r.has(S)){const R=new Map(r);R.delete(S),i(R);return}try{const R=await V("GET",`/v1/dream/proposals/${S}`),G=new Map(r);G.set(S,R),i(G)}catch(R){u(R instanceof Error?R.message:String(R))}},[r]),_=S=>{b(R=>{const G=new Set(R);return G.add(S),G})},A=S=>{b(R=>{const G=new Set(R);return G.delete(S),G})},B=ye(async S=>{_(S);try{await V("POST",`/v1/dream/proposals/${S}/accept`),window.dispatchEvent(new Event("memesh:data-changed")),await w()}catch(R){u(R instanceof Error?R.message:String(R))}finally{A(S)}},[w]),j=ye(async S=>{_(S);try{await V("POST",`/v1/dream/proposals/${S}/reject`,{reason:"rejected via dashboard"}),window.dispatchEvent(new Event("memesh:data-changed")),await w()}catch(R){u(R instanceof Error?R.message:String(R))}finally{A(S)}},[w]),Q=ye(async S=>{p(S),u("");try{await V("POST","/v1/dream/run",{maxLlmCalls:3,validate:S==="validate"}),window.dispatchEvent(new Event("memesh:data-changed")),await w()}catch(R){u(R instanceof Error?R.message:String(R))}finally{p(null)}},[w]),q=t.filter(S=>S.status==="pending").length,ee=t.filter(S=>S.status==="applied").length,ne=t.filter(S=>S.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:a("insights.title")}),e("span",{style:{color:"var(--text-2)",fontSize:13},children:a("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)"},children:q})," ",a("insights.statPending")]}),e("span",{children:[e("strong",{children:ee})," ",a("insights.statApplied")]}),e("span",{children:[e("strong",{children:ne})," ",a("insights.statRejected")]})]}),m&&e("div",{style:{marginTop:12,display:"flex",gap:8,flexWrap:"wrap"},children:[e("button",{class:"btn btn-primary",onClick:()=>Q("plain"),disabled:h!==null,"aria-busy":h==="plain",children:h==="plain"?`${a("insights.runDream")}…`:a("insights.runDream")}),e("button",{class:"btn btn-ghost",onClick:()=>Q("validate"),disabled:h!==null,"aria-busy":h==="validate",children:h==="validate"?`${a("insights.runDreamWithValidate")}…`:a("insights.runDreamWithValidate")})]})]}),e("div",{style:{display:"flex",gap:8,flexWrap:"wrap"},role:"group","aria-label":a("insights.title"),children:[["pending","applied","rejected","all"].map(S=>{const R=n===S;return e("button",{class:"tag","aria-pressed":R,style:{padding:"4px 10px",borderRadius:4,cursor:"pointer",border:"1px solid "+(R?"var(--accent)":"var(--border)"),background:R?"rgba(0,214,180,0.12)":"transparent",color:R?"var(--accent)":"var(--text-2)"},onClick:()=>o(S),children:a(`insights.filter.${S}`)},S)}),e("button",{class:"btn btn-ghost",onClick:w,style:{marginLeft:"auto"},children:a("insights.refresh")})]}),g&&e("div",{class:"card",role:"alert",style:{padding:12,color:"var(--danger)"},children:g}),d&&e("div",{style:{color:"var(--text-3)",fontSize:13},children:a("insights.loading")}),!d&&v.length===0&&e("div",{class:"card",style:{padding:16,textAlign:"center",color:"var(--text-2)"},children:a(n!=="pending"?"insights.emptyOther":m===!1?"insights.emptyNoLlm":"insights.emptyPending")}),v.map(S=>{const R=r.get(S.id),G=r.has(S.id),be=S.status==="pending",se=y.has(S.id);if(S.kind==="pattern_emergent")return e(Va,{proposal:S,detail:R,expanded:G,inFlight:se,onToggleExpand:f,onAccept:B,onReject:j,formatRelative:xs,statusBadgeStyle:ws,statusLabel:Ms},S.id);const he=S.digest_observations_preview==="(empty)"?"":"…";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"},children:["#",S.id]}),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},children:S.cluster_key}),e("span",{class:"tag",style:{fontSize:11,color:"var(--text-2)"},children:[S.source_count," ",a("insights.sources")]}),e("span",{class:"tag",style:{fontSize:11,...ws(S.status)},children:Ms(S.status)})]}),e("div",{style:{marginTop:6,color:"var(--text-2)",fontSize:13,lineHeight:1.5},children:[S.digest_observations_preview,he]}),e("div",{style:{marginTop:4,color:"var(--text-3)",fontSize:11},children:xs(S.created_at)})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[e("button",{class:"btn btn-ghost",onClick:()=>f(S.id),disabled:se,"aria-expanded":G,children:a(G?"insights.collapse":"insights.viewDetail")}),be&&e(ie,{children:[e("button",{class:"btn btn-primary",onClick:()=>B(S.id),disabled:se,children:a(se?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>j(S.id),disabled:se,style:{color:"#FF5050"},children:a("insights.reject")})]})]})]}),R&&R.proposed_digest&&e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:4,fontSize:13},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:11},children:[a("insights.generatedBy"),": ",e("code",{children:R.llm_model??"unknown"})," · ",a("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:4,borderLeft:"3px solid var(--warning, #FFC800)",background:"rgba(255,200,0,0.08)"},children:[e("div",{style:{fontWeight:600,color:"var(--warning, #FFC800)",marginBottom:6},children:["⚠ ",a("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:R.proposed_digest.validation_warnings.map((ce,I)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[a("insights.validationClaim"),": "]}),e("code",{style:{fontSize:12},children:ce.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[a("insights.validationReason"),": "]}),e("span",{children:ce.reason})]})]},I))})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:[a("insights.observations"),":"]}),e("ol",{style:{margin:"4px 0 0 18px",padding:0},children:R.proposed_digest.observations.map((ce,I)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:ce},I))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[a("insights.tags"),":"]})," ",R.proposed_digest.tags.map(ce=>e("span",{class:"tag",style:{marginLeft:4,fontSize:11},children:ce},ce))]}),e("div",{style:{color:"var(--text-3)",fontSize:11,marginTop:6},children:[a("insights.sourceIds"),": ",R.source_ids.length," entities (",R.source_ids.slice(0,8).join(", "),R.source_ids.length>8?"…":"",")"]})]})]},S.id)})]})}const Ga=["bug","feature","question"],_s={bug:"feedback.bug",feature:"feedback.feature",question:"feedback.question"};function Ka({health:t}){const[s,n]=k(!1),[o,r]=k("bug"),[i,d]=k(""),[c,g]=k(!0),[u,m]=k(!1),l=re(null);K(()=>{if(!s)return;const h=p=>{l.current&&!l.current.contains(p.target)&&n(!1)};return document.addEventListener("mousedown",h),()=>document.removeEventListener("mousedown",h)},[s]);function y(h){const p=h.checks.find(A=>A.id==="install_id"),f=h.checks.filter(A=>A.id!=="install_id").sort((A,B)=>{const j={fail:0,warn:1,pass:2};return(j[A.status]??3)-(j[B.status]??3)}).map(A=>{const B=A.status==="fail"?"❌":A.status==="warn"?"⚠️":"✅",j=A.fix?` _Fix: ${A.fix}_`:"";return`- ${B} **${A.label}**: ${A.summary}${j}`}),_=p?`
13
- _Anonymous install ID: \`${(p.summary.match(/[0-9a-f-]{36}/)??["(unavailable)"])[0]}\` — included only because you checked "Include system info"._
14
- `:"";return`**Diagnostics** (overall: ${h.status})${_}
15
- ${f.join(`
16
- `)}`}const b=async()=>{if(!(!i.trim()||u)){m(!0);try{const h=`feedback,from-dashboard,${o}`;let p=i.trim();if(c&&t){p+=`
12
+ <script type="module" crossorigin>(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))i(o);new MutationObserver(o=>{for(const a of o)if(a.type==="childList")for(const m of a.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&i(m)}).observe(document,{childList:!0,subtree:!0});function n(o){const a={};return o.integrity&&(a.integrity=o.integrity),o.referrerPolicy&&(a.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?a.credentials="include":o.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function i(o){if(o.ep)return;o.ep=!0;const a=n(o);fetch(o.href,a)}})();var jt,oe,Xs,Ge,us,Js,Zs,Nt,Mt,it,Qs,ts,Gt,Yt,Et={},Lt=[],Ln=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,zt=Array.isArray;function qe(t,s){for(var n in s)t[n]=s[n];return t}function ss(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function Tn(t,s,n){var i,o,a,m={};for(a in s)a=="key"?i=s[a]:a=="ref"?o=s[a]:m[a]=s[a];if(arguments.length>2&&(m.children=arguments.length>3?jt.call(arguments,2):n),typeof t=="function"&&t.defaultProps!=null)for(a in t.defaultProps)m[a]===void 0&&(m[a]=t.defaultProps[a]);return Ct(t,m,i,o,null)}function Ct(t,s,n,i,o){var a={type:t,props:s,key:n,ref:i,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++Xs,__i:-1,__u:0};return o==null&&oe.vnode!=null&&oe.vnode(a),a}function le(t){return t.children}function St(t,s){this.props=t,this.context=s}function nt(t,s){if(s==null)return t.__?nt(t.__,t.__i+1):null;for(var n;s<t.__k.length;s++)if((n=t.__k[s])!=null&&n.__e!=null)return n.__e;return typeof t.type=="function"?nt(t):null}function Pn(t){if(t.__P&&t.__d){var s=t.__v,n=s.__e,i=[],o=[],a=qe({},s);a.__v=s.__v+1,oe.vnode&&oe.vnode(a),ns(t.__P,a,s,t.__n,t.__P.namespaceURI,32&s.__u?[n]:null,i,n??nt(s),!!(32&s.__u),o),a.__v=s.__v,a.__.__k[a.__i]=a,nn(i,a,o),s.__e=s.__=null,a.__e!=n&&en(a)}}function en(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}),en(t)}function hs(t){(!t.__d&&(t.__d=!0)&&Ge.push(t)&&!Tt.__r++||us!=oe.debounceRendering)&&((us=oe.debounceRendering)||Js)(Tt)}function Tt(){try{for(var t,s=1;Ge.length;)Ge.length>s&&Ge.sort(Zs),t=Ge.shift(),s=Ge.length,Pn(t)}finally{Ge.length=Tt.__r=0}}function tn(t,s,n,i,o,a,m,d,u,c,h){var l,y,b,g,f,M,p,k=i&&i.__k||Lt,v=s.length;for(u=Rn(n,s,k,u,v),l=0;l<v;l++)(b=n.__k[l])!=null&&(y=b.__i!=-1&&k[b.__i]||Et,b.__i=l,M=ns(t,b,y,o,a,m,d,u,c,h),g=b.__e,b.ref&&y.ref!=b.ref&&(y.ref&&rs(y.ref,null,b),h.push(b.ref,b.__c||g,b)),f==null&&g!=null&&(f=g),(p=!!(4&b.__u))||y.__k===b.__k?(u=sn(b,u,t,p),p&&y.__e&&(y.__e=null)):typeof b.type=="function"&&M!==void 0?u=M:g&&(u=g.nextSibling),b.__u&=-7);return n.__e=f,u}function Rn(t,s,n,i,o){var a,m,d,u,c,h=n.length,l=h,y=0;for(t.__k=new Array(o),a=0;a<o;a++)(m=s[a])!=null&&typeof m!="boolean"&&typeof m!="function"?(typeof m=="string"||typeof m=="number"||typeof m=="bigint"||m.constructor==String?m=t.__k[a]=Ct(null,m,null,null,null):zt(m)?m=t.__k[a]=Ct(le,{children:m},null,null,null):m.constructor===void 0&&m.__b>0?m=t.__k[a]=Ct(m.type,m.props,m.key,m.ref?m.ref:null,m.__v):t.__k[a]=m,u=a+y,m.__=t,m.__b=t.__b+1,d=null,(c=m.__i=jn(m,n,u,l))!=-1&&(l--,(d=n[c])&&(d.__u|=2)),d==null||d.__v==null?(c==-1&&(o>h?y--:o<h&&y++),typeof m.type!="function"&&(m.__u|=4)):c!=u&&(c==u-1?y--:c==u+1?y++:(c>u?y--:y++,m.__u|=4))):t.__k[a]=null;if(l)for(a=0;a<h;a++)(d=n[a])!=null&&(2&d.__u)==0&&(d.__e==i&&(i=nt(d)),on(d,d));return i}function sn(t,s,n,i){var o,a;if(typeof t.type=="function"){for(o=t.__k,a=0;o&&a<o.length;a++)o[a]&&(o[a].__=t,s=sn(o[a],s,n,i));return s}t.__e!=s&&(i&&(s&&t.type&&!s.parentNode&&(s=nt(t)),n.insertBefore(t.__e,s||null)),s=t.__e);do s=s&&s.nextSibling;while(s!=null&&s.nodeType==8);return s}function jn(t,s,n,i){var o,a,m,d=t.key,u=t.type,c=s[n],h=c!=null&&(2&c.__u)==0;if(c===null&&d==null||h&&d==c.key&&u==c.type)return n;if(i>(h?1:0)){for(o=n-1,a=n+1;o>=0||a<s.length;)if((c=s[m=o>=0?o--:a++])!=null&&(2&c.__u)==0&&d==c.key&&u==c.type)return m}return-1}function gs(t,s,n){s[0]=="-"?t.setProperty(s,n??""):t[s]=n==null?"":typeof n!="number"||Ln.test(s)?n:n+"px"}function yt(t,s,n,i,o){var a,m;e:if(s=="style")if(typeof n=="string")t.style.cssText=n;else{if(typeof i=="string"&&(t.style.cssText=i=""),i)for(s in i)n&&s in n||gs(t.style,s,"");if(n)for(s in n)i&&n[s]==i[s]||gs(t.style,s,n[s])}else if(s[0]=="o"&&s[1]=="n")a=s!=(s=s.replace(Qs,"$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+a]=n,n?i?n[it]=i[it]:(n[it]=ts,t.addEventListener(s,a?Yt:Gt,a)):t.removeEventListener(s,a?Yt:Gt,a);else{if(o=="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]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&s[4]!="-"?t.removeAttribute(s):t.setAttribute(s,s=="popover"&&n==1?"":n))}}function ps(t){return function(s){if(this.l){var n=this.l[s.type+t];if(s[Mt]==null)s[Mt]=ts++;else if(s[Mt]<n[it])return;return n(oe.event?oe.event(s):s)}}}function ns(t,s,n,i,o,a,m,d,u,c){var h,l,y,b,g,f,M,p,k,v,R,E,I,D,X,Q=s.type;if(s.constructor!==void 0)return null;128&n.__u&&(u=!!(32&n.__u),a=[d=s.__e=n.__e]),(h=oe.__b)&&h(s);e:if(typeof Q=="function")try{if(p=s.props,k=Q.prototype&&Q.prototype.render,v=(h=Q.contextType)&&i[h.__c],R=h?v?v.props.value:h.__:i,n.__c?M=(l=s.__c=n.__c).__=l.__E:(k?s.__c=l=new Q(p,R):(s.__c=l=new St(p,R),l.constructor=Q,l.render=In),v&&v.sub(l),l.state||(l.state={}),l.__n=i,y=l.__d=!0,l.__h=[],l._sb=[]),k&&l.__s==null&&(l.__s=l.state),k&&Q.getDerivedStateFromProps!=null&&(l.__s==l.state&&(l.__s=qe({},l.__s)),qe(l.__s,Q.getDerivedStateFromProps(p,l.__s))),b=l.props,g=l.state,l.__v=s,y)k&&Q.getDerivedStateFromProps==null&&l.componentWillMount!=null&&l.componentWillMount(),k&&l.componentDidMount!=null&&l.__h.push(l.componentDidMount);else{if(k&&Q.getDerivedStateFromProps==null&&p!==b&&l.componentWillReceiveProps!=null&&l.componentWillReceiveProps(p,R),s.__v==n.__v||!l.__e&&l.shouldComponentUpdate!=null&&l.shouldComponentUpdate(p,l.__s,R)===!1){s.__v!=n.__v&&(l.props=p,l.state=l.__s,l.__d=!1),s.__e=n.__e,s.__k=n.__k,s.__k.some(function(fe){fe&&(fe.__=s)}),Lt.push.apply(l.__h,l._sb),l._sb=[],l.__h.length&&m.push(l);break e}l.componentWillUpdate!=null&&l.componentWillUpdate(p,l.__s,R),k&&l.componentDidUpdate!=null&&l.__h.push(function(){l.componentDidUpdate(b,g,f)})}if(l.context=R,l.props=p,l.__P=t,l.__e=!1,E=oe.__r,I=0,k)l.state=l.__s,l.__d=!1,E&&E(s),h=l.render(l.props,l.state,l.context),Lt.push.apply(l.__h,l._sb),l._sb=[];else do l.__d=!1,E&&E(s),h=l.render(l.props,l.state,l.context),l.state=l.__s;while(l.__d&&++I<25);l.state=l.__s,l.getChildContext!=null&&(i=qe(qe({},i),l.getChildContext())),k&&!y&&l.getSnapshotBeforeUpdate!=null&&(f=l.getSnapshotBeforeUpdate(b,g)),D=h!=null&&h.type===le&&h.key==null?rn(h.props.children):h,d=tn(t,zt(D)?D:[D],s,n,i,o,a,m,d,u,c),l.base=s.__e,s.__u&=-161,l.__h.length&&m.push(l),M&&(l.__E=l.__=null)}catch(fe){if(s.__v=null,u||a!=null)if(fe.then){for(s.__u|=u?160:128;d&&d.nodeType==8&&d.nextSibling;)d=d.nextSibling;a[a.indexOf(d)]=null,s.__e=d}else{for(X=a.length;X--;)ss(a[X]);Xt(s)}else s.__e=n.__e,s.__k=n.__k,fe.then||Xt(s);oe.__e(fe,s,n)}else a==null&&s.__v==n.__v?(s.__k=n.__k,s.__e=n.__e):d=s.__e=zn(n.__e,s,n,i,o,a,m,u,c);return(h=oe.diffed)&&h(s),128&s.__u?void 0:d}function Xt(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(Xt))}function nn(t,s,n){for(var i=0;i<n.length;i++)rs(n[i],n[++i],n[++i]);oe.__c&&oe.__c(s,t),t.some(function(o){try{t=o.__h,o.__h=[],t.some(function(a){a.call(o)})}catch(a){oe.__e(a,o.__v)}})}function rn(t){return typeof t!="object"||t==null||t.__b>0?t:zt(t)?t.map(rn):qe({},t)}function zn(t,s,n,i,o,a,m,d,u){var c,h,l,y,b,g,f,M=n.props||Et,p=s.props,k=s.type;if(k=="svg"?o="http://www.w3.org/2000/svg":k=="math"?o="http://www.w3.org/1998/Math/MathML":o||(o="http://www.w3.org/1999/xhtml"),a!=null){for(c=0;c<a.length;c++)if((b=a[c])&&"setAttribute"in b==!!k&&(k?b.localName==k:b.nodeType==3)){t=b,a[c]=null;break}}if(t==null){if(k==null)return document.createTextNode(p);t=document.createElementNS(o,k,p.is&&p),d&&(oe.__m&&oe.__m(s,a),d=!1),a=null}if(k==null)M===p||d&&t.data==p||(t.data=p);else{if(a=a&&jt.call(t.childNodes),!d&&a!=null)for(M={},c=0;c<t.attributes.length;c++)M[(b=t.attributes[c]).name]=b.value;for(c in M)b=M[c],c=="dangerouslySetInnerHTML"?l=b:c=="children"||c in p||c=="value"&&"defaultValue"in p||c=="checked"&&"defaultChecked"in p||yt(t,c,null,b,o);for(c in p)b=p[c],c=="children"?y=b:c=="dangerouslySetInnerHTML"?h=b:c=="value"?g=b:c=="checked"?f=b:d&&typeof b!="function"||M[c]===b||yt(t,c,b,M[c],o);if(h)d||l&&(h.__html==l.__html||h.__html==t.innerHTML)||(t.innerHTML=h.__html),s.__k=[];else if(l&&(t.innerHTML=""),tn(s.type=="template"?t.content:t,zt(y)?y:[y],s,n,i,k=="foreignObject"?"http://www.w3.org/1999/xhtml":o,a,m,a?a[0]:n.__k&&nt(n,0),d,u),a!=null)for(c=a.length;c--;)ss(a[c]);d||(c="value",k=="progress"&&g==null?t.removeAttribute("value"):g!=null&&(g!==t[c]||k=="progress"&&!g||k=="option"&&g!=M[c])&&yt(t,c,g,M[c],o),c="checked",f!=null&&f!=t[c]&&yt(t,c,f,M[c],o))}return t}function rs(t,s,n){try{if(typeof t=="function"){var i=typeof t.__u=="function";i&&t.__u(),i&&s==null||(t.__u=t(s))}else t.current=s}catch(o){oe.__e(o,n)}}function on(t,s,n){var i,o;if(oe.unmount&&oe.unmount(t),(i=t.ref)&&(i.current&&i.current!=t.__e||rs(i,null,s)),(i=t.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(a){oe.__e(a,s)}i.base=i.__P=null}if(i=t.__k)for(o=0;o<i.length;o++)i[o]&&on(i[o],s,n||typeof t.type!="function");n||ss(t.__e),t.__c=t.__=t.__e=void 0}function In(t,s,n){return this.constructor(t,n)}function Dn(t,s,n){var i,o,a,m;s==document&&(s=document.documentElement),oe.__&&oe.__(t,s),o=(i=!1)?null:s.__k,a=[],m=[],ns(s,t=s.__k=Tn(le,null,[t]),o||Et,Et,s.namespaceURI,o?null:s.firstChild?jt.call(s.childNodes):null,a,o?o.__e:s.firstChild,i,m),nn(a,t,m)}jt=Lt.slice,oe={__e:function(t,s,n,i){for(var o,a,m;s=s.__;)if((o=s.__c)&&!o.__)try{if((a=o.constructor)&&a.getDerivedStateFromError!=null&&(o.setState(a.getDerivedStateFromError(t)),m=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(t,i||{}),m=o.__d),m)return o.__E=o}catch(d){t=d}throw t}},Xs=0,St.prototype.setState=function(t,s){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=qe({},this.state),typeof t=="function"&&(t=t(qe({},n),this.props)),t&&qe(n,t),t!=null&&this.__v&&(s&&this._sb.push(s),hs(this))},St.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),hs(this))},St.prototype.render=le,Ge=[],Js=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Zs=function(t,s){return t.__v.__b-s.__v.__b},Tt.__r=0,Nt=Math.random().toString(8),Mt="__d"+Nt,it="__a"+Nt,Qs=/(PointerCapture)$|Capture$/i,ts=0,Gt=ps(!1),Yt=ps(!0);var Hn=0;function e(t,s,n,i,o,a){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 c={type:t,props:u,key:n,ref:m,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Hn,__i:-1,__u:0,__source:o,__self:a};if(typeof t=="function"&&(m=t.defaultProps))for(d in m)u[d]===void 0&&(u[d]=m[d]);return oe.vnode&&oe.vnode(c),c}var lt,ue,Ft,fs,ct=0,an=[],he=oe,ys=he.__b,bs=he.__r,vs=he.diffed,ks=he.__c,ws=he.unmount,xs=he.__;function os(t,s){he.__h&&he.__h(ue,t,ct||s),ct=0;var n=ue.__H||(ue.__H={__:[],__h:[]});return t>=n.__.length&&n.__.push({}),n.__[t]}function w(t){return ct=1,Nn(cn,t)}function Nn(t,s,n){var i=os(lt++,2);if(i.t=t,!i.__c&&(i.__=[cn(void 0,s),function(d){var u=i.__N?i.__N[0]:i.__[0],c=i.t(u,d);u!==c&&(i.__N=[c,i.__[1]],i.__c.setState({}))}],i.__c=ue,!ue.__f)){var o=function(d,u,c){if(!i.__c.__H)return!0;var h=i.__c.__H.__.filter(function(y){return y.__c});if(h.every(function(y){return!y.__N}))return!a||a.call(this,d,u,c);var l=i.__c.props!==d;return h.some(function(y){if(y.__N){var b=y.__[0];y.__=y.__N,y.__N=void 0,b!==y.__[0]&&(l=!0)}}),a&&a.call(this,d,u,c)||l};ue.__f=!0;var a=ue.shouldComponentUpdate,m=ue.componentWillUpdate;ue.componentWillUpdate=function(d,u,c){if(this.__e){var h=a;a=void 0,o(d,u,c),a=h}m&&m.call(this,d,u,c)},ue.shouldComponentUpdate=o}return i.__N||i.__}function ee(t,s){var n=os(lt++,3);!he.__s&&ln(n.__H,s)&&(n.__=t,n.u=s,ue.__H.__h.push(n))}function re(t){return ct=5,je(function(){return{current:t}},[])}function je(t,s){var n=os(lt++,7);return ln(n.__H,s)&&(n.__=t(),n.__H=s,n.__h=t),n.__}function Me(t,s){return ct=8,je(function(){return t},s)}function Fn(){for(var t;t=an.shift();){var s=t.__H;if(t.__P&&s)try{s.__h.some(At),s.__h.some(Jt),s.__h=[]}catch(n){s.__h=[],he.__e(n,t.__v)}}}he.__b=function(t){ue=null,ys&&ys(t)},he.__=function(t,s){t&&s.__k&&s.__k.__m&&(t.__m=s.__k.__m),xs&&xs(t,s)},he.__r=function(t){bs&&bs(t),lt=0;var s=(ue=t.__c).__H;s&&(Ft===ue?(s.__h=[],ue.__h=[],s.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(s.__h.some(At),s.__h.some(Jt),s.__h=[],lt=0)),Ft=ue},he.diffed=function(t){vs&&vs(t);var s=t.__c;s&&s.__H&&(s.__H.__h.length&&(an.push(s)!==1&&fs===he.requestAnimationFrame||((fs=he.requestAnimationFrame)||On)(Fn)),s.__H.__.some(function(n){n.u&&(n.__H=n.u),n.u=void 0})),Ft=ue=null},he.__c=function(t,s){s.some(function(n){try{n.__h.some(At),n.__h=n.__h.filter(function(i){return!i.__||Jt(i)})}catch(i){s.some(function(o){o.__h&&(o.__h=[])}),s=[],he.__e(i,n.__v)}}),ks&&ks(t,s)},he.unmount=function(t){ws&&ws(t);var s,n=t.__c;n&&n.__H&&(n.__H.__.some(function(i){try{At(i)}catch(o){s=o}}),n.__H=void 0,s&&he.__e(s,n.__v))};var _s=typeof requestAnimationFrame=="function";function On(t){var s,n=function(){clearTimeout(i),_s&&cancelAnimationFrame(s),setTimeout(t)},i=setTimeout(n,35);_s&&(s=requestAnimationFrame(n))}function At(t){var s=ue,n=t.__c;typeof n=="function"&&(t.__c=void 0,n()),ue=s}function Jt(t){var s=ue;t.__c=t.__(),ue=s}function ln(t,s){return!t||t.length!==s.length||s.some(function(n,i){return n!==t[i]})}function cn(t,s){return typeof s=="function"?s(t):s}const Pt={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 (last 24h)","doctor.label.node-runtime":"Node.js version","doctor.label.native-binding":"Database engine","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.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.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.quiet.summary":"memesh has not saved anything automatically in the last 24 hours. Everything is set up — it just has not seen a work session yet. If you HAVE been working all day, restart Claude Code.","doctor.msg.hook-activity.quiet.fix":"Do a normal Claude Code session (or make a git commit), then check `memesh doctor` again.","doctor.msg.hook-activity.query-failed.summary":"Could not read the database: {detail}","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.not-installed.summary":"The database engine (better-sqlite3) is not installed — memesh cannot store or read anything.","doctor.msg.native-binding.not-installed.fix":"Run `npm install` in the folder that uses @pcircle/memesh.","doctor.msg.native-binding.missing.summary":"The database engine is installed but its compiled part is missing, so nothing gets saved.","doctor.msg.native-binding.missing.fix":'Run: cd "{root}" && npm rebuild better-sqlite3',"doctor.msg.native-binding.load-failed.summary":"The database engine failed to start: {detail}","doctor.msg.native-binding.load-failed.fix":'Run: cd "{root}" && npm rebuild better-sqlite3',"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<br/>(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.","settings.agenticLabel":"Enable agentic orchestration (experimental)","settings.agenticHint":"Shows hints from background helper agents while you work in the terminal, plus a banner reminding you to check results. Off by default.","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.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":"自動記錄(最近 24 小時)","doctor.label.node-runtime":"Node.js 版本","doctor.label.native-binding":"資料庫引擎","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.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.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.quiet.summary":"memesh 最近 24 小時沒有自動存下任何東西。設定都沒問題——只是還沒看到可記錄的工作階段。如果你今天明明一直在工作,重啟一次 Claude Code 通常就會恢復。","doctor.msg.hook-activity.quiet.fix":"正常用 Claude Code 工作一段(或 git commit 一次),再用 `memesh doctor` 檢查。","doctor.msg.hook-activity.query-failed.summary":"讀不到資料庫:{detail}","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.not-installed.summary":"資料庫引擎(better-sqlite3)沒有安裝——memesh 完全無法存取記憶。","doctor.msg.native-binding.not-installed.fix":"在使用 @pcircle/memesh 的資料夾執行 `npm install`。","doctor.msg.native-binding.missing.summary":"資料庫引擎裝了,但編譯出來的部分不見了,所以什麼都存不進去。","doctor.msg.native-binding.missing.fix":'執行:cd "{root}" && npm rebuild better-sqlite3',"doctor.msg.native-binding.load-failed.summary":"資料庫引擎啟動失敗:{detail}","doctor.msg.native-binding.load-failed.fix":'執行:cd "{root}" && npm rebuild better-sqlite3',"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":"顯示有效知識記憶<br/>(排除 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 環境變數優先。","settings.agenticLabel":"啟用 agentic orchestration(實驗性)","settings.agenticHint":"在你使用終端機時,顯示背景協作代理的提示,並加上提醒你檢查結果的橫幅。預設關閉。","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.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":"自动记录(最近 24 小时)","doctor.label.node-runtime":"Node.js 版本","doctor.label.native-binding":"数据库引擎","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.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.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.quiet.summary":"memesh 最近 24 小时没有自动保存任何内容。设置都没问题——只是还没看到可记录的工作会话。如果你今天明明一直在工作,重启一次 Claude Code 通常就会恢复。","doctor.msg.hook-activity.quiet.fix":"正常用 Claude Code 工作一段(或 git commit 一次),再用 `memesh doctor` 检查。","doctor.msg.hook-activity.query-failed.summary":"读不到数据库:{detail}","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.not-installed.summary":"数据库引擎(better-sqlite3)没有安装——memesh 完全无法存取记忆。","doctor.msg.native-binding.not-installed.fix":"在使用 @pcircle/memesh 的文件夹运行 `npm install`。","doctor.msg.native-binding.missing.summary":"数据库引擎装了,但编译出来的部分不见了,所以什么都存不进去。","doctor.msg.native-binding.missing.fix":'运行:cd "{root}" && npm rebuild better-sqlite3',"doctor.msg.native-binding.load-failed.summary":"数据库引擎启动失败:{detail}","doctor.msg.native-binding.load-failed.fix":'运行:cd "{root}" && npm rebuild better-sqlite3',"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":"显示有效知识记忆<br/>(排除 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 环境变量优先。","settings.agenticLabel":"启用 agentic orchestration(实验性)","settings.agenticHint":"在你使用终端时,显示后台协作代理的提示,并加上提醒你检查结果的横幅。默认关闭。","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.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":"自動記録(過去 24 時間)","doctor.label.node-runtime":"Node.js のバージョン","doctor.label.native-binding":"データベースエンジン","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.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.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.quiet.summary":"memesh は過去 24 時間、何も自動保存していません。設定は問題ありません — まだ記録できる作業がなかっただけです。一日中作業していたはずなら、Claude Code を再起動してください。","doctor.msg.hook-activity.quiet.fix":"Claude Code で普通に作業する(または git commit する)と記録されます。その後 `memesh doctor` で確認してください。","doctor.msg.hook-activity.query-failed.summary":"データベースを読み取れませんでした: {detail}","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.not-installed.summary":"データベースエンジン(better-sqlite3)がインストールされていないため、memesh は何も保存も読み取りもできません。","doctor.msg.native-binding.not-installed.fix":"@pcircle/memesh を使うフォルダーで `npm install` を実行してください。","doctor.msg.native-binding.missing.summary":"データベースエンジンは入っていますが、コンパイル済みの部分がないため、何も保存されません。","doctor.msg.native-binding.missing.fix":'実行: cd "{root}" && npm rebuild better-sqlite3',"doctor.msg.native-binding.load-failed.summary":"データベースエンジンの起動に失敗しました: {detail}","doctor.msg.native-binding.load-failed.fix":'実行: cd "{root}" && npm rebuild better-sqlite3',"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":"有効な知識メモリ<br/>(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 環境変数が優先。","settings.agenticLabel":"agentic orchestration を有効化(実験的)","settings.agenticHint":"ターミナル作業中に、バックグラウンドの補助エージェントのヒントと、結果の確認を促すバナーを表示します。既定はオフ。","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.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":"자동 기록 (최근 24시간)","doctor.label.node-runtime":"Node.js 버전","doctor.label.native-binding":"데이터베이스 엔진","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.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.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.quiet.summary":"memesh가 최근 24시간 동안 아무것도 자동 저장하지 않았습니다. 설정은 모두 정상입니다 — 아직 기록할 작업 세션이 없었을 뿐입니다. 하루 종일 작업했는데도 이렇다면 Claude Code를 재시작하세요.","doctor.msg.hook-activity.quiet.fix":"Claude Code로 평소처럼 작업하거나 git commit을 한 번 한 뒤 `memesh doctor`로 다시 확인하세요.","doctor.msg.hook-activity.query-failed.summary":"데이터베이스를 읽을 수 없습니다: {detail}","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.not-installed.summary":"데이터베이스 엔진(better-sqlite3)이 설치되어 있지 않아 memesh가 아무것도 저장하거나 읽을 수 없습니다.","doctor.msg.native-binding.not-installed.fix":"@pcircle/memesh를 쓰는 폴더에서 `npm install`을 실행하세요.","doctor.msg.native-binding.missing.summary":"데이터베이스 엔진은 설치되어 있지만 컴파일된 부분이 없어 아무것도 저장되지 않습니다.","doctor.msg.native-binding.missing.fix":'실행: cd "{root}" && npm rebuild better-sqlite3',"doctor.msg.native-binding.load-failed.summary":"데이터베이스 엔진이 시작하지 못했습니다: {detail}","doctor.msg.native-binding.load-failed.fix":'실행: cd "{root}" && npm rebuild better-sqlite3',"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":"활성 지식 기억<br/>(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 환경 변수가 우선.","settings.agenticLabel":"agentic orchestration 활성화 (실험적)","settings.agenticHint":"터미널에서 작업할 때 백그라운드 보조 에이전트의 힌트와 결과 확인을 알리는 배너를 표시합니다. 기본값은 꺼짐.","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.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 (últimas 24h)","doctor.label.node-runtime":"Versão do Node.js","doctor.label.native-binding":"Motor do banco de dados","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.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.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.quiet.summary":"O memesh não salvou nada automaticamente nas últimas 24 horas. Está tudo configurado — ele só ainda não viu uma sessão de trabalho. Se você TRABALHOU o dia todo, reinicie o Claude Code.","doctor.msg.hook-activity.quiet.fix":"Faça uma sessão normal no Claude Code (ou um git commit) e depois confira `memesh doctor` de novo.","doctor.msg.hook-activity.query-failed.summary":"Não foi possível ler o banco de dados: {detail}","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.not-installed.summary":"O motor do banco de dados (better-sqlite3) não está instalado — o memesh não consegue salvar nem ler nada.","doctor.msg.native-binding.not-installed.fix":"Execute `npm install` na pasta que usa o @pcircle/memesh.","doctor.msg.native-binding.missing.summary":"O motor do banco de dados está instalado, mas a parte compilada está faltando, então nada é salvo.","doctor.msg.native-binding.missing.fix":'Execute: cd "{root}" && npm rebuild better-sqlite3',"doctor.msg.native-binding.load-failed.summary":"O motor do banco de dados não conseguiu iniciar: {detail}","doctor.msg.native-binding.load-failed.fix":'Execute: cd "{root}" && npm rebuild better-sqlite3',"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<br/>(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.","settings.agenticLabel":"Ativar agentic orchestration (experimental)","settings.agenticHint":"Mostra dicas de agentes auxiliares em segundo plano enquanto você trabalha no terminal, além de um aviso para conferir os resultados. Desativado por padrão.","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.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 (dernières 24 h)","doctor.label.node-runtime":"Version de Node.js","doctor.label.native-binding":"Moteur de base de données","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.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.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.quiet.summary":"memesh n'a rien enregistré automatiquement ces dernières 24 heures. Tout est bien configuré — il n'a simplement pas encore vu de session de travail. Si vous AVEZ travaillé toute la journée, redémarrez Claude Code.","doctor.msg.hook-activity.quiet.fix":"Faites une session Claude Code normale (ou un git commit), puis revérifiez avec `memesh doctor`.","doctor.msg.hook-activity.query-failed.summary":"Impossible de lire la base de données : {detail}","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.not-installed.summary":"Le moteur de base de données (better-sqlite3) n'est pas installé — memesh ne peut rien enregistrer ni lire.","doctor.msg.native-binding.not-installed.fix":"Exécutez `npm install` dans le dossier qui utilise @pcircle/memesh.","doctor.msg.native-binding.missing.summary":"Le moteur de base de données est installé mais sa partie compilée manque, rien n'est donc enregistré.","doctor.msg.native-binding.missing.fix":'Exécutez : cd "{root}" && npm rebuild better-sqlite3',"doctor.msg.native-binding.load-failed.summary":"Le moteur de base de données n'a pas pu démarrer : {detail}","doctor.msg.native-binding.load-failed.fix":'Exécutez : cd "{root}" && npm rebuild better-sqlite3',"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<br/>(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é.","settings.agenticLabel":"Activer agentic orchestration (expérimental)","settings.agenticHint":"Affiche les suggestions des agents auxiliaires en arrière-plan pendant que vous travaillez dans le terminal, ainsi qu'un bandeau vous invitant à vérifier les résultats. Désactivé par défaut.","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.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 (letzte 24 h)","doctor.label.node-runtime":"Node.js-Version","doctor.label.native-binding":"Datenbank-Engine","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.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.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.quiet.summary":"memesh hat in den letzten 24 Stunden nichts automatisch gespeichert. Alles ist eingerichtet — es gab nur noch keine Arbeitssession. Falls Sie den ganzen Tag gearbeitet HABEN, starten Sie Claude Code neu.","doctor.msg.hook-activity.quiet.fix":"Machen Sie eine normale Claude-Code-Session (oder einen git commit) und prüfen Sie dann erneut mit `memesh doctor`.","doctor.msg.hook-activity.query-failed.summary":"Die Datenbank konnte nicht gelesen werden: {detail}","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.not-installed.summary":"Die Datenbank-Engine (better-sqlite3) ist nicht installiert — memesh kann nichts speichern oder lesen.","doctor.msg.native-binding.not-installed.fix":"Führen Sie `npm install` in dem Ordner aus, der @pcircle/memesh verwendet.","doctor.msg.native-binding.missing.summary":"Die Datenbank-Engine ist installiert, aber ihr kompilierter Teil fehlt, es wird also nichts gespeichert.","doctor.msg.native-binding.missing.fix":'Ausführen: cd "{root}" && npm rebuild better-sqlite3',"doctor.msg.native-binding.load-failed.summary":"Die Datenbank-Engine konnte nicht starten: {detail}","doctor.msg.native-binding.load-failed.fix":'Ausführen: cd "{root}" && npm rebuild better-sqlite3',"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<br/>(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.","settings.agenticLabel":"agentic orchestration aktivieren (experimentell)","settings.agenticHint":"Zeigt Hinweise von Hilfs-Agenten im Hintergrund während der Terminalarbeit sowie ein Banner, das ans Prüfen der Ergebnisse erinnert. Standardmäßig aus.","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.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":"Ghi tự động (24 giờ qua)","doctor.label.node-runtime":"Phiên bản Node.js","doctor.label.native-binding":"Bộ máy cơ sở dữ liệu","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.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.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.quiet.summary":"memesh chưa tự lưu gì trong 24 giờ qua. Mọi thứ đã được thiết lập — chỉ là nó chưa thấy phiên làm việc nào. Nếu bạn ĐÃ làm việc cả ngày, hãy khởi động lại Claude Code.","doctor.msg.hook-activity.quiet.fix":"Làm một phiên Claude Code bình thường (hoặc git commit một lần), rồi kiểm tra lại bằng `memesh doctor`.","doctor.msg.hook-activity.query-failed.summary":"Không đọc được cơ sở dữ liệu: {detail}","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.not-installed.summary":"Bộ máy cơ sở dữ liệu (better-sqlite3) chưa được cài — memesh không thể lưu hay đọc gì cả.","doctor.msg.native-binding.not-installed.fix":"Chạy `npm install` trong thư mục dùng @pcircle/memesh.","doctor.msg.native-binding.missing.summary":"Bộ máy cơ sở dữ liệu đã cài nhưng thiếu phần đã biên dịch, nên không lưu được gì.","doctor.msg.native-binding.missing.fix":'Chạy: cd "{root}" && npm rebuild better-sqlite3',"doctor.msg.native-binding.load-failed.summary":"Bộ máy cơ sở dữ liệu không khởi động được: {detail}","doctor.msg.native-binding.load-failed.fix":'Chạy: cd "{root}" && npm rebuild better-sqlite3',"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<br/>(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.","settings.agenticLabel":"Bật agentic orchestration (thử nghiệm)","settings.agenticHint":"Hiển thị gợi ý từ các agent hỗ trợ chạy nền khi bạn làm việc trong terminal, kèm biểu ngữ nhắc bạn kiểm tra kết quả. Mặc định tắt.","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.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 (últimas 24 h)","doctor.label.node-runtime":"Versión de Node.js","doctor.label.native-binding":"Motor de base de datos","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.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.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.quiet.summary":"memesh no ha guardado nada automáticamente en las últimas 24 horas. Todo está configurado — solo que aún no ha visto una sesión de trabajo. Si SÍ has estado trabajando todo el día, reinicia Claude Code.","doctor.msg.hook-activity.quiet.fix":"Haz una sesión normal de Claude Code (o un git commit), y luego revisa `memesh doctor` de nuevo.","doctor.msg.hook-activity.query-failed.summary":"No se pudo leer la base de datos: {detail}","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.not-installed.summary":"El motor de base de datos (better-sqlite3) no está instalado — memesh no puede guardar ni leer nada.","doctor.msg.native-binding.not-installed.fix":"Ejecuta `npm install` en la carpeta que usa @pcircle/memesh.","doctor.msg.native-binding.missing.summary":"El motor de base de datos está instalado pero falta su parte compilada, así que nada se guarda.","doctor.msg.native-binding.missing.fix":'Ejecuta: cd "{root}" && npm rebuild better-sqlite3',"doctor.msg.native-binding.load-failed.summary":"El motor de base de datos no pudo arrancar: {detail}","doctor.msg.native-binding.load-failed.fix":'Ejecuta: cd "{root}" && npm rebuild better-sqlite3',"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<br/>(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.","settings.agenticLabel":"Activar agentic orchestration (experimental)","settings.agenticHint":"Muestra sugerencias de agentes auxiliares en segundo plano mientras trabajas en la terminal, además de un aviso para revisar los resultados. Desactivado por defecto.","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.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":"บันทึกอัตโนมัติ (24 ชม. ล่าสุด)","doctor.label.node-runtime":"เวอร์ชัน Node.js","doctor.label.native-binding":"เอนจินฐานข้อมูล","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.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.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.quiet.summary":"memesh ไม่ได้บันทึกอะไรอัตโนมัติใน 24 ชั่วโมงที่ผ่านมา ทุกอย่างตั้งค่าไว้เรียบร้อย — เพียงแต่ยังไม่เห็นเซสชันทำงานเท่านั้น ถ้าคุณทำงานทั้งวันจริง ๆ ให้รีสตาร์ต Claude Code","doctor.msg.hook-activity.quiet.fix":"ใช้ Claude Code ทำงานตามปกติสักเซสชัน (หรือ git commit หนึ่งครั้ง) แล้วเช็ก `memesh doctor` อีกที","doctor.msg.hook-activity.query-failed.summary":"อ่านฐานข้อมูลไม่ได้: {detail}","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.not-installed.summary":"เอนจินฐานข้อมูล (better-sqlite3) ยังไม่ได้ติดตั้ง — memesh จึงบันทึกหรืออ่านอะไรไม่ได้เลย","doctor.msg.native-binding.not-installed.fix":"รัน `npm install` ในโฟลเดอร์ที่ใช้ @pcircle/memesh","doctor.msg.native-binding.missing.summary":"เอนจินฐานข้อมูลติดตั้งแล้ว แต่ส่วนที่คอมไพล์หายไป จึงบันทึกอะไรไม่ได้","doctor.msg.native-binding.missing.fix":'รัน: cd "{root}" && npm rebuild better-sqlite3',"doctor.msg.native-binding.load-failed.summary":"เอนจินฐานข้อมูลเริ่มทำงานไม่สำเร็จ: {detail}","doctor.msg.native-binding.load-failed.fix":'รัน: cd "{root}" && npm rebuild better-sqlite3',"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":"ความทรงจำที่ใช้งาน<br/>(ไม่รวม 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 มีลำดับความสำคัญ","settings.agenticLabel":"เปิดใช้ agentic orchestration (ทดลอง)","settings.agenticHint":"แสดงคำแนะนำจากเอเจนต์ผู้ช่วยเบื้องหลังขณะที่คุณทำงานในเทอร์มินัล พร้อมแบนเนอร์เตือนให้ตรวจสอบผลลัพธ์ ปิดไว้โดยค่าเริ่มต้น","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.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} ที่ไม่เชื่อมต่อ ใช้ตัวกรองประเภทและการค้นหาด้านบนเพื่อดูแบบไม่ใช้ภาพ"}},Bn={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 dt="en";function qn(){const t=localStorage.getItem("memesh-locale");if(t&&Pt[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 n=s.split("-")[0];return Pt[n]?n:"en"}function Wn(){return dt=qn(),dt}function Un(t){dt=t,localStorage.setItem("memesh-locale",t)}function r(t,s){const n=Pt[dt]?.[t]||Pt.en[t]||t;return s?n.replace(/\{(\w+)\}/g,(i,o)=>{const a=s[o];return a===void 0?`{${o}}`:String(a)}):n}function ge(){return dt}function Ms(){return Object.entries(Bn).map(([t,s])=>({code:t,name:s}))}const as="memesh.signalMode",Ot="memesh:signal-mode-changed",Kn=!0;function Bt(){try{const t=localStorage.getItem(as);if(t==="true")return!0;if(t==="false")return!1}catch{}return Kn}function Vn(t){try{localStorage.setItem(as,String(t))}catch{}}function is(){const[t,s]=w(Bt);ee(()=>{function i(a){const m=a.detail;m&&typeof m.value=="boolean"?s(m.value):s(Bt())}function o(a){a.key===as&&s(Bt())}return window.addEventListener(Ot,i),window.addEventListener("storage",o),()=>{window.removeEventListener(Ot,i),window.removeEventListener("storage",o)}},[]);function n(i){Vn(i),s(i),window.dispatchEvent(new CustomEvent(Ot,{detail:{value:i}}))}return[t,n]}function $n({health:t,error:s}){const[n,i]=is();return e("div",{class:"header",children:[e("div",{class:"header-brand",children:[e("h1",{children:"MeMesh LLM Memory"}),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:()=>i(!n),"aria-pressed":n,title:r(n?"header.signalModeOnHint":"header.signalModeOffHint"),style:{fontSize:11,padding:"4px 10px",borderRadius:"var(--radius)",border:`1px solid ${n?"rgba(0, 214, 180, 0.4)":"rgba(255, 255, 255, 0.08)"}`,background:n?"rgba(0, 214, 180, 0.12)":"transparent",color:n?"var(--accent)":"var(--text-2)",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{marginRight:4},children:n?"●":"○"}),r(n?"header.signalModeOn":"header.signalModeOff")]}),t?e(le,{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(ge())," ",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 Gn({tabs:t,active:s,onSelect:n}){const i=re(null),o=re([]),[a,m]=w(!1),d=Me(()=>{const c=i.current;c&&m(c.scrollLeft+c.clientWidth<c.scrollWidth-1)},[]);ee(()=>{d();const c=i.current;if(c)return c.addEventListener("scroll",d,{passive:!0}),window.addEventListener("resize",d),()=>{c.removeEventListener("scroll",d),window.removeEventListener("resize",d)}},[d,t.length]);const u=(c,h)=>{let l=-1;if(c.key==="ArrowRight"||c.key==="ArrowDown")l=(h+1)%t.length;else if(c.key==="ArrowLeft"||c.key==="ArrowUp")l=(h-1+t.length)%t.length;else if(c.key==="Home")l=0;else if(c.key==="End")l=t.length-1;else return;c.preventDefault(),n(t[l].key),o.current[l]?.focus(),o.current[l]?.scrollIntoView({block:"nearest",inline:"nearest"})};return e("nav",{"aria-label":r("nav.ariaLabel"),style:{position:"relative"},children:[e("div",{ref:i,class:"nav",role:"tablist","aria-label":r("nav.ariaLabel"),children:t.map(({key:c,label:h},l)=>{const y=c===s;return e("button",{ref:b=>{o.current[l]=b},id:`tab-${c}`,role:"tab","aria-selected":y?"true":"false","aria-controls":`panel-${c}`,tabIndex:y?0:-1,class:`nav-btn ${y?"active":""}`,onClick:()=>n(c),onKeyDown:b=>u(b,l),children:h},c)})}),a&&e("div",{"aria-hidden":"true",class:"nav-overflow-fade"})]})}const Yn=1e4,Zt="memesh_token";function Qt(){try{return localStorage.getItem(Zt)}catch{return null}}function Xn(t){try{t?localStorage.setItem(Zt,t):localStorage.removeItem(Zt)}catch{}}class ls extends Error{constructor(){super("auth_required"),this.name="AuthRequiredError"}}class dn extends Error{constructor(s){super(`HTTP ${s}`),this.name="HttpError",this.status=s}}class Rt extends Error{constructor(s){super(s),this.name="NetworkError"}}class mn extends Error{constructor(s){super(s),this.name="RateLimitError"}}function Cs(t){if(typeof t.errorCode=="string"&&t.errorCode){const s=`httpError.${t.errorCode}`,n=r(s);if(n!==s)return new Error(n)}return new Error(typeof t.error=="string"&&t.error?t.error:r("errors.unknown"))}async function J(t,s,n){const i=new AbortController,o=setTimeout(()=>i.abort(),Yn);try{const a={"Content-Type":"application/json"},m=Qt();m&&(a.Authorization=`Bearer ${m}`);const d={method:t,headers:a,signal:i.signal};n&&(d.body=JSON.stringify(n));const u=await fetch(s,d);if(u.status===401)throw window.dispatchEvent(new Event("memesh:auth-required")),new ls;if(!u.ok){if(u.status===429)throw new mn(r("httpError.rate.limited"));let h=null;try{h=await u.json()}catch{}throw h&&typeof h=="object"&&h.success===!1?Cs(h):new dn(u.status)}const c=await u.json();if(!c.success)throw Cs(c);return c.data}catch(a){throw a.name==="AbortError"?new Rt(r("errors.timeout")):a instanceof TypeError?new Rt(a.message):a}finally{clearTimeout(o)}}async function un(){const t=await J("GET","/v1/projects");return Array.isArray(t)?t:[]}async function Jn(){return J("GET","/v1/graph")}async function Zn(){const t=await J("GET","/v1/entities?type=lesson_learned&limit=100");return Array.isArray(t)?t:[]}const Qn={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 Ss(t){return Qn[t]??"reference"}function We(t){const s=`type.${t}`,n=r(s);return n===s?t:n}function er(t){const s=`relation.${t}`,n=r(s);return n===s?t:n}function Ue(t,s=new Date){if(!t)return"—";const n=new Date(t);if(Number.isNaN(n.getTime()))return"—";const i=s.getTime()-n.getTime(),o=Math.floor(i/864e5);if(o<0)return n.toLocaleDateString(ge(),{month:"short",day:"numeric"});if(o===0){const a=Math.floor(i/36e5);return a<1?r("time.justNow"):a<24?r("time.hoursAgo",{count:a}):r("time.today")}return o===1?r("time.yesterday"):o<7?r("time.daysAgo",{count:o}):o<14?r("time.lastWeek"):o<30?r("time.weeksAgo",{count:Math.floor(o/7)}):o<60?r("time.lastMonth"):o<365?r("time.monthsAgo",{count:Math.floor(o/30)}):n.toLocaleDateString(ge(),{year:"numeric",month:"short",day:"numeric"})}function hn(t,s=new Date){if(!t)return"older";const n=s.getTime()-new Date(t).getTime(),i=Math.floor(n/864e5);return i<1?"today":i<7?"week":i<30?"month":"older"}const As="project:";function ot(t){const s=t.tags?.find(n=>n.startsWith(As));return s?s.slice(As.length):null}function tr(t){if(!t||t.length===0)return"";const s=t.filter(i=>i.length>30&&!/^(Steps|Commits|Plan ".+" completed)/.test(i.trim())),n=s.length>0?s:t;return n.slice(0,3).reduce((i,o)=>o.length>i.length?o:i,n[0])}function ut(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 sr(t){if((t.tags??[]).some(a=>a==="plan-completion"||a.startsWith("plan:")))return"plan-completion";const i=(t.observations??[]).join(" ");return/(^|\s)Error:/.test(i)&&(/(^|\s)Fix:/.test(i)||/(^|\s)Root cause:/.test(i))?"failure":"freeform"}const ce=1.5;function nr(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 rr={lesson:e(le,{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:ce,strokeLinejoin:"round"}),e("path",{d:"M7 13 h2",stroke:"currentColor",strokeWidth:ce,strokeLinecap:"round"}),e("path",{d:"M7 14.5 h2",stroke:"currentColor",strokeWidth:ce,strokeLinecap:"round"})]}),decision:e(le,{children:[e("circle",{cx:"8",cy:"8",r:"5.5",fill:"none",stroke:"currentColor",strokeWidth:ce}),e("circle",{cx:"8",cy:"8",r:"2",fill:"none",stroke:"currentColor",strokeWidth:ce}),e("path",{d:"M8 0.5 v3 M8 12.5 v3 M0.5 8 h3 M12.5 8 h3",stroke:"currentColor",strokeWidth:ce,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:ce,strokeLinejoin:"round"}),bug:e(le,{children:[e("ellipse",{cx:"8",cy:"9",rx:"3.5",ry:"4",fill:"none",stroke:"currentColor",strokeWidth:ce}),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:ce,strokeLinecap:"round"})]}),architecture:e(le,{children:[e("rect",{x:"2",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:ce}),e("rect",{x:"9",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:ce}),e("rect",{x:"5.5",y:"2",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:ce})]}),feature:e(le,{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:ce,strokeLinejoin:"round"})}),commit:e(le,{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:ce,strokeLinecap:"round"})}),session:e(le,{children:[e("circle",{cx:"8",cy:"9",r:"5",fill:"none",stroke:"currentColor",strokeWidth:ce}),e("path",{d:"M8 9 V5.5 M8 9 L10.5 11",stroke:"currentColor",strokeWidth:ce,strokeLinecap:"round"}),e("path",{d:"M6.5 2 H9.5",stroke:"currentColor",strokeWidth:ce,strokeLinecap:"round"})]}),milestone:e(le,{children:[e("path",{d:"M4 2 V14",stroke:"currentColor",strokeWidth:ce,strokeLinecap:"round"}),e("path",{d:"M4 3 H12 L10 6 L12 9 H4 z",fill:"none",stroke:"currentColor",strokeWidth:ce,strokeLinejoin:"round"})]}),calendar:e(le,{children:[e("rect",{x:"2",y:"3",width:"12",height:"11",rx:"1",fill:"none",stroke:"currentColor",strokeWidth:ce}),e("path",{d:"M2 6.5 H14 M5 1.5 V4.5 M11 1.5 V4.5",stroke:"currentColor",strokeWidth:ce,strokeLinecap:"round"})]}),note:e(le,{children:[e("path",{d:"M4 2 H10 L13 5 V14 H4 z",fill:"none",stroke:"currentColor",strokeWidth:ce,strokeLinejoin:"round"}),e("path",{d:"M10 2 V5 H13",fill:"none",stroke:"currentColor",strokeWidth:ce,strokeLinejoin:"round"}),e("path",{d:"M6 8.5 H11 M6 11 H11",stroke:"currentColor",strokeWidth:ce,strokeLinecap:"round"})]}),dot:e("circle",{cx:"8",cy:"8",r:"2",fill:"currentColor"})};function mt({type:t,size:s=16,color:n,ariaLabel:i}){const o=nr(t),a=i??We(t);return e("svg",{width:s,height:s,viewBox:"0 0 16 16",role:"img","aria-label":a,style:{color:n??"currentColor",flexShrink:0,display:"inline-block",verticalAlign:"text-bottom"},children:[e("title",{children:a}),rr[o]]})}function Es(t,s){return t.length>s?t.slice(0,s)+"…":t}function or(t){if(!t)return"";const s=new Date(t);if(Number.isNaN(s.getTime()))return t.slice(0,16).replace("T"," ");const n=i=>String(i).padStart(2,"0");return`${s.getFullYear()}-${n(s.getMonth()+1)}-${n(s.getDate())} ${n(s.getHours())}:${n(s.getMinutes())}`}const ar={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 tt({entity:t,actions:s,highlight:n}){const i=tr(t.observations)||r("memory.noContent"),o=t.observations?.length??0,a=t.archived||t.status==="archived",m=ot(t),d=ut(t.access_count),u=ar[d.tone],c=Ue(t.last_accessed_at||t.created_at),h=(t.relations?.length??0)>0;return e("div",{class:"mem-row",style:a?{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(mt,{type:t.type,size:18})}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:2},children:c})]}),e("div",{class:"mem-body",children:[e("div",{class:"mem-preview",children:n?e(ir,{text:Es(i,160),term:n}):Es(i,160)}),e("div",{class:"mem-meta",style:{flexWrap:"wrap",gap:6},children:[e("span",{class:"badge badge-type",children:We(t.type)}),a&&e("span",{class:"badge badge-archived",children:r("memory.archivedBadge")}),m&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.12)",color:"var(--accent)",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:11},children:t.name}),e("span",{style:{color:"var(--text-3)",fontSize:10,fontFamily:"var(--mono)",opacity:.85},title:r("memory.tooltip.createdAt",{date:t.created_at}),children:["· ",or(t.created_at)]}),o>1&&e("span",{style:{color:"var(--text-3)",fontSize:11},children:["· ",r("memory.factsCount",{count:o})]}),t.tags?.filter(l=>!l.startsWith("project:")&&!/^\d{4}-\d{2}-\d{2}/.test(l)).slice(0,3).map(l=>e("span",{class:"tag",children:l},l))]})]}),s&&e("div",{class:"mem-actions",children:s})]})}function ir({text:t,term:s}){if(!s)return e(le,{children:t});const n=[],i=t.toLowerCase(),o=s.toLowerCase();let a=0;for(;a<t.length;){const m=i.indexOf(o,a);if(m===-1){n.push(t.slice(a));break}m>a&&n.push(t.slice(a,m)),n.push(e("mark",{children:t.slice(m,m+o.length)})),a=m+o.length}return e(le,{children:n})}function at(t){return t instanceof mn?"ratelimited":t instanceof Rt?"unreachable":"unreadable"}function Ke(t){return t==="unreachable"?`${r("common.serverUnreachable")} ${r("common.serverUnreachableAction")}`:t==="ratelimited"?r("httpError.rate.limited"):`${r("common.responseUnreadable")} ${r("common.responseUnreadableAction")}`}function Ee(t){return t instanceof Rt?Ke("unreachable"):t instanceof ls?r("auth.title"):t instanceof dn?r("common.serverError",{status:t.status}):t instanceof Error&&t.message?t.message:r("errors.unknown")}function lr(){const[t,s]=w(""),[n,i]=w(null),[o,a]=w(!1),[m,d]=w("");async function u(){if(t.trim()){a(!0),d("");try{const c=await J("POST","/v1/recall",{query:t.trim(),limit:30}),h=Array.isArray(c)?c:c.entities||[];i(h)}catch(c){d(Ee(c))}finally{a(!1)}}}return e("div",{children:e("div",{class:"card",children:[e("div",{class:"card-title",children:r("search.title")}),e("div",{class:"search-bar",children:[e("input",{type:"search",placeholder:r("search.placeholder"),value:t,onInput:c=>s(c.target.value),onKeyDown:c=>c.key==="Enter"&&u()}),e("button",{class:"btn btn-primary",onClick:u,disabled:o,children:r(o?"search.searching":"search.button")})]}),!o&&n===null&&!m&&e("div",{class:"empty",style:{padding:"32px 20px",color:"var(--text-3)"},children:e("div",{style:{fontSize:13,lineHeight:1.6},children:r("search.hint")})}),m&&e("div",{class:"error-box",role:"alert",children:m}),o&&e("div",{class:"empty",children:e("div",{class:"loading"})}),!o&&n!==null&&n.length===0&&e("div",{class:"empty",role:"status",children:[e("span",{class:"empty-icon",children:"🔍"}),r("search.noResults"),' "',t,'"']}),!o&&n&&n.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:n.length})," ",n.length!==1?r("search.results"):r("search.result")]}),n.map(c=>e("div",{class:"card",style:{padding:14},children:e(tt,{entity:c,highlight:t})},c.id))]})]})})}const Ls=new Set(["release","feature"]),cr=.65,dr=new Set(["release"]),mr=new Set(["lesson_learned","lesson","mistake","bug_fix"]),ur={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 hr(t){if(t.length<3)return[];const i=[...t].sort((d,u)=>d.created_at.localeCompare(u.created_at)),o=[];let a=[i[0]];for(let d=1;d<i.length;d++){const u=i[d-1].created_at,c=i[d].created_at;(new Date(c).getTime()-new Date(u).getTime())/864e5<=7?a.push(i[d]):(o.push(a),a=[i[d]])}o.push(a);const m=[];for(const d of o){if(d.length<3)continue;const u=d.map(c=>({e:c,p:ur[c.type]??99})).sort((c,h)=>c.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:u.e.name,anchorId:u.e.id})}return m}const gr={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 gr[t]??50}function pr(t,s=new Date){const n=new Map;for(const o of t){const a=o.last_accessed_at||o.created_at,m=hn(a,s);let d,u,c;if(m==="today")d="today",u=r("time.today"),c=Number.MAX_SAFE_INTEGER;else if(m==="week"){const l=a.slice(0,10);d=`week:${l}`,u=Ue(a,s),c=new Date(l).getTime()}else if(m==="month"){const l=a.slice(0,10),y=new Date(l),b=new Date(y);b.setDate(y.getDate()-y.getDay());const g=b.toISOString().slice(0,10);d=`month:${g}`,u=Ue(g,s),c=b.getTime()}else{const l=a.slice(0,7);d=`older:${l}`;const y=new Date(l+"-01");u=y.toLocaleDateString(ge(),{year:"numeric",month:"long"}),c=y.getTime()}let h=n.get(d);h||(h={key:d,label:u,sort:c,entries:[]},n.set(d,h)),h.entries.push(o)}const i=Array.from(n.values()).sort((o,a)=>a.sort-o.sort);for(const o of i)o.entries.sort((a,m)=>{const d=rt(a.type)-rt(m.type);return d!==0?d:m.created_at.localeCompare(a.created_at)});return i}function fr({projectName:t,entities:s,onSwitchToList:n}){const[i,o]=w("tree"),a=je(()=>{if(s.length===0)return{total:0,first:null,last:null,types:[]};const g=[...s].sort((M,p)=>M.created_at.localeCompare(p.created_at)),f=new Map;for(const M of s)f.set(M.type,(f.get(M.type)??0)+1);return{total:s.length,first:g[0].created_at,last:g[g.length-1].created_at,types:Array.from(f.entries()).sort((M,p)=>p[1]-M[1])}},[s]),m=je(()=>pr(s),[s]),d=je(()=>s.filter(g=>{if(!Ls.has(g.type))return!1;if(dr.has(g.type))return!0;const f=g.metadata?.signal_score;return typeof f!="number"?!0:f>=cr}).sort((g,f)=>f.created_at.localeCompare(g.created_at)).slice(0,6),[s]),u=je(()=>s.filter(f=>Ls.has(f.type)).length-d.length,[s,d]),c=je(()=>s.filter(g=>mr.has(g.type)).sort((g,f)=>(f.access_count??0)-(g.access_count??0)).slice(0,5),[s]),h=je(()=>hr(s),[s]),l=re(new Map),y=g=>f=>{f?l.current.set(g,f):l.current.delete(g)},b=g=>{const f=l.current.get(g);f&&(f.scrollIntoView({behavior:"smooth",block:"center"}),f.style.transition="background 0.2s",f.style.background="var(--accent-soft)",window.setTimeout(()=>{f.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"})]})}),r("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:["· ",r("roadmap.title")]})]}),e("div",{style:{fontSize:12,color:"var(--text-2)",marginTop:4},children:r("roadmap.summary",{count:a.total,first:a.first?a.first.slice(0,10):"—",last:a.last?a.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:"rgba(255,255,255,0.04)",borderRadius:"var(--radius-xs)",padding:2,border:"1px solid var(--border-subtle)"},children:["tree","mindmap"].map(g=>{const f=i===g;return e("button",{role:"tab","aria-selected":f,onClick:()=>o(g),style:{padding:"4px 10px",background:f?"rgba(0,214,180,0.15)":"transparent",color:f?"var(--accent)":"var(--text-2)",border:"none",borderRadius:"var(--radius-hairline)",fontSize:11,fontFamily:"inherit",cursor:"pointer",fontWeight:f?600:400},children:g==="tree"?`🌲 ${r("roadmap.viewTree")}`:`🧠 ${r("roadmap.viewMindmap")}`},g)})}),n&&e("button",{class:"btn btn-sm",onClick:n,children:r("roadmap.switchToList")})]})]}),a.types.length>0&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginTop:10},children:[a.types.slice(0,8).map(([g,f])=>e("span",{class:"tag",style:{fontSize:11,background:"rgba(255,255,255,0.04)"},children:[We(g)," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)"},children:f})]},g)),a.types.length>8&&e("span",{class:"tag",style:{opacity:.5,fontSize:11},children:["+",a.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:r("roadmap.phases")}),h.map((g,f)=>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:f===h.length-1?"var(--accent-soft)":"transparent",border:"1px solid",borderColor:f===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," · ",Ue(g.startIso)]})]},`${g.startIso}-${g.label}`))]}),i==="mindmap"&&h.length>0&&e(yr,{projectName:t,phases:h,entities:s,onNodeClick:g=>{o("tree"),window.requestAnimationFrame(()=>b(g))}}),i==="mindmap"&&h.length===0&&e("div",{class:"empty",style:{padding:24},children:[r("roadmap.emptyProject")," — ",r("roadmap.mindmapNeedsPhases")]}),i==="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(()=>[]),f=[];for(const p of s){const k=h.findIndex(v=>p.created_at>=v.startIso&&p.created_at<=v.endIso);k>=0?g[k].push(p):f.push(p)}for(const p of g)p.sort((k,v)=>{const R=rt(k.type)-rt(v.type);return R!==0?R:v.created_at.localeCompare(k.created_at)});const M=h.map((p,k)=>({phase:p,entries:g[k],idx:k})).reverse();return e(le,{children:[M.map(({phase:p,entries:k,idx:v},R)=>{const E=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:E?"transparent":"var(--accent)",border:"2px solid var(--accent)",boxSizing:"border-box"}}),e("button",{onClick:()=>p.anchorId!==void 0&&b(p.anchorId),disabled:p.anchorId===void 0,style:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:2,padding:0,background:"transparent",border:"none",color:"inherit",cursor:p.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:[p.label,E&&e("span",{style:{marginLeft:8,fontSize:10,color:"var(--accent)",fontFamily:"var(--mono)",fontWeight:500},children:r("roadmap.activePhase")})]}),e("span",{style:{fontSize:11,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[p.startIso.slice(0,10)," → ",p.endIso.slice(0,10)," · ",k.length===1?r("roadmap.entryCount",{count:1}):r("roadmap.entriesCount",{count:k.length})]})]}),e("div",{style:{marginTop:8},children:k.map((I,D)=>{const X=D===k.length-1;return e("div",{ref:y(I.id),style:{position:"relative",paddingLeft:24,paddingTop:6,paddingBottom:6},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,bottom:X?"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(tt,{entity:I})]},I.id)})})]},`${p.startIso}-${p.label}`)}),f.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:f.length})}),f.map((p,k)=>{const v=k===f.length-1;return e("div",{ref:y(p.id),style:{position:"relative",paddingLeft:24,paddingTop:6,paddingBottom:6},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,bottom:v?"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(tt,{entity:p})]},p.id)})]})]})})()]}):m.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(f=>e("div",{ref:y(f.id),style:{borderBottom:"1px solid var(--border-subtle)",padding:"12px 0"},children:e(tt,{entity:f})},f.id))]},g.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(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(mt,{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:g.name}),e("div",{style:{fontSize:10,color:"var(--text-3)",marginTop:2},children:Ue(g.created_at)})]})]},g.id))]}),c.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")}),c.map(g=>{const f=ut(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(mt,{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:g.name}),e("div",{style:{fontSize:10,color:f.tone==="high"?"var(--accent)":"var(--text-3)",marginTop:2,fontFamily:"var(--mono)"},children:f.tone!=="none"?f.label:r("memory.access.never")})]})]},g.id)})]})]})]})]})}function yr({projectName:t,phases:s,entities:n,onNodeClick:i}){const o=s.map(()=>[]);for(const P of n){const K=s.findIndex(B=>P.created_at>=B.startIso&&P.created_at<=B.endIso);K>=0&&o[K].push(P)}for(const P of o)P.sort((K,B)=>{const $=rt(K.type)-rt(B.type);return $!==0?$:B.created_at.localeCompare(K.created_at)});const a=6,m=o.map(P=>({shown:P.slice(0,a),extra:Math.max(0,P.length-a)})),d=900,u=600,c=d/2,h=u/2,l=170,y=230,b=30,g=P=>2*Math.PI*P/s.length-Math.PI/2,f=re(null),[M,p]=w(1),[k,v]=w(0),[R,E]=w(0),I=re(M),D=re({x:k,y:R});I.current=M,D.current={x:k,y:R};const X=re({active:!1,lastX:0,lastY:0}),[Q,fe]=w(!1),C=.25,N=4,se=(P,K)=>{const B=f.current;if(!B)return{x:0,y:0};const $=B.getBoundingClientRect();return $.width===0||$.height===0?{x:0,y:0}:{x:(P-$.left)/$.width*d,y:(K-$.top)/$.height*u}};ee(()=>{const P=f.current;if(!P)return;const K=B=>{B.preventDefault();const $=I.current,A=D.current,j=Math.exp(-B.deltaY*.0015),U=Math.max(C,Math.min(N,$*j));if(U===$)return;const{x:de,y:Ae}=se(B.clientX,B.clientY),ve=(de-A.x)/$,ze=(Ae-A.y)/$;p(U),v(de-ve*U),E(Ae-ze*U)};return P.addEventListener("wheel",K,{passive:!1}),()=>P.removeEventListener("wheel",K)},[]);const Ce=P=>{let B=P.target;for(;B&&B!==f.current;){if(B.style?.cursor==="pointer")return;B=B.parentElement}P.preventDefault(),X.current.active=!0,X.current.lastX=P.clientX,X.current.lastY=P.clientY,fe(!0)},Se=P=>{if(!X.current.active)return;const K=f.current;if(!K)return;const B=K.getBoundingClientRect();if(B.width===0||B.height===0)return;const $=(P.clientX-X.current.lastX)/B.width*d,A=(P.clientY-X.current.lastY)/B.height*u;X.current.lastX=P.clientX,X.current.lastY=P.clientY,v(j=>j+$),E(j=>j+A)},ie=()=>{X.current.active&&(X.current.active=!1,fe(!1))},Z=()=>{p(1),v(0),E(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:Z,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(M*100)})}),e("svg",{ref:f,viewBox:`0 0 ${d} ${u}`,width:"100%",style:{display:"block",minHeight:600,cursor:Q?"grabbing":"grab",userSelect:"none",touchAction:"none"},onMouseDown:Ce,onMouseMove:Se,onMouseUp:ie,onMouseLeave:ie,onDblClick:Z,children:e("g",{transform:`translate(${k} ${R}) scale(${M})`,children:[s.map((P,K)=>{const B=g(K),$=c+l*Math.cos(B),A=h+l*Math.sin(B);return e("path",{d:`M ${c} ${h} Q ${(c+$)/2} ${(h+A)/2-10} ${$} ${A}`,fill:"none",stroke:"rgba(0, 214, 180, 0.4)",strokeWidth:1.5},`p-${K}`)}),s.map((P,K)=>{const{shown:B}=m[K],$=g(K),A=c+l*Math.cos($),j=h+l*Math.sin($),U=Math.PI/6;return B.map((de,Ae)=>{const ve=B.length===1?.5:Ae/(B.length-1),ze=$-U/2+U*ve,Ne=y+b*(Ae%3),He=c+Ne*Math.cos(ze),Ve=h+Ne*Math.sin(ze);return e("path",{d:`M ${A} ${j} Q ${(A+He)/2} ${(j+Ve)/2} ${He} ${Ve}`,fill:"none",stroke:"rgba(255,255,255,0.18)",strokeWidth:1},`e-${K}-${de.id}`)})}),e("g",{children:[e("circle",{cx:c,cy:h,r:42,fill:"rgba(0, 214, 180, 0.18)",stroke:"var(--accent)",strokeWidth:1.5}),e("text",{x:c,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,K)=>{const B=g(K),$=c+l*Math.cos(B),A=h+l*Math.sin(B),j=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&&i(P.anchorId),onKeyDown:U=>{P.anchorId!==void 0&&(U.key==="Enter"||U.key===" ")&&(U.preventDefault(),i(P.anchorId))},children:[e("circle",{cx:$,cy:A,r:28,fill:"rgba(0, 214, 180, 0.10)",stroke:"var(--accent)",strokeWidth:1.25}),e("text",{x:$,y:A-4,textAnchor:"middle",fontSize:10,fontWeight:600,fill:"var(--text-0)",style:{pointerEvents:"none"},children:[e("tspan",{x:$,dy:0,children:j}),e("tspan",{x:$,dy:12,fontSize:9,fill:"var(--text-3)",fontWeight:400,fontFamily:"var(--mono)",children:[P.entityCount," · ",P.startIso.slice(5,10)]})]})]},`phase-${K}`)}),s.map((P,K)=>{const{shown:B,extra:$}=m[K],A=g(K),j=Math.PI/6;return e("g",{children:[B.map((U,de)=>{const Ae=B.length===1?.5:de/(B.length-1),ve=A-j/2+j*Ae,ze=y+b*(de%3),Ne=c+ze*Math.cos(ve),He=h+ze*Math.sin(ve),Ve=U.name.length>22?U.name.slice(0,20)+"…":U.name;return e("g",{role:"button",tabIndex:0,"aria-label":`${U.name} (${We(U.type)})`,style:{cursor:"pointer"},onClick:()=>i(U.id),onKeyDown:_=>{(_.key==="Enter"||_.key===" ")&&(_.preventDefault(),i(U.id))},children:[e("title",{children:`${U.name} (${U.type})`}),e("circle",{cx:Ne,cy:He,r:4,fill:"var(--text-2)"}),e("text",{x:Ne,y:He-8,textAnchor:Math.cos(ve)>.2?"start":Math.cos(ve)<-.2?"end":"middle",fontSize:9,fill:"var(--text-1)",style:{pointerEvents:"none"},children:Ve})]},U.id)}),$>0&&(()=>{const U=A+j/2+.05,de=y+b*2+10,Ae=c+de*Math.cos(U),ve=h+de*Math.sin(U);return e("text",{x:Ae,y:ve,textAnchor:"middle",fontSize:9,fill:"var(--text-3)",fontStyle:"italic",children:r("roadmap.moreEntities",{count:$})})})()]},`leaves-${K}`)})]})})]})}function cs(){const[t,s]=w(!1),[n,i]=w("");async function o(){i(""),s(!0);try{await J("POST","/v1/demo/seed"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(a){i(Ee(a))}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 o(),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")}),n&&e("div",{role:"alert",style:{marginTop:10,fontSize:12,color:"var(--danger)"},children:n})]})}const qt="memesh.browse.viewMode",Wt=30,Ts=2e3;function Re({label:t,active:s,onClick:n,count:i}){return e("button",{onClick:n,"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,i!==void 0&&e("span",{style:{marginLeft:6,opacity:.6,fontFamily:"var(--mono)",fontSize:10},children:i})]})}function Ps({manage:t,health:s}){const[n,i]=w([]),[o,a]=w([]),[m,d]=w(""),[u,c]=w(!0),[h,l]=w(""),[y,b]=w(0),[g]=is(),[f,M]=w(g?"knowledge":"all"),[p,k]=w("all"),[v,R]=w("all"),[E,I]=w("all"),[D,X]=w("most-recalled"),[Q,fe]=w(()=>{try{return localStorage.getItem(qt)==="list"?"list":"roadmap"}catch{return"roadmap"}}),C=re(0);async function N(){const A=++C.current;c(!0),l("");try{const[j,U]=await Promise.all([J("GET",`/v1/entities?limit=${Ts}&status=all`),un().catch(()=>[])]);if(A!==C.current)return;Array.isArray(j)?i(j):(console.warn("[memesh dashboard] /v1/entities answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",j),i([]),l(Ke("unreadable"))),a(U),b(0),window.dispatchEvent(new Event("memesh:data-changed"))}catch(j){if(A!==C.current)return;console.warn("[memesh dashboard] /v1/entities failed to load:",j),l(Ke(at(j)))}finally{A===C.current&&c(!1)}}ee(()=>{N()},[]),ee(()=>{b(0)},[m,f,p,v,E,D]),ee(()=>{(f==="knowledge"||f==="all")&&M(g?"knowledge":"all")},[g]);const se=je(()=>{const A={all:0,knowledge:0,activity:0,reference:0,session:0};for(const j of n)j.archived||j.status==="archived"||(A.all++,A[Ss(j.type)]++);return A},[n]),Ce=je(()=>{const A=m.toLowerCase();return n.filter(j=>!(f!=="all"&&Ss(j.type)!==f||p!=="all"&&hn(j.last_accessed_at||j.created_at)!==p||v==="recalled"&&(j.access_count??0)===0||v==="never"&&(j.access_count??0)>0||E!=="all"&&ot(j)!==E||A&&![j.name,j.type,...j.observations??[],...j.tags??[]].join(" ").toLowerCase().includes(A)))},[n,f,p,v,E,m]),Se=je(()=>{const A=[...Ce];return D==="most-recalled"?A.sort((j,U)=>(U.access_count??0)-(j.access_count??0)||(U.last_accessed_at??U.created_at).localeCompare(j.last_accessed_at??j.created_at)):D==="created"?A.sort((j,U)=>U.created_at.localeCompare(j.created_at)):A.sort((j,U)=>(U.last_accessed_at??U.created_at).localeCompare(j.last_accessed_at??j.created_at)),A},[Ce,D]),ie=Se.filter(A=>!A.archived&&A.status!=="archived"),Z=Se.filter(A=>A.archived||A.status==="archived"),P=Math.ceil(ie.length/Wt),K=ie.slice(y*Wt,(y+1)*Wt);async function B(A){if(confirm(r("browse.confirmArchive")))try{await J("POST","/v1/forget",{name:A}),N()}catch(j){l(r("browse.archiveFailed",{message:Ee(j)}))}}async function $(A){try{await J("POST","/v1/remember",{name:A,type:"restored"}),N()}catch(j){l(r("browse.restoreFailed",{message:Ee(j)}))}}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(t?"browse.manage":"browse.title")}),!u&&e("div",{style:{fontSize:12,color:"var(--text-3)",marginTop:2},children:[e("span",{style:{fontFamily:"var(--mono)"},children:ie.length.toLocaleString(ge())})," ",r("browse.active"),Z.length>0?e(le,{children:[" · ",e("span",{style:{fontFamily:"var(--mono)"},children:Z.length})," ",r("browse.archived")]}):"",n.length>=Ts&&(s?.entity_count??0)>n.length&&e("span",{children:[" · ",r("browse.truncated",{shown:n.length.toLocaleString(ge()),total:s.entity_count.toLocaleString(ge())})]})]})]}),e("div",{style:{display:"flex",gap:8,minWidth:0,flexShrink:1},children:[e("input",{type:"search",placeholder:r("browse.filter"),value:m,onInput:A=>d(A.target.value),style:{width:"100%",maxWidth:240,minWidth:0}}),e("button",{class:"btn btn-sm",onClick:N,title:r("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:r("browse.filterCategory")}),e(Re,{label:r("cluster.knowledge"),active:f==="knowledge",onClick:()=>M("knowledge"),count:se.knowledge}),e(Re,{label:r("cluster.activity"),active:f==="activity",onClick:()=>M("activity"),count:se.activity}),e(Re,{label:r("cluster.session"),active:f==="session",onClick:()=>M("session"),count:se.session}),e(Re,{label:r("cluster.reference"),active:f==="reference",onClick:()=>M("reference"),count:se.reference}),e(Re,{label:r("cluster.all"),active:f==="all",onClick:()=>M("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:r("browse.filterTime")}),e(Re,{label:r("browse.timeToday"),active:p==="today",onClick:()=>k(p==="today"?"all":"today")}),e(Re,{label:r("browse.timeWeek"),active:p==="week",onClick:()=>k(p==="week"?"all":"week")}),e(Re,{label:r("browse.timeMonth"),active:p==="month",onClick:()=>k(p==="month"?"all":"month")}),e(Re,{label:r("browse.timeOlder"),active:p==="older",onClick:()=>k(p==="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(Re,{label:r("browse.valueRecalled"),active:v==="recalled",onClick:()=>R(v==="recalled"?"all":"recalled")}),e(Re,{label:r("browse.valueNever"),active:v==="never",onClick:()=>R(v==="never"?"all":"never")})]}),o.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(Re,{label:r("cluster.all"),active:E==="all",onClick:()=>I("all")}),o.map(A=>e(Re,{label:A.name,count:A.count,active:E===A.name,onClick:()=>I(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:D,onChange:A=>X(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")})]})]}),h&&e("div",{class:"error-box",role:"alert",style:{marginBottom:12},children:h}),u&&e("div",{class:"empty",children:e("div",{class:"loading"})}),!u&&E!=="all"&&Q==="roadmap"&&!t&&e(fr,{projectName:E,entities:ie,onSwitchToList:()=>{fe("list");try{localStorage.setItem(qt,"list")}catch{}}}),!u&&!h&&(E==="all"||Q==="list"||t)&&n.length===0&&e(cs,{}),!u&&(E==="all"||Q==="list"||t)&&n.length>0&&ie.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"})]})}),m?`${r("browse.noMatch")} "${m}"`:r("browse.emptyFilter")]}),!u&&(E==="all"||Q==="list"||t)&&K.length>0&&e("div",{children:[E!=="all"&&Q==="list"&&!t&&e("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:8},children:e("button",{class:"btn btn-sm",onClick:()=>{fe("roadmap");try{localStorage.setItem(qt,"roadmap")}catch{}},children:r("roadmap.switchToRoadmap")})}),K.map(A=>e("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"14px 0"},children:e(tt,{entity:A,highlight:m,actions:t?e("button",{class:"btn btn-danger btn-sm",onClick:()=>B(A.name),children:r("browse.archive")}):void 0})},A.id)),P>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(A=>A-1),children:r("browse.prev")}),e("span",{style:{color:"var(--text-3)",fontFamily:"var(--mono)",fontSize:12},children:[y+1," / ",P]}),e("button",{class:"btn btn-sm",disabled:y>=P-1,onClick:()=>b(A=>A+1),children:r("browse.next")})]})]}),!u&&Z.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:[r("browse.archived")," (",Z.length,")"]}),Z.slice(0,10).map(A=>e("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"14px 0"},children:e(tt,{entity:A,highlight:m,actions:e("button",{class:"btn btn-sm",onClick:()=>$(A.name),children:r("browse.restore")})})},A.id)),Z.length>10&&e("div",{style:{fontSize:12,color:"var(--text-3)",padding:"12px 0",textAlign:"center"},children:["+",Z.length-10," ",r("browse.moreArchived")]})]})]})})}function Rs(t){return t>=80?"var(--success)":t>=60?"var(--accent)":t>=40?"var(--warning)":"var(--danger)"}function br(t){return t>=80?r("health.excellent"):t>=60?r("health.good"):t>=40?r("health.fair"):r("health.poor")}const vr=["activity","quality","freshness","lessons"];function kr({score:t,factors:s}){const n=Rs(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 ${n}`,display:"flex",alignItems:"center",justifyContent:"center"},children:e("span",{style:{fontFamily:"var(--mono)",fontSize:"24px",fontWeight:700,color:n,letterSpacing:"-0.02em"},children:t})}),e("span",{style:{marginTop:"6px",fontSize:"11px",fontWeight:500,color:"var(--text-2)"},children:br(t)})]}),e("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:"10px"},children:vr.map(i=>{const o=s[i],a=Math.round(o.score/o.weight*100),m=Rs(a);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.${i}`)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:"11px",color:"var(--text-3)"},children:[a,"%"]})]}),e("div",{style:{height:"4px",borderRadius:"2px",background:"var(--bg-0)",overflow:"hidden"},children:e("div",{style:{height:"100%",width:`${a}%`,borderRadius:"2px",background:m,transition:"width 600ms ease-out"}})})]},i)})})]})]})}const Ze=220,Ie=36,De=2;function wr({trend:t}){if(!t||t.length===0)return e("svg",{width:Ze,height:Ie,style:{display:"block"},children:e("line",{x1:0,y1:Ie/2,x2:Ze,y2:Ie/2,stroke:"rgba(255,255,255,0.06)",strokeWidth:1})});if(t.length===1){const m=Ze/2,d=Ie/2;return e("svg",{width:Ze,height:Ie,style:{display:"block"},children:[e("line",{x1:De,y1:Ie-De,x2:Ze-De,y2:Ie-De,stroke:"rgba(255,255,255,0.06)",strokeWidth:1}),e("circle",{cx:m,cy:d,r:3,fill:"var(--accent)"})]})}const s=Math.max(1,...t.map(m=>m.count)),n=(Ze-De*2)/(t.length-1),i=t.map((m,d)=>{const u=De+d*n,c=Ie-De-m.count/s*(Ie-De*2);return`${u.toFixed(1)},${c.toFixed(1)}`}),o=`M${i[0]} L${i.slice(1).join(" L")}`,a=`${o} L${De+(t.length-1)*n},${Ie-De} L${De},${Ie-De} Z`;return e("svg",{width:Ze,height:Ie,style:{display:"block"},children:[e("path",{d:a,fill:"rgba(0, 214, 180, 0.12)"}),e("path",{d:o,fill:"none",stroke:"var(--accent)",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"}),t.map((m,d)=>{const[u,c]=i[d].split(",");return d===t.length-1?e("circle",{cx:u,cy:c,r:2.5,fill:"var(--accent)"},d):null})]})}function xr({metric:t}){const{reusedThisWeek:s,trend:n,computedFrom:i}=t,o=i==="last_accessed_at_approximation",a=n.slice(0,Math.max(0,n.length-7)).slice(-7).reduce((u,c)=>u+c.count,0),m=n.slice(-7).reduce((u,c)=>u+c.count,0),d=a>0?Math.round((m-a)/a*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: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(--accent)":"var(--text-2)",fontFamily:"var(--font)",letterSpacing:"-0.03em"},children:s>0?s.toLocaleString(ge()):"—"}),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")}),o&&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(wr,{trend:n}),e("div",{style:{fontSize:10,color:"var(--text-3)",fontFamily:"var(--mono)"},children:r("loop.sparkLabel")})]})]})}function gn(t,s){const n=getComputedStyle(t),i={};for(const o of s)i[o]=n.getPropertyValue(o).trim();return i}function Ut(t,s){const n=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(t.trim());if(!n)return t;const i=parseInt(n[1],16),o=parseInt(n[2],16),a=parseInt(n[3],16);return`rgba(${i}, ${o}, ${a}, ${s})`}const bt=8,_r=8,Mr=20,vt=8,pn=120,fn="rgba(0, 214, 180, 0.3)",Cr=1.5;function js(t,s){t.style.width="";const n=window.devicePixelRatio||1,o=t.getBoundingClientRect().width,a=pn,m=o-vt-_r,d=a-bt-Mr;if(s.length===0||m<=0||d<=0)return;t.width=o*n,t.height=a*n,t.style.width=`${o}px`,t.style.height=`${a}px`;const u=t.getContext("2d");if(!u)return;u.scale(n,n);const c=gn(t,["--accent","--text-3","--font"]),h=c["--accent"],l=c["--text-3"],y=`9px ${c["--font"]}`,b=Math.max(1,...s.map(v=>v.created)),g=Math.max(1,...s.map(v=>v.recalled)),f=Math.max(b,g),M=s.length,p=1,k=Math.max(1,(m-p*(M-1))/M);u.fillStyle=fn;for(let v=0;v<M;v++){const E=s[v].created/f*d,I=vt+v*(k+p),D=bt+d-E;u.fillRect(I,D,k,E)}u.beginPath(),u.strokeStyle=h,u.lineWidth=Cr,u.lineJoin="round",u.lineCap="round";for(let v=0;v<M;v++){const R=s[v],E=vt+v*(k+p)+k/2,I=bt+d-R.recalled/f*d;v===0?u.moveTo(E,I):u.lineTo(E,I)}u.stroke(),u.fillStyle=l,u.font=y,u.textAlign="center",u.textBaseline="top";for(let v=0;v<M;v+=7){const R=s[v],E=R.date.split("-"),I=E.length>=3?`${E[1]}-${E[2]}`:R.date,D=vt+v*(k+p)+k/2,X=bt+d+4;u.fillText(I,D,X)}}function Sr({data:t}){const s=re(null);ee(()=>{const o=s.current;if(!o)return;js(o,t);const a=new ResizeObserver(()=>js(o,t));return a.observe(o),()=>a.disconnect()},[t]);const n=t.reduce((o,a)=>o+a.created,0),i=t.reduce((o,a)=>o+a.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:fn}}),r("timeline.created"),e("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:n})]}),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)"}}),r("timeline.recalled"),e("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:i})]})]})]}),e("canvas",{ref:s,style:{width:"100%",height:`${pn}px`,display:"block"}})]})}const Kt=["week","month","quarter","older"];function Ar(t){return r(`ageMatrix.bucket.${t}`)}const Er=["lesson_learned","lesson","mistake","decision","architecture_decision","pattern","technical_pattern","best_practice","bug_fix","workflow_checkpoint","process","architecture","feature"];function Lr(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 Tr({data:t}){if(!t||t.length===0)return null;const s=new Map;for(const o of t)s.has(o.type)||s.set(o.type,new Map),s.get(o.type).set(o.bucket,o.count);const n=Er.filter(o=>s.has(o)),i=Math.max(1,...t.map(o=>o.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%"}}),Kt.map(o=>e("col",{style:{width:"18%"}},o))]}),e("thead",{children:e("tr",{children:[e("th",{style:{textAlign:"left",padding:"4px 8px",color:"var(--text-2)",fontWeight:400},children:r("ageMatrix.typeColumn")}),Kt.map(o=>e("th",{style:{textAlign:"center",padding:"4px 6px",color:"var(--text-2)",fontWeight:400},children:Ar(o)},o))]})}),e("tbody",{children:n.map(o=>{const a=s.get(o),m=Array.from(a.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:[We(o),e("span",{style:{color:"var(--text-3)",marginLeft:4},children:["(",m,")"]})]}),Kt.map(d=>{const u=a.get(d)??0;return e("td",{style:{textAlign:"center",padding:"5px 6px",background:Lr(u,i),borderRadius:"var(--radius-xs)",color:u>0?"var(--accent)":"var(--text-3)",fontFamily:"var(--mono)",fontWeight:u>0?600:400,fontSize:11,transition:"background 0.2s"},children:u>0?u:"·"},d)})]},o)})})]})}),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(o=>e("span",{style:{display:"inline-block",width:14,height:10,borderRadius:"var(--radius-hairline)",background:`rgba(0,214,180,${o})`}},o)),e("span",{children:r("ageMatrix.high")}),e("span",{style:{marginLeft:8},children:["— ",r("ageMatrix.legend")]})]})]})}function zs(t){return r(`radar.axis.${t}`)}const et=220,yn=et/2,bn=et/2,kt=80,wt=14;function xt(t,s){const n=(t-90)*(Math.PI/180);return[yn+s*Math.cos(n),bn+s*Math.sin(n)]}function Pr({data:t}){if(!t||t.length===0)return null;const s=t.length,n=Math.max(1,...t.map(d=>d.count)),i=t.map((d,u)=>360/s*u),o=t.map((d,u)=>{const c=d.count/n,h=wt+c*(kt-wt);return xt(i[u],h)}),a=o.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:et,height:et,viewBox:`0 0 ${et} ${et}`,style:{flexShrink:0},children:[m.map(d=>{const u=i.map(c=>{const h=wt+d*(kt-wt),[l,y]=xt(c,h);return`${l.toFixed(1)},${y.toFixed(1)}`});return e("polygon",{points:u.join(" "),fill:"none",stroke:"rgba(255,255,255,0.06)",strokeWidth:1},d)}),i.map((d,u)=>{const[c,h]=xt(d,kt);return e("line",{x1:yn,y1:bn,x2:c.toFixed(1),y2:h.toFixed(1),stroke:"rgba(255,255,255,0.06)",strokeWidth:1},u)}),e("path",{d:a,fill:"rgba(0,214,180,0.15)",stroke:"var(--accent)",strokeWidth:1.5,strokeLinejoin:"round"}),o.map(([d,u],c)=>e("circle",{cx:d.toFixed(1),cy:u.toFixed(1),r:3,fill:"var(--accent)"},c)),t.map((d,u)=>{const c=i[u],[h,l]=xt(c,kt+18),y=zs(d.axis);return e("text",{x:h.toFixed(1),y:l.toFixed(1),textAnchor:"middle",dominantBaseline:"middle",fontSize:9,fill:"var(--text-2)",fontFamily:"var(--font)",children:y},u)})]}),e("div",{style:{flex:1,minWidth:120},children:[t.map(d=>{const u=n>0?d.count/n: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:zs(d.axis)}),e("span",{style:{color:"var(--accent)",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(--accent)",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 Rr({data:t}){const{workSchedule:s,toolPreferences:n,focusAreas:i,workflow:o,strengths:a,learningAreas:m}=t,d=new Map;for(const l of s.hourDistribution)d.set(l.hour,l.count);const u=Math.max(1,...s.hourDistribution.map(l=>l.count)),c=[...s.hourDistribution].sort((l,y)=>y.count-l.count).slice(0,3).map(l=>`${l.hour.toString().padStart(2,"0")}:00`),h=[...s.dayDistribution].sort((l,y)=>y.count-l.count).slice(0,2).map(l=>r(`patterns.day.${l.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},(l,y)=>{const b=d.get(y)||0,g=b/u;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:[r("patterns.peakHours"),": ",c.join(", "),h.length>0&&e("span",{children:[" · ",r("patterns.busiestDays"),": ",h.join(", ")]})]})]}),n.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:n.slice(0,10).map(l=>e("span",{class:"tag",style:{fontSize:11,padding:"2px 8px"},children:[l.tool," ",e("span",{style:{opacity:.5},children:["(",l.sessions,")"]})]},l.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:o.avgSessionMinutes>0?`${Math.round(o.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:o.totalSessions>0?o.commitsPerSession.toFixed(1):"—"}),e("div",{class:"stat-lbl",children:r("patterns.commitsPerSession")})]})]})]}),i.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:i.slice(0,12).map(l=>e("span",{class:"tag",style:{fontSize:11,padding:"2px 8px"},children:[We(l.type)," ",e("span",{style:{opacity:.5},children:["(",l.count,")"]})]},l.type))})]}),(a.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")}),a.slice(0,5).map(l=>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:We(l.type)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:11,color:"var(--accent)"},children:[Math.round(l.avgConfidence*100),"%"]})]}),e("div",{style:{height:3,borderRadius:"var(--radius-hairline)",background:"var(--bg-0)"},children:e("div",{style:{height:"100%",width:`${Math.round(l.avgConfidence*100)}%`,borderRadius:"var(--radius-hairline)",background:"rgba(0, 214, 180, 0.5)",transition:"width 600ms ease-out"}})})]},l.type)),a.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(l=>e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:6,fontSize:12},children:[e("span",{style:{color:"var(--text-1)"},children:l.tag}),e("span",{style:{fontFamily:"var(--mono)",fontSize:11,color:"var(--text-3)"},children:l.count})]},l.tag)),m.length===0&&e("div",{style:{fontSize:11,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]})]})]})}function jr(t){const s=`telemetry.flow.${t}`,n=r(s);return n===s?t:n}function zr(t){const s=`telemetry.errorClass.${t}`,n=r(s);return n===s?t:n}function Is(t){return`${Math.round(t*100)}%`}function Ir(t){return t==null?"—":t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`}function Dr(){const[t,s]=w(null),[n,i]=w(""),[o,a]=w(null),[m,d]=w(!0),[u,c]=w(30);return ee(()=>{let h=!1;return d(!0),i(""),J("GET",`/v1/telemetry?window=${u}`).then(l=>{if(!h){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=>{h||(console.warn("[memesh dashboard] /v1/telemetry failed to load:",l),a(at(l)),i(l instanceof Error?l.message:String(l)))}).finally(()=>{h||d(!1)}),()=>{h=!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:r("telemetry.title")}),e("div",{style:{display:"flex",gap:4,fontSize:12},children:[7,30,90].map(h=>e("button",{class:"btn btn-ghost",style:{padding:"2px 8px",fontSize:11,border:"1px solid "+(u===h?"var(--accent)":"var(--border)"),color:u===h?"var(--accent)":"var(--text-2)",background:u===h?"rgba(0,214,180,0.10)":"transparent"},onClick:()=>c(h),children:r("telemetry.lastNDays",{n:h})},h))})]}),m&&e("div",{style:{color:"var(--text-3)",fontSize:13},children:r("telemetry.loading")}),!m&&o&&e("div",{class:"error-box",role:"alert",style:{fontSize:13},children:Ke(o)}),!m&&!o&&t&&t.summaries.length===0&&e("div",{style:{color:"var(--text-2)",fontSize:13,padding:8},children:r("telemetry.empty")}),!m&&!o&&t&&t.summaries.length>0&&e("div",{style:{display:"flex",flexDirection:"column",gap:12},children:t.summaries.map(h=>{const l=h.total_attempts>0?h.successes/h.total_attempts:0,y=h.total_calls>0?h.fallback_used/h.total_calls:0,b=Object.entries(h.by_provider),g=Object.entries(h.by_model),f=Object.entries(h.by_project),M=Object.entries(h.by_error_class).sort((p,k)=>k[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:jr(h.flow)}),e("span",{style:{fontSize:12,color:"var(--text-3)"},children:[r("telemetry.callsCount",{n:h.total_calls})," · ",r("telemetry.attemptsCount",{n:h.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(--accent)":l>=.5?"var(--warning)":"var(--danger)"},children:Is(l)})]}),e("span",{children:[e("span",{style:{color:"var(--text-3)"},children:[r("telemetry.medianLatency"),": "]}),e("strong",{children:Ir(h.median_latency_ms)})]}),h.fallback_used>0&&e("span",{style:{color:"var(--warning)"},children:["⚠️ ",r("telemetry.fallbackUsed",{n:h.fallback_used,pct:Is(y)})]})]}),b.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[r("telemetry.byProvider"),":"," ",b.map(([p,k])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[p," ",k.ok,"/",k.ok+k.fail]},p))]}),g.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[r("telemetry.byModel"),":"," ",g.map(([p,k])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[p," ",k.ok,"/",k.ok+k.fail]},p))]}),f.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)",marginBottom:4},children:[r("telemetry.byProject"),":"," ",f.map(([p,k])=>e("span",{class:"tag",style:{marginRight:6,fontSize:11},children:[p," ",k.ok,"/",k.ok+k.fail]},p))]}),M.length>0&&e("div",{style:{fontSize:12,color:"var(--text-2)"},children:[r("telemetry.errors"),":"," ",M.map(([p,k])=>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:[zr(p)," ×",k]},p))]})]},h.flow)})})]})}function Ds(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 Hr(){const[t,s]=w(null),[n,i]=w(null);if(ee(()=>{J("GET","/v1/analytics/pm").then(m=>{m!==null&&!Ds(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=>i(String(m)))},[]),n)return console.warn("[PmAnalyticsPanel]",n),null;if(!Ds(t))return null;const o=(t.connectedness.orphanRate*100).toFixed(1),a=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:a},children:[o,"%"]}),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 Nr=["activity","quality","freshness","lessons"];function Fr(t){return typeof t?.totalEntities=="number"&&typeof t.totalObservations=="number"&&typeof t.totalRelations=="number"&&typeof t.totalTags=="number"&&Array.isArray(t.tagDistribution)}function Vt(t,s,n){return!n&&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),n}function Or(t){if(typeof t?.healthScore!="number")return!1;const s=t.healthFactors;if(!s)return!1;for(const n of Nr)if(typeof s[n]?.score!="number"||typeof s[n]?.weight!="number")return!1;return Array.isArray(t.loopMetric?.trend)&&Array.isArray(t.timeline)}function Br(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 qr(){const[t,s]=w(null),[n,i]=w(null),[o,a]=w(null),[m,d]=w(!0),[u,c]=w(null),h=Me(()=>{d(!0);let l=!1,y=!1;const b=g=>f=>(console.warn(`[memesh dashboard] ${g} failed to load:`,f),at(f)==="unreachable"?l=!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,f,M])=>{const p=Vt("/v1/stats",g,Fr(g)),k=Vt("/v1/analytics",f,Or(f)),v=Vt("/v1/patterns",M,Br(M));(g!==null&&!p||f!==null&&!k||M!==null&&!v)&&(y=!0),s(p?g:null),i(k?f:null),a(v?M:null),c(l?"unreachable":y?"unreadable":null)}).finally(()=>d(!1))},[]);return ee(()=>{h()},[h]),m?e("div",{class:"empty",children:e("div",{class:"loading"})}):!t&&!n?e("div",{class:"error-box",role:"alert",children:u?Ke(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(ge())}),e("div",{class:"stat-lbl",children:r("analytics.totalMemories")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalObservations.toLocaleString(ge())}),e("div",{class:"stat-lbl",children:r("analytics.knowledgeFacts")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalRelations.toLocaleString(ge())}),e("div",{class:"stat-lbl",children:r("analytics.connections")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.totalTags.toLocaleString(ge())}),e("div",{class:"stat-lbl",children:r("analytics.topics")})]})]}),n&&e("div",{style:{marginTop:8},children:e(xr,{metric:n.loopMetric})}),n&&e("div",{style:{marginTop:8},children:e(kr,{score:n.healthScore,factors:n.healthFactors})}),n&&e("div",{style:{marginTop:8},children:e(Sr,{data:n.timeline})}),n&&e("div",{style:{marginTop:8,display:"grid",gridTemplateColumns:"minmax(0, 1.4fr) minmax(0, 1fr)",gap:8},children:[e(Tr,{data:Array.isArray(n.ageMatrix)?n.ageMatrix:[]}),e(Pr,{data:Array.isArray(n.knowledgeRadar)?n.knowledgeRadar:[]})]}),o&&e("div",{style:{marginTop:8},children:e(Rr,{data:o})}),e("div",{style:{marginTop:8},children:e(Dr,{})}),e(Hr,{}),t&&(()=>{const l=["auto_saved","auto-tracked","session_end","session:","source:","scope:","date:","urgency:"],y=t.tagDistribution.filter(b=>!l.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:r("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 Wr=[["ollama","Ollama (Local)"],["openai","OpenAI"],["anthropic","Anthropic (Claude)"]];function Ur(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 Kr(t){return typeof t?.config=="object"&&t.config!==null}function Vr(t){return typeof t?.checkSucceeded=="boolean"&&typeof t.freshness=="string"&&typeof t.updateAvailable=="boolean"}function Hs(t){return t&&t.charAt(0).toUpperCase()+t.slice(1)}function Ns(t){if(t.errorCode){const s=/^http_(\d+)$/.exec(t.errorCode),n=s?"settings.testError.http":`settings.testError.${t.errorCode}`,i=s?r(n,{status:s[1]}):r(n);if(i!==n)return t.error?`${i} — ${t.error}`:i}return t.error||r("settings.testFailed")}function Fs(t,s){if(!s)return"—";const n=new Date(s);return Number.isNaN(n.getTime())?s:n.toLocaleString(t)}function $r(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 Gr(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 Yr({locale:t,onLocaleChange:s}){const[n,i]=w(null),[o,a]=w(null),[m,d]=w(""),[u,c]=w(""),[h,l]=w(""),[y,b]=w(""),[g,f]=w(""),[M,p]=w(!1),[k,v]=w(!1),[R,E]=w(""),[I,D]=w(null),[X,Q]=w(!1),[fe,C]=w(!0),[N,se]=w(!0),[Ce,Se]=w(!1),[ie,Z]=w([]),[P,K]=w([]),[B,$]=w(null),[A,j]=w(!1),[U,de]=w("");async function Ae(x=!0,T=!1){T?Se(!0):se(!0);try{const O=await J("GET",x?"/v1/update-status":"/v1/update-status?cached=1");if(!Vr(O)){console.warn("[memesh dashboard] /v1/update-status answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",O),T||a(null);return}a(O)}catch{T||a(null)}finally{T?Se(!1):se(!1)}}ee(()=>{let x=!1;return J("GET","/v1/config").then(T=>{if(!Kr(T)){T!==null&&console.warn("[memesh dashboard] /v1/config answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",T),i(null);return}i(T);const z=T.config.llm?.provider||"",O=T.config.llm?.model||"";d(z),l(O),b(z),f(O),p(!!T.config.llm?.apiKey);const Y=(T.config.llmFallbacks??[]).map((xe,$e)=>({provider:xe.provider,model:xe.model??"",apiKey:"",hasStoredKey:!!xe.apiKey,originalIndex:$e}));Z(Y),K(Y.map(()=>null))}).catch(T=>{console.warn("[memesh dashboard] /v1/config failed to load:",T),i(null)}).finally(()=>C(!1)),(async()=>(await Ae(!1),x||Ae(!0,!0)))(),()=>{x=!0}},[]);async function ve(){Q(!0),E(""),D(null);try{const x=await J("POST","/v1/config/test",{provider:m,...u?{apiKey:u}:{}});D(x),x.valid&&!h&&x.suggested&&l(x.suggested)}catch(x){D({valid:!1,error:Ee(x)})}finally{Q(!1)}}function ze(x){d(x),D(null),l("")}function Ne(x){c(x),D(null)}async function He(){v(!0),E("");try{const x={provider:m};h&&(x.model=h),u&&(x.apiKey=u),await J("POST","/v1/config",{llm:x}),E(r("settings.saved")),u&&p(!0),c(""),D(null),b(m),f(h)}catch(x){E(r("common.error")+": "+Ee(x))}finally{v(!1)}}async function Ve(){if(confirm(r("settings.removeProviderConfirm"))){v(!0),E("");try{await J("POST","/v1/config",{llm:null}),d(""),l(""),c(""),b(""),f(""),p(!1),D(null),E(r("settings.providerRemoved"))}catch(x){E(r("common.error")+": "+Ee(x))}finally{v(!1)}}}async function _(x,T){E("");try{await J("POST","/v1/config",x),i(z=>z&&T(z)),E(r("settings.saved"))}catch(z){E(r("common.error")+": "+Ee(z))}}function H(x,T){Z(z=>z.map((O,Y)=>Y===x?{...O,...T}:O)),K(z=>z.map((O,Y)=>Y===x?null:O))}function F(x,T){Z(z=>z.map((O,Y)=>Y===x?{...O,provider:T,model:"",apiKey:"",hasStoredKey:!1,originalIndex:null}:O)),K(z=>z.map((O,Y)=>Y===x?null:O))}function q(){Z(x=>[...x,{provider:"ollama",model:"",apiKey:"",hasStoredKey:!1,originalIndex:null}]),K(x=>[...x,null]),de("")}function G(x){Z(T=>T.filter((z,O)=>O!==x)),K(T=>T.filter((z,O)=>O!==x)),de("")}function te(x,T){const z=x+T;Z(O=>{if(z<0||z>=O.length)return O;const Y=O.slice();return[Y[x],Y[z]]=[Y[z],Y[x]],Y}),K(O=>{if(z<0||z>=O.length)return O;const Y=O.slice();return[Y[x],Y[z]]=[Y[z],Y[x]],Y}),de("")}async function ne(x){const T=ie[x];if(T){$(x),de("");try{const z=T.apiKey.trim(),O=await J("POST","/v1/config/test",{provider:T.provider,...z?{apiKey:z}:T.hasStoredKey&&T.originalIndex!==null?{fallbackIndex:T.originalIndex}:{}});K(Y=>Y.map((xe,$e)=>$e===x?O:xe))}catch(z){K(O=>O.map((Y,xe)=>xe===x?{valid:!1,error:Ee(z)}:Y))}finally{$(null)}}}async function ke(){j(!0),de("");try{const x=ie.map(Ur);await J("POST","/v1/config",{llmFallbacks:x}),Z(T=>T.map((z,O)=>{const Y=z.provider!=="ollama"&&(z.hasStoredKey||!!z.apiKey.trim());return{...z,hasStoredKey:Y,originalIndex:Y?O:null,apiKey:""}})),de(r("settings.saved"))}catch(x){de(r("common.error")+": "+Ee(x))}finally{j(!1)}}if(fe)return e("div",{class:"empty",children:e("div",{class:"loading"})});const me=n?.capabilities,Pe=me?.searchLevel?r("settings.smartMode"):r("settings.core"),pe=N||Ce&&!o,Ye=N||Ce,Qe=!!o?.currentVersionDeprecated,Fe=!!(o?.latestVersion&&o.latestVersion!==o.currentVersion),W=!!(Qe&&o?.latestVersion&&o.latestVersion===o.currentVersion&&o?.freshness==="fresh"),Le=!!(o?.checkSucceeded&&o?.lastError),L=pe?r("settings.updateChecking"):o?Qe?r(Fe?"settings.updateAvailable":W?"settings.updateDeprecatedNoTarget":"settings.updateDeprecatedTargetUnknown"):o.freshness==="unavailable"?r("settings.updateNoSuccessfulChecks"):!o.checkSucceeded&&o.freshness==="stale"?r("settings.updateStale"):!o.checkSucceeded&&o.freshness==="cached"?r("settings.updateCachedFallback"):o.updateAvailable?r("settings.updateAvailable"):r(Le?"settings.updatePartialSummary":"settings.upToDate"):r("settings.updateUnavailable"),we=o?Qe?"var(--danger)":o.freshness==="unavailable"||!o.checkSucceeded&&o.freshness==="stale"?"var(--warning)":!o.checkSucceeded&&o.freshness==="cached"||o.updateAvailable?"var(--info)":Le?"var(--warning)":"var(--success)":"var(--warning)",Te=o?.freshness==="stale"?r("settings.updateSourceStale"):o?.source==="cache"?r("settings.updateSourceCached"):o?.source==="fresh"?r("settings.updateSourceFresh"):r("settings.updateSourceUnavailable"),ht=$r(o?.installChannel),gt=Gr(o?.installChannel),It=pe?r("common.loading"):Fs(t,o?.lastAttemptAt||null),Dt=pe?r("common.loading"):Fs(t,o?.lastSuccessfulCheckAt||null),Ht=!!o?.lastSuccessfulCheckAt,pt=!!o?.lastError&&!pe;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:Pe}),e("div",{class:"stat-lbl",children:r("settings.searchMode")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:14},children:Hs(me?.embeddings||"—")}),e("div",{class:"stat-lbl",children:r("settings.embeddings")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{fontSize:14},children:Hs(me?.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:me?.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:x=>{x.preventDefault(),He()},children:[e("div",{style:{display:"flex",gap:16,marginBottom:14,flexWrap:"wrap"},children:[["anthropic","Anthropic (Claude)"],["openai","OpenAI"],["ollama","Ollama (Local)"]].map(([x,T])=>e("label",{style:{display:"flex",alignItems:"center",gap:5,cursor:"pointer",fontSize:13},children:[e("input",{type:"radio",name:"provider",value:x,checked:m===x,onChange:()=>ze(x)}),T]},x))}),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:x=>Ne(x.target.value),style:{flex:1}}),e("button",{type:"button",class:"btn",onClick:()=>void ve(),disabled:m===""||X||m!=="ollama"&&u===""&&!(M&&m===y),title:M&&m===y&&u===""?r("settings.testStoredKeyHint"):void 0,style:{flexShrink:0},children:r(X?"settings.testing":"settings.test")})]})]}),m==="ollama"&&e("div",{style:{marginBottom:12},children:e("button",{type:"button",class:"btn",onClick:()=>void ve(),disabled:X,children:r(X?"settings.testing":"settings.test")})}),I&&e("div",{role:I.valid?"status":"alert",style:{marginBottom:12,padding:"8px 10px",borderRadius:"var(--radius-xs)",fontSize:12,background:I.valid?"var(--accent-soft)":"var(--danger-soft)",border:`1px solid ${I.valid?"rgba(0, 214, 180, 0.4)":"rgba(255, 107, 107, 0.4)"}`,color:I.valid?"var(--accent)":"var(--danger)"},children:I.valid?r("settings.testPassed",{count:I.models?.length??0}):`✗ ${Ns(I)}`}),I?.valid&&I.models&&I.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"),I.suggested&&e("span",{style:{marginLeft:6,color:"var(--text-3)",fontWeight:400},children:["(",r("settings.suggested"),": ",e("span",{style:{color:"var(--accent)"},children:I.suggested}),")"]})]}),e("select",{value:h,onChange:x=>l(x.target.value),style:{width:"100%"},children:I.models.map(x=>e("option",{value:x.id,children:[x.id,x.created?` — ${x.created.slice(0,10)}`:""]},x.id))})]}),(()=>{const T=(m!==y||!!u||h!==g)&&!I?.valid;return e("div",{style:{display:"flex",gap:10,alignItems:"center",flexWrap:"wrap"},children:[e("button",{class:"btn btn-primary",type:"submit",disabled:!m||k||T,children:r(k?"settings.saving":"settings.save")}),M&&e("button",{type:"button",class:"btn",onClick:Ve,disabled:k,style:{borderColor:"var(--danger)",color:"var(--danger)",background:"transparent"},title:r("settings.removeProviderHint"),children:r("settings.removeProvider")}),T&&e("span",{style:{fontSize:11,color:"var(--text-3)"},children:r("settings.testRequired")}),R&&e("span",{role:R.startsWith(r("common.error"))?"alert":"status",style:{fontSize:12,color:R.startsWith(r("common.error"))?"var(--danger)":"var(--success)"},children:R})]})})()]})]}),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, 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:r("settings.fallbacks.privacyTitle")}),e("div",{children:r("settings.fallbacks.privacyBody")})]}),ie.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:ie.map((x,T)=>{const z=x.provider!=="ollama",O=P[T],Y=z&&!x.apiKey.trim()&&!x.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:T+1})}),e("div",{style:{display:"flex",gap:6},children:[e("button",{type:"button",class:"btn btn-sm",onClick:()=>te(T,-1),disabled:T===0,"aria-label":r("settings.fallbacks.moveUp"),title:r("settings.fallbacks.moveUp"),children:"↑"}),e("button",{type:"button",class:"btn btn-sm",onClick:()=>te(T,1),disabled:T===ie.length-1,"aria-label":r("settings.fallbacks.moveDown"),title:r("settings.fallbacks.moveDown"),children:"↓"}),e("button",{type:"button",class:"btn btn-sm",onClick:()=>G(T),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:x.provider,onChange:xe=>F(T,xe.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:Wr.map(([xe,$e])=>e("option",{value:xe,children:$e},xe))})]}),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:x.model,placeholder:r("settings.fallbacks.modelPlaceholder"),onInput:xe=>H(T,{model:xe.target.value}),style:{width:"100%",fontFamily:"var(--mono)"}})]})]}),z&&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:x.provider==="anthropic"?"sk-ant-api03-…":"sk-…",value:x.apiKey,onInput:xe=>H(T,{apiKey:xe.target.value}),style:{width:"100%"}}),x.hasStoredKey&&!x.apiKey.trim()&&e("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:4},children:r("settings.fallbacks.apiKeyStoredHint")}),Y&&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 ne(T),disabled:B===T,children:r(B===T?"settings.testing":"settings.test")}),O&&e("span",{role:O.valid?"status":"alert",style:{fontSize:12,color:O.valid?"var(--success)":"var(--danger)"},children:O.valid?r("settings.testPassed",{count:O.models?.length??0}):`✗ ${Ns(O)}`})]})]},T)})}),e("div",{style:{display:"flex",gap:10,alignItems:"center",marginTop:14,flexWrap:"wrap"},children:[e("button",{type:"button",class:"btn",onClick:q,children:r("settings.fallbacks.add")}),e("button",{type:"button",class:"btn btn-primary",onClick:()=>void ke(),disabled:A,children:r(A?"settings.saving":"settings.fallbacks.save")}),U&&e("span",{role:U.startsWith(r("common.error"))?"alert":"status",style:{fontSize:12,color:U.startsWith(r("common.error"))?"var(--danger)":"var(--success)"},children:U})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:r("settings.updates")}),o?.currentVersionDeprecated&&o.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:r("settings.updateDeprecatedTitle",{version:o.currentVersion})}),e("div",{style:{marginTop:4,opacity:.9},children:o.deprecationMessage})]}),o&&o.checkSucceeded&&o.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:r("settings.updatePartialTitle")}),e("div",{style:{marginTop:4,opacity:.9},children:r("settings.updatePartialDescription",{message:o.lastError??""})})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,alignItems:"baseline",marginBottom:12,flexWrap:"wrap"},children:[e("div",{style:{color:we,fontSize:13,fontWeight:600},children:L}),e("div",{style:{display:"flex",gap:10,alignItems:"center",flexWrap:"wrap"},children:[!pe&&o&&e("div",{style:{fontSize:11,color:"var(--text-2)"},children:Te}),e("button",{class:"btn btn-sm",type:"button",onClick:()=>{Ae(!0,!!o)},disabled:Ye,children:r(Ye?"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:pe?r("common.loading"):ht})]}),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:o?.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:o?.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:It})]}),Ht&&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:Dt})]}),!N&&e("div",{style:{color:"var(--text-2)",fontSize:12,lineHeight:1.5,marginTop:2},children:gt}),pt&&e("div",{style:{color:"var(--warning)",fontSize:12,lineHeight:1.5},children:r("settings.updateLastError",{message:o?.lastError||""})}),o?.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:o.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:n?.config.autoUpdate??"off",onChange:async x=>{const T=x.target.value;await _({autoUpdate:T},z=>({...z,config:{...z.config,autoUpdate:T}}))},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",{style:{marginTop:16,paddingTop:14,borderTop:"1px solid var(--border-subtle)"},children:e("label",{style:{display:"flex",alignItems:"flex-start",gap:8,cursor:"pointer"},children:[e("input",{type:"checkbox",checked:!!n?.config.enableAgenticOrchestration,onChange:async x=>{const T=x.target.checked;await _({enableAgenticOrchestration:T},z=>({...z,config:{...z.config,enableAgenticOrchestration:T}}))},style:{marginTop:2}}),e("span",{children:[e("span",{style:{fontSize:13,color:"var(--text-1)"},children:r("settings.agenticLabel")}),e("div",{style:{fontSize:11,color:"var(--text-3)",marginTop:2},children:r("settings.agenticHint")})]})]})})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:r("settings.language")}),e("select",{"aria-label":r("settings.language"),value:t,onChange:x=>{const T=x.target.value;Un(T),s(T);const z=Ms().find(O=>O.code===T)?.name;z&&J("POST","/v1/config",{language:z}).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:Ms().map(x=>e("option",{value:x.code,children:x.name},x.code))})]})]})}const vn={commit:"#A78BFA",session_keypoint:"#4ADE80",session_identity:"#F472B6",workflow_checkpoint:"#38BDF8",feature:"#FB923C",bug_fix:"#F87171",tool:"#818CF8",person:"#E879F9",note:"#94A3B8"};function Xr(t){return Array.isArray(t?.entities)&&Array.isArray(t.relations)}const kn={decision:"--accent",concept:"--accent",pattern:"--info",lesson_learned:"--warning","session-insight":"--text-2"},wn="--text-1",Jr=["--accent","--accent-hover","--info","--warning","--text-0","--text-1","--text-2","--text-3","--bg-1","--font","--mono"];function Zr(t){const s=kn[t];return s?`var(${s})`:vn[t]??`var(${wn})`}function Qr(t,s){const n=kn[t];return n?s[n]??"":vn[t]??s[wn]??""}function eo(t){const s=Math.max(0,Math.min(1,(t-.15)/.85)),n=Math.round(248+-248*s),i=Math.round(113+101*s),o=Math.round(113+67*s);return`rgb(${n},${i},${o})`}function to(t){const s=t??0;return s===0?5:Math.min(14,5+Math.log2(s+1)*2)}function so(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 no(t){const s=Date.now()-new Date(t).getTime(),n=Math.floor(s/864e5);return n<1?r("graph.ageToday"):n<7?r("graph.ageDaysAgo",{count:n}):n<30?r("graph.ageWeeksAgo",{count:Math.floor(n/7)}):r("graph.ageDaysAgo",{count:n})}const Os=440,_t=4,ro=1500;function oo(t,s=ro){return t.length<=s?t:[...t].sort((n,i)=>(i.access_count??0)-(n.access_count??0)||(i.last_accessed_at??i.created_at).localeCompare(n.last_accessed_at??n.created_at)).slice(0,s)}function ao(){const[t,s]=w(null),[n,i]=w(0),[o,a]=w(!0),[m,d]=w(null),[u,c]=w({}),[h]=is(),[l,y]=w(""),[b,g]=w(null),[f,M]=w(!1),p=re(null),k=re([]),v=re([]),R=re(0),E=re({scale:1,panX:0,panY:0}),I=re({active:!1,startScreenX:0,startScreenY:0,startPanX:0,startPanY:0,moved:!1}),D=re({node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1}),X=re(null),Q=re({x:0,y:0,node:null}),fe=re(800),C=re({}),N=re(u),se=re(l),Ce=re(b),Se=re(f);ee(()=>{N.current=u},[u]),ee(()=>{if(!t)return;const _=new Set(t.noiseTypes??[]);c(H=>{const F={...H};let q=!1;for(const G of _){const te=!h;F[G]!==te&&(F[G]=te,q=!0)}return q?F:H})},[h,t]),ee(()=>{se.current=l},[l]),ee(()=>{Ce.current=b},[b]),ee(()=>{Se.current=f},[f]),ee(()=>{Jn().then(_=>{if(!Xr(_)){console.warn("[memesh dashboard] /v1/graph answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",_),d("unreadable"),s(null);return}d(null);const H=oo(_.entities);H.length<_.entities.length&&console.info(`[memesh dashboard] graph capped at ${H.length} of ${_.entities.length} entities — the O(n²) simulation freezes the tab beyond this; showing the most-recalled nodes.`),i(_.entities.length),s({..._,entities:H});const F=new Set(Array.isArray(_.noiseTypes)?_.noiseTypes:[]),q={};H.forEach(G=>{q[G.type]=q[G.type]??(h?!F.has(G.type):!0)}),c(q)}).catch(_=>{console.warn("[memesh dashboard] /v1/graph failed to load:",_),d(at(_))}).finally(()=>a(!1))},[]),ee(()=>{if(!t||o)return;const _=p.current;if(!_)return;C.current=gn(_,Jr);const H=_.parentElement?.getBoundingClientRect(),F=H?Math.floor(H.width)-24:800,q=Os,G=window.devicePixelRatio||1;_.width=F*G,_.height=q*G,_.style.width=F+"px",_.style.height=q+"px",fe.current=F;const te=new Set;t.relations.forEach(W=>{te.add(W.from),te.add(W.to)});const ne=new Map;t.entities.forEach(W=>{const Le=W.last_accessed_at||W.created_at;ne.set(W.name,{id:W.name,type:W.type,x:Math.random()*F*.8+F*.1,y:Math.random()*q*.8+q*.1,vx:0,vy:0,radius:to(W.access_count),recency:so(Le),isOrphan:!te.has(W.name),lastDate:Le})}),k.current=Array.from(ne.values()),v.current=t.relations.filter(W=>ne.has(W.from)&&ne.has(W.to));const ke=W=>{if(N.current[W.type]===!1)return!1;const L=Ce.current;return L?W.id===L?!0:v.current.some(Te=>Te.from===L&&Te.to===W.id||Te.to===L&&Te.from===W.id):!0},me=W=>{const Le=ne.get(W.from),L=ne.get(W.to);return!Le||!L?!1:ke(Le)&&ke(L)},Pe=W=>{const Le=se.current.toLowerCase();return Le?W.id.toLowerCase().includes(Le):!1};let pe=1;const Ye=.005,Qe=()=>{pe=.3};window.__graphReheat=Qe;const Fe=()=>{const W=k.current,Le=v.current,L=_.getContext("2d");if(!L)return;const we=C.current,Te=window.devicePixelRatio||1;pe=Math.max(0,pe-Ye);const ht=pe>0,gt=.85,It=2e3*pe,Dt=80,Ht=.02*pe,pt=.02*pe,x=W.length>200,T=F/2,z=q/2,O=new Map(W.map(S=>[S.id,S]));if(ht){for(let S=0;S<W.length;S++)for(let V=S+1;V<W.length;V++){const ae=W[V].x-W[S].x,_e=W[V].y-W[S].y,ye=ae*ae+_e*_e;if(x&&ye>9e4)continue;const be=Math.sqrt(ye)||1,Oe=It/(be*be),Be=ae/be*Oe,Je=_e/be*Oe;W[S].vx-=Be,W[S].vy-=Je,W[V].vx+=Be,W[V].vy+=Je}for(const S of Le){const V=O.get(S.from),ae=O.get(S.to);if(!V||!ae)continue;const _e=ae.x-V.x,ye=ae.y-V.y,be=Math.sqrt(_e*_e+ye*ye)||1,Oe=(be-Dt)*Ht,Be=_e/be*Oe,Je=ye/be*Oe;V.vx+=Be,V.vy+=Je,ae.vx-=Be,ae.vy-=Je}for(const S of W)S.vx+=(T-S.x)*pt,S.vy+=(z-S.y)*pt}let Y=D.current.node;if(Y&&!W.includes(Y)&&(D.current.node=null,Y=null),!(!ht&&!Y&&W.every(S=>S.vx===0&&S.vy===0)))for(const S of W){if(Y===S)continue;S.vx*=gt,S.vy*=gt,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 V=100;S.x<-V?S.x=-V:S.x>F+V&&(S.x=F+V),S.y<-V?S.y=-V:S.y>q+V&&(S.y=q+V)}const $e=se.current.toLowerCase();if($e){const S=W.filter(V=>V.id.toLowerCase().includes($e));if(S.length===1){const V=S[0],ae=T-V.x,_e=z-V.y,ye=.05;for(const be of W)be.x+=ae*ye,be.y+=_e*ye}}L.setTransform(Te,0,0,Te,0,0),L.clearRect(0,0,F,q);const ft=E.current;L.setTransform(ft.scale*Te,0,0,ft.scale*Te,ft.panX*Te,ft.panY*Te);const ms=Le.filter(me),Mn=ms.length<30;for(const S of ms){const V=O.get(S.from),ae=O.get(S.to);if(!V||!ae)continue;const _e=Math.min(V.recency,ae.recency)*.6;if(L.globalAlpha=_e,L.strokeStyle=Ut(we["--accent"],.4),L.lineWidth=1,L.setLineDash([]),L.beginPath(),L.moveTo(V.x,V.y),L.lineTo(ae.x,ae.y),L.stroke(),Mn){const ye=(V.x+ae.x)/2,be=(V.y+ae.y)/2;L.font=`9px ${we["--font"]}`,L.fillStyle=we["--text-2"],L.fillText(er(S.type),ye+2,be-2)}}L.globalAlpha=1;const Cn=W.filter(ke),Sn=X.current;for(const S of Cn){const V=Sn===S,ae=Pe(S),_e=Ce.current===S.id,ye=_e?10:V?9:S.radius,be=V||ae?1:S.recency;if(L.globalAlpha=be,L.beginPath(),L.arc(S.x,S.y,ye,0,Math.PI*2),L.fillStyle=Se.current?eo(S.recency):Qr(S.type,we),L.fill(),S.isOrphan&&(L.setLineDash([3,3]),L.strokeStyle=we["--text-3"],L.lineWidth=1,L.stroke(),L.setLineDash([])),ae&&(L.globalAlpha=1,L.strokeStyle=we["--accent-hover"],L.lineWidth=2,L.beginPath(),L.arc(S.x,S.y,ye+3,0,Math.PI*2),L.stroke()),V&&!ae&&(L.globalAlpha=1,L.strokeStyle="#fff",L.lineWidth=2,L.beginPath(),L.arc(S.x,S.y,ye,0,Math.PI*2),L.stroke()),V||ae||_e){L.globalAlpha=1,L.fillStyle=we["--text-1"],L.font=`10px ${we["--font"]}`;const Be=ae||_e?S.id:S.id.length>20?S.id.slice(0,18)+"...":S.id;L.fillText(Be,S.x+ye+4,S.y+3)}}L.globalAlpha=1;const Xe=Q.current;if(Xe.node&&ke(Xe.node)){L.setTransform(Te,0,0,Te,0,0);const S=Xe.x+12,V=Xe.y-10,ae=Xe.node.id,_e=We(Xe.node.type),ye=no(Xe.node.lastDate),be=ae,Oe=`${_e} | ${ye}`;L.font=`11px ${we["--font"]}`;const Be=L.measureText(be).width,Je=L.measureText(Oe).width,An=Math.max(Be,Je)+12,En=34;L.fillStyle=Ut(we["--bg-1"],.92),L.strokeStyle=Ut(we["--accent"],.3),L.lineWidth=1,L.beginPath(),L.roundRect(S-4,V-18,An,En,4),L.fill(),L.stroke(),L.fillStyle=we["--text-0"],L.fillText(be,S,V-4),L.fillStyle=we["--text-2"],L.font=`10px ${we["--mono"]}`,L.fillText(Oe,S,V+10)}R.current=requestAnimationFrame(Fe)};return R.current=requestAnimationFrame(Fe),()=>cancelAnimationFrame(R.current)},[t,o]);const ie=Me((_,H)=>{const F=k.current,q=N.current,G=Ce.current,ne=12/(E.current.scale||1),ke=ne*ne;for(let me=F.length-1;me>=0;me--){const Pe=F[me];if(q[Pe.type]===!1||G&&Pe.id!==G&&!v.current.some(Fe=>Fe.from===G&&Fe.to===Pe.id||Fe.to===G&&Fe.from===Pe.id))continue;const pe=Pe.x-_,Ye=Pe.y-H;if(pe*pe+Ye*Ye<ke)return Pe}return null},[]),Z=Me(_=>{const H=p.current;if(!H)return{x:0,y:0};const F=H.getBoundingClientRect();return{x:_.clientX-F.left,y:_.clientY-F.top}},[]),P=Me((_,H)=>{const F=E.current;return{x:(_-F.panX)/F.scale,y:(H-F.panY)/F.scale}},[]),K=Me(_=>{p.current?.setPointerCapture?.(_.pointerId);const H=Z(_),F=P(H.x,H.y),q=ie(F.x,F.y);if(q)window.__graphReheat?.(),D.current={node:q,offsetX:F.x-q.x,offsetY:F.y-q.y,startX:H.x,startY:H.y,dragged:!1},I.current.active=!1;else{const G=E.current;I.current={active:!0,startScreenX:H.x,startScreenY:H.y,startPanX:G.panX,startPanY:G.panY,moved:!1},D.current={node:null,offsetX:0,offsetY:0,startX:H.x,startY:H.y,dragged:!1};const te=p.current;te&&(te.style.cursor="grabbing")}},[ie,Z,P]),B=Me(_=>{const H=Z(_),F=P(H.x,H.y),q=D.current,G=I.current;if(q.node){const ke=H.x-q.startX,me=H.y-q.startY;ke*ke+me*me>_t*_t&&(q.dragged=!0),q.node.x=F.x-q.offsetX,q.node.y=F.y-q.offsetY,q.node.vx=0,q.node.vy=0}else if(G.active){const ke=H.x-G.startScreenX,me=H.y-G.startScreenY;ke*ke+me*me>_t*_t&&(G.moved=!0),E.current.panX=G.startPanX+ke,E.current.panY=G.startPanY+me}const te=ie(F.x,F.y);X.current=te,Q.current=te?{x:H.x,y:H.y,node:te}:{x:0,y:0,node:null};const ne=p.current;ne&&(q.node||G.active?ne.style.cursor="grabbing":te?ne.style.cursor=Ce.current?"pointer":"grab":ne.style.cursor="grab")},[ie,Z,P]),$=Me(_=>{p.current?.releasePointerCapture?.(_.pointerId);const H=D.current,F=I.current,q=Z(_),G=P(q.x,q.y);H.node&&!H.dragged?g(ne=>ne===H.node.id?null:H.node.id):!H.node&&F.active&&!F.moved&&(ie(G.x,G.y)||g(null)),D.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1},I.current.active=!1,I.current.moved=!1;const te=p.current;if(te){const ne=ie(G.x,G.y);te.style.cursor=ne&&Ce.current?"pointer":"grab"}},[ie,Z,P]),A=Me(()=>{D.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1},I.current.active=!1,I.current.moved=!1,X.current=null,Q.current={x:0,y:0,node:null};const _=p.current;_&&(_.style.cursor="default")},[]),j=Me(_=>{_.preventDefault();const H=p.current;if(!H)return;const F=H.getBoundingClientRect(),q=_.clientX-F.left,G=_.clientY-F.top,te=E.current,ne=te.scale,ke=Math.exp(-_.deltaY*.0015),me=Math.max(.25,Math.min(4,ne*ke));if(me===ne)return;const Pe=(q-te.panX)/ne,pe=(G-te.panY)/ne;te.scale=me,te.panX=q-Pe*me,te.panY=G-pe*me},[]),U=Me(()=>{E.current={scale:1,panX:0,panY:0}},[]);if(ee(()=>{if(o||!t)return;const _=p.current;if(!_)return;const H=F=>j(F);return _.addEventListener("wheel",H,{passive:!1}),()=>_.removeEventListener("wheel",H)},[t,o,j]),o)return e("div",{class:"empty",children:e("div",{class:"loading"})});if(m)return e("div",{class:"error-box",role:"alert",children:Ke(m)});if(!t)return e("div",{class:"error-box",role:"alert",children:[r("common.error"),": ",r("common.noData")]});const de=new Map;t.entities.forEach(_=>de.set(_.type,(de.get(_.type)||0)+1));const Ae=new Set(t.entities.map(_=>_.name)),ve=new Set;t.relations.forEach(_=>{!Ae.has(_.from)||!Ae.has(_.to)||(ve.add(_.from),ve.add(_.to))});const ze=t.entities.filter(_=>!ve.has(_.name)).length,Ne=l?t.entities.filter(_=>_.name.toLowerCase().includes(l.toLowerCase())).length:0,He=b?t.entities.find(_=>_.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: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(cs,{})]})]});const Ve=n>t.entities.length;return e("div",{children:[e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:n.toLocaleString(ge())}),e("div",{class:"stat-lbl",children:r("graph.entities")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:t.relations.length.toLocaleString(ge())}),e("div",{class:"stat-lbl",children:r("graph.relations")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:ze.toLocaleString(ge())}),e("div",{class:"stat-lbl",children:r("graph.orphans")})]})]}),Ve&&e("div",{role:"status",style:{fontSize:11,color:"var(--text-2)",margin:"0 0 8px"},children:r("graph.cappedNote",{shown:t.entities.length.toLocaleString(ge()),total:n.toLocaleString(ge())})}),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(de.entries()).map(([_,H])=>{const F=u[_]!==!1,q=Zr(_);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:()=>c(G=>({...G,[_]:!G[_]})),style:{accentColor:q,width:13,height:13,cursor:"pointer"}}),e("span",{style:{width:8,height:8,borderRadius:"50%",background:q,display:"inline-block",flexShrink:0}}),We(_)," (",H,")"]},_)})]}),e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8,flexWrap:"wrap"},children:[e("input",{type:"text",placeholder:r("graph.search"),value:l,onInput:_=>y(_.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)"}}),l&&e("span",{style:{fontSize:11,fontFamily:"var(--mono)",color:"var(--text-2)"},children:[Ne," ",r("graph.matches")]}),e("button",{onClick:U,title:r("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:r("graph.resetView")}),e("button",{onClick:()=>M(_=>!_),title:r("graph.driftHint"),"aria-pressed":f,style:{padding:"3px 10px",background:f?"rgba(0,214,180,0.15)":"rgba(255,255,255,0.04)",border:`1px solid ${f?"rgba(0,214,180,0.4)":"rgba(255,255,255,0.08)"}`,borderRadius:"var(--radius-xs)",color:f?"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))"}}),r("graph.drift")]})]}),He&&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:[r("graph.focusMode"),":"]}),e("span",{style:{color:"var(--text-0)"},children:He.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:r("graph.showAll")})]}),!b&&e("div",{style:{fontSize:11,color:"var(--text-3)",marginBottom:6},children:r("graph.interactHint")}),e("canvas",{ref:p,role:"img",tabIndex:0,"aria-label":r("graph.canvasA11y",{entities:n.toLocaleString(ge()),relations:t.relations.length.toLocaleString(ge()),orphans:ze.toLocaleString(ge())}),style:{width:"100%",height:Os,borderRadius:"var(--radius-sm)",background:"var(--bg-0)",cursor:"grab",touchAction:"none"},onPointerDown:K,onPointerMove:B,onPointerUp:$,onPointerCancel:A,onPointerLeave:A})]})]})}function st({type:t,children:s}){return e("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[e(mt,{type:t,size:16}),s]})}function io(t){const s=[];let n=null;for(const i of t){const o=i.trim();o.startsWith("Error:")?(n&&s.push(n),n={error:o.slice(6).trim(),rootCause:"",fix:"",prevention:""}):o.startsWith("Root cause:")?(n||(n={error:"",rootCause:"",fix:"",prevention:""}),n.rootCause=o.slice(11).trim()):o.startsWith("Fix:")||o.startsWith("Solution")?(n||(n={error:"",rootCause:"",fix:"",prevention:""}),n.fix=o.replace(/^(Fix|Solution\s*\d*):/i,"").trim()):o.startsWith("Prevention:")&&(n||(n={error:"",rootCause:"",fix:"",prevention:""}),n.prevention=o.slice(11).trim())}return n&&s.push(n),s}function lo(t){const s=t.observations??[],n=s[0]?.match(/^Plan "(.+?)" completed \((\d+) steps?\)/),i=s.find(a=>a.startsWith("Steps:"))?.slice(6).trim()??"",o=s.find(a=>a.startsWith("Commits:"))?.slice(8).trim()??"";return{planName:n?.[1]??t.name,stepCount:n?parseInt(n[2],10):0,steps:i,commits:o?o.split(",").map(a=>a.trim()).filter(Boolean):[]}}const $t={critical:"var(--danger)",major:"var(--warning)",minor:"var(--info)"};function xn(t){const s=t.tags??[];return s.includes("severity:critical")?"critical":s.includes("severity:major")?"major":s.includes("severity:minor")?"minor":null}function co({entity:t}){const s=io(t.observations??[]),n=xn(t),i=ot(t),o=ut(t.access_count),a=n?$t[n]:"var(--border)";return e("div",{class:"card",style:{borderLeft:`3px solid ${a}`,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(st,{type:"lesson_learned",children:t.name})}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[i&&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"})}),i]}),n&&e("span",{class:"badge",style:{background:`${$t[n]}18`,color:$t[n]},children:r(`lessons.severity.${n}`)}),o.tone!=="none"&&e("span",{class:"tag",style:{background:o.tone==="high"?"rgba(0, 214, 180, 0.18)":"rgba(0, 214, 180, 0.10)",color:"var(--accent)",fontWeight:o.tone==="high"?600:400},children:["✓ ",o.label]}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:Ue(t.last_accessed_at||t.created_at)})]})]}),s.length===0&&e("div",{style:{fontSize:12,color:"var(--text-3)",fontStyle:"italic"},children:r("lessons.unstructured")}),s.map((m,d)=>e("div",{style:{marginTop:d>0?14:0,paddingTop:d>0?14:0,borderTop:d>0?"1px dashed var(--border-subtle)":"none"},children:[m.error&&e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--danger)",marginBottom:2},children:r("lessons.error")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:m.error})]}),m.rootCause&&e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--warning)",marginBottom:2},children:r("lessons.rootCause")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:m.rootCause})]}),m.fix&&e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--success)",marginBottom:2},children:r("lessons.fix")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:m.fix})]}),m.prevention&&e("div",{children:[e("div",{style:{fontSize:11,fontWeight:600,color:"var(--info)",marginBottom:2},children:r("lessons.prevention")}),e("div",{style:{fontSize:13,lineHeight:1.5},children:m.prevention})]})]},d))]})}function mo({entity:t}){const s=lo(t),n=ot(t),i=ut(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(st,{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})," ",r("lessons.stepsLabel")," · ",r("lessons.commitsCount",{count:s.commits.length})]})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0},children:[n&&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"})}),n]}),i.tone!=="none"&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.10)",color:"var(--accent)"},children:["✓ ",i.label]}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:Ue(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 uo({entity:t}){const s=t.observations??[],n=ot(t),i=ut(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(st,{type:"note",children:t.name})}),e("div",{style:{display:"flex",gap:6,flexShrink:0},children:[n&&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"})}),n]}),i.tone!=="none"&&e("span",{class:"tag",style:{background:"rgba(0, 214, 180, 0.10)",color:"var(--accent)"},children:["✓ ",i.label]}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:Ue(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((o,a)=>e("li",{style:{marginBottom:3},children:o.length>200?o.slice(0,200)+"…":o},a)),s.length>6&&e("li",{style:{color:"var(--text-3)",listStyle:"none"},children:r("lessons.moreItems",{count:s.length-6})})]})]})}const Bs=100;function ho({health:t}){const[s,n]=w([]),[i,o]=w([]),[a,m]=w(!0),[d,u]=w(""),[c,h]=w("failure"),[l,y]=w(""),[b,g]=w("all");ee(()=>{Promise.all([Zn(),un().catch(()=>[])]).then(([v,R])=>{n(v),o(R)}).catch(v=>u(Ke(at(v)))).finally(()=>m(!1))},[]);const f=je(()=>{const v={failure:[],"plan-completion":[],freeform:[]};for(const R of s)v[sr(R)].push(R);for(const R of Object.keys(v))v[R].sort((E,I)=>(I.access_count??0)-(E.access_count??0)||I.created_at.localeCompare(E.created_at));return v},[s]),M=je(()=>{const v=f[c],R=l.toLowerCase();return v.filter(E=>b!=="all"&&ot(E)!==b?!1:R?[E.name,...E.observations??[],...E.tags??[]].join(" ").toLowerCase().includes(R):!0)},[f,c,l,b]);if(a)return e("div",{class:"empty",children:e("div",{class:"loading"})});if(d)return e("div",{class:"error-box",role:"alert",children:d});const p=s.reduce((v,R)=>v+(R.access_count??0),0),k=f.failure.filter(v=>xn(v)==="critical").length;return e("div",{children:[e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:f.failure.length}),e("div",{class:"stat-lbl",children:r("lessons.tabFailure")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{color:k>0?"var(--danger)":void 0},children:k}),e("div",{class:"stat-lbl",children:r("lessons.severity.critical")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:f["plan-completion"].length}),e("div",{class:"stat-lbl",children:r("lessons.tabPlan")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:p}),e("div",{class:"stat-lbl",children:r("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:c==="failure"?"rgba(0, 214, 180, 0.18)":"transparent",borderColor:c==="failure"?"rgba(0, 214, 180, 0.5)":"rgba(255,255,255,0.08)",color:c==="failure"?"var(--accent)":"var(--text-2)"},onClick:()=>h("failure"),children:[e(st,{type:"lesson_learned",children:r("lessons.tabFailure")})," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)",marginLeft:6},children:f.failure.length})]}),e("button",{class:"btn btn-sm",style:{background:c==="plan-completion"?"rgba(0, 214, 180, 0.18)":"transparent",borderColor:c==="plan-completion"?"rgba(0, 214, 180, 0.5)":"rgba(255,255,255,0.08)",color:c==="plan-completion"?"var(--accent)":"var(--text-2)"},onClick:()=>h("plan-completion"),children:[e(st,{type:"plan",children:r("lessons.tabPlan")})," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)",marginLeft:6},children:f["plan-completion"].length})]}),e("button",{class:"btn btn-sm",style:{background:c==="freeform"?"rgba(0, 214, 180, 0.18)":"transparent",borderColor:c==="freeform"?"rgba(0, 214, 180, 0.5)":"rgba(255,255,255,0.08)",color:c==="freeform"?"var(--accent)":"var(--text-2)"},onClick:()=>h("freeform"),children:[e(st,{type:"note",children:r("lessons.tabFreeform")})," ",e("span",{style:{opacity:.6,fontFamily:"var(--mono)",marginLeft:6},children:f.freeform.length})]})]}),e("div",{style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap"},children:[e("input",{type:"search",placeholder:r("lessons.searchPlaceholder"),value:l,onInput:v=>y(v.target.value),style:{flex:1,minWidth:240,padding:"4px 8px",fontSize:12}}),i.length>0&&e("select",{value:b,onChange:v=>g(v.target.value),style:{padding:"3px 8px",fontSize:12},children:[e("option",{value:"all",children:r("lessons.allProjects")}),i.map(v=>e("option",{value:v.name,children:[v.name," (",v.count,")"]},v.name))]})]}),e("div",{style:{marginTop:8,fontSize:11,color:"var(--text-3)"},children:[r("lessons.showing",{visible:M.length,total:f[c].length}),s.length>=Bs&&e("span",{children:[" · ",r("lessons.capNote",{limit:Bs})]})]})]}),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(cs,{}):M.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(mt,{type:c==="failure"?"lesson_learned":c==="plan-completion"?"plan":"note",size:28})}),s.length===0?r("lessons.emptyGuide"):l?r("lessons.noMatch",{query:l}):r("lessons.emptyCategory")]}):M.map(v=>c==="failure"?e(co,{entity:v},v.id):c==="plan-completion"?e(mo,{entity:v},v.id):e(uo,{entity:v},v.id))})]})}function go(t){if(!t)return null;for(const s of t){const n=/^severity:(high|medium|low)$/i.exec(s);if(n)return n[1].toLowerCase()}return null}function qs(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 po(t){const{proposal:s,detail:n,expanded:i,inFlight:o,onToggleExpand:a,onAccept:m,onReject:d,formatRelative:u,statusBadgeStyle:c,statusLabel:h}=t,l=s.status==="pending",y=go(n?.proposed_digest?.tags),b=c(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)})}),y&&e("span",{class:"tag",style:{fontSize:11,color:qs(y),borderColor:qs(y)},children:[r("pattern.severity"),": ",r(`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(le,{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:()=>a(s.id),disabled:o,"aria-expanded":i,children:r(i?"insights.collapse":"insights.viewDetail")}),l&&e(le,{children:[e("button",{class:"btn btn-primary",onClick:()=>m(s.id),disabled:o,children:r(o?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>d(s.id),disabled:o,style:{color:"var(--danger)"},children:r("insights.reject")})]})]})]}),n&&n.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:n.llm_model??r("common.unknown")})," "," "," ",r("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:["⚠ ",r("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:n.proposed_digest.validation_warnings.map((g,f)=>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:g.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[r("insights.validationReason"),": "]}),e("span",{children:g.reason})]})]},f))})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:[r("pattern.description"),":"]}),e("ol",{style:{margin:"4px 0 0 18px",padding:0},children:n.proposed_digest.observations.map((g,f)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:g},f))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[r("insights.tags"),":"]})," ",n.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:[r("insights.sourceIds"),": ",n.source_ids.length," (",n.source_ids.slice(0,8).join(", "),n.source_ids.length>8?"…":"",")"]})]})]})}function Ws(t){return t?Ue(t.includes(" ")?t.replace(" ","T")+"Z":t):""}function Us(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 Ks(t){const s=`insights.status.${t}`,n=r(s);return n===s?t:n}function fo(){const[t,s]=w([]),[n,i]=w("pending"),[o,a]=w(new Map),[m,d]=w(!1),[u,c]=w(""),[h,l]=w(null),[y,b]=w(new Set),[g,f]=w(null),M=Me(async()=>{d(!0),c("");try{const C=await J("GET","/v1/dream/proposals?status=all");Array.isArray(C)?s(C):(console.warn("[memesh dashboard] /v1/dream/proposals answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",C),s([]),c(Ke("unreadable")))}catch(C){console.warn("[memesh dashboard] /v1/dream/proposals failed to load:",C),c(Ke(at(C)))}finally{d(!1)}},[]);ee(()=>{M()},[M]),ee(()=>{J("GET","/v1/config").then(C=>l(!!C?.capabilities?.llm)).catch(()=>l(!1))},[]);const p=n==="all"?t:t.filter(C=>C.status===n),k=Me(async C=>{if(o.has(C)){const N=new Map(o);N.delete(C),a(N);return}try{const N=await J("GET",`/v1/dream/proposals/${C}`),se=new Map(o);se.set(C,N),a(se)}catch(N){c(Ee(N))}},[o]),v=C=>{b(N=>{const se=new Set(N);return se.add(C),se})},R=C=>{b(N=>{const se=new Set(N);return se.delete(C),se})},E=Me(async C=>{v(C);try{await J("POST",`/v1/dream/proposals/${C}/accept`),window.dispatchEvent(new Event("memesh:data-changed")),await M()}catch(N){c(Ee(N))}finally{R(C)}},[M]),I=Me(async C=>{v(C);try{await J("POST",`/v1/dream/proposals/${C}/reject`,{reason:"rejected via dashboard"}),window.dispatchEvent(new Event("memesh:data-changed")),await M()}catch(N){c(Ee(N))}finally{R(C)}},[M]),D=Me(async C=>{f(C),c("");try{await J("POST","/v1/dream/run",{maxLlmCalls:3,validate:C==="validate"}),window.dispatchEvent(new Event("memesh:data-changed")),await M()}catch(N){c(Ee(N))}finally{f(null)}},[M]),X=t.filter(C=>C.status==="pending").length,Q=t.filter(C=>C.status==="applied").length,fe=t.filter(C=>C.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(--accent)",fontFamily:"var(--mono)"},children:X})," ",r("insights.statPending")]}),e("span",{children:[e("strong",{style:{fontFamily:"var(--mono)"},children:Q})," ",r("insights.statApplied")]}),e("span",{children:[e("strong",{style:{fontFamily:"var(--mono)"},children:fe})," ",r("insights.statRejected")]})]}),h&&e("div",{style:{marginTop:12,display:"flex",gap:8,flexWrap:"wrap"},children:[e("button",{class:"btn btn-primary",onClick:()=>D("plain"),disabled:g!==null,"aria-busy":g==="plain",children:g==="plain"?`${r("insights.runDream")}…`:r("insights.runDream")}),e("button",{class:"btn btn-ghost",onClick:()=>D("validate"),disabled:g!==null,"aria-busy":g==="validate",children:g==="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(C=>{const N=n===C;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:()=>i(C),children:r(`insights.filter.${C}`)},C)}),e("button",{class:"btn btn-ghost",onClick:M,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&&p.length===0&&e("div",{class:"card",style:{padding:16,textAlign:"center",color:"var(--text-2)"},children:r(n!=="pending"?"insights.emptyOther":h===!1?"insights.emptyNoLlm":"insights.emptyPending")}),p.map(C=>{const N=o.get(C.id),se=o.has(C.id),Ce=C.status==="pending",Se=y.has(C.id);if(C.kind==="pattern_emergent")return e(po,{proposal:C,detail:N,expanded:se,inFlight:Se,onToggleExpand:k,onAccept:E,onReject:I,formatRelative:Ws,statusBadgeStyle:Us,statusLabel:Ks},C.id);const ie=C.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:["#",C.id]}),e("span",{style:{fontWeight:600},children:C.digest_name}),e("span",{class:"tag",style:{fontSize:11},children:C.project}),e("span",{class:"tag",style:{fontSize:11},children:C.cluster_key}),e("span",{class:"tag",style:{fontSize:11,color:"var(--text-2)"},children:[C.source_count," ",r("insights.sources")]}),e("span",{class:"tag",style:{fontSize:11,...Us(C.status)},children:Ks(C.status)})]}),e("div",{style:{marginTop:6,color:"var(--text-2)",fontSize:13,lineHeight:1.5},children:ie!==null?e(le,{children:[ie,"…"]}):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:Ws(C.created_at)})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[e("button",{class:"btn btn-ghost",onClick:()=>k(C.id),disabled:Se,"aria-expanded":se,children:r(se?"insights.collapse":"insights.viewDetail")}),Ce&&e(le,{children:[e("button",{class:"btn btn-primary",onClick:()=>E(C.id),disabled:Se,children:r(Se?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>I(C.id),disabled:Se,style:{color:"var(--danger)"},children:r("insights.reject")})]})]})]}),N&&N.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:N.llm_model??r("common.unknown")})," · ",r("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:["⚠ ",r("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:N.proposed_digest.validation_warnings.map((Z,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:Z.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[r("insights.validationReason"),": "]}),e("span",{children:Z.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:N.proposed_digest.observations.map((Z,P)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:Z},P))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[r("insights.tags"),":"]})," ",N.proposed_digest.tags.map(Z=>e("span",{class:"tag",style:{marginLeft:4,fontSize:11},children:Z},Z))]}),e("div",{style:{color:"var(--text-3)",fontSize:11,marginTop:6},children:[r("insights.sourceIds"),": ",r("insights.entitiesCount",{n:N.source_ids.length})," (",N.source_ids.slice(0,8).join(", "),N.source_ids.length>8?"…":"",")"]})]})]},C.id)})]})}const yo=["bug","feature","question"],Vs={bug:"feedback.bug",feature:"feedback.feature",question:"feedback.question"};function bo({health:t}){const[s,n]=w(!1),[i,o]=w("bug"),[a,m]=w(""),[d,u]=w(!0),[c,h]=w(!1),l=re(null),y=re(null),b=re(null),g=()=>{n(!1),y.current?.focus()};ee(()=>{if(!s)return;b.current?.focus();const p=v=>{const R=v.target;y.current?.contains(R)||l.current&&!l.current.contains(R)&&n(!1)},k=v=>{v.key==="Escape"&&(v.preventDefault(),g())};return document.addEventListener("mousedown",p),document.addEventListener("keydown",k),()=>{document.removeEventListener("mousedown",p),document.removeEventListener("keydown",k)}},[s]);function f(p){const k=p.checks.find(D=>D.id==="install_id"),E=p.checks.filter(D=>D.id!=="install_id").sort((D,X)=>{const Q={fail:0,warn:1,pass:2};return(Q[D.status]??3)-(Q[X.status]??3)}).map(D=>{const X=D.status==="fail"?"❌":D.status==="warn"?"⚠️":"✅",Q=D.fix?` _Fix: ${D.fix}_`:"";return`- ${X} **${D.label}**: ${D.summary}${Q}`}),I=k?`
13
+ _Anonymous install ID: \`${(k.summary.match(/[0-9a-f-]{36}/)??["(unavailable)"])[0]}\` — included only because you checked "Include system info"._
14
+ `:"";return`**Diagnostics** (overall: ${p.status})${I}
15
+ ${E.join(`
16
+ `)}`}const M=async()=>{if(!(!a.trim()||c)){h(!0);try{const p=`feedback,from-dashboard,${i}`;let k=a.trim();if(d&&t){k+=`
17
17
 
18
18
  ---
19
19
  **System Info**
20
20
  - Version: \`${t.version}\`
21
21
  - Entities: ${t.entity_count}
22
22
  - Platform: \`${navigator.platform}\`
23
- - User Agent: \`${navigator.userAgent}\``;try{const f=await V("GET","/v1/doctor");p+=`
23
+ - User Agent: \`${navigator.userAgent}\``;try{const E=await J("GET","/v1/doctor");k+=`
24
24
 
25
- ${y(f)}`}catch{}}const w=a(_s[o]),v=`https://github.com/PCIRCLE-AI/memesh-llm-memory/issues/new?title=${encodeURIComponent(`[${w}] `)}&body=${encodeURIComponent(p)}&labels=${encodeURIComponent(h)}`;window.open(v,"_blank"),d(""),n(!1)}finally{m(!1)}}};return e(ie,{children:[e("button",{class:"fb-btn",onClick:()=>n(!s),children:a("feedback.button")}),s&&e("div",{class:"fb-panel",ref:l,children:[e("h3",{class:"fb-title",children:a("feedback.title")}),e("div",{class:"fb-types",children:Ga.map(h=>e("label",{class:`fb-type ${o===h?"selected":""}`,children:[e("input",{type:"radio",name:"fb-type",value:h,checked:o===h,onChange:()=>r(h)}),a(_s[h])]},h))}),e("textarea",{class:"fb-desc",placeholder:a("feedback.placeholder"),value:i,onInput:h=>d(h.target.value)}),e("label",{class:"fb-sys-row",children:[e("input",{type:"checkbox",checked:c,onChange:()=>g(!c)}),a("feedback.includeSys")]}),e("button",{class:"btn btn-primary fb-submit",onClick:b,disabled:u,children:a(u?"feedback.submitting":"feedback.submit")})]})]})}function Ya({currentToken:t,onSubmit:s,rejected:n=!1}){const[o,r]=k(t??""),[i,d]=k(!1);function c(l){l.preventDefault(),d(!0),o.trim()&&s(o.trim())}const g=i&&!o.trim(),u=n&&!g,m=g||u?"auth-prompt-error":void 0;return e("div",{class:"auth-prompt-shell","data-testid":"auth-prompt",children:e("form",{class:"auth-prompt-card",onSubmit:c,children:[e("h1",{children:a("auth.title")}),e("p",{children:a("auth.intro")}),e("label",{children:[e("span",{children:a("auth.tokenLabel")}),e("input",{type:"password",autocomplete:"off",value:o,onInput:l=>r(l.target.value),placeholder:a("auth.tokenPlaceholder"),"aria-invalid":m!==void 0,"aria-describedby":m,autofocus:!0})]}),g&&e("p",{class:"auth-prompt-error",id:m,role:"alert",children:a("auth.empty")}),u&&e("p",{class:"auth-prompt-error",id:m,role:"alert",children:a("auth.invalid")}),e("button",{type:"submit",class:"auth-prompt-submit",children:a("auth.submit")})]})})}const Ss="memesh.onboardingDismissed";function Xa({health:t}){const[s,n]=k(()=>{try{return localStorage.getItem(Ss)==="true"}catch{return!1}}),[o,r]=k(null),[i,d]=k("");if(K(()=>{t&&t.entity_count>0&&n(!0)},[t?.entity_count]),!t||t.entity_count>0||s)return null;function c(){n(!0);try{localStorage.setItem(Ss,"true")}catch{}}async function g(){d(""),r("seed");try{await V("POST","/v1/demo/seed"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(m){d(m?.message??String(m))}finally{r(null)}}async function u(){if(confirm(a("onboarding.resetConfirm"))){d(""),r("reset");try{await V("POST","/v1/demo/reset"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(m){d(m?.message??String(m))}finally{r(null)}}}return e("div",{role:"region","aria-label":a("onboarding.title"),style:{position:"relative",margin:"12px auto 8px",maxWidth:920,padding:"14px 18px",border:"1px solid rgba(0, 214, 180, 0.28)",borderRadius:8,background:"linear-gradient(135deg, rgba(0, 214, 180, 0.10) 0%, rgba(0, 214, 180, 0.02) 100%)",color:"var(--text-1)"},children:[e("button",{type:"button",onClick:c,"aria-label":a("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:a("onboarding.title")}),e("div",{style:{fontSize:13,lineHeight:1.55,color:"var(--text-1)"},children:a("onboarding.body")}),e("div",{style:{fontSize:11,lineHeight:1.55,color:"var(--text-3)",marginTop:4},children:a("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:g,disabled:o!==null,style:{minWidth:160},children:a(o==="seed"?"onboarding.seedingButton":"onboarding.seedButton")}),e("span",{style:{fontSize:12,color:"var(--text-3)"},children:a("onboarding.seedHint")})]}),e("details",{style:{marginTop:10,fontSize:12,color:"var(--text-3)"},children:[e("summary",{style:{cursor:"pointer"},children:a("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(0, 214, 180, 0.20)",borderRadius:4,color:"var(--accent)",fontFamily:"var(--mono)",fontSize:12},children:"memesh demo"}),e("span",{style:{fontSize:12,color:"var(--text-3)"},children:a("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:4,color:"var(--text-2)",fontFamily:"var(--mono)",fontSize:12},children:"memesh demo --reset --yes"}),e("button",{type:"button",class:"btn",onClick:u,disabled:o!==null,style:{fontSize:11,padding:"4px 10px"},children:a(o==="reset"?"onboarding.resettingButton":"onboarding.resetButton")}),e("span",{style:{fontSize:12,color:"var(--text-3)"},children:a("onboarding.hintReset")})]})]}),i&&e("div",{role:"alert","aria-live":"polite",style:{marginTop:10,fontSize:12,color:"var(--danger)"},children:i})]})}const Cs="memesh.doctorBanner.dismissedSig";function Za(){const[t,s]=k(null),[n,o]=k(()=>{try{return localStorage.getItem(Cs)??""}catch{return""}});if(K(()=>{let b=!0;const h=()=>{V("GET","/v1/doctor").then(w=>{b&&s(Array.isArray(w?.checks)?w:null)}).catch(()=>{})};h();const p=()=>h();return window.addEventListener("memesh:data-changed",p),()=>{b=!1,window.removeEventListener("memesh:data-changed",p)}},[]),!t||t.status==="PASS")return null;const r=b=>{if(b.status==="fail")return!0;if(b.status!=="warn"||!b.fix)return!1;const h=b.fix.trim().toLowerCase();return!(!h||h==="no action needed"||h.startsWith("no action"))},i=t.checks.filter(r);if(i.length===0)return null;const d=i.map(b=>`${b.id}:${b.status}`).sort().join("|");if(d===n)return null;function c(){o(d);try{localStorage.setItem(Cs,d)}catch{}}function g(){const b=i.map(v=>{const f=v.status==="fail"?"❌":"⚠️",_=v.fix?` _Fix: ${v.fix}_`:"";return`- ${f} **${v.label}**: ${v.summary}${_}`}),h=`${a("doctorBanner.preambleForIssue")}
25
+ ${f(E)}`}catch{}}const v=r(Vs[i]),R=`https://github.com/PCIRCLE-AI/memesh-llm-memory/issues/new?title=${encodeURIComponent(`[${v}] `)}&body=${encodeURIComponent(k)}&labels=${encodeURIComponent(p)}`;window.open(R,"_blank"),m(""),n(!1)}finally{h(!1)}}};return e(le,{children:[e("button",{ref:y,class:"fb-btn",onClick:()=>n(!s),"aria-haspopup":"dialog","aria-expanded":s,"aria-controls":"fb-panel",children:r("feedback.button")}),s&&e("div",{class:"fb-panel",ref:l,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:yo.map(p=>e("label",{class:`fb-type ${i===p?"selected":""}`,children:[e("input",{type:"radio",name:"fb-type",value:p,checked:i===p,onChange:()=>o(p)}),r(Vs[p])]},p))}),e("textarea",{ref:b,class:"fb-desc","aria-label":r("feedback.descLabel"),placeholder:r("feedback.placeholder"),value:a,onInput:p=>m(p.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:M,disabled:c,children:r(c?"feedback.submitting":"feedback.submit")})]})]})}function vo({currentToken:t,onSubmit:s,rejected:n=!1}){const[i,o]=w(t??""),[a,m]=w(!1);function d(l){l.preventDefault(),m(!0),i.trim()&&s(i.trim())}const u=a&&!i.trim(),c=n&&!u,h=u||c?"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:i,onInput:l=>o(l.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")}),c&&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 $s="memesh.onboardingDismissed";function ko({health:t}){const[s,n]=w(()=>{try{return localStorage.getItem($s)==="true"}catch{return!1}}),[i,o]=w(null),[a,m]=w("");if(ee(()=>{t&&t.entity_count>0&&n(!0)},[t?.entity_count]),!t||t.entity_count>0||s)return null;function d(){n(!0);try{localStorage.setItem($s,"true")}catch{}}async function u(){m(""),o("seed");try{await J("POST","/v1/demo/seed"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(h){m(Ee(h))}finally{o(null)}}async function c(){if(confirm(r("onboarding.resetConfirm"))){m(""),o("reset");try{await J("POST","/v1/demo/reset"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(h){m(Ee(h))}finally{o(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(0, 214, 180, 0.28)",borderRadius:"var(--radius)",background:"var(--accent-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:i!==null,style:{minWidth:160},children:r(i==="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(0, 214, 180, 0.20)",borderRadius:"var(--radius-xs)",color:"var(--accent)",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:c,disabled:i!==null,style:{fontSize:11,padding:"4px 10px"},children:r(i==="reset"?"onboarding.resettingButton":"onboarding.resetButton")}),e("span",{style:{fontSize:12,color:"var(--text-3)"},children:r("onboarding.hintReset")})]})]}),a&&e("div",{role:"alert",style:{marginTop:10,fontSize:12,color:"var(--danger)"},children:a})]})}const Gs="memesh.doctorBanner.dismissedSig";function ds(t,s,n){const i=r(t,n);return i===t?s:i}function wo(t){return t.code?ds(`doctor.msg.${t.code}.summary`,t.summary,t.params):t.summary}function xo(t){if(t.fix)return t.code?ds(`doctor.msg.${t.code}.fix`,t.fix,t.params):t.fix}function _o(t){return ds(`doctor.label.${t.id}`,t.label)}const Mo=new Set(["update-status.no-cache","update-status.stale","update-status.deprecation-unknown","hook-activity.quiet","shell-cli.not-on-path","skills-manifest.missing-dev","install-channel.unknown","http-probe.no-server","readme-parity.unreadable","readme-parity.drift"]);function Co(t){if(t.status==="fail")return!0;if(t.status!=="warn"||t.code&&Mo.has(t.code)||!t.fix)return!1;const s=t.fix.trim().toLowerCase();return!(!s||s==="no action needed"||s.startsWith("no action"))}function So(){const[t,s]=w(null),[n,i]=w(()=>{try{return localStorage.getItem(Gs)??""}catch{return""}});if(ee(()=>{let y=!0;const b=()=>{J("GET","/v1/doctor").then(f=>{y&&s(Array.isArray(f?.checks)?f:null)}).catch(()=>{})};b();const g=()=>b();return window.addEventListener("memesh:data-changed",g),()=>{y=!1,window.removeEventListener("memesh:data-changed",g)}},[]),!t||t.status==="PASS")return null;const o=t.checks.filter(Co);if(o.length===0)return null;const a=o.map(y=>`${y.id}:${y.status}`).sort().join("|");if(a===n)return null;function m(){i(a);try{localStorage.setItem(Gs,a)}catch{}}function d(){const y=o.map(M=>{const p=M.status==="fail"?"❌":"⚠️",k=M.fix?` _Fix: ${M.fix}_`:"";return`- ${p} **${M.label}**: ${M.summary}${k}`}),b=`${r("doctorBanner.preambleForIssue")}
26
26
 
27
- ${b.join(`
28
- `)}`,w=`https://github.com/PCIRCLE-AI/memesh-llm-memory/issues/new?title=${encodeURIComponent("[Bug] memesh doctor reported issues")}&body=${encodeURIComponent(h)}&labels=${encodeURIComponent("feedback,from-dashboard,bug,doctor-warning")}`;window.open(w,"_blank")}const u=t.status==="FAIL",m=u?"#ef4444":"#f59e0b";return e("div",{role:"alert",style:{position:"relative",margin:"12px auto 0",maxWidth:920,padding:"12px 16px",border:`1px solid ${u?"rgba(239, 68, 68, 0.32)":"rgba(245, 158, 11, 0.32)"}`,borderRadius:8,background:u?"rgba(239, 68, 68, 0.08)":"rgba(245, 158, 11, 0.08)",color:"var(--text-1)"},children:[e("button",{type:"button",onClick:c,"aria-label":a("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:m,marginBottom:6},children:a(u?"doctorBanner.failTitle":"doctorBanner.warnTitleSoft")}),e("ul",{style:{margin:"6px 0 10px",paddingLeft:18,fontSize:12,lineHeight:1.5,color:"var(--text-2)"},children:[i.slice(0,3).map(b=>e("li",{children:[e("strong",{children:[b.label,":"]})," ",b.summary,b.fix&&e(ie,{children:[" — ",e("em",{style:{color:"var(--text-3)"},children:b.fix})]})]},b.id)),i.length>3&&e("li",{style:{color:"var(--text-3)"},children:["…and ",i.length-3," more (run `memesh doctor` for full list)"]})]}),u&&e("div",{style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap"},children:[e("button",{type:"button",class:"btn",onClick:g,style:{fontSize:12,padding:"4px 12px"},children:a("doctorBanner.getHelp")}),e("span",{style:{fontSize:11,color:"var(--text-3)"},children:a("doctorBanner.helpHint")})]})]})}const Ls="memesh.insightsBanner.dismissed";function Qa({currentTab:t,onNavigateToInsights:s}){const[n,o]=k(0),[r,i]=k(()=>{try{return sessionStorage.getItem(Ls)==="true"}catch{return!1}});if(K(()=>{let g=!0;const u=()=>{V("GET","/v1/dream/proposals?status=pending").then(l=>{if(!g)return;const y=Array.isArray(l)?l:l?.data??[];o(y.length)}).catch(()=>{})};u();const m=()=>u();return window.addEventListener("memesh:data-changed",m),()=>{g=!1,window.removeEventListener("memesh:data-changed",m)}},[]),t==="Insights"||r||n===0)return null;function d(g){g.stopPropagation(),i(!0);try{sessionStorage.setItem(Ls,"true")}catch{}}const c=a("banner.pendingInsights",{n,s:n===1?"":"s"});return e("div",{role:"region","aria-label":a("banner.viewAll"),onClick:s,onKeyDown:g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),s())},tabIndex:0,style:{position:"relative",margin:"12px auto 0",maxWidth:920,padding:"10px 40px 10px 16px",border:"1px solid rgba(0, 214, 180, 0.32)",borderRadius:8,background:"linear-gradient(135deg, rgba(0, 214, 180, 0.12) 0%, rgba(0, 214, 180, 0.04) 100%)",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:"💡"}),c]}),e("button",{type:"button",onClick:d,"aria-label":a("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 Ft=["Insights","Lessons","Browse","Analytics","Search","Graph","Manage","Settings"],Ja={Insights:"tab.insights",Lessons:"tab.lessons",Browse:"tab.browse",Analytics:"tab.analytics",Search:"tab.search",Graph:"tab.graph",Manage:"tab.manage",Settings:"tab.settings"},Xs="memesh.tab";function er(){try{const s=new URLSearchParams(window.location.search).get("tab");if(s&&Ft.includes(s))return s;const n=localStorage.getItem(Xs);if(n&&Ft.includes(n))return n}catch{}return"Insights"}function tr(){const[t,s]=k(()=>xn()),[n,o]=k(er);K(()=>{try{localStorage.setItem(Xs,n)}catch{}},[n]);const[r,i]=k(null),[d,c]=k(""),[g,u]=k(!1);K(()=>{const h=()=>u(!0);return window.addEventListener("memesh:auth-required",h),()=>window.removeEventListener("memesh:auth-required",h)},[]);const[m,l]=k(!1),y=ye(()=>{V("GET","/v1/health").then(h=>{i(h),c(""),u(!1)}).catch(h=>{if(h instanceof Ns){l(Et()!==null),u(!0),c("");return}c(h.message)})},[]);K(()=>{y();const h=()=>y();return window.addEventListener("memesh:data-changed",h),()=>window.removeEventListener("memesh:data-changed",h)},[y]);const b=Ft.map(h=>({key:h,label:a(Ja[h])}));return g?e(Ya,{currentToken:Et(),rejected:m,onSubmit:h=>{An(h),l(!1),u(!1),y()}}):e("div",{class:"shell",children:[e(Cn,{health:r,error:d}),e(Za,{}),e(Qa,{currentTab:n,onNavigateToInsights:()=>o("Insights")}),e(Xa,{health:r}),e(Ln,{tabs:b,active:n,onSelect:h=>o(h)}),e("div",{class:"main",children:[e("div",{class:`panel ${n==="Insights"?"active":""}`,children:n==="Insights"&&e($a,{})}),e("div",{class:`panel ${n==="Search"?"active":""}`,children:e(Wn,{})}),e("div",{class:`panel ${n==="Browse"?"active":""}`,children:e(ds,{})}),e("div",{class:`panel ${n==="Analytics"?"active":""}`,children:e(_a,{})}),e("div",{class:`panel ${n==="Graph"?"active":""}`,children:n==="Graph"&&e(Ba,{})}),e("div",{class:`panel ${n==="Lessons"?"active":""}`,children:n==="Lessons"&&e(Ua,{})}),e("div",{class:`panel ${n==="Manage"?"active":""}`,children:n==="Manage"&&e(ds,{manage:!0})}),e("div",{class:`panel ${n==="Settings"?"active":""}`,children:n==="Settings"&&e(Aa,{locale:t,onLocaleChange:s})})]}),e(Ka,{health:r})]})}mn(e(tr,{}),document.getElementById("app"));</script>
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);--font: "Satoshi", -apple-system, system-ui, sans-serif;--mono: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;--radius: 8px;--radius-sm: 6px;--radius-xs: 4px}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}html{font-size:14px}body{font-family:var(--font);background:var(--bg-0);color:var(--text-1);line-height:1.55;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}.shell{min-height:100vh;display:flex;flex-direction:column}.header{display:flex;align-items:center;justify-content:space-between;padding:12px 24px;background:var(--bg-1);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:100;backdrop-filter:blur(16px) saturate(180%)}.header-brand h1{font-size:15px;font-weight:700;color:var(--text-0);letter-spacing:-.03em;line-height:1.2}.header-brand small{font-size:10px;color:var(--text-3);letter-spacing:.05em;text-transform:uppercase}.header-right{display:flex;align-items:center;gap:10px}.header-meta{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--text-2)}.dot{width:6px;height:6px;border-radius:50%;display:inline-block;margin-right:4px}.dot-ok{background:var(--success);box-shadow:0 0 6px #00d6b466}.dot-err{background:var(--danger)}.badge-version{font-family:var(--mono);font-size:10px;color:var(--text-3);background:var(--bg-2);padding:2px 8px;border-radius:var(--radius-xs)}.theme-btn{background:none;border:1px solid var(--border);border-radius:var(--radius-sm);padding:5px 9px;cursor:pointer;color:var(--text-2);font-size:13px;transition:border-color .15s}.theme-btn:hover{border-color:var(--text-3)}.nav{display:flex;background:var(--bg-0);border-bottom:1px solid var(--border);padding:0 24px;gap:0;overflow-x:auto;scrollbar-width:none}.nav::-webkit-scrollbar{display:none}.nav-btn{padding:14px 16px;border:none;background:none;cursor:pointer;font:500 12px/1 var(--font);color:var(--text-3);border-bottom:2px solid transparent;transition:color .15s,border-color .15s;white-space:nowrap;letter-spacing:.01em;min-height:44px}.nav-btn:hover{color:var(--text-2)}.nav-btn.active{color:var(--accent);border-bottom-color:var(--accent)}.main{flex:1;max-width:1100px;width:100%;margin:0 auto;padding:20px 24px}.panel{display:none}.panel.active{display:block}.card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px 18px;margin-bottom:8px;backdrop-filter:blur(8px);transition:border-color .2s,box-shadow .2s}.card:hover{border-color:#00d6b433;box-shadow:0 4px 20px #00d6b40a}.card-title{font-size:13px;font-weight:600;color:var(--text-0);margin-bottom:14px;letter-spacing:-.01em}input[type=text],input[type=password],input[type=search],textarea{width:100%;padding:9px 14px;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-0);font:13px/1.4 var(--font);outline:none;transition:border-color .15s}input:focus,textarea:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--accent-soft)}input::placeholder,textarea::placeholder{color:var(--text-3)}.btn{display:inline-flex;align-items:center;gap:6px;padding:9px 16px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-2);color:var(--text-1);font:600 12px/1 var(--font);cursor:pointer;transition:all .15s;white-space:nowrap}.btn:hover{border-color:var(--text-3);background:var(--bg-hover)}.btn:disabled{opacity:.35;cursor:not-allowed}.btn-primary{background:var(--accent);border-color:var(--accent);color:#080a0c}.btn-primary:hover{background:var(--accent-hover)}.btn-danger{color:var(--danger);border-color:#ff6b6b33;background:transparent}.btn-danger:hover{background:var(--danger-soft)}.btn-sm{padding:8px 14px;font-size:11px;min-height:36px}.table-wrap{overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius)}table{width:100%;border-collapse:collapse}th{text-align:left;padding:9px 14px;font-size:10px;font-weight:600;color:var(--text-3);text-transform:uppercase;letter-spacing:.08em;background:var(--bg-2);border-bottom:1px solid var(--border);white-space:nowrap}td{padding:10px 14px;border-bottom:1px solid var(--border-subtle);font-size:13px;color:var(--text-1)}tbody tr{transition:background .15s}tbody tr:hover{background:var(--bg-hover)}tbody tr:last-child td{border-bottom:none}.badge{display:inline-block;padding:2px 9px;border-radius:9999px;font-size:11px;font-weight:500;letter-spacing:.01em}.badge-active{background:var(--success-soft);color:var(--accent)}.badge-archived{background:var(--danger-soft);color:var(--danger)}.badge-type{background:var(--accent-soft);color:var(--accent)}.tag{display:inline-block;padding:1px 7px;margin:1px 2px;border-radius:var(--radius-xs);font:400 10px var(--mono);background:var(--bg-2);color:var(--text-2);border:1px solid var(--border)}.stats-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px;margin-bottom:20px}.stat{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:16px;transition:border-color .15s}.stat:hover{border-color:#00d6b433;box-shadow:0 2px 12px #00d6b40a}.stat-val{font:700 24px/1.1 var(--mono);color:var(--accent);letter-spacing:-.02em}.stat-lbl{font:500 10px/1 var(--font);color:var(--text-3);text-transform:uppercase;letter-spacing:.08em;margin-top:4px}.search-bar{display:flex;gap:8px;margin-bottom:16px}.search-bar input{flex:1}.mem-row{display:flex;gap:14px;align-items:flex-start}.mem-time{flex-shrink:0;width:72px;font:400 11px var(--mono);color:var(--text-3);padding-top:2px;line-height:1.4}.mem-body{flex:1;min-width:0}.mem-preview{font-size:13px;line-height:1.5;color:var(--text-1);word-break:break-word}.mem-meta{margin-top:3px;font:400 11px var(--mono);color:var(--text-3);display:flex;flex-wrap:wrap;gap:8px;align-items:center}.mem-actions{flex-shrink:0;display:flex;gap:6px}.insight{display:flex;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--border-subtle)}.insight:last-child{border-bottom:none}.insight-icon{font-size:18px;flex-shrink:0}.insight-text{font-size:13px;color:var(--text-1)}.insight-val{font:600 13px var(--mono);color:var(--accent)}.empty{text-align:center;padding:48px 20px;color:var(--text-3);font-size:13px}.empty-icon{font-size:28px;margin-bottom:8px;display:block}.loading{width:18px;height:18px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .6s linear infinite;margin:0 auto}@keyframes spin{to{transform:rotate(360deg)}}.error-box{background:var(--danger-soft);border:1px solid rgba(255,107,107,.12);border-radius:var(--radius-sm);padding:10px 14px;color:var(--danger);font-size:13px}.fb-btn{position:fixed;bottom:20px;right:20px;background:var(--accent);color:#080a0c;border:none;padding:9px 16px;border-radius:9999px;cursor:pointer;font:600 12px var(--font);box-shadow:0 4px 14px #00d6b440;transition:transform .15s,box-shadow .15s;z-index:50}.fb-btn:hover{transform:translateY(-2px);box-shadow:0 6px 20px #00d6b459}.fb-panel{position:fixed;bottom:64px;right:20px;width:340px;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);padding:18px;box-shadow:0 16px 48px #00000080;z-index:51;animation:fb-slide-up .15s ease-out}@keyframes fb-slide-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.fb-title{font:600 14px var(--font);color:var(--text-0);margin-bottom:14px}.fb-types{display:flex;gap:6px;margin-bottom:12px}.fb-type{display:flex;align-items:center;gap:5px;padding:5px 10px;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;font:500 12px var(--font);color:var(--text-2);transition:border-color .15s,background .15s}.fb-type:hover{border-color:var(--text-3)}.fb-type.selected{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.fb-type input{accent-color:var(--accent)}.fb-desc{width:100%;height:80px;padding:9px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);font:400 13px var(--font);resize:vertical;outline:none;margin-bottom:10px;background:var(--bg-0);color:var(--text-0)}.fb-desc:focus{border-color:var(--accent)}.fb-desc::placeholder{color:var(--text-3)}.fb-sys-row{display:flex;align-items:center;gap:6px;font:400 12px var(--font);color:var(--text-2);margin-bottom:12px;cursor:pointer}.fb-sys-row input{accent-color:var(--accent)}.fb-submit{width:100%;justify-content:center}mark{background:#00d6b426;color:inherit;padding:1px 2px;border-radius:3px}.overlay{position:fixed;inset:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:200}.modal{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);padding:24px;max-width:480px;width:90%;max-height:80vh;overflow-y:auto;box-shadow:0 16px 48px #00000080}.modal h3{font-size:15px;font-weight:600;color:var(--text-0);margin-bottom:14px}@media(max-width:768px){.main{padding:14px}.nav-btn{padding:10px 11px;font-size:11px}.header-brand h1{font-size:14px}.search-bar{flex-direction:column}.stats-row{grid-template-columns:1fr 1fr}.mem-time{width:60px;font-size:10px}}@media(max-width:480px){.nav-btn{flex:1;font-size:11px;padding:9px 5px;text-align:center}.stats-row{grid-template-columns:1fr}.mem-row{flex-direction:column;gap:4px}.mem-time{width:auto}}.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>
27
+ ${y.join(`
28
+ `)}`,f=`https://github.com/PCIRCLE-AI/memesh-llm-memory/issues/new?title=${encodeURIComponent("[Bug] memesh doctor reported issues")}&body=${encodeURIComponent(b)}&labels=${encodeURIComponent("feedback,from-dashboard,bug,doctor-warning")}`;window.open(f,"_blank")}const u=t.status==="FAIL",c=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 ${c}`,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:c,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:[o.slice(0,3).map(y=>{const b=xo(y);return e("li",{children:[e("strong",{children:[_o(y),":"]})," ",wo(y),b&&e(le,{children:[" — ",e("em",{style:{color:"var(--text-3)"},children:b})]})]},y.id)}),o.length>3&&e("li",{style:{color:"var(--text-3)"},children:r("doctorBanner.moreCount",{n:o.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 Ys="memesh.insightsBanner.dismissed";function Ao({currentTab:t,onNavigateToInsights:s}){const[n,i]=w(0),[o,a]=w(()=>{try{return sessionStorage.getItem(Ys)==="true"}catch{return!1}});if(ee(()=>{let u=!0;const c=()=>{J("GET","/v1/dream/proposals?status=pending").then(l=>{if(!u)return;const y=Array.isArray(l)?l:l?.data??[];i(y.length)}).catch(()=>{})};c();const h=()=>c();return window.addEventListener("memesh:data-changed",h),()=>{u=!1,window.removeEventListener("memesh:data-changed",h)}},[]),t==="Insights"||o||n===0)return null;function m(u){u.stopPropagation(),a(!0);try{sessionStorage.setItem(Ys,"true")}catch{}}const d=r("banner.pendingInsights",{n,s:n===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(0, 214, 180, 0.32)",borderRadius:"var(--radius)",background:"var(--accent-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 es=["Insights","Lessons","Browse","Analytics","Search","Graph","Manage","Settings"],Eo={Insights:"tab.insights",Lessons:"tab.lessons",Browse:"tab.browse",Analytics:"tab.analytics",Search:"tab.search",Graph:"tab.graph",Manage:"tab.manage",Settings:"tab.settings"},_n="memesh.tab";function Lo(){try{const s=new URLSearchParams(window.location.search).get("tab");if(s&&es.includes(s))return s;const n=localStorage.getItem(_n);if(n&&es.includes(n))return n}catch{}return"Insights"}function To(){const[t,s]=w(()=>Wn()),[n,i]=w(Lo);ee(()=>{try{localStorage.setItem(_n,n)}catch{}},[n]);const[o,a]=w(null),[m,d]=w(""),[u,c]=w(!1);ee(()=>{const g=()=>c(!0);return window.addEventListener("memesh:auth-required",g),()=>window.removeEventListener("memesh:auth-required",g)},[]);const[h,l]=w(!1),y=Me(()=>{J("GET","/v1/health").then(g=>{a(g),d(""),c(!1)}).catch(g=>{if(g instanceof ls){l(Qt()!==null),c(!0),d("");return}d(g.message)})},[]);ee(()=>{y();const g=()=>y();return window.addEventListener("memesh:data-changed",g),()=>window.removeEventListener("memesh:data-changed",g)},[y]);const b=es.map(g=>({key:g,label:r(Eo[g])}));return u?e(vo,{currentToken:Qt(),rejected:h,onSubmit:g=>{Xn(g),l(!1),c(!1),y()}}):e("div",{class:"shell",children:[e($n,{health:o,error:m}),e(So,{}),e(Ao,{currentTab:n,onNavigateToInsights:()=>i("Insights")}),e(ko,{health:o}),e(Gn,{tabs:b,active:n,onSelect:g=>i(g)}),e("div",{class:"main",children:[e("div",{id:"panel-Insights",role:"tabpanel","aria-labelledby":"tab-Insights",class:`panel ${n==="Insights"?"active":""}`,children:n==="Insights"&&e(fo,{})}),e("div",{id:"panel-Search",role:"tabpanel","aria-labelledby":"tab-Search",class:`panel ${n==="Search"?"active":""}`,children:e(lr,{})}),e("div",{id:"panel-Browse",role:"tabpanel","aria-labelledby":"tab-Browse",class:`panel ${n==="Browse"?"active":""}`,children:e(Ps,{health:o})}),e("div",{id:"panel-Analytics",role:"tabpanel","aria-labelledby":"tab-Analytics",class:`panel ${n==="Analytics"?"active":""}`,children:e(qr,{})}),e("div",{id:"panel-Graph",role:"tabpanel","aria-labelledby":"tab-Graph",class:`panel ${n==="Graph"?"active":""}`,children:n==="Graph"&&e(ao,{})}),e("div",{id:"panel-Lessons",role:"tabpanel","aria-labelledby":"tab-Lessons",class:`panel ${n==="Lessons"?"active":""}`,children:n==="Lessons"&&e(ho,{health:o})}),e("div",{id:"panel-Manage",role:"tabpanel","aria-labelledby":"tab-Manage",class:`panel ${n==="Manage"?"active":""}`,children:n==="Manage"&&e(Ps,{manage:!0,health:o})}),e("div",{id:"panel-Settings",role:"tabpanel","aria-labelledby":"tab-Settings",class:`panel ${n==="Settings"?"active":""}`,children:n==="Settings"&&e(Yr,{locale:t,onLocaleChange:s})})]}),e(bo,{health:o})]})}Dn(e(To,{}),document.getElementById("app"));</script>
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>
30
30
  </head>
31
31
  <body>
32
32
  <div id="app"></div>