@pcircle/memesh 4.9.4 → 4.10.1

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 (129) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/AGENTS.md +35 -4
  5. package/README.de.md +3 -3
  6. package/README.md +3 -3
  7. package/README.zh-TW.md +3 -3
  8. package/dashboard/dist/index.html +8 -8
  9. package/dist/cli/view-live.d.ts.map +1 -1
  10. package/dist/cli/view-live.js +0 -427
  11. package/dist/cli/view-live.js.map +1 -1
  12. package/dist/core/briefing-index.d.ts +30 -0
  13. package/dist/core/briefing-index.d.ts.map +1 -0
  14. package/dist/core/briefing-index.js +140 -0
  15. package/dist/core/briefing-index.js.map +1 -0
  16. package/dist/core/briefing.d.ts +4 -0
  17. package/dist/core/briefing.d.ts.map +1 -1
  18. package/dist/core/briefing.js +42 -4
  19. package/dist/core/briefing.js.map +1 -1
  20. package/dist/core/capture-liveness.d.ts +136 -0
  21. package/dist/core/capture-liveness.d.ts.map +1 -0
  22. package/dist/core/capture-liveness.js +447 -0
  23. package/dist/core/capture-liveness.js.map +1 -0
  24. package/dist/core/config.d.ts +1 -0
  25. package/dist/core/config.d.ts.map +1 -1
  26. package/dist/core/config.js +3 -1
  27. package/dist/core/config.js.map +1 -1
  28. package/dist/core/delegation.d.ts +47 -0
  29. package/dist/core/delegation.d.ts.map +1 -0
  30. package/dist/core/delegation.js +174 -0
  31. package/dist/core/delegation.js.map +1 -0
  32. package/dist/core/doctor-fixes.d.ts +1 -0
  33. package/dist/core/doctor-fixes.d.ts.map +1 -1
  34. package/dist/core/doctor-fixes.js +21 -0
  35. package/dist/core/doctor-fixes.js.map +1 -1
  36. package/dist/core/doctor.d.ts +8 -0
  37. package/dist/core/doctor.d.ts.map +1 -1
  38. package/dist/core/doctor.js +148 -3
  39. package/dist/core/doctor.js.map +1 -1
  40. package/dist/core/note-derive.d.ts +14 -0
  41. package/dist/core/note-derive.d.ts.map +1 -0
  42. package/dist/core/note-derive.js +66 -0
  43. package/dist/core/note-derive.js.map +1 -0
  44. package/dist/core/note-ingest.d.ts +34 -0
  45. package/dist/core/note-ingest.d.ts.map +1 -0
  46. package/dist/core/note-ingest.js +445 -0
  47. package/dist/core/note-ingest.js.map +1 -0
  48. package/dist/core/operations.d.ts +10 -1
  49. package/dist/core/operations.d.ts.map +1 -1
  50. package/dist/core/operations.js +129 -14
  51. package/dist/core/operations.js.map +1 -1
  52. package/dist/core/paths.d.ts.map +1 -1
  53. package/dist/core/paths.js.map +1 -1
  54. package/dist/core/schema-export.d.ts.map +1 -1
  55. package/dist/core/schema-export.js +10 -4
  56. package/dist/core/schema-export.js.map +1 -1
  57. package/dist/core/serializer.d.ts.map +1 -1
  58. package/dist/core/serializer.js +3 -0
  59. package/dist/core/serializer.js.map +1 -1
  60. package/dist/core/session-insight.d.ts +44 -0
  61. package/dist/core/session-insight.d.ts.map +1 -0
  62. package/dist/core/session-insight.js +216 -0
  63. package/dist/core/session-insight.js.map +1 -0
  64. package/dist/core/task-state-store.d.ts +4 -0
  65. package/dist/core/task-state-store.d.ts.map +1 -1
  66. package/dist/core/task-state-store.js +18 -5
  67. package/dist/core/task-state-store.js.map +1 -1
  68. package/dist/core/turn-signal.d.ts +22 -0
  69. package/dist/core/turn-signal.d.ts.map +1 -0
  70. package/dist/core/turn-signal.js +89 -0
  71. package/dist/core/turn-signal.js.map +1 -0
  72. package/dist/core/types.d.ts +12 -3
  73. package/dist/core/types.d.ts.map +1 -1
  74. package/dist/core/update-entrypoint.d.ts +19 -0
  75. package/dist/core/update-entrypoint.d.ts.map +1 -0
  76. package/dist/core/update-entrypoint.js +222 -0
  77. package/dist/core/update-entrypoint.js.map +1 -0
  78. package/dist/core/update-notice.d.ts +69 -0
  79. package/dist/core/update-notice.d.ts.map +1 -0
  80. package/dist/core/update-notice.js +188 -0
  81. package/dist/core/update-notice.js.map +1 -0
  82. package/dist/host-runtime/codex-session.d.ts +10 -0
  83. package/dist/host-runtime/codex-session.d.ts.map +1 -1
  84. package/dist/host-runtime/codex-session.js +1 -1
  85. package/dist/host-runtime/codex-session.js.map +1 -1
  86. package/dist/knowledge-graph.d.ts.map +1 -1
  87. package/dist/knowledge-graph.js +24 -3
  88. package/dist/knowledge-graph.js.map +1 -1
  89. package/dist/mcp/THIRD_PARTY_NOTICES.txt +2 -2
  90. package/dist/mcp/server.js +1079 -90
  91. package/dist/mcp/server.js.map +3 -3
  92. package/dist/skills-manifest.json +46 -26
  93. package/dist/transports/cli/cli.d.ts.map +1 -1
  94. package/dist/transports/cli/cli.js +7702 -5764
  95. package/dist/transports/cli/cli.js.map +3 -3
  96. package/dist/transports/http/server.d.ts.map +1 -1
  97. package/dist/transports/http/server.js +38 -27
  98. package/dist/transports/http/server.js.map +1 -1
  99. package/dist/transports/mcp/handlers.d.ts +25 -5
  100. package/dist/transports/mcp/handlers.d.ts.map +1 -1
  101. package/dist/transports/mcp/handlers.js +43 -5
  102. package/dist/transports/mcp/handlers.js.map +1 -1
  103. package/dist/transports/schemas.d.ts +4 -2
  104. package/dist/transports/schemas.d.ts.map +1 -1
  105. package/dist/transports/schemas.js +29 -3
  106. package/dist/transports/schemas.js.map +1 -1
  107. package/docs/platforms/README.md +1 -0
  108. package/docs/platforms/agent-messaging.md +22 -5
  109. package/package.json +14 -4
  110. package/scripts/hooks/_generated/briefing-index.js +147 -0
  111. package/scripts/hooks/_generated/capture-liveness.js +454 -0
  112. package/scripts/hooks/_generated/update-notice.js +195 -0
  113. package/scripts/hooks/_shared.js +302 -14
  114. package/scripts/hooks/_stop-notes.js +504 -0
  115. package/scripts/hooks/auto-update-runner.mjs +22 -0
  116. package/scripts/hooks/decision-nudge.js +32 -5
  117. package/scripts/hooks/guard-check.js +30 -3
  118. package/scripts/hooks/post-commit.js +329 -133
  119. package/scripts/hooks/pre-compact.js +17 -2
  120. package/scripts/hooks/pre-edit-recall.js +32 -1
  121. package/scripts/hooks/session-start.js +361 -78
  122. package/scripts/hooks/session-summary.js +217 -41
  123. package/scripts/hooks/user-prompt-intent.js +89 -19
  124. package/skills/memesh/SKILL.md +20 -8
  125. package/dist/cli/assets/d3.v7.min.js +0 -2
  126. package/dist/core/graph.d.ts +0 -26
  127. package/dist/core/graph.d.ts.map +0 -1
  128. package/dist/core/graph.js +0 -74
  129. package/dist/core/graph.js.map +0 -1
@@ -10,23 +10,23 @@
10
10
  Newsreader = memory content (italic carries the inferred-vs-verbatim
11
11
  distinction), Geist Mono = data. Offline, the stacks fall back. -->
12
12
  <link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,300..700&family=Newsreader:ital,opsz,wght@0,6..72,400..600;1,6..72,400..600&family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet" />
13
- <script type="module" crossorigin>(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))i(a);new MutationObserver(a=>{for(const r of a)if(r.type==="childList")for(const l of r.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&i(l)}).observe(document,{childList:!0,subtree:!0});function n(a){const r={};return a.integrity&&(r.integrity=a.integrity),a.referrerPolicy&&(r.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?r.credentials="include":a.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function i(a){if(a.ep)return;a.ep=!0;const r=n(a);fetch(a.href,r)}})();var Zt,re,Fn,Xe,Qo,In,qn,so,Bt,kt,Un,_o,vo,bo,Ot={},Wt=[],zs=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Jt=Array.isArray;function $e(t,o){for(var n in o)t[n]=o[n];return t}function Ao(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function Ds(t,o,n){var i,a,r,l={};for(r in o)r=="key"?i=o[r]:r=="ref"?a=o[r]:l[r]=o[r];if(arguments.length>2&&(l.children=arguments.length>3?Zt.call(arguments,2):n),typeof t=="function"&&t.defaultProps!=null)for(r in t.defaultProps)l[r]===void 0&&(l[r]=t.defaultProps[r]);return Ft(t,l,i,a,null)}function Ft(t,o,n,i,a){var r={type:t,props:o,key:n,ref:i,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:a??++Fn,__i:-1,__u:0};return a==null&&re.vnode!=null&&re.vnode(r),r}function Q(t){return t.children}function It(t,o){this.props=t,this.context=o}function dt(t,o){if(o==null)return t.__?dt(t.__,t.__i+1):null;for(var n;o<t.__k.length;o++)if((n=t.__k[o])!=null&&n.__e!=null)return n.__e;return typeof t.type=="function"?dt(t):null}function Hs(t){if(t.__P&&t.__d){var o=t.__v,n=o.__e,i=[],a=[],r=$e({},o);r.__v=o.__v+1,re.vnode&&re.vnode(r),Eo(t.__P,r,o,t.__n,t.__P.namespaceURI,32&o.__u?[n]:null,i,n??dt(o),!!(32&o.__u),a),r.__v=o.__v,r.__.__k[r.__i]=r,$n(i,r,a),o.__e=o.__=null,r.__e!=n&&On(r)}}function On(t){if((t=t.__)!=null&&t.__c!=null)return t.__e=t.__c.base=null,t.__k.some(function(o){if(o!=null&&o.__e!=null)return t.__e=t.__c.base=o.__e}),On(t)}function en(t){(!t.__d&&(t.__d=!0)&&Xe.push(t)&&!Gt.__r++||Qo!=re.debounceRendering)&&((Qo=re.debounceRendering)||In)(Gt)}function Gt(){try{for(var t,o=1;Xe.length;)Xe.length>o&&Xe.sort(qn),t=Xe.shift(),o=Xe.length,Hs(t)}finally{Xe.length=Gt.__r=0}}function Wn(t,o,n,i,a,r,l,d,m,c,h){var u,g,f,R,C,D,A,L=i&&i.__k||Wt,B=o.length;for(m=Ns(n,o,L,m,B),u=0;u<B;u++)(f=n.__k[u])!=null&&(g=f.__i!=-1&&L[f.__i]||Ot,f.__i=u,D=Eo(t,f,g,a,r,l,d,m,c,h),R=f.__e,f.ref&&g.ref!=f.ref&&(g.ref&&To(g.ref,null,f),h.push(f.ref,f.__c||R,f)),C==null&&R!=null&&(C=R),(A=!!(4&f.__u))||g.__k===f.__k?(m=Gn(f,m,t,A),A&&g.__e&&(g.__e=null)):typeof f.type=="function"&&D!==void 0?m=D:R&&(m=R.nextSibling),f.__u&=-7);return n.__e=C,m}function Ns(t,o,n,i,a){var r,l,d,m,c,h=n.length,u=h,g=0;for(t.__k=new Array(a),r=0;r<a;r++)(l=o[r])!=null&&typeof l!="boolean"&&typeof l!="function"?(typeof l=="string"||typeof l=="number"||typeof l=="bigint"||l.constructor==String?l=t.__k[r]=Ft(null,l,null,null,null):Jt(l)?l=t.__k[r]=Ft(Q,{children:l},null,null,null):l.constructor===void 0&&l.__b>0?l=t.__k[r]=Ft(l.type,l.props,l.key,l.ref?l.ref:null,l.__v):t.__k[r]=l,m=r+g,l.__=t,l.__b=t.__b+1,d=null,(c=l.__i=Bs(l,n,m,u))!=-1&&(u--,(d=n[c])&&(d.__u|=2)),d==null||d.__v==null?(c==-1&&(a>h?g--:a<h&&g++),typeof l.type!="function"&&(l.__u|=4)):c!=m&&(c==m-1?g--:c==m+1?g++:(c>m?g--:g++,l.__u|=4))):t.__k[r]=null;if(u)for(r=0;r<h;r++)(d=n[r])!=null&&(2&d.__u)==0&&(d.__e==i&&(i=dt(d)),Kn(d,d));return i}function Gn(t,o,n,i){var a,r;if(typeof t.type=="function"){for(a=t.__k,r=0;a&&r<a.length;r++)a[r]&&(a[r].__=t,o=Gn(a[r],o,n,i));return o}t.__e!=o&&(i&&(o&&t.type&&!o.parentNode&&(o=dt(t)),n.insertBefore(t.__e,o||null)),o=t.__e);do o=o&&o.nextSibling;while(o!=null&&o.nodeType==8);return o}function Bs(t,o,n,i){var a,r,l,d=t.key,m=t.type,c=o[n],h=c!=null&&(2&c.__u)==0;if(c===null&&d==null||h&&d==c.key&&m==c.type)return n;if(i>(h?1:0)){for(a=n-1,r=n+1;a>=0||r<o.length;)if((c=o[l=a>=0?a--:r++])!=null&&(2&c.__u)==0&&d==c.key&&m==c.type)return l}return-1}function tn(t,o,n){o[0]=="-"?t.setProperty(o,n??""):t[o]=n==null?"":typeof n!="number"||zs.test(o)?n:n+"px"}function Tt(t,o,n,i,a){var r,l;e:if(o=="style")if(typeof n=="string")t.style.cssText=n;else{if(typeof i=="string"&&(t.style.cssText=i=""),i)for(o in i)n&&o in n||tn(t.style,o,"");if(n)for(o in n)i&&n[o]==i[o]||tn(t.style,o,n[o])}else if(o[0]=="o"&&o[1]=="n")r=o!=(o=o.replace(Un,"$1")),l=o.toLowerCase(),o=l in t||o=="onFocusOut"||o=="onFocusIn"?l.slice(2):o.slice(2),t.l||(t.l={}),t.l[o+r]=n,n?i?n[kt]=i[kt]:(n[kt]=_o,t.addEventListener(o,r?bo:vo,r)):t.removeEventListener(o,r?bo:vo,r);else{if(a=="http://www.w3.org/2000/svg")o=o.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(o!="width"&&o!="height"&&o!="href"&&o!="list"&&o!="form"&&o!="tabIndex"&&o!="download"&&o!="rowSpan"&&o!="colSpan"&&o!="role"&&o!="popover"&&o in t)try{t[o]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&o[4]!="-"?t.removeAttribute(o):t.setAttribute(o,o=="popover"&&n==1?"":n))}}function on(t){return function(o){if(this.l){var n=this.l[o.type+t];if(o[Bt]==null)o[Bt]=_o++;else if(o[Bt]<n[kt])return;return n(re.event?re.event(o):o)}}}function Eo(t,o,n,i,a,r,l,d,m,c){var h,u,g,f,R,C,D,A,L,B,F,j,p,x,E,w=o.type;if(o.constructor!==void 0)return null;128&n.__u&&(m=!!(32&n.__u),r=[d=o.__e=n.__e]),(h=re.__b)&&h(o);e:if(typeof w=="function")try{if(A=o.props,L=w.prototype&&w.prototype.render,B=(h=w.contextType)&&i[h.__c],F=h?B?B.props.value:h.__:i,n.__c?D=(u=o.__c=n.__c).__=u.__E:(L?o.__c=u=new w(A,F):(o.__c=u=new It(A,F),u.constructor=w,u.render=Is),B&&B.sub(u),u.state||(u.state={}),u.__n=i,g=u.__d=!0,u.__h=[],u._sb=[]),L&&u.__s==null&&(u.__s=u.state),L&&w.getDerivedStateFromProps!=null&&(u.__s==u.state&&(u.__s=$e({},u.__s)),$e(u.__s,w.getDerivedStateFromProps(A,u.__s))),f=u.props,R=u.state,u.__v=o,g)L&&w.getDerivedStateFromProps==null&&u.componentWillMount!=null&&u.componentWillMount(),L&&u.componentDidMount!=null&&u.__h.push(u.componentDidMount);else{if(L&&w.getDerivedStateFromProps==null&&A!==f&&u.componentWillReceiveProps!=null&&u.componentWillReceiveProps(A,F),o.__v==n.__v||!u.__e&&u.shouldComponentUpdate!=null&&u.shouldComponentUpdate(A,u.__s,F)===!1){o.__v!=n.__v&&(u.props=A,u.state=u.__s,u.__d=!1),o.__e=n.__e,o.__k=n.__k,o.__k.some(function(I){I&&(I.__=o)}),Wt.push.apply(u.__h,u._sb),u._sb=[],u.__h.length&&l.push(u);break e}u.componentWillUpdate!=null&&u.componentWillUpdate(A,u.__s,F),L&&u.componentDidUpdate!=null&&u.__h.push(function(){u.componentDidUpdate(f,R,C)})}if(u.context=F,u.props=A,u.__P=t,u.__e=!1,j=re.__r,p=0,L)u.state=u.__s,u.__d=!1,j&&j(o),h=u.render(u.props,u.state,u.context),Wt.push.apply(u.__h,u._sb),u._sb=[];else do u.__d=!1,j&&j(o),h=u.render(u.props,u.state,u.context),u.state=u.__s;while(u.__d&&++p<25);u.state=u.__s,u.getChildContext!=null&&(i=$e($e({},i),u.getChildContext())),L&&!g&&u.getSnapshotBeforeUpdate!=null&&(C=u.getSnapshotBeforeUpdate(f,R)),x=h!=null&&h.type===Q&&h.key==null?Vn(h.props.children):h,d=Wn(t,Jt(x)?x:[x],o,n,i,a,r,l,d,m,c),u.base=o.__e,o.__u&=-161,u.__h.length&&l.push(u),D&&(u.__E=u.__=null)}catch(I){if(o.__v=null,m||r!=null)if(I.then){for(o.__u|=m?160:128;d&&d.nodeType==8&&d.nextSibling;)d=d.nextSibling;r[r.indexOf(d)]=null,o.__e=d}else{for(E=r.length;E--;)Ao(r[E]);ko(o)}else o.__e=n.__e,o.__k=n.__k,I.then||ko(o);re.__e(I,o,n)}else r==null&&o.__v==n.__v?(o.__k=n.__k,o.__e=n.__e):d=o.__e=Fs(n.__e,o,n,i,a,r,l,m,c);return(h=re.diffed)&&h(o),128&o.__u?void 0:d}function ko(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(ko))}function $n(t,o,n){for(var i=0;i<n.length;i++)To(n[i],n[++i],n[++i]);re.__c&&re.__c(o,t),t.some(function(a){try{t=a.__h,a.__h=[],t.some(function(r){r.call(a)})}catch(r){re.__e(r,a.__v)}})}function Vn(t){return typeof t!="object"||t==null||t.__b>0?t:Jt(t)?t.map(Vn):$e({},t)}function Fs(t,o,n,i,a,r,l,d,m){var c,h,u,g,f,R,C,D=n.props||Ot,A=o.props,L=o.type;if(L=="svg"?a="http://www.w3.org/2000/svg":L=="math"?a="http://www.w3.org/1998/Math/MathML":a||(a="http://www.w3.org/1999/xhtml"),r!=null){for(c=0;c<r.length;c++)if((f=r[c])&&"setAttribute"in f==!!L&&(L?f.localName==L:f.nodeType==3)){t=f,r[c]=null;break}}if(t==null){if(L==null)return document.createTextNode(A);t=document.createElementNS(a,L,A.is&&A),d&&(re.__m&&re.__m(o,r),d=!1),r=null}if(L==null)D===A||d&&t.data==A||(t.data=A);else{if(r=r&&Zt.call(t.childNodes),!d&&r!=null)for(D={},c=0;c<t.attributes.length;c++)D[(f=t.attributes[c]).name]=f.value;for(c in D)f=D[c],c=="dangerouslySetInnerHTML"?u=f:c=="children"||c in A||c=="value"&&"defaultValue"in A||c=="checked"&&"defaultChecked"in A||Tt(t,c,null,f,a);for(c in A)f=A[c],c=="children"?g=f:c=="dangerouslySetInnerHTML"?h=f:c=="value"?R=f:c=="checked"?C=f:d&&typeof f!="function"||D[c]===f||Tt(t,c,f,D[c],a);if(h)d||u&&(h.__html==u.__html||h.__html==t.innerHTML)||(t.innerHTML=h.__html),o.__k=[];else if(u&&(t.innerHTML=""),Wn(o.type=="template"?t.content:t,Jt(g)?g:[g],o,n,i,L=="foreignObject"?"http://www.w3.org/1999/xhtml":a,r,l,r?r[0]:n.__k&&dt(n,0),d,m),r!=null)for(c=r.length;c--;)Ao(r[c]);d||(c="value",L=="progress"&&R==null?t.removeAttribute("value"):R!=null&&(R!==t[c]||L=="progress"&&!R||L=="option"&&R!=D[c])&&Tt(t,c,R,D[c],a),c="checked",C!=null&&C!=t[c]&&Tt(t,c,C,D[c],a))}return t}function To(t,o,n){try{if(typeof t=="function"){var i=typeof t.__u=="function";i&&t.__u(),i&&o==null||(t.__u=t(o))}else t.current=o}catch(a){re.__e(a,n)}}function Kn(t,o,n){var i,a;if(re.unmount&&re.unmount(t),(i=t.ref)&&(i.current&&i.current!=t.__e||To(i,null,o)),(i=t.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(r){re.__e(r,o)}i.base=i.__P=null}if(i=t.__k)for(a=0;a<i.length;a++)i[a]&&Kn(i[a],o,n||typeof t.type!="function");n||Ao(t.__e),t.__c=t.__=t.__e=void 0}function Is(t,o,n){return this.constructor(t,n)}function qs(t,o,n){var i,a,r,l;o==document&&(o=document.documentElement),re.__&&re.__(t,o),a=(i=!1)?null:o.__k,r=[],l=[],Eo(o,t=o.__k=Ds(Q,null,[t]),a||Ot,Ot,o.namespaceURI,a?null:o.firstChild?Zt.call(o.childNodes):null,r,a?a.__e:o.firstChild,i,l),$n(r,t,l)}Zt=Wt.slice,re={__e:function(t,o,n,i){for(var a,r,l;o=o.__;)if((a=o.__c)&&!a.__)try{if((r=a.constructor)&&r.getDerivedStateFromError!=null&&(a.setState(r.getDerivedStateFromError(t)),l=a.__d),a.componentDidCatch!=null&&(a.componentDidCatch(t,i||{}),l=a.__d),l)return a.__E=a}catch(d){t=d}throw t}},Fn=0,It.prototype.setState=function(t,o){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=$e({},this.state),typeof t=="function"&&(t=t($e({},n),this.props)),t&&$e(n,t),t!=null&&this.__v&&(o&&this._sb.push(o),en(this))},It.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),en(this))},It.prototype.render=Q,Xe=[],In=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,qn=function(t,o){return t.__v.__b-o.__v.__b},Gt.__r=0,so=Math.random().toString(8),Bt="__d"+so,kt="__a"+so,Un=/(PointerCapture)$|Capture$/i,_o=0,vo=on(!1),bo=on(!0);var Us=0;function e(t,o,n,i,a,r){o||(o={});var l,d,m=o;if("ref"in m)for(d in m={},o)d=="ref"?l=o[d]:m[d]=o[d];var c={type:t,props:m,key:n,ref:l,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Us,__i:-1,__u:0,__source:a,__self:r};if(typeof t=="function"&&(l=t.defaultProps))for(d in l)m[d]===void 0&&(m[d]=l[d]);return re.vnode&&re.vnode(c),c}var xt,ge,ao,nn,wt=0,Yn=[],ve=re,sn=ve.__b,an=ve.__r,rn=ve.diffed,cn=ve.__c,ln=ve.unmount,dn=ve.__;function Lo(t,o){ve.__h&&ve.__h(ge,t,wt||o),wt=0;var n=ge.__H||(ge.__H={__:[],__h:[]});return t>=n.__.length&&n.__.push({}),n.__[t]}function b(t){return wt=1,Os(Zn,t)}function Os(t,o,n){var i=Lo(xt++,2);if(i.t=t,!i.__c&&(i.__=[Zn(void 0,o),function(d){var m=i.__N?i.__N[0]:i.__[0],c=i.t(m,d);m!==c&&(i.__N=[c,i.__[1]],i.__c.setState({}))}],i.__c=ge,!ge.__f)){var a=function(d,m,c){if(!i.__c.__H)return!0;var h=i.__c.__H.__.filter(function(g){return g.__c});if(h.every(function(g){return!g.__N}))return!r||r.call(this,d,m,c);var u=i.__c.props!==d;return h.some(function(g){if(g.__N){var f=g.__[0];g.__=g.__N,g.__N=void 0,f!==g.__[0]&&(u=!0)}}),r&&r.call(this,d,m,c)||u};ge.__f=!0;var r=ge.shouldComponentUpdate,l=ge.componentWillUpdate;ge.componentWillUpdate=function(d,m,c){if(this.__e){var h=r;r=void 0,a(d,m,c),r=h}l&&l.call(this,d,m,c)},ge.shouldComponentUpdate=a}return i.__N||i.__}function Z(t,o){var n=Lo(xt++,3);!ve.__s&&Xn(n.__H,o)&&(n.__=t,n.u=o,ge.__H.__h.push(n))}function V(t){return wt=5,de(function(){return{current:t}},[])}function de(t,o){var n=Lo(xt++,7);return Xn(n.__H,o)&&(n.__=t(),n.__H=o,n.__h=t),n.__}function be(t,o){return wt=8,de(function(){return t},o)}function Ws(){for(var t;t=Yn.shift();){var o=t.__H;if(t.__P&&o)try{o.__h.some(qt),o.__h.some(xo),o.__h=[]}catch(n){o.__h=[],ve.__e(n,t.__v)}}}ve.__b=function(t){ge=null,sn&&sn(t)},ve.__=function(t,o){t&&o.__k&&o.__k.__m&&(t.__m=o.__k.__m),dn&&dn(t,o)},ve.__r=function(t){an&&an(t),xt=0;var o=(ge=t.__c).__H;o&&(ao===ge?(o.__h=[],ge.__h=[],o.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(o.__h.some(qt),o.__h.some(xo),o.__h=[],xt=0)),ao=ge},ve.diffed=function(t){rn&&rn(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(Yn.push(o)!==1&&nn===ve.requestAnimationFrame||((nn=ve.requestAnimationFrame)||Gs)(Ws)),o.__H.__.some(function(n){n.u&&(n.__H=n.u),n.u=void 0})),ao=ge=null},ve.__c=function(t,o){o.some(function(n){try{n.__h.some(qt),n.__h=n.__h.filter(function(i){return!i.__||xo(i)})}catch(i){o.some(function(a){a.__h&&(a.__h=[])}),o=[],ve.__e(i,n.__v)}}),cn&&cn(t,o)},ve.unmount=function(t){ln&&ln(t);var o,n=t.__c;n&&n.__H&&(n.__H.__.some(function(i){try{qt(i)}catch(a){o=a}}),n.__H=void 0,o&&ve.__e(o,n.__v))};var mn=typeof requestAnimationFrame=="function";function Gs(t){var o,n=function(){clearTimeout(i),mn&&cancelAnimationFrame(o),setTimeout(t)},i=setTimeout(n,35);mn&&(o=requestAnimationFrame(n))}function qt(t){var o=ge,n=t.__c;typeof n=="function"&&(t.__c=void 0,n()),ge=o}function xo(t){var o=ge;t.__c=t.__(),ge=o}function Xn(t,o){return!t||t.length!==o.length||o.some(function(n,i){return n!==t[i]})}function Zn(t,o){return typeof o=="function"?o(t):o}const $t={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.graph":"Knowledge Graph","tab.settings":"Settings","tab.home":"Home","tab.memories":"Memories","tab.project":"Project","memories.searchPlaceholder":"Filter as you type — press Enter for ranked search","memories.scopeLabel":"Scope","memories.scopeWork":"Work layer","memories.scopeEvidence":"Evidence","memories.scopeAll":"All","memories.scopeArchived":"Archived","memories.composition":"Composition","memories.rankedBy":"ranked by relevance","memories.backToList":"Back to list","memories.workEmpty":"No work-layer memories yet — goals, decisions, lessons and plans land here as they are captured.","memories.showAll":"Show all memories","memories.expand":"Show details","memories.collapse":"Hide details","memory.technicalDetails":"Technical details","memory.canonicalName":"Canonical name","memory.rawType":"Raw type","home.analyticsTitle":"Analytics","handoff.terminal":"Requires Terminal","handoff.terminalPrereq":"Run this on the machine where MeMesh is installed. The Dashboard will not run it for you.","handoff.copyCommand":"Copy command","handoff.commandCopied":"Command copied","handoff.github":"Opens GitHub — review the pre-filled issue before submitting","home.analyticsHint":"Health, timeline, patterns and usage — expands on demand","home.nextAction.eyebrow":"Recommended next step","home.nextAction.why":"Why:","home.nextAction.result":"Expected result:","home.nextAction.loading.title":"Checking what needs attention…","home.nextAction.loading.why":"MeMesh is reading the current library, search index and review queue.","home.nextAction.loading.result":"One recommendation will appear when those checks finish.","home.nextAction.empty.title":"Add your first memory","home.nextAction.empty.why":"The library is empty, so there is nothing to search or organize yet.","home.nextAction.empty.result":"The Memories page lets you load a removable demo or start capturing real work.","home.nextAction.empty.action":"Open Memories","insights.emptyPending":"There are no pending reviews yet. New memory reviews will appear here when available.","home.nextAction.insights.title":"Review memory organization suggestions","home.nextAction.insights.why":"MeMesh has suggestions waiting for your judgment.","home.nextAction.insights.result":"Reviewing them lets you accept useful summaries or reject unsuitable ones.","home.nextAction.insights.action":"Review suggestions","home.nextAction.healthy.title":"No action needed right now","home.nextAction.healthy.why":"The library, search index and review queue have no known action waiting.","home.nextAction.healthy.result":"Continue working; MeMesh will surface the next verified need here.","home.nextAction.unavailable.title":"Current recommendation is unavailable","home.nextAction.unavailable.why":"One of the status checks could not be read, so MeMesh will not guess.","home.nextAction.unavailable.result":"Reload to retry the checks without changing any memory or setting.","home.nextAction.unavailable.action":"Retry status checks","project.selectLabel":"Project","project.selectPrompt":"Pick a project to see its history.","project.empty":"No project memories yet. Work in a git repository with memesh hooks installed and its story will appear here.","guard.sourceLesson":"Source lesson","guard.pattern":"Trigger pattern","guard.message":"Warning it will speak","guard.shouldMatch":"Must trigger on","guard.shouldNotMatch":"Must stay silent on","insights.title":"Memory organization suggestions","insights.reviewTitle":"Staged memory proposals","insights.reviewSubtitle":"work packages awaiting human review","insights.reviewSource":"Staged proposal — review before applying","insights.source.calendar":"Calendar digest","insights.source.transcript":"Claude Code transcript","insights.reviewBoundary":"The Dashboard reviews proposals that are already staged. It does not run or dispatch an agent.","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.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.rejectConfirm":"Reject this insight? This action cannot be undone.","insights.observations":"Summary observations","insights.tags":"Tags","insights.sourceIds":"Sources","insights.validationWarnings":"Legacy validation warnings","insights.validationClaim":"Claim","insights.validationReason":"Reason","banner.pendingInsights":"{n} new insight{s} waiting for your review →","banner.dismiss":"Dismiss","banner.viewAll":"View all","pattern.title":"Pattern","pattern.evidenceCount":"{n} evidence","pattern.severity":"Severity","pattern.severity.high":"high","pattern.severity.medium":"medium","pattern.severity.low":"low","pattern.description":"Pattern description","search.button":"Search","search.searching":"Searching…","search.results":"results","search.result":"result","search.noResults":"No results for","search.facts":"facts","browse.title":"All Memories","browse.active":"active","browse.archived":"archived","browse.refresh":"Refresh","browse.noMatch":"No memories matching","browse.prev":"← Prev","browse.next":"Next →","browse.archive":"Archive","browse.restore":"Restore","browse.confirmArchive":"Archive this memory?","browse.archiveFailed":"Could not archive memory: {message}","browse.restoreFailed":"Could not restore memory: {message}","analytics.totalMemories":"Total Memories","analytics.knowledgeFacts":"Knowledge Facts","analytics.connections":"Connections","analytics.topics":"Topics","analytics.insights":"Insights","analytics.thisWeek":"This week","analytics.new":"new","analytics.stale":"Stale (30+ days unused)","analytics.archivedLabel":"Archived","analytics.mostRecalled":"Most Recalled","health.title":"Memory Health","metrics.notMeasured":"Not measured yet","metrics.health":"Health","metrics.healthNote":"Activity, quality, freshness, lessons","metrics.critical":"Critical lessons","metrics.criticalPartial":"of {tagged} classified · {total} lessons total","metrics.criticalAll":"of {total} lessons, all classified","metrics.criticalUnclassified":"{total} lessons, none classified by severity yet","metrics.criticalNoLessons":"No lessons recorded yet","metrics.citation":"Citations","metrics.citationNote":"{cited} of {total} sessions cited a memory","metrics.citationNotMeasured":"Citation tracking starts after your next session","metrics.reused":"Reused this week","metrics.reusedNote":"Approximate — counted from last-access dates","health.excellent":"Excellent","health.good":"Good","health.fair":"Fair","health.poor":"Poor","health.activity":"Activity","health.quality":"Quality","health.freshness":"Freshness","health.lessons":"Self-Improvement","timeline.title":"Last 30 Days","timeline.created":"Created","timeline.recalled":"Recalled","value.totalRecalls":"Total Recalls","value.lessonsLearned":"Lessons Learned","value.lessonsSaved":"Lessons Applied","value.coverage":"Knowledge Coverage","cleanup.title":"Cleanup Suggestions","cleanup.allClean":"Your memory is clean. No stale or duplicate entities detected.","cleanup.staleLabel":"Low confidence / unused","cleanup.duplicateLabel":"Possible duplicates","cleanup.confidence":"confidence","cleanup.unused":"unused","cleanup.entityMeta":"{type} · {confidence}% confidence · {days}d unused","settings.saved":"Saved.","settings.configReadbackFailed":"The server did not return the saved setting. Try again.","settings.language":"Language","settings.interfaceLanguage":"Interface language","settings.interfaceLanguageHint":"Changes this browser interface immediately.","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":"No newer release available","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.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.","settings.installationDetails":"Installation details","settings.installationDetailsUnavailable":"Version comparison is unavailable for this installation.","settings.interfacePath":"This interface","settings.terminalPath":"Terminal command","settings.technicalDetails":"Technical details","settings.installationDetailsHint":"Different installed versions do not necessarily need an update. Check Updates for published releases.","graph.entities":"Entities","graph.relations":"Relations","graph.orphans":"Orphans","graph.search":"Search nodes…","graph.matches":"matches","graph.enterToOpen":"press Enter to open it","graph.focusMode":"Focus","graph.showAll":"Show all","graph.clickHint":"Click a node to focus","graph.interactHint":"Click a node to focus · drag empty area to pan · scroll to zoom","graph.resetView":"Reset view","graph.resetViewHint":"Reset zoom and pan","graph.ageToday":"today","graph.ageDaysAgo":"{count}d ago","graph.ageWeeksAgo":"{count}w ago","lessons.error":"Error","lessons.rootCause":"Root Cause","lessons.fix":"Fix","lessons.prevention":"Prevention","feedback.button":"💬 Feedback","feedback.title":"Open feedback on GitHub","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…","feedback.popupBlocked":"GitHub did not open. Your draft is still here — allow popups, retry, or copy the prepared link.","feedback.retry":"Try opening GitHub again","feedback.copyLink":"Copy GitHub link","feedback.linkCopied":"Link copied","feedback.copyFailed":"The link could not be copied. Try opening GitHub again.","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","doctorBanner.fix":"Fix automatically","doctorBanner.fixInProgress":"Fixing…","doctorBanner.fixDone":"Fixed","doctorBanner.restartRequired":"Restart the agent to finish applying this update.","doctor.label.readme_locale_parity":"README translations","doctor.label.config":"Config file","doctor.label.mcp-config":"MCP connection file","doctor.label.hooks-config":"Hook definitions","doctor.label.hook-scripts":"Hook scripts","doctor.label.hook-wiring":"Connection to Claude Code","doctor.label.hook-activity":"Auto-capture","doctor.label.node-runtime":"Node.js version","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Plugin code is current","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.install-channel":"Install method","doctor.label.fts_segmentation":"Keyword 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 (.claude-plugin/mcp.json) is missing.","doctor.msg.mcp-config.missing.fix":"Reinstall MeMesh to restore it.","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/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":".claude-plugin/mcp.json no longer contains the memesh server entry.","doctor.msg.mcp-config.no-entry.fix":"Reinstall MeMesh to restore it.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` starts a file that is not in this install, so every memesh tool inside Claude Code fails to start.","doctor.msg.mcp-config.entry-missing.fix":"Reinstall MeMesh. If you edited `.claude-plugin/mcp.json` by hand, point it back at `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.mcp-config.placeholder-unresolved.summary":"NOT VERIFIED: `.claude-plugin/mcp.json` starts a path containing `${CLAUDE_PLUGIN_ROOT}`, which only the Claude Code plugin runtime fills in. This copy is not running as a plugin, so the file it names was not checked.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Check it the way the plugin runtime would: run `CLAUDE_PLUGIN_ROOT=<this install's folder> memesh doctor`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json is missing, so automatic memory capture cannot run.","doctor.msg.hooks-config.missing.fix":"Reinstall MeMesh to restore it.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json is damaged (not valid JSON).","doctor.msg.hooks-config.invalid-json.fix":"Fix {path} or reinstall MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json is missing these hook types: {types}. Some automatic capture will not run.","doctor.msg.hooks-config.missing-types.fix":"Restore the shipped hook configuration or reinstall MeMesh.","doctor.msg.hook-scripts.none.summary":"The hook configuration contains no scripts, so nothing can be captured automatically.","doctor.msg.hook-scripts.none.fix":"Reinstall MeMesh.","doctor.msg.hook-scripts.missing.summary":"These hook scripts are missing: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstall MeMesh to restore them.","doctor.msg.hook-scripts.not-executable.summary":"These hook scripts exist but are not allowed to run: {files}","doctor.msg.hook-scripts.not-executable.fix":"Run `chmod +x scripts/hooks/*.js`, or `npm run build` in a source checkout.","doctor.msg.hook-wiring.no-marker.summary":"memesh is not connected to Claude Code yet, so nothing gets remembered automatically.","doctor.msg.hook-wiring.no-marker.fix":"Run `memesh install-hooks` once, then `memesh doctor` to confirm.","doctor.msg.hook-wiring.script-missing.summary":"A wired memesh hook points at {path}, which no longer exists — the agent invokes a missing file on every matching event. Usually residue from an upgrade that retired the hook.","doctor.msg.hook-wiring.script-missing.fix":"Run `memesh install-hooks` to re-wire (it removes retired entries), then restart your agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"The connection record at {path} cannot be read.","doctor.msg.hook-wiring.marker-unreadable.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.marker-malformed.summary":"The connection record is damaged.","doctor.msg.hook-wiring.marker-malformed.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.settings-missing.summary":"The Claude Code settings file ({path}) is gone, so the connection is broken.","doctor.msg.hook-wiring.settings-missing.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} is damaged (not valid JSON).","doctor.msg.hook-wiring.settings-invalid.fix":"Restore it from a backup, or run `memesh install-hooks` to recreate it.","doctor.msg.hook-wiring.entries-removed.summary":"The memesh entries were removed from {path}, so the connection is broken.","doctor.msg.hook-wiring.entries-removed.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.root-moved.summary":"The connection points at {path}, which no longer exists (memesh probably moved).","doctor.msg.hook-wiring.root-moved.fix":"Run `memesh install-hooks` to refresh it.","doctor.msg.hook-activity.never-ran.summary":"No capture hook has run in the {hours} hours since tracking began, even though hook wiring is in place — nothing is being remembered.","doctor.msg.hook-activity.never-ran.fix":"Finish one work session, then run `memesh doctor` again. If it still says no hook has run, run `memesh install-hooks` and restart your agent.","doctor.msg.hook-activity.stale.summary":"The last capture hook ran about {hours} hours ago ({hook}). If you have worked since then, capture has stopped and nothing from those sessions was saved.","doctor.msg.hook-activity.stale.fix":"Restart your agent, end one session, then run `memesh doctor` again. If it does not recover, run `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"The session-summary hook last ran about {hours} hours ago, and no Claude Code writes landed in the last 3 days either. If this machine has moved to another agent (Codex / Gemini), this is expected; if you still use Claude Code here, capture has stopped.","doctor.msg.hook-activity.stale-unconfirmed.fix":"If you still use Claude Code on this machine: restart it, end one session, and re-run `memesh doctor`. If it does not recover, run `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Could not read hook activity from the database: {detail}. Capture health is unknown, which is not the same as healthy.","doctor.msg.hook-activity.query-failed.fix":"Run `memesh doctor --verbose` for the full error, and check that ~/.memesh is readable and not out of disk.","doctor.msg.hook-activity.stale-unknown.summary":"The {hook} hook's last-run timestamp cannot be read (corrupt, or stamped by a machine with a wrong clock). Capture health is unknown, which is not the same as healthy.","doctor.msg.hook-activity.stale-unknown.fix":"End one work session, then run `memesh doctor` again — a fresh run overwrites the bad timestamp.","doctor.msg.hook-activity.disabled.summary":"Automatic capture is turned off (MEMESH_AUTO_CAPTURE or config autoCapture) — deliberately, so hook silence is expected. Re-enable it to resume capturing sessions.","doctor.msg.hook-activity.disabled-env.summary":"Automatic capture is turned off by MEMESH_AUTO_CAPTURE=false in this shell's environment. Doctor can only see its own environment — if your agent runs without this variable, capture there is unaffected.","doctor.msg.hook-activity.not-wired.summary":"No capture hook has ever run — and no capture hook (Stop / PostToolUse / PreCompact) is confirmed wired on this machine, so there is nothing to run.","doctor.msg.hook-activity.not-wired.fix":"If you want automatic capture, run `memesh install-hooks`. If this install is MCP-only (Codex / Gemini), this is expected and safe to ignore.","doctor.msg.hook-activity.stop-silent.summary":"The {hook} hook is stamping, but the session-summary hook has never run once in the {hours} hours since tracking began — session capture may be broken while commit capture hides it.","doctor.msg.hook-activity.stop-silent.fix":"End one work session and run `memesh doctor` again. If session-summary still has not run, run `memesh install-hooks` and restart your agent.","doctor.msg.hook-activity.never-ran-legacy.summary":"No hook has stamped the heartbeat, but {captured} auto-capture memories landed since tracking began — hooks from a version before heartbeat tracking are probably still running.","doctor.msg.hook-activity.never-ran-legacy.fix":"Update the memesh hooks to the current version (plugin installs: `/plugin update memesh`; npm installs: `memesh install-hooks`), then restart your agent.","doctor.msg.node-runtime.too-old.summary":"Your Node.js is older than this package supports. {detail}","doctor.msg.node-runtime.too-old.fix":"Upgrade Node.js to {required} or newer, then run `memesh doctor` again.","doctor.msg.native-binding.load-failed.summary":"SQLite could not open a database: {detail}.","doctor.msg.native-binding.load-failed.fix":"Check the Node runtime and reinstall MeMesh if necessary.","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` if you want a separate terminal command. Its database depends on its configuration.","doctor.msg.shell-cli.versions.summary":"Installed versions: this interface {current}; terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"The plugin was installed from commit {installed}, but the marketplace has moved to {marketplace} under the same version. {host} does not refresh a cache whose version did not change, so you are running older code than the marketplace has.","doctor.msg.plugin-cache.stale.fix":"Run `{command}` to refresh the cache, then restart {host}.","doctor.msg.plugin-cache.unverifiable.summary":"Could not tell whether the installed plugin matches the marketplace. The version alone cannot answer this — two builds can carry the same version.","doctor.msg.plugin-cache.unverifiable.fix":"Run `{command}` once; it records the commit, after which this check can answer.","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.config-parse.retired-settings.summary":"The valid config file at {path} still contains {count} retired top-level settings ({keys}). This version ignores them, but legacy provider credentials or settings may remain on disk.","doctor.msg.config-parse.retired-settings.fix":"Review {path} locally and remove only those retired top-level keys. Do not paste the file into an issue because it may contain credentials. Then run memesh doctor again.","doctor.msg.message-capability.probe-failed.summary":"The installed message capability probe failed: {detail}.","doctor.msg.message-router.socket-missing.summary":"No Local router socket exists at {path}; stopped or missing sessions will not be awakened.","doctor.msg.message-router.socket-insecure.summary":"The router socket at {path} is not an owner-private Unix socket.","doctor.msg.message-router.socket-unreachable.summary":"The owner-private router socket at {path} exists but did not accept a local connection.","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.citation.none.summary":"Sessions received injected memories and none cited one.","doctor.msg.citation.none.fix":"Check the citation contract at ~/.claude/rules/memesh-citations.md, then re-check after a few sessions.","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.workflow":"Workflow","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.auth.cross-origin":"This request came from another website, or reached the server under an unexpected name, so it was refused. Open the dashboard from the address `memesh serve` printed.","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.rate.limited":"Too many requests in a short time. Wait a moment and try again.","httpError.server.internal":"The server hit an unexpected 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.filterTime":"Time","browse.filterValue":"Value","browse.filterProject":"Project","browse.filterSort":"Sort","browse.timeToday":"Today","browse.timeWeek":"This week","browse.timeMonth":"This month","browse.timeOlder":"Older","browse.valueRecalled":"✓ Used","browse.valueNever":"Never recalled","browse.sortMostRecalled":"Most recalled","browse.sortRecent":"Recently used","browse.sortCreated":"Created","browse.emptyFilter":"No memories in this category — try a different filter","lessons.stepsLabel":"steps","lessons.commitsCount":"{count} commits","lessons.unstructured":"(No structured fields — see raw memory)","lessons.moreItems":"+{count} more","roadmap.title":"Project History","roadmap.summary":"{count} memories · {first} → {last}","roadmap.switchToList":"↩ List view","roadmap.switchToRoadmap":"🕘 History view","roadmap.emptyProject":"No memories in this project yet.","loop.label":"Memory loop","loop.subtitleHas":"knowledge memories reused in the past 7 days","loop.subtitleNone":"No knowledge memories reused this week — try recalling a lesson","loop.approxNote":"Approximation — full tracking starts after upgrade.","loop.sparkLabel":"Last 30 days","roadmap.milestones":"Milestones","roadmap.keyLessons":"Key lessons","radar.title":"Knowledge coverage radar","radar.caption":"Active knowledge memories (session and commit excluded)","radar.axis.lessons":"Lessons","radar.axis.decisions":"Decisions","radar.axis.patterns":"Patterns","radar.axis.bugs":"Bug fixes","radar.axis.processes":"Processes","radar.axis.architecture":"Architecture","ageMatrix.title":"Memory age distribution","ageMatrix.low":"Low","ageMatrix.high":"High","ageMatrix.legend":"colour depth = memory density","ageMatrix.typeColumn":"Type","header.signalModeOn":"Focused memories","header.signalModeOff":"All memories","header.signalModeOnHint":"Shows goals, decisions, lessons, and plans. Hides auto-captured session, commit, and activity records on Memories and Knowledge Graph.","header.signalModeOffHint":"Shows every record, including auto-captured session, commit, and activity records on Memories and Knowledge Graph.","globalFilter.focusedStatus":"Global view: Focused memories — auto-captured session, commit, and activity records are hidden on Memories and Knowledge Graph.","globalFilter.allStatus":"Global view: All memories — auto-captured session, commit, and activity records are included on Memories and Knowledge Graph.","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.coreHint":"Local memory: remember, FTS5 keyword recall, hooks, and Dashboard browsing work together.","onboarding.searchHint":"Recall uses local FTS5 keyword search.","onboarding.reviewHint":"An already-running agent can prepare a digest or visible-transcript work package; the Dashboard only reviews the staged proposal.","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.demoLoadedTitle":"Demo data is loaded","onboarding.demoLoadedBody":"{count} demo-tagged memories are present. You can remove only those memories here.","onboarding.resetConfirm":"Remove every memory tagged metadata.demo? The same rows cannot be restored, but you can load a fresh demo later. Real memories will be kept.","onboarding.resetReadbackFailed":"Reset could not be confirmed because demo-tagged memories are still present. The cleanup action remains available; try again or run memesh doctor.","onboarding.dismiss":"Dismiss","common.serverError":"The server reported an error (HTTP {status}). Try again — if it keeps happening, run `memesh doctor`.","emptyLibrary.title":"Your memory is empty","emptyLibrary.body":"Nothing is stored here yet. Load the 30-entry demo tour to see how MeMesh works — you can wipe it later with one click.","browse.truncated":"showing the first {shown} of {total} memories — use search or filters to reach the rest","browse.truncatedUnknownTotal":"showing the first {shown} memories — the total is unavailable, so there may be more","graph.cappedNote":"Showing the top {shown} of {total} entities (most recalled first) so the graph stays responsive.","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":"On supported install channels, first use asks for consent once per session before updating. Other channels show their own update action. Env MEMESH_AUTO_UPDATE sets the allowed bump, but never bypasses consent.","errors.timeout":"Request timed out","type.lesson_learned":"Lesson","type.lesson":"Lesson","type.mistake":"Mistake","type.decision":"Decision","type.goal":"Goal","type.architecture_decision":"Arch decision","type.design_decision":"Design decision","type.pattern":"Pattern","type.technical_pattern":"Tech pattern","type.best_practice":"Best practice","type.bug_fix":"Bug fix","type.verification_result":"Verification","type.test_result":"Test result","type.process":"Process","type.architecture":"Architecture","type.infrastructure":"Infrastructure","type.feature":"Feature","type.release":"Release","type.refactoring":"Refactoring","type.commit":"Commit","type.session_keypoint":"Session keypoint","type.session_identity":"Session identity","type.session-insight":"Session insight","type.session-summary":"Session summary","type.session-identity":"Session identity","type.weekly_summary":"Weekly summary","type.weekly-summary":"Weekly summary","type.note":"Note","type.plan":"Plan","type.knowledge":"Knowledge","type.workflow_checkpoint":"Workflow milestone","type.concept":"Concept","type.tool":"Tool","type.person":"Person","relation.relates_to":"relates to","relation.related-to":"related to","relation.depends_on":"depends on","relation.implements":"implements","relation.learned_from":"learned from","relation.supersedes":"supersedes","relation.contradicts":"contradicts","relation.follows":"follows","relation.belongs-to-project":"belongs to project","relation.evidences":"evidences","relation.co-created":"co-created","relation.shares-name-tokens":"shares name tokens","patterns.day.0":"Sunday","patterns.day.1":"Monday","patterns.day.2":"Tuesday","patterns.day.3":"Wednesday","patterns.day.4":"Thursday","patterns.day.5":"Friday","patterns.day.6":"Saturday","lessons.severity.critical":"Critical","lessons.severity.major":"Major","lessons.severity.minor":"Minor","memory.tooltip.project":"Project","memory.tooltip.recalled":"Recalled {count} times","memory.tooltip.hasRelations":"Linked to {count} other memories","memory.tooltip.createdAt":"Created {date}","graph.layerLabel":"Graph layer","graph.layerWork":"Work","graph.layerAll":"Everything","graph.layerWorkHint":"Saved decisions, lessons and plans with their recorded links.","graph.layerAllHint":"All saved memories and their recorded links. Links may be added by agents or maintenance rules; this view does not call a language model.","graph.layerFellBack":"Fewer than {min} work items so far, so the full graph is shown instead. Record decisions and lessons and this view fills in.","graph.evidenceFor":"Evidence for {node}","graph.evidenceClose":"Close","graph.evidenceLoading":"Loading evidence…","graph.evidenceFailed":"Could not load the evidence for this item.","graph.evidenceEmpty":"No evidence linked to this item yet. Run `memesh kg backfill` to draw those links from commits and session captures.","graph.evidenceTruncated":"Showing the {shown} most recent; more exist.","graph.drift":"Drift","graph.driftHint":"Colour nodes by age: red = stale, green = recently used","common.unknown":"unknown","insights.entitiesCount":"{n} entities","roadmap.viewToggle":"Project history view","roadmap.viewTree":"Tree","roadmap.viewMindmap":"Mindmap","roadmap.mindmapNeedsPhases":"The mindmap needs at least 3 memories within a 7-day window.","roadmap.activePhase":"active","roadmap.entryCount":"{count} entry","roadmap.entriesCount":"{count} entries","roadmap.otherGroup":"Other ({count})","roadmap.lowSignalHidden":"({count} low-signal hidden)","roadmap.resetHint":"Reset zoom and pan (double-clicking the background also resets)","roadmap.zoomHint":"scroll to zoom · drag to pan · {pct}%","roadmap.moreEntities":"+{count} more","roadmap.viewDecisions":"Decisions","roadmap.densityTitle":"Capture density by category","roadmap.densityNote":"what memesh captured — not everything that happened","roadmap.lineageSupersedes":"{n} superseded","roadmap.lineageConflicts":"{n} unresolved conflicts","adr.empty":'No decisions recorded for this project yet. Record one with type "decision" and it appears here with its history.',"adr.statusActive":"active","adr.statusSuperseded":"superseded","adr.supersedes":"supersedes","adr.supersededBy":"superseded by","nav.ariaLabel":"Dashboard sections","feedback.descLabel":"Feedback description","graph.canvasA11y":"Knowledge graph, drawn on a canvas: {entities} entities, {relations} relations, {orphans} unconnected. Use the type filters and search above for a non-visual view."},"zh-TW":{"auth.title":"需要驗證","auth.intro":"此儀表板受 bearer token 保護。請在下方貼上 MEMESH_REMOTE_TOKEN 的值(或 <memeshDir>/remote-token 檔案的內容)。","auth.tokenLabel":"Token","auth.empty":"Token 不能為空。","auth.invalid":"這個權杖沒有被接受,請檢查後再試一次。","auth.submit":"解鎖儀表板","auth.tokenPlaceholder":"在這裡貼上 token","brand.subtitle":"powered by pcircle.com","header.connected":"已連線","header.disconnected":"已斷線","header.connecting":"連線中…","header.memories":"筆記憶","insights.title":"記憶整理建議","insights.reviewTitle":"已暫存的記憶提案","insights.reviewSubtitle":"等待人工審閱的工作包","insights.reviewSource":"已暫存提案——套用前請先審閱","insights.source.calendar":"日曆摘要","insights.source.transcript":"Claude Code 對話記錄","insights.reviewBoundary":"儀表板只審閱已暫存的提案,不會執行或派送代理。","insights.statPending":"待審","insights.statApplied":"已採用","insights.statRejected":"已拒絕","insights.filter.pending":"待審","insights.filter.applied":"已採用","insights.filter.rejected":"已拒絕","insights.filter.all":"全部","insights.refresh":"重新整理","insights.loading":"讀取中…","insights.emptyOther":"沒有資料。","insights.sources":"來源","insights.status.pending":"待審","insights.status.applied":"已採用","insights.status.rejected":"已拒絕","insights.viewDetail":"查看詳情","insights.collapse":"收合","insights.accept":"採用","insights.applying":"套用中…","insights.reject":"拒絕","insights.rejectConfirm":"要拒絕這則洞察嗎?此操作無法復原。","insights.observations":"摘要觀察","insights.tags":"標籤","insights.sourceIds":"來源實體","insights.validationWarnings":"舊版驗證警告","insights.validationClaim":"陳述","insights.validationReason":"原因","banner.pendingInsights":"有 {n} 則新洞察等你審閱 →","banner.dismiss":"關閉","banner.viewAll":"查看全部","pattern.title":"模式","pattern.evidenceCount":"{n} 個證據","pattern.severity":"嚴重度","pattern.severity.high":"高","pattern.severity.medium":"中","pattern.severity.low":"低","pattern.description":"模式說明","tab.graph":"知識圖譜","tab.settings":"設定","tab.home":"首頁","tab.memories":"記憶","tab.project":"專案","memories.searchPlaceholder":"輸入即時篩選 — 按 Enter 依相關度排序搜尋","memories.scopeLabel":"範圍","memories.scopeWork":"工作層","memories.scopeEvidence":"證據","memories.scopeAll":"全部","memories.scopeArchived":"已封存","memories.composition":"組成","memories.rankedBy":"依相關度排序","memories.backToList":"返回列表","memories.workEmpty":"還沒有工作層記憶 — 目標、決策、教訓與計畫被記錄後會出現在這裡。","memories.showAll":"顯示所有記憶","memories.expand":"顯示詳情","memories.collapse":"隱藏詳情","memory.technicalDetails":"技術詳情","memory.canonicalName":"標準名稱","memory.rawType":"原始類型","home.analyticsTitle":"分析","handoff.terminal":"需要使用終端機","handoff.terminalPrereq":"請在安裝 MeMesh 的電腦上執行;儀表板不會替你執行這個指令。","handoff.copyCommand":"複製指令","handoff.commandCopied":"已複製指令","handoff.github":"將開啟 GitHub — 送出前可先檢查已填內容","home.analyticsHint":"健康度、時間軸、模式與使用情況 — 需要時再展開","home.nextAction.eyebrow":"建議下一步","home.nextAction.why":"原因:","home.nextAction.result":"預期結果:","home.nextAction.loading.title":"正在確認目前最需要處理的事…","home.nextAction.loading.why":"MeMesh 正在讀取記憶庫、搜尋索引與待審清單的目前狀態。","home.nextAction.loading.result":"檢查完成後,這裡只會顯示一項建議。","home.nextAction.empty.title":"加入第一筆記憶","home.nextAction.empty.why":"記憶庫目前是空的,因此還沒有內容可搜尋或整理。","home.nextAction.empty.result":"前往「記憶」可載入能隨時移除的示範資料,或開始記錄真實工作。","home.nextAction.empty.action":"開啟記憶","insights.emptyPending":"目前沒有待審的整理結果。有新的記憶整理結果時,會顯示在這裡。","home.nextAction.insights.title":"審查記憶整理建議","home.nextAction.insights.why":"MeMesh 有等待你判斷的整理建議。","home.nextAction.insights.result":"你可以接受有用的摘要,或拒絕不合適的建議。","home.nextAction.insights.action":"審查建議","home.nextAction.healthy.title":"目前不需要採取動作","home.nextAction.healthy.why":"記憶庫、搜尋索引與待審清單目前都沒有已知待辦。","home.nextAction.healthy.result":"繼續工作即可;MeMesh 會在這裡顯示下一個經狀態確認的需求。","home.nextAction.unavailable.title":"目前無法提供建議","home.nextAction.unavailable.why":"有一項狀態檢查無法讀取,因此 MeMesh 不會猜測。","home.nextAction.unavailable.result":"重新載入可再次檢查,且不會變更任何記憶或設定。","home.nextAction.unavailable.action":"重試狀態檢查","project.selectLabel":"專案","project.selectPrompt":"選擇一個專案即可查看它的歷程。","project.empty":"還沒有專案記憶。在裝有 memesh hook 的 git 儲存庫中工作,它的故事就會出現在這裡。","guard.sourceLesson":"來源教訓","guard.pattern":"觸發樣式","guard.message":"將發出的警告","guard.shouldMatch":"必須觸發於","guard.shouldNotMatch":"必須靜默於","search.button":"搜尋","search.searching":"搜尋中…","search.results":"個結果","search.result":"個結果","search.noResults":"找不到符合的結果:","search.facts":"筆事實","browse.title":"所有記憶","browse.active":"使用中","browse.archived":"已封存","browse.refresh":"重新整理","browse.noMatch":"找不到符合的記憶:","browse.prev":"← 上一頁","browse.next":"下一頁 →","browse.archive":"封存","browse.restore":"還原","browse.confirmArchive":"確定要封存此記憶?","browse.archiveFailed":"封存失敗:{message}","browse.restoreFailed":"還原失敗:{message}","analytics.totalMemories":"記憶總數","analytics.knowledgeFacts":"知識事實","analytics.connections":"關聯","analytics.topics":"主題","analytics.insights":"洞察","analytics.thisWeek":"本週","analytics.new":"筆新增","analytics.stale":"閒置(30 天以上未使用)","analytics.archivedLabel":"已封存","analytics.mostRecalled":"最常查閱","health.title":"記憶健康度","metrics.notMeasured":"尚未量測","metrics.health":"健康度","metrics.healthNote":"活躍度、品質、新鮮度、教訓","metrics.critical":"嚴重教訓","metrics.criticalPartial":"在 {tagged} 筆已分類中 · 共 {total} 筆教訓","metrics.criticalAll":"共 {total} 筆教訓,全數已分類","metrics.criticalUnclassified":"{total} 筆教訓,尚未依嚴重度分類","metrics.criticalNoLessons":"尚未記錄任何教訓","metrics.citation":"引用率","metrics.citationNote":"{total} 次工作階段中有 {cited} 次引用了記憶","metrics.citationNotMeasured":"引用追蹤會在下次工作階段開始計算","metrics.reused":"本週被重用","metrics.reusedNote":"近似值——以最後存取時間推估","health.excellent":"優秀","health.good":"良好","health.fair":"普通","health.poor":"不佳","health.activity":"活躍度","health.quality":"品質","health.freshness":"新鮮度","health.lessons":"自我改善","timeline.title":"最近 30 天","timeline.created":"新增","timeline.recalled":"召回","value.totalRecalls":"總召回次數","value.lessonsLearned":"經驗教訓","value.lessonsSaved":"已應用教訓","value.coverage":"知識覆蓋率","cleanup.title":"清理建議","cleanup.allClean":"記憶庫很乾淨,沒有偵測到過時或重複的實體。","cleanup.staleLabel":"低信心度 / 未使用","cleanup.duplicateLabel":"可能重複","cleanup.confidence":"信心度","cleanup.unused":"未使用","cleanup.entityMeta":"{type} · 信心度 {confidence}% · 已閒置 {days} 天","settings.saved":"已儲存","settings.configReadbackFailed":"伺服器未回傳已儲存的設定,請再試一次。","settings.language":"語言","settings.interfaceLanguage":"介面語言","settings.interfaceLanguageHint":"立即變更這個瀏覽器中的介面語言。","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.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 時的工具或工作流程來更新這個安裝。","settings.installationDetails":"安裝詳情","settings.installationDetailsUnavailable":"此安裝無法比較版本。","settings.interfacePath":"此介面","settings.terminalPath":"終端機指令","settings.technicalDetails":"技術詳情","settings.installationDetailsHint":"不同的已安裝版本不一定需要更新。請到「更新」查看已發佈版本。","graph.entities":"實體","graph.relations":"關聯","graph.orphans":"孤立節點","graph.search":"搜尋節點…","graph.matches":"個符合","graph.enterToOpen":"按 Enter 開啟","graph.focusMode":"聚焦","graph.showAll":"顯示全部","graph.clickHint":"點擊節點以聚焦","graph.interactHint":"點擊節點聚焦 · 拖曳空白處平移 · 滾輪縮放","graph.resetView":"重設視圖","graph.resetViewHint":"重設縮放與位置","graph.ageToday":"今天","graph.ageDaysAgo":"{count} 天前","graph.ageWeeksAgo":"{count} 週前","lessons.error":"錯誤","lessons.rootCause":"根本原因","lessons.fix":"修復方式","lessons.prevention":"預防措施","feedback.button":"💬 意見回饋","feedback.title":"在 GitHub 開啟意見回饋","feedback.bug":"錯誤","feedback.feature":"功能建議","feedback.question":"問題","feedback.placeholder":"描述你的意見回饋…","feedback.includeSys":"附帶系統資訊","feedback.submit":"開啟 GitHub Issue","feedback.submitting":"收集診斷資訊中…","feedback.popupBlocked":"GitHub 未開啟。草稿仍完整保留;請允許彈出式視窗、重試或複製已準備的連結。","feedback.retry":"再次嘗試開啟 GitHub","feedback.copyLink":"複製 GitHub 連結","feedback.linkCopied":"已複製連結","feedback.copyFailed":"無法複製連結,請再次嘗試開啟 GitHub。","doctorBanner.warnTitleSoft":"memesh 有幾條設定提醒","doctorBanner.failTitle":"memesh 設定不完整","doctorBanner.dismiss":"關閉","doctorBanner.getHelp":"取得協助","doctorBanner.helpHint":"會開啟一個已填好診斷資訊的 GitHub issue","doctorBanner.preambleForIssue":"memesh doctor 在我的安裝上回報以下狀況:","doctorBanner.moreCount":"…還有 {n} 條——執行 `memesh doctor` 看完整清單","doctorBanner.fix":"自動修復","doctorBanner.fixInProgress":"修復中…","doctorBanner.fixDone":"已修復","doctorBanner.restartRequired":"請重新啟動代理,完成這次更新。","doctor.label.readme_locale_parity":"README 翻譯同步","doctor.label.config":"設定檔","doctor.label.mcp-config":"MCP 連線設定檔","doctor.label.hooks-config":"Hook 定義檔","doctor.label.hook-scripts":"Hook 腳本","doctor.label.hook-wiring":"與 Claude Code 的連接","doctor.label.hook-activity":"自動記錄","doctor.label.node-runtime":"Node.js 版本","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"外掛程式碼是否最新","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.install-channel":"安裝方式","doctor.label.fts_segmentation":"關鍵字索引","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 的檔案(.claude-plugin/mcp.json)不見了。","doctor.msg.mcp-config.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/mcp.json 壞掉了(不是有效的 JSON),Claude Code 讀不到它。","doctor.msg.mcp-config.invalid-json.fix":"修好 {path},或重新安裝 MeMesh。","doctor.msg.mcp-config.no-entry.summary":".claude-plugin/mcp.json 裡的 memesh 伺服器設定不見了。","doctor.msg.mcp-config.no-entry.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` 要啟動的檔案不在這份安裝裡,所以 Claude Code 裡的每個 memesh 工具都起不來。","doctor.msg.mcp-config.entry-missing.fix":"重新安裝 MeMesh。如果你手動改過 `.claude-plugin/mcp.json`,把它指回 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`。","doctor.msg.mcp-config.placeholder-unresolved.summary":"尚未驗證:`.claude-plugin/mcp.json` 要啟動的路徑含有 `${CLAUDE_PLUGIN_ROOT}`,而這個變數只有 Claude Code 的外掛執行環境會代入。這份安裝不是以外掛方式在跑,所以它指向的檔案沒有被檢查。","doctor.msg.mcp-config.placeholder-unresolved.fix":"用外掛執行環境的方式檢查:執行 `CLAUDE_PLUGIN_ROOT=<這份安裝的資料夾> memesh doctor`。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json 不見了,自動記憶功能跑不起來。","doctor.msg.hooks-config.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json 壞掉了(不是有效的 JSON)。","doctor.msg.hooks-config.invalid-json.fix":"修好 {path},或重新安裝 MeMesh。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json 少了這些 hook 類型:{types}。部分自動記錄不會執行。","doctor.msg.hooks-config.missing-types.fix":"還原出廠的 hook 設定,或重新安裝 MeMesh。","doctor.msg.hook-scripts.none.summary":"Hook 設定裡沒有任何腳本,什麼都不會被自動記錄。","doctor.msg.hook-scripts.none.fix":"重新安裝 MeMesh。","doctor.msg.hook-scripts.missing.summary":"這些 hook 腳本不見了:{files}","doctor.msg.hook-scripts.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.hook-scripts.not-executable.summary":"這些 hook 腳本存在但沒有執行權限:{files}","doctor.msg.hook-scripts.not-executable.fix":"執行 `chmod +x scripts/hooks/*.js`;原始碼安裝則跑 `npm run build`。","doctor.msg.hook-wiring.no-marker.summary":"memesh 還沒接上 Claude Code,所以不會自動記住任何東西。","doctor.msg.hook-wiring.no-marker.fix":"執行一次 `memesh install-hooks` 完成連接,再用 `memesh doctor` 確認。","doctor.msg.hook-wiring.script-missing.summary":"已接線的 memesh hook 指向 {path},但這個檔案已不存在——agent 每次觸發對應事件都會呼叫一個不存在的檔案。通常是升級移除某個 hook 後留下的殘留。","doctor.msg.hook-wiring.script-missing.fix":"執行 `memesh install-hooks` 重新接線(它會移除已退役的項目),然後重啟你的 agent。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} 的連接紀錄讀不到。","doctor.msg.hook-wiring.marker-unreadable.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.marker-malformed.summary":"連接紀錄壞掉了。","doctor.msg.hook-wiring.marker-malformed.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 的設定檔({path})不見了,連接已中斷。","doctor.msg.hook-wiring.settings-missing.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} 壞掉了(不是有效的 JSON)。","doctor.msg.hook-wiring.settings-invalid.fix":"從備份還原,或用 `memesh install-hooks` 重建。","doctor.msg.hook-wiring.entries-removed.summary":"{path} 裡的 memesh 設定被移除了,連接已中斷。","doctor.msg.hook-wiring.entries-removed.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.root-moved.summary":"連接指向的 {path} 已經不存在(memesh 可能被搬走了)。","doctor.msg.hook-wiring.root-moved.fix":"執行 `memesh install-hooks` 更新路徑。","doctor.msg.hook-activity.never-ran.summary":"從開始追蹤到現在 {hours} 小時,沒有任何擷取 hook 跑過——而 hook 接線是好的,代表它們該跑卻沒跑,沒有任何東西被記下來。","doctor.msg.hook-activity.never-ran.fix":"完整用一次工作階段,再跑 `memesh doctor`。如果還是說沒有 hook 跑過,執行 `memesh install-hooks` 然後重啟 agent。","doctor.msg.hook-activity.stale.summary":"最後一次擷取 hook 是大約 {hours} 小時前跑的({hook})。如果你這段時間有在工作,代表擷取已經停了,那些工作階段的內容都沒被存下來。","doctor.msg.hook-activity.stale.fix":"重啟 agent,結束一次工作階段,再跑 `memesh doctor`。如果沒恢復,執行 `memesh install-hooks`。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary hook 上次執行大約在 {hours} 小時前,而且過去 3 天也沒有任何 Claude Code 的寫入。如果這台機器已改用其他 agent(Codex / Gemini),這是正常的;如果你在這裡仍使用 Claude Code,擷取已經停了。","doctor.msg.hook-activity.stale-unconfirmed.fix":"如果這台機器仍在使用 Claude Code:重啟它、結束一個 session,再執行一次 `memesh doctor`。若仍未恢復,執行 `memesh install-hooks`。","doctor.msg.hook-activity.query-failed.summary":"讀不到 hook 活動紀錄:{detail}。擷取狀態現在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.query-failed.fix":"用 `memesh doctor --verbose` 看完整錯誤,並確認 ~/.memesh 讀得到、磁碟沒滿。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} hook 的最後執行時間讀不出來(資料壞了,或是被時鐘不準的機器蓋的章)。擷取狀態現在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.stale-unknown.fix":"結束一次工作階段後再跑 `memesh doctor`——新的一次執行會把壞掉的時間蓋掉。","doctor.msg.hook-activity.disabled.summary":"自動擷取已關閉(MEMESH_AUTO_CAPTURE 或設定檔的 autoCapture)——這是刻意設定,hook 沒動靜是預期中的。想恢復擷取就把它打開。","doctor.msg.hook-activity.disabled-env.summary":"自動擷取被這個 shell 環境中的 MEMESH_AUTO_CAPTURE=false 關閉了。doctor 只能看到自己所在的環境——如果你的 agent 執行時沒有這個變數,那邊的擷取不受影響。","doctor.msg.hook-activity.not-wired.summary":"從來沒有任何擷取 hook 執行過——而且這台機器上沒有確認接好任何擷取 hook(Stop / PostToolUse / PreCompact),所以本來就沒有東西可以執行。","doctor.msg.hook-activity.not-wired.fix":"想要自動擷取就執行 `memesh install-hooks`。如果這個安裝只走 MCP(Codex / Gemini),這是正常狀態,可以放心忽略。","doctor.msg.hook-activity.stop-silent.summary":"{hook} hook 有在蓋章,但從開始追蹤到現在 {hours} 小時,session-summary hook 一次都沒跑過——session 擷取可能壞了,只是被 commit 擷取蓋住看不見。","doctor.msg.hook-activity.stop-silent.fix":"完整結束一次工作階段再跑 `memesh doctor`。如果 session-summary 還是沒跑過,執行 `memesh install-hooks` 然後重啟 agent。","doctor.msg.hook-activity.never-ran-legacy.summary":"沒有任何 hook 蓋過心跳章,但追蹤開始以來已存入 {captured} 筆自動擷取的記憶——很可能是心跳追蹤之前版本的 hook 還在執行。","doctor.msg.hook-activity.never-ran-legacy.fix":"把 memesh hooks 更新到目前版本(plugin 安裝:`/plugin update memesh`;npm 安裝:`memesh install-hooks`),然後重啟 agent。","doctor.msg.node-runtime.too-old.summary":"你的 Node.js 版本比這個套件支援的還舊。{detail}","doctor.msg.node-runtime.too-old.fix":"把 Node.js 升級到 {required} 以上,再執行 `memesh doctor`。","doctor.msg.native-binding.load-failed.summary":"SQLite 無法開啟資料庫:{detail}。","doctor.msg.native-binding.load-failed.fix":"請檢查 Node 執行環境,必要時重新安裝 MeMesh。","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.shell-cli.versions.summary":"已安裝版本:此介面 {current};終端機 {terminal}。","doctor.msg.plugin-cache.stale.summary":"外掛是從 commit {installed} 安裝的,但 marketplace 已在同一版號下前進到 {marketplace}。版號沒變時 {host} 不會更新快取,所以你跑的程式碼比 marketplace 上的舊。","doctor.msg.plugin-cache.stale.fix":"執行 `{command}` 更新快取,然後重新啟動 {host}。","doctor.msg.plugin-cache.unverifiable.summary":"無法判斷安裝的外掛是否與 marketplace 一致。光看版號不夠——兩個不同的建置可以有同一個版號。","doctor.msg.plugin-cache.unverifiable.fix":"執行一次 `{command}`,它會記下 commit,之後這項檢查就能判斷。","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.config-parse.retired-settings.summary":"{path} 是有效的設定檔,但仍含有 {count} 個已停用的頂層設定({keys})。此版本會忽略它們,但舊版服務供應商憑證或設定可能仍留在磁碟上。","doctor.msg.config-parse.retired-settings.fix":"請在本機檢查 {path},只移除這些已停用的頂層鍵。檔案可能含有憑證,請勿貼到 issue。完成後再次執行 memesh doctor。","doctor.msg.message-capability.probe-failed.summary":"已安裝的訊息能力探測失敗:{detail}。","doctor.msg.message-router.socket-missing.summary":"{path} 沒有 Local router socket;不會喚醒已停止或不存在的 session。","doctor.msg.message-router.socket-insecure.summary":"{path} 的 router socket 不是僅限擁有者使用的 Unix socket。","doctor.msg.message-router.socket-unreachable.summary":"{path} 的私有 router socket 存在,但未接受本機連線。","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.citation.none.summary":"有 session 收到注入的記憶,但沒有任何一筆被引用。","doctor.msg.citation.none.fix":"檢查 ~/.claude/rules/memesh-citations.md 的引用約定,過幾個 session 後再看一次。","doctor.msg.database.broken.summary":"資料庫無法使用:{detail}","doctor.update_status.prerelease":"正在使用預發布版本({current}),npm 最新版為 {latest}","patterns.title":"你的模式","patterns.workSchedule":"工作時程","patterns.peakHours":"尖峰時段","patterns.busiestDays":"最忙碌的日子","patterns.workflow":"工作流程","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.auth.cross-origin":"這個請求來自別的網站,或是用了非預期的網址到達伺服器,所以被拒絕了。請用 `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.rate.limited":"短時間內送出太多請求。請稍候片刻再試一次。","httpError.server.internal":"伺服器發生預期外的錯誤。","time.justNow":"剛剛","time.hoursAgo":"{count} 小時前","time.today":"今天","time.yesterday":"昨天","time.daysAgo":"{count} 天前","time.lastWeek":"上週","time.weeksAgo":"{count} 週前","time.lastMonth":"上個月","time.monthsAgo":"{count} 個月前","memory.access.frequent":"常用 · {count} 次","memory.access.recalls":"{count} 次回憶","memory.access.never":"從未回憶","cluster.knowledge":"知識","cluster.activity":"活動","cluster.session":"工作記錄","cluster.reference":"參考","cluster.all":"全部","browse.filterTime":"時間","browse.filterValue":"價值","browse.filterProject":"專案","browse.filterSort":"排序","browse.timeToday":"今天","browse.timeWeek":"本週","browse.timeMonth":"本月","browse.timeOlder":"更早","browse.valueRecalled":"✓ 用過","browse.valueNever":"從未回憶","browse.sortMostRecalled":"最常回憶","browse.sortRecent":"最近使用","browse.sortCreated":"建立時間","browse.emptyFilter":"此分類沒有記憶 — 試試切換類別或時間","lessons.stepsLabel":"步驟","lessons.commitsCount":"{count} 個 commit","lessons.unstructured":"(此教訓沒有結構化欄位,請查看原始記憶)","lessons.moreItems":"+{count} 條","roadmap.title":"專案歷程","roadmap.summary":"{count} 筆記憶 · {first} → {last}","roadmap.switchToList":"↩ 清單檢視","roadmap.switchToRoadmap":"🕘 歷程檢視","roadmap.emptyProject":"此專案尚無記憶。","loop.label":"記憶循環","loop.subtitleHas":"本週被回憶的知識類型記憶","loop.subtitleNone":"本週尚無知識被回憶 — 試試喚起一則教訓","loop.approxNote":"近似值 — 完整追蹤從升級後開始累積","loop.sparkLabel":"最近 30 天","roadmap.milestones":"里程碑","roadmap.keyLessons":"重要教訓","radar.title":"知識覆蓋雷達","radar.caption":"顯示有效知識記憶 (排除 session 和 commit)","radar.axis.lessons":"教訓","radar.axis.decisions":"決策","radar.axis.patterns":"模式","radar.axis.bugs":"問題修復","radar.axis.processes":"流程","radar.axis.architecture":"架構","ageMatrix.title":"記憶年齡分佈","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"顏色深度 = 記憶密度","ageMatrix.typeColumn":"類型","header.signalModeOn":"重點記憶","header.signalModeOff":"所有記憶","header.signalModeOnHint":"顯示目標、決策、教訓與計畫;在記憶與知識圖譜隱藏自動擷取的 session、commit 與活動紀錄。","header.signalModeOffHint":"在記憶與知識圖譜顯示所有紀錄,包含自動擷取的 session、commit 與活動紀錄。","globalFilter.focusedStatus":"全域顯示:重點記憶 — 記憶與知識圖譜已隱藏自動擷取的 session、commit 與活動紀錄。","globalFilter.allStatus":"全域顯示:所有記憶 — 記憶與知識圖譜會包含自動擷取的 session、commit 與活動紀錄。","roadmap.phases":"階段","onboarding.title":"歡迎使用 MeMesh","onboarding.body":"你的記憶庫還是空的。從 30 筆精選範例開始體驗,或直接存下你的第一則教訓。","onboarding.coreHint":"本機記憶:remember、FTS5 關鍵字回憶、hooks 與儀表板瀏覽能協同運作。","onboarding.searchHint":"回憶使用本機 FTS5 關鍵字搜尋。","onboarding.reviewHint":"已在執行中的代理可準備摘要或可見對話記錄工作包;儀表板只審閱暫存提案。","onboarding.seedButton":"一鍵載入示範資料","onboarding.seedingButton":"載入中…","onboarding.seedHint":"直接在這裡載入 30 筆,之後可一鍵清除,不用切到終端機","onboarding.cliReference":"習慣 CLI?","onboarding.hintDemo":"植入 30 筆示範記憶,之後可一鍵清除","onboarding.hintReset":"移除所有 metadata.demo 標記的記憶","onboarding.resetButton":"清除示範資料","onboarding.resettingButton":"清除中…","onboarding.demoLoadedTitle":"已載入示範資料","onboarding.demoLoadedBody":"目前有 {count} 筆標記為 demo 的記憶;可在這裡只移除這些記憶。","onboarding.resetConfirm":"確定移除所有 metadata.demo 標記的記憶?無法還原相同資料列,但之後可重新載入示範資料;你的真實記憶會保留。","onboarding.resetReadbackFailed":"無法確認重設完成,因為仍有 demo 標記的記憶。清理按鈕會保留;請重試或執行 memesh doctor。","onboarding.dismiss":"關閉","common.serverError":"伺服器回報錯誤(HTTP {status})。請再試一次;若持續發生,請執行 `memesh doctor`。","emptyLibrary.title":"你的記憶庫是空的","emptyLibrary.body":"這裡還沒有任何記憶。載入 30 筆示範資料,馬上看到 MeMesh 的完整功能——之後可一鍵清除。","browse.truncated":"目前顯示前 {shown} 筆(共 {total} 筆)——用搜尋或篩選找到其餘的記憶","browse.truncatedUnknownTotal":"目前顯示前 {shown} 筆——讀不到總數,可能還有更多","graph.cappedNote":"只顯示前 {shown} 個節點(共 {total} 個,依回想次數排序),讓圖表保持流暢。","ageMatrix.bucket.week":"本週","ageMatrix.bucket.month":"本月","ageMatrix.bucket.quarter":"本季","ageMatrix.bucket.older":"更早","settings.behaviourTitle":"行為設定","settings.autoUpdateLabel":"自動更新策略","settings.autoUpdateOff":"關閉 — 僅手動","settings.autoUpdatePatch":"Patch — 自動套用 X.Y.Z+1","settings.autoUpdateMinor":"Minor — 自動套用 X.Y+1.0","settings.autoUpdateMajor":"Major — 自動套用任何版本升級","settings.autoUpdateHint":"在支援的安裝管道,首次使用時每個 session 只詢問一次同意;其他管道會顯示對應的更新方式。MEMESH_AUTO_UPDATE 只設定允許的升級幅度,不會繞過同意。","errors.timeout":"請求逾時","type.lesson_learned":"教訓","type.lesson":"教訓","type.mistake":"錯誤","type.decision":"決策","type.goal":"目標","type.architecture_decision":"架構決策","type.design_decision":"設計決策","type.pattern":"模式","type.technical_pattern":"技術模式","type.best_practice":"最佳實踐","type.bug_fix":"問題修復","type.verification_result":"驗證結果","type.test_result":"測試結果","type.process":"流程","type.architecture":"架構","type.infrastructure":"基礎設施","type.feature":"功能","type.release":"版本發佈","type.refactoring":"重構","type.commit":"提交","type.session_keypoint":"工作階段重點","type.session_identity":"工作階段身分","type.session-insight":"工作階段洞察","type.session-summary":"工作階段摘要","type.session-identity":"工作階段身分","type.weekly_summary":"週摘要","type.weekly-summary":"週摘要","type.note":"筆記","type.plan":"計畫","type.knowledge":"知識","type.workflow_checkpoint":"流程里程碑","type.concept":"概念","type.tool":"工具","type.person":"人物","relation.relates_to":"相關","relation.related-to":"相關","relation.depends_on":"依賴","relation.implements":"實作","relation.learned_from":"學習自","relation.supersedes":"取代","relation.contradicts":"矛盾","relation.follows":"接續","relation.belongs-to-project":"屬於專案","relation.evidences":"證據","relation.co-created":"共同建立","relation.shares-name-tokens":"名稱相似","patterns.day.0":"週日","patterns.day.1":"週一","patterns.day.2":"週二","patterns.day.3":"週三","patterns.day.4":"週四","patterns.day.5":"週五","patterns.day.6":"週六","lessons.severity.critical":"嚴重","lessons.severity.major":"重大","lessons.severity.minor":"輕微","memory.tooltip.project":"專案","memory.tooltip.recalled":"已被回憶 {count} 次","memory.tooltip.hasRelations":"與 {count} 筆記憶相連","memory.tooltip.createdAt":"建立於 {date}","graph.layerLabel":"圖層","graph.layerWork":"工作","graph.layerAll":"全部","graph.layerWorkHint":"已儲存的決策、教訓與計畫,以及其記錄的連結。","graph.layerAllHint":"所有已儲存的記憶及其記錄的連結。連結可能由代理或維護規則加入;此檢視不會呼叫語言模型。","graph.layerFellBack":"目前工作項目不到 {min} 筆,改顯示完整圖譜。記下決策與教訓後,這個檢視就會長出來。","graph.evidenceFor":"{node} 的證據","graph.evidenceClose":"關閉","graph.evidenceLoading":"載入證據中…","graph.evidenceFailed":"無法載入這個項目的證據。","graph.evidenceEmpty":"這個項目還沒有連上證據。執行 `memesh kg backfill` 可從 commit 與 session 捕捉建立連結。","graph.evidenceTruncated":"顯示最近 {shown} 筆,還有更多。","graph.drift":"時效","graph.driftHint":"依新舊上色:紅=久未使用,綠=最近使用","common.unknown":"未知","insights.entitiesCount":"{n} 筆實體","roadmap.viewToggle":"專案歷程檢視","roadmap.viewTree":"樹狀","roadmap.viewMindmap":"心智圖","roadmap.mindmapNeedsPhases":"心智圖需要 7 天內至少 3 筆記憶。","roadmap.activePhase":"進行中","roadmap.entryCount":"{count} 筆","roadmap.entriesCount":"{count} 筆","roadmap.otherGroup":"其他({count})","roadmap.lowSignalHidden":"(已隱藏 {count} 筆低訊號)","roadmap.resetHint":"重設縮放與位置(雙擊背景也可重設)","roadmap.zoomHint":"滾輪縮放 · 拖曳平移 · {pct}%","roadmap.moreEntities":"還有 {count} 筆","roadmap.viewDecisions":"決策","roadmap.densityTitle":"依類別的捕捉密度","roadmap.densityNote":"這是 memesh 捕捉到的,不等於發生過的一切","roadmap.lineageSupersedes":"{n} 筆已被取代","roadmap.lineageConflicts":"{n} 筆衝突未解","adr.empty":"這個專案還沒有記錄任何決策。用類型「decision」記下一筆,它就會帶著自己的歷史出現在這裡。","adr.statusActive":"現行","adr.statusSuperseded":"已被取代","adr.supersedes":"取代","adr.supersededBy":"被取代","nav.ariaLabel":"儀表板分頁","feedback.descLabel":"意見內容","graph.canvasA11y":"知識圖譜(畫布繪製):{entities} 個實體、{relations} 條關係、{orphans} 個未連結。上方的類型篩選與搜尋提供非視覺瀏覽方式。"},"zh-CN":{"auth.title":"需要验证","auth.intro":"此仪表板受 bearer token 保护。请在下方粘贴 MEMESH_REMOTE_TOKEN 的值(或 <memeshDir>/remote-token 文件的内容)。","auth.tokenLabel":"Token","auth.empty":"Token 不能为空。","auth.invalid":"这个令牌未被接受,请检查后重试。","auth.submit":"解锁仪表板","auth.tokenPlaceholder":"在这里粘贴 token","brand.subtitle":"powered by pcircle.com","header.connected":"已连接","header.disconnected":"已断开","header.connecting":"连接中…","header.memories":"条记忆","insights.title":"记忆整理建议","insights.reviewTitle":"已暂存的记忆提案","insights.reviewSubtitle":"等待人工审核的工作包","insights.reviewSource":"已暂存提案——应用前请先审核","insights.source.calendar":"日历摘要","insights.source.transcript":"Claude Code 对话记录","insights.reviewBoundary":"仪表板只审核已暂存的提案,不会运行或派发代理。","insights.statPending":"待审","insights.statApplied":"已采用","insights.statRejected":"已拒绝","insights.filter.pending":"待审","insights.filter.applied":"已采用","insights.filter.rejected":"已拒绝","insights.filter.all":"全部","insights.refresh":"刷新","insights.loading":"读取中…","insights.emptyOther":"没有数据。","insights.sources":"来源","insights.status.pending":"待审","insights.status.applied":"已采用","insights.status.rejected":"已拒绝","insights.viewDetail":"查看详情","insights.collapse":"收起","insights.accept":"采用","insights.applying":"应用中…","insights.reject":"拒绝","insights.rejectConfirm":"要拒绝这条洞察吗?此操作无法撤销。","insights.observations":"摘要观察","insights.tags":"标签","insights.sourceIds":"来源实体","insights.validationWarnings":"旧版验证警告","insights.validationClaim":"陈述","insights.validationReason":"原因","banner.pendingInsights":"有 {n} 则新洞察等你审阅 →","banner.dismiss":"关闭","banner.viewAll":"查看全部","pattern.title":"模式","pattern.evidenceCount":"{n} 个证据","pattern.severity":"严重度","pattern.severity.high":"高","pattern.severity.medium":"中","pattern.severity.low":"低","pattern.description":"模式说明","tab.graph":"知识图谱","tab.settings":"设置","tab.home":"首页","tab.memories":"记忆","tab.project":"项目","memories.searchPlaceholder":"输入即时筛选 — 按 Enter 进行相关度排序搜索","memories.scopeLabel":"范围","memories.scopeWork":"工作层","memories.scopeEvidence":"证据","memories.scopeAll":"全部","memories.scopeArchived":"已归档","memories.composition":"构成","memories.rankedBy":"按相关度排序","memories.backToList":"返回列表","memories.workEmpty":"还没有工作层记忆 — 目标、决策、教训和计划被记录后会出现在这里。","memories.showAll":"显示所有记忆","memories.expand":"显示详情","memories.collapse":"隐藏详情","memory.technicalDetails":"技术详情","memory.canonicalName":"标准名称","memory.rawType":"原始类型","home.analyticsTitle":"分析","handoff.terminal":"需要使用终端","handoff.terminalPrereq":"请在安装 MeMesh 的电脑上运行;仪表板不会替你执行该命令。","handoff.copyCommand":"复制命令","handoff.commandCopied":"命令已复制","handoff.github":"将打开 GitHub — 提交前请检查预填内容","home.analyticsHint":"健康度、时间线、模式与使用情况 — 需要时再展开","home.nextAction.eyebrow":"建议下一步","home.nextAction.why":"原因:","home.nextAction.result":"预期结果:","home.nextAction.loading.title":"正在确认目前最需要处理的事项…","home.nextAction.loading.why":"MeMesh 正在读取记忆库、搜索索引和待审核列表的当前状态。","home.nextAction.loading.result":"检查完成后,此处只会显示一项建议。","home.nextAction.empty.title":"添加第一条记忆","home.nextAction.empty.why":"记忆库目前为空,因此还没有内容可供搜索或整理。","home.nextAction.empty.result":"前往“记忆”可加载随时能移除的演示数据,或开始记录真实工作。","home.nextAction.empty.action":"打开记忆","insights.emptyPending":"目前没有待审的整理结果。有新的记忆整理结果时,会显示在这里。","home.nextAction.insights.title":"审核记忆整理建议","home.nextAction.insights.why":"MeMesh 有等待你判断的整理建议。","home.nextAction.insights.result":"你可以接受有用的摘要,或拒绝不合适的建议。","home.nextAction.insights.action":"审核建议","home.nextAction.healthy.title":"目前无需操作","home.nextAction.healthy.why":"记忆库、搜索索引和待审核列表目前都没有已知待办。","home.nextAction.healthy.result":"继续工作即可;MeMesh 会在此显示下一个经状态确认的需求。","home.nextAction.unavailable.title":"目前无法提供建议","home.nextAction.unavailable.why":"有一项状态检查无法读取,因此 MeMesh 不会猜测。","home.nextAction.unavailable.result":"重新加载可再次检查,且不会更改任何记忆或设置。","home.nextAction.unavailable.action":"重试状态检查","project.selectLabel":"项目","project.selectPrompt":"选择一个项目即可查看它的历程。","project.empty":"还没有项目记忆。在装有 memesh hook 的 git 仓库中工作,它的故事就会出现在这里。","guard.sourceLesson":"来源教训","guard.pattern":"触发模式","guard.message":"将发出的警告","guard.shouldMatch":"必须触发于","guard.shouldNotMatch":"必须静默于","search.button":"搜索","search.searching":"搜索中…","search.results":"个结果","search.result":"个结果","search.noResults":"没有找到结果:","search.facts":"条事实","browse.title":"所有记忆","browse.active":"活跃","browse.archived":"已归档","browse.refresh":"刷新","browse.noMatch":"没有匹配的记忆:","browse.prev":"← 上一页","browse.next":"下一页 →","browse.archive":"归档","browse.restore":"恢复","browse.confirmArchive":"确定要归档此记忆?","browse.archiveFailed":"归档失败:{message}","browse.restoreFailed":"恢复失败:{message}","analytics.totalMemories":"记忆总数","analytics.knowledgeFacts":"知识事实","analytics.connections":"关联","analytics.topics":"主题","analytics.insights":"洞察","analytics.thisWeek":"本周","analytics.new":"条新增","analytics.stale":"闲置(30 天以上未使用)","analytics.archivedLabel":"已归档","analytics.mostRecalled":"最常查阅","health.title":"记忆健康度","metrics.notMeasured":"尚未测量","metrics.health":"健康度","metrics.healthNote":"活跃度、质量、新鲜度、教训","metrics.critical":"严重教训","metrics.criticalPartial":"在 {tagged} 条已分类中 · 共 {total} 条教训","metrics.criticalAll":"共 {total} 条教训,全部已分类","metrics.criticalUnclassified":"{total} 条教训,尚未按严重度分类","metrics.criticalNoLessons":"尚未记录任何教训","metrics.citation":"引用率","metrics.citationNote":"{total} 次会话中有 {cited} 次引用了记忆","metrics.citationNotMeasured":"引用追踪将从下次会话开始计算","metrics.reused":"本周被重用","metrics.reusedNote":"近似值——以最后访问时间推估","health.excellent":"优秀","health.good":"良好","health.fair":"一般","health.poor":"较差","health.activity":"活跃度","health.quality":"质量","health.freshness":"新鲜度","health.lessons":"自我改善","timeline.title":"最近 30 天","timeline.created":"新增","timeline.recalled":"召回","value.totalRecalls":"总召回次数","value.lessonsLearned":"经验教训","value.lessonsSaved":"已应用教训","value.coverage":"知识覆盖率","cleanup.title":"清理建议","cleanup.allClean":"记忆库很干净,没有检测到过时或重复的实体。","cleanup.staleLabel":"低置信度 / 未使用","cleanup.duplicateLabel":"可能重复","cleanup.confidence":"置信度","cleanup.unused":"未使用","cleanup.entityMeta":"{type} · 置信度 {confidence}% · 已闲置 {days} 天","settings.saved":"已保存","settings.configReadbackFailed":"服务器未返回已保存的设置,请重试。","settings.language":"语言","settings.interfaceLanguage":"界面语言","settings.interfaceLanguageHint":"立即更改此浏览器中的界面语言。","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.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 时所用的工具或流程来更新这个安装。","settings.installationDetails":"安装详情","settings.installationDetailsUnavailable":"此安装无法比较版本。","settings.interfacePath":"此界面","settings.terminalPath":"终端命令","settings.technicalDetails":"技术详情","settings.installationDetailsHint":"不同的已安装版本不一定需要更新。请到“更新”查看已发布版本。","graph.entities":"实体","graph.relations":"关联","graph.orphans":"孤立节点","graph.search":"搜索节点…","graph.matches":"个匹配","graph.enterToOpen":"按 Enter 打开","graph.focusMode":"聚焦","graph.showAll":"显示全部","graph.clickHint":"点击节点以聚焦","graph.interactHint":"点击节点聚焦 · 拖动空白处平移 · 滚轮缩放","graph.resetView":"重置视图","graph.resetViewHint":"重置缩放与位置","graph.ageToday":"今天","graph.ageDaysAgo":"{count} 天前","graph.ageWeeksAgo":"{count} 周前","lessons.error":"错误","lessons.rootCause":"根本原因","lessons.fix":"修复方式","lessons.prevention":"预防措施","feedback.button":"💬 反馈","feedback.title":"在 GitHub 打开反馈","feedback.bug":"错误","feedback.feature":"功能建议","feedback.question":"问题","feedback.placeholder":"描述你的反馈…","feedback.includeSys":"附带系统信息","feedback.submit":"打开 GitHub Issue","feedback.submitting":"收集诊断信息中…","feedback.popupBlocked":"GitHub 未打开。草稿仍完整保留;请允许弹出窗口、重试或复制已准备的链接。","feedback.retry":"再次尝试打开 GitHub","feedback.copyLink":"复制 GitHub 链接","feedback.linkCopied":"链接已复制","feedback.copyFailed":"无法复制链接,请再次尝试打开 GitHub。","doctorBanner.warnTitleSoft":"memesh 有几条设置提醒","doctorBanner.failTitle":"memesh 设置不完整","doctorBanner.dismiss":"关闭","doctorBanner.getHelp":"获取帮助","doctorBanner.helpHint":"会打开一个已填好诊断信息的 GitHub issue","doctorBanner.preambleForIssue":"memesh doctor 在我的安装上报告以下情况:","doctorBanner.moreCount":"…还有 {n} 条——运行 `memesh doctor` 看完整清单","doctorBanner.fix":"自动修复","doctorBanner.fixInProgress":"修复中…","doctorBanner.fixDone":"已修复","doctorBanner.restartRequired":"请重新启动代理,完成这次更新。","doctor.label.readme_locale_parity":"README 翻译同步","doctor.label.config":"配置文件","doctor.label.mcp-config":"MCP 连接配置文件","doctor.label.hooks-config":"Hook 定义文件","doctor.label.hook-scripts":"Hook 脚本","doctor.label.hook-wiring":"与 Claude Code 的连接","doctor.label.hook-activity":"自动记录","doctor.label.node-runtime":"Node.js 版本","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"插件代码是否最新","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.install-channel":"安装方式","doctor.label.fts_segmentation":"关键字索引","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 的文件(.claude-plugin/mcp.json)不见了。","doctor.msg.mcp-config.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/mcp.json 已损坏(不是有效的 JSON),Claude Code 读不到它。","doctor.msg.mcp-config.invalid-json.fix":"修好 {path},或重新安装 MeMesh。","doctor.msg.mcp-config.no-entry.summary":".claude-plugin/mcp.json 里的 memesh 服务器配置不见了。","doctor.msg.mcp-config.no-entry.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` 要启动的文件不在这份安装里,所以 Claude Code 里的每个 memesh 工具都起不来。","doctor.msg.mcp-config.entry-missing.fix":"重新安装 MeMesh。如果你手动改过 `.claude-plugin/mcp.json`,把它指回 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`。","doctor.msg.mcp-config.placeholder-unresolved.summary":"尚未验证:`.claude-plugin/mcp.json` 要启动的路径含有 `${CLAUDE_PLUGIN_ROOT}`,而这个变量只有 Claude Code 的插件运行环境会替换。这份安装不是以插件方式运行的,所以它指向的文件没有被检查。","doctor.msg.mcp-config.placeholder-unresolved.fix":"用插件运行环境的方式检查:运行 `CLAUDE_PLUGIN_ROOT=<这份安装的目录> memesh doctor`。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json 不见了,自动记忆功能无法运行。","doctor.msg.hooks-config.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json 已损坏(不是有效的 JSON)。","doctor.msg.hooks-config.invalid-json.fix":"修好 {path},或重新安装 MeMesh。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json 少了这些 hook 类型:{types}。部分自动记录不会运行。","doctor.msg.hooks-config.missing-types.fix":"恢复出厂的 hook 配置,或重新安装 MeMesh。","doctor.msg.hook-scripts.none.summary":"Hook 配置里没有任何脚本,什么都不会被自动记录。","doctor.msg.hook-scripts.none.fix":"重新安装 MeMesh。","doctor.msg.hook-scripts.missing.summary":"这些 hook 脚本不见了:{files}","doctor.msg.hook-scripts.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.hook-scripts.not-executable.summary":"这些 hook 脚本存在但没有执行权限:{files}","doctor.msg.hook-scripts.not-executable.fix":"运行 `chmod +x scripts/hooks/*.js`;源码安装则跑 `npm run build`。","doctor.msg.hook-wiring.no-marker.summary":"memesh 还没接入 Claude Code,所以不会自动记住任何东西。","doctor.msg.hook-wiring.no-marker.fix":"运行一次 `memesh install-hooks` 完成连接,再用 `memesh doctor` 确认。","doctor.msg.hook-wiring.script-missing.summary":"已接线的 memesh hook 指向 {path},但这个文件已不存在——agent 每次触发对应事件都会调用一个不存在的文件。通常是升级移除某个 hook 后留下的残留。","doctor.msg.hook-wiring.script-missing.fix":"运行 `memesh install-hooks` 重新接线(它会移除已退役的条目),然后重启你的 agent。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} 的连接记录读不到。","doctor.msg.hook-wiring.marker-unreadable.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.marker-malformed.summary":"连接记录已损坏。","doctor.msg.hook-wiring.marker-malformed.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 的设置文件({path})不见了,连接已中断。","doctor.msg.hook-wiring.settings-missing.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} 已损坏(不是有效的 JSON)。","doctor.msg.hook-wiring.settings-invalid.fix":"从备份恢复,或用 `memesh install-hooks` 重建。","doctor.msg.hook-wiring.entries-removed.summary":"{path} 里的 memesh 配置被移除了,连接已中断。","doctor.msg.hook-wiring.entries-removed.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.root-moved.summary":"连接指向的 {path} 已不存在(memesh 可能被移动了)。","doctor.msg.hook-wiring.root-moved.fix":"运行 `memesh install-hooks` 更新路径。","doctor.msg.hook-activity.never-ran.summary":"从开始追踪到现在 {hours} 小时,没有任何抓取 hook 跑过——而 hook 接线是好的,代表它们该跑却没跑,没有任何东西被记下来。","doctor.msg.hook-activity.never-ran.fix":"完整用一次工作会话,再跑 `memesh doctor`。如果还是说没有 hook 跑过,执行 `memesh install-hooks` 然后重启 agent。","doctor.msg.hook-activity.stale.summary":"最后一次抓取 hook 是大约 {hours} 小时前跑的({hook})。如果你这段时间有在工作,代表抓取已经停了,那些会话的内容都没被存下来。","doctor.msg.hook-activity.stale.fix":"重启 agent,结束一次工作会话,再跑 `memesh doctor`。如果没恢复,执行 `memesh install-hooks`。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary hook 上次运行大约在 {hours} 小时前,而且过去 3 天也没有任何 Claude Code 的写入。如果这台机器已改用其他 agent(Codex / Gemini),这是正常的;如果你在这里仍使用 Claude Code,捕获已经停了。","doctor.msg.hook-activity.stale-unconfirmed.fix":"如果这台机器仍在使用 Claude Code:重启它、结束一个 session,再运行一次 `memesh doctor`。若仍未恢复,运行 `memesh install-hooks`。","doctor.msg.hook-activity.query-failed.summary":"读不到 hook 活动记录:{detail}。抓取状态现在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.query-failed.fix":"用 `memesh doctor --verbose` 看完整错误,并确认 ~/.memesh 读得到、磁盘没满。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} hook 的最后执行时间读不出来(数据坏了,或是被时钟不准的机器盖的章)。抓取状态现在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.stale-unknown.fix":"结束一次工作会话后再跑 `memesh doctor`——新的一次执行会把坏掉的时间盖掉。","doctor.msg.hook-activity.disabled.summary":"自动抓取已关闭(MEMESH_AUTO_CAPTURE 或配置文件的 autoCapture)——这是刻意设置,hook 没动静是预期中的。想恢复抓取就把它打开。","doctor.msg.hook-activity.disabled-env.summary":"自动捕获被这个 shell 环境中的 MEMESH_AUTO_CAPTURE=false 关闭了。doctor 只能看到自己所在的环境——如果你的 agent 运行时没有这个变量,那边的捕获不受影响。","doctor.msg.hook-activity.not-wired.summary":"从来没有任何捕获 hook 运行过——而且这台机器上没有确认接好任何捕获 hook(Stop / PostToolUse / PreCompact),所以本来就没有东西可以运行。","doctor.msg.hook-activity.not-wired.fix":"想要自动抓取就执行 `memesh install-hooks`。如果这个安装只走 MCP(Codex / Gemini),这是正常状态,可以放心忽略。","doctor.msg.hook-activity.stop-silent.summary":"{hook} hook 有在盖章,但从开始追踪到现在 {hours} 小时,session-summary hook 一次都没跑过——session 抓取可能坏了,只是被 commit 抓取盖住看不见。","doctor.msg.hook-activity.stop-silent.fix":"完整结束一次工作会话再跑 `memesh doctor`。如果 session-summary 还是没跑过,执行 `memesh install-hooks` 然后重启 agent。","doctor.msg.hook-activity.never-ran-legacy.summary":"没有任何 hook 盖过心跳章,但追踪开始以来已存入 {captured} 条自动捕获的记忆——很可能是心跳追踪之前版本的 hook 还在运行。","doctor.msg.hook-activity.never-ran-legacy.fix":"把 memesh hooks 更新到当前版本(plugin 安装:`/plugin update memesh`;npm 安装:`memesh install-hooks`),然后重启 agent。","doctor.msg.node-runtime.too-old.summary":"你的 Node.js 版本比这个包支持的还旧。{detail}","doctor.msg.node-runtime.too-old.fix":"把 Node.js 升级到 {required} 以上,再运行 `memesh doctor`。","doctor.msg.native-binding.load-failed.summary":"SQLite 无法打开数据库:{detail}。","doctor.msg.native-binding.load-failed.fix":"请检查 Node 运行环境,必要时重新安装 MeMesh。","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.shell-cli.versions.summary":"已安装版本:此界面 {current};终端 {terminal}。","doctor.msg.plugin-cache.stale.summary":"插件是从 commit {installed} 安装的,但 marketplace 已在同一版本号下前进到 {marketplace}。版本号没变时 {host} 不会刷新缓存,所以你运行的代码比 marketplace 上的旧。","doctor.msg.plugin-cache.stale.fix":"运行 `{command}` 刷新缓存,然后重启 {host}。","doctor.msg.plugin-cache.unverifiable.summary":"无法判断已安装的插件是否与 marketplace 一致。只看版本号不够——两个不同的构建可以有同一个版本号。","doctor.msg.plugin-cache.unverifiable.fix":"运行一次 `{command}`,它会记录 commit,之后这项检查就能判断。","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.config-parse.retired-settings.summary":"{path} 是有效的配置文件,但仍包含 {count} 个已停用的顶层设置({keys})。此版本会忽略它们,但旧版服务提供商凭据或设置可能仍留在磁盘上。","doctor.msg.config-parse.retired-settings.fix":"请在本地检查 {path},只删除这些已停用的顶层键。文件可能包含凭据,请勿粘贴到 issue。完成后再次运行 memesh doctor。","doctor.msg.message-capability.probe-failed.summary":"已安装的消息能力探测失败:{detail}。","doctor.msg.message-router.socket-missing.summary":"{path} 没有 Local router socket;不会唤醒已停止或不存在的 session。","doctor.msg.message-router.socket-insecure.summary":"{path} 的 router socket 不是仅限所有者使用的 Unix socket。","doctor.msg.message-router.socket-unreachable.summary":"{path} 的私有 router socket 存在,但未接受本地连接。","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.citation.none.summary":"有 session 收到注入的记忆,但没有任何一笔被引用。","doctor.msg.citation.none.fix":"检查 ~/.claude/rules/memesh-citations.md 的引用约定,过几个 session 后再看一次。","doctor.msg.database.broken.summary":"数据库无法使用:{detail}","doctor.update_status.prerelease":"正在运行预发布版本({current}),npm 最新版为 {latest}","patterns.title":"你的模式","patterns.workSchedule":"工作时程","patterns.peakHours":"高峰时段","patterns.busiestDays":"最忙碌的日子","patterns.workflow":"工作流程","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.auth.cross-origin":"这个请求来自别的网站,或者用了非预期的网址到达服务器,所以被拒绝了。请用 `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.rate.limited":"短时间内发送的请求过多。请稍候片刻再试一次。","httpError.server.internal":"服务器发生意外错误。","time.justNow":"刚刚","time.hoursAgo":"{count} 小时前","time.today":"今天","time.yesterday":"昨天","time.daysAgo":"{count} 天前","time.lastWeek":"上周","time.weeksAgo":"{count} 周前","time.lastMonth":"上个月","time.monthsAgo":"{count} 个月前","memory.access.frequent":"常用 · {count} 次","memory.access.recalls":"{count} 次回忆","memory.access.never":"从未回忆","cluster.knowledge":"知识","cluster.activity":"活动","cluster.session":"工作记录","cluster.reference":"参考","cluster.all":"全部","browse.filterTime":"时间","browse.filterValue":"价值","browse.filterProject":"项目","browse.filterSort":"排序","browse.timeToday":"今天","browse.timeWeek":"本周","browse.timeMonth":"本月","browse.timeOlder":"更早","browse.valueRecalled":"✓ 用过","browse.valueNever":"从未回忆","browse.sortMostRecalled":"最常回忆","browse.sortRecent":"最近使用","browse.sortCreated":"创建时间","browse.emptyFilter":"此分类没有记忆 — 试试切换类别或时间","lessons.stepsLabel":"步骤","lessons.commitsCount":"{count} 个 commit","lessons.unstructured":"(此教训没有结构化字段,请查看原始记忆)","lessons.moreItems":"+{count} 条","roadmap.title":"项目历程","roadmap.summary":"{count} 条记忆 · {first} → {last}","roadmap.switchToList":"↩ 列表视图","roadmap.switchToRoadmap":"🕘 历程视图","roadmap.emptyProject":"此项目尚无记忆。","loop.label":"记忆循环","loop.subtitleHas":"本周被回忆的知识类型记忆","loop.subtitleNone":"本周尚无知识被回忆 — 试试唤起一则教训","loop.approxNote":"近似值 — 完整追踪从升级后开始累积","loop.sparkLabel":"最近 30 天","roadmap.milestones":"里程碑","roadmap.keyLessons":"重要教训","radar.title":"知识覆盖雷达","radar.caption":"显示有效知识记忆 (排除 session 和 commit)","radar.axis.lessons":"教训","radar.axis.decisions":"决策","radar.axis.patterns":"模式","radar.axis.bugs":"问题修复","radar.axis.processes":"流程","radar.axis.architecture":"架构","ageMatrix.title":"记忆年龄分布","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"颜色深度 = 记忆密度","ageMatrix.typeColumn":"类型","header.signalModeOn":"重点记忆","header.signalModeOff":"所有记忆","header.signalModeOnHint":"显示目标、决策、教训与计划;在记忆和知识图谱中隐藏自动捕获的 session、commit 与活动记录。","header.signalModeOffHint":"在记忆和知识图谱中显示所有记录,包括自动捕获的 session、commit 与活动记录。","globalFilter.focusedStatus":"全局显示:重点记忆 — 记忆和知识图谱已隐藏自动捕获的 session、commit 与活动记录。","globalFilter.allStatus":"全局显示:所有记忆 — 记忆和知识图谱会包含自动捕获的 session、commit 与活动记录。","roadmap.phases":"阶段","onboarding.title":"欢迎使用 MeMesh","onboarding.body":"你的记忆库还是空的。从 30 条精选示例开始体验,或直接存下你的第一则教训。","onboarding.coreHint":"本地记忆:remember、FTS5 关键词回忆、hooks 与仪表板浏览可协同运行。","onboarding.searchHint":"回忆使用本地 FTS5 关键词搜索。","onboarding.reviewHint":"已在运行的代理可准备摘要或可见对话记录工作包;仪表板只审核暂存提案。","onboarding.seedButton":"一键载入示范数据","onboarding.seedingButton":"载入中…","onboarding.seedHint":"直接在这里载入 30 条,之后可一键清除,不用切到终端","onboarding.cliReference":"习惯 CLI?","onboarding.hintDemo":"植入 30 条示范记忆,之后可一键清除","onboarding.hintReset":"移除所有 metadata.demo 标记的记忆","onboarding.resetButton":"清除示范数据","onboarding.resettingButton":"清除中…","onboarding.demoLoadedTitle":"已加载示范数据","onboarding.demoLoadedBody":"目前有 {count} 条标记为 demo 的记忆;可在这里仅移除这些记忆。","onboarding.resetConfirm":"确定移除所有带 metadata.demo 标记的记忆?无法还原相同数据行,但之后可重新加载示范数据;你的真实记忆会保留。","onboarding.resetReadbackFailed":"无法确认重置完成,因为仍有 demo 标记的记忆。清理按钮会保留;请重试或运行 memesh doctor。","onboarding.dismiss":"关闭","common.serverError":"服务器报告错误(HTTP {status})。请再试一次;若持续发生,请运行 `memesh doctor`。","emptyLibrary.title":"你的记忆库是空的","emptyLibrary.body":"这里还没有任何记忆。载入 30 条示范数据,马上看到 MeMesh 的完整功能——之后可一键清除。","browse.truncated":"当前显示前 {shown} 条(共 {total} 条)——用搜索或筛选找到其余的记忆","browse.truncatedUnknownTotal":"当前显示前 {shown} 条——读不到总数,可能还有更多","graph.cappedNote":"只显示前 {shown} 个节点(共 {total} 个,按回想次数排序),让图表保持流畅。","ageMatrix.bucket.week":"本周","ageMatrix.bucket.month":"本月","ageMatrix.bucket.quarter":"本季","ageMatrix.bucket.older":"更早","settings.behaviourTitle":"行为设置","settings.autoUpdateLabel":"自动更新策略","settings.autoUpdateOff":"关闭 — 仅手动","settings.autoUpdatePatch":"Patch — 自动应用 X.Y.Z+1","settings.autoUpdateMinor":"Minor — 自动应用 X.Y+1.0","settings.autoUpdateMajor":"Major — 自动应用任何版本升级","settings.autoUpdateHint":"首次使用时每个 session 只询问一次同意。MEMESH_AUTO_UPDATE 只设定允许的升级幅度,不会绕过同意。","errors.timeout":"请求超时","type.lesson_learned":"教训","type.lesson":"教训","type.mistake":"错误","type.decision":"决策","type.goal":"目标","type.architecture_decision":"架构决策","type.design_decision":"设计决策","type.pattern":"模式","type.technical_pattern":"技术模式","type.best_practice":"最佳实践","type.bug_fix":"问题修复","type.verification_result":"验证结果","type.test_result":"测试结果","type.process":"流程","type.architecture":"架构","type.infrastructure":"基础设施","type.feature":"功能","type.release":"版本发布","type.refactoring":"重构","type.commit":"提交","type.session_keypoint":"会话要点","type.session_identity":"会话身份","type.session-insight":"会话洞察","type.session-summary":"会话摘要","type.session-identity":"会话身份","type.weekly_summary":"周摘要","type.weekly-summary":"周摘要","type.note":"笔记","type.plan":"计划","type.knowledge":"知识","type.workflow_checkpoint":"流程里程碑","type.concept":"概念","type.tool":"工具","type.person":"人物","relation.relates_to":"相关","relation.related-to":"相关","relation.depends_on":"依赖","relation.implements":"实现","relation.learned_from":"学习自","relation.supersedes":"取代","relation.contradicts":"矛盾","relation.follows":"接续","relation.belongs-to-project":"属于项目","relation.evidences":"证据","relation.co-created":"共同创建","relation.shares-name-tokens":"名称相似","patterns.day.0":"周日","patterns.day.1":"周一","patterns.day.2":"周二","patterns.day.3":"周三","patterns.day.4":"周四","patterns.day.5":"周五","patterns.day.6":"周六","lessons.severity.critical":"严重","lessons.severity.major":"重大","lessons.severity.minor":"轻微","memory.tooltip.project":"项目","memory.tooltip.recalled":"已被回忆 {count} 次","memory.tooltip.hasRelations":"与 {count} 条记忆相连","memory.tooltip.createdAt":"创建于 {date}","graph.layerLabel":"图层","graph.layerWork":"工作","graph.layerAll":"全部","graph.layerWorkHint":"已保存的决策、教训与计划,以及其记录的链接。","graph.layerAllHint":"所有已保存的记忆及其记录的链接。链接可能由代理或维护规则加入;此视图不会调用语言模型。","graph.layerFellBack":"目前工作项目不到 {min} 条,改显示完整图谱。记下决策与教训后,这个视图就会长出来。","graph.evidenceFor":"{node} 的证据","graph.evidenceClose":"关闭","graph.evidenceLoading":"正在加载证据…","graph.evidenceFailed":"无法加载这个项目的证据。","graph.evidenceEmpty":"这个项目还没有连上证据。运行 `memesh kg backfill` 可从 commit 与 session 捕捉建立连结。","graph.evidenceTruncated":"显示最近 {shown} 条,还有更多。","graph.drift":"时效","graph.driftHint":"按新旧上色:红=久未使用,绿=最近使用","common.unknown":"未知","insights.entitiesCount":"{n} 个实体","roadmap.viewToggle":"项目历程视图","roadmap.viewTree":"树状","roadmap.viewMindmap":"思维导图","roadmap.mindmapNeedsPhases":"思维导图需要 7 天内至少 3 条记忆。","roadmap.activePhase":"进行中","roadmap.entryCount":"{count} 条","roadmap.entriesCount":"{count} 条","roadmap.otherGroup":"其他({count})","roadmap.lowSignalHidden":"(已隐藏 {count} 条低信号)","roadmap.resetHint":"重置缩放与位置(双击背景也可重置)","roadmap.zoomHint":"滚轮缩放 · 拖动平移 · {pct}%","roadmap.moreEntities":"还有 {count} 条","roadmap.viewDecisions":"决策","roadmap.densityTitle":"按类别的捕捉密度","roadmap.densityNote":"这是 memesh 捕捉到的,不等于发生过的一切","roadmap.lineageSupersedes":"{n} 条已被取代","roadmap.lineageConflicts":"{n} 条冲突未解决","adr.empty":"这个项目还没有记录任何决策。用类型「decision」记下一条,它就会带着自己的历史出现在这里。","adr.statusActive":"现行","adr.statusSuperseded":"已被取代","adr.supersedes":"取代","adr.supersededBy":"被取代","nav.ariaLabel":"仪表板分页","feedback.descLabel":"反馈内容","graph.canvasA11y":"知识图谱(画布绘制):{entities} 个实体、{relations} 条关系、{orphans} 个未连接。上方的类型筛选与搜索提供非视觉浏览方式。"},ja:{"auth.title":"認証が必要です","auth.intro":"このダッシュボードは bearer トークンで保護されています。MEMESH_REMOTE_TOKEN の値(または <memeshDir>/remote-token の内容)を下に貼り付けてください。","auth.tokenLabel":"トークン","auth.empty":"トークンを入力してください。","auth.invalid":"このトークンは受け付けられませんでした。確認してもう一度お試しください。","auth.submit":"ダッシュボードのロックを解除","auth.tokenPlaceholder":"ここにトークンを貼り付け","brand.subtitle":"powered by pcircle.com","header.connected":"接続中","header.disconnected":"切断","header.connecting":"接続しています…","header.memories":"件のメモリ","insights.title":"メモリ整理の提案","insights.reviewTitle":"ステージ済みメモリ提案","insights.reviewSubtitle":"人のレビューを待つ作業パッケージ","insights.reviewSource":"ステージ済み提案 — 適用前にレビューしてください","insights.source.calendar":"カレンダーダイジェスト","insights.source.transcript":"Claude Code トランスクリプト","insights.reviewBoundary":"ダッシュボードはステージ済み提案のみレビューします。エージェントの実行や派遣はしません。","insights.statPending":"保留中","insights.statApplied":"適用済み","insights.statRejected":"却下済み","insights.filter.pending":"保留中","insights.filter.applied":"適用済み","insights.filter.rejected":"却下済み","insights.filter.all":"すべて","insights.refresh":"更新","insights.loading":"読み込み中…","insights.emptyOther":"データがありません。","insights.sources":"ソース","insights.status.pending":"保留中","insights.status.applied":"適用済み","insights.status.rejected":"却下済み","insights.viewDetail":"詳細を見る","insights.collapse":"折りたたむ","insights.accept":"採用","insights.applying":"適用中…","insights.reject":"拒否","insights.rejectConfirm":"このインサイトを拒否しますか?この操作は元に戻せません。","insights.observations":"要約観察","insights.tags":"タグ","insights.sourceIds":"ソース entity","insights.validationWarnings":"旧形式の検証警告","insights.validationClaim":"主張","insights.validationReason":"理由","banner.pendingInsights":"{n} 件の新しい insight がレビュー待ち →","banner.dismiss":"閉じる","banner.viewAll":"すべて表示","pattern.title":"Pattern","pattern.evidenceCount":"{n} 件の証拠","pattern.severity":"重大度","pattern.severity.high":"高","pattern.severity.medium":"中","pattern.severity.low":"低","pattern.description":"Pattern の説明","tab.graph":"グラフ","tab.settings":"設定","tab.home":"ホーム","tab.memories":"メモリ","tab.project":"プロジェクト","memories.searchPlaceholder":"入力しながら絞り込み — Enter で関連度順に検索","memories.scopeLabel":"範囲","memories.scopeWork":"ワークレイヤー","memories.scopeEvidence":"証拠","memories.scopeAll":"すべて","memories.scopeArchived":"アーカイブ済み","memories.composition":"構成","memories.rankedBy":"関連度順","memories.backToList":"一覧に戻る","memories.workEmpty":"ワークレイヤーのメモリはまだありません — 目標・決定・教訓・プランは記録されるとここに表示されます。","memories.showAll":"すべてのメモリを表示","memories.expand":"詳細を表示","memories.collapse":"詳細を隠す","memory.technicalDetails":"技術情報","memory.canonicalName":"正規名","memory.rawType":"元の種類","home.analyticsTitle":"分析","handoff.terminal":"ターミナルが必要","handoff.terminalPrereq":"MeMeshを導入したマシンで実行してください。ダッシュボードは実行しません。","handoff.copyCommand":"コマンドをコピー","handoff.commandCopied":"コピーしました","handoff.github":"GitHubを開きます — 送信前に入力内容を確認してください","home.analyticsHint":"健康度・タイムライン・パターン・利用状況 — 必要なときに展開","home.nextAction.eyebrow":"おすすめの次のステップ","home.nextAction.why":"理由:","home.nextAction.result":"期待される結果:","home.nextAction.loading.title":"対応が必要な項目を確認中…","home.nextAction.loading.why":"MeMesh がメモリ、検索インデックス、レビュー待ち一覧の現在の状態を確認しています。","home.nextAction.loading.result":"確認後、ここには提案が1つだけ表示されます。","home.nextAction.empty.title":"最初のメモリを追加","home.nextAction.empty.why":"メモリが空のため、まだ検索や整理の対象がありません。","home.nextAction.empty.result":"「メモリ」で削除可能なデモを読み込むか、実際の作業の記録を始められます。","home.nextAction.empty.action":"メモリを開く","insights.emptyPending":"保留中のレビューはまだありません。新しいメモリーレビューが準備されると、ここに表示されます。","home.nextAction.insights.title":"メモリ整理の提案を確認","home.nextAction.insights.why":"MeMesh に判断待ちの整理提案があります。","home.nextAction.insights.result":"有用な要約を承認し、不適切な提案を却下できます。","home.nextAction.insights.action":"提案を確認","home.nextAction.healthy.title":"今すぐ必要な操作はありません","home.nextAction.healthy.why":"メモリ、検索インデックス、レビュー待ち一覧に既知の作業はありません。","home.nextAction.healthy.result":"作業を続けてください。次に確認された必要事項をMeMeshがここに表示します。","home.nextAction.unavailable.title":"現在、提案を表示できません","home.nextAction.unavailable.why":"状態確認の一部を読み取れないため、MeMeshは推測しません。","home.nextAction.unavailable.result":"再読み込みすると、メモリや設定を変更せずに再確認できます。","home.nextAction.unavailable.action":"状態確認を再試行","project.selectLabel":"プロジェクト","project.selectPrompt":"プロジェクトを選ぶと履歴が表示されます。","project.empty":"プロジェクトのメモリはまだありません。memesh フックを導入した git リポジトリで作業すると、その歩みがここに表示されます。","guard.sourceLesson":"元の教訓","guard.pattern":"トリガーパターン","guard.message":"発する警告","guard.shouldMatch":"必ず反応する入力","guard.shouldNotMatch":"反応してはいけない入力","search.button":"検索","search.searching":"検索中…","search.results":"件の結果","search.result":"件の結果","search.noResults":"結果が見つかりません:","search.facts":"件の事実","browse.title":"すべてのメモリ","browse.active":"アクティブ","browse.archived":"アーカイブ済み","browse.refresh":"更新","browse.noMatch":"一致するメモリがありません:","browse.prev":"← 前へ","browse.next":"次へ →","browse.archive":"アーカイブ","browse.restore":"復元","browse.confirmArchive":"このメモリをアーカイブしますか?","browse.archiveFailed":"アーカイブできませんでした: {message}","browse.restoreFailed":"復元できませんでした: {message}","analytics.totalMemories":"メモリ総数","analytics.knowledgeFacts":"知識ファクト","analytics.connections":"接続","analytics.topics":"トピック","analytics.insights":"インサイト","analytics.thisWeek":"今週","analytics.new":"件の新規","analytics.stale":"未使用(30日以上)","analytics.archivedLabel":"アーカイブ済み","analytics.mostRecalled":"よく参照される","health.title":"メモリ健康度","metrics.notMeasured":"未計測","metrics.health":"健全性","metrics.healthNote":"活動・品質・鮮度・教訓","metrics.critical":"重大な教訓","metrics.criticalPartial":"分類済み {tagged} 件のうち · 教訓は全 {total} 件","metrics.criticalAll":"全 {total} 件の教訓、すべて分類済み","metrics.criticalUnclassified":"教訓 {total} 件、重大度は未分類","metrics.criticalNoLessons":"教訓はまだ記録されていません","metrics.citation":"引用率","metrics.citationNote":"{total} セッション中 {cited} 件が記憶を引用","metrics.citationNotMeasured":"引用の計測は次のセッションから始まります","metrics.reused":"今週の再利用","metrics.reusedNote":"概算——最終アクセス日から推定","health.excellent":"優秀","health.good":"良好","health.fair":"普通","health.poor":"不良","health.activity":"アクティビティ","health.quality":"品質","health.freshness":"新鮮度","health.lessons":"自己改善","timeline.title":"過去30日間","timeline.created":"作成","timeline.recalled":"呼び出し","value.totalRecalls":"総呼び出し回数","value.lessonsLearned":"学んだ教訓","value.lessonsSaved":"適用済み教訓","value.coverage":"知識カバレッジ","cleanup.title":"クリーンアップ提案","cleanup.allClean":"メモリはきれいです。古いまたは重複したエンティティは検出されませんでした。","cleanup.staleLabel":"低信頼度 / 未使用","cleanup.duplicateLabel":"重複の可能性","cleanup.confidence":"信頼度","cleanup.unused":"未使用","cleanup.entityMeta":"{type} ・ 信頼度 {confidence}% ・ {days}日未使用","settings.saved":"保存しました","settings.configReadbackFailed":"保存済みの設定をサーバーから確認できませんでした。もう一度お試しください。","settings.language":"言語","settings.interfaceLanguage":"インターフェース言語","settings.interfaceLanguageHint":"このブラウザーの表示言語をすぐに変更します。","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.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 をインストールしたツールまたは手順からこのインストールを更新してください。","settings.installationDetails":"インストールの詳細","settings.installationDetailsUnavailable":"このインストールではバージョンを比較できません。","settings.interfacePath":"このインターフェース","settings.terminalPath":"ターミナルコマンド","settings.technicalDetails":"技術情報","settings.installationDetailsHint":"インストール済みのバージョンが異なっていても、必ずしも更新が必要とは限りません。公開済みリリースは「アップデート」で確認してください。","graph.entities":"エンティティ","graph.relations":"リレーション","graph.orphans":"孤立ノード","graph.search":"ノードを検索…","graph.matches":"件一致","graph.enterToOpen":"Enter キーで開く","graph.focusMode":"フォーカス","graph.showAll":"すべて表示","graph.clickHint":"ノードをクリックしてフォーカス","graph.interactHint":"ノードをクリックしてフォーカス · 空白をドラッグでパン · スクロールでズーム","graph.resetView":"ビューをリセット","graph.resetViewHint":"ズームと位置をリセット","graph.ageToday":"今日","graph.ageDaysAgo":"{count}日前","graph.ageWeeksAgo":"{count}週間前","lessons.error":"エラー","lessons.rootCause":"根本原因","lessons.fix":"修正方法","lessons.prevention":"予防策","feedback.button":"💬 フィードバック","feedback.title":"GitHub でフィードバックを開く","feedback.bug":"バグ","feedback.feature":"機能提案","feedback.question":"質問","feedback.placeholder":"フィードバックを記入…","feedback.includeSys":"システム情報を含める","feedback.submit":"GitHub Issue を作成","feedback.submitting":"診断情報を収集中…","feedback.popupBlocked":"GitHub を開けませんでした。下書きは保持されています。ポップアップを許可して再試行するか、リンクをコピーしてください。","feedback.retry":"GitHub をもう一度開く","feedback.copyLink":"GitHub リンクをコピー","feedback.linkCopied":"リンクをコピーしました","feedback.copyFailed":"リンクをコピーできませんでした。GitHub をもう一度開いてください。","doctorBanner.warnTitleSoft":"memesh セットアップに注記があります","doctorBanner.failTitle":"memesh のセットアップが不完全です","doctorBanner.dismiss":"閉じる","doctorBanner.getHelp":"サポートを受ける","doctorBanner.helpHint":"診断情報が事前入力された GitHub Issue を開きます","doctorBanner.preambleForIssue":"memesh doctor が私のインストールで以下を検出しました:","doctorBanner.moreCount":"…ほか {n} 件 — 全リストは `memesh doctor` で確認できます","doctorBanner.fix":"自動修復","doctorBanner.fixInProgress":"修復中…","doctorBanner.fixDone":"修復済み","doctorBanner.restartRequired":"更新を完了するにはエージェントを再起動してください。","doctor.label.readme_locale_parity":"README の翻訳","doctor.label.config":"設定ファイル","doctor.label.mcp-config":"MCP 接続ファイル","doctor.label.hooks-config":"フック定義","doctor.label.hook-scripts":"フックスクリプト","doctor.label.hook-wiring":"Claude Code との接続","doctor.label.hook-activity":"自動記録","doctor.label.node-runtime":"Node.js のバージョン","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"プラグインのコードは最新か","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.install-channel":"インストール方法","doctor.label.fts_segmentation":"キーワード索引","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 につなぐファイル(.claude-plugin/mcp.json)が見つかりません。","doctor.msg.mcp-config.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/mcp.json が壊れています(有効な JSON ではありません)。Claude Code が読み取れません。","doctor.msg.mcp-config.invalid-json.fix":"{path} を修正するか、MeMesh を再インストールしてください。","doctor.msg.mcp-config.no-entry.summary":".claude-plugin/mcp.json に memesh サーバーの設定がなくなっています。","doctor.msg.mcp-config.no-entry.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` が起動しようとしているファイルがこのインストールに存在しないため、Claude Code 内の memesh ツールがすべて起動しません。","doctor.msg.mcp-config.entry-missing.fix":"MeMesh を再インストールしてください。`.claude-plugin/mcp.json` を手で編集した場合は `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js` に戻してください。","doctor.msg.mcp-config.placeholder-unresolved.summary":"未検証:`.claude-plugin/mcp.json` が起動するパスには `${CLAUDE_PLUGIN_ROOT}` が含まれており、この変数を展開するのは Claude Code のプラグイン実行環境だけです。このインストールはプラグインとして動いていないため、指定されたファイルは確認できていません。","doctor.msg.mcp-config.placeholder-unresolved.fix":"プラグイン実行環境と同じ条件で確認してください:`CLAUDE_PLUGIN_ROOT=<このインストールのフォルダ> memesh doctor` を実行します。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json が見つからないため、自動の記憶保存が動きません。","doctor.msg.hooks-config.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json が壊れています(有効な JSON ではありません)。","doctor.msg.hooks-config.invalid-json.fix":"{path} を修正するか、MeMesh を再インストールしてください。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json に次のフックタイプがありません: {types}。一部の自動記録は動作しません。","doctor.msg.hooks-config.missing-types.fix":"出荷時のフック設定を復元するか、MeMesh を再インストールしてください。","doctor.msg.hook-scripts.none.summary":"フック設定にスクリプトが 1 つもないため、何も自動記録できません。","doctor.msg.hook-scripts.none.fix":"MeMesh を再インストールしてください。","doctor.msg.hook-scripts.missing.summary":"次のフックスクリプトが見つかりません: {files}","doctor.msg.hook-scripts.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.hook-scripts.not-executable.summary":"次のフックスクリプトは存在しますが、実行が許可されていません: {files}","doctor.msg.hook-scripts.not-executable.fix":"`chmod +x scripts/hooks/*.js` を実行してください。ソースからの場合は `npm run build` を実行します。","doctor.msg.hook-wiring.no-marker.summary":"memesh はまだ Claude Code に接続されていないため、何も自動で記憶されません。","doctor.msg.hook-wiring.no-marker.fix":"`memesh install-hooks` を一度実行し、`memesh doctor` で確認してください。","doctor.msg.hook-wiring.script-missing.summary":"配線済みの memesh フックが {path} を指していますが、このファイルはもう存在しません — エージェントは該当イベントのたびに存在しないファイルを呼び出します。フックを廃止したアップグレードの残骸であることが多いです。","doctor.msg.hook-wiring.script-missing.fix":"`memesh install-hooks` を実行して配線し直し(廃止済み項目は削除されます)、エージェントを再起動してください。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} の接続記録を読み取れません。","doctor.msg.hook-wiring.marker-unreadable.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.marker-malformed.summary":"接続記録が壊れています。","doctor.msg.hook-wiring.marker-malformed.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code の設定ファイル({path})がなくなっているため、接続が切れています。","doctor.msg.hook-wiring.settings-missing.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} が壊れています(有効な JSON ではありません)。","doctor.msg.hook-wiring.settings-invalid.fix":"バックアップから復元するか、`memesh install-hooks` で作り直してください。","doctor.msg.hook-wiring.entries-removed.summary":"{path} から memesh の設定が削除されたため、接続が切れています。","doctor.msg.hook-wiring.entries-removed.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.root-moved.summary":"接続先の {path} はもう存在しません(memesh が移動された可能性があります)。","doctor.msg.hook-wiring.root-moved.fix":"`memesh install-hooks` を実行して更新してください。","doctor.msg.hook-activity.never-ran.summary":"記録の追跡を始めてから {hours} 時間、キャプチャフックが一度も実行されていません。フックの配線は正常なので、実行されるはずのものが動いておらず、何も記憶されていません。","doctor.msg.hook-activity.never-ran.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。まだフックが実行されていないと表示される場合は `memesh install-hooks` を実行してエージェントを再起動してください。","doctor.msg.hook-activity.stale.summary":"最後にキャプチャフックが実行されたのは約 {hours} 時間前です({hook})。それ以降に作業しているなら、キャプチャは停止しており、そのセッションの内容は保存されていません。","doctor.msg.hook-activity.stale.fix":"エージェントを再起動し、セッションを 1 回終えてから `memesh doctor` を再実行してください。回復しない場合は `memesh install-hooks` を実行してください。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary フックの最終実行は約 {hours} 時間前で、直近 3 日間 Claude Code からの書き込みもありません。このマシンが別のエージェント(Codex / Gemini)に移行したなら正常です。まだここで Claude Code を使っているなら、キャプチャは停止しています。","doctor.msg.hook-activity.stale-unconfirmed.fix":"このマシンでまだ Claude Code を使っている場合:再起動し、セッションを 1 回終えてから `memesh doctor` を再実行してください。回復しなければ `memesh install-hooks` を実行してください。","doctor.msg.hook-activity.query-failed.summary":"データベースからフックの実行履歴を読めませんでした:{detail}。キャプチャの状態は「不明」であり、「正常」とは違います。","doctor.msg.hook-activity.query-failed.fix":"`memesh doctor --verbose` で完全なエラーを確認し、~/.memesh が読み取り可能でディスクに空きがあることを確認してください。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} フックの最終実行時刻が読み取れません(データ破損、または時計が狂ったマシンが記録した可能性があります)。キャプチャの状態は「不明」であり、「正常」とは違います。","doctor.msg.hook-activity.stale-unknown.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。新しい実行が壊れたタイムスタンプを上書きします。","doctor.msg.hook-activity.disabled.summary":"自動キャプチャはオフになっています(MEMESH_AUTO_CAPTURE または設定の autoCapture)。意図的な設定のため、フックが動かないのは想定どおりです。再開するには設定を戻してください。","doctor.msg.hook-activity.disabled-env.summary":"この shell の環境変数 MEMESH_AUTO_CAPTURE=false により自動キャプチャはオフです。doctor は自分の環境しか見えません — エージェントがこの変数なしで動いていれば、そちらのキャプチャは影響を受けません。","doctor.msg.hook-activity.not-wired.summary":"キャプチャフックは一度も実行されていません — そしてこのマシンではキャプチャフック(Stop / PostToolUse / PreCompact)の配線が確認できないため、実行されるものがそもそもありません。","doctor.msg.hook-activity.not-wired.fix":"自動キャプチャを使うには `memesh install-hooks` を実行してください。MCP のみのインストール(Codex / Gemini)であればこれは正常であり、無視してかまいません。","doctor.msg.hook-activity.stop-silent.summary":"{hook} フックは記録されていますが、追跡開始から {hours} 時間、session-summary フックは一度も実行されていません。コミットのキャプチャに隠れて、セッションのキャプチャが壊れている可能性があります。","doctor.msg.hook-activity.stop-silent.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。それでも session-summary が実行されていなければ、`memesh install-hooks` を実行してエージェントを再起動してください。","doctor.msg.hook-activity.never-ran-legacy.summary":"ハートビートを記録したフックはありませんが、追跡開始以降に {captured} 件の自動キャプチャの記憶が保存されています。ハートビート機能より前の旧バージョンのフックがまだ動いている可能性が高いです。","doctor.msg.hook-activity.never-ran-legacy.fix":"memesh のフックを現行バージョンに更新し(プラグイン:`/plugin update memesh`、npm:`memesh install-hooks`)、エージェントを再起動してください。","doctor.msg.node-runtime.too-old.summary":"お使いの Node.js はこのパッケージが対応するバージョンより古いです。{detail}","doctor.msg.node-runtime.too-old.fix":"Node.js を {required} 以上に更新し、もう一度 `memesh doctor` を実行してください。","doctor.msg.native-binding.load-failed.summary":"SQLite がデータベースを開けませんでした: {detail}。","doctor.msg.native-binding.load-failed.fix":"Node の実行環境を確認し、必要なら MeMesh を再インストールしてください。","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.shell-cli.versions.summary":"インストール済みバージョン: このインターフェース {current}; ターミナル {terminal}。","doctor.msg.plugin-cache.stale.summary":"プラグインはコミット {installed} からインストールされましたが、marketplace は同じバージョンのまま {marketplace} に進んでいます。バージョンが変わらないと {host} はキャッシュを更新しないため、marketplace より古いコードが動いています。","doctor.msg.plugin-cache.stale.fix":"`{command}` を実行してキャッシュを更新し、{host} を再起動してください。","doctor.msg.plugin-cache.unverifiable.summary":"インストール済みプラグインが marketplace と一致するか判断できませんでした。バージョンだけでは判断できません——異なるビルドが同じバージョンを持つことがあります。","doctor.msg.plugin-cache.unverifiable.fix":"`{command}` を一度実行してください。コミットが記録され、このチェックが判断できるようになります。","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.config-parse.retired-settings.summary":"{path} は有効な設定ファイルですが、廃止されたトップレベル設定が {count} 個残っています({keys})。このバージョンでは無視されますが、以前のプロバイダー認証情報や設定がディスクに残っている可能性があります。","doctor.msg.config-parse.retired-settings.fix":"{path} をローカルで確認し、廃止されたトップレベルキーだけを削除してください。認証情報が含まれる可能性があるため、issue に貼り付けないでください。その後 memesh doctor を再実行してください。","doctor.msg.message-capability.probe-failed.summary":"インストール済みメッセージ機能の検査に失敗しました: {detail}。","doctor.msg.message-router.socket-missing.summary":"{path} に Local router socket がありません。停止中または存在しないセッションは起動されません。","doctor.msg.message-router.socket-insecure.summary":"{path} の router socket は所有者専用の Unix socket ではありません。","doctor.msg.message-router.socket-unreachable.summary":"{path} の所有者専用 router socket は存在しますが、ローカル接続を受け付けませんでした。","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.citation.none.summary":"セッションに記憶が注入されましたが、引用されたものはありません。","doctor.msg.citation.none.fix":"~/.claude/rules/memesh-citations.md の引用規約を確認し、数セッション後に再確認してください。","doctor.msg.database.broken.summary":"データベースが使えません: {detail}","doctor.update_status.prerelease":"プレリリース版を実行中です({current})。npm の latest は {latest} です。","patterns.title":"あなたのパターン","patterns.workSchedule":"作業スケジュール","patterns.peakHours":"ピーク時間帯","patterns.busiestDays":"最も忙しい曜日","patterns.workflow":"ワークフロー","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.auth.cross-origin":"このリクエストは別のサイトから来たか、想定外の名前でサーバーに届いたため拒否されました。`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.rate.limited":"短時間にリクエストが多すぎます。少し待ってからもう一度お試しください。","httpError.server.internal":"サーバーで予期しないエラーが発生しました。","time.justNow":"たった今","time.hoursAgo":"{count} 時間前","time.today":"今日","time.yesterday":"昨日","time.daysAgo":"{count} 日前","time.lastWeek":"先週","time.weeksAgo":"{count} 週前","time.lastMonth":"先月","time.monthsAgo":"{count} ヶ月前","memory.access.frequent":"頻繁 · {count} 回","memory.access.recalls":"{count} 回呼出","memory.access.never":"未使用","cluster.knowledge":"知識","cluster.activity":"アクティビティ","cluster.session":"セッション","cluster.reference":"参照","cluster.all":"すべて","browse.filterTime":"時間","browse.filterValue":"価値","browse.filterProject":"プロジェクト","browse.filterSort":"並べ替え","browse.timeToday":"今日","browse.timeWeek":"今週","browse.timeMonth":"今月","browse.timeOlder":"それ以前","browse.valueRecalled":"✓ 使用済み","browse.valueNever":"未使用","browse.sortMostRecalled":"使用頻度順","browse.sortRecent":"最近の使用順","browse.sortCreated":"作成日順","browse.emptyFilter":"このカテゴリには記憶がありません — フィルタを変更してみてください","lessons.stepsLabel":"ステップ","lessons.commitsCount":"{count} コミット","lessons.unstructured":"(構造化フィールドなし — 元のメモリを参照)","lessons.moreItems":"あと {count} 件","roadmap.title":"プロジェクト履歴","roadmap.summary":"{count} 件の記憶 · {first} → {last}","roadmap.switchToList":"↩ リスト表示","roadmap.switchToRoadmap":"🕘 履歴表示","roadmap.emptyProject":"このプロジェクトにはまだ記憶がありません。","loop.label":"メモリループ","loop.subtitleHas":"過去 7 日間に呼び出された知識メモリ","loop.subtitleNone":"今週はまだ呼び出された知識がありません — 教訓を呼び出してみてください","loop.approxNote":"近似値 — 完全な追跡はアップグレード後に開始","loop.sparkLabel":"過去 30 日","roadmap.milestones":"マイルストーン","roadmap.keyLessons":"重要な教訓","radar.title":"知識カバレッジレーダー","radar.caption":"有効な知識メモリ (session と commit を除く)","radar.axis.lessons":"教訓","radar.axis.decisions":"決定","radar.axis.patterns":"パターン","radar.axis.bugs":"バグ修正","radar.axis.processes":"プロセス","radar.axis.architecture":"アーキテクチャ","ageMatrix.title":"メモリ年齢分布","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"色の濃さ = メモリ密度","ageMatrix.typeColumn":"タイプ","header.signalModeOn":"重要なメモリ","header.signalModeOff":"すべてのメモリ","header.signalModeOnHint":"目標・意思決定・教訓・計画を表示し、メモリとナレッジグラフでは自動取得された session、commit、活動記録を隠します。","header.signalModeOffHint":"メモリとナレッジグラフですべての記録(自動取得された session、commit、活動記録を含む)を表示します。","globalFilter.focusedStatus":"全体表示:重要なメモリ — メモリとナレッジグラフでは自動取得された session、commit、活動記録を非表示にしています。","globalFilter.allStatus":"全体表示:すべてのメモリ — メモリとナレッジグラフに自動取得された session、commit、活動記録も含めます。","roadmap.phases":"フェーズ","onboarding.title":"MeMesh へようこそ","onboarding.body":"メモリは空です。30 件のキュレーション済みツアーで始めるか、最初の教訓を記録してください。","onboarding.coreHint":"ローカルメモリ:remember、FTS5 キーワード検索、フック、ダッシュボード閲覧が連携します。","onboarding.searchHint":"検索にはローカル FTS5 キーワード検索を使います。","onboarding.reviewHint":"実行中のエージェントはダイジェストまたは表示可能な会話記録の作業パッケージを準備できます。ダッシュボードはステージ済み提案のみレビューします。","onboarding.seedButton":"デモツアーを開始","onboarding.seedingButton":"読み込み中…","onboarding.seedHint":"端末を開かずに 30 件追加。後でいつでも削除可能","onboarding.cliReference":"CLI を使う場合","onboarding.hintDemo":"30 件のデモメモリを投入(後で削除可)","onboarding.hintReset":"metadata.demo タグの全エンティティを削除","onboarding.resetButton":"デモを削除","onboarding.resettingButton":"削除中…","onboarding.demoLoadedTitle":"デモデータが読み込まれています","onboarding.demoLoadedBody":"demo タグ付きメモリが {count} 件あります。ここではそのメモリだけを削除できます。","onboarding.resetConfirm":"metadata.demo タグ付きメモリをすべて削除しますか?同じ行は復元できませんが、後で新しいデモを読み込めます。実際のメモリは残ります。","onboarding.resetReadbackFailed":"demo タグ付きメモリが残っているため、リセットを確認できませんでした。削除操作は残ります。再試行するか memesh doctor を実行してください。","onboarding.dismiss":"閉じる","common.serverError":"サーバーがエラーを返しました(HTTP {status})。もう一度お試しください。繰り返す場合は `memesh doctor` を実行してください。","emptyLibrary.title":"メモリは空です","emptyLibrary.body":"まだ何も保存されていません。30 件のデモツアーを読み込めば MeMesh の動きをすぐ確認できます(後で一括削除可)。","browse.truncated":"全 {total} 件のうち先頭 {shown} 件を表示中 — 残りは検索やフィルタで絞り込んでください","browse.truncatedUnknownTotal":"先頭 {shown} 件を表示中 — 総数を取得できないため、さらにある可能性があります","graph.cappedNote":"全 {total} 件のうち上位 {shown} 件のみ表示中(想起回数順)。グラフの動作を軽く保つためです。","ageMatrix.bucket.week":"今週","ageMatrix.bucket.month":"今月","ageMatrix.bucket.quarter":"今四半期","ageMatrix.bucket.older":"それ以前","settings.behaviourTitle":"動作設定","settings.autoUpdateLabel":"自動更新ポリシー","settings.autoUpdateOff":"オフ — 手動のみ","settings.autoUpdatePatch":"Patch — X.Y.Z+1 を自動適用","settings.autoUpdateMinor":"Minor — X.Y+1.0 を自動適用","settings.autoUpdateMajor":"Major — 任意のバンプを自動適用","settings.autoUpdateHint":"初回使用時に session ごとに一度だけ同意を確認します。MEMESH_AUTO_UPDATE は許可する更新幅だけを設定し、同意を迂回しません。","errors.timeout":"リクエストがタイムアウトしました","type.lesson_learned":"教訓","type.lesson":"教訓","type.mistake":"ミス","type.decision":"決定","type.goal":"目標","type.architecture_decision":"アーキ決定","type.design_decision":"デザイン決定","type.pattern":"パターン","type.technical_pattern":"技術パターン","type.best_practice":"ベストプラクティス","type.bug_fix":"バグ修正","type.verification_result":"検証結果","type.test_result":"テスト結果","type.process":"プロセス","type.architecture":"アーキテクチャ","type.infrastructure":"インフラ","type.feature":"機能","type.release":"リリース","type.refactoring":"リファクタリング","type.commit":"コミット","type.session_keypoint":"セッション要点","type.session_identity":"セッション識別","type.session-insight":"セッション洞察","type.session-summary":"セッション要約","type.session-identity":"セッション識別","type.weekly_summary":"週次まとめ","type.weekly-summary":"週次まとめ","type.note":"ノート","type.plan":"計画","type.knowledge":"知識","type.workflow_checkpoint":"ワークフロー","type.concept":"概念","type.tool":"ツール","type.person":"人物","relation.relates_to":"関連","relation.related-to":"関連","relation.depends_on":"依存","relation.implements":"実装","relation.learned_from":"由来","relation.supersedes":"置き換え","relation.contradicts":"矛盾","relation.follows":"後続","relation.belongs-to-project":"プロジェクト所属","relation.evidences":"根拠","relation.co-created":"共同作成","relation.shares-name-tokens":"名称類似","patterns.day.0":"日曜","patterns.day.1":"月曜","patterns.day.2":"火曜","patterns.day.3":"水曜","patterns.day.4":"木曜","patterns.day.5":"金曜","patterns.day.6":"土曜","lessons.severity.critical":"致命的","lessons.severity.major":"重大","lessons.severity.minor":"軽微","memory.tooltip.project":"プロジェクト","memory.tooltip.recalled":"{count} 回呼び出されました","memory.tooltip.hasRelations":"{count} 件の記憶とリンク","memory.tooltip.createdAt":"作成: {date}","graph.layerLabel":"グラフの層","graph.layerWork":"仕事","graph.layerAll":"すべて","graph.layerWorkHint":"保存された決定、教訓、計画と、それらに記録されたリンク。","graph.layerAllHint":"保存されたすべての記憶とその記録済みリンク。リンクはエージェントまたは保守ルールによって追加されることがあります。この表示では言語モデルを呼び出しません。","graph.layerFellBack":"仕事の項目が {min} 件未満のため、全体グラフを表示しています。決定や教訓を記録すると、この表示が育ちます。","graph.evidenceFor":"{node} の根拠","graph.evidenceClose":"閉じる","graph.evidenceLoading":"根拠を読み込み中…","graph.evidenceFailed":"この項目の根拠を読み込めませんでした。","graph.evidenceEmpty":"この項目にはまだ根拠が結び付いていません。`memesh kg backfill` を実行すると、コミットやセッションの記録からリンクを作成します。","graph.evidenceTruncated":"最新の {shown} 件を表示しています。さらにあります。","graph.drift":"鮮度","graph.driftHint":"古さで色分け:赤=長く未使用、緑=最近使用","common.unknown":"不明","insights.entitiesCount":"{n} 件のエンティティ","roadmap.viewToggle":"プロジェクト履歴表示","roadmap.viewTree":"ツリー","roadmap.viewMindmap":"マインドマップ","roadmap.mindmapNeedsPhases":"マインドマップには 7 日以内の記憶が 3 件以上必要です。","roadmap.activePhase":"進行中","roadmap.entryCount":"{count} 件","roadmap.entriesCount":"{count} 件","roadmap.otherGroup":"その他({count})","roadmap.lowSignalHidden":"(低シグナル {count} 件を非表示)","roadmap.resetHint":"ズームと位置をリセット(背景をダブルクリックでも可)","roadmap.zoomHint":"スクロールでズーム · ドラッグでパン · {pct}%","roadmap.moreEntities":"他 {count} 件","roadmap.viewDecisions":"決定","roadmap.densityTitle":"カテゴリ別のキャプチャ密度","roadmap.densityNote":"memesh がキャプチャしたものであり、起きたことのすべてではありません","roadmap.lineageSupersedes":"{n} 件が置き換え済み","roadmap.lineageConflicts":"{n} 件の未解決の矛盾","adr.empty":"このプロジェクトにはまだ決定が記録されていません。タイプ「decision」で記録すると、履歴とともにここに表示されます。","adr.statusActive":"有効","adr.statusSuperseded":"置き換え済み","adr.supersedes":"置き換え元","adr.supersededBy":"置き換え先","nav.ariaLabel":"ダッシュボードのセクション","feedback.descLabel":"フィードバックの内容","graph.canvasA11y":"ナレッジグラフ(キャンバス描画):エンティティ {entities} 件、関係 {relations} 件、未接続 {orphans} 件。上部の種類フィルターと検索で非視覚的に閲覧できます。"},ko:{"auth.title":"인증 필요","auth.intro":"이 대시보드는 bearer 토큰으로 보호됩니다. 아래에 MEMESH_REMOTE_TOKEN 값(또는 <memeshDir>/remote-token 파일의 내용)을 붙여넣으세요.","auth.tokenLabel":"토큰","auth.empty":"토큰을 입력하세요.","auth.invalid":"이 토큰은 승인되지 않았습니다. 확인 후 다시 시도해 주세요.","auth.submit":"대시보드 잠금 해제","auth.tokenPlaceholder":"여기에 토큰을 붙여넣으세요","brand.subtitle":"powered by pcircle.com","header.connected":"연결됨","header.disconnected":"연결 끊김","header.connecting":"연결 중…","header.memories":"개의 기억","insights.title":"메모리 정리 제안","insights.reviewTitle":"스테이징된 메모리 제안","insights.reviewSubtitle":"사람의 검토를 기다리는 작업 패키지","insights.reviewSource":"스테이징된 제안 — 적용 전에 검토하세요","insights.source.calendar":"캘린더 다이제스트","insights.source.transcript":"Claude Code 대화 기록","insights.reviewBoundary":"대시보드는 이미 스테이징된 제안만 검토합니다. 에이전트를 실행하거나 디스패치하지 않습니다.","insights.statPending":"대기 중","insights.statApplied":"적용됨","insights.statRejected":"거부됨","insights.filter.pending":"대기 중","insights.filter.applied":"적용됨","insights.filter.rejected":"거부됨","insights.filter.all":"전체","insights.refresh":"새로고침","insights.loading":"불러오는 중…","insights.emptyOther":"데이터가 없습니다.","insights.sources":"소스","insights.status.pending":"대기 중","insights.status.applied":"적용됨","insights.status.rejected":"거부됨","insights.viewDetail":"자세히 보기","insights.collapse":"접기","insights.accept":"채택","insights.applying":"적용 중…","insights.reject":"거부","insights.rejectConfirm":"이 인사이트를 거부할까요? 이 작업은 되돌릴 수 없습니다.","insights.observations":"요약 관찰","insights.tags":"태그","insights.sourceIds":"소스 entity","insights.validationWarnings":"이전 형식의 검증 경고","insights.validationClaim":"주장","insights.validationReason":"이유","banner.pendingInsights":"{n}개의 새 insight가 검토를 기다리고 있습니다 →","banner.dismiss":"닫기","banner.viewAll":"전체 보기","pattern.title":"Pattern","pattern.evidenceCount":"{n}개의 증거","pattern.severity":"심각도","pattern.severity.high":"높음","pattern.severity.medium":"중간","pattern.severity.low":"낮음","pattern.description":"Pattern 설명","tab.graph":"그래프","tab.settings":"설정","tab.home":"홈","tab.memories":"기억","tab.project":"프로젝트","memories.searchPlaceholder":"입력하는 대로 필터링 — Enter를 누르면 관련도순 검색","memories.scopeLabel":"범위","memories.scopeWork":"작업 레이어","memories.scopeEvidence":"증거","memories.scopeAll":"전체","memories.scopeArchived":"보관됨","memories.composition":"구성","memories.rankedBy":"관련도순","memories.backToList":"목록으로 돌아가기","memories.workEmpty":"작업 레이어 기억이 아직 없습니다 — 목표, 결정, 교훈, 계획이 기록되면 여기에 나타납니다.","memories.showAll":"모든 기억 보기","memories.expand":"상세 보기","memories.collapse":"상세 숨기기","memory.technicalDetails":"기술 세부정보","memory.canonicalName":"표준 이름","memory.rawType":"원시 유형","home.analyticsTitle":"분석","handoff.terminal":"터미널 필요","handoff.terminalPrereq":"MeMesh가 설치된 컴퓨터에서 실행하세요. 대시보드는 실행하지 않습니다.","handoff.copyCommand":"명령 복사","handoff.commandCopied":"명령 복사됨","handoff.github":"GitHub 열기 — 제출 전에 미리 채운 내용을 확인하세요","home.analyticsHint":"건강도, 타임라인, 패턴, 사용량 — 필요할 때 펼쳐집니다","home.nextAction.eyebrow":"권장 다음 단계","home.nextAction.why":"이유:","home.nextAction.result":"예상 결과:","home.nextAction.loading.title":"주의가 필요한 항목을 확인하는 중…","home.nextAction.loading.why":"MeMesh가 메모리, 검색 인덱스와 검토 대기열의 현재 상태를 읽고 있습니다.","home.nextAction.loading.result":"확인이 끝나면 한 가지 권장 사항만 표시됩니다.","home.nextAction.empty.title":"첫 메모리 추가","home.nextAction.empty.why":"메모리가 비어 있어 아직 검색하거나 정리할 내용이 없습니다.","home.nextAction.empty.result":"메모리 페이지에서 삭제 가능한 데모를 불러오거나 실제 작업 기록을 시작할 수 있습니다.","home.nextAction.empty.action":"메모리 열기","insights.emptyPending":"아직 검토할 항목이 없습니다. 새 메모리 검토가 준비되면 여기에 표시됩니다.","home.nextAction.insights.title":"메모리 정리 제안 검토","home.nextAction.insights.why":"MeMesh에 판단을 기다리는 정리 제안이 있습니다.","home.nextAction.insights.result":"유용한 요약을 승인하거나 적합하지 않은 제안을 거절할 수 있습니다.","home.nextAction.insights.action":"제안 검토","home.nextAction.healthy.title":"지금은 조치가 필요하지 않습니다","home.nextAction.healthy.why":"메모리, 검색 인덱스와 검토 대기열에 알려진 작업이 없습니다.","home.nextAction.healthy.result":"계속 작업하세요. MeMesh가 다음으로 확인된 필요 사항을 여기에 표시합니다.","home.nextAction.unavailable.title":"현재 권장 사항을 표시할 수 없습니다","home.nextAction.unavailable.why":"상태 확인 중 하나를 읽지 못해 MeMesh가 추측하지 않습니다.","home.nextAction.unavailable.result":"다시 불러오면 메모리나 설정을 변경하지 않고 재확인합니다.","home.nextAction.unavailable.action":"상태 확인 재시도","project.selectLabel":"프로젝트","project.selectPrompt":"프로젝트를 선택하면 그 히스토리가 표시됩니다.","project.empty":"프로젝트 기억이 아직 없습니다. memesh 훅이 설치된 git 저장소에서 작업하면 그 이야기가 여기에 나타납니다.","guard.sourceLesson":"출처 교훈","guard.pattern":"트리거 패턴","guard.message":"표시될 경고","guard.shouldMatch":"반드시 발동","guard.shouldNotMatch":"발동 금지","search.button":"검색","search.searching":"검색 중…","search.results":"개의 결과","search.result":"개의 결과","search.noResults":"결과를 찾을 수 없습니다:","search.facts":"개의 사실","browse.title":"모든 기억","browse.active":"활성","browse.archived":"보관됨","browse.refresh":"새로고침","browse.noMatch":"일치하는 기억이 없습니다:","browse.prev":"← 이전","browse.next":"다음 →","browse.archive":"보관","browse.restore":"복원","browse.confirmArchive":"이 기억을 보관하시겠습니까?","browse.archiveFailed":"보관하지 못했습니다: {message}","browse.restoreFailed":"복원하지 못했습니다: {message}","analytics.totalMemories":"총 기억 수","analytics.knowledgeFacts":"지식 사실","analytics.connections":"연결","analytics.topics":"주제","analytics.insights":"인사이트","analytics.thisWeek":"이번 주","analytics.new":"개 신규","analytics.stale":"비활성 (30일 이상 미사용)","analytics.archivedLabel":"보관됨","analytics.mostRecalled":"가장 많이 조회됨","health.title":"메모리 건강도","metrics.notMeasured":"아직 측정되지 않음","metrics.health":"건강도","metrics.healthNote":"활동, 품질, 신선도, 교훈","metrics.critical":"심각한 교훈","metrics.criticalPartial":"분류된 {tagged}개 중 · 전체 교훈 {total}개","metrics.criticalAll":"전체 {total}개 교훈, 모두 분류됨","metrics.criticalUnclassified":"교훈 {total}개, 심각도 분류 없음","metrics.criticalNoLessons":"아직 기록된 교훈이 없습니다","metrics.citation":"인용률","metrics.citationNote":"{total}개 세션 중 {cited}개가 기억을 인용","metrics.citationNotMeasured":"인용 추적은 다음 세션부터 시작됩니다","metrics.reused":"이번 주 재사용","metrics.reusedNote":"근사치 — 마지막 접근 시각으로 추정","health.excellent":"우수","health.good":"양호","health.fair":"보통","health.poor":"불량","health.activity":"활동","health.quality":"품질","health.freshness":"최신성","health.lessons":"자기 개선","timeline.title":"최근 30일","timeline.created":"생성","timeline.recalled":"호출","value.totalRecalls":"총 호출 횟수","value.lessonsLearned":"학습된 교훈","value.lessonsSaved":"적용된 교훈","value.coverage":"지식 커버리지","cleanup.title":"정리 제안","cleanup.allClean":"메모리가 깨끗합니다. 오래되었거나 중복된 엔티티가 감지되지 않았습니다.","cleanup.staleLabel":"낮은 신뢰도 / 미사용","cleanup.duplicateLabel":"중복 가능성","cleanup.confidence":"신뢰도","cleanup.unused":"미사용","cleanup.entityMeta":"{type} · 신뢰도 {confidence}% · {days}일 미사용","settings.saved":"저장되었습니다","settings.configReadbackFailed":"서버에서 저장된 설정을 확인하지 못했습니다. 다시 시도하세요.","settings.language":"언어","settings.interfaceLanguage":"인터페이스 언어","settings.interfaceLanguageHint":"이 브라우저의 인터페이스 언어를 즉시 변경합니다.","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.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를 설치한 도구나 작업 흐름으로 이 설치를 업데이트하세요.","settings.installationDetails":"설치 세부정보","settings.installationDetailsUnavailable":"이 설치에서는 버전을 비교할 수 없습니다.","settings.interfacePath":"이 인터페이스","settings.terminalPath":"터미널 명령어","settings.technicalDetails":"기술 세부정보","settings.installationDetailsHint":"설치된 버전이 서로 달라도 반드시 업데이트가 필요한 것은 아닙니다. 게시된 릴리스는 업데이트에서 확인하세요.","graph.entities":"엔티티","graph.relations":"관계","graph.orphans":"고립 노드","graph.search":"노드 검색…","graph.matches":"개 일치","graph.enterToOpen":"Enter 키로 열기","graph.focusMode":"포커스","graph.showAll":"모두 표시","graph.clickHint":"노드를 클릭하여 포커스","graph.interactHint":"노드 클릭으로 포커스 · 빈 영역 드래그로 이동 · 스크롤로 확대/축소","graph.resetView":"뷰 재설정","graph.resetViewHint":"확대/축소 및 위치 재설정","graph.ageToday":"오늘","graph.ageDaysAgo":"{count}일 전","graph.ageWeeksAgo":"{count}주 전","lessons.error":"오류","lessons.rootCause":"근본 원인","lessons.fix":"수정 방법","lessons.prevention":"예방 조치","feedback.button":"💬 피드백","feedback.title":"GitHub에서 피드백 열기","feedback.bug":"버그","feedback.feature":"기능 제안","feedback.question":"질문","feedback.placeholder":"피드백을 설명해주세요…","feedback.includeSys":"시스템 정보 포함","feedback.submit":"GitHub Issue 열기","feedback.submitting":"진단 정보 수집 중…","feedback.popupBlocked":"GitHub가 열리지 않았습니다. 초안은 그대로 유지됩니다. 팝업을 허용하고 다시 시도하거나 링크를 복사하세요.","feedback.retry":"GitHub 다시 열기","feedback.copyLink":"GitHub 링크 복사","feedback.linkCopied":"링크 복사됨","feedback.copyFailed":"링크를 복사하지 못했습니다. GitHub를 다시 열어 보세요.","doctorBanner.warnTitleSoft":"memesh 설정 안내가 있습니다","doctorBanner.failTitle":"memesh 설정이 완전하지 않습니다","doctorBanner.dismiss":"닫기","doctorBanner.getHelp":"도움 받기","doctorBanner.helpHint":"진단 정보가 미리 입력된 GitHub Issue를 엽니다","doctorBanner.preambleForIssue":"memesh doctor가 내 설치에서 다음을 발견했습니다:","doctorBanner.moreCount":"…외 {n}건 — 전체 목록은 `memesh doctor`로 확인하세요","doctorBanner.fix":"자동 수정","doctorBanner.fixInProgress":"수정 중…","doctorBanner.fixDone":"수정됨","doctorBanner.restartRequired":"업데이트를 완료하려면 에이전트를 다시 시작하세요.","doctor.label.readme_locale_parity":"README 번역","doctor.label.config":"설정 파일","doctor.label.mcp-config":"MCP 연결 파일","doctor.label.hooks-config":"훅 정의","doctor.label.hook-scripts":"훅 스크립트","doctor.label.hook-wiring":"Claude Code 연결","doctor.label.hook-activity":"자동 기록","doctor.label.node-runtime":"Node.js 버전","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"플러그인 코드 최신 여부","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.install-channel":"설치 방법","doctor.label.fts_segmentation":"키워드 색인","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에 연결하는 파일(.claude-plugin/mcp.json)이 없습니다.","doctor.msg.mcp-config.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/mcp.json이 손상되어(올바른 JSON이 아님) Claude Code가 읽을 수 없습니다.","doctor.msg.mcp-config.invalid-json.fix":"{path}를 고치거나 MeMesh를 다시 설치하세요.","doctor.msg.mcp-config.no-entry.summary":".claude-plugin/mcp.json에 memesh 서버 항목이 더 이상 없습니다.","doctor.msg.mcp-config.no-entry.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json`이 실행하려는 파일이 이 설치에 없어서 Claude Code 안의 모든 memesh 도구가 시작되지 않습니다.","doctor.msg.mcp-config.entry-missing.fix":"MeMesh를 다시 설치하세요. `.claude-plugin/mcp.json`을 직접 고쳤다면 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`로 되돌리세요.","doctor.msg.mcp-config.placeholder-unresolved.summary":"확인되지 않음: `.claude-plugin/mcp.json`이 실행하는 경로에 `${CLAUDE_PLUGIN_ROOT}`가 들어 있으며, 이 변수는 Claude Code 플러그인 실행 환경만 채워 넣습니다. 이 설치본은 플러그인으로 실행 중이 아니므로 그 파일은 검사하지 않았습니다.","doctor.msg.mcp-config.placeholder-unresolved.fix":"플러그인 실행 환경과 같은 방식으로 확인하세요: `CLAUDE_PLUGIN_ROOT=<이 설치 폴더> memesh doctor`를 실행합니다.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json이 없어서 자동 기억 저장이 동작하지 않습니다.","doctor.msg.hooks-config.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json이 손상되었습니다(올바른 JSON이 아님).","doctor.msg.hooks-config.invalid-json.fix":"{path}를 고치거나 MeMesh를 다시 설치하세요.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json에 다음 훅 유형이 없습니다: {types}. 일부 자동 기록이 실행되지 않습니다.","doctor.msg.hooks-config.missing-types.fix":"기본 제공 훅 구성을 복원하거나 MeMesh를 다시 설치하세요.","doctor.msg.hook-scripts.none.summary":"훅 설정에 스크립트가 하나도 없어서 아무것도 자동으로 기록되지 않습니다.","doctor.msg.hook-scripts.none.fix":"MeMesh를 다시 설치하세요.","doctor.msg.hook-scripts.missing.summary":"다음 훅 스크립트가 없습니다: {files}","doctor.msg.hook-scripts.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.hook-scripts.not-executable.summary":"다음 훅 스크립트는 있지만 실행 권한이 없습니다: {files}","doctor.msg.hook-scripts.not-executable.fix":"`chmod +x scripts/hooks/*.js`를 실행하세요. 소스 설치라면 `npm run build`를 실행하세요.","doctor.msg.hook-wiring.no-marker.summary":"memesh가 아직 Claude Code에 연결되지 않아 아무것도 자동으로 기억되지 않습니다.","doctor.msg.hook-wiring.no-marker.fix":"`memesh install-hooks`를 한 번 실행한 뒤 `memesh doctor`로 확인하세요.","doctor.msg.hook-wiring.script-missing.summary":"연결된 memesh 훅이 {path}를 가리키지만 이 파일은 더 이상 존재하지 않습니다 — 에이전트가 해당 이벤트마다 없는 파일을 호출합니다. 보통 훅을 은퇴시킨 업그레이드가 남긴 잔재입니다.","doctor.msg.hook-wiring.script-missing.fix":"`memesh install-hooks`를 실행해 다시 연결하고(은퇴한 항목은 제거됩니다) 에이전트를 재시작하세요.","doctor.msg.hook-wiring.marker-unreadable.summary":"{path}의 연결 기록을 읽을 수 없습니다.","doctor.msg.hook-wiring.marker-unreadable.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.marker-malformed.summary":"연결 기록이 손상되었습니다.","doctor.msg.hook-wiring.marker-malformed.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 설정 파일({path})이 사라져 연결이 끊어졌습니다.","doctor.msg.hook-wiring.settings-missing.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.settings-invalid.summary":"{path}가 손상되었습니다(올바른 JSON이 아님).","doctor.msg.hook-wiring.settings-invalid.fix":"백업에서 복원하거나 `memesh install-hooks`로 다시 만드세요.","doctor.msg.hook-wiring.entries-removed.summary":"{path}에서 memesh 항목이 제거되어 연결이 끊어졌습니다.","doctor.msg.hook-wiring.entries-removed.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.root-moved.summary":"연결이 가리키는 {path}가 더 이상 존재하지 않습니다(memesh가 옮겨졌을 수 있음).","doctor.msg.hook-wiring.root-moved.fix":"`memesh install-hooks`를 실행해 갱신하세요.","doctor.msg.hook-activity.never-ran.summary":"추적을 시작한 뒤 {hours}시간 동안 캡처 훅이 한 번도 실행되지 않았습니다. 훅 연결은 정상이므로 실행되어야 할 것이 돌지 않고 있고, 아무것도 기억되지 않고 있습니다.","doctor.msg.hook-activity.never-ran.fix":"작업 세션을 한 번 마친 뒤 `memesh doctor`를 다시 실행하세요. 여전히 훅이 실행되지 않았다고 나오면 `memesh install-hooks`를 실행하고 에이전트를 재시작하세요.","doctor.msg.hook-activity.stale.summary":"마지막 캡처 훅 실행은 약 {hours}시간 전입니다({hook}). 그 뒤로 작업했다면 캡처가 멈춘 것이며 해당 세션의 내용은 저장되지 않았습니다.","doctor.msg.hook-activity.stale.fix":"에이전트를 재시작하고 세션을 한 번 마친 뒤 `memesh doctor`를 다시 실행하세요. 회복되지 않으면 `memesh install-hooks`를 실행하세요.","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary 훅이 마지막으로 실행된 것은 약 {hours}시간 전이고, 지난 3일간 Claude Code의 쓰기도 없었습니다. 이 머신이 다른 에이전트(Codex / Gemini)로 옮겨갔다면 정상입니다. 여기서 아직 Claude Code를 쓰고 있다면 캡처가 멈춘 것입니다.","doctor.msg.hook-activity.stale-unconfirmed.fix":"이 머신에서 아직 Claude Code를 쓴다면: 재시작하고 세션을 한 번 끝낸 뒤 `memesh doctor`를 다시 실행하세요. 회복되지 않으면 `memesh install-hooks`를 실행하세요.","doctor.msg.hook-activity.query-failed.summary":'데이터베이스에서 훅 활동을 읽지 못했습니다: {detail}. 캡처 상태는 "알 수 없음"이며 이는 "정상"과 다릅니다.',"doctor.msg.hook-activity.query-failed.fix":"`memesh doctor --verbose`로 전체 오류를 확인하고 ~/.memesh를 읽을 수 있는지, 디스크가 가득 차지 않았는지 확인하세요.","doctor.msg.hook-activity.stale-unknown.summary":'{hook} 훅의 마지막 실행 시각을 읽을 수 없습니다(데이터 손상, 또는 시계가 어긋난 머신이 기록했을 수 있음). 캡처 상태는 "알 수 없음"이며, 이는 "정상"과 같지 않습니다.',"doctor.msg.hook-activity.stale-unknown.fix":"작업 세션을 한 번 끝낸 뒤 `memesh doctor`를 다시 실행하세요. 새 실행이 잘못된 타임스탬프를 덮어씁니다.","doctor.msg.hook-activity.disabled.summary":"자동 캡처가 꺼져 있습니다(MEMESH_AUTO_CAPTURE 또는 설정의 autoCapture). 의도된 설정이므로 훅이 조용한 것은 예상된 동작입니다. 다시 켜면 캡처가 재개됩니다.","doctor.msg.hook-activity.disabled-env.summary":"이 shell 환경의 MEMESH_AUTO_CAPTURE=false 때문에 자동 캡처가 꺼져 있습니다. doctor는 자신의 환경만 볼 수 있습니다 — 에이전트가 이 변수 없이 실행 중이라면 그쪽 캡처는 영향을 받지 않습니다.","doctor.msg.hook-activity.not-wired.summary":"캡처 훅이 한 번도 실행되지 않았습니다 — 그리고 이 머신에는 캡처 훅(Stop / PostToolUse / PreCompact)이 연결된 것이 확인되지 않아, 실행될 것이 애초에 없습니다.","doctor.msg.hook-activity.not-wired.fix":"자동 캡처를 원하면 `memesh install-hooks`를 실행하세요. MCP 전용 설치(Codex / Gemini)라면 정상이며 무시해도 됩니다.","doctor.msg.hook-activity.stop-silent.summary":"{hook} 훅은 기록되고 있지만, 추적을 시작한 지 {hours}시간 동안 session-summary 훅은 한 번도 실행되지 않았습니다. 커밋 캡처에 가려져 세션 캡처가 고장 났을 수 있습니다.","doctor.msg.hook-activity.stop-silent.fix":"작업 세션을 한 번 끝내고 `memesh doctor`를 다시 실행하세요. 그래도 session-summary가 실행되지 않았다면 `memesh install-hooks`를 실행하고 에이전트를 재시작하세요.","doctor.msg.hook-activity.never-ran-legacy.summary":"하트비트를 기록한 훅은 없지만 추적 시작 이후 {captured}개의 자동 캡처 기억이 저장되었습니다. 하트비트 기능 이전의 구버전 훅이 아직 실행 중일 가능성이 높습니다.","doctor.msg.hook-activity.never-ran-legacy.fix":"memesh 훅을 현재 버전으로 업데이트하고(플러그인: `/plugin update memesh`, npm: `memesh install-hooks`) 에이전트를 재시작하세요.","doctor.msg.node-runtime.too-old.summary":"사용 중인 Node.js가 이 패키지가 지원하는 버전보다 오래되었습니다. {detail}","doctor.msg.node-runtime.too-old.fix":"Node.js를 {required} 이상으로 올린 뒤 `memesh doctor`를 다시 실행하세요.","doctor.msg.native-binding.load-failed.summary":"SQLite가 데이터베이스를 열지 못했습니다: {detail}.","doctor.msg.native-binding.load-failed.fix":"Node 실행 환경을 확인하고 필요한 경우 MeMesh를 다시 설치하세요.","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.shell-cli.versions.summary":"설치된 버전: 이 인터페이스 {current}; 터미널 {terminal}.","doctor.msg.plugin-cache.stale.summary":"플러그인은 커밋 {installed}에서 설치되었지만 marketplace는 같은 버전으로 {marketplace}까지 진행되었습니다. 버전이 바뀌지 않으면 {host}는 캐시를 갱신하지 않으므로 marketplace보다 오래된 코드를 실행 중입니다.","doctor.msg.plugin-cache.stale.fix":"`{command}`을 실행해 캐시를 갱신한 뒤 {host}를 재시작하세요.","doctor.msg.plugin-cache.unverifiable.summary":"설치된 플러그인이 marketplace와 일치하는지 확인할 수 없습니다. 버전만으로는 알 수 없습니다 — 서로 다른 빌드가 같은 버전을 가질 수 있습니다.","doctor.msg.plugin-cache.unverifiable.fix":"`{command}`을 한 번 실행하세요. 커밋이 기록되어 이 검사가 판단할 수 있게 됩니다.","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.config-parse.retired-settings.summary":"{path}은(는) 유효한 설정 파일이지만 사용 중단된 최상위 설정 {count}개가 남아 있습니다({keys}). 이 버전은 이를 무시하지만 이전 공급자 자격 증명이나 설정이 디스크에 남아 있을 수 있습니다.","doctor.msg.config-parse.retired-settings.fix":"{path}을(를) 로컬에서 검토하고 사용 중단된 최상위 키만 제거하세요. 자격 증명이 포함될 수 있으므로 issue에 파일을 붙여 넣지 마세요. 그런 다음 memesh doctor를 다시 실행하세요.","doctor.msg.message-capability.probe-failed.summary":"설치된 메시지 기능 점검에 실패했습니다: {detail}.","doctor.msg.message-router.socket-missing.summary":"{path}에 Local router socket이 없습니다. 중지되었거나 존재하지 않는 세션은 깨우지 않습니다.","doctor.msg.message-router.socket-insecure.summary":"{path}의 router socket이 소유자 전용 Unix socket이 아닙니다.","doctor.msg.message-router.socket-unreachable.summary":"{path}의 소유자 전용 router socket이 있지만 로컬 연결을 받지 않았습니다.","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.citation.none.summary":"세션에 메모리가 주입되었지만 인용된 것이 없습니다.","doctor.msg.citation.none.fix":"~/.claude/rules/memesh-citations.md의 인용 규약을 확인한 뒤 몇 세션 후 다시 확인하세요.","doctor.msg.database.broken.summary":"데이터베이스를 사용할 수 없습니다: {detail}","doctor.update_status.prerelease":"사전 출시 버전({current})을 실행 중입니다. npm 최신 버전은 {latest}입니다.","patterns.title":"나의 패턴","patterns.workSchedule":"작업 일정","patterns.peakHours":"피크 시간대","patterns.busiestDays":"가장 바쁜 요일","patterns.workflow":"워크플로우","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.auth.cross-origin":"이 요청은 다른 사이트에서 왔거나 예상치 못한 이름으로 서버에 도달해 거부되었습니다. `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.rate.limited":"짧은 시간에 요청이 너무 많습니다. 잠시 후 다시 시도하세요.","httpError.server.internal":"서버에서 예기치 않은 오류가 발생했습니다.","time.justNow":"방금","time.hoursAgo":"{count}시간 전","time.today":"오늘","time.yesterday":"어제","time.daysAgo":"{count}일 전","time.lastWeek":"지난주","time.weeksAgo":"{count}주 전","time.lastMonth":"지난달","time.monthsAgo":"{count}개월 전","memory.access.frequent":"자주 사용 · {count}회","memory.access.recalls":"{count}회 회상","memory.access.never":"회상 안 됨","cluster.knowledge":"지식","cluster.activity":"활동","cluster.session":"세션","cluster.reference":"참조","cluster.all":"전체","browse.filterTime":"시간","browse.filterValue":"가치","browse.filterProject":"프로젝트","browse.filterSort":"정렬","browse.timeToday":"오늘","browse.timeWeek":"이번 주","browse.timeMonth":"이번 달","browse.timeOlder":"이전","browse.valueRecalled":"✓ 사용됨","browse.valueNever":"회상 안 됨","browse.sortMostRecalled":"자주 회상","browse.sortRecent":"최근 사용","browse.sortCreated":"생성 시간","browse.emptyFilter":"이 카테고리에 기억이 없습니다 — 필터를 변경해 보세요","lessons.stepsLabel":"단계","lessons.commitsCount":"{count}개 커밋","lessons.unstructured":"(구조화된 필드 없음 — 원본 기억 참조)","lessons.moreItems":"+{count}개","roadmap.title":"프로젝트 이력","roadmap.summary":"{count}개 기억 · {first} → {last}","roadmap.switchToList":"↩ 목록 보기","roadmap.switchToRoadmap":"🕘 이력 보기","roadmap.emptyProject":"이 프로젝트에는 아직 기억이 없습니다.","loop.label":"기억 루프","loop.subtitleHas":"지난 7일간 회상된 지식 기억","loop.subtitleNone":"이번 주 회상된 지식이 없습니다 — 교훈을 떠올려 보세요","loop.approxNote":"근사치 — 완전한 추적은 업그레이드 후 시작됩니다","loop.sparkLabel":"지난 30일","roadmap.milestones":"마일스톤","roadmap.keyLessons":"주요 교훈","radar.title":"지식 커버리지 레이더","radar.caption":"활성 지식 기억 (session 과 commit 제외)","radar.axis.lessons":"교훈","radar.axis.decisions":"결정","radar.axis.patterns":"패턴","radar.axis.bugs":"버그 수정","radar.axis.processes":"프로세스","radar.axis.architecture":"아키텍처","ageMatrix.title":"기억 연령 분포","ageMatrix.low":"낮음","ageMatrix.high":"높음","ageMatrix.legend":"색상 깊이 = 기억 밀도","ageMatrix.typeColumn":"유형","header.signalModeOn":"중요 기억","header.signalModeOff":"모든 기억","header.signalModeOnHint":"목표, 결정, 교훈, 계획을 표시하고 기억과 지식 그래프에서 자동 수집된 session, commit, 활동 기록을 숨깁니다.","header.signalModeOffHint":"기억과 지식 그래프에서 자동 수집된 session, commit, 활동 기록을 포함한 모든 기록을 표시합니다.","globalFilter.focusedStatus":"전체 보기: 중요 기억 — 기억과 지식 그래프에서 자동 수집된 session, commit, 활동 기록을 숨겼습니다.","globalFilter.allStatus":"전체 보기: 모든 기억 — 기억과 지식 그래프에 자동 수집된 session, commit, 활동 기록도 포함합니다.","roadmap.phases":"단계","onboarding.title":"MeMesh 에 오신 것을 환영합니다","onboarding.body":"기억 저장소가 비어 있습니다. 30개 큐레이션된 투어로 시작하거나 첫 교훈을 저장하세요.","onboarding.coreHint":"로컬 메모리: remember, FTS5 키워드 검색, 훅, 대시보드 탐색이 함께 작동합니다.","onboarding.searchHint":"검색은 로컬 FTS5 키워드 검색을 사용합니다.","onboarding.reviewHint":"실행 중인 에이전트는 다이제스트 또는 표시 가능한 대화 기록 작업 패키지를 준비할 수 있으며, 대시보드는 스테이징된 제안만 검토합니다.","onboarding.seedButton":"데모 투어 시작","onboarding.seedingButton":"시드 중…","onboarding.seedHint":"터미널 없이 여기서 30개 추가, 나중에 한 번에 삭제 가능","onboarding.cliReference":"CLI 를 선호하시나요?","onboarding.hintDemo":"30개 데모 기억을 시드(나중에 제거 가능)","onboarding.hintReset":"metadata.demo 태그가 있는 모든 항목 제거","onboarding.resetButton":"데모 제거","onboarding.resettingButton":"제거 중…","onboarding.demoLoadedTitle":"데모 데이터가 로드됨","onboarding.demoLoadedBody":"demo 태그가 있는 기억 {count}개가 있습니다. 여기서는 그 기억만 제거할 수 있습니다.","onboarding.resetConfirm":"metadata.demo 태그가 있는 모든 기억을 제거할까요? 동일한 행은 복원할 수 없지만 나중에 새 데모를 다시 불러올 수 있습니다. 실제 기억은 유지됩니다.","onboarding.resetReadbackFailed":"demo 태그 기억이 남아 있어 재설정을 확인하지 못했습니다. 정리 작업은 계속 표시됩니다. 다시 시도하거나 memesh doctor를 실행하세요.","onboarding.dismiss":"닫기","common.serverError":"서버가 오류를 반환했습니다 (HTTP {status}). 다시 시도해 보세요. 계속되면 `memesh doctor`를 실행하세요.","emptyLibrary.title":"메모리가 비어 있습니다","emptyLibrary.body":"아직 저장된 것이 없습니다. 30개 데모 투어를 불러와 MeMesh의 동작을 바로 확인해 보세요. 나중에 한 번에 삭제할 수 있습니다.","browse.truncated":"전체 {total}개 중 처음 {shown}개 표시 중 — 나머지는 검색이나 필터로 찾아보세요","browse.truncatedUnknownTotal":"처음 {shown}개 표시 중 — 전체 개수를 읽을 수 없어 더 있을 수 있습니다","graph.cappedNote":"전체 {total}개 중 상위 {shown}개만 표시 중(회상 횟수순). 그래프 반응성을 위해서입니다.","ageMatrix.bucket.week":"이번 주","ageMatrix.bucket.month":"이번 달","ageMatrix.bucket.quarter":"이번 분기","ageMatrix.bucket.older":"이전","settings.behaviourTitle":"동작 설정","settings.autoUpdateLabel":"자동 업데이트 정책","settings.autoUpdateOff":"끔 — 수동만","settings.autoUpdatePatch":"Patch — X.Y.Z+1 자동 적용","settings.autoUpdateMinor":"Minor — X.Y+1.0 자동 적용","settings.autoUpdateMajor":"Major — 모든 버전 변경 자동 적용","settings.autoUpdateHint":"처음 사용할 때 세션마다 한 번 동의를 확인합니다. MEMESH_AUTO_UPDATE는 허용 범위만 정하며 동의를 우회하지 않습니다.","errors.timeout":"요청 시간이 초과되었습니다","type.lesson_learned":"교훈","type.lesson":"교훈","type.mistake":"실수","type.decision":"결정","type.goal":"목표","type.architecture_decision":"아키 결정","type.design_decision":"디자인 결정","type.pattern":"패턴","type.technical_pattern":"기술 패턴","type.best_practice":"베스트 프랙티스","type.bug_fix":"버그 수정","type.verification_result":"검증 결과","type.test_result":"테스트 결과","type.process":"프로세스","type.architecture":"아키텍처","type.infrastructure":"인프라","type.feature":"기능","type.release":"릴리스","type.refactoring":"리팩터링","type.commit":"커밋","type.session_keypoint":"세션 요점","type.session_identity":"세션 정체성","type.session-insight":"세션 인사이트","type.session-summary":"세션 요약","type.session-identity":"세션 정체성","type.weekly_summary":"주간 요약","type.weekly-summary":"주간 요약","type.note":"노트","type.plan":"계획","type.knowledge":"지식","type.workflow_checkpoint":"워크플로 마일스톤","type.concept":"개념","type.tool":"도구","type.person":"인물","relation.relates_to":"관련","relation.related-to":"관련","relation.depends_on":"의존","relation.implements":"구현","relation.learned_from":"학습 출처","relation.supersedes":"대체","relation.contradicts":"모순","relation.follows":"후속","relation.belongs-to-project":"프로젝트 소속","relation.evidences":"근거","relation.co-created":"공동 생성","relation.shares-name-tokens":"이름 유사","patterns.day.0":"일요일","patterns.day.1":"월요일","patterns.day.2":"화요일","patterns.day.3":"수요일","patterns.day.4":"목요일","patterns.day.5":"금요일","patterns.day.6":"토요일","lessons.severity.critical":"치명적","lessons.severity.major":"중대","lessons.severity.minor":"경미","memory.tooltip.project":"프로젝트","memory.tooltip.recalled":"{count}회 회상됨","memory.tooltip.hasRelations":"{count}개 기억과 연결됨","memory.tooltip.createdAt":"생성: {date}","graph.layerLabel":"그래프 계층","graph.layerWork":"작업","graph.layerAll":"전체","graph.layerWorkHint":"저장된 결정, 교훈, 계획과 기록된 연결입니다.","graph.layerAllHint":"저장된 모든 기억과 기록된 연결입니다. 연결은 에이전트나 유지 관리 규칙이 추가할 수 있으며, 이 보기는 언어 모델을 호출하지 않습니다.","graph.layerFellBack":"작업 항목이 {min}개 미만이라 전체 그래프를 대신 표시합니다. 결정과 교훈을 기록하면 이 화면이 채워집니다.","graph.evidenceFor":"{node}의 근거","graph.evidenceClose":"닫기","graph.evidenceLoading":"근거를 불러오는 중…","graph.evidenceFailed":"이 항목의 근거를 불러오지 못했습니다.","graph.evidenceEmpty":"이 항목에는 아직 연결된 근거가 없습니다. `memesh kg backfill`을 실행하면 커밋과 세션 기록에서 연결을 만듭니다.","graph.evidenceTruncated":"최근 {shown}개를 표시합니다. 더 있습니다.","graph.drift":"신선도","graph.driftHint":"오래된 정도로 색상 표시: 빨강=오래됨, 초록=최근 사용","common.unknown":"알 수 없음","insights.entitiesCount":"엔터티 {n}개","roadmap.viewToggle":"프로젝트 이력 보기","roadmap.viewTree":"트리","roadmap.viewMindmap":"마인드맵","roadmap.mindmapNeedsPhases":"마인드맵에는 7일 이내의 기억이 3개 이상 필요합니다.","roadmap.activePhase":"진행 중","roadmap.entryCount":"{count}개","roadmap.entriesCount":"{count}개","roadmap.otherGroup":"기타 ({count})","roadmap.lowSignalHidden":"(저신호 {count}개 숨김)","roadmap.resetHint":"확대/축소 및 위치 재설정 (배경 더블 클릭도 가능)","roadmap.zoomHint":"스크롤로 확대/축소 · 드래그로 이동 · {pct}%","roadmap.moreEntities":"외 {count}개","roadmap.viewDecisions":"결정","roadmap.densityTitle":"카테고리별 캡처 밀도","roadmap.densityNote":"memesh가 캡처한 것일 뿐, 일어난 모든 일은 아닙니다","roadmap.lineageSupersedes":"대체됨 {n}개","roadmap.lineageConflicts":"미해결 충돌 {n}개","adr.empty":'이 프로젝트에는 아직 기록된 결정이 없습니다. 타입 "decision"으로 하나 기록하면 히스토리와 함께 여기에 표시됩니다.',"adr.statusActive":"현행","adr.statusSuperseded":"대체됨","adr.supersedes":"대체된 결정","adr.supersededBy":"대체한 결정","nav.ariaLabel":"대시보드 섹션","feedback.descLabel":"피드백 내용","graph.canvasA11y":"지식 그래프(캔버스): 엔터티 {entities}개, 관계 {relations}개, 미연결 {orphans}개. 위의 유형 필터와 검색으로 비시각적으로 볼 수 있습니다."},pt:{"auth.title":"Autenticação necessária","auth.intro":"Este painel é protegido por um token bearer. Cole o valor de MEMESH_REMOTE_TOKEN (ou o conteúdo de <memeshDir>/remote-token) abaixo.","auth.tokenLabel":"Token","auth.empty":"O token não pode estar vazio.","auth.invalid":"Esse token não foi aceito. Verifique e tente novamente.","auth.submit":"Desbloquear painel","auth.tokenPlaceholder":"cole o token aqui","brand.subtitle":"powered by pcircle.com","header.connected":"Conectado","header.disconnected":"Desconectado","header.connecting":"Conectando…","header.memories":"memórias","insights.title":"Sugestões de organização da memória","insights.reviewTitle":"Propostas de memória preparadas","insights.reviewSubtitle":"pacotes de trabalho aguardando revisão humana","insights.reviewSource":"Proposta preparada — revise antes de aplicar","insights.source.calendar":"Resumo por calendário","insights.source.transcript":"Transcrição do Claude Code","insights.reviewBoundary":"O Dashboard revisa propostas já preparadas. Ele não executa nem despacha agentes.","insights.statPending":"pendente","insights.statApplied":"aplicada","insights.statRejected":"rejeitada","insights.filter.pending":"Pendente","insights.filter.applied":"Aplicada","insights.filter.rejected":"Rejeitada","insights.filter.all":"Todos","insights.refresh":"Atualizar","insights.loading":"carregando…","insights.emptyOther":"Nada aqui.","insights.sources":"fontes","insights.status.pending":"pendente","insights.status.applied":"aplicada","insights.status.rejected":"rejeitada","insights.viewDetail":"Ver detalhes","insights.collapse":"Recolher","insights.accept":"Aceitar","insights.applying":"Aplicando…","insights.reject":"Rejeitar","insights.rejectConfirm":"Rejeitar este insight? Esta ação não pode ser desfeita.","insights.observations":"Observações resumidas","insights.tags":"Tags","insights.sourceIds":"Fontes","insights.validationWarnings":"Avisos de validação antigos","insights.validationClaim":"Afirmação","insights.validationReason":"Motivo","banner.pendingInsights":"{n} novo(s) insight{s} aguardando sua revisão →","banner.dismiss":"Dispensar","banner.viewAll":"Ver todos","pattern.title":"Pattern","pattern.evidenceCount":"{n} evidência(s)","pattern.severity":"Severidade","pattern.severity.high":"alta","pattern.severity.medium":"média","pattern.severity.low":"baixa","pattern.description":"Descrição do pattern","tab.graph":"Grafo","tab.settings":"Configurações","tab.home":"Início","tab.memories":"Memórias","tab.project":"Projeto","memories.searchPlaceholder":"Filtre enquanto digita — pressione Enter para busca por relevância","memories.scopeLabel":"Escopo","memories.scopeWork":"Camada de trabalho","memories.scopeEvidence":"Evidência","memories.scopeAll":"Todas","memories.scopeArchived":"Arquivadas","memories.composition":"Composição","memories.rankedBy":"ordenadas por relevância","memories.backToList":"Voltar à lista","memories.workEmpty":"Ainda não há memórias da camada de trabalho — metas, decisões, lições e planos aparecem aqui à medida que são capturados.","memories.showAll":"Mostrar todas as memórias","memories.expand":"Mostrar detalhes","memories.collapse":"Ocultar detalhes","memory.technicalDetails":"Detalhes técnicos","memory.canonicalName":"Nome canônico","memory.rawType":"Tipo bruto","home.analyticsTitle":"Análise","handoff.terminal":"Requer Terminal","handoff.terminalPrereq":"Execute na máquina onde o MeMesh está instalado. O Dashboard não executará o comando.","handoff.copyCommand":"Copiar comando","handoff.commandCopied":"Comando copiado","handoff.github":"Abre o GitHub — revise o issue preenchido antes de enviar","home.analyticsHint":"Saúde, linha do tempo, padrões e uso — expande sob demanda","home.nextAction.eyebrow":"Próxima etapa recomendada","home.nextAction.why":"Por quê:","home.nextAction.result":"Resultado esperado:","home.nextAction.loading.title":"Verificando o que precisa de atenção…","home.nextAction.loading.why":"O MeMesh está lendo a memória, o índice de busca e a fila de revisão atuais.","home.nextAction.loading.result":"Uma única recomendação aparecerá após as verificações.","home.nextAction.empty.title":"Adicione sua primeira memória","home.nextAction.empty.why":"A memória está vazia, portanto ainda não há o que buscar ou organizar.","home.nextAction.empty.result":"Em Memórias, carregue uma demonstração removível ou comece a registrar trabalho real.","home.nextAction.empty.action":"Abrir Memórias","insights.emptyPending":"Ainda não há revisões pendentes. Novas revisões de memória aparecerão aqui quando estiverem disponíveis.","home.nextAction.insights.title":"Revise sugestões de organização","home.nextAction.insights.why":"O MeMesh tem sugestões aguardando sua decisão.","home.nextAction.insights.result":"Aceite resumos úteis ou rejeite sugestões inadequadas.","home.nextAction.insights.action":"Revisar sugestões","home.nextAction.healthy.title":"Nenhuma ação necessária agora","home.nextAction.healthy.why":"Memória, índice e fila de revisão não têm ações conhecidas pendentes.","home.nextAction.healthy.result":"Continue trabalhando; o MeMesh mostrará aqui a próxima necessidade confirmada.","home.nextAction.unavailable.title":"Recomendação indisponível no momento","home.nextAction.unavailable.why":"Uma verificação não pôde ser lida, então o MeMesh não vai adivinhar.","home.nextAction.unavailable.result":"Recarregue para tentar novamente sem alterar memórias ou configurações.","home.nextAction.unavailable.action":"Tentar verificações novamente","project.selectLabel":"Projeto","project.selectPrompt":"Escolha um projeto para ver seu histórico.","project.empty":"Ainda não há memórias de projeto. Trabalhe em um repositório git com os hooks do memesh instalados e a história dele aparecerá aqui.","guard.sourceLesson":"Lição de origem","guard.pattern":"Padrão de disparo","guard.message":"Aviso que será exibido","guard.shouldMatch":"Deve disparar em","guard.shouldNotMatch":"Deve ficar em silêncio em","search.button":"Buscar","search.searching":"Buscando…","search.results":"resultados","search.result":"resultado","search.noResults":"Nenhum resultado para","search.facts":"fatos","browse.title":"Todas as Memórias","browse.active":"ativas","browse.archived":"arquivadas","browse.refresh":"Atualizar","browse.noMatch":"Nenhuma memória corresponde a","browse.prev":"← Anterior","browse.next":"Próximo →","browse.archive":"Arquivar","browse.restore":"Restaurar","browse.confirmArchive":"Arquivar esta memória?","browse.archiveFailed":"Não foi possível arquivar a memória: {message}","browse.restoreFailed":"Não foi possível restaurar a memória: {message}","analytics.totalMemories":"Total de Memórias","analytics.knowledgeFacts":"Fatos","analytics.connections":"Conexões","analytics.topics":"Tópicos","analytics.insights":"Insights","analytics.thisWeek":"Esta semana","analytics.new":"novas","analytics.stale":"Inativas (30+ dias sem uso)","analytics.archivedLabel":"Arquivadas","analytics.mostRecalled":"Mais Consultadas","health.title":"Saúde da Memória","metrics.notMeasured":"Ainda não medido","metrics.health":"Saúde","metrics.healthNote":"Atividade, qualidade, frescura, lições","metrics.critical":"Lições críticas","metrics.criticalPartial":"de {tagged} classificadas · {total} lições no total","metrics.criticalAll":"de {total} lições, todas classificadas","metrics.criticalUnclassified":"{total} lições, nenhuma classificada por severidade","metrics.criticalNoLessons":"Ainda não há lições registadas","metrics.citation":"Citações","metrics.citationNote":"{cited} de {total} sessões citaram uma memória","metrics.citationNotMeasured":"O registo de citações começa na próxima sessão","metrics.reused":"Reutilizadas esta semana","metrics.reusedNote":"Aproximado — contado pelas datas de último acesso","health.excellent":"Excelente","health.good":"Bom","health.fair":"Regular","health.poor":"Fraco","health.activity":"Atividade","health.quality":"Qualidade","health.freshness":"Frescor","health.lessons":"Auto-melhoria","timeline.title":"Últimos 30 Dias","timeline.created":"Criadas","timeline.recalled":"Recuperadas","value.totalRecalls":"Total de Recuperações","value.lessonsLearned":"Lições Aprendidas","value.lessonsSaved":"Lições Aplicadas","value.coverage":"Cobertura de Conhecimento","cleanup.title":"Sugestões de Limpeza","cleanup.allClean":"Sua memória está limpa. Nenhuma entidade obsoleta ou duplicada detectada.","cleanup.staleLabel":"Baixa confiança / não usado","cleanup.duplicateLabel":"Possíveis duplicatas","cleanup.confidence":"confiança","cleanup.unused":"não usado","cleanup.entityMeta":"{type} · confiança {confidence}% · {days}d sem uso","settings.saved":"Salvo.","settings.configReadbackFailed":"O servidor não retornou a configuração salva. Tente novamente.","settings.language":"Idioma","settings.interfaceLanguage":"Idioma da interface","settings.interfaceLanguageHint":"Altera imediatamente a interface neste navegador.","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":"Não há uma versão publicada 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.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.","settings.installationDetails":"Detalhes da instalação","settings.installationDetailsUnavailable":"Não é possível comparar versões nesta instalação.","settings.interfacePath":"Esta interface","settings.terminalPath":"Comando no terminal","settings.technicalDetails":"Detalhes técnicos","settings.installationDetailsHint":"Versões instaladas diferentes não exigem necessariamente uma atualização. Consulte Atualizações para ver as versões publicadas.","graph.entities":"Entidades","graph.relations":"Relações","graph.orphans":"Isoladas","graph.search":"Buscar nós…","graph.matches":"correspondências","graph.enterToOpen":"pressione Enter para abrir","graph.focusMode":"Foco","graph.showAll":"Mostrar tudo","graph.clickHint":"Clique em um nó para focar","graph.interactHint":"Clique num nó para focar · arraste área vazia para deslocar · role para zoom","graph.resetView":"Redefinir vista","graph.resetViewHint":"Redefinir zoom e posição","graph.ageToday":"hoje","graph.ageDaysAgo":"há {count}d","graph.ageWeeksAgo":"há {count} sem","lessons.error":"Erro","lessons.rootCause":"Causa Raiz","lessons.fix":"Correção","lessons.prevention":"Prevenção","feedback.button":"💬 Feedback","feedback.title":"Abrir feedback no GitHub","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…","feedback.popupBlocked":"O GitHub não abriu. Seu rascunho foi preservado; permita pop-ups, tente novamente ou copie o link preparado.","feedback.retry":"Tentar abrir o GitHub novamente","feedback.copyLink":"Copiar link do GitHub","feedback.linkCopied":"Link copiado","feedback.copyFailed":"Não foi possível copiar o link. Tente abrir o GitHub novamente.","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","doctorBanner.fix":"Corrigir automaticamente","doctorBanner.fixInProgress":"Corrigindo…","doctorBanner.fixDone":"Corrigido","doctorBanner.restartRequired":"Reinicie o agente para concluir esta atualização.","doctor.label.readme_locale_parity":"Traduções do README","doctor.label.config":"Arquivo de configuração","doctor.label.mcp-config":"Arquivo de conexão MCP","doctor.label.hooks-config":"Definições de hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Conexão com o Claude Code","doctor.label.hook-activity":"Captura automática","doctor.label.node-runtime":"Versão do Node.js","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Código do plugin está atual","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.install-channel":"Método de instalação","doctor.label.fts_segmentation":"Índice de palavras-chave","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 (.claude-plugin/mcp.json) está faltando.","doctor.msg.mcp-config.missing.fix":"Reinstale o MeMesh para restaurá-lo.","doctor.msg.mcp-config.invalid-json.summary":"O .claude-plugin/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 .claude-plugin/mcp.json não contém mais a entrada do servidor memesh.","doctor.msg.mcp-config.no-entry.fix":"Reinstale o MeMesh para restaurá-la.","doctor.msg.mcp-config.entry-missing.summary":"O `.claude-plugin/mcp.json` inicia um arquivo que não existe nesta instalação, então nenhuma ferramenta do memesh dentro do Claude Code consegue iniciar.","doctor.msg.mcp-config.entry-missing.fix":"Reinstale o MeMesh. Se você editou o `.claude-plugin/mcp.json` à mão, aponte-o de volta para `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.mcp-config.placeholder-unresolved.summary":"NÃO VERIFICADO: o `.claude-plugin/mcp.json` inicia um caminho que contém `${CLAUDE_PLUGIN_ROOT}`, uma variável que só o runtime de plugins do Claude Code preenche. Esta cópia não está sendo executada como plugin, então o arquivo indicado não foi conferido.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Confira do mesmo jeito que o runtime de plugins faria: execute `CLAUDE_PLUGIN_ROOT=<a pasta desta instalação> memesh doctor`.","doctor.msg.hooks-config.missing.summary":"O hooks/hooks.json está faltando, então a captura automática de memória não funciona.","doctor.msg.hooks-config.missing.fix":"Reinstale o MeMesh para restaurá-lo.","doctor.msg.hooks-config.invalid-json.summary":"O hooks/hooks.json está danificado (não é um JSON válido).","doctor.msg.hooks-config.invalid-json.fix":"Corrija {path} ou reinstale o MeMesh.","doctor.msg.hooks-config.missing-types.summary":"O hooks/hooks.json não tem estes tipos de hook: {types}. Parte da captura automática não vai rodar.","doctor.msg.hooks-config.missing-types.fix":"Restaure a configuração de hooks original ou reinstale o MeMesh.","doctor.msg.hook-scripts.none.summary":"A configuração de hooks não tem nenhum script, então nada pode ser capturado automaticamente.","doctor.msg.hook-scripts.none.fix":"Reinstale o MeMesh.","doctor.msg.hook-scripts.missing.summary":"Estes scripts de hook estão faltando: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstale o MeMesh para restaurá-los.","doctor.msg.hook-scripts.not-executable.summary":"Estes scripts de hook existem, mas não têm permissão para executar: {files}","doctor.msg.hook-scripts.not-executable.fix":"Execute `chmod +x scripts/hooks/*.js`, ou `npm run build` se estiver usando o código-fonte.","doctor.msg.hook-wiring.no-marker.summary":"O memesh ainda não está conectado ao Claude Code, então nada é lembrado automaticamente.","doctor.msg.hook-wiring.no-marker.fix":"Execute `memesh install-hooks` uma vez e depois `memesh doctor` para confirmar.","doctor.msg.hook-wiring.script-missing.summary":"Um hook memesh ligado aponta para {path}, que já não existe — o agente invoca um ficheiro inexistente em cada evento correspondente. Normalmente é resíduo de um upgrade que aposentou o hook.","doctor.msg.hook-wiring.script-missing.fix":"Execute `memesh install-hooks` para religar (remove entradas aposentadas) e reinicie o agente.","doctor.msg.hook-wiring.marker-unreadable.summary":"O registro de conexão em {path} não pode ser lido.","doctor.msg.hook-wiring.marker-unreadable.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.marker-malformed.summary":"O registro de conexão está danificado.","doctor.msg.hook-wiring.marker-malformed.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.settings-missing.summary":"O arquivo de configurações do Claude Code ({path}) sumiu, então a conexão está quebrada.","doctor.msg.hook-wiring.settings-missing.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} está danificado (não é um JSON válido).","doctor.msg.hook-wiring.settings-invalid.fix":"Restaure de um backup, ou execute `memesh install-hooks` para recriá-lo.","doctor.msg.hook-wiring.entries-removed.summary":"As entradas do memesh foram removidas de {path}, então a conexão está quebrada.","doctor.msg.hook-wiring.entries-removed.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.root-moved.summary":"A conexão aponta para {path}, que não existe mais (o memesh provavelmente foi movido).","doctor.msg.hook-wiring.root-moved.fix":"Execute `memesh install-hooks` para atualizá-la.","doctor.msg.hook-activity.never-ran.summary":"Nenhum hook de captura foi executado nas {hours} horas desde que o acompanhamento começou, mesmo com a ligação dos hooks no lugar — nada está a ser guardado.","doctor.msg.hook-activity.never-ran.fix":"Termine uma sessão de trabalho e execute `memesh doctor` outra vez. Se continuar a dizer que nenhum hook correu, execute `memesh install-hooks` e reinicie o agente.","doctor.msg.hook-activity.stale.summary":"O último hook de captura correu há cerca de {hours} horas ({hook}). Se trabalhou desde então, a captura parou e nada dessas sessões foi guardado.","doctor.msg.hook-activity.stale.fix":"Reinicie o agente, termine uma sessão e execute `memesh doctor` outra vez. Se não recuperar, execute `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"O hook session-summary executou pela última vez há cerca de {hours} horas, e nenhuma escrita do Claude Code chegou nos últimos 3 dias. Se esta máquina passou a usar outro agente (Codex / Gemini), isto é esperado; se você ainda usa Claude Code aqui, a captura parou.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Se você ainda usa Claude Code nesta máquina: reinicie-o, termine uma sessão e execute `memesh doctor` de novo. Se não recuperar, execute `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Não foi possível ler a atividade dos hooks na base de dados: {detail}. O estado da captura é desconhecido, o que não é o mesmo que saudável.","doctor.msg.hook-activity.query-failed.fix":"Execute `memesh doctor --verbose` para ver o erro completo e verifique que ~/.memesh é legível e que há espaço em disco.","doctor.msg.hook-activity.stale-unknown.summary":'O timestamp da última execução do hook {hook} não pode ser lido (corrompido, ou gravado por uma máquina com relógio errado). O estado da captura é "desconhecido", o que não é o mesmo que "saudável".',"doctor.msg.hook-activity.stale-unknown.fix":"Termine uma sessão de trabalho e execute `memesh doctor` de novo — uma execução nova sobrescreve o timestamp inválido.","doctor.msg.hook-activity.disabled.summary":"A captura automática está desligada (MEMESH_AUTO_CAPTURE ou autoCapture na configuração) — deliberadamente, então o silêncio dos hooks é esperado. Reative para voltar a capturar sessões.","doctor.msg.hook-activity.disabled-env.summary":"A captura automática está desligada por MEMESH_AUTO_CAPTURE=false no ambiente deste shell. O doctor só enxerga o próprio ambiente — se o seu agente roda sem esta variável, a captura lá não é afetada.","doctor.msg.hook-activity.not-wired.summary":"Nenhum hook de captura jamais executou — e nenhum hook de captura (Stop / PostToolUse / PreCompact) está confirmado como ligado nesta máquina, então não há nada para executar.","doctor.msg.hook-activity.not-wired.fix":"Se quiser captura automática, execute `memesh install-hooks`. Se esta instalação é só MCP (Codex / Gemini), isto é esperado e pode ser ignorado.","doctor.msg.hook-activity.stop-silent.summary":"O hook {hook} está registando, mas o hook session-summary nunca executou nas {hours} horas desde que o rastreamento começou — a captura de sessões pode estar quebrada, escondida pela captura de commits.","doctor.msg.hook-activity.stop-silent.fix":"Termine uma sessão de trabalho e execute `memesh doctor` de novo. Se o session-summary continuar sem executar, execute `memesh install-hooks` e reinicie o agente.","doctor.msg.hook-activity.never-ran-legacy.summary":"Nenhum hook registou o heartbeat, mas {captured} memórias de captura automática chegaram desde que o rastreamento começou — hooks de uma versão anterior ao rastreamento provavelmente ainda estão a executar.","doctor.msg.hook-activity.never-ran-legacy.fix":"Atualize os hooks do memesh para a versão atual (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) e reinicie o agente.","doctor.msg.node-runtime.too-old.summary":"Seu Node.js é mais antigo do que este pacote suporta. {detail}","doctor.msg.node-runtime.too-old.fix":"Atualize o Node.js para {required} ou mais novo e execute `memesh doctor` de novo.","doctor.msg.native-binding.load-failed.summary":"O SQLite não conseguiu abrir o banco de dados: {detail}.","doctor.msg.native-binding.load-failed.fix":"Verifique o ambiente Node e reinstale o MeMesh se necessário.","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` se quiser um comando de terminal separado. O banco de dados dele depende da configuração.","doctor.msg.shell-cli.versions.summary":"Versões instaladas: esta interface {current}; terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"O plugin foi instalado a partir do commit {installed}, mas o marketplace avançou para {marketplace} com a mesma versão. O {host} não atualiza um cache cuja versão não mudou, então você está executando código mais antigo que o do marketplace.","doctor.msg.plugin-cache.stale.fix":"Execute `{command}` para atualizar o cache e depois reinicie o {host}.","doctor.msg.plugin-cache.unverifiable.summary":"Não foi possível saber se o plugin instalado corresponde ao marketplace. Só a versão não responde isso — dois builds podem ter a mesma versão.","doctor.msg.plugin-cache.unverifiable.fix":"Execute `{command}` uma vez; ele registra o commit e esta verificação passa a responder.","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.config-parse.retired-settings.summary":"O arquivo de configuração válido em {path} ainda contém {count} configurações de nível superior desativadas ({keys}). Esta versão as ignora, mas credenciais ou configurações antigas de provedores podem continuar no disco.","doctor.msg.config-parse.retired-settings.fix":"Revise {path} localmente e remova somente essas chaves de nível superior desativadas. Não cole o arquivo em uma issue, pois ele pode conter credenciais. Depois, execute memesh doctor novamente.","doctor.msg.message-capability.probe-failed.summary":"A verificação do recurso de mensagens instalado falhou: {detail}.","doctor.msg.message-router.socket-missing.summary":"Não há socket do router Local em {path}; sessões paradas ou ausentes não serão despertadas.","doctor.msg.message-router.socket-insecure.summary":"O socket do router em {path} não é um socket Unix privado do proprietário.","doctor.msg.message-router.socket-unreachable.summary":"O socket privado do router em {path} existe, mas não aceitou uma conexão local.","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.citation.none.summary":"As sessões receberam memórias injetadas, mas nenhuma foi citada.","doctor.msg.citation.none.fix":"Verifique o contrato de citação em ~/.claude/rules/memesh-citations.md e reavalie após algumas sessões.","doctor.msg.database.broken.summary":"O banco de dados não está utilizável: {detail}","doctor.update_status.prerelease":"Executando a versão de pré-lançamento ({current}); a versão latest do npm é {latest}.","patterns.title":"Seus Padrões","patterns.workSchedule":"Agenda de Trabalho","patterns.peakHours":"Horários de pico","patterns.busiestDays":"Dias mais movimentados","patterns.workflow":"Fluxo de Trabalho","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.auth.cross-origin":"Esta requisição veio de outro site, ou chegou ao servidor com um nome inesperado, e foi recusada. Abra o painel pelo endereço que o `memesh serve` imprimiu.","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.rate.limited":"Muitas solicitações em pouco tempo. Aguarde um momento e tente novamente.","httpError.server.internal":"O servidor encontrou um erro inesperado.","time.justNow":"Agora","time.hoursAgo":"Há {count}h","time.today":"Hoje","time.yesterday":"Ontem","time.daysAgo":"Há {count}d","time.lastWeek":"Semana passada","time.weeksAgo":"Há {count}sem","time.lastMonth":"Mês passado","time.monthsAgo":"Há {count}m","memory.access.frequent":"Frequente · {count} usos","memory.access.recalls":"{count} usos","memory.access.never":"Nunca usado","cluster.knowledge":"Conhecimento","cluster.activity":"Atividade","cluster.session":"Sessões","cluster.reference":"Referência","cluster.all":"Todos","browse.filterTime":"Tempo","browse.filterValue":"Valor","browse.filterProject":"Projeto","browse.filterSort":"Ordenar","browse.timeToday":"Hoje","browse.timeWeek":"Esta semana","browse.timeMonth":"Este mês","browse.timeOlder":"Mais antigo","browse.valueRecalled":"✓ Usado","browse.valueNever":"Nunca usado","browse.sortMostRecalled":"Mais usado","browse.sortRecent":"Recente","browse.sortCreated":"Criado em","browse.emptyFilter":"Sem memórias nesta categoria — tente outro filtro","lessons.stepsLabel":"passos","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Sem campos estruturados — ver memória bruta)","lessons.moreItems":"+{count} mais","roadmap.title":"Histórico do Projeto","roadmap.summary":"{count} memórias · {first} → {last}","roadmap.switchToList":"↩ Lista","roadmap.switchToRoadmap":"🕘 Histórico","roadmap.emptyProject":"Sem memórias neste projeto ainda.","loop.label":"Loop de memória","loop.subtitleHas":"memórias de conhecimento reutilizadas nos últimos 7 dias","loop.subtitleNone":"Nenhuma memória de conhecimento reutilizada esta semana","loop.approxNote":"Aproximação — rastreamento completo começa após atualização.","loop.sparkLabel":"Últimos 30 dias","roadmap.milestones":"Marcos","roadmap.keyLessons":"Lições principais","radar.title":"Radar de cobertura","radar.caption":"Memórias de conhecimento ativas (session e commit excluídos)","radar.axis.lessons":"Lições","radar.axis.decisions":"Decisões","radar.axis.patterns":"Padrões","radar.axis.bugs":"Correções","radar.axis.processes":"Processos","radar.axis.architecture":"Arquitetura","ageMatrix.title":"Distribuição de idade","ageMatrix.low":"Baixa","ageMatrix.high":"Alta","ageMatrix.legend":"profundidade da cor = densidade","ageMatrix.typeColumn":"Tipo","header.signalModeOn":"Memórias essenciais","header.signalModeOff":"Todas as memórias","header.signalModeOnHint":"Mostra metas, decisões, lições e planos; oculta registros automáticos de session, commit e atividade em Memórias e Grafo de Conhecimento.","header.signalModeOffHint":"Mostra todos os registros, inclusive session, commit e atividade capturados automaticamente, em Memórias e Grafo de Conhecimento.","globalFilter.focusedStatus":"Visão global: Memórias essenciais — registros automáticos de session, commit e atividade ficam ocultos em Memórias e Grafo de Conhecimento.","globalFilter.allStatus":"Visão global: Todas as memórias — registros automáticos de session, commit e atividade são incluídos em Memórias e Grafo de Conhecimento.","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.coreHint":"Memória local: remember, busca FTS5 por palavras-chave, hooks e navegação no Dashboard funcionam em conjunto.","onboarding.searchHint":"A recuperação usa busca local por palavras-chave com FTS5.","onboarding.reviewHint":"Um agente já em execução pode preparar um pacote de resumo ou transcrição visível; o Dashboard apenas revisa a proposta preparada.","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.demoLoadedTitle":"Dados de demonstração carregados","onboarding.demoLoadedBody":"Há {count} memórias marcadas como demo. Aqui você pode remover somente essas memórias.","onboarding.resetConfirm":"Remover todas as memórias com a marca metadata.demo? As mesmas linhas não podem ser restauradas, mas você pode carregar uma nova demo depois. Memórias reais serão mantidas.","onboarding.resetReadbackFailed":"Não foi possível confirmar a redefinição porque ainda há memórias de demo. A ação de limpeza permanece disponível; tente novamente ou execute memesh doctor.","onboarding.dismiss":"Fechar","common.serverError":"O servidor retornou um erro (HTTP {status}). Tente novamente — se persistir, execute `memesh doctor`.","emptyLibrary.title":"Sua memória está vazia","emptyLibrary.body":"Nada foi armazenado ainda. Carregue o tour de demonstração com 30 entradas para ver o MeMesh em ação — você pode apagá-lo depois com um clique.","browse.truncated":"mostrando as primeiras {shown} de {total} memórias — use a busca ou os filtros para alcançar o restante","browse.truncatedUnknownTotal":"mostrando as primeiras {shown} memórias — o total está indisponível, então pode haver mais","graph.cappedNote":"Mostrando as {shown} principais de {total} entidades (mais recuperadas primeiro) para manter o grafo responsivo.","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":"Na primeira utilização, pede consentimento uma vez por sessão. MEMESH_AUTO_UPDATE define o limite, mas nunca ignora o consentimento.","errors.timeout":"A solicitação expirou","type.lesson_learned":"Lição","type.lesson":"Lição","type.mistake":"Erro","type.decision":"Decisão","type.goal":"Objetivo","type.architecture_decision":"Decisão arq.","type.design_decision":"Decisão de design","type.pattern":"Padrão","type.technical_pattern":"Padrão técnico","type.best_practice":"Melhor prática","type.bug_fix":"Correção","type.verification_result":"Verificação","type.test_result":"Resultado de teste","type.process":"Processo","type.architecture":"Arquitetura","type.infrastructure":"Infraestrutura","type.feature":"Funcionalidade","type.release":"Lançamento","type.refactoring":"Refatoração","type.commit":"Commit","type.session_keypoint":"Ponto da sessão","type.session_identity":"Identidade da sessão","type.session-insight":"Insight da sessão","type.session-summary":"Resumo da sessão","type.session-identity":"Identidade da sessão","type.weekly_summary":"Resumo semanal","type.weekly-summary":"Resumo semanal","type.note":"Nota","type.plan":"Plano","type.knowledge":"Conhecimento","type.workflow_checkpoint":"Checkpoint","type.concept":"Conceito","type.tool":"Ferramenta","type.person":"Pessoa","relation.relates_to":"relaciona-se com","relation.related-to":"relacionado a","relation.depends_on":"depende de","relation.implements":"implementa","relation.learned_from":"aprendido de","relation.supersedes":"substitui","relation.contradicts":"contradiz","relation.follows":"segue","relation.belongs-to-project":"pertence ao projeto","relation.evidences":"evidencia","relation.co-created":"cocriado","relation.shares-name-tokens":"nomes semelhantes","patterns.day.0":"domingo","patterns.day.1":"segunda","patterns.day.2":"terça","patterns.day.3":"quarta","patterns.day.4":"quinta","patterns.day.5":"sexta","patterns.day.6":"sábado","lessons.severity.critical":"Crítico","lessons.severity.major":"Grave","lessons.severity.minor":"Menor","memory.tooltip.project":"Projeto","memory.tooltip.recalled":"Recuperado {count} vezes","memory.tooltip.hasRelations":"Ligado a {count} outras memórias","memory.tooltip.createdAt":"Criado em {date}","graph.layerLabel":"Camada do grafo","graph.layerWork":"Trabalho","graph.layerAll":"Tudo","graph.layerWorkHint":"Decisões, lições e planos salvos, com seus links registrados.","graph.layerAllHint":"Todas as memórias salvas e seus links registrados. Os links podem ser adicionados por agentes ou regras de manutenção; esta visualização não chama um modelo de linguagem.","graph.layerFellBack":"Menos de {min} itens de trabalho até agora, por isso mostramos o grafo completo. Registe decisões e lições e esta vista preenche-se.","graph.evidenceFor":"Evidências de {node}","graph.evidenceClose":"Fechar","graph.evidenceLoading":"A carregar evidências…","graph.evidenceFailed":"Não foi possível carregar as evidências deste item.","graph.evidenceEmpty":"Ainda não há evidências ligadas a este item. Execute `memesh kg backfill` para criar essas ligações a partir de commits e capturas de sessão.","graph.evidenceTruncated":"A mostrar as {shown} mais recentes; existem mais.","graph.drift":"Frescor","graph.driftHint":"Colore os nós pela idade: vermelho = antigo, verde = usado recentemente","common.unknown":"desconhecido","insights.entitiesCount":"{n} entidades","roadmap.viewToggle":"Vista do histórico do projeto","roadmap.viewTree":"Árvore","roadmap.viewMindmap":"Mapa mental","roadmap.mindmapNeedsPhases":"O mapa mental precisa de pelo menos 3 memórias numa janela de 7 dias.","roadmap.activePhase":"ativa","roadmap.entryCount":"{count} entrada","roadmap.entriesCount":"{count} entradas","roadmap.otherGroup":"Outros ({count})","roadmap.lowSignalHidden":"({count} de baixo sinal ocultas)","roadmap.resetHint":"Redefinir zoom e posição (duplo clique no fundo também redefine)","roadmap.zoomHint":"role para zoom · arraste para mover · {pct}%","roadmap.moreEntities":"+{count} mais","roadmap.viewDecisions":"Decisões","roadmap.densityTitle":"Densidade de captura por categoria","roadmap.densityNote":"o que o memesh capturou — não tudo o que aconteceu","roadmap.lineageSupersedes":"{n} substituídas","roadmap.lineageConflicts":"{n} conflitos não resolvidos","adr.empty":'Nenhuma decisão registrada neste projeto ainda. Registre uma com o tipo "decision" e ela aparece aqui com seu histórico.',"adr.statusActive":"ativa","adr.statusSuperseded":"substituída","adr.supersedes":"substitui","adr.supersededBy":"substituída por","nav.ariaLabel":"Seções do painel","feedback.descLabel":"Descrição do feedback","graph.canvasA11y":"Grafo de conhecimento (em canvas): {entities} entidades, {relations} relações, {orphans} sem ligação. Use os filtros de tipo e a busca acima para uma visão não visual."},fr:{"auth.title":"Authentification requise","auth.intro":"Ce tableau de bord est protégé par un jeton bearer. Collez la valeur de MEMESH_REMOTE_TOKEN (ou le contenu de <memeshDir>/remote-token) ci-dessous.","auth.tokenLabel":"Jeton","auth.empty":"Le jeton ne peut pas être vide.","auth.invalid":"Ce jeton n'a pas été accepté. Vérifiez-le et réessayez.","auth.submit":"Déverrouiller le tableau de bord","auth.tokenPlaceholder":"collez le jeton ici","brand.subtitle":"powered by pcircle.com","header.connected":"Connecté","header.disconnected":"Déconnecté","header.connecting":"Connexion…","header.memories":"mémoires","insights.title":"Suggestions d’organisation de la mémoire","insights.reviewTitle":"Propositions mémoire préparées","insights.reviewSubtitle":"paquets de travail en attente d’une revue humaine","insights.reviewSource":"Proposition préparée — examinez-la avant application","insights.source.calendar":"Résumé calendaire","insights.source.transcript":"Transcription Claude Code","insights.reviewBoundary":"Le Dashboard examine les propositions déjà préparées. Il ne lance ni ne dépêche un agent.","insights.statPending":"en attente","insights.statApplied":"appliquée","insights.statRejected":"rejetée","insights.filter.pending":"En attente","insights.filter.applied":"Appliquée","insights.filter.rejected":"Rejetée","insights.filter.all":"Tous","insights.refresh":"Actualiser","insights.loading":"chargement…","insights.emptyOther":"Rien ici.","insights.sources":"sources","insights.status.pending":"en attente","insights.status.applied":"appliquée","insights.status.rejected":"rejetée","insights.viewDetail":"Voir le détail","insights.collapse":"Réduire","insights.accept":"Accepter","insights.applying":"Application…","insights.reject":"Rejeter","insights.rejectConfirm":"Rejeter cette analyse ? Cette action est irréversible.","insights.observations":"Observations résumées","insights.tags":"Tags","insights.sourceIds":"Sources","insights.validationWarnings":"Avertissements de validation hérités","insights.validationClaim":"Affirmation","insights.validationReason":"Raison","banner.pendingInsights":"{n} nouveau(x) insight{s} en attente de revue →","banner.dismiss":"Ignorer","banner.viewAll":"Tout voir","pattern.title":"Pattern","pattern.evidenceCount":"{n} preuve(s)","pattern.severity":"Sévérité","pattern.severity.high":"élevée","pattern.severity.medium":"moyenne","pattern.severity.low":"faible","pattern.description":"Description du pattern","tab.graph":"Graphe","tab.settings":"Paramètres","tab.home":"Accueil","tab.memories":"Mémoires","tab.project":"Projet","memories.searchPlaceholder":"Filtrez en tapant — appuyez sur Entrée pour une recherche par pertinence","memories.scopeLabel":"Portée","memories.scopeWork":"Couche de travail","memories.scopeEvidence":"Preuves","memories.scopeAll":"Toutes","memories.scopeArchived":"Archivées","memories.composition":"Composition","memories.rankedBy":"classées par pertinence","memories.backToList":"Retour à la liste","memories.workEmpty":"Pas encore de mémoires de la couche de travail — objectifs, décisions, leçons et plans arrivent ici à mesure qu'ils sont capturés.","memories.showAll":"Afficher toutes les mémoires","memories.expand":"Afficher les détails","memories.collapse":"Masquer les détails","memory.technicalDetails":"Détails techniques","memory.canonicalName":"Nom canonique","memory.rawType":"Type brut","home.analyticsTitle":"Analyse","handoff.terminal":"Terminal requis","handoff.terminalPrereq":"Exécutez ceci sur la machine où MeMesh est installé. Le Dashboard ne l’exécutera pas.","handoff.copyCommand":"Copier la commande","handoff.commandCopied":"Commande copiée","handoff.github":"Ouvre GitHub — vérifiez le ticket prérempli avant envoi","home.analyticsHint":"Santé, chronologie, patterns et utilisation — se déploie à la demande","home.nextAction.eyebrow":"Prochaine étape recommandée","home.nextAction.why":"Pourquoi :","home.nextAction.result":"Résultat attendu :","home.nextAction.loading.title":"Vérification des éléments à traiter…","home.nextAction.loading.why":"MeMesh lit l’état actuel des mémoires, de l’index et de la file de révision.","home.nextAction.loading.result":"Une seule recommandation apparaîtra après ces vérifications.","home.nextAction.empty.title":"Ajoutez votre première mémoire","home.nextAction.empty.why":"La bibliothèque est vide ; rien ne peut encore être recherché ou organisé.","home.nextAction.empty.result":"La page Mémoires permet de charger une démo supprimable ou de capturer du travail réel.","home.nextAction.empty.action":"Ouvrir Mémoires","insights.emptyPending":"Aucune révision en attente pour le moment. Les nouvelles révisions de mémoire apparaîtront ici.","home.nextAction.insights.title":"Révisez les suggestions d’organisation","home.nextAction.insights.why":"MeMesh a des suggestions qui attendent votre décision.","home.nextAction.insights.result":"Acceptez les résumés utiles ou refusez les suggestions inadaptées.","home.nextAction.insights.action":"Réviser les suggestions","home.nextAction.healthy.title":"Aucune action nécessaire maintenant","home.nextAction.healthy.why":"Les mémoires, l’index et la file de révision n’ont aucune action connue en attente.","home.nextAction.healthy.result":"Continuez à travailler ; MeMesh affichera ici le prochain besoin confirmé.","home.nextAction.unavailable.title":"Recommandation indisponible","home.nextAction.unavailable.why":"Une vérification est illisible ; MeMesh ne va donc pas deviner.","home.nextAction.unavailable.result":"Rechargez pour réessayer sans modifier les mémoires ni les réglages.","home.nextAction.unavailable.action":"Relancer les vérifications","project.selectLabel":"Projet","project.selectPrompt":"Choisissez un projet pour voir son historique.","project.empty":"Pas encore de mémoires de projet. Travaillez dans un dépôt git avec les hooks memesh installés et son histoire apparaîtra ici.","guard.sourceLesson":"Leçon d'origine","guard.pattern":"Motif de déclenchement","guard.message":"Avertissement affiché","guard.shouldMatch":"Doit se déclencher sur","guard.shouldNotMatch":"Doit rester silencieux sur","search.button":"Rechercher","search.searching":"Recherche…","search.results":"résultats","search.result":"résultat","search.noResults":"Aucun résultat pour","search.facts":"faits","browse.title":"Toutes les mémoires","browse.active":"actives","browse.archived":"archivées","browse.refresh":"Actualiser","browse.noMatch":"Aucune mémoire correspondant à","browse.prev":"← Précédent","browse.next":"Suivant →","browse.archive":"Archiver","browse.restore":"Restaurer","browse.confirmArchive":"Archiver cette mémoire ?","browse.archiveFailed":"Impossible d’archiver la mémoire : {message}","browse.restoreFailed":"Impossible de restaurer la mémoire : {message}","analytics.totalMemories":"Total des mémoires","analytics.knowledgeFacts":"Faits de connaissance","analytics.connections":"Connexions","analytics.topics":"Sujets","analytics.insights":"Aperçus","analytics.thisWeek":"Cette semaine","analytics.new":"nouvelles","analytics.stale":"Inactives (30+ jours sans utilisation)","analytics.archivedLabel":"Archivées","analytics.mostRecalled":"Les plus consultées","health.title":"Santé de la mémoire","metrics.notMeasured":"Pas encore mesuré","metrics.health":"Santé","metrics.healthNote":"Activité, qualité, fraîcheur, leçons","metrics.critical":"Leçons critiques","metrics.criticalPartial":"sur {tagged} classées · {total} leçons au total","metrics.criticalAll":"sur {total} leçons, toutes classées","metrics.criticalUnclassified":"{total} leçons, aucune classée par gravité","metrics.criticalNoLessons":"Aucune leçon enregistrée pour le moment","metrics.citation":"Citations","metrics.citationNote":"{cited} sessions sur {total} ont cité une mémoire","metrics.citationNotMeasured":"Le suivi des citations démarre à la prochaine session","metrics.reused":"Réutilisées cette semaine","metrics.reusedNote":"Approximatif — d'après les dates de dernier accès","health.excellent":"Excellent","health.good":"Bon","health.fair":"Moyen","health.poor":"Faible","health.activity":"Activité","health.quality":"Qualité","health.freshness":"Fraîcheur","health.lessons":"Auto-amélioration","timeline.title":"30 derniers jours","timeline.created":"Créés","timeline.recalled":"Rappelés","value.totalRecalls":"Total des rappels","value.lessonsLearned":"Leçons apprises","value.lessonsSaved":"Leçons appliquées","value.coverage":"Couverture des connaissances","cleanup.title":"Suggestions de nettoyage","cleanup.allClean":"Votre mémoire est propre. Aucune entité obsolète ou en double détectée.","cleanup.staleLabel":"Faible confiance / non utilisé","cleanup.duplicateLabel":"Doublons possibles","cleanup.confidence":"confiance","cleanup.unused":"non utilisé","cleanup.entityMeta":"{type} · confiance {confidence}% · {days} j sans usage","settings.saved":"Enregistré.","settings.configReadbackFailed":"Le serveur n’a pas renvoyé le réglage enregistré. Réessayez.","settings.language":"Langue","settings.interfaceLanguage":"Langue de l’interface","settings.interfaceLanguageHint":"Modifie immédiatement l’interface dans ce navigateur.","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":"Aucune version publiée plus récente","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.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.","settings.installationDetails":"Détails de l’installation","settings.installationDetailsUnavailable":"La comparaison des versions n’est pas disponible pour cette installation.","settings.interfacePath":"Cette interface","settings.terminalPath":"Commande de terminal","settings.technicalDetails":"Détails techniques","settings.installationDetailsHint":"Des versions installées différentes ne nécessitent pas forcément une mise à jour. Consultez Mises à jour pour voir les versions publiées.","graph.entities":"Entités","graph.relations":"Relations","graph.orphans":"Orphelins","graph.search":"Rechercher des nœuds…","graph.matches":"correspondances","graph.enterToOpen":"appuyez sur Entrée pour ouvrir","graph.focusMode":"Focus","graph.showAll":"Tout afficher","graph.clickHint":"Cliquez sur un nœud pour le cibler","graph.interactHint":"Cliquez sur un nœud pour cibler · glissez une zone vide pour déplacer · molette pour zoomer","graph.resetView":"Réinitialiser la vue","graph.resetViewHint":"Réinitialiser zoom et position","graph.ageToday":"aujourd’hui","graph.ageDaysAgo":"il y a {count} j","graph.ageWeeksAgo":"il y a {count} sem.","lessons.error":"Erreur","lessons.rootCause":"Cause racine","lessons.fix":"Correction","lessons.prevention":"Prévention","feedback.button":"💬 Retour","feedback.title":"Ouvrir le retour sur GitHub","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…","feedback.popupBlocked":"GitHub ne s’est pas ouvert. Votre brouillon est conservé ; autorisez les fenêtres contextuelles, réessayez ou copiez le lien préparé.","feedback.retry":"Réessayer d’ouvrir GitHub","feedback.copyLink":"Copier le lien GitHub","feedback.linkCopied":"Lien copié","feedback.copyFailed":"Impossible de copier le lien. Réessayez d’ouvrir GitHub.","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","doctorBanner.fix":"Réparer automatiquement","doctorBanner.fixInProgress":"Réparation…","doctorBanner.fixDone":"Réparé","doctorBanner.restartRequired":"Redémarrez l’agent pour terminer cette mise à jour.","doctor.label.readme_locale_parity":"Traductions du README","doctor.label.config":"Fichier de configuration","doctor.label.mcp-config":"Fichier de connexion MCP","doctor.label.hooks-config":"Définitions des hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Connexion à Claude Code","doctor.label.hook-activity":"Capture automatique","doctor.label.node-runtime":"Version de Node.js","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Code du plugin à jour","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.install-channel":"Méthode d'installation","doctor.label.fts_segmentation":"Index de mots-clés","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 (.claude-plugin/mcp.json) est introuvable.","doctor.msg.mcp-config.missing.fix":"Réinstallez MeMesh pour le restaurer.","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/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":".claude-plugin/mcp.json ne contient plus l'entrée du serveur memesh.","doctor.msg.mcp-config.no-entry.fix":"Réinstallez MeMesh pour la restaurer.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` démarre un fichier absent de cette installation, donc aucun outil memesh dans Claude Code ne peut démarrer.","doctor.msg.mcp-config.entry-missing.fix":"Réinstallez MeMesh. Si vous avez modifié `.claude-plugin/mcp.json` à la main, refaites-le pointer vers `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.mcp-config.placeholder-unresolved.summary":"NON VÉRIFIÉ : `.claude-plugin/mcp.json` démarre un chemin contenant `${CLAUDE_PLUGIN_ROOT}`, une variable que seul le runtime de plugins de Claude Code remplace. Cette copie ne tourne pas comme plugin, donc le fichier visé n'a pas été contrôlé.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Contrôlez-le comme le ferait le runtime de plugins : lancez `CLAUDE_PLUGIN_ROOT=<le dossier de cette installation> memesh doctor`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json est introuvable, la capture automatique de mémoire ne peut donc pas fonctionner.","doctor.msg.hooks-config.missing.fix":"Réinstallez MeMesh pour le restaurer.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json est endommagé (JSON invalide).","doctor.msg.hooks-config.invalid-json.fix":"Corrigez {path} ou réinstallez MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json ne contient pas ces types de hooks : {types}. Une partie de la capture automatique ne fonctionnera pas.","doctor.msg.hooks-config.missing-types.fix":"Restaurez la configuration de hooks d'origine ou réinstallez MeMesh.","doctor.msg.hook-scripts.none.summary":"La configuration des hooks ne contient aucun script, rien ne peut donc être capturé automatiquement.","doctor.msg.hook-scripts.none.fix":"Réinstallez MeMesh.","doctor.msg.hook-scripts.missing.summary":"Ces scripts de hook sont introuvables : {files}","doctor.msg.hook-scripts.missing.fix":"Réinstallez MeMesh pour les restaurer.","doctor.msg.hook-scripts.not-executable.summary":"Ces scripts de hook existent mais n'ont pas le droit de s'exécuter : {files}","doctor.msg.hook-scripts.not-executable.fix":"Exécutez `chmod +x scripts/hooks/*.js`, ou `npm run build` si vous utilisez le code source.","doctor.msg.hook-wiring.no-marker.summary":"memesh n'est pas encore relié à Claude Code, rien n'est donc mémorisé automatiquement.","doctor.msg.hook-wiring.no-marker.fix":"Exécutez `memesh install-hooks` une fois, puis `memesh doctor` pour vérifier.","doctor.msg.hook-wiring.script-missing.summary":"Un hook memesh câblé pointe vers {path}, qui n'existe plus — l'agent invoque un fichier manquant à chaque événement correspondant. Généralement un résidu d'une mise à niveau qui a retiré le hook.","doctor.msg.hook-wiring.script-missing.fix":"Lancez `memesh install-hooks` pour recâbler (les entrées retirées sont supprimées), puis redémarrez l'agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"Le registre de connexion {path} est illisible.","doctor.msg.hook-wiring.marker-unreadable.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.marker-malformed.summary":"Le registre de connexion est endommagé.","doctor.msg.hook-wiring.marker-malformed.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.settings-missing.summary":"Le fichier de réglages de Claude Code ({path}) a disparu, la connexion est donc rompue.","doctor.msg.hook-wiring.settings-missing.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} est endommagé (JSON invalide).","doctor.msg.hook-wiring.settings-invalid.fix":"Restaurez-le depuis une sauvegarde, ou exécutez `memesh install-hooks` pour le recréer.","doctor.msg.hook-wiring.entries-removed.summary":"Les entrées memesh ont été retirées de {path}, la connexion est donc rompue.","doctor.msg.hook-wiring.entries-removed.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.root-moved.summary":"La connexion pointe vers {path}, qui n'existe plus (memesh a probablement été déplacé).","doctor.msg.hook-wiring.root-moved.fix":"Exécutez `memesh install-hooks` pour la mettre à jour.","doctor.msg.hook-activity.never-ran.summary":"Aucun hook de capture n'a été exécuté depuis {hours} heures, date de début du suivi, alors que le câblage des hooks est en place — rien n'est mémorisé.","doctor.msg.hook-activity.never-ran.fix":"Terminez une session de travail puis relancez `memesh doctor`. Si le message persiste, exécutez `memesh install-hooks` et redémarrez votre agent.","doctor.msg.hook-activity.stale.summary":"Le dernier hook de capture s'est exécuté il y a environ {hours} heures ({hook}). Si vous avez travaillé depuis, la capture est arrêtée et rien de ces sessions n'a été enregistré.","doctor.msg.hook-activity.stale.fix":"Redémarrez votre agent, terminez une session puis relancez `memesh doctor`. Si cela ne se rétablit pas, exécutez `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Le hook session-summary a tourné pour la dernière fois il y a environ {hours} heures, et aucune écriture Claude Code n'est arrivée depuis 3 jours non plus. Si cette machine est passée à un autre agent (Codex / Gemini), c'est attendu ; si vous utilisez encore Claude Code ici, la capture s'est arrêtée.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Si vous utilisez encore Claude Code sur cette machine : redémarrez-le, terminez une session, puis relancez `memesh doctor`. S'il ne récupère pas, lancez `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Impossible de lire l'activité des hooks dans la base de données : {detail}. L'état de la capture est inconnu, ce qui n'est pas la même chose que sain.","doctor.msg.hook-activity.query-failed.fix":"Lancez `memesh doctor --verbose` pour voir l'erreur complète, et vérifiez que ~/.memesh est lisible et que le disque n'est pas plein.","doctor.msg.hook-activity.stale-unknown.summary":"L'horodatage de la dernière exécution du hook {hook} est illisible (corrompu, ou écrit par une machine à l'horloge déréglée). L'état de la capture est « inconnu », ce qui n'est pas la même chose que « sain ».","doctor.msg.hook-activity.stale-unknown.fix":"Terminez une session de travail puis relancez `memesh doctor` — une nouvelle exécution écrase l'horodatage invalide.","doctor.msg.hook-activity.disabled.summary":"La capture automatique est désactivée (MEMESH_AUTO_CAPTURE ou autoCapture dans la configuration) — délibérément, le silence des hooks est donc attendu. Réactivez-la pour reprendre la capture.","doctor.msg.hook-activity.disabled-env.summary":"La capture automatique est désactivée par MEMESH_AUTO_CAPTURE=false dans l'environnement de ce shell. doctor ne voit que son propre environnement — si votre agent tourne sans cette variable, la capture là-bas n'est pas affectée.","doctor.msg.hook-activity.not-wired.summary":"Aucun hook de capture n'a jamais tourné — et aucun hook de capture (Stop / PostToolUse / PreCompact) n'est confirmé câblé sur cette machine, il n'y a donc rien à exécuter.","doctor.msg.hook-activity.not-wired.fix":"Pour la capture automatique, lancez `memesh install-hooks`. Si cette installation est MCP uniquement (Codex / Gemini), c'est normal et vous pouvez l'ignorer.","doctor.msg.hook-activity.stop-silent.summary":"Le hook {hook} s'enregistre, mais le hook session-summary n'a jamais tourné une seule fois en {hours} heures de suivi — la capture de session est peut-être cassée, masquée par la capture des commits.","doctor.msg.hook-activity.stop-silent.fix":"Terminez une session de travail puis relancez `memesh doctor`. Si session-summary n'a toujours pas tourné, lancez `memesh install-hooks` et redémarrez l'agent.","doctor.msg.hook-activity.never-ran-legacy.summary":"Aucun hook n'a enregistré le heartbeat, mais {captured} mémoires de capture automatique sont arrivées depuis le début du suivi — des hooks d'une version antérieure au suivi tournent probablement encore.","doctor.msg.hook-activity.never-ran-legacy.fix":"Mettez à jour les hooks memesh vers la version actuelle (plugin : `/plugin update memesh` ; npm : `memesh install-hooks`), puis redémarrez l'agent.","doctor.msg.node-runtime.too-old.summary":"Votre Node.js est plus ancien que ce que ce paquet prend en charge. {detail}","doctor.msg.node-runtime.too-old.fix":"Mettez Node.js à niveau vers {required} ou plus récent, puis relancez `memesh doctor`.","doctor.msg.native-binding.load-failed.summary":"SQLite n’a pas pu ouvrir la base de données : {detail}.","doctor.msg.native-binding.load-failed.fix":"Vérifiez l’environnement Node et réinstallez MeMesh si nécessaire.","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` si vous voulez une commande de terminal distincte. Sa base de données dépend de sa configuration.","doctor.msg.shell-cli.versions.summary":"Versions installées : cette interface {current} ; terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"Le plugin a été installé depuis le commit {installed}, mais le marketplace est passé à {marketplace} sous la même version. {host} ne rafraîchit pas un cache dont la version n’a pas changé : vous exécutez donc un code plus ancien que celui du marketplace.","doctor.msg.plugin-cache.stale.fix":"Exécutez `{command}` pour rafraîchir le cache, puis redémarrez {host}.","doctor.msg.plugin-cache.unverifiable.summary":"Impossible de savoir si le plugin installé correspond au marketplace. La version seule ne suffit pas : deux builds peuvent porter la même version.","doctor.msg.plugin-cache.unverifiable.fix":"Exécutez `{command}` une fois ; il enregistre le commit et cette vérification pourra répondre.","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.config-parse.retired-settings.summary":"Le fichier de configuration valide {path} contient encore {count} réglages de premier niveau abandonnés ({keys}). Cette version les ignore, mais des identifiants ou réglages de fournisseurs historiques peuvent rester sur le disque.","doctor.msg.config-parse.retired-settings.fix":"Examinez {path} localement et supprimez uniquement ces clés de premier niveau abandonnées. Ne collez pas le fichier dans une issue, car il peut contenir des identifiants. Relancez ensuite memesh doctor.","doctor.msg.message-capability.probe-failed.summary":"La vérification de la fonction de messagerie installée a échoué : {detail}.","doctor.msg.message-router.socket-missing.summary":"Aucun socket du router Local n’existe à {path} ; les sessions arrêtées ou absentes ne seront pas réveillées.","doctor.msg.message-router.socket-insecure.summary":"Le socket du router à {path} n’est pas un socket Unix privé du propriétaire.","doctor.msg.message-router.socket-unreachable.summary":"Le socket privé du router à {path} existe, mais n’a pas accepté la connexion locale.","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.citation.none.summary":"Des sessions ont reçu des mémoires injectées, mais aucune n'a été citée.","doctor.msg.citation.none.fix":"Vérifiez le contrat de citation dans ~/.claude/rules/memesh-citations.md, puis revérifiez après quelques sessions.","doctor.msg.database.broken.summary":"La base de données est inutilisable : {detail}","doctor.update_status.prerelease":"Version préliminaire en cours d’exécution ({current}) ; la version latest de npm est {latest}.","patterns.title":"Vos habitudes","patterns.workSchedule":"Planning de travail","patterns.peakHours":"Heures de pointe","patterns.busiestDays":"Jours les plus chargés","patterns.workflow":"Flux de travail","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.auth.cross-origin":"Cette requête vient d’un autre site, ou a atteint le serveur sous un nom inattendu : elle a été refusée. Ouvrez le tableau de bord à l’adresse affichée par `memesh serve`.","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.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.","time.justNow":"À l'instant","time.hoursAgo":"Il y a {count}h","time.today":"Aujourd'hui","time.yesterday":"Hier","time.daysAgo":"Il y a {count}j","time.lastWeek":"Semaine dernière","time.weeksAgo":"Il y a {count}sem","time.lastMonth":"Mois dernier","time.monthsAgo":"Il y a {count}mo","memory.access.frequent":"Fréquent · {count} rappels","memory.access.recalls":"{count} rappels","memory.access.never":"Jamais rappelé","cluster.knowledge":"Connaissance","cluster.activity":"Activité","cluster.session":"Sessions","cluster.reference":"Référence","cluster.all":"Tout","browse.filterTime":"Temps","browse.filterValue":"Valeur","browse.filterProject":"Projet","browse.filterSort":"Trier","browse.timeToday":"Aujourd'hui","browse.timeWeek":"Cette semaine","browse.timeMonth":"Ce mois-ci","browse.timeOlder":"Plus ancien","browse.valueRecalled":"✓ Utilisé","browse.valueNever":"Jamais rappelé","browse.sortMostRecalled":"Plus rappelé","browse.sortRecent":"Récent","browse.sortCreated":"Créé","browse.emptyFilter":"Aucune mémoire dans cette catégorie — essayez un autre filtre","lessons.stepsLabel":"étapes","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Pas de champs structurés — voir mémoire brute)","lessons.moreItems":"+{count} de plus","roadmap.title":"Historique du Projet","roadmap.summary":"{count} mémoires · {first} → {last}","roadmap.switchToList":"↩ Vue Liste","roadmap.switchToRoadmap":"🕘 Vue Historique","roadmap.emptyProject":"Aucune mémoire dans ce projet pour l'instant.","loop.label":"Boucle mémoire","loop.subtitleHas":"mémoires de connaissances rappelées ces 7 derniers jours","loop.subtitleNone":"Aucune mémoire rappelée cette semaine","loop.approxNote":"Approximation — suivi complet à partir de la mise à jour.","loop.sparkLabel":"30 derniers jours","roadmap.milestones":"Jalons","roadmap.keyLessons":"Leçons clés","radar.title":"Radar de couverture","radar.caption":"Mémoires actives (session et commit exclus)","radar.axis.lessons":"Leçons","radar.axis.decisions":"Décisions","radar.axis.patterns":"Patterns","radar.axis.bugs":"Bugs corrigés","radar.axis.processes":"Processus","radar.axis.architecture":"Architecture","ageMatrix.title":"Distribution par âge","ageMatrix.low":"Faible","ageMatrix.high":"Élevé","ageMatrix.legend":"profondeur = densité","ageMatrix.typeColumn":"Type","header.signalModeOn":"Mémoires essentielles","header.signalModeOff":"Toutes les mémoires","header.signalModeOnHint":"Affiche les objectifs, décisions, leçons et plans ; masque les enregistrements automatiques session, commit et activité dans Mémoires et Graphe de connaissances.","header.signalModeOffHint":"Affiche tous les enregistrements, y compris session, commit et activité capturés automatiquement, dans Mémoires et Graphe de connaissances.","globalFilter.focusedStatus":"Vue globale : Mémoires essentielles — les enregistrements automatiques session, commit et activité sont masqués dans Mémoires et Graphe de connaissances.","globalFilter.allStatus":"Vue globale : Toutes les mémoires — les enregistrements automatiques session, commit et activité sont inclus dans Mémoires et Graphe de connaissances.","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.coreHint":"Mémoire locale : remember, recherche FTS5 par mots-clés, hooks et navigation du Dashboard fonctionnent ensemble.","onboarding.searchHint":"Le rappel utilise la recherche locale FTS5 par mots-clés.","onboarding.reviewHint":"Un agent déjà actif peut préparer un paquet de résumé ou de transcription visible ; le Dashboard examine seulement la proposition préparée.","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.demoLoadedTitle":"Données de démonstration chargées","onboarding.demoLoadedBody":"{count} mémoires portent le tag demo. Vous pouvez supprimer uniquement ces mémoires ici.","onboarding.resetConfirm":"Supprimer toutes les mémoires portant le tag metadata.demo ? Les mêmes lignes ne peuvent pas être restaurées, mais vous pourrez recharger une nouvelle démo. Les mémoires réelles seront conservées.","onboarding.resetReadbackFailed":"La réinitialisation n’a pas pu être confirmée car des mémoires de démo sont encore présentes. L’action reste disponible ; réessayez ou exécutez memesh doctor.","onboarding.dismiss":"Fermer","common.serverError":"Le serveur a renvoyé une erreur (HTTP {status}). Réessayez — si cela persiste, exécutez `memesh doctor`.","emptyLibrary.title":"Votre mémoire est vide","emptyLibrary.body":"Rien n’est encore enregistré. Chargez la visite de démonstration (30 entrées) pour voir MeMesh en action — supprimable ensuite en un clic.","browse.truncated":"affichage des {shown} premières mémoires sur {total} — utilisez la recherche ou les filtres pour atteindre le reste","browse.truncatedUnknownTotal":"affichage des {shown} premières mémoires — le total est indisponible, il y en a peut-être d’autres","graph.cappedNote":"Affichage des {shown} entités les plus rappelées sur {total} pour garder le graphe fluide.","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":"À la première utilisation, demande un consentement une fois par session. MEMESH_AUTO_UPDATE définit la portée, sans contourner le consentement.","errors.timeout":"La requête a expiré","type.lesson_learned":"Leçon","type.lesson":"Leçon","type.mistake":"Erreur","type.decision":"Décision","type.goal":"Objectif","type.architecture_decision":"Décision arch.","type.design_decision":"Décision de design","type.pattern":"Pattern","type.technical_pattern":"Pattern tech.","type.best_practice":"Bonne pratique","type.bug_fix":"Correction","type.verification_result":"Vérification","type.test_result":"Résultat de test","type.process":"Processus","type.architecture":"Architecture","type.infrastructure":"Infrastructure","type.feature":"Fonctionnalité","type.release":"Release","type.refactoring":"Refactoring","type.commit":"Commit","type.session_keypoint":"Point de session","type.session_identity":"Identité de session","type.session-insight":"Insight de session","type.session-summary":"Résumé de session","type.session-identity":"Identité de session","type.weekly_summary":"Résumé hebdo","type.weekly-summary":"Résumé hebdo","type.note":"Note","type.plan":"Plan","type.knowledge":"Connaissance","type.workflow_checkpoint":"Jalon","type.concept":"Concept","type.tool":"Outil","type.person":"Personne","relation.relates_to":"lié à","relation.related-to":"lié à","relation.depends_on":"dépend de","relation.implements":"implémente","relation.learned_from":"appris de","relation.supersedes":"remplace","relation.contradicts":"contredit","relation.follows":"suit","relation.belongs-to-project":"appartient au projet","relation.evidences":"étaye","relation.co-created":"co-créé","relation.shares-name-tokens":"noms similaires","patterns.day.0":"dimanche","patterns.day.1":"lundi","patterns.day.2":"mardi","patterns.day.3":"mercredi","patterns.day.4":"jeudi","patterns.day.5":"vendredi","patterns.day.6":"samedi","lessons.severity.critical":"Critique","lessons.severity.major":"Majeur","lessons.severity.minor":"Mineur","memory.tooltip.project":"Projet","memory.tooltip.recalled":"Rappelé {count} fois","memory.tooltip.hasRelations":"Lié à {count} autres mémoires","memory.tooltip.createdAt":"Créé le {date}","graph.layerLabel":"Couche du graphe","graph.layerWork":"Travail","graph.layerAll":"Tout","graph.layerWorkHint":"Décisions, leçons et plans enregistrés, avec leurs liens consignés.","graph.layerAllHint":"Toutes les mémoires enregistrées et leurs liens consignés. Des agents ou des règles de maintenance peuvent ajouter des liens ; cette vue n’appelle pas de modèle de langage.","graph.layerFellBack":"Moins de {min} éléments de travail pour l'instant : le graphe complet est affiché à la place. Enregistrez des décisions et des leçons et cette vue se remplira.","graph.evidenceFor":"Preuves pour {node}","graph.evidenceClose":"Fermer","graph.evidenceLoading":"Chargement des preuves…","graph.evidenceFailed":"Impossible de charger les preuves de cet élément.","graph.evidenceEmpty":"Aucune preuve liée à cet élément pour le moment. Lancez `memesh kg backfill` pour créer ces liens à partir des commits et des captures de session.","graph.evidenceTruncated":"Affichage des {shown} plus récentes ; il y en a d'autres.","graph.drift":"Fraîcheur","graph.driftHint":"Colore les nœuds selon l'âge : rouge = ancien, vert = utilisé récemment","common.unknown":"inconnu","insights.entitiesCount":"{n} entités","roadmap.viewToggle":"Vue de l’historique du projet","roadmap.viewTree":"Arbre","roadmap.viewMindmap":"Carte mentale","roadmap.mindmapNeedsPhases":"La carte mentale nécessite au moins 3 mémoires sur une fenêtre de 7 jours.","roadmap.activePhase":"active","roadmap.entryCount":"{count} entrée","roadmap.entriesCount":"{count} entrées","roadmap.otherGroup":"Autres ({count})","roadmap.lowSignalHidden":"({count} à signal faible masquées)","roadmap.resetHint":"Réinitialiser zoom et position (double-clic sur le fond aussi)","roadmap.zoomHint":"molette pour zoomer · glisser pour déplacer · {pct}%","roadmap.moreEntities":"+{count} de plus","roadmap.viewDecisions":"Décisions","roadmap.densityTitle":"Densité de capture par catégorie","roadmap.densityNote":"ce que memesh a capturé — pas tout ce qui s'est passé","roadmap.lineageSupersedes":"{n} remplacées","roadmap.lineageConflicts":"{n} conflits non résolus","adr.empty":"Aucune décision enregistrée pour ce projet pour le moment. Enregistrez-en une avec le type « decision » et elle apparaît ici avec son historique.","adr.statusActive":"active","adr.statusSuperseded":"remplacée","adr.supersedes":"remplace","adr.supersededBy":"remplacée par","nav.ariaLabel":"Sections du tableau de bord","feedback.descLabel":"Description du retour","graph.canvasA11y":"Graphe de connaissances (canvas) : {entities} entités, {relations} relations, {orphans} sans lien. Utilisez les filtres de type et la recherche ci-dessus pour une vue non visuelle."},de:{"auth.title":"Authentifizierung erforderlich","auth.intro":"Dieses Dashboard ist durch ein Bearer-Token geschützt. Fügen Sie unten den Wert von MEMESH_REMOTE_TOKEN (oder den Inhalt von <memeshDir>/remote-token) ein.","auth.tokenLabel":"Token","auth.empty":"Token darf nicht leer sein.","auth.invalid":"Dieses Token wurde nicht akzeptiert. Bitte prüfen und erneut versuchen.","auth.submit":"Dashboard entsperren","auth.tokenPlaceholder":"Token hier einfügen","brand.subtitle":"powered by pcircle.com","header.connected":"Verbunden","header.disconnected":"Getrennt","header.connecting":"Verbinden…","header.memories":"Erinnerungen","insights.title":"Vorschläge zur Organisation der Erinnerungen","insights.reviewTitle":"Bereitgestellte Memory-Vorschläge","insights.reviewSubtitle":"Arbeitspakete warten auf menschliche Prüfung","insights.reviewSource":"Bereitgestellter Vorschlag — vor dem Anwenden prüfen","insights.source.calendar":"Kalender-Digest","insights.source.transcript":"Claude-Code-Transkript","insights.reviewBoundary":"Das Dashboard prüft bereits bereitgestellte Vorschläge. Es startet oder beauftragt keinen Agenten.","insights.statPending":"ausstehend","insights.statApplied":"angewendet","insights.statRejected":"abgelehnt","insights.filter.pending":"Ausstehend","insights.filter.applied":"Angewendet","insights.filter.rejected":"Abgelehnt","insights.filter.all":"Alle","insights.refresh":"Aktualisieren","insights.loading":"lädt…","insights.emptyOther":"Nichts hier.","insights.sources":"Quellen","insights.status.pending":"ausstehend","insights.status.applied":"angewendet","insights.status.rejected":"abgelehnt","insights.viewDetail":"Details anzeigen","insights.collapse":"Einklappen","insights.accept":"Übernehmen","insights.applying":"Wird angewendet…","insights.reject":"Ablehnen","insights.rejectConfirm":"Diese Erkenntnis ablehnen? Diese Aktion kann nicht rückgängig gemacht werden.","insights.observations":"Zusammenfassende Beobachtungen","insights.tags":"Tags","insights.sourceIds":"Quell-Entities","insights.validationWarnings":"Alte Validierungswarnungen","insights.validationClaim":"Aussage","insights.validationReason":"Grund","banner.pendingInsights":"{n} neue(r) Insight(s) wartet auf dein Review →","banner.dismiss":"Schließen","banner.viewAll":"Alle anzeigen","pattern.title":"Pattern","pattern.evidenceCount":"{n} Belege","pattern.severity":"Schweregrad","pattern.severity.high":"hoch","pattern.severity.medium":"mittel","pattern.severity.low":"niedrig","pattern.description":"Pattern-Beschreibung","tab.graph":"Graph","tab.settings":"Einstellungen","tab.home":"Start","tab.memories":"Erinnerungen","tab.project":"Projekt","memories.searchPlaceholder":"Beim Tippen filtern — Enter für Suche nach Relevanz","memories.scopeLabel":"Bereich","memories.scopeWork":"Arbeitsebene","memories.scopeEvidence":"Belege","memories.scopeAll":"Alle","memories.scopeArchived":"Archiviert","memories.composition":"Zusammensetzung","memories.rankedBy":"nach Relevanz sortiert","memories.backToList":"Zurück zur Liste","memories.workEmpty":"Noch keine Erinnerungen der Arbeitsebene — Ziele, Entscheidungen, Lektionen und Pläne landen hier, sobald sie erfasst werden.","memories.showAll":"Alle Erinnerungen anzeigen","memories.expand":"Details anzeigen","memories.collapse":"Details ausblenden","memory.technicalDetails":"Technische Details","memory.canonicalName":"Kanonischer Name","memory.rawType":"Rohtyp","home.analyticsTitle":"Analyse","handoff.terminal":"Terminal erforderlich","handoff.terminalPrereq":"Auf dem Rechner mit MeMesh ausführen. Das Dashboard führt den Befehl nicht aus.","handoff.copyCommand":"Befehl kopieren","handoff.commandCopied":"Befehl kopiert","handoff.github":"Öffnet GitHub — vorausgefülltes Issue vor dem Senden prüfen","home.analyticsHint":"Gesundheit, Zeitleiste, Patterns und Nutzung — klappt bei Bedarf aus","home.nextAction.eyebrow":"Empfohlener nächster Schritt","home.nextAction.why":"Warum:","home.nextAction.result":"Erwartetes Ergebnis:","home.nextAction.loading.title":"Auf Handlungsbedarf wird geprüft…","home.nextAction.loading.why":"MeMesh liest den aktuellen Speicher, Suchindex und die Prüfliste.","home.nextAction.loading.result":"Nach den Prüfungen erscheint genau eine Empfehlung.","home.nextAction.empty.title":"Erste Erinnerung hinzufügen","home.nextAction.empty.why":"Der Speicher ist leer; es gibt noch nichts zu suchen oder zu ordnen.","home.nextAction.empty.result":"Unter Erinnerungen können Sie eine löschbare Demo laden oder echte Arbeit erfassen.","home.nextAction.empty.action":"Erinnerungen öffnen","insights.emptyPending":"Noch keine offenen Prüfungen. Neue Speicherprüfungen erscheinen hier, sobald sie verfügbar sind.","home.nextAction.insights.title":"Vorschläge zur Speicherordnung prüfen","home.nextAction.insights.why":"MeMesh hat Vorschläge, die auf Ihre Entscheidung warten.","home.nextAction.insights.result":"Nützliche Zusammenfassungen annehmen oder ungeeignete Vorschläge ablehnen.","home.nextAction.insights.action":"Vorschläge prüfen","home.nextAction.healthy.title":"Derzeit keine Aktion nötig","home.nextAction.healthy.why":"Speicher, Suchindex und Prüfliste haben keine bekannten offenen Aktionen.","home.nextAction.healthy.result":"Arbeiten Sie weiter; MeMesh zeigt hier den nächsten bestätigten Bedarf.","home.nextAction.unavailable.title":"Empfehlung derzeit nicht verfügbar","home.nextAction.unavailable.why":"Eine Statusprüfung war nicht lesbar, daher rät MeMesh nicht.","home.nextAction.unavailable.result":"Neu laden, um ohne Änderung an Speicher oder Einstellungen erneut zu prüfen.","home.nextAction.unavailable.action":"Statusprüfungen wiederholen","project.selectLabel":"Projekt","project.selectPrompt":"Wähle ein Projekt, um seine Historie zu sehen.","project.empty":"Noch keine Projekt-Erinnerungen. Arbeite in einem git-Repository mit installierten memesh-Hooks und seine Geschichte erscheint hier.","guard.sourceLesson":"Quell-Lektion","guard.pattern":"Auslösemuster","guard.message":"Angezeigte Warnung","guard.shouldMatch":"Muss auslösen bei","guard.shouldNotMatch":"Muss stumm bleiben bei","search.button":"Suchen","search.searching":"Suche läuft…","search.results":"Ergebnisse","search.result":"Ergebnis","search.noResults":"Keine Ergebnisse für","search.facts":"Fakten","browse.title":"Alle Erinnerungen","browse.active":"aktiv","browse.archived":"archiviert","browse.refresh":"Aktualisieren","browse.noMatch":"Keine passenden Erinnerungen:","browse.prev":"← Zurück","browse.next":"Weiter →","browse.archive":"Archivieren","browse.restore":"Wiederherstellen","browse.confirmArchive":"Diese Erinnerung archivieren?","browse.archiveFailed":"Speicher konnte nicht archiviert werden: {message}","browse.restoreFailed":"Speicher konnte nicht wiederhergestellt werden: {message}","analytics.totalMemories":"Erinnerungen gesamt","analytics.knowledgeFacts":"Wissensfakten","analytics.connections":"Verbindungen","analytics.topics":"Themen","analytics.insights":"Einblicke","analytics.thisWeek":"Diese Woche","analytics.new":"neue","analytics.stale":"Inaktiv (30+ Tage ungenutzt)","analytics.archivedLabel":"Archiviert","analytics.mostRecalled":"Am häufigsten abgerufen","health.title":"Speichergesundheit","metrics.notMeasured":"Noch nicht gemessen","metrics.health":"Gesundheit","metrics.healthNote":"Aktivität, Qualität, Frische, Lehren","metrics.critical":"Kritische Lehren","metrics.criticalPartial":"von {tagged} eingestuften · {total} Lehren insgesamt","metrics.criticalAll":"von {total} Lehren, alle eingestuft","metrics.criticalUnclassified":"{total} Lehren, keine nach Schweregrad eingestuft","metrics.criticalNoLessons":"Noch keine Lehren erfasst","metrics.citation":"Zitate","metrics.citationNote":"{cited} von {total} Sitzungen zitierten eine Erinnerung","metrics.citationNotMeasured":"Die Zitat-Erfassung beginnt mit der nächsten Sitzung","metrics.reused":"Diese Woche genutzt","metrics.reusedNote":"Näherungswert — aus den letzten Zugriffszeiten","health.excellent":"Ausgezeichnet","health.good":"Gut","health.fair":"Mittel","health.poor":"Schlecht","health.activity":"Aktivität","health.quality":"Qualität","health.freshness":"Frische","health.lessons":"Selbstverbesserung","timeline.title":"Letzte 30 Tage","timeline.created":"Erstellt","timeline.recalled":"Abgerufen","value.totalRecalls":"Gesamtabrufe","value.lessonsLearned":"Gelernte Lektionen","value.lessonsSaved":"Angewendete Lektionen","value.coverage":"Wissensabdeckung","cleanup.title":"Aufräumvorschläge","cleanup.allClean":"Ihr Speicher ist sauber. Keine veralteten oder doppelten Entitäten erkannt.","cleanup.staleLabel":"Niedrige Konfidenz / ungenutzt","cleanup.duplicateLabel":"Mögliche Duplikate","cleanup.confidence":"Konfidenz","cleanup.unused":"ungenutzt","cleanup.entityMeta":"{type} · Konfidenz {confidence}% · {days} Tage ungenutzt","settings.saved":"Gespeichert.","settings.configReadbackFailed":"Der Server hat die gespeicherte Einstellung nicht zurückgegeben. Versuchen Sie es erneut.","settings.language":"Sprache","settings.interfaceLanguage":"Sprache der Benutzeroberfläche","settings.interfaceLanguageHint":"Ändert die Oberfläche in diesem Browser sofort.","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":"Keine neuere veröffentlichte Version verfügbar","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.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.","settings.installationDetails":"Installationsdetails","settings.installationDetailsUnavailable":"Für diese Installation ist kein Versionsvergleich verfügbar.","settings.interfacePath":"Diese Oberfläche","settings.terminalPath":"Terminal-Befehl","settings.technicalDetails":"Technische Details","settings.installationDetailsHint":"Unterschiedliche installierte Versionen müssen nicht unbedingt aktualisiert werden. Prüfe unter Updates die veröffentlichten Releases.","graph.entities":"Entitäten","graph.relations":"Beziehungen","graph.orphans":"Waisen","graph.search":"Knoten suchen…","graph.matches":"Treffer","graph.enterToOpen":"mit Enter öffnen","graph.focusMode":"Fokus","graph.showAll":"Alle anzeigen","graph.clickHint":"Knoten anklicken zum Fokussieren","graph.interactHint":"Knoten anklicken für Fokus · leere Fläche ziehen zum Schwenken · scrollen zum Zoomen","graph.resetView":"Ansicht zurücksetzen","graph.resetViewHint":"Zoom und Position zurücksetzen","graph.ageToday":"heute","graph.ageDaysAgo":"vor {count} Tagen","graph.ageWeeksAgo":"vor {count} Wochen","lessons.error":"Fehler","lessons.rootCause":"Ursache","lessons.fix":"Lösung","lessons.prevention":"Prävention","feedback.button":"💬 Feedback","feedback.title":"Feedback auf GitHub öffnen","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…","feedback.popupBlocked":"GitHub wurde nicht geöffnet. Ihr Entwurf bleibt erhalten; erlauben Sie Pop-ups, versuchen Sie es erneut oder kopieren Sie den vorbereiteten Link.","feedback.retry":"GitHub erneut öffnen","feedback.copyLink":"GitHub-Link kopieren","feedback.linkCopied":"Link kopiert","feedback.copyFailed":"Der Link konnte nicht kopiert werden. Versuchen Sie erneut, GitHub zu öffnen.","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","doctorBanner.fix":"Automatisch beheben","doctorBanner.fixInProgress":"Wird behoben…","doctorBanner.fixDone":"Behoben","doctorBanner.restartRequired":"Starten Sie den Agenten neu, um dieses Update abzuschließen.","doctor.label.readme_locale_parity":"README-Übersetzungen","doctor.label.config":"Konfigurationsdatei","doctor.label.mcp-config":"MCP-Verbindungsdatei","doctor.label.hooks-config":"Hook-Definitionen","doctor.label.hook-scripts":"Hook-Skripte","doctor.label.hook-wiring":"Verbindung zu Claude Code","doctor.label.hook-activity":"Automatische Erfassung","doctor.label.node-runtime":"Node.js-Version","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Plugin-Code ist aktuell","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.install-channel":"Installationsart","doctor.label.fts_segmentation":"Stichwort-Index","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 (.claude-plugin/mcp.json), fehlt.","doctor.msg.mcp-config.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/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":".claude-plugin/mcp.json enthält den memesh-Servereintrag nicht mehr.","doctor.msg.mcp-config.no-entry.fix":"Installieren Sie MeMesh neu, um ihn wiederherzustellen.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` startet eine Datei, die in dieser Installation fehlt — daher startet kein memesh-Werkzeug in Claude Code.","doctor.msg.mcp-config.entry-missing.fix":"Installieren Sie MeMesh neu. Wenn Sie `.claude-plugin/mcp.json` von Hand geändert haben, richten Sie es wieder auf `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js` aus.","doctor.msg.mcp-config.placeholder-unresolved.summary":"NICHT GEPRÜFT: `.claude-plugin/mcp.json` startet einen Pfad mit `${CLAUDE_PLUGIN_ROOT}` — diese Variable setzt nur die Plugin-Laufzeit von Claude Code ein. Diese Kopie läuft nicht als Plugin, daher wurde die genannte Datei nicht geprüft.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Prüfen Sie es so, wie es die Plugin-Laufzeit täte: `CLAUDE_PLUGIN_ROOT=<Ordner dieser Installation> memesh doctor` ausführen.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json fehlt, die automatische Erinnerungs-Erfassung kann deshalb nicht laufen.","doctor.msg.hooks-config.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json ist beschädigt (kein gültiges JSON).","doctor.msg.hooks-config.invalid-json.fix":"Reparieren Sie {path} oder installieren Sie MeMesh neu.","doctor.msg.hooks-config.missing-types.summary":"In hooks/hooks.json fehlen diese Hook-Typen: {types}. Ein Teil der automatischen Erfassung läuft nicht.","doctor.msg.hooks-config.missing-types.fix":"Stellen Sie die mitgelieferte Hook-Konfiguration wieder her oder installieren Sie MeMesh neu.","doctor.msg.hook-scripts.none.summary":"Die Hook-Konfiguration enthält keine Skripte, es kann also nichts automatisch erfasst werden.","doctor.msg.hook-scripts.none.fix":"Installieren Sie MeMesh neu.","doctor.msg.hook-scripts.missing.summary":"Diese Hook-Skripte fehlen: {files}","doctor.msg.hook-scripts.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.hook-scripts.not-executable.summary":"Diese Hook-Skripte existieren, dürfen aber nicht ausgeführt werden: {files}","doctor.msg.hook-scripts.not-executable.fix":"Führen Sie `chmod +x scripts/hooks/*.js` aus, oder `npm run build` in einem Quellcode-Checkout.","doctor.msg.hook-wiring.no-marker.summary":"memesh ist noch nicht mit Claude Code verbunden, es wird also nichts automatisch gemerkt.","doctor.msg.hook-wiring.no-marker.fix":"Führen Sie einmal `memesh install-hooks` aus, danach `memesh doctor` zur Kontrolle.","doctor.msg.hook-wiring.script-missing.summary":"Ein verdrahteter memesh-Hook zeigt auf {path}, das nicht mehr existiert — der Agent ruft bei jedem passenden Ereignis eine fehlende Datei auf. Meist ein Rückstand eines Upgrades, das den Hook stillgelegt hat.","doctor.msg.hook-wiring.script-missing.fix":"Führen Sie `memesh install-hooks` aus (stillgelegte Einträge werden entfernt) und starten Sie den Agenten neu.","doctor.msg.hook-wiring.marker-unreadable.summary":"Der Verbindungsvermerk unter {path} kann nicht gelesen werden.","doctor.msg.hook-wiring.marker-unreadable.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.marker-malformed.summary":"Der Verbindungsvermerk ist beschädigt.","doctor.msg.hook-wiring.marker-malformed.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.settings-missing.summary":"Die Claude-Code-Einstellungsdatei ({path}) ist weg, die Verbindung ist deshalb unterbrochen.","doctor.msg.hook-wiring.settings-missing.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} ist beschädigt (kein gültiges JSON).","doctor.msg.hook-wiring.settings-invalid.fix":"Stellen Sie die Datei aus einem Backup wieder her, oder führen Sie `memesh install-hooks` aus, um sie neu anzulegen.","doctor.msg.hook-wiring.entries-removed.summary":"Die memesh-Einträge wurden aus {path} entfernt, die Verbindung ist deshalb unterbrochen.","doctor.msg.hook-wiring.entries-removed.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.root-moved.summary":"Die Verbindung zeigt auf {path}, das es nicht mehr gibt (memesh wurde vermutlich verschoben).","doctor.msg.hook-wiring.root-moved.fix":"Führen Sie `memesh install-hooks` aus, um sie zu aktualisieren.","doctor.msg.hook-activity.never-ran.summary":"Seit Beginn der Aufzeichnung vor {hours} Stunden wurde kein Capture-Hook ausgeführt, obwohl die Hook-Verdrahtung vorhanden ist — nichts wird gespeichert.","doctor.msg.hook-activity.never-ran.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus. Steht dort weiterhin, dass kein Hook lief, führen Sie `memesh install-hooks` aus und starten Sie den Agenten neu.","doctor.msg.hook-activity.stale.summary":"Der letzte Capture-Hook lief vor etwa {hours} Stunden ({hook}). Wenn Sie seitdem gearbeitet haben, ist die Erfassung gestoppt und nichts aus diesen Sitzungen wurde gespeichert.","doctor.msg.hook-activity.stale.fix":"Starten Sie den Agenten neu, beenden Sie eine Sitzung und führen Sie `memesh doctor` erneut aus. Erholt es sich nicht, führen Sie `memesh install-hooks` aus.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Der session-summary-Hook lief zuletzt vor etwa {hours} Stunden, und in den letzten 3 Tagen kamen auch keine Claude-Code-Schreibvorgänge an. Ist diese Maschine zu einem anderen Agenten (Codex / Gemini) gewechselt, ist das erwartet; nutzen Sie hier noch Claude Code, ist die Erfassung gestoppt.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Wenn Sie auf dieser Maschine noch Claude Code nutzen: neu starten, eine Sitzung beenden und `memesh doctor` erneut ausführen. Erholt es sich nicht, führen Sie `memesh install-hooks` aus.","doctor.msg.hook-activity.query-failed.summary":"Die Hook-Aktivität konnte nicht aus der Datenbank gelesen werden: {detail}. Der Zustand der Erfassung ist unbekannt, und das ist nicht dasselbe wie gesund.","doctor.msg.hook-activity.query-failed.fix":"Führen Sie `memesh doctor --verbose` für den vollständigen Fehler aus und prüfen Sie, ob ~/.memesh lesbar und die Festplatte nicht voll ist.","doctor.msg.hook-activity.stale-unknown.summary":'Der Zeitstempel des letzten Laufs des {hook}-Hooks ist unlesbar (beschädigt, oder von einer Maschine mit falscher Uhr geschrieben). Der Capture-Zustand ist „unbekannt", und das ist nicht dasselbe wie „gesund".',"doctor.msg.hook-activity.stale-unknown.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus — ein frischer Lauf überschreibt den defekten Zeitstempel.","doctor.msg.hook-activity.disabled.summary":"Die automatische Erfassung ist ausgeschaltet (MEMESH_AUTO_CAPTURE oder autoCapture in der Konfiguration) — absichtlich, daher ist die Stille der Hooks zu erwarten. Zum Fortsetzen wieder einschalten.","doctor.msg.hook-activity.disabled-env.summary":"Die automatische Erfassung ist durch MEMESH_AUTO_CAPTURE=false in der Umgebung dieser Shell ausgeschaltet. doctor sieht nur seine eigene Umgebung — läuft Ihr Agent ohne diese Variable, ist die Erfassung dort nicht betroffen.","doctor.msg.hook-activity.not-wired.summary":"Es ist noch nie ein Capture-Hook gelaufen — und auf dieser Maschine ist kein Capture-Hook (Stop / PostToolUse / PreCompact) nachweislich verdrahtet, es gibt also nichts auszuführen.","doctor.msg.hook-activity.not-wired.fix":"Für automatische Erfassung führen Sie `memesh install-hooks` aus. Bei einer reinen MCP-Installation (Codex / Gemini) ist das erwartet und kann ignoriert werden.","doctor.msg.hook-activity.stop-silent.summary":"Der {hook}-Hook stempelt, aber der session-summary-Hook ist in den {hours} Stunden seit Beginn der Aufzeichnung kein einziges Mal gelaufen — die Sitzungserfassung ist womöglich kaputt, verdeckt durch die Commit-Erfassung.","doctor.msg.hook-activity.stop-silent.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus. Läuft session-summary dann immer noch nicht, führen Sie `memesh install-hooks` aus und starten Sie den Agenten neu.","doctor.msg.hook-activity.never-ran-legacy.summary":"Kein Hook hat den Heartbeat gestempelt, aber seit Beginn der Aufzeichnung sind {captured} automatisch erfasste Erinnerungen angekommen — Hooks aus einer Version vor dem Heartbeat-Tracking laufen wahrscheinlich noch.","doctor.msg.hook-activity.never-ran-legacy.fix":"Aktualisieren Sie die memesh-Hooks auf die aktuelle Version (Plugin: `/plugin update memesh`; npm: `memesh install-hooks`) und starten Sie den Agenten neu.","doctor.msg.node-runtime.too-old.summary":"Ihr Node.js ist älter, als dieses Paket unterstützt. {detail}","doctor.msg.node-runtime.too-old.fix":"Aktualisieren Sie Node.js auf {required} oder neuer und führen Sie `memesh doctor` erneut aus.","doctor.msg.native-binding.load-failed.summary":"SQLite konnte die Datenbank nicht öffnen: {detail}.","doctor.msg.native-binding.load-failed.fix":"Prüfen Sie die Node-Laufzeit und installieren Sie MeMesh bei Bedarf neu.","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, wenn Sie einen separaten Terminal-Befehl möchten. Seine Datenbank hängt von seiner Konfiguration ab.","doctor.msg.shell-cli.versions.summary":"Installierte Versionen: diese Oberfläche {current}; Terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"Das Plugin wurde aus Commit {installed} installiert, der Marketplace ist aber unter derselben Version zu {marketplace} weitergegangen. {host} aktualisiert keinen Cache, dessen Version sich nicht geändert hat — Sie führen also älteren Code aus als der Marketplace hat.","doctor.msg.plugin-cache.stale.fix":"Führen Sie `{command}` aus, um den Cache zu erneuern, und starten Sie {host} dann neu.","doctor.msg.plugin-cache.unverifiable.summary":"Ob das installierte Plugin dem Marketplace entspricht, ließ sich nicht feststellen. Die Version allein reicht nicht — zwei Builds können dieselbe Version tragen.","doctor.msg.plugin-cache.unverifiable.fix":"Führen Sie `{command}` einmal aus; es zeichnet den Commit auf, danach kann diese Prüfung antworten.","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.config-parse.retired-settings.summary":"Die gültige Konfigurationsdatei unter {path} enthält noch {count} eingestellte Werte auf oberster Ebene, die nicht mehr unterstützt werden ({keys}). Diese Version ignoriert sie, aber alte Anbieterzugangsdaten oder Einstellungen können auf dem Datenträger verbleiben.","doctor.msg.config-parse.retired-settings.fix":"Prüfen Sie {path} lokal und entfernen Sie nur diese nicht mehr unterstützten Schlüssel auf oberster Ebene. Fügen Sie die Datei nicht in ein Issue ein, da sie Zugangsdaten enthalten kann. Führen Sie danach memesh doctor erneut aus.","doctor.msg.message-capability.probe-failed.summary":"Die Prüfung der installierten Nachrichtenfunktion ist fehlgeschlagen: {detail}.","doctor.msg.message-router.socket-missing.summary":"Unter {path} gibt es keinen Local-router-Socket; gestoppte oder fehlende Sitzungen werden nicht geweckt.","doctor.msg.message-router.socket-insecure.summary":"Der Router-Socket unter {path} ist kein eigentümerprivater Unix-Socket.","doctor.msg.message-router.socket-unreachable.summary":"Der private Router-Socket unter {path} existiert, nahm aber keine lokale Verbindung an.","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.citation.none.summary":"Sitzungen erhielten eingefügte Memories, aber keines wurde zitiert.","doctor.msg.citation.none.fix":"Prüfen Sie den Zitationsvertrag in ~/.claude/rules/memesh-citations.md und kontrollieren Sie nach einigen Sitzungen erneut.","doctor.msg.database.broken.summary":"Die Datenbank ist nicht nutzbar: {detail}","doctor.update_status.prerelease":"Vorabversion ({current}) wird ausgeführt; npm latest ist {latest}.","patterns.title":"Ihre Muster","patterns.workSchedule":"Arbeitsplan","patterns.peakHours":"Spitzenzeiten","patterns.busiestDays":"Aktivste Tage","patterns.workflow":"Arbeitsablauf","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.auth.cross-origin":"Diese Anfrage kam von einer anderen Website oder erreichte den Server unter einem unerwarteten Namen und wurde abgelehnt. Öffne das Dashboard über die von `memesh serve` ausgegebene Adresse.","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.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.","time.justNow":"Gerade eben","time.hoursAgo":"Vor {count} Std","time.today":"Heute","time.yesterday":"Gestern","time.daysAgo":"Vor {count} T","time.lastWeek":"Letzte Woche","time.weeksAgo":"Vor {count} W","time.lastMonth":"Letzter Monat","time.monthsAgo":"Vor {count} M","memory.access.frequent":"Häufig · {count} Abrufe","memory.access.recalls":"{count} Abrufe","memory.access.never":"Nie abgerufen","cluster.knowledge":"Wissen","cluster.activity":"Aktivität","cluster.session":"Sitzungen","cluster.reference":"Referenz","cluster.all":"Alle","browse.filterTime":"Zeit","browse.filterValue":"Wert","browse.filterProject":"Projekt","browse.filterSort":"Sortieren","browse.timeToday":"Heute","browse.timeWeek":"Diese Woche","browse.timeMonth":"Dieser Monat","browse.timeOlder":"Älter","browse.valueRecalled":"✓ Verwendet","browse.valueNever":"Nie abgerufen","browse.sortMostRecalled":"Häufigste","browse.sortRecent":"Zuletzt","browse.sortCreated":"Erstellt","browse.emptyFilter":"Keine Erinnerungen in dieser Kategorie — anderen Filter probieren","lessons.stepsLabel":"Schritte","lessons.commitsCount":"{count} Commits","lessons.unstructured":"(Keine strukturierten Felder — siehe Rohspeicher)","lessons.moreItems":"+{count} weitere","roadmap.title":"Projektverlauf","roadmap.summary":"{count} Erinnerungen · {first} → {last}","roadmap.switchToList":"↩ Listenansicht","roadmap.switchToRoadmap":"🕘 Verlaufsansicht","roadmap.emptyProject":"Noch keine Erinnerungen in diesem Projekt.","loop.label":"Memory-Loop","loop.subtitleHas":"Wissens-Erinnerungen in den letzten 7 Tagen wiederverwendet","loop.subtitleNone":"Diese Woche keine Wissens-Erinnerungen abgerufen","loop.approxNote":"Annäherung — vollständige Verfolgung beginnt nach Upgrade.","loop.sparkLabel":"Letzte 30 Tage","roadmap.milestones":"Meilensteine","roadmap.keyLessons":"Wichtige Lektionen","radar.title":"Wissensabdeckung","radar.caption":"Aktive Wissens-Erinnerungen (session und commit ausgeschlossen)","radar.axis.lessons":"Lektionen","radar.axis.decisions":"Entscheidungen","radar.axis.patterns":"Muster","radar.axis.bugs":"Bugfixes","radar.axis.processes":"Prozesse","radar.axis.architecture":"Architektur","ageMatrix.title":"Altersverteilung","ageMatrix.low":"Niedrig","ageMatrix.high":"Hoch","ageMatrix.legend":"Farbtiefe = Dichte","ageMatrix.typeColumn":"Typ","header.signalModeOn":"Wichtige Erinnerungen","header.signalModeOff":"Alle Erinnerungen","header.signalModeOnHint":"Zeigt Ziele, Entscheidungen, Erkenntnisse und Pläne; blendet automatisch erfasste Session-, Commit- und Aktivitätseinträge in Erinnerungen und Wissensgraph aus.","header.signalModeOffHint":"Zeigt alle Einträge einschließlich automatisch erfasster Session-, Commit- und Aktivitätseinträge in Erinnerungen und Wissensgraph.","globalFilter.focusedStatus":"Globale Ansicht: Wichtige Erinnerungen — automatisch erfasste Session-, Commit- und Aktivitätseinträge sind in Erinnerungen und Wissensgraph ausgeblendet.","globalFilter.allStatus":"Globale Ansicht: Alle Erinnerungen — automatisch erfasste Session-, Commit- und Aktivitätseinträge sind in Erinnerungen und Wissensgraph enthalten.","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.coreHint":"Lokaler Speicher: remember, FTS5-Stichwortsuche, Hooks und Dashboard-Navigation arbeiten zusammen.","onboarding.searchHint":"Der Abruf nutzt lokale FTS5-Stichwortsuche.","onboarding.reviewHint":"Ein bereits laufender Agent kann ein Digest- oder sichtbares Transkript-Arbeitspaket vorbereiten; das Dashboard prüft nur den bereitgestellten Vorschlag.","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.demoLoadedTitle":"Demo-Daten sind geladen","onboarding.demoLoadedBody":"{count} Erinnerungen sind als demo markiert. Hier können Sie nur diese Erinnerungen entfernen.","onboarding.resetConfirm":"Alle mit metadata.demo markierten Erinnerungen entfernen? Dieselben Zeilen können nicht wiederhergestellt werden, aber später kann eine neue Demo geladen werden. Echte Erinnerungen bleiben erhalten.","onboarding.resetReadbackFailed":"Der Reset konnte nicht bestätigt werden, weil Demo-Erinnerungen verbleiben. Die Bereinigungsaktion bleibt verfügbar; versuchen Sie es erneut oder führen Sie memesh doctor aus.","onboarding.dismiss":"Schließen","common.serverError":"Der Server hat einen Fehler gemeldet (HTTP {status}). Versuchen Sie es erneut — falls es weiter auftritt, führen Sie `memesh doctor` aus.","emptyLibrary.title":"Ihr Speicher ist leer","emptyLibrary.body":"Noch ist nichts gespeichert. Laden Sie die Demo-Tour mit 30 Einträgen, um MeMesh in Aktion zu sehen — später mit einem Klick löschbar.","browse.truncated":"die ersten {shown} von {total} Erinnerungen werden angezeigt — nutzen Sie Suche oder Filter für den Rest","browse.truncatedUnknownTotal":"die ersten {shown} Erinnerungen werden angezeigt — die Gesamtzahl ist nicht verfügbar, es könnten mehr sein","graph.cappedNote":"Es werden die {shown} meistabgerufenen von {total} Entitäten angezeigt, damit der Graph flüssig bleibt.","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":"Beim ersten Gebrauch wird pro Sitzung einmal um Zustimmung gebeten. MEMESH_AUTO_UPDATE legt nur den Umfang fest und umgeht die Zustimmung nicht.","errors.timeout":"Zeitüberschreitung der Anfrage","type.lesson_learned":"Lektion","type.lesson":"Lektion","type.mistake":"Fehler","type.decision":"Entscheidung","type.goal":"Ziel","type.architecture_decision":"Arch.-Entsch.","type.design_decision":"Design-Entsch.","type.pattern":"Muster","type.technical_pattern":"Tech. Muster","type.best_practice":"Best Practice","type.bug_fix":"Bugfix","type.verification_result":"Verifikation","type.test_result":"Testergebnis","type.process":"Prozess","type.architecture":"Architektur","type.infrastructure":"Infrastruktur","type.feature":"Feature","type.release":"Release","type.refactoring":"Refactoring","type.commit":"Commit","type.session_keypoint":"Sitzungs-Kernpunkt","type.session_identity":"Sitzungsidentität","type.session-insight":"Sitzungs-Insight","type.session-summary":"Sitzungszusammenfassung","type.session-identity":"Sitzungsidentität","type.weekly_summary":"Wochenübersicht","type.weekly-summary":"Wochenübersicht","type.note":"Notiz","type.plan":"Plan","type.knowledge":"Wissen","type.workflow_checkpoint":"Meilenstein","type.concept":"Konzept","type.tool":"Werkzeug","type.person":"Person","relation.relates_to":"bezieht sich auf","relation.related-to":"verwandt mit","relation.depends_on":"hängt ab von","relation.implements":"implementiert","relation.learned_from":"gelernt aus","relation.supersedes":"ersetzt","relation.contradicts":"widerspricht","relation.follows":"folgt auf","relation.belongs-to-project":"gehört zum Projekt","relation.evidences":"belegt","relation.co-created":"gemeinsam erstellt","relation.shares-name-tokens":"ähnliche Namen","patterns.day.0":"Sonntag","patterns.day.1":"Montag","patterns.day.2":"Dienstag","patterns.day.3":"Mittwoch","patterns.day.4":"Donnerstag","patterns.day.5":"Freitag","patterns.day.6":"Samstag","lessons.severity.critical":"Kritisch","lessons.severity.major":"Schwer","lessons.severity.minor":"Gering","memory.tooltip.project":"Projekt","memory.tooltip.recalled":"{count}-mal abgerufen","memory.tooltip.hasRelations":"Mit {count} weiteren Erinnerungen verknüpft","memory.tooltip.createdAt":"Erstellt am {date}","graph.layerLabel":"Graph-Ebene","graph.layerWork":"Arbeit","graph.layerAll":"Alles","graph.layerWorkHint":"Gespeicherte Entscheidungen, Lehren und Pläne mit ihren dokumentierten Verknüpfungen.","graph.layerAllHint":"Alle gespeicherten Erinnerungen und ihre dokumentierten Verknüpfungen. Verknüpfungen können von Agenten oder Wartungsregeln hinzugefügt werden; diese Ansicht ruft kein Sprachmodell auf.","graph.layerFellBack":"Bisher weniger als {min} Arbeitseinträge, daher wird der vollständige Graph gezeigt. Halte Entscheidungen und Lehren fest, dann füllt sich diese Ansicht.","graph.evidenceFor":"Belege für {node}","graph.evidenceClose":"Schließen","graph.evidenceLoading":"Belege werden geladen…","graph.evidenceFailed":"Die Belege für diesen Eintrag konnten nicht geladen werden.","graph.evidenceEmpty":"Zu diesem Eintrag sind noch keine Belege verknüpft. Führe `memesh kg backfill` aus, um diese Verknüpfungen aus Commits und Sitzungsaufzeichnungen zu ziehen.","graph.evidenceTruncated":"Zeigt die {shown} neuesten; es gibt mehr.","graph.drift":"Frische","graph.driftHint":"Färbt Knoten nach Alter: Rot = veraltet, Grün = kürzlich genutzt","common.unknown":"unbekannt","insights.entitiesCount":"{n} Entitäten","roadmap.viewToggle":"Projektverlaufsansicht","roadmap.viewTree":"Baum","roadmap.viewMindmap":"Mindmap","roadmap.mindmapNeedsPhases":"Die Mindmap braucht mindestens 3 Erinnerungen innerhalb von 7 Tagen.","roadmap.activePhase":"aktiv","roadmap.entryCount":"{count} Eintrag","roadmap.entriesCount":"{count} Einträge","roadmap.otherGroup":"Sonstige ({count})","roadmap.lowSignalHidden":"({count} mit schwachem Signal ausgeblendet)","roadmap.resetHint":"Zoom und Position zurücksetzen (Doppelklick auf den Hintergrund geht auch)","roadmap.zoomHint":"scrollen zum Zoomen · ziehen zum Schwenken · {pct}%","roadmap.moreEntities":"+{count} weitere","roadmap.viewDecisions":"Entscheidungen","roadmap.densityTitle":"Erfassungsdichte nach Kategorie","roadmap.densityNote":"was memesh erfasst hat — nicht alles, was passiert ist","roadmap.lineageSupersedes":"{n} ersetzt","roadmap.lineageConflicts":"{n} ungelöste Konflikte","adr.empty":'Für dieses Projekt sind noch keine Entscheidungen erfasst. Erfasse eine mit dem Typ „decision", und sie erscheint hier mit ihrer Historie.',"adr.statusActive":"aktiv","adr.statusSuperseded":"ersetzt","adr.supersedes":"ersetzt","adr.supersededBy":"ersetzt durch","nav.ariaLabel":"Dashboard-Bereiche","feedback.descLabel":"Feedback-Beschreibung","graph.canvasA11y":"Wissensgraph (Canvas): {entities} Entitäten, {relations} Beziehungen, {orphans} ohne Verbindung. Nutzen Sie die Typfilter und die Suche oben für eine nicht-visuelle Ansicht."},vi:{"auth.title":"Yêu cầu xác thực","auth.intro":"Bảng điều khiển này được bảo vệ bằng bearer token. Dán giá trị của MEMESH_REMOTE_TOKEN (hoặc nội dung của <memeshDir>/remote-token) bên dưới.","auth.tokenLabel":"Token","auth.empty":"Token không được để trống.","auth.invalid":"Mã thông báo này không được chấp nhận. Hãy kiểm tra và thử lại.","auth.submit":"Mở khóa bảng điều khiển","auth.tokenPlaceholder":"dán token vào đây","brand.subtitle":"powered by pcircle.com","header.connected":"Đã kết nối","header.disconnected":"Mất kết nối","header.connecting":"Đang kết nối…","header.memories":"ký ức","insights.title":"Đề xuất sắp xếp bộ nhớ","insights.reviewTitle":"Đề xuất bộ nhớ đã được tạm lưu","insights.reviewSubtitle":"gói công việc chờ con người duyệt","insights.reviewSource":"Đề xuất đã tạm lưu — hãy duyệt trước khi áp dụng","insights.source.calendar":"Bản tóm tắt theo lịch","insights.source.transcript":"Bản ghi Claude Code","insights.reviewBoundary":"Dashboard chỉ duyệt đề xuất đã tạm lưu. Nó không chạy hay điều phối tác nhân.","insights.statPending":"đang chờ","insights.statApplied":"đã áp dụng","insights.statRejected":"đã từ chối","insights.filter.pending":"Đang chờ","insights.filter.applied":"Đã áp dụng","insights.filter.rejected":"Đã từ chối","insights.filter.all":"Tất cả","insights.refresh":"Làm mới","insights.loading":"đang tải…","insights.emptyOther":"Không có gì ở đây.","insights.sources":"nguồn","insights.status.pending":"đang chờ","insights.status.applied":"đã áp dụng","insights.status.rejected":"đã từ chối","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.rejectConfirm":"Từ chối thông tin này? Không thể hoàn tác hành động này.","insights.observations":"Tóm tắt quan sát","insights.tags":"Thẻ","insights.sourceIds":"Entity nguồn","insights.validationWarnings":"Cảnh báo xác thực cũ","insights.validationClaim":"Nhận định","insights.validationReason":"Lý do","banner.pendingInsights":"{n} insight mới đang chờ bạn xem xét →","banner.dismiss":"Bỏ qua","banner.viewAll":"Xem tất cả","pattern.title":"Pattern","pattern.evidenceCount":"{n} bằng chứng","pattern.severity":"Mức nghiêm trọng","pattern.severity.high":"cao","pattern.severity.medium":"trung bình","pattern.severity.low":"thấp","pattern.description":"Mô tả pattern","tab.graph":"Đồ thị","tab.settings":"Cài đặt","tab.home":"Trang chủ","tab.memories":"Ký ức","tab.project":"Dự án","memories.searchPlaceholder":"Lọc ngay khi gõ — nhấn Enter để tìm theo độ liên quan","memories.scopeLabel":"Phạm vi","memories.scopeWork":"Lớp công việc","memories.scopeEvidence":"Bằng chứng","memories.scopeAll":"Tất cả","memories.scopeArchived":"Đã lưu trữ","memories.composition":"Thành phần","memories.rankedBy":"xếp theo độ liên quan","memories.backToList":"Quay lại danh sách","memories.workEmpty":"Chưa có ký ức lớp công việc — mục tiêu, quyết định, bài học và kế hoạch sẽ xuất hiện ở đây khi được ghi lại.","memories.showAll":"Hiện tất cả ký ức","memories.expand":"Hiện chi tiết","memories.collapse":"Ẩn chi tiết","memory.technicalDetails":"Chi tiết kỹ thuật","memory.canonicalName":"Tên chuẩn","memory.rawType":"Loại thô","home.analyticsTitle":"Phân tích","handoff.terminal":"Cần Terminal","handoff.terminalPrereq":"Chạy trên máy đã cài MeMesh. Dashboard sẽ không chạy lệnh này.","handoff.copyCommand":"Sao chép lệnh","handoff.commandCopied":"Đã sao chép lệnh","handoff.github":"Mở GitHub — kiểm tra issue đã điền trước khi gửi","home.analyticsHint":"Sức khỏe, dòng thời gian, pattern và mức sử dụng — mở rộng khi cần","home.nextAction.eyebrow":"Bước tiếp theo được đề xuất","home.nextAction.why":"Lý do:","home.nextAction.result":"Kết quả mong đợi:","home.nextAction.loading.title":"Đang kiểm tra việc cần chú ý…","home.nextAction.loading.why":"MeMesh đang đọc trạng thái hiện tại của bộ nhớ, chỉ mục và hàng đợi xem xét.","home.nextAction.loading.result":"Một đề xuất duy nhất sẽ xuất hiện sau khi kiểm tra xong.","home.nextAction.empty.title":"Thêm bộ nhớ đầu tiên","home.nextAction.empty.why":"Thư viện đang trống nên chưa có gì để tìm kiếm hoặc sắp xếp.","home.nextAction.empty.result":"Trang Bộ nhớ cho phép tải bản demo có thể xóa hoặc bắt đầu ghi công việc thật.","home.nextAction.empty.action":"Mở Bộ nhớ","insights.emptyPending":"Chưa có mục nào đang chờ xem xét. Các lượt xem xét bộ nhớ mới sẽ xuất hiện ở đây khi có.","home.nextAction.insights.title":"Xem xét đề xuất sắp xếp bộ nhớ","home.nextAction.insights.why":"MeMesh có các đề xuất đang chờ quyết định của bạn.","home.nextAction.insights.result":"Chấp nhận tóm tắt hữu ích hoặc từ chối đề xuất không phù hợp.","home.nextAction.insights.action":"Xem xét đề xuất","home.nextAction.healthy.title":"Hiện không cần hành động","home.nextAction.healthy.why":"Bộ nhớ, chỉ mục và hàng đợi xem xét không có việc đã biết đang chờ.","home.nextAction.healthy.result":"Tiếp tục làm việc; MeMesh sẽ hiển thị nhu cầu đã xác nhận tiếp theo tại đây.","home.nextAction.unavailable.title":"Hiện chưa thể đưa ra đề xuất","home.nextAction.unavailable.why":"Không đọc được một kiểm tra trạng thái nên MeMesh sẽ không đoán.","home.nextAction.unavailable.result":"Tải lại để thử lại mà không thay đổi bộ nhớ hoặc cài đặt.","home.nextAction.unavailable.action":"Thử lại kiểm tra trạng thái","project.selectLabel":"Dự án","project.selectPrompt":"Chọn một dự án để xem lịch sử của nó.","project.empty":"Chưa có ký ức dự án. Hãy làm việc trong một kho git đã cài hooks memesh và câu chuyện của nó sẽ xuất hiện ở đây.","guard.sourceLesson":"Bài học nguồn","guard.pattern":"Mẫu kích hoạt","guard.message":"Cảnh báo sẽ hiển thị","guard.shouldMatch":"Phải kích hoạt với","guard.shouldNotMatch":"Phải im lặng với","search.button":"Tìm kiếm","search.searching":"Đang tìm…","search.results":"kết quả","search.result":"kết quả","search.noResults":"Không tìm thấy kết quả cho","search.facts":"sự kiện","browse.title":"Tất cả ký ức","browse.active":"hoạt động","browse.archived":"đã lưu trữ","browse.refresh":"Làm mới","browse.noMatch":"Không có ký ức phù hợp:","browse.prev":"← Trước","browse.next":"Tiếp →","browse.archive":"Lưu trữ","browse.restore":"Khôi phục","browse.confirmArchive":"Lưu trữ ký ức này?","browse.archiveFailed":"Không thể lưu trữ ký ức: {message}","browse.restoreFailed":"Không thể khôi phục ký ức: {message}","analytics.totalMemories":"Tổng ký ức","analytics.knowledgeFacts":"Sự kiện tri thức","analytics.connections":"Kết nối","analytics.topics":"Chủ đề","analytics.insights":"Thông tin","analytics.thisWeek":"Tuần này","analytics.new":"mới","analytics.stale":"Không hoạt động (30+ ngày)","analytics.archivedLabel":"Đã lưu trữ","analytics.mostRecalled":"Được truy xuất nhiều nhất","health.title":"Sức khỏe bộ nhớ","metrics.notMeasured":"Chưa đo được","metrics.health":"Sức khoẻ","metrics.healthNote":"Hoạt động, chất lượng, độ mới, bài học","metrics.critical":"Bài học nghiêm trọng","metrics.criticalPartial":"trong {tagged} mục đã phân loại · tổng {total} bài học","metrics.criticalAll":"trong tổng {total} bài học, đã phân loại hết","metrics.criticalUnclassified":"{total} bài học, chưa phân loại theo mức độ","metrics.criticalNoLessons":"Chưa ghi nhận bài học nào","metrics.citation":"Trích dẫn","metrics.citationNote":"{cited} trong {total} phiên có trích dẫn ký ức","metrics.citationNotMeasured":"Việc theo dõi trích dẫn bắt đầu từ phiên sau","metrics.reused":"Dùng lại tuần này","metrics.reusedNote":"Ước tính — dựa trên thời điểm truy cập cuối","health.excellent":"Xuất sắc","health.good":"Tốt","health.fair":"Trung bình","health.poor":"Kém","health.activity":"Hoạt động","health.quality":"Chất lượng","health.freshness":"Độ mới","health.lessons":"Tự cải thiện","timeline.title":"30 ngày qua","timeline.created":"Đã tạo","timeline.recalled":"Đã gọi lại","value.totalRecalls":"Tổng số lần gọi lại","value.lessonsLearned":"Bài học đã rút ra","value.lessonsSaved":"Bài học đã áp dụng","value.coverage":"Phạm vi kiến thức","cleanup.title":"Gợi ý dọn dẹp","cleanup.allClean":"Bộ nhớ của bạn sạch. Không phát hiện thực thể lỗi thời hoặc trùng lặp.","cleanup.staleLabel":"Độ tin cậy thấp / chưa sử dụng","cleanup.duplicateLabel":"Có thể trùng lặp","cleanup.confidence":"độ tin cậy","cleanup.unused":"chưa sử dụng","cleanup.entityMeta":"{type} · độ tin cậy {confidence}% · không dùng {days} ngày","settings.saved":"Đã lưu.","settings.configReadbackFailed":"Máy chủ không trả về cấu hình đã lưu. Hãy thử lại.","settings.language":"Ngôn ngữ","settings.interfaceLanguage":"Ngôn ngữ giao diện","settings.interfaceLanguageHint":"Thay đổi ngay giao diện trong trình duyệt này.","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":"Chưa có bản phát hành mới hơn","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.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.","settings.installationDetails":"Chi tiết cài đặt","settings.installationDetailsUnavailable":"Không thể so sánh phiên bản cho bản cài đặt này.","settings.interfacePath":"Giao diện này","settings.terminalPath":"Lệnh trong terminal","settings.technicalDetails":"Chi tiết kỹ thuật","settings.installationDetailsHint":"Các phiên bản đã cài khác nhau không nhất thiết phải cập nhật. Hãy xem Cập nhật để biết các bản phát hành đã công bố.","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.enterToOpen":"nhấn Enter để mở","graph.focusMode":"Tập trung","graph.showAll":"Hiển thị tất cả","graph.clickHint":"Nhấp vào nút để tập trung","graph.interactHint":"Nhấp một nút để tập trung · kéo vùng trống để di chuyển · cuộn để thu phóng","graph.resetView":"Đặt lại chế độ xem","graph.resetViewHint":"Đặt lại thu phóng và vị trí","graph.ageToday":"hôm nay","graph.ageDaysAgo":"{count} ngày trước","graph.ageWeeksAgo":"{count} tuần trước","lessons.error":"Lỗi","lessons.rootCause":"Nguyên nhân gốc","lessons.fix":"Cách sửa","lessons.prevention":"Phòng ngừa","feedback.button":"💬 Phản hồi","feedback.title":"Mở phản hồi trên GitHub","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…","feedback.popupBlocked":"GitHub không mở. Bản nháp vẫn được giữ nguyên; hãy cho phép cửa sổ bật lên, thử lại hoặc sao chép liên kết đã chuẩn bị.","feedback.retry":"Thử mở lại GitHub","feedback.copyLink":"Sao chép liên kết GitHub","feedback.linkCopied":"Đã sao chép liên kết","feedback.copyFailed":"Không thể sao chép liên kết. Hãy thử mở lại GitHub.","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 đủ","doctorBanner.fix":"Tự động khắc phục","doctorBanner.fixInProgress":"Đang khắc phục…","doctorBanner.fixDone":"Đã khắc phục","doctorBanner.restartRequired":"Khởi động lại tác nhân để hoàn tất cập nhật này.","doctor.label.readme_locale_parity":"Bản dịch README","doctor.label.config":"Tệp cấu hình","doctor.label.mcp-config":"Tệp kết nối MCP","doctor.label.hooks-config":"Định nghĩa hook","doctor.label.hook-scripts":"Script hook","doctor.label.hook-wiring":"Kết nối với Claude Code","doctor.label.hook-activity":"Tự động ghi nhớ","doctor.label.node-runtime":"Phiên bản Node.js","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Mã plugin đã mới nhất","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.install-channel":"Cách cài đặt","doctor.label.fts_segmentation":"Chỉ mục từ khóa","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 (.claude-plugin/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":".claude-plugin/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":".claude-plugin/mcp.json không còn mục máy chủ memesh nữa.","doctor.msg.mcp-config.no-entry.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` khởi chạy một tệp không có trong bản cài này, nên mọi công cụ memesh trong Claude Code đều không khởi động được.","doctor.msg.mcp-config.entry-missing.fix":"Cài lại MeMesh. Nếu bạn tự sửa `.claude-plugin/mcp.json`, hãy trỏ nó về `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.mcp-config.placeholder-unresolved.summary":"CHƯA KIỂM TRA: `.claude-plugin/mcp.json` khởi chạy một đường dẫn có chứa `${CLAUDE_PLUGIN_ROOT}`, biến mà chỉ môi trường chạy plugin của Claude Code mới thay thế. Bản cài này không chạy như một plugin, nên tệp mà nó trỏ tới chưa được kiểm tra.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Hãy kiểm tra đúng cách môi trường plugin làm: chạy `CLAUDE_PLUGIN_ROOT=<thư mục của bản cài này> memesh doctor`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json đã biến mất nên tính năng ghi nhớ tự động không chạy được.","doctor.msg.hooks-config.missing.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json bị hỏng (không phải JSON hợp lệ).","doctor.msg.hooks-config.invalid-json.fix":"Sửa {path} hoặc cài lại MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json thiếu các loại hook sau: {types}. Một phần ghi nhận tự động sẽ không chạy.","doctor.msg.hooks-config.missing-types.fix":"Khôi phục cấu hình hook gốc hoặc cài đặt lại MeMesh.","doctor.msg.hook-scripts.none.summary":"Cấu hình hook không có script nào nên không thể ghi tự động thứ gì.","doctor.msg.hook-scripts.none.fix":"Cài lại MeMesh.","doctor.msg.hook-scripts.missing.summary":"Các script hook sau đã biến mất: {files}","doctor.msg.hook-scripts.missing.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.hook-scripts.not-executable.summary":"Các script hook sau tồn tại nhưng không được phép chạy: {files}","doctor.msg.hook-scripts.not-executable.fix":"Chạy `chmod +x scripts/hooks/*.js`, hoặc `npm run build` nếu dùng mã nguồn.","doctor.msg.hook-wiring.no-marker.summary":"memesh chưa được nối với Claude Code nên chưa có gì được ghi nhớ tự động.","doctor.msg.hook-wiring.no-marker.fix":"Chạy `memesh install-hooks` một lần, rồi chạy `memesh doctor` để xác nhận.","doctor.msg.hook-wiring.script-missing.summary":"Một hook memesh đã đấu nối trỏ tới {path}, nhưng tệp này không còn tồn tại — agent gọi một tệp không có ở mỗi sự kiện tương ứng. Thường là tàn dư của bản nâng cấp đã loại bỏ hook đó.","doctor.msg.hook-wiring.script-missing.fix":"Chạy `memesh install-hooks` để đấu nối lại (các mục đã loại bỏ sẽ bị xoá), rồi khởi động lại agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"Không đọc được bản ghi kết nối tại {path}.","doctor.msg.hook-wiring.marker-unreadable.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.marker-malformed.summary":"Bản ghi kết nối bị hỏng.","doctor.msg.hook-wiring.marker-malformed.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.settings-missing.summary":"Tệp cài đặt của Claude Code ({path}) đã biến mất nên kết nối bị đứt.","doctor.msg.hook-wiring.settings-missing.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} bị hỏng (không phải JSON hợp lệ).","doctor.msg.hook-wiring.settings-invalid.fix":"Khôi phục từ bản sao lưu, hoặc chạy `memesh install-hooks` để tạo lại.","doctor.msg.hook-wiring.entries-removed.summary":"Các mục memesh đã bị gỡ khỏi {path} nên kết nối bị đứt.","doctor.msg.hook-wiring.entries-removed.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.root-moved.summary":"Kết nối trỏ tới {path}, nơi này không còn tồn tại (memesh có lẽ đã bị di chuyển).","doctor.msg.hook-wiring.root-moved.fix":"Chạy `memesh install-hooks` để cập nhật.","doctor.msg.hook-activity.never-ran.summary":"Không có hook thu thập nào chạy trong {hours} giờ kể từ khi bắt đầu theo dõi, dù đấu nối hook vẫn ổn — không có gì được ghi nhớ.","doctor.msg.hook-activity.never-ran.fix":"Hoàn tất một phiên làm việc rồi chạy lại `memesh doctor`. Nếu vẫn báo chưa có hook nào chạy, chạy `memesh install-hooks` rồi khởi động lại agent.","doctor.msg.hook-activity.stale.summary":"Hook thu thập cuối cùng chạy khoảng {hours} giờ trước ({hook}). Nếu bạn đã làm việc kể từ đó, việc thu thập đã dừng và không có gì từ các phiên đó được lưu.","doctor.msg.hook-activity.stale.fix":"Khởi động lại agent, kết thúc một phiên rồi chạy lại `memesh doctor`. Nếu không khôi phục, chạy `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Hook session-summary chạy lần cuối khoảng {hours} giờ trước, và 3 ngày qua cũng không có ghi nào từ Claude Code. Nếu máy này đã chuyển sang agent khác (Codex / Gemini), điều này là bình thường; nếu bạn vẫn dùng Claude Code ở đây, thu thập đã dừng.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Nếu bạn vẫn dùng Claude Code trên máy này: khởi động lại, kết thúc một phiên rồi chạy lại `memesh doctor`. Nếu không hồi phục, chạy `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Không đọc được hoạt động hook từ cơ sở dữ liệu: {detail}. Tình trạng thu thập là không rõ, và điều đó không giống với bình thường.","doctor.msg.hook-activity.query-failed.fix":"Chạy `memesh doctor --verbose` để xem lỗi đầy đủ, và kiểm tra ~/.memesh đọc được và đĩa còn chỗ trống.","doctor.msg.hook-activity.stale-unknown.summary":'Không đọc được thời điểm chạy gần nhất của hook {hook} (dữ liệu hỏng, hoặc do một máy lệch đồng hồ ghi). Tình trạng thu thập hiện là "không rõ", và điều đó không giống "khỏe mạnh".',"doctor.msg.hook-activity.stale-unknown.fix":"Kết thúc một phiên làm việc rồi chạy lại `memesh doctor` — lần chạy mới sẽ ghi đè dấu thời gian hỏng.","doctor.msg.hook-activity.disabled.summary":"Thu thập tự động đang tắt (MEMESH_AUTO_CAPTURE hoặc autoCapture trong cấu hình) — do chủ ý, nên hook im lặng là điều dự kiến. Bật lại để tiếp tục thu thập phiên.","doctor.msg.hook-activity.disabled-env.summary":"Thu thập tự động bị tắt bởi MEMESH_AUTO_CAPTURE=false trong môi trường shell này. doctor chỉ thấy được môi trường của chính nó — nếu agent của bạn chạy không có biến này, thu thập ở đó không bị ảnh hưởng.","doctor.msg.hook-activity.not-wired.summary":"Chưa có hook thu thập nào từng chạy — và trên máy này không xác nhận được hook thu thập nào (Stop / PostToolUse / PreCompact) đã đấu nối, nên không có gì để chạy.","doctor.msg.hook-activity.not-wired.fix":"Nếu muốn thu thập tự động, chạy `memesh install-hooks`. Nếu bản cài này chỉ dùng MCP (Codex / Gemini), đây là bình thường và có thể bỏ qua.","doctor.msg.hook-activity.stop-silent.summary":"Hook {hook} vẫn đang ghi dấu, nhưng hook session-summary chưa từng chạy lần nào trong {hours} giờ kể từ khi bắt đầu theo dõi — thu thập phiên có thể đã hỏng, bị che bởi thu thập commit.","doctor.msg.hook-activity.stop-silent.fix":"Kết thúc một phiên làm việc rồi chạy lại `memesh doctor`. Nếu session-summary vẫn chưa chạy, chạy `memesh install-hooks` và khởi động lại agent.","doctor.msg.hook-activity.never-ran-legacy.summary":"Chưa hook nào ghi dấu nhịp tim, nhưng từ khi bắt đầu theo dõi đã có {captured} ký ức thu thập tự động — nhiều khả năng hook từ phiên bản trước khi có theo dõi nhịp tim vẫn đang chạy.","doctor.msg.hook-activity.never-ran-legacy.fix":"Cập nhật hook memesh lên phiên bản hiện tại (plugin: `/plugin update memesh`; npm: `memesh install-hooks`), rồi khởi động lại agent.","doctor.msg.node-runtime.too-old.summary":"Node.js của bạn cũ hơn mức gói này hỗ trợ. {detail}","doctor.msg.node-runtime.too-old.fix":"Nâng cấp Node.js lên {required} trở lên, rồi chạy lại `memesh doctor`.","doctor.msg.native-binding.load-failed.summary":"SQLite không thể mở cơ sở dữ liệu: {detail}.","doctor.msg.native-binding.load-failed.fix":"Kiểm tra môi trường Node và cài đặt lại MeMesh nếu cần.","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` nếu bạn muốn có một lệnh terminal riêng. Cơ sở dữ liệu của nó phụ thuộc vào cấu hình.","doctor.msg.shell-cli.versions.summary":"Phiên bản đã cài: giao diện này {current}; terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"Plugin được cài từ commit {installed}, nhưng marketplace đã tiến tới {marketplace} với cùng một phiên bản. {host} không làm mới cache khi phiên bản không đổi, nên bạn đang chạy mã cũ hơn marketplace.","doctor.msg.plugin-cache.stale.fix":"Chạy `{command}` để làm mới cache, rồi khởi động lại {host}.","doctor.msg.plugin-cache.unverifiable.summary":"Không xác định được plugin đã cài có khớp với marketplace hay không. Chỉ phiên bản thì không đủ — hai bản dựng khác nhau có thể cùng một phiên bản.","doctor.msg.plugin-cache.unverifiable.fix":"Chạy `{command}` một lần; nó ghi lại commit và sau đó kiểm tra này sẽ trả lời được.","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.config-parse.retired-settings.summary":"Tệp cấu hình hợp lệ tại {path} vẫn chứa {count} thiết lập cấp cao nhất đã ngừng dùng ({keys}). Phiên bản này bỏ qua chúng, nhưng thông tin xác thực hoặc thiết lập nhà cung cấp cũ có thể vẫn còn trên đĩa.","doctor.msg.config-parse.retired-settings.fix":"Hãy xem xét {path} cục bộ và chỉ xóa các khóa cấp cao nhất đã ngừng dùng đó. Không dán tệp vào issue vì tệp có thể chứa thông tin xác thực. Sau đó chạy lại memesh doctor.","doctor.msg.message-capability.probe-failed.summary":"Kiểm tra khả năng nhắn tin đã cài đặt thất bại: {detail}.","doctor.msg.message-router.socket-missing.summary":"Không có socket router Local tại {path}; phiên đã dừng hoặc không tồn tại sẽ không bị đánh thức.","doctor.msg.message-router.socket-insecure.summary":"Socket router tại {path} không phải Unix socket riêng của chủ sở hữu.","doctor.msg.message-router.socket-unreachable.summary":"Socket router riêng tại {path} tồn tại nhưng không nhận kết nối cục bộ.","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.citation.none.summary":"Các phiên đã nhận ký ức được chèn nhưng không có ký ức nào được trích dẫn.","doctor.msg.citation.none.fix":"Kiểm tra quy ước trích dẫn tại ~/.claude/rules/memesh-citations.md rồi kiểm tra lại sau vài phiên.","doctor.msg.database.broken.summary":"Cơ sở dữ liệu không dùng được: {detail}","doctor.update_status.prerelease":"Đang chạy phiên bản tiền phát hành ({current}); npm latest là {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.workflow":"Quy trình làm việc","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.auth.cross-origin":"Yêu cầu này đến từ một trang khác, hoặc tới máy chủ dưới một tên không mong đợi, nên đã bị từ chối. Hãy mở bảng điều khiển bằng địa chỉ mà `memesh serve` đã in ra.","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.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.","time.justNow":"Vừa xong","time.hoursAgo":"{count} giờ trước","time.today":"Hôm nay","time.yesterday":"Hôm qua","time.daysAgo":"{count} ngày trước","time.lastWeek":"Tuần trước","time.weeksAgo":"{count} tuần trước","time.lastMonth":"Tháng trước","time.monthsAgo":"{count} tháng trước","memory.access.frequent":"Thường dùng · {count} lần","memory.access.recalls":"{count} lần","memory.access.never":"Chưa dùng","cluster.knowledge":"Kiến thức","cluster.activity":"Hoạt động","cluster.session":"Phiên","cluster.reference":"Tham chiếu","cluster.all":"Tất cả","browse.filterTime":"Thời gian","browse.filterValue":"Giá trị","browse.filterProject":"Dự án","browse.filterSort":"Sắp xếp","browse.timeToday":"Hôm nay","browse.timeWeek":"Tuần này","browse.timeMonth":"Tháng này","browse.timeOlder":"Cũ hơn","browse.valueRecalled":"✓ Đã dùng","browse.valueNever":"Chưa dùng","browse.sortMostRecalled":"Dùng nhiều nhất","browse.sortRecent":"Gần đây","browse.sortCreated":"Tạo lúc","browse.emptyFilter":"Không có ký ức trong danh mục này — thử bộ lọc khác","lessons.stepsLabel":"bước","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Không có trường có cấu trúc — xem bộ nhớ thô)","lessons.moreItems":"+{count} nữa","roadmap.title":"Lịch Sử Dự Án","roadmap.summary":"{count} ký ức · {first} → {last}","roadmap.switchToList":"↩ Xem danh sách","roadmap.switchToRoadmap":"🕘 Xem lịch sử","roadmap.emptyProject":"Chưa có ký ức nào trong dự án này.","loop.label":"Vòng lặp ký ức","loop.subtitleHas":"ký ức kiến thức được nhớ lại trong 7 ngày qua","loop.subtitleNone":"Tuần này chưa có ký ức nào được nhớ lại","loop.approxNote":"Xấp xỉ — theo dõi đầy đủ bắt đầu sau khi nâng cấp.","loop.sparkLabel":"30 ngày qua","roadmap.milestones":"Cột mốc","roadmap.keyLessons":"Bài học chính","radar.title":"Radar phủ kiến thức","radar.caption":"Ký ức kiến thức hoạt động (không tính session và commit)","radar.axis.lessons":"Bài học","radar.axis.decisions":"Quyết định","radar.axis.patterns":"Mẫu","radar.axis.bugs":"Sửa lỗi","radar.axis.processes":"Quy trình","radar.axis.architecture":"Kiến trúc","ageMatrix.title":"Phân bố tuổi ký ức","ageMatrix.low":"Thấp","ageMatrix.high":"Cao","ageMatrix.legend":"độ đậm = mật độ","ageMatrix.typeColumn":"Loại","header.signalModeOn":"Ký ức trọng tâm","header.signalModeOff":"Tất cả ký ức","header.signalModeOnHint":"Hiện mục tiêu, quyết định, bài học và kế hoạch; ẩn bản ghi session, commit và hoạt động tự động trong Ký ức và Đồ thị tri thức.","header.signalModeOffHint":"Hiện mọi bản ghi, gồm session, commit và hoạt động được thu thập tự động, trong Ký ức và Đồ thị tri thức.","globalFilter.focusedStatus":"Chế độ toàn cục: Ký ức trọng tâm — bản ghi session, commit và hoạt động tự động bị ẩn trong Ký ức và Đồ thị tri thức.","globalFilter.allStatus":"Chế độ toàn cục: Tất cả ký ức — bản ghi session, commit và hoạt động tự động được bao gồm trong Ký ức và Đồ thị tri thức.","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.coreHint":"Bộ nhớ cục bộ: remember, tìm kiếm từ khóa FTS5, hooks và duyệt Dashboard hoạt động cùng nhau.","onboarding.searchHint":"Truy hồi dùng tìm kiếm từ khóa FTS5 cục bộ.","onboarding.reviewHint":"Một tác nhân đang chạy có thể chuẩn bị gói tóm tắt hoặc bản ghi hội thoại hiển thị; Dashboard chỉ duyệt đề xuất đã tạm lưu.","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.demoLoadedTitle":"Đã tải dữ liệu demo","onboarding.demoLoadedBody":"Có {count} ký ức được gắn thẻ demo. Bạn chỉ có thể xóa các ký ức đó tại đây.","onboarding.resetConfirm":"Xóa mọi ký ức có thẻ metadata.demo? Không thể khôi phục đúng các hàng cũ, nhưng bạn có thể tải demo mới sau. Ký ức thật vẫn được giữ lại.","onboarding.resetReadbackFailed":"Không thể xác nhận đặt lại vì vẫn còn ký ức demo. Thao tác dọn dẹp vẫn hiển thị; hãy thử lại hoặc chạy memesh doctor.","onboarding.dismiss":"Đóng","common.serverError":"Máy chủ báo lỗi (HTTP {status}). Hãy thử lại — nếu vẫn xảy ra, chạy `memesh doctor`.","emptyLibrary.title":"Bộ nhớ của bạn đang trống","emptyLibrary.body":"Chưa có gì được lưu. Hãy nạp bản demo 30 mục để xem MeMesh hoạt động — có thể xóa sau chỉ với một cú nhấp.","browse.truncated":"đang hiển thị {shown} ký ức đầu tiên trong tổng số {total} — dùng tìm kiếm hoặc bộ lọc để xem phần còn lại","browse.truncatedUnknownTotal":"đang hiển thị {shown} ký ức đầu tiên — không đọc được tổng số, nên có thể còn nữa","graph.cappedNote":"Chỉ hiển thị {shown} thực thể hàng đầu trong {total} (theo số lần gợi nhớ) để giữ đồ thị mượt mà.","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":"Khi dùng lần đầu, hỏi đồng ý một lần cho mỗi phiên. MEMESH_AUTO_UPDATE chỉ đặt phạm vi và không bỏ qua đồng ý.","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.goal":"Mục tiêu","type.architecture_decision":"QĐ kiến trúc","type.design_decision":"QĐ thiết kế","type.pattern":"Mẫu","type.technical_pattern":"Mẫu kỹ thuật","type.best_practice":"Best practice","type.bug_fix":"Sửa lỗi","type.verification_result":"Kết quả xác minh","type.test_result":"Kết quả kiểm thử","type.process":"Quy trình","type.architecture":"Kiến trúc","type.infrastructure":"Hạ tầng","type.feature":"Tính năng","type.release":"Bản phát hành","type.refactoring":"Tái cấu trúc","type.commit":"Commit","type.session_keypoint":"Điểm chính phiên","type.session_identity":"Danh tính phiên","type.session-insight":"Insight phiên","type.session-summary":"Tóm tắt phiên","type.session-identity":"Danh tính phiên","type.weekly_summary":"Tóm tắt tuần","type.weekly-summary":"Tóm tắt tuần","type.note":"Ghi chú","type.plan":"Kế hoạch","type.knowledge":"Kiến thức","type.workflow_checkpoint":"Mốc","type.concept":"Khái niệm","type.tool":"Công cụ","type.person":"Người","relation.relates_to":"liên quan đến","relation.related-to":"liên quan đến","relation.depends_on":"phụ thuộc vào","relation.implements":"hiện thực","relation.learned_from":"học từ","relation.supersedes":"thay thế","relation.contradicts":"mâu thuẫn","relation.follows":"tiếp nối","relation.belongs-to-project":"thuộc dự án","relation.evidences":"dẫn chứng","relation.co-created":"cùng tạo","relation.shares-name-tokens":"tên tương tự","patterns.day.0":"Chủ nhật","patterns.day.1":"Thứ hai","patterns.day.2":"Thứ ba","patterns.day.3":"Thứ tư","patterns.day.4":"Thứ năm","patterns.day.5":"Thứ sáu","patterns.day.6":"Thứ bảy","lessons.severity.critical":"Nghiêm trọng","lessons.severity.major":"Lớn","lessons.severity.minor":"Nhỏ","memory.tooltip.project":"Dự án","memory.tooltip.recalled":"Đã nhớ lại {count} lần","memory.tooltip.hasRelations":"Liên kết với {count} ký ức khác","memory.tooltip.createdAt":"Tạo lúc {date}","graph.layerLabel":"Lớp đồ thị","graph.layerWork":"Công việc","graph.layerAll":"Tất cả","graph.layerWorkHint":"Các quyết định, bài học và kế hoạch đã lưu cùng các liên kết được ghi nhận.","graph.layerAllHint":"Tất cả ký ức đã lưu và các liên kết được ghi nhận. Liên kết có thể được thêm bởi tác nhân hoặc quy tắc bảo trì; chế độ xem này không gọi mô hình ngôn ngữ.","graph.layerFellBack":"Hiện có chưa tới {min} mục công việc nên hiển thị đồ thị đầy đủ. Ghi lại quyết định và bài học thì khung nhìn này sẽ đầy dần.","graph.evidenceFor":"Bằng chứng cho {node}","graph.evidenceClose":"Đóng","graph.evidenceLoading":"Đang tải bằng chứng…","graph.evidenceFailed":"Không tải được bằng chứng cho mục này.","graph.evidenceEmpty":"Mục này chưa có bằng chứng liên kết. Chạy `memesh kg backfill` để tạo liên kết từ commit và ghi nhận phiên làm việc.","graph.evidenceTruncated":"Đang hiển thị {shown} mục mới nhất; còn nhiều hơn.","graph.drift":"Độ mới","graph.driftHint":"Tô màu theo độ mới: đỏ = lâu không dùng, xanh lá = mới dùng gần đây","common.unknown":"không rõ","insights.entitiesCount":"{n} thực thể","roadmap.viewToggle":"Chế độ xem lịch sử dự án","roadmap.viewTree":"Cây","roadmap.viewMindmap":"Sơ đồ tư duy","roadmap.mindmapNeedsPhases":"Sơ đồ tư duy cần ít nhất 3 ký ức trong vòng 7 ngày.","roadmap.activePhase":"đang diễn ra","roadmap.entryCount":"{count} mục","roadmap.entriesCount":"{count} mục","roadmap.otherGroup":"Khác ({count})","roadmap.lowSignalHidden":"(đã ẩn {count} tín hiệu thấp)","roadmap.resetHint":"Đặt lại thu phóng và vị trí (nhấp đúp nền cũng được)","roadmap.zoomHint":"cuộn để thu phóng · kéo để di chuyển · {pct}%","roadmap.moreEntities":"+{count} nữa","roadmap.viewDecisions":"Quyết định","roadmap.densityTitle":"Mật độ ghi nhận theo danh mục","roadmap.densityNote":"những gì memesh ghi nhận được — không phải mọi thứ đã xảy ra","roadmap.lineageSupersedes":"{n} đã bị thay thế","roadmap.lineageConflicts":"{n} xung đột chưa được giải quyết","adr.empty":'Dự án này chưa ghi nhận quyết định nào. Ghi lại một quyết định với loại "decision" và nó sẽ xuất hiện ở đây cùng lịch sử của nó.',"adr.statusActive":"hiện hành","adr.statusSuperseded":"đã bị thay thế","adr.supersedes":"thay thế","adr.supersededBy":"bị thay thế bởi","nav.ariaLabel":"Các mục bảng điều khiển","feedback.descLabel":"Nội dung phản hồi","graph.canvasA11y":"Đồ thị tri thức (vẽ trên canvas): {entities} thực thể, {relations} quan hệ, {orphans} chưa kết nối. Dùng bộ lọc loại và tìm kiếm ở trên để xem không trực quan."},es:{"auth.title":"Autenticación requerida","auth.intro":"Este panel está protegido por un token bearer. Pega el valor de MEMESH_REMOTE_TOKEN (o el contenido de <memeshDir>/remote-token) a continuación.","auth.tokenLabel":"Token","auth.empty":"El token no puede estar vacío.","auth.invalid":"Ese token no fue aceptado. Compruébalo e inténtalo de nuevo.","auth.submit":"Desbloquear panel","auth.tokenPlaceholder":"pega el token aquí","brand.subtitle":"powered by pcircle.com","header.connected":"Conectado","header.disconnected":"Desconectado","header.connecting":"Conectando…","header.memories":"memorias","insights.title":"Sugerencias para organizar la memoria","insights.reviewTitle":"Propuestas de memoria preparadas","insights.reviewSubtitle":"paquetes de trabajo pendientes de revisión humana","insights.reviewSource":"Propuesta preparada — revísala antes de aplicarla","insights.source.calendar":"Resumen de calendario","insights.source.transcript":"Transcripción de Claude Code","insights.reviewBoundary":"El Dashboard revisa propuestas ya preparadas. No ejecuta ni despacha agentes.","insights.statPending":"pendiente","insights.statApplied":"aplicada","insights.statRejected":"rechazada","insights.filter.pending":"Pendiente","insights.filter.applied":"Aplicada","insights.filter.rejected":"Rechazada","insights.filter.all":"Todos","insights.refresh":"Actualizar","insights.loading":"cargando…","insights.emptyOther":"Nada por aquí.","insights.sources":"fuentes","insights.status.pending":"pendiente","insights.status.applied":"aplicada","insights.status.rejected":"rechazada","insights.viewDetail":"Ver detalle","insights.collapse":"Contraer","insights.accept":"Aceptar","insights.applying":"Aplicando…","insights.reject":"Rechazar","insights.rejectConfirm":"¿Rechazar esta idea? Esta acción no se puede deshacer.","insights.observations":"Observaciones resumidas","insights.tags":"Etiquetas","insights.sourceIds":"Fuentes","insights.validationWarnings":"Advertencias de validación heredadas","insights.validationClaim":"Afirmación","insights.validationReason":"Motivo","banner.pendingInsights":"{n} nuevo(s) insight{s} esperando tu revisión →","banner.dismiss":"Descartar","banner.viewAll":"Ver todos","pattern.title":"Pattern","pattern.evidenceCount":"{n} evidencia(s)","pattern.severity":"Severidad","pattern.severity.high":"alta","pattern.severity.medium":"media","pattern.severity.low":"baja","pattern.description":"Descripción del pattern","tab.graph":"Grafo","tab.settings":"Configuración","tab.home":"Inicio","tab.memories":"Memorias","tab.project":"Proyecto","memories.searchPlaceholder":"Filtra mientras escribes — pulsa Enter para una búsqueda por relevancia","memories.scopeLabel":"Ámbito","memories.scopeWork":"Capa de trabajo","memories.scopeEvidence":"Evidencia","memories.scopeAll":"Todas","memories.scopeArchived":"Archivadas","memories.composition":"Composición","memories.rankedBy":"ordenadas por relevancia","memories.backToList":"Volver a la lista","memories.workEmpty":"Aún no hay memorias de la capa de trabajo — metas, decisiones, lecciones y planes aparecen aquí a medida que se capturan.","memories.showAll":"Mostrar todas las memorias","memories.expand":"Mostrar detalles","memories.collapse":"Ocultar detalles","memory.technicalDetails":"Detalles técnicos","memory.canonicalName":"Nombre canónico","memory.rawType":"Tipo sin procesar","home.analyticsTitle":"Análisis","handoff.terminal":"Requiere Terminal","handoff.terminalPrereq":"Ejecuta esto en el equipo donde está MeMesh. El Dashboard no ejecutará el comando.","handoff.copyCommand":"Copiar comando","handoff.commandCopied":"Comando copiado","handoff.github":"Abre GitHub — revisa el issue rellenado antes de enviarlo","home.analyticsHint":"Salud, línea de tiempo, patrones y uso — se expande bajo demanda","home.nextAction.eyebrow":"Siguiente paso recomendado","home.nextAction.why":"Por qué:","home.nextAction.result":"Resultado esperado:","home.nextAction.loading.title":"Comprobando qué necesita atención…","home.nextAction.loading.why":"MeMesh está leyendo el estado actual de memorias, índice y cola de revisión.","home.nextAction.loading.result":"Aparecerá una sola recomendación al terminar las comprobaciones.","home.nextAction.empty.title":"Añade tu primera memoria","home.nextAction.empty.why":"La biblioteca está vacía, así que aún no hay nada que buscar u organizar.","home.nextAction.empty.result":"En Memorias puedes cargar una demo eliminable o empezar a registrar trabajo real.","home.nextAction.empty.action":"Abrir Memorias","insights.emptyPending":"Todavía no hay revisiones pendientes. Las nuevas revisiones de memoria aparecerán aquí cuando estén disponibles.","home.nextAction.insights.title":"Revisa sugerencias de organización","home.nextAction.insights.why":"MeMesh tiene sugerencias esperando tu decisión.","home.nextAction.insights.result":"Acepta resúmenes útiles o rechaza sugerencias inadecuadas.","home.nextAction.insights.action":"Revisar sugerencias","home.nextAction.healthy.title":"No hace falta actuar ahora","home.nextAction.healthy.why":"Memorias, índice y cola de revisión no tienen acciones conocidas pendientes.","home.nextAction.healthy.result":"Sigue trabajando; MeMesh mostrará aquí la próxima necesidad confirmada.","home.nextAction.unavailable.title":"Recomendación no disponible","home.nextAction.unavailable.why":"No se pudo leer una comprobación, así que MeMesh no va a adivinar.","home.nextAction.unavailable.result":"Recarga para reintentar sin cambiar memorias ni configuración.","home.nextAction.unavailable.action":"Reintentar comprobaciones","project.selectLabel":"Proyecto","project.selectPrompt":"Elige un proyecto para ver su historial.","project.empty":"Aún no hay memorias de proyecto. Trabaja en un repositorio git con los hooks de memesh instalados y su historia aparecerá aquí.","guard.sourceLesson":"Lección de origen","guard.pattern":"Patrón de activación","guard.message":"Advertencia que mostrará","guard.shouldMatch":"Debe activarse con","guard.shouldNotMatch":"Debe permanecer en silencio con","search.button":"Buscar","search.searching":"Buscando…","search.results":"resultados","search.result":"resultado","search.noResults":"Sin resultados para","search.facts":"hechos","browse.title":"Todas las memorias","browse.active":"activas","browse.archived":"archivadas","browse.refresh":"Actualizar","browse.noMatch":"No hay memorias que coincidan con","browse.prev":"← Anterior","browse.next":"Siguiente →","browse.archive":"Archivar","browse.restore":"Restaurar","browse.confirmArchive":"¿Archivar esta memoria?","browse.archiveFailed":"No se pudo archivar la memoria: {message}","browse.restoreFailed":"No se pudo restaurar la memoria: {message}","analytics.totalMemories":"Total de memorias","analytics.knowledgeFacts":"Hechos","analytics.connections":"Conexiones","analytics.topics":"Temas","analytics.insights":"Información","analytics.thisWeek":"Esta semana","analytics.new":"nuevas","analytics.stale":"Inactivas (30+ días sin uso)","analytics.archivedLabel":"Archivadas","analytics.mostRecalled":"Más consultadas","health.title":"Salud de la memoria","metrics.notMeasured":"Aún sin medir","metrics.health":"Salud","metrics.healthNote":"Actividad, calidad, frescura, lecciones","metrics.critical":"Lecciones críticas","metrics.criticalPartial":"de {tagged} clasificadas · {total} lecciones en total","metrics.criticalAll":"de {total} lecciones, todas clasificadas","metrics.criticalUnclassified":"{total} lecciones, ninguna clasificada por gravedad","metrics.criticalNoLessons":"Todavía no hay lecciones registradas","metrics.citation":"Citas","metrics.citationNote":"{cited} de {total} sesiones citaron una memoria","metrics.citationNotMeasured":"El registro de citas empieza en la próxima sesión","metrics.reused":"Reutilizadas esta semana","metrics.reusedNote":"Aproximado — según las fechas de último acceso","health.excellent":"Excelente","health.good":"Bueno","health.fair":"Regular","health.poor":"Deficiente","health.activity":"Actividad","health.quality":"Calidad","health.freshness":"Frescura","health.lessons":"Auto-mejora","timeline.title":"Últimos 30 días","timeline.created":"Creados","timeline.recalled":"Recuperados","value.totalRecalls":"Total de recuperaciones","value.lessonsLearned":"Lecciones aprendidas","value.lessonsSaved":"Lecciones aplicadas","value.coverage":"Cobertura de conocimiento","cleanup.title":"Sugerencias de limpieza","cleanup.allClean":"Tu memoria está limpia. No se detectaron entidades obsoletas o duplicadas.","cleanup.staleLabel":"Baja confianza / no usado","cleanup.duplicateLabel":"Posibles duplicados","cleanup.confidence":"confianza","cleanup.unused":"no usado","cleanup.entityMeta":"{type} · confianza {confidence}% · {days} d sin uso","settings.saved":"Guardado.","settings.configReadbackFailed":"El servidor no devolvió la configuración guardada. Inténtalo de nuevo.","settings.language":"Idioma","settings.interfaceLanguage":"Idioma de la interfaz","settings.interfaceLanguageHint":"Cambia inmediatamente la interfaz en este navegador.","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":"No hay una versión publicada más reciente","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.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.","settings.installationDetails":"Detalles de instalación","settings.installationDetailsUnavailable":"No se puede comparar versiones en esta instalación.","settings.interfacePath":"Esta interfaz","settings.terminalPath":"Comando de terminal","settings.technicalDetails":"Detalles técnicos","settings.installationDetailsHint":"Tener versiones instaladas diferentes no implica necesariamente que debas actualizar. Consulta Actualizaciones para ver las versiones publicadas.","graph.entities":"Entidades","graph.relations":"Relaciones","graph.orphans":"Huérfanos","graph.search":"Buscar nodos…","graph.matches":"coincidencias","graph.enterToOpen":"pulsa Intro para abrirlo","graph.focusMode":"Enfoque","graph.showAll":"Mostrar todo","graph.clickHint":"Haz clic en un nodo para enfocar","graph.interactHint":"Clic en un nodo para enfocar · arrastra el área vacía para desplazar · rueda para zoom","graph.resetView":"Restablecer vista","graph.resetViewHint":"Restablecer zoom y posición","graph.ageToday":"hoy","graph.ageDaysAgo":"hace {count} d","graph.ageWeeksAgo":"hace {count} sem","lessons.error":"Error","lessons.rootCause":"Causa raíz","lessons.fix":"Corrección","lessons.prevention":"Prevención","feedback.button":"💬 Comentarios","feedback.title":"Abrir comentarios en GitHub","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…","feedback.popupBlocked":"GitHub no se abrió. Tu borrador sigue intacto; permite ventanas emergentes, vuelve a intentarlo o copia el enlace preparado.","feedback.retry":"Intentar abrir GitHub de nuevo","feedback.copyLink":"Copiar enlace de GitHub","feedback.linkCopied":"Enlace copiado","feedback.copyFailed":"No se pudo copiar el enlace. Intenta abrir GitHub de nuevo.","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","doctorBanner.fix":"Reparar automáticamente","doctorBanner.fixInProgress":"Reparando…","doctorBanner.fixDone":"Reparado","doctorBanner.restartRequired":"Reinicia el agente para terminar esta actualización.","doctor.label.readme_locale_parity":"Traducciones del README","doctor.label.config":"Archivo de configuración","doctor.label.mcp-config":"Archivo de conexión MCP","doctor.label.hooks-config":"Definiciones de hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Conexión con Claude Code","doctor.label.hook-activity":"Captura automática","doctor.label.node-runtime":"Versión de Node.js","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Código del plugin actualizado","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.install-channel":"Método de instalación","doctor.label.fts_segmentation":"Índice de palabras clave","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 (.claude-plugin/mcp.json).","doctor.msg.mcp-config.missing.fix":"Reinstala MeMesh para restaurarlo.","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/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":".claude-plugin/mcp.json ya no contiene la entrada del servidor memesh.","doctor.msg.mcp-config.no-entry.fix":"Reinstala MeMesh para restaurarla.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` arranca un archivo que no está en esta instalación, así que ninguna herramienta de memesh dentro de Claude Code puede iniciarse.","doctor.msg.mcp-config.entry-missing.fix":"Reinstala MeMesh. Si editaste `.claude-plugin/mcp.json` a mano, vuelve a apuntarlo a `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.mcp-config.placeholder-unresolved.summary":"NO VERIFICADO: `.claude-plugin/mcp.json` arranca una ruta que contiene `${CLAUDE_PLUGIN_ROOT}`, una variable que solo rellena el runtime de plugins de Claude Code. Esta copia no se está ejecutando como plugin, así que no se comprobó el archivo al que apunta.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Compruébalo igual que lo haría el runtime de plugins: ejecuta `CLAUDE_PLUGIN_ROOT=<la carpeta de esta instalación> memesh doctor`.","doctor.msg.hooks-config.missing.summary":"Falta hooks/hooks.json, así que la captura automática de memoria no puede funcionar.","doctor.msg.hooks-config.missing.fix":"Reinstala MeMesh para restaurarlo.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json está dañado (no es JSON válido).","doctor.msg.hooks-config.invalid-json.fix":"Arregla {path} o reinstala MeMesh.","doctor.msg.hooks-config.missing-types.summary":"A hooks/hooks.json le faltan estos tipos de hook: {types}. Parte de la captura automática no se ejecutará.","doctor.msg.hooks-config.missing-types.fix":"Restaura la configuración de hooks original o reinstala MeMesh.","doctor.msg.hook-scripts.none.summary":"La configuración de hooks no tiene ningún script, así que nada puede capturarse automáticamente.","doctor.msg.hook-scripts.none.fix":"Reinstala MeMesh.","doctor.msg.hook-scripts.missing.summary":"Faltan estos scripts de hook: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstala MeMesh para restaurarlos.","doctor.msg.hook-scripts.not-executable.summary":"Estos scripts de hook existen pero no tienen permiso para ejecutarse: {files}","doctor.msg.hook-scripts.not-executable.fix":"Ejecuta `chmod +x scripts/hooks/*.js`, o `npm run build` si usas el código fuente.","doctor.msg.hook-wiring.no-marker.summary":"memesh aún no está conectado con Claude Code, así que nada se recuerda automáticamente.","doctor.msg.hook-wiring.no-marker.fix":"Ejecuta `memesh install-hooks` una vez, y luego `memesh doctor` para confirmar.","doctor.msg.hook-wiring.script-missing.summary":"Un hook memesh conectado apunta a {path}, que ya no existe — el agente invoca un archivo inexistente en cada evento correspondiente. Suele ser residuo de una actualización que retiró el hook.","doctor.msg.hook-wiring.script-missing.fix":"Ejecuta `memesh install-hooks` para reconectar (elimina entradas retiradas) y reinicia el agente.","doctor.msg.hook-wiring.marker-unreadable.summary":"El registro de conexión en {path} no se puede leer.","doctor.msg.hook-wiring.marker-unreadable.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.marker-malformed.summary":"El registro de conexión está dañado.","doctor.msg.hook-wiring.marker-malformed.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.settings-missing.summary":"El archivo de ajustes de Claude Code ({path}) desapareció, así que la conexión está rota.","doctor.msg.hook-wiring.settings-missing.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} está dañado (no es JSON válido).","doctor.msg.hook-wiring.settings-invalid.fix":"Restáuralo desde una copia de seguridad, o ejecuta `memesh install-hooks` para recrearlo.","doctor.msg.hook-wiring.entries-removed.summary":"Las entradas de memesh fueron eliminadas de {path}, así que la conexión está rota.","doctor.msg.hook-wiring.entries-removed.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.root-moved.summary":"La conexión apunta a {path}, que ya no existe (probablemente memesh se movió).","doctor.msg.hook-wiring.root-moved.fix":"Ejecuta `memesh install-hooks` para actualizarla.","doctor.msg.hook-activity.never-ran.summary":"Ningún hook de captura se ha ejecutado en las {hours} horas desde que empezó el seguimiento, aun con el cableado de hooks en su sitio — no se está guardando nada.","doctor.msg.hook-activity.never-ran.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor`. Si sigue diciendo que ningún hook se ejecutó, ejecuta `memesh install-hooks` y reinicia el agente.","doctor.msg.hook-activity.stale.summary":"El último hook de captura se ejecutó hace unas {hours} horas ({hook}). Si has trabajado desde entonces, la captura se detuvo y nada de esas sesiones se guardó.","doctor.msg.hook-activity.stale.fix":"Reinicia el agente, termina una sesión y vuelve a ejecutar `memesh doctor`. Si no se recupera, ejecuta `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"El hook session-summary se ejecutó por última vez hace unas {hours} horas, y tampoco llegó ninguna escritura de Claude Code en los últimos 3 días. Si esta máquina pasó a otro agente (Codex / Gemini), es lo esperado; si todavía usas Claude Code aquí, la captura se detuvo.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Si todavía usas Claude Code en esta máquina: reinícialo, termina una sesión y vuelve a ejecutar `memesh doctor`. Si no se recupera, ejecuta `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"No se pudo leer la actividad de los hooks en la base de datos: {detail}. El estado de la captura es desconocido, que no es lo mismo que sano.","doctor.msg.hook-activity.query-failed.fix":"Ejecuta `memesh doctor --verbose` para ver el error completo y comprueba que ~/.memesh se puede leer y que hay espacio en disco.","doctor.msg.hook-activity.stale-unknown.summary":"La marca de tiempo de la última ejecución del hook {hook} no se puede leer (corrupta, o escrita por una máquina con el reloj mal). El estado de la captura es «desconocido», que no es lo mismo que «sano».","doctor.msg.hook-activity.stale-unknown.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor` — una ejecución nueva sobrescribe la marca de tiempo dañada.","doctor.msg.hook-activity.disabled.summary":"La captura automática está desactivada (MEMESH_AUTO_CAPTURE o autoCapture en la configuración) — deliberadamente, así que el silencio de los hooks es lo esperado. Reactívala para volver a capturar sesiones.","doctor.msg.hook-activity.disabled-env.summary":"La captura automática está desactivada por MEMESH_AUTO_CAPTURE=false en el entorno de este shell. doctor solo ve su propio entorno — si tu agente corre sin esta variable, la captura allí no se ve afectada.","doctor.msg.hook-activity.not-wired.summary":"Ningún hook de captura se ha ejecutado nunca — y ningún hook de captura (Stop / PostToolUse / PreCompact) está confirmado como conectado en esta máquina, así que no hay nada que ejecutar.","doctor.msg.hook-activity.not-wired.fix":"Si quieres captura automática, ejecuta `memesh install-hooks`. Si esta instalación es solo MCP (Codex / Gemini), esto es lo esperado y puedes ignorarlo.","doctor.msg.hook-activity.stop-silent.summary":"El hook {hook} está sellando, pero el hook session-summary no se ha ejecutado ni una vez en las {hours} horas desde que empezó el seguimiento — la captura de sesiones puede estar rota, oculta tras la captura de commits.","doctor.msg.hook-activity.stop-silent.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor`. Si session-summary sigue sin ejecutarse, ejecuta `memesh install-hooks` y reinicia el agente.","doctor.msg.hook-activity.never-ran-legacy.summary":"Ningún hook ha sellado el latido, pero {captured} memorias de captura automática llegaron desde que empezó el seguimiento — probablemente siguen ejecutándose hooks de una versión anterior al seguimiento.","doctor.msg.hook-activity.never-ran-legacy.fix":"Actualiza los hooks de memesh a la versión actual (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) y reinicia el agente.","doctor.msg.node-runtime.too-old.summary":"Tu Node.js es más antiguo de lo que este paquete admite. {detail}","doctor.msg.node-runtime.too-old.fix":"Actualiza Node.js a {required} o más nuevo, y luego ejecuta `memesh doctor` de nuevo.","doctor.msg.native-binding.load-failed.summary":"SQLite no pudo abrir la base de datos: {detail}.","doctor.msg.native-binding.load-failed.fix":"Comprueba el entorno de Node y reinstala MeMesh si es necesario.","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` si quieres un comando de terminal independiente. Su base de datos depende de su configuración.","doctor.msg.shell-cli.versions.summary":"Versiones instaladas: esta interfaz {current}; terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"El plugin se instaló desde el commit {installed}, pero el marketplace avanzó a {marketplace} con la misma versión. {host} no refresca una caché cuya versión no cambió, así que estás ejecutando código más antiguo que el del marketplace.","doctor.msg.plugin-cache.stale.fix":"Ejecuta `{command}` para refrescar la caché y luego reinicia {host}.","doctor.msg.plugin-cache.unverifiable.summary":"No se pudo saber si el plugin instalado coincide con el marketplace. La versión sola no lo responde: dos builds pueden llevar la misma versión.","doctor.msg.plugin-cache.unverifiable.fix":"Ejecuta `{command}` una vez; registra el commit y después esta comprobación podrá responder.","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.config-parse.retired-settings.summary":"El archivo de configuración válido en {path} aún contiene {count} ajustes de nivel superior retirados ({keys}). Esta versión los ignora, pero las credenciales o los ajustes antiguos de proveedores pueden seguir en el disco.","doctor.msg.config-parse.retired-settings.fix":"Revisa {path} localmente y elimina solo esas claves de nivel superior retiradas. No pegues el archivo en una issue porque puede contener credenciales. Después, vuelve a ejecutar memesh doctor.","doctor.msg.message-capability.probe-failed.summary":"Falló la comprobación de la función de mensajería instalada: {detail}.","doctor.msg.message-router.socket-missing.summary":"No existe un socket del router Local en {path}; no se despertarán sesiones detenidas o inexistentes.","doctor.msg.message-router.socket-insecure.summary":"El socket del router en {path} no es un socket Unix privado del propietario.","doctor.msg.message-router.socket-unreachable.summary":"El socket privado del router en {path} existe, pero no aceptó una conexión local.","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.citation.none.summary":"Las sesiones recibieron memorias inyectadas, pero ninguna fue citada.","doctor.msg.citation.none.fix":"Revisa el contrato de citación en ~/.claude/rules/memesh-citations.md y vuelve a comprobarlo tras algunas sesiones.","doctor.msg.database.broken.summary":"La base de datos no se puede usar: {detail}","doctor.update_status.prerelease":"Se está ejecutando la versión preliminar ({current}); npm latest es {latest}.","patterns.title":"Tus patrones","patterns.workSchedule":"Horario de trabajo","patterns.peakHours":"Horas pico","patterns.busiestDays":"Días más ocupados","patterns.workflow":"Flujo de trabajo","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.auth.cross-origin":"Esta solicitud vino de otro sitio, o llegó al servidor con un nombre inesperado, y fue rechazada. Abre el panel con la dirección que imprimió `memesh serve`.","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.rate.limited":"Demasiadas solicitudes en poco tiempo. Espera un momento e inténtalo de nuevo.","httpError.server.internal":"El servidor encontró un error inesperado.","time.justNow":"Ahora","time.hoursAgo":"Hace {count}h","time.today":"Hoy","time.yesterday":"Ayer","time.daysAgo":"Hace {count}d","time.lastWeek":"Semana pasada","time.weeksAgo":"Hace {count}sem","time.lastMonth":"Mes pasado","time.monthsAgo":"Hace {count}mes","memory.access.frequent":"Frecuente · {count} usos","memory.access.recalls":"{count} usos","memory.access.never":"Nunca usado","cluster.knowledge":"Conocimiento","cluster.activity":"Actividad","cluster.session":"Sesiones","cluster.reference":"Referencia","cluster.all":"Todo","browse.filterTime":"Tiempo","browse.filterValue":"Valor","browse.filterProject":"Proyecto","browse.filterSort":"Ordenar","browse.timeToday":"Hoy","browse.timeWeek":"Esta semana","browse.timeMonth":"Este mes","browse.timeOlder":"Más antiguo","browse.valueRecalled":"✓ Usado","browse.valueNever":"Nunca usado","browse.sortMostRecalled":"Más usado","browse.sortRecent":"Reciente","browse.sortCreated":"Creado","browse.emptyFilter":"Sin memorias en esta categoría — prueba otro filtro","lessons.stepsLabel":"pasos","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Sin campos estructurados — ver memoria sin procesar)","lessons.moreItems":"+{count} más","roadmap.title":"Historial del Proyecto","roadmap.summary":"{count} memorias · {first} → {last}","roadmap.switchToList":"↩ Vista de Lista","roadmap.switchToRoadmap":"🕘 Vista del Historial","roadmap.emptyProject":"Sin memorias en este proyecto todavía.","loop.label":"Bucle de memoria","loop.subtitleHas":"memorias de conocimiento reusadas en los últimos 7 días","loop.subtitleNone":"Ninguna memoria reutilizada esta semana","loop.approxNote":"Aproximación — seguimiento completo comienza después de la actualización.","loop.sparkLabel":"Últimos 30 días","roadmap.milestones":"Hitos","roadmap.keyLessons":"Lecciones clave","radar.title":"Radar de cobertura","radar.caption":"Memorias de conocimiento activas (session y commit excluidos)","radar.axis.lessons":"Lecciones","radar.axis.decisions":"Decisiones","radar.axis.patterns":"Patrones","radar.axis.bugs":"Correcciones","radar.axis.processes":"Procesos","radar.axis.architecture":"Arquitectura","ageMatrix.title":"Distribución por edad","ageMatrix.low":"Bajo","ageMatrix.high":"Alto","ageMatrix.legend":"profundidad = densidad","ageMatrix.typeColumn":"Tipo","header.signalModeOn":"Memorias importantes","header.signalModeOff":"Todas las memorias","header.signalModeOnHint":"Muestra metas, decisiones, lecciones y planes; oculta registros automáticos de session, commit y actividad en Memorias y Grafo de conocimiento.","header.signalModeOffHint":"Muestra todos los registros, incluidos session, commit y actividad capturados automáticamente, en Memorias y Grafo de conocimiento.","globalFilter.focusedStatus":"Vista global: Memorias importantes — los registros automáticos de session, commit y actividad están ocultos en Memorias y Grafo de conocimiento.","globalFilter.allStatus":"Vista global: Todas las memorias — se incluyen los registros automáticos de session, commit y actividad en Memorias y Grafo de conocimiento.","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.coreHint":"Memoria local: remember, búsqueda FTS5 por palabras clave, hooks y navegación del Dashboard funcionan juntas.","onboarding.searchHint":"La recuperación usa búsqueda local FTS5 por palabras clave.","onboarding.reviewHint":"Un agente ya activo puede preparar un paquete de resumen o transcripción visible; el Dashboard solo revisa la propuesta preparada.","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.demoLoadedTitle":"Datos de demostración cargados","onboarding.demoLoadedBody":"Hay {count} memorias con la etiqueta demo. Aquí puedes eliminar solo esas memorias.","onboarding.resetConfirm":"¿Eliminar todas las memorias con la etiqueta metadata.demo? No se pueden restaurar las mismas filas, pero puedes cargar una demo nueva después. Las memorias reales se conservarán.","onboarding.resetReadbackFailed":"No se pudo confirmar el restablecimiento porque aún quedan memorias demo. La acción de limpieza seguirá disponible; inténtalo de nuevo o ejecuta memesh doctor.","onboarding.dismiss":"Cerrar","common.serverError":"El servidor devolvió un error (HTTP {status}). Inténtalo de nuevo — si persiste, ejecuta `memesh doctor`.","emptyLibrary.title":"Tu memoria está vacía","emptyLibrary.body":"Aún no hay nada guardado. Carga el tour de demostración de 30 entradas para ver MeMesh en acción — puedes borrarlo luego con un clic.","browse.truncated":"mostrando las primeras {shown} de {total} memorias — usa la búsqueda o los filtros para llegar al resto","browse.truncatedUnknownTotal":"mostrando las primeras {shown} memorias — el total no está disponible, así que puede haber más","graph.cappedNote":"Mostrando las {shown} entidades más recordadas de {total} para mantener el grafo fluido.","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":"En el primer uso, pide consentimiento una vez por sesión. MEMESH_AUTO_UPDATE define el alcance, pero nunca omite el consentimiento.","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.goal":"Objetivo","type.architecture_decision":"Dec. arq.","type.design_decision":"Decisión de diseño","type.pattern":"Patrón","type.technical_pattern":"Patrón téc.","type.best_practice":"Buena práctica","type.bug_fix":"Corrección","type.verification_result":"Verificación","type.test_result":"Resultado de prueba","type.process":"Proceso","type.architecture":"Arquitectura","type.infrastructure":"Infraestructura","type.feature":"Característica","type.release":"Lanzamiento","type.refactoring":"Refactorización","type.commit":"Commit","type.session_keypoint":"Punto clave de sesión","type.session_identity":"Identidad de sesión","type.session-insight":"Insight de sesión","type.session-summary":"Resumen de sesión","type.session-identity":"Identidad de sesión","type.weekly_summary":"Resumen semanal","type.weekly-summary":"Resumen semanal","type.note":"Nota","type.plan":"Plan","type.knowledge":"Conocimiento","type.workflow_checkpoint":"Hito","type.concept":"Concepto","type.tool":"Herramienta","type.person":"Persona","relation.relates_to":"se relaciona con","relation.related-to":"relacionado con","relation.depends_on":"depende de","relation.implements":"implementa","relation.learned_from":"aprendido de","relation.supersedes":"reemplaza","relation.contradicts":"contradice","relation.follows":"sigue a","relation.belongs-to-project":"pertenece al proyecto","relation.evidences":"evidencia","relation.co-created":"cocreado","relation.shares-name-tokens":"nombres similares","patterns.day.0":"domingo","patterns.day.1":"lunes","patterns.day.2":"martes","patterns.day.3":"miércoles","patterns.day.4":"jueves","patterns.day.5":"viernes","patterns.day.6":"sábado","lessons.severity.critical":"Crítico","lessons.severity.major":"Mayor","lessons.severity.minor":"Menor","memory.tooltip.project":"Proyecto","memory.tooltip.recalled":"Recuperado {count} veces","memory.tooltip.hasRelations":"Vinculado a {count} otras memorias","memory.tooltip.createdAt":"Creado el {date}","graph.layerLabel":"Capa del grafo","graph.layerWork":"Trabajo","graph.layerAll":"Todo","graph.layerWorkHint":"Decisiones, lecciones y planes guardados con sus enlaces registrados.","graph.layerAllHint":"Todas las memorias guardadas y sus enlaces registrados. Los enlaces pueden ser añadidos por agentes o reglas de mantenimiento; esta vista no llama a un modelo de lenguaje.","graph.layerFellBack":"Hay menos de {min} elementos de trabajo, así que se muestra el grafo completo. Registra decisiones y lecciones y esta vista se irá llenando.","graph.evidenceFor":"Evidencia de {node}","graph.evidenceClose":"Cerrar","graph.evidenceLoading":"Cargando evidencia…","graph.evidenceFailed":"No se pudo cargar la evidencia de este elemento.","graph.evidenceEmpty":"Todavía no hay evidencia enlazada a este elemento. Ejecuta `memesh kg backfill` para crear esos enlaces desde los commits y las capturas de sesión.","graph.evidenceTruncated":"Mostrando las {shown} más recientes; hay más.","graph.drift":"Frescura","graph.driftHint":"Colorea los nodos por antigüedad: rojo = antiguo, verde = usado recientemente","common.unknown":"desconocido","insights.entitiesCount":"{n} entidades","roadmap.viewToggle":"Vista del historial del proyecto","roadmap.viewTree":"Árbol","roadmap.viewMindmap":"Mapa mental","roadmap.mindmapNeedsPhases":"El mapa mental necesita al menos 3 memorias en una ventana de 7 días.","roadmap.activePhase":"activa","roadmap.entryCount":"{count} entrada","roadmap.entriesCount":"{count} entradas","roadmap.otherGroup":"Otros ({count})","roadmap.lowSignalHidden":"({count} de señal baja ocultas)","roadmap.resetHint":"Restablecer zoom y posición (doble clic en el fondo también)","roadmap.zoomHint":"rueda para zoom · arrastra para mover · {pct}%","roadmap.moreEntities":"+{count} más","roadmap.viewDecisions":"Decisiones","roadmap.densityTitle":"Densidad de captura por categoría","roadmap.densityNote":"lo que memesh capturó — no todo lo que pasó","roadmap.lineageSupersedes":"{n} reemplazadas","roadmap.lineageConflicts":"{n} conflictos sin resolver","adr.empty":"Aún no hay decisiones registradas para este proyecto. Registra una con el tipo «decision» y aparecerá aquí con su historial.","adr.statusActive":"activa","adr.statusSuperseded":"reemplazada","adr.supersedes":"reemplaza","adr.supersededBy":"reemplazada por","nav.ariaLabel":"Secciones del panel","feedback.descLabel":"Descripción del comentario","graph.canvasA11y":"Grafo de conocimiento (en lienzo): {entities} entidades, {relations} relaciones, {orphans} sin conexión. Usa los filtros de tipo y la búsqueda de arriba para una vista no visual."},th:{"auth.title":"ต้องมีการยืนยันตัวตน","auth.intro":"แดชบอร์ดนี้ได้รับการป้องกันด้วย bearer token วางค่าของ MEMESH_REMOTE_TOKEN (หรือเนื้อหาของ <memeshDir>/remote-token) ด้านล่าง","auth.tokenLabel":"โทเค็น","auth.empty":"โทเค็นต้องไม่ว่างเปล่า","auth.invalid":"โทเค็นนี้ไม่ได้รับการยอมรับ กรุณาตรวจสอบแล้วลองใหม่อีกครั้ง","auth.submit":"ปลดล็อกแดชบอร์ด","auth.tokenPlaceholder":"วางโทเค็นที่นี่","brand.subtitle":"powered by pcircle.com","header.connected":"เชื่อมต่อแล้ว","header.disconnected":"ไม่ได้เชื่อมต่อ","header.connecting":"กำลังเชื่อมต่อ…","header.memories":"ความทรงจำ","insights.title":"คำแนะนำในการจัดระเบียบความจำ","insights.reviewTitle":"ข้อเสนอความจำที่เตรียมไว้","insights.reviewSubtitle":"แพ็กเกจงานที่รอการตรวจสอบจากมนุษย์","insights.reviewSource":"ข้อเสนอที่เตรียมไว้ — ตรวจสอบก่อนนำไปใช้","insights.source.calendar":"ไดเจสต์ตามปฏิทิน","insights.source.transcript":"บันทึกการสนทนา Claude Code","insights.reviewBoundary":"แดชบอร์ดตรวจสอบเฉพาะข้อเสนอที่เตรียมไว้แล้ว และไม่เรียกใช้หรือส่งงานให้เอเจนต์","insights.statPending":"รอดำเนินการ","insights.statApplied":"นำไปใช้แล้ว","insights.statRejected":"ปฏิเสธแล้ว","insights.filter.pending":"รอดำเนินการ","insights.filter.applied":"นำไปใช้แล้ว","insights.filter.rejected":"ปฏิเสธแล้ว","insights.filter.all":"ทั้งหมด","insights.refresh":"รีเฟรช","insights.loading":"กำลังโหลด…","insights.emptyOther":"ไม่มีข้อมูลที่นี่","insights.sources":"แหล่งที่มา","insights.status.pending":"รอดำเนินการ","insights.status.applied":"นำไปใช้แล้ว","insights.status.rejected":"ปฏิเสธแล้ว","insights.viewDetail":"ดูรายละเอียด","insights.collapse":"ย่อ","insights.accept":"ยอมรับ","insights.applying":"กำลังนำไปใช้…","insights.reject":"ปฏิเสธ","insights.rejectConfirm":"ปฏิเสธข้อมูลเชิงลึกนี้หรือไม่? การดำเนินการนี้ไม่สามารถย้อนกลับได้","insights.observations":"สรุปการสังเกต","insights.tags":"แท็ก","insights.sourceIds":"entity ต้นทาง","insights.validationWarnings":"คำเตือนการตรวจสอบแบบเดิม","insights.validationClaim":"ข้อความ","insights.validationReason":"เหตุผล","banner.pendingInsights":"มี insight ใหม่ {n} รายการรอให้คุณตรวจสอบ →","banner.dismiss":"ปิด","banner.viewAll":"ดูทั้งหมด","pattern.title":"Pattern","pattern.evidenceCount":"หลักฐาน {n} รายการ","pattern.severity":"ระดับความรุนแรง","pattern.severity.high":"สูง","pattern.severity.medium":"กลาง","pattern.severity.low":"ต่ำ","pattern.description":"คำอธิบาย pattern","tab.graph":"กราฟ","tab.settings":"ตั้งค่า","tab.home":"หน้าแรก","tab.memories":"ความทรงจำ","tab.project":"โปรเจกต์","memories.searchPlaceholder":"กรองขณะพิมพ์ — กด Enter เพื่อค้นหาตามความเกี่ยวข้อง","memories.scopeLabel":"ขอบเขต","memories.scopeWork":"เลเยอร์งาน","memories.scopeEvidence":"หลักฐาน","memories.scopeAll":"ทั้งหมด","memories.scopeArchived":"เก็บถาวร","memories.composition":"องค์ประกอบ","memories.rankedBy":"จัดอันดับตามความเกี่ยวข้อง","memories.backToList":"กลับไปที่รายการ","memories.workEmpty":"ยังไม่มีความทรงจำในเลเยอร์งาน — เป้าหมาย การตัดสินใจ บทเรียน และแผนจะปรากฏที่นี่เมื่อถูกบันทึก","memories.showAll":"แสดงความทรงจำทั้งหมด","memories.expand":"แสดงรายละเอียด","memories.collapse":"ซ่อนรายละเอียด","memory.technicalDetails":"รายละเอียดทางเทคนิค","memory.canonicalName":"ชื่อมาตรฐาน","memory.rawType":"ประเภทดิบ","home.analyticsTitle":"วิเคราะห์","handoff.terminal":"ต้องใช้ Terminal","handoff.terminalPrereq":"รันบนเครื่องที่ติดตั้ง MeMesh แดชบอร์ดจะไม่รันคำสั่งนี้ให้","handoff.copyCommand":"คัดลอกคำสั่ง","handoff.commandCopied":"คัดลอกคำสั่งแล้ว","handoff.github":"เปิด GitHub — ตรวจข้อมูลที่กรอกไว้ก่อนส่ง","home.analyticsHint":"สุขภาพ ไทม์ไลน์ รูปแบบ และการใช้งาน — ขยายเมื่อต้องการ","home.nextAction.eyebrow":"ขั้นตอนถัดไปที่แนะนำ","home.nextAction.why":"เหตุผล:","home.nextAction.result":"ผลลัพธ์ที่คาดหวัง:","home.nextAction.loading.title":"กำลังตรวจสอบสิ่งที่ต้องดำเนินการ…","home.nextAction.loading.why":"MeMesh กำลังอ่านสถานะปัจจุบันของความจำ ดัชนีค้นหา และคิวตรวจสอบ","home.nextAction.loading.result":"คำแนะนำเพียงหนึ่งรายการจะปรากฏเมื่อการตรวจสอบเสร็จสิ้น","home.nextAction.empty.title":"เพิ่มความจำรายการแรก","home.nextAction.empty.why":"คลังความจำยังว่าง จึงยังไม่มีสิ่งให้ค้นหาหรือจัดระเบียบ","home.nextAction.empty.result":"หน้า ความจำ ให้โหลดเดโมที่ลบได้หรือเริ่มบันทึกงานจริง","home.nextAction.empty.action":"เปิดความจำ","insights.emptyPending":"ยังไม่มีรายการรอตรวจสอบ การตรวจสอบความทรงจำใหม่จะแสดงที่นี่เมื่อพร้อม","home.nextAction.insights.title":"ตรวจสอบคำแนะนำจัดระเบียบความจำ","home.nextAction.insights.why":"MeMesh มีคำแนะนำที่รอการตัดสินใจของคุณ","home.nextAction.insights.result":"ยอมรับสรุปที่เป็นประโยชน์หรือปฏิเสธคำแนะนำที่ไม่เหมาะสม","home.nextAction.insights.action":"ตรวจสอบคำแนะนำ","home.nextAction.healthy.title":"ขณะนี้ไม่ต้องดำเนินการ","home.nextAction.healthy.why":"ความจำ ดัชนี และคิวตรวจสอบไม่มีงานที่ทราบว่ารอดำเนินการ","home.nextAction.healthy.result":"ทำงานต่อได้ MeMesh จะแสดงความต้องการถัดไปที่ยืนยันแล้วที่นี่","home.nextAction.unavailable.title":"ยังไม่สามารถแสดงคำแนะนำ","home.nextAction.unavailable.why":"อ่านการตรวจสอบสถานะหนึ่งไม่ได้ MeMesh จึงจะไม่คาดเดา","home.nextAction.unavailable.result":"โหลดใหม่เพื่อลองอีกครั้งโดยไม่เปลี่ยนความจำหรือการตั้งค่า","home.nextAction.unavailable.action":"ลองตรวจสอบสถานะอีกครั้ง","project.selectLabel":"โปรเจกต์","project.selectPrompt":"เลือกโปรเจกต์เพื่อดูประวัติของมัน","project.empty":"ยังไม่มีความทรงจำของโปรเจกต์ ทำงานใน git repository ที่ติดตั้ง memesh hooks แล้วเรื่องราวของมันจะปรากฏที่นี่","guard.sourceLesson":"บทเรียนต้นทาง","guard.pattern":"รูปแบบทริกเกอร์","guard.message":"คำเตือนที่จะแสดง","guard.shouldMatch":"ต้องทริกเกอร์เมื่อ","guard.shouldNotMatch":"ต้องเงียบเมื่อ","search.button":"ค้นหา","search.searching":"กำลังค้นหา…","search.results":"ผลลัพธ์","search.result":"ผลลัพธ์","search.noResults":"ไม่พบผลลัพธ์สำหรับ","search.facts":"ข้อเท็จจริง","browse.title":"ความทรงจำทั้งหมด","browse.active":"ใช้งานอยู่","browse.archived":"เก็บถาวร","browse.refresh":"รีเฟรช","browse.noMatch":"ไม่พบความทรงจำที่ตรงกัน:","browse.prev":"← ก่อนหน้า","browse.next":"ถัดไป →","browse.archive":"เก็บถาวร","browse.restore":"กู้คืน","browse.confirmArchive":"เก็บถาวรความทรงจำนี้?","browse.archiveFailed":"เก็บถาวรไม่สำเร็จ: {message}","browse.restoreFailed":"กู้คืนไม่สำเร็จ: {message}","analytics.totalMemories":"ความทรงจำทั้งหมด","analytics.knowledgeFacts":"ข้อเท็จจริง","analytics.connections":"การเชื่อมต่อ","analytics.topics":"หัวข้อ","analytics.insights":"ข้อมูลเชิงลึก","analytics.thisWeek":"สัปดาห์นี้","analytics.new":"ใหม่","analytics.stale":"ไม่ได้ใช้งาน (30+ วัน)","analytics.archivedLabel":"เก็บถาวร","analytics.mostRecalled":"ถูกเรียกดูมากที่สุด","health.title":"สุขภาพหน่วยความจำ","metrics.notMeasured":"ยังไม่ได้วัด","metrics.health":"สุขภาพ","metrics.healthNote":"กิจกรรม คุณภาพ ความสดใหม่ บทเรียน","metrics.critical":"บทเรียนร้ายแรง","metrics.criticalPartial":"จาก {tagged} รายการที่จัดประเภทแล้ว · ทั้งหมด {total} บทเรียน","metrics.criticalAll":"จากทั้งหมด {total} บทเรียน จัดประเภทครบแล้ว","metrics.criticalUnclassified":"{total} บทเรียน ยังไม่ได้จัดระดับความร้ายแรง","metrics.criticalNoLessons":"ยังไม่มีบทเรียนที่บันทึกไว้","metrics.citation":"การอ้างอิง","metrics.citationNote":"{cited} จาก {total} เซสชันอ้างอิงความทรงจำ","metrics.citationNotMeasured":"การติดตามการอ้างอิงจะเริ่มในเซสชันถัดไป","metrics.reused":"ใช้ซ้ำสัปดาห์นี้","metrics.reusedNote":"ค่าประมาณ — นับจากเวลาที่เข้าถึงล่าสุด","health.excellent":"ยอดเยี่ยม","health.good":"ดี","health.fair":"พอใช้","health.poor":"ไม่ดี","health.activity":"กิจกรรม","health.quality":"คุณภาพ","health.freshness":"ความสดใหม่","health.lessons":"การพัฒนาตนเอง","timeline.title":"30 วันที่ผ่านมา","timeline.created":"สร้างแล้ว","timeline.recalled":"เรียกคืนแล้ว","value.totalRecalls":"การเรียกคืนทั้งหมด","value.lessonsLearned":"บทเรียนที่เรียนรู้","value.lessonsSaved":"บทเรียนที่นำไปใช้","value.coverage":"ความครอบคลุมความรู้","cleanup.title":"คำแนะนำการทำความสะอาด","cleanup.allClean":"หน่วยความจำของคุณสะอาด ไม่พบเอนทิตีที่ล้าสมัยหรือซ้ำซ้อน","cleanup.staleLabel":"ความเชื่อมั่นต่ำ / ไม่ได้ใช้","cleanup.duplicateLabel":"อาจซ้ำซ้อน","cleanup.confidence":"ความเชื่อมั่น","cleanup.unused":"ไม่ได้ใช้","cleanup.entityMeta":"{type} · ความเชื่อมั่น {confidence}% · ไม่ได้ใช้มา {days} วัน","settings.saved":"บันทึกแล้ว","settings.configReadbackFailed":"เซิร์ฟเวอร์ไม่ส่งคืนการตั้งค่าที่บันทึกไว้ โปรดลองอีกครั้ง","settings.language":"ภาษา","settings.interfaceLanguage":"ภาษาของส่วนติดต่อ","settings.interfaceLanguageHint":"เปลี่ยนภาษาของส่วนติดต่อในเบราว์เซอร์นี้ทันที","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.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","settings.installationDetails":"รายละเอียดการติดตั้ง","settings.installationDetailsUnavailable":"ไม่สามารถเปรียบเทียบเวอร์ชันสำหรับการติดตั้งนี้ได้","settings.interfacePath":"อินเทอร์เฟซนี้","settings.terminalPath":"คำสั่งในเทอร์มินัล","settings.technicalDetails":"รายละเอียดทางเทคนิค","settings.installationDetailsHint":"เวอร์ชันที่ติดตั้งแตกต่างกันไม่ได้หมายความว่าต้องอัปเดตเสมอไป ดูรุ่นที่เผยแพร่แล้วได้ที่ การอัปเดต","graph.entities":"เอนทิตี","graph.relations":"ความสัมพันธ์","graph.orphans":"โหนดโดดเดี่ยว","graph.search":"ค้นหาโหนด…","graph.matches":"รายการที่ตรงกัน","graph.enterToOpen":"กด Enter เพื่อเปิด","graph.focusMode":"โฟกัส","graph.showAll":"แสดงทั้งหมด","graph.clickHint":"คลิกโหนดเพื่อโฟกัส","graph.interactHint":"คลิกโหนดเพื่อโฟกัส · ลากพื้นที่ว่างเพื่อเลื่อน · เลื่อนเพื่อซูม","graph.resetView":"รีเซ็ตมุมมอง","graph.resetViewHint":"รีเซ็ตการซูมและตำแหน่ง","graph.ageToday":"วันนี้","graph.ageDaysAgo":"{count} วันที่แล้ว","graph.ageWeeksAgo":"{count} สัปดาห์ที่แล้ว","lessons.error":"ข้อผิดพลาด","lessons.rootCause":"สาเหตุหลัก","lessons.fix":"วิธีแก้ไข","lessons.prevention":"การป้องกัน","feedback.button":"💬 ความคิดเห็น","feedback.title":"เปิดความคิดเห็นบน GitHub","feedback.bug":"ข้อผิดพลาด","feedback.feature":"ข้อเสนอแนะ","feedback.question":"คำถาม","feedback.placeholder":"อธิบายความคิดเห็นของคุณ…","feedback.includeSys":"รวมข้อมูลระบบ","feedback.submit":"เปิด GitHub Issue","feedback.submitting":"กำลังรวบรวมการวินิจฉัย…","feedback.popupBlocked":"GitHub ไม่ได้เปิด ร่างของคุณยังอยู่ครบ โปรดอนุญาตป๊อปอัป ลองอีกครั้ง หรือคัดลอกลิงก์ที่เตรียมไว้","feedback.retry":"ลองเปิด GitHub อีกครั้ง","feedback.copyLink":"คัดลอกลิงก์ GitHub","feedback.linkCopied":"คัดลอกลิงก์แล้ว","feedback.copyFailed":"คัดลอกลิงก์ไม่ได้ โปรดลองเปิด GitHub อีกครั้ง","doctorBanner.warnTitleSoft":"memesh มีบันทึกการตั้งค่า","doctorBanner.failTitle":"การตั้งค่า memesh ยังไม่สมบูรณ์","doctorBanner.dismiss":"ปิด","doctorBanner.getHelp":"ขอความช่วยเหลือ","doctorBanner.helpHint":"เปิด GitHub issue พร้อมข้อมูลการวินิจฉัยที่กรอกไว้แล้ว","doctorBanner.preambleForIssue":"memesh doctor รายงานสิ่งต่อไปนี้บนการติดตั้งของฉัน:","doctorBanner.moreCount":"…และอีก {n} รายการ — รัน `memesh doctor` เพื่อดูรายการทั้งหมด","doctorBanner.fix":"แก้ไขอัตโนมัติ","doctorBanner.fixInProgress":"กำลังแก้ไข…","doctorBanner.fixDone":"แก้ไขแล้ว","doctorBanner.restartRequired":"เริ่มเอเจนต์ใหม่เพื่อทำการอัปเดตนี้ให้เสร็จ","doctor.label.readme_locale_parity":"คำแปล README","doctor.label.config":"ไฟล์ตั้งค่า","doctor.label.mcp-config":"ไฟล์เชื่อมต่อ MCP","doctor.label.hooks-config":"ข้อกำหนด hook","doctor.label.hook-scripts":"สคริปต์ hook","doctor.label.hook-wiring":"การเชื่อมต่อกับ Claude Code","doctor.label.hook-activity":"บันทึกอัตโนมัติ","doctor.label.node-runtime":"เวอร์ชัน Node.js","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"โค้ดปลั๊กอินเป็นเวอร์ชันล่าสุด","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.install-channel":"วิธีติดตั้ง","doctor.label.fts_segmentation":"ดัชนีคำสำคัญ","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 (.claude-plugin/mcp.json) หายไป","doctor.msg.mcp-config.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/mcp.json เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง) Claude Code จึงอ่านไม่ได้","doctor.msg.mcp-config.invalid-json.fix":"แก้ {path} หรือติดตั้ง MeMesh ใหม่","doctor.msg.mcp-config.no-entry.summary":".claude-plugin/mcp.json ไม่มีรายการเซิร์ฟเวอร์ memesh แล้ว","doctor.msg.mcp-config.no-entry.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` สั่งเปิดไฟล์ที่ไม่มีอยู่ในการติดตั้งนี้ เครื่องมือ memesh ทุกตัวใน Claude Code จึงเริ่มทำงานไม่ได้","doctor.msg.mcp-config.entry-missing.fix":"ติดตั้ง MeMesh ใหม่ ถ้าคุณแก้ `.claude-plugin/mcp.json` เอง ให้ชี้กลับไปที่ `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`","doctor.msg.mcp-config.placeholder-unresolved.summary":"ยังไม่ได้ตรวจสอบ: `.claude-plugin/mcp.json` สั่งเปิดพาธที่มี `${CLAUDE_PLUGIN_ROOT}` ซึ่งมีเพียงระบบรันปลั๊กอินของ Claude Code เท่านั้นที่แทนค่าให้ การติดตั้งชุดนี้ไม่ได้ทำงานในฐานะปลั๊กอิน จึงยังไม่ได้ตรวจไฟล์ที่มันชี้ไป","doctor.msg.mcp-config.placeholder-unresolved.fix":"ตรวจแบบเดียวกับที่ระบบรันปลั๊กอินทำ: รัน `CLAUDE_PLUGIN_ROOT=<โฟลเดอร์ของการติดตั้งนี้> memesh doctor`","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json หายไป การบันทึกความจำอัตโนมัติจึงทำงานไม่ได้","doctor.msg.hooks-config.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง)","doctor.msg.hooks-config.invalid-json.fix":"แก้ {path} หรือติดตั้ง MeMesh ใหม่","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json ขาด hook ประเภทเหล่านี้: {types} การบันทึกอัตโนมัติบางส่วนจะไม่ทำงาน","doctor.msg.hooks-config.missing-types.fix":"กู้คืนการตั้งค่า hook ดั้งเดิม หรือติดตั้ง MeMesh ใหม่","doctor.msg.hook-scripts.none.summary":"การตั้งค่า hook ไม่มีสคริปต์เลย จึงบันทึกอะไรอัตโนมัติไม่ได้","doctor.msg.hook-scripts.none.fix":"ติดตั้ง MeMesh ใหม่","doctor.msg.hook-scripts.missing.summary":"สคริปต์ hook เหล่านี้หายไป: {files}","doctor.msg.hook-scripts.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.hook-scripts.not-executable.summary":"สคริปต์ hook เหล่านี้มีอยู่ แต่ไม่ได้รับอนุญาตให้รัน: {files}","doctor.msg.hook-scripts.not-executable.fix":"รัน `chmod +x scripts/hooks/*.js` หรือถ้าใช้ซอร์สโค้ดให้รัน `npm run build`","doctor.msg.hook-wiring.no-marker.summary":"memesh ยังไม่ได้เชื่อมกับ Claude Code จึงยังไม่มีอะไรถูกจดจำอัตโนมัติ","doctor.msg.hook-wiring.no-marker.fix":"รัน `memesh install-hooks` หนึ่งครั้ง แล้วรัน `memesh doctor` เพื่อยืนยัน","doctor.msg.hook-wiring.script-missing.summary":"hook ของ memesh ที่เชื่อมต่อไว้ชี้ไปที่ {path} ซึ่งไม่มีอยู่แล้ว — agent จะเรียกไฟล์ที่หายไปทุกครั้งที่เกิดเหตุการณ์ที่ตรงกัน มักเป็นซากจากการอัปเกรดที่เลิกใช้ hook นั้น","doctor.msg.hook-wiring.script-missing.fix":"รัน `memesh install-hooks` เพื่อเชื่อมต่อใหม่ (รายการที่เลิกใช้จะถูกลบ) แล้วรีสตาร์ต agent","doctor.msg.hook-wiring.marker-unreadable.summary":"อ่านบันทึกการเชื่อมต่อที่ {path} ไม่ได้","doctor.msg.hook-wiring.marker-unreadable.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.marker-malformed.summary":"บันทึกการเชื่อมต่อเสียหาย","doctor.msg.hook-wiring.marker-malformed.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.settings-missing.summary":"ไฟล์ตั้งค่าของ Claude Code ({path}) หายไป การเชื่อมต่อจึงขาด","doctor.msg.hook-wiring.settings-missing.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.settings-invalid.summary":"{path} เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง)","doctor.msg.hook-wiring.settings-invalid.fix":"กู้คืนจากไฟล์สำรอง หรือรัน `memesh install-hooks` เพื่อสร้างใหม่","doctor.msg.hook-wiring.entries-removed.summary":"รายการ memesh ถูกลบออกจาก {path} การเชื่อมต่อจึงขาด","doctor.msg.hook-wiring.entries-removed.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.root-moved.summary":"การเชื่อมต่อชี้ไปที่ {path} ซึ่งไม่มีอยู่แล้ว (memesh อาจถูกย้ายที่)","doctor.msg.hook-wiring.root-moved.fix":"รัน `memesh install-hooks` เพื่ออัปเดต","doctor.msg.hook-activity.never-ran.summary":"ไม่มี hook เก็บข้อมูลทำงานเลยตลอด {hours} ชั่วโมงนับตั้งแต่เริ่มติดตาม ทั้งที่การเชื่อมต่อ hook ปกติดี — ไม่มีอะไรถูกจดจำไว้เลย","doctor.msg.hook-activity.never-ran.fix":"ทำงานให้จบหนึ่งเซสชัน แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังบอกว่าไม่มี hook ทำงาน ให้รัน `memesh install-hooks` แล้วรีสตาร์ท agent","doctor.msg.hook-activity.stale.summary":"hook เก็บข้อมูลครั้งล่าสุดทำงานเมื่อประมาณ {hours} ชั่วโมงที่แล้ว ({hook}) ถ้าคุณทำงานหลังจากนั้น แปลว่าการเก็บข้อมูลหยุดไปแล้วและไม่มีอะไรจากเซสชันเหล่านั้นถูกบันทึก","doctor.msg.hook-activity.stale.fix":"รีสตาร์ท agent จบหนึ่งเซสชัน แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังไม่กลับมา ให้รัน `memesh install-hooks`","doctor.msg.hook-activity.stale-unconfirmed.summary":"hook session-summary รันครั้งล่าสุดประมาณ {hours} ชั่วโมงก่อน และ 3 วันที่ผ่านมาก็ไม่มีการเขียนจาก Claude Code เลย ถ้าเครื่องนี้ย้ายไปใช้ agent อื่น (Codex / Gemini) นี่เป็นเรื่องปกติ แต่ถ้ายังใช้ Claude Code ที่นี่ การเก็บบันทึกหยุดแล้ว","doctor.msg.hook-activity.stale-unconfirmed.fix":"ถ้ายังใช้ Claude Code บนเครื่องนี้: รีสตาร์ต จบเซสชันหนึ่งครั้ง แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังไม่ฟื้น ให้รัน `memesh install-hooks`","doctor.msg.hook-activity.query-failed.summary":'อ่านประวัติการทำงานของ hook จากฐานข้อมูลไม่ได้: {detail} สถานะการเก็บข้อมูลตอนนี้คือ "ไม่ทราบ" ซึ่งไม่เหมือนกับ "ปกติ"',"doctor.msg.hook-activity.query-failed.fix":"รัน `memesh doctor --verbose` เพื่อดูข้อความผิดพลาดเต็ม และตรวจว่า ~/.memesh อ่านได้และดิสก์ไม่เต็ม","doctor.msg.hook-activity.stale-unknown.summary":'อ่านเวลาการรันล่าสุดของ hook {hook} ไม่ได้ (ข้อมูลเสีย หรือถูกบันทึกโดยเครื่องที่นาฬิกาเพี้ยน) สถานะการเก็บบันทึกตอนนี้คือ "ไม่ทราบ" ซึ่งไม่เหมือนกับ "ปกติ"',"doctor.msg.hook-activity.stale-unknown.fix":"จบเซสชันงานหนึ่งครั้งแล้วรัน `memesh doctor` อีกครั้ง — การรันครั้งใหม่จะเขียนทับเวลาที่เสีย","doctor.msg.hook-activity.disabled.summary":"การเก็บบันทึกอัตโนมัติถูกปิดอยู่ (MEMESH_AUTO_CAPTURE หรือ autoCapture ในการตั้งค่า) — เป็นการตั้งใจ ดังนั้น hook เงียบจึงเป็นเรื่องที่คาดไว้ เปิดกลับเพื่อกลับมาเก็บบันทึกเซสชัน","doctor.msg.hook-activity.disabled-env.summary":"การเก็บบันทึกอัตโนมัติถูกปิดโดย MEMESH_AUTO_CAPTURE=false ในสภาพแวดล้อมของ shell นี้ doctor เห็นได้เฉพาะสภาพแวดล้อมของตัวเอง — ถ้า agent ของคุณรันโดยไม่มีตัวแปรนี้ การเก็บบันทึกฝั่งนั้นไม่ได้รับผลกระทบ","doctor.msg.hook-activity.not-wired.summary":"ไม่มี hook เก็บบันทึกใดเคยรันเลย — และบนเครื่องนี้ไม่พบการเชื่อมต่อ hook เก็บบันทึก (Stop / PostToolUse / PreCompact) ที่ยืนยันได้ จึงไม่มีอะไรให้รัน","doctor.msg.hook-activity.not-wired.fix":"ถ้าต้องการเก็บบันทึกอัตโนมัติ ให้รัน `memesh install-hooks` ถ้าการติดตั้งนี้ใช้เฉพาะ MCP (Codex / Gemini) นี่เป็นเรื่องปกติและข้ามได้","doctor.msg.hook-activity.stop-silent.summary":"hook {hook} ยังประทับเวลาอยู่ แต่ hook session-summary ไม่เคยรันเลยสักครั้งตลอด {hours} ชั่วโมงนับตั้งแต่เริ่มติดตาม — การเก็บบันทึกเซสชันอาจพังอยู่ โดยถูกการเก็บบันทึก commit บังไว้","doctor.msg.hook-activity.stop-silent.fix":"จบเซสชันงานหนึ่งครั้งแล้วรัน `memesh doctor` อีกครั้ง ถ้า session-summary ยังไม่รัน ให้รัน `memesh install-hooks` แล้วรีสตาร์ต agent","doctor.msg.hook-activity.never-ran-legacy.summary":"ไม่มี hook ใดประทับเวลาหัวใจเต้นเลย แต่นับตั้งแต่เริ่มติดตามมีความทรงจำจากการเก็บบันทึกอัตโนมัติ {captured} รายการเข้ามา — น่าจะเป็น hook รุ่นเก่าก่อนมีระบบติดตามที่ยังรันอยู่","doctor.msg.hook-activity.never-ran-legacy.fix":"อัปเดต hook ของ memesh เป็นรุ่นปัจจุบัน (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) แล้วรีสตาร์ต agent","doctor.msg.node-runtime.too-old.summary":"Node.js ของคุณเก่ากว่าที่แพ็กเกจนี้รองรับ {detail}","doctor.msg.node-runtime.too-old.fix":"อัปเกรด Node.js เป็น {required} ขึ้นไป แล้วรัน `memesh doctor` อีกครั้ง","doctor.msg.native-binding.load-failed.summary":"SQLite ไม่สามารถเปิดฐานข้อมูลได้: {detail}","doctor.msg.native-binding.load-failed.fix":"ตรวจสอบสภาพแวดล้อม Node และติดตั้ง MeMesh ใหม่หากจำเป็น","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.shell-cli.versions.summary":"เวอร์ชันที่ติดตั้ง: อินเทอร์เฟซนี้ {current}; เทอร์มินัล {terminal}","doctor.msg.plugin-cache.stale.summary":"ปลั๊กอินติดตั้งจาก commit {installed} แต่ marketplace ไปถึง {marketplace} แล้วภายใต้เวอร์ชันเดียวกัน {host} ไม่รีเฟรชแคชเมื่อเวอร์ชันไม่เปลี่ยน คุณจึงกำลังรันโค้ดที่เก่ากว่าที่ marketplace มี","doctor.msg.plugin-cache.stale.fix":"รัน `{command}` เพื่อรีเฟรชแคช แล้วรีสตาร์ต {host}","doctor.msg.plugin-cache.unverifiable.summary":"ไม่สามารถบอกได้ว่าปลั๊กอินที่ติดตั้งตรงกับ marketplace หรือไม่ ดูแค่เวอร์ชันไม่พอ — บิลด์สองชุดอาจมีเวอร์ชันเดียวกัน","doctor.msg.plugin-cache.unverifiable.fix":"รัน `{command}` หนึ่งครั้ง มันจะบันทึก commit และการตรวจสอบนี้จะตอบได้","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.config-parse.retired-settings.summary":"ไฟล์ตั้งค่าที่ถูกต้องใน {path} ยังมีการตั้งค่าระดับบนสุดที่เลิกใช้แล้ว {count} รายการ ({keys}) เวอร์ชันนี้จะข้ามค่าเหล่านี้ แต่ข้อมูลรับรองหรือการตั้งค่าผู้ให้บริการเดิมอาจยังอยู่บนดิสก์","doctor.msg.config-parse.retired-settings.fix":"ตรวจสอบ {path} ในเครื่องและลบเฉพาะคีย์ระดับบนสุดที่เลิกใช้แล้วเหล่านั้น อย่าวางไฟล์ใน issue เพราะอาจมีข้อมูลรับรอง จากนั้นรัน memesh doctor อีกครั้ง","doctor.msg.message-capability.probe-failed.summary":"การตรวจสอบความสามารถด้านข้อความที่ติดตั้งล้มเหลว: {detail}","doctor.msg.message-router.socket-missing.summary":"ไม่มี socket ของ router Local ที่ {path} และจะไม่ปลุก session ที่หยุดหรือไม่มีอยู่","doctor.msg.message-router.socket-insecure.summary":"socket ของ router ที่ {path} ไม่ใช่ Unix socket ส่วนตัวของเจ้าของ","doctor.msg.message-router.socket-unreachable.summary":"มี socket ส่วนตัวของ router ที่ {path} แต่ไม่รับการเชื่อมต่อภายในเครื่อง","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.citation.none.summary":"เซสชันได้รับความทรงจำที่ถูกแทรกเข้ามา แต่ไม่มีรายการใดถูกอ้างอิง","doctor.msg.citation.none.fix":"ตรวจสอบข้อตกลงการอ้างอิงที่ ~/.claude/rules/memesh-citations.md แล้วตรวจอีกครั้งหลังผ่านไปหลายเซสชัน","doctor.msg.database.broken.summary":"ฐานข้อมูลใช้งานไม่ได้: {detail}","doctor.update_status.prerelease":"กำลังใช้งานรุ่นก่อนเผยแพร่ ({current}); npm latest คือ {latest}","patterns.title":"รูปแบบของคุณ","patterns.workSchedule":"ตารางการทำงาน","patterns.peakHours":"ช่วงเวลาพีค","patterns.busiestDays":"วันที่ยุ่งที่สุด","patterns.workflow":"กระบวนการทำงาน","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.auth.cross-origin":"คำขอนี้มาจากเว็บไซต์อื่น หรือมาถึงเซิร์ฟเวอร์ด้วยชื่อที่ไม่คาดคิด จึงถูกปฏิเสธ กรุณาเปิดแดชบอร์ดจากที่อยู่ที่ `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.rate.limited":"มีคำขอมากเกินไปในช่วงเวลาสั้น ๆ กรุณารอสักครู่แล้วลองใหม่อีกครั้ง","httpError.server.internal":"เซิร์ฟเวอร์เกิดข้อผิดพลาดที่ไม่คาดคิด","time.justNow":"เมื่อสักครู่","time.hoursAgo":"{count} ชั่วโมงที่แล้ว","time.today":"วันนี้","time.yesterday":"เมื่อวาน","time.daysAgo":"{count} วันที่แล้ว","time.lastWeek":"สัปดาห์ที่แล้ว","time.weeksAgo":"{count} สัปดาห์ที่แล้ว","time.lastMonth":"เดือนที่แล้ว","time.monthsAgo":"{count} เดือนที่แล้ว","memory.access.frequent":"ใช้บ่อย · {count} ครั้ง","memory.access.recalls":"{count} ครั้ง","memory.access.never":"ไม่เคยเรียก","cluster.knowledge":"ความรู้","cluster.activity":"กิจกรรม","cluster.session":"เซสชัน","cluster.reference":"อ้างอิง","cluster.all":"ทั้งหมด","browse.filterTime":"เวลา","browse.filterValue":"มูลค่า","browse.filterProject":"โปรเจกต์","browse.filterSort":"จัดเรียง","browse.timeToday":"วันนี้","browse.timeWeek":"สัปดาห์นี้","browse.timeMonth":"เดือนนี้","browse.timeOlder":"เก่ากว่า","browse.valueRecalled":"✓ ใช้แล้ว","browse.valueNever":"ไม่เคยเรียก","browse.sortMostRecalled":"ใช้มากที่สุด","browse.sortRecent":"ล่าสุด","browse.sortCreated":"สร้างเมื่อ","browse.emptyFilter":"ไม่มีหน่วยความจำในหมวดนี้ — ลองตัวกรองอื่น","lessons.stepsLabel":"ขั้น","lessons.commitsCount":"{count} commits","lessons.unstructured":"(ไม่มีฟิลด์ที่มีโครงสร้าง — ดูหน่วยความจำดิบ)","lessons.moreItems":"+{count} เพิ่มเติม","roadmap.title":"ประวัติโครงการ","roadmap.summary":"{count} ความทรงจำ · {first} → {last}","roadmap.switchToList":"↩ มุมมองรายการ","roadmap.switchToRoadmap":"🕘 มุมมองประวัติ","roadmap.emptyProject":"ยังไม่มีความทรงจำในโครงการนี้","loop.label":"ลูปความทรงจำ","loop.subtitleHas":"ความทรงจำเชิงความรู้ที่ถูกเรียกในช่วง 7 วันที่ผ่านมา","loop.subtitleNone":"สัปดาห์นี้ยังไม่มีความทรงจำที่ถูกเรียก","loop.approxNote":"ค่าประมาณ — การติดตามเต็มรูปแบบเริ่มหลังการอัพเกรด","loop.sparkLabel":"30 วันล่าสุด","roadmap.milestones":"เหตุการณ์สำคัญ","roadmap.keyLessons":"บทเรียนสำคัญ","radar.title":"เรดาร์ความครอบคลุม","radar.caption":"ความทรงจำที่ใช้งาน (ไม่รวม session และ commit)","radar.axis.lessons":"บทเรียน","radar.axis.decisions":"การตัดสินใจ","radar.axis.patterns":"แพทเทิร์น","radar.axis.bugs":"แก้ไขบั๊ก","radar.axis.processes":"กระบวนการ","radar.axis.architecture":"สถาปัตยกรรม","ageMatrix.title":"การกระจายอายุ","ageMatrix.low":"ต่ำ","ageMatrix.high":"สูง","ageMatrix.legend":"ความเข้ม = ความหนาแน่น","ageMatrix.typeColumn":"ประเภท","header.signalModeOn":"ความทรงจำสำคัญ","header.signalModeOff":"ความทรงจำทั้งหมด","header.signalModeOnHint":"แสดงเป้าหมาย การตัดสินใจ บทเรียน และแผน พร้อมซ่อนบันทึก session, commit และกิจกรรมที่เก็บอัตโนมัติในความทรงจำและกราฟความรู้","header.signalModeOffHint":"แสดงบันทึกทั้งหมด รวมถึง session, commit และกิจกรรมที่เก็บอัตโนมัติในความทรงจำและกราฟความรู้","globalFilter.focusedStatus":"มุมมองรวม: ความทรงจำสำคัญ — ซ่อนบันทึก session, commit และกิจกรรมที่เก็บอัตโนมัติในความทรงจำและกราฟความรู้","globalFilter.allStatus":"มุมมองรวม: ความทรงจำทั้งหมด — รวมบันทึก session, commit และกิจกรรมที่เก็บอัตโนมัติในความทรงจำและกราฟความรู้","roadmap.phases":"ระยะ","onboarding.title":"ยินดีต้อนรับสู่ MeMesh","onboarding.body":"ที่เก็บความทรงจำว่างเปล่า เริ่มด้วยทัวร์ 30 รายการที่คัดสรรแล้วหรือบันทึกบทเรียนแรก","onboarding.coreHint":"หน่วยความจำภายใน: remember การค้นหาคำสำคัญด้วย FTS5 hooks และการดู Dashboard ทำงานร่วมกัน","onboarding.searchHint":"การเรียกคืนใช้การค้นหาคำสำคัญด้วย FTS5 ภายในเครื่อง","onboarding.reviewHint":"เอเจนต์ที่กำลังทำงานสามารถเตรียมแพ็กเกจไดเจสต์หรือบทสนทนาที่มองเห็นได้ ส่วนแดชบอร์ดมีหน้าที่ตรวจสอบข้อเสนอที่เตรียมไว้เท่านั้น","onboarding.seedButton":"เริ่มทัวร์ตัวอย่าง","onboarding.seedingButton":"กำลังโหลด…","onboarding.seedHint":"เพิ่ม 30 ความทรงจำที่นี่เลย — ไม่ต้องเปิดเทอร์มินัล","onboarding.cliReference":"ชอบใช้ CLI ใช่ไหม?","onboarding.hintDemo":"ใส่ 30 ความทรงจำตัวอย่าง ลบทีหลังได้","onboarding.hintReset":"ลบทุกอย่างที่ติด metadata.demo","onboarding.resetButton":"ล้างข้อมูลตัวอย่าง","onboarding.resettingButton":"กำลังลบ…","onboarding.demoLoadedTitle":"โหลดข้อมูลตัวอย่างแล้ว","onboarding.demoLoadedBody":"มีความทรงจำที่ติดแท็ก demo จำนวน {count} รายการ ที่นี่จะลบเฉพาะรายการเหล่านั้น","onboarding.resetConfirm":"ลบความทรงจำทั้งหมดที่ติดแท็ก metadata.demo หรือไม่? ไม่สามารถกู้คืนแถวเดิมได้ แต่โหลดตัวอย่างใหม่ภายหลังได้ ความทรงจำจริงจะยังอยู่","onboarding.resetReadbackFailed":"ยืนยันการรีเซ็ตไม่ได้เพราะยังมีความทรงจำ demo ปุ่มล้างข้อมูลจะยังแสดงอยู่ โปรดลองอีกครั้งหรือเรียก memesh doctor","onboarding.dismiss":"ปิด","common.serverError":"เซิร์ฟเวอร์ตอบกลับข้อผิดพลาด (HTTP {status}) ลองอีกครั้ง — หากยังเกิดซ้ำ ให้รัน `memesh doctor`","emptyLibrary.title":"ความทรงจำของคุณยังว่างเปล่า","emptyLibrary.body":"ยังไม่มีข้อมูลบันทึกไว้ โหลดทัวร์ตัวอย่าง 30 รายการเพื่อดูการทำงานของ MeMesh — ลบทีหลังได้ในคลิกเดียว","browse.truncated":"กำลังแสดง {shown} รายการแรกจากทั้งหมด {total} — ใช้การค้นหาหรือตัวกรองเพื่อดูที่เหลือ","browse.truncatedUnknownTotal":"กำลังแสดง {shown} รายการแรก — อ่านจำนวนทั้งหมดไม่ได้ จึงอาจมีมากกว่านี้","graph.cappedNote":"แสดงเฉพาะ {shown} อันดับแรกจาก {total} เอนทิตี (เรียงตามการเรียกคืน) เพื่อให้กราฟลื่นไหล","ageMatrix.bucket.week":"สัปดาห์นี้","ageMatrix.bucket.month":"เดือนนี้","ageMatrix.bucket.quarter":"ไตรมาสนี้","ageMatrix.bucket.older":"เก่ากว่า","settings.behaviourTitle":"การทำงาน","settings.autoUpdateLabel":"นโยบายอัพเดตอัตโนมัติ","settings.autoUpdateOff":"ปิด — ด้วยตนเองเท่านั้น","settings.autoUpdatePatch":"Patch — ใช้ X.Y.Z+1","settings.autoUpdateMinor":"Minor — ใช้ X.Y+1.0","settings.autoUpdateMajor":"Major — ใช้ทุกระดับ","settings.autoUpdateHint":"เมื่อใช้ครั้งแรก จะขอความยินยอมหนึ่งครั้งต่อเซสชัน MEMESH_AUTO_UPDATE กำหนดขอบเขตเท่านั้นและไม่ข้ามการยินยอม","errors.timeout":"คำขอหมดเวลา","type.lesson_learned":"บทเรียน","type.lesson":"บทเรียน","type.mistake":"ความผิดพลาด","type.decision":"การตัดสินใจ","type.goal":"เป้าหมาย","type.architecture_decision":"ตัดสินใจสถาปัตย์","type.design_decision":"ตัดสินใจด้านดีไซน์","type.pattern":"แพทเทิร์น","type.technical_pattern":"แพทเทิร์นเทคนิค","type.best_practice":"แนวปฏิบัติที่ดี","type.bug_fix":"แก้บั๊ก","type.verification_result":"ผลการตรวจสอบ","type.test_result":"ผลการทดสอบ","type.process":"กระบวนการ","type.architecture":"สถาปัตยกรรม","type.infrastructure":"โครงสร้างพื้นฐาน","type.feature":"ฟีเจอร์","type.release":"รีลีส","type.refactoring":"รีแฟคเตอร์","type.commit":"คอมมิต","type.session_keypoint":"ประเด็นสำคัญของเซสชัน","type.session_identity":"ตัวตนของเซสชัน","type.session-insight":"ข้อคิดจากเซสชัน","type.session-summary":"สรุปเซสชัน","type.session-identity":"ตัวตนของเซสชัน","type.weekly_summary":"สรุปรายสัปดาห์","type.weekly-summary":"สรุปรายสัปดาห์","type.note":"โน้ต","type.plan":"แผน","type.knowledge":"ความรู้","type.workflow_checkpoint":"เหตุการณ์สำคัญ","type.concept":"แนวคิด","type.tool":"เครื่องมือ","type.person":"บุคคล","relation.relates_to":"เกี่ยวข้องกับ","relation.related-to":"เกี่ยวข้องกับ","relation.depends_on":"ขึ้นอยู่กับ","relation.implements":"อิมพลีเมนต์","relation.learned_from":"เรียนรู้จาก","relation.supersedes":"แทนที่","relation.contradicts":"ขัดแย้งกับ","relation.follows":"ต่อจาก","relation.belongs-to-project":"อยู่ในโครงการ","relation.evidences":"เป็นหลักฐานของ","relation.co-created":"สร้างร่วมกัน","relation.shares-name-tokens":"ชื่อคล้ายกัน","patterns.day.0":"วันอาทิตย์","patterns.day.1":"วันจันทร์","patterns.day.2":"วันอังคาร","patterns.day.3":"วันพุธ","patterns.day.4":"วันพฤหัสบดี","patterns.day.5":"วันศุกร์","patterns.day.6":"วันเสาร์","lessons.severity.critical":"วิกฤต","lessons.severity.major":"รุนแรง","lessons.severity.minor":"เล็กน้อย","memory.tooltip.project":"โครงการ","memory.tooltip.recalled":"ถูกเรียกคืน {count} ครั้ง","memory.tooltip.hasRelations":"เชื่อมโยงกับความทรงจำอื่น {count} รายการ","memory.tooltip.createdAt":"สร้างเมื่อ {date}","graph.layerLabel":"ชั้นของกราฟ","graph.layerWork":"งาน","graph.layerAll":"ทั้งหมด","graph.layerWorkHint":"การตัดสินใจ บทเรียน และแผนที่บันทึกไว้ พร้อมลิงก์ที่บันทึกไว้","graph.layerAllHint":"ความทรงจำที่บันทึกไว้ทั้งหมดและลิงก์ที่บันทึกไว้ ลิงก์อาจถูกเพิ่มโดยเอเจนต์หรือกฎการบำรุงรักษา มุมมองนี้ไม่ได้เรียกโมเดลภาษา","graph.layerFellBack":"ตอนนี้มีรายการงานไม่ถึง {min} รายการ จึงแสดงกราฟทั้งหมดแทน บันทึกการตัดสินใจและบทเรียนแล้วมุมมองนี้จะค่อย ๆ เต็มขึ้น","graph.evidenceFor":"หลักฐานของ {node}","graph.evidenceClose":"ปิด","graph.evidenceLoading":"กำลังโหลดหลักฐาน…","graph.evidenceFailed":"โหลดหลักฐานของรายการนี้ไม่สำเร็จ","graph.evidenceEmpty":"ยังไม่มีหลักฐานเชื่อมกับรายการนี้ รัน `memesh kg backfill` เพื่อสร้างการเชื่อมโยงจาก commit และบันทึกเซสชัน","graph.evidenceTruncated":"แสดง {shown} รายการล่าสุด ยังมีอีก","graph.drift":"ความสดใหม่","graph.driftHint":"ระบายสีตามอายุ: แดง = ไม่ได้ใช้นาน, เขียว = ใช้ล่าสุด","common.unknown":"ไม่ทราบ","insights.entitiesCount":"{n} เอนทิตี","roadmap.viewToggle":"มุมมองประวัติโครงการ","roadmap.viewTree":"ต้นไม้","roadmap.viewMindmap":"มายด์แมป","roadmap.mindmapNeedsPhases":"มายด์แมปต้องมีความทรงจำอย่างน้อย 3 รายการภายใน 7 วัน","roadmap.activePhase":"กำลังดำเนิน","roadmap.entryCount":"{count} รายการ","roadmap.entriesCount":"{count} รายการ","roadmap.otherGroup":"อื่น ๆ ({count})","roadmap.lowSignalHidden":"(ซ่อน {count} รายการสัญญาณต่ำ)","roadmap.resetHint":"รีเซ็ตการซูมและตำแหน่ง (ดับเบิลคลิกพื้นหลังก็ได้)","roadmap.zoomHint":"เลื่อนเพื่อซูม · ลากเพื่อเลื่อน · {pct}%","roadmap.moreEntities":"อีก {count} รายการ","roadmap.viewDecisions":"การตัดสินใจ","roadmap.densityTitle":"ความหนาแน่นของการบันทึกตามหมวดหมู่","roadmap.densityNote":"สิ่งที่ memesh บันทึกไว้ — ไม่ใช่ทุกอย่างที่เกิดขึ้น","roadmap.lineageSupersedes":"ถูกแทนที่แล้ว {n} รายการ","roadmap.lineageConflicts":"ความขัดแย้งที่ยังไม่ได้แก้ไข {n} รายการ","adr.empty":'โครงการนี้ยังไม่มีการตัดสินใจที่บันทึกไว้ บันทึกหนึ่งรายการด้วยประเภท "decision" แล้วรายการนั้นจะปรากฏที่นี่พร้อมประวัติของมัน',"adr.statusActive":"ใช้งานอยู่","adr.statusSuperseded":"ถูกแทนที่แล้ว","adr.supersedes":"แทนที่","adr.supersededBy":"ถูกแทนที่โดย","nav.ariaLabel":"ส่วนต่าง ๆ ของแดชบอร์ด","feedback.descLabel":"รายละเอียดข้อเสนอแนะ","graph.canvasA11y":"กราฟความรู้ (วาดบนแคนวาส): {entities} เอนทิตี, {relations} ความสัมพันธ์, {orphans} ที่ไม่เชื่อมต่อ ใช้ตัวกรองประเภทและการค้นหาด้านบนเพื่อดูแบบไม่ใช้ภาพ"}},$s={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 St="en";function Vs(){const t=localStorage.getItem("memesh-locale");if(t&&$t[t])return t;const o=navigator.language;if(o.startsWith("zh-TW")||o.startsWith("zh-Hant"))return"zh-TW";if(o.startsWith("zh"))return"zh-CN";const n=o.split("-")[0];return $t[n]?n:"en"}function Ks(){return St=Vs(),St}function Ys(t){St=t,localStorage.setItem("memesh-locale",t)}function s(t,o){const n=$t[St]?.[t]||$t.en[t]||t;return o?n.replace(/\{(\w+)\}/g,(i,a)=>{const r=o[a];return r===void 0?`{${a}}`:String(r)}):n}function me(){return St}function Xs(){return Object.entries($s).map(([t,o])=>({code:t,name:o}))}const Ro="memesh.signalMode",io="memesh:signal-mode-changed",Zs=!0;function ro(){try{const t=localStorage.getItem(Ro);if(t==="true")return!0;if(t==="false")return!1}catch{}return Zs}function Js(t){try{localStorage.setItem(Ro,String(t))}catch{}}function Po(){const[t,o]=b(ro);Z(()=>{function i(r){const l=r.detail;l&&typeof l.value=="boolean"?o(l.value):o(ro())}function a(r){r.key===Ro&&o(ro())}return window.addEventListener(io,i),window.addEventListener("storage",a),()=>{window.removeEventListener(io,i),window.removeEventListener("storage",a)}},[]);function n(i){Js(i),o(i),window.dispatchEvent(new CustomEvent(io,{detail:{value:i}}))}return[t,n]}function Qs({health:t,error:o}){const[n,i]=Po();return e("div",{class:"header",children:[e("div",{class:"header-brand",children:e("h1",{children:"MeMesh"})}),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,"aria-label":`${s(n?"header.signalModeOn":"header.signalModeOff")}. ${s(n?"header.signalModeOnHint":"header.signalModeOffHint")}`,title:s(n?"header.signalModeOnHint":"header.signalModeOffHint"),style:{fontSize:14,padding:"4px 10px",borderRadius:"var(--radius)",border:`1px solid ${n?"rgba(143, 242, 92, 0.4)":"var(--border)"}`,background:n?"var(--life-soft)":"transparent",color:n?"var(--life)":"var(--text-2)",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{marginRight:4},children:n?"●":"○"}),s(n?"header.signalModeOn":"header.signalModeOff")]}),t?e(Q,{children:[e("span",{children:[e("span",{class:"dot dot-ok"}),s("header.connected")]}),e("span",{class:"badge-version",children:["v",t.version," · ",t.entity_count.toLocaleString(me())," ",s("header.memories")]})]}):o?e("span",{children:[e("span",{class:"dot dot-err"}),s("header.disconnected")]}):e("span",{style:{color:"var(--text-3)"},children:s("header.connecting")})]})})]})}function ea({tabs:t,active:o,onSelect:n}){const i=V(null),a=V([]),[r,l]=b(!1),d=be(()=>{const c=i.current;c&&l(c.scrollLeft+c.clientWidth<c.scrollWidth-1)},[]);Z(()=>{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 m=(c,h)=>{let u;if(c.key==="ArrowRight"||c.key==="ArrowDown")u=(h+1)%t.length;else if(c.key==="ArrowLeft"||c.key==="ArrowUp")u=(h-1+t.length)%t.length;else if(c.key==="Home")u=0;else if(c.key==="End")u=t.length-1;else return;c.preventDefault(),n(t[u].key),a.current[u]?.focus(),a.current[u]?.scrollIntoView({block:"nearest",inline:"nearest"})};return e("nav",{"aria-label":s("nav.ariaLabel"),style:{position:"relative"},children:[e("div",{ref:i,class:"nav",role:"tablist","aria-label":s("nav.ariaLabel"),children:t.map(({key:c,label:h},u)=>{const g=c===o;return e("button",{ref:f=>{a.current[u]=f},id:`tab-${c}`,role:"tab","aria-selected":g?"true":"false","aria-controls":`panel-${c}`,tabIndex:g?0:-1,class:`nav-btn ${g?"active":""}`,onClick:()=>n(c),onKeyDown:f=>m(f,u),children:h},c)})}),r&&e("div",{"aria-hidden":"true",class:"nav-overflow-fade"})]})}const ta=1e4,wo="memesh_token";function So(){try{return localStorage.getItem(wo)}catch{return null}}function oa(t){try{t?localStorage.setItem(wo,t):localStorage.removeItem(wo)}catch{}}class jo extends Error{constructor(){super("auth_required"),this.name="AuthRequiredError"}}class Jn extends Error{constructor(o){super(`HTTP ${o}`),this.name="HttpError",this.status=o}}class Vt extends Error{constructor(o){super(o),this.name="NetworkError"}}class Qn extends Error{constructor(o){super(o),this.name="RateLimitError"}}function un(t){if(typeof t.errorCode=="string"&&t.errorCode){const n=`httpError.${t.errorCode}`,i=s(n);if(i!==n)return new Error(i.includes("`memesh")?`${s("handoff.terminal")}: ${i}`:i)}const o=typeof t.error=="string"&&t.error?t.error:s("errors.unknown");return new Error(o.includes("`memesh")?`${s("handoff.terminal")}: ${o}`:o)}async function te(t,o,n){const i=new AbortController,a=setTimeout(()=>i.abort(),ta);try{const r={"Content-Type":"application/json"},l=So();l&&(r.Authorization=`Bearer ${l}`);const d={method:t,headers:r,signal:i.signal};n&&(d.body=JSON.stringify(n));const m=await fetch(o,d);if(m.status===401)throw window.dispatchEvent(new Event("memesh:auth-required")),new jo;if(!m.ok){if(m.status===429)throw new Qn(s("httpError.rate.limited"));let h=null;try{h=await m.json()}catch{}throw h&&typeof h=="object"&&h.success===!1?un(h):new Jn(m.status)}const c=await m.json();if(!c.success)throw un(c);return c.data}catch(r){throw r instanceof Error&&r.name==="AbortError"?new Vt(s("errors.timeout")):r instanceof TypeError?new Vt(r.message):r}finally{clearTimeout(a)}}async function es(){const t=await te("GET","/v1/projects");if(!Array.isArray(t))throw console.warn("[memesh dashboard] /v1/projects answered with a shape this bundle cannot read:",t),new Error("unreadable projects payload");return t}async function na(){return te("GET","/v1/graph")}async function sa(){return te("GET","/v1/graph?layer=work")}async function aa(t){return te("GET",`/v1/graph/evidence?node=${encodeURIComponent(t)}`)}function Ze(t){return t instanceof Qn?"ratelimited":t instanceof Vt?"unreachable":"unreadable"}function xe(t){return t==="unreachable"?`${s("common.serverUnreachable")} ${s("handoff.terminal")}: ${s("common.serverUnreachableAction")}`:t==="ratelimited"?s("httpError.rate.limited"):`${s("common.responseUnreadable")} ${s("common.responseUnreadableAction")}`}function qe(t){return t instanceof Vt?xe("unreachable"):t instanceof jo?s("auth.title"):t instanceof Jn?s("common.serverError",{status:t.status}):t instanceof Error&&t.message?t.message:s("errors.unknown")}const ia=/^(Steps|Commits|Branch|Diff stats|Compaction reason|Tool calls|Plan ".+" completed)[:\s]/;function ra(t){return ia.test(t.trim())}function ts(t){const o=/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2}):(\d{2})$/.exec(t??"");if(!o)return null;const n=Date.UTC(+o[1],+o[2]-1,+o[3],+o[4],+o[5],+o[6]);if(!Number.isFinite(n))return null;const i=new Date(n);return i.getUTCFullYear()!==+o[1]||i.getUTCMonth()!==+o[2]-1||i.getUTCDate()!==+o[3]||i.getUTCHours()!==+o[4]||i.getUTCMinutes()!==+o[5]||i.getUTCSeconds()!==+o[6]?null:n}const ct={lesson_learned:"#DBB155",concept:"#3ACED6",pattern:"#59C5F5",technical_pattern:"#59C5F5",commit:"#A8AFFF",session_keypoint:"#52D0B3",session_identity:"#E39BDC",workflow_checkpoint:"#82BAFF",feature:"#EFA464",bug_fix:"#FB9890",tool:"#C9A3F5",person:"#F496BB",note:"#BCBE5E"},ca={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 Mo(t){return ca[t]??"reference"}const Kt={knowledge:ct.lesson_learned,activity:ct.commit,session:ct.session_keypoint,reference:ct.note};function De(t){const o=`type.${t}`,n=s(o);return n===o?t:n}function la(t){const o=`relation.${t}`,n=s(o);return n===o?t:n}function Je(t){return new Date(ts(t)??t)}function mt(t,o=new Date){if(!t)return"—";const n=Je(t);if(Number.isNaN(n.getTime()))return"—";const i=o.getTime()-n.getTime(),a=Math.floor(i/864e5);if(a<0)return n.toLocaleDateString(me(),{month:"short",day:"numeric"});if(a===0){const r=Math.floor(i/36e5);return r<1?s("time.justNow"):r<24?s("time.hoursAgo",{count:r}):s("time.today")}return a===1?s("time.yesterday"):a<7?s("time.daysAgo",{count:a}):a<14?s("time.lastWeek"):a<30?s("time.weeksAgo",{count:Math.floor(a/7)}):a<60?s("time.lastMonth"):a<365?s("time.monthsAgo",{count:Math.floor(a/30)}):n.toLocaleDateString(me(),{year:"numeric",month:"short",day:"numeric"})}function os(t,o=new Date){if(!t)return"older";const n=o.getTime()-Je(t).getTime(),i=Math.floor(n/864e5);return i<1?"today":i<7?"week":i<30?"month":"older"}const hn="project:";function Yt(t){const o=t.tags?.find(n=>n.startsWith(hn));return o?o.slice(hn.length):null}function da(t){if(!t||t.length===0)return"";const o=t.filter(i=>i.length>30&&!ra(i)),n=o.length>0?o:t;return n.slice(0,3).reduce((i,a)=>a.length>i.length?a:i,n[0])}function Be(t){const o=t.title?.trim();if(o)return o;const n=da(t.observations);if(n)return n;const i=t.created_at?Je(t.created_at).toLocaleDateString(me(),{year:"numeric",month:"short",day:"numeric"}):"";return i?`${De(t.type)} · ${i}`:De(t.type)}function ns(t){const o=t??0;return o===0?{count:o,label:s("memory.access.never"),tone:"none"}:o>=20?{count:o,label:s("memory.access.frequent",{count:o}),tone:"high"}:o>=5?{count:o,label:s("memory.access.recalls",{count:o}),tone:"medium"}:{count:o,label:s("memory.access.recalls",{count:o}),tone:"low"}}function ma(t){if((t.tags??[]).some(r=>r==="plan-completion"||r.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"}function ua(t){if(!t)return null;for(const o of t){const n=/^severity:(high|medium|low)$/i.exec(o);if(n)return n[1].toLowerCase()}return null}function pn(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 ha(t){const{proposal:o,detail:n,expanded:i,inFlight:a,onToggleExpand:r,onAccept:l,onReject:d,formatRelative:m,statusBadgeStyle:c,statusLabel:h}=t,u=o.status==="pending",g=ua(n?.proposed_digest?.tags),f=c(o.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:["#",o.id]}),e("span",{class:"tag",style:{fontSize:14,background:"var(--warning)",color:"var(--bg-0)",fontWeight:600},children:s("pattern.title")}),e("span",{style:{fontWeight:600},children:o.digest_name}),e("span",{class:"tag",style:{fontSize:14},children:o.project}),e("span",{class:"tag",style:{fontSize:14,color:"var(--text-2)"},children:s("pattern.evidenceCount",{n:String(o.source_count)})}),g&&e("span",{class:"tag",style:{fontSize:14,color:pn(g),borderColor:pn(g)},children:[s("pattern.severity"),": ",s(`pattern.severity.${g}`)]}),e("span",{class:"tag",style:{fontSize:14,...f},children:h(o.status)})]}),e("div",{style:{marginTop:6,color:"var(--text-2)",fontSize:14,lineHeight:1.5},children:o.digest_observations_preview!==null?e(Q,{children:[o.digest_observations_preview,"…"]}):e("span",{style:{fontStyle:"italic",color:"var(--text-3)"},children:s("insights.noPreview")})}),e("div",{style:{marginTop:4,color:"var(--text-3)",fontSize:14},children:m(o.created_at)})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[e("button",{class:"btn btn-ghost",onClick:()=>r(o.id),disabled:a,"aria-expanded":i,children:s(i?"insights.collapse":"insights.viewDetail")}),u&&i&&n?.proposed_digest&&e(Q,{children:[e("button",{class:"btn btn-primary",onClick:()=>l(o.id),disabled:a,children:s(a?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>d(o.id),disabled:a,style:{color:"var(--danger)"},children:s("insights.reject")})]})]})]}),n&&n.proposed_digest&&e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:14},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:14},children:s("insights.reviewSource")}),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:["⚠ ",s("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:n.proposed_digest.validation_warnings.map((R,C)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[s("insights.validationClaim"),": "]}),e("code",{style:{fontSize:14},children:R.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[s("insights.validationReason"),": "]}),e("span",{children:R.reason})]})]},C))})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:[s("pattern.description"),":"]}),e("ol",{style:{margin:"4px 0 0 18px",padding:0},children:n.proposed_digest.observations.map((R,C)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:R},C))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[s("insights.tags"),":"]})," ",n.proposed_digest.tags.map(R=>e("span",{class:"tag",style:{marginLeft:4,fontSize:14},children:R},R))]}),Array.isArray(n.source_ids)&&e("div",{style:{color:"var(--text-3)",fontSize:14,marginTop:6},children:[s("insights.sourceIds"),": ",n.source_ids.length," (",n.source_ids.slice(0,8).join(", "),n.source_ids.length>8?"…":"",")"]})]})]})}function pa(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;const o=t;return o.source?.host==="claude-code"&&o.source.scope==="mcp-workspace-root"&&typeof o.sessionId=="string"&&/^[a-f0-9]{64}$/.test(o.workspaceHash??"")&&o.trust==="untrusted"&&typeof o.coverage?.truncated=="boolean"&&Number.isSafeInteger(o.coverage.total_turns)&&o.coverage.total_turns>=0&&Number.isSafeInteger(o.coverage.included_turns)&&o.coverage.included_turns>=0&&o.coverage.included_turns<=o.coverage.total_turns&&Array.isArray(o.sources)&&o.sources.length===o.coverage.included_turns&&o.sources.every(n=>n&&(n.role==="user"||n.role==="assistant")&&typeof n.text=="string")}function gn(t){return t?mt(t.includes(" ")?t.replace(" ","T")+"Z":t):""}function fn(t){switch(t){case"pending":return{background:"var(--warning-soft)",color:"var(--warning)"};case"applied":return{background:"rgba(143,242,92,0.12)",color:"var(--life)"};case"rejected":return{background:"var(--danger-soft)",color:"var(--danger)"};default:return{background:"var(--neutral-soft)",color:"var(--text-3)"}}}function yn(t){const o=`insights.status.${t}`,n=s(o);return n===o?t:n}function ga({dataRevision:t=0,onStateChange:o}){const[n,i]=b([]),[a,r]=b("pending"),[l,d]=b(new Map),[m,c]=b(!1),[h,u]=b(""),[g,f]=b(!1),[R,C]=b(new Set),D=V(0),A=be(async()=>{const v=++D.current;c(!0),u(""),f(!1);try{const M=await te("GET","/v1/dream/proposals?status=all");if(v!==D.current)return;Array.isArray(M)?i(M):(console.warn("[memesh dashboard] /v1/dream/proposals answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",M),f(!0),u(xe("unreadable")))}catch(M){if(v!==D.current)return;console.warn("[memesh dashboard] /v1/dream/proposals failed to load:",M),f(!0),u(xe(Ze(M)))}finally{v===D.current&&c(!1)}},[]);Z(()=>{A()},[A,t]);const L=a==="all"?n:n.filter(v=>v.status===a),B=be(async v=>{if(l.has(v)){const M=new Map(l);M.delete(v),d(M);return}try{const M=await te("GET",`/v1/dream/proposals/${v}`),K=new Map(l);K.set(v,M),d(K)}catch(M){u(qe(M))}},[l]),F=v=>{C(M=>{const K=new Set(M);return K.add(v),K})},j=v=>{C(M=>{const K=new Set(M);return K.delete(v),K})},p=be(async v=>{F(v);try{await te("POST",`/v1/dream/proposals/${v}/accept`),window.dispatchEvent(new Event("memesh:data-changed"))}catch(M){u(qe(M))}finally{j(v)}},[]),x=be(async v=>{if(confirm(s("insights.rejectConfirm"))){F(v);try{await te("POST",`/v1/dream/proposals/${v}/reject`,{reason:"rejected via dashboard"}),window.dispatchEvent(new Event("memesh:data-changed"))}catch(M){u(qe(M))}finally{j(v)}}},[]),E=n.filter(v=>v.status==="pending").length,w=n.filter(v=>v.status==="applied").length,I=n.filter(v=>v.status==="rejected").length;return Z(()=>{o?.({pendingCount:E,loading:m,failed:g})},[m,o,E,g]),e("div",{id:"home-insights",tabIndex:-1,style:{display:"flex",flexDirection:"column",gap:16,scrollMarginTop:12},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:s("insights.reviewTitle")}),e("span",{style:{color:"var(--text-2)",fontSize:14},children:s("insights.reviewSubtitle")})]}),e("p",{style:{margin:"8px 0 0",color:"var(--text-2)",fontSize:14,lineHeight:1.5},children:s("insights.reviewBoundary")}),e("div",{style:{marginTop:10,display:"flex",gap:16,flexWrap:"wrap",color:"var(--text-2)",fontSize:14},children:[e("span",{children:[e("strong",{style:{color:"var(--life)",fontFamily:"var(--mono)"},children:E})," ",s("insights.statPending")]}),e("span",{children:[e("strong",{style:{fontFamily:"var(--mono)"},children:w})," ",s("insights.statApplied")]}),e("span",{children:[e("strong",{style:{fontFamily:"var(--mono)"},children:I})," ",s("insights.statRejected")]})]})]}),e("div",{style:{display:"flex",gap:8,flexWrap:"wrap"},role:"group","aria-label":s("insights.title"),children:[["pending","applied","rejected","all"].map(v=>{const M=a===v;return e("button",{class:"tag","aria-pressed":M,style:{padding:"4px 10px",borderRadius:"var(--radius-xs)",cursor:"pointer",border:"1px solid "+(M?"var(--life)":"var(--border)"),background:M?"rgba(143,242,92,0.12)":"transparent",color:M?"var(--life)":"var(--text-2)"},onClick:()=>r(v),children:s(`insights.filter.${v}`)},v)}),e("button",{class:"btn btn-ghost",onClick:A,style:{marginLeft:"auto"},children:s("insights.refresh")})]}),h&&e("div",{class:"card",role:"alert",style:{padding:12,color:"var(--danger)"},children:h}),m&&e("div",{style:{color:"var(--text-3)",fontSize:14},children:s("insights.loading")}),!m&&L.length===0&&e("div",{class:"card",style:{padding:16,textAlign:"center",color:"var(--text-2)"},children:s(a!=="pending"?"insights.emptyOther":"insights.emptyPending")}),L.map(v=>{const M=l.get(v.id),K=l.has(v.id),J=v.status==="pending",ae=R.has(v.id);if(v.kind==="pattern_emergent")return e(ha,{proposal:v,detail:M,expanded:K,inFlight:ae,onToggleExpand:B,onAccept:p,onReject:x,formatRelative:gn,statusBadgeStyle:fn,statusLabel:yn},v.id);const ue=v.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:["#",v.id]}),e("span",{style:{fontWeight:600},children:v.digest_name}),e("span",{class:"tag",style:{fontSize:14},children:v.project}),e("span",{class:"tag",style:{fontSize:14},children:v.cluster_key}),v.kind==="digest"&&v.source_kind&&e("span",{class:"tag",style:{fontSize:14},children:v.source_kind==="transcript"?s("insights.source.transcript"):s("insights.source.calendar")}),v.kind==="product_improvement"&&e("code",{class:"tag",style:{fontSize:14},children:"product_improvement"}),e("span",{class:"tag",style:{fontSize:14,color:"var(--text-2)"},children:[v.source_count," ",s("insights.sources")]}),e("span",{class:"tag",style:{fontSize:14,...fn(v.status)},children:yn(v.status)})]}),e("div",{style:{marginTop:6,color:"var(--text-2)",fontSize:14,lineHeight:1.5},children:ue!==null?e(Q,{children:[ue,"…"]}):e("span",{style:{fontStyle:"italic",color:"var(--text-3)"},children:s("insights.noPreview")})}),e("div",{style:{marginTop:4,color:"var(--text-3)",fontSize:14},children:gn(v.created_at)})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[e("button",{class:"btn btn-ghost",onClick:()=>B(v.id),disabled:ae,"aria-expanded":K,children:s(K?"insights.collapse":"insights.viewDetail")}),J&&K&&M&&e(Q,{children:[e("button",{class:"btn btn-primary",onClick:()=>p(v.id),disabled:ae,children:s(ae?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>x(v.id),disabled:ae,style:{color:"var(--danger)"},children:s("insights.reject")})]})]})]}),M&&M.proposed_digest&&v.kind==="relation"&&(()=>{const k=M.proposed_digest,[z,P]=k.relation_type==="supersedes"&&k.direction==="b_supersedes_a"?[k.b?.name,k.a?.name]:[k.a?.name,k.b?.name];return e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:14},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:14},children:s("insights.reviewSource")}),e("div",{style:{marginBottom:8},children:[e("strong",{children:k.verdict}),k.severity&&e("span",{class:"tag",style:{marginLeft:8,fontSize:14},children:k.severity})]}),e("div",{style:{marginBottom:8,fontFamily:"var(--mono)",fontSize:14},children:[z," —",k.relation_type,"→ ",P]}),k.rationale&&e("div",{style:{marginBottom:8,lineHeight:1.5},children:k.rationale}),k.recommended_action&&e("div",{style:{marginBottom:8,color:"var(--text-2)",lineHeight:1.5},children:["→ ",k.recommended_action]}),(k.excerpts?.a||k.excerpts?.b)&&e("div",{style:{marginBottom:4,color:"var(--text-2)",fontSize:14},children:[e("div",{children:[e("code",{children:"A"})," ",k.a?.name,": “",k.excerpts?.a,"”"]}),e("div",{children:[e("code",{children:"B"})," ",k.b?.name,": “",k.excerpts?.b,"”"]})]})]})})(),M&&M.proposed_digest&&v.kind==="guard"&&(()=>{const k=M.proposed_digest;return e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:14},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:14},children:s("insights.reviewSource")}),e("div",{style:{marginBottom:8},children:[e("span",{class:"tag",style:{fontSize:14},children:k.guard?.tool}),e("span",{style:{marginLeft:8,color:"var(--text-3)",fontSize:14},children:[s("guard.sourceLesson"),":"]})," ",e("span",{style:{fontSize:14},children:k.source_lesson?.title||k.source_lesson?.name})]}),e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:14,color:"var(--text-3)",marginBottom:2},children:s("guard.pattern")}),e("code",{style:{fontFamily:"var(--mono)",fontSize:14,wordBreak:"break-all"},children:k.guard?.pattern})]}),e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:14,color:"var(--text-3)",marginBottom:2},children:s("guard.message")}),e("div",{style:{lineHeight:1.5},children:k.guard?.message})]}),k.guard?.should_match?.length||k.guard?.should_not_match?.length?e("div",{style:{fontSize:14,color:"var(--text-2)"},children:[k.guard?.should_match?.length?e("div",{style:{marginBottom:4},children:[e("span",{style:{color:"var(--text-3)",fontSize:14},children:[s("guard.shouldMatch"),":"]})," ",k.guard.should_match.map((z,P)=>e("code",{style:{fontFamily:"var(--mono)",fontSize:14,marginRight:8},children:z},P))]}):null,k.guard?.should_not_match?.length?e("div",{children:[e("span",{style:{color:"var(--text-3)",fontSize:14},children:[s("guard.shouldNotMatch"),":"]})," ",k.guard.should_not_match.map((z,P)=>e("code",{style:{fontFamily:"var(--mono)",fontSize:14,marginRight:8},children:z},P))]}):null]}):null]})})(),M&&M.proposed_digest&&v.kind!=="relation"&&v.kind!=="guard"&&e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:14},children:[v.kind==="product_improvement"?e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:14},children:e("code",{children:"product_improvement"})}):e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:14},children:M.source_kind==="transcript"?s("insights.source.transcript"):s("insights.source.calendar")}),Array.isArray(M.proposed_digest.validation_warnings)&&M.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:["⚠ ",s("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:M.proposed_digest.validation_warnings.map((k,z)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[s("insights.validationClaim"),": "]}),e("code",{style:{fontSize:14},children:k.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[s("insights.validationReason"),": "]}),e("span",{children:k.reason})]})]},z))})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:[s("insights.observations"),":"]}),e("ol",{style:{margin:"4px 0 0 18px",padding:0},children:M.proposed_digest.observations.map((k,z)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:k},z))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[s("insights.tags"),":"]})," ",M.proposed_digest.tags.map(k=>e("span",{class:"tag",style:{marginLeft:4,fontSize:14},children:k},k))]}),Array.isArray(M.source_ids)&&e("div",{style:{color:"var(--text-3)",fontSize:14,marginTop:6},children:[s("insights.sourceIds"),": ",s("insights.entitiesCount",{n:M.source_ids.length})," (",M.source_ids.slice(0,8).join(", "),M.source_ids.length>8?"…":"",")"]}),pa(M.source_ids)&&e("div",{"data-testid":"transcript-source-evidence",style:{marginTop:12,padding:10,background:"var(--bg-2)",borderRadius:"var(--radius)"},children:[e("div",{style:{color:"var(--text-2)",fontSize:14,marginBottom:6},children:[e("strong",{children:s("insights.source.transcript")})," ",e("code",{children:M.source_ids.source.host})," · ",e("code",{children:M.source_ids.sessionId})," ·"," ",M.source_ids.coverage.included_turns,"/",M.source_ids.coverage.total_turns," ",s("insights.sources"),M.source_ids.coverage.truncated?"…":""]}),e("ol",{style:{margin:"0 0 0 18px",padding:0},children:M.source_ids.sources.map((k,z)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("code",{style:{fontSize:14},children:k.role})," ",k.text]},z))})]})]})]},v.id)})]})}function vn(t){return t>=80?"var(--success)":t>=60?"var(--life)":t>=40?"var(--warning)":"var(--danger)"}function fa(t){return t>=80?s("health.excellent"):t>=60?s("health.good"):t>=40?s("health.fair"):s("health.poor")}const ya=["activity","quality","freshness","lessons"];function va({score:t,factors:o}){const n=vn(t);return e("div",{class:"card",children:[e("div",{class:"card-title",children:s("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:14,fontWeight:500,color:"var(--text-2)"},children:fa(t)})]}),e("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:"10px"},children:ya.map(i=>{const a=o[i],r=Math.round(a.score/a.weight*100),l=vn(r);return e("div",{children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"4px"},children:[e("span",{style:{fontSize:14,color:"var(--text-2)"},children:s(`health.${i}`)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:14,color:"var(--text-3)"},children:[r,"%"]})]}),e("div",{style:{height:"4px",borderRadius:"2px",background:"var(--bg-0)",overflow:"hidden"},children:e("div",{style:{height:"100%",width:`${r}%`,borderRadius:"2px",background:l,transition:"width 600ms ease-out"}})})]},i)})})]})]})}const ot=220,je=36,ze=2;function ba({trend:t}){if(!t||t.length===0)return e("svg",{width:ot,height:je,style:{display:"block"},children:e("line",{x1:0,y1:je/2,x2:ot,y2:je/2,stroke:"rgba(255,255,255,0.06)",strokeWidth:1})});if(t.length===1){const l=ot/2,d=je/2;return e("svg",{width:ot,height:je,style:{display:"block"},children:[e("line",{x1:ze,y1:je-ze,x2:ot-ze,y2:je-ze,stroke:"rgba(255,255,255,0.06)",strokeWidth:1}),e("circle",{cx:l,cy:d,r:3,fill:"var(--life)"})]})}const o=Math.max(1,...t.map(l=>l.count)),n=(ot-ze*2)/(t.length-1),i=t.map((l,d)=>{const m=ze+d*n,c=je-ze-l.count/o*(je-ze*2);return`${m.toFixed(1)},${c.toFixed(1)}`}),a=`M${i[0]} L${i.slice(1).join(" L")}`,r=`${a} L${ze+(t.length-1)*n},${je-ze} L${ze},${je-ze} Z`;return e("svg",{width:ot,height:je,style:{display:"block"},children:[e("path",{d:r,fill:"rgba(143, 242, 92, 0.12)"}),e("path",{d:a,fill:"none",stroke:"var(--life)",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"}),t.map((l,d)=>{const[m,c]=i[d].split(",");return d===t.length-1?e("circle",{cx:m,cy:c,r:2.5,fill:"var(--life)"},d):null})]})}function ka({metric:t}){const{reusedThisWeek:o,trend:n,computedFrom:i}=t,a=i==="last_accessed_at_approximation",r=n.slice(0,Math.max(0,n.length-7)).slice(-7).reduce((m,c)=>m+c.count,0),l=n.slice(-7).reduce((m,c)=>m+c.count,0),d=r>0?Math.round((l-r)/r*100):null;return e("div",{class:"card",style:{display:"flex",gap:24,alignItems:"center",flexWrap:"wrap",padding:"20px 24px",background:"var(--life-soft)",border:"1px solid rgba(143, 242, 92, 0.18)"},children:[e("div",{style:{flex:"1 1 200px",minWidth:200},children:[e("div",{style:{fontSize:14,textTransform:"uppercase",letterSpacing:"0.08em",color:"var(--text-2)",fontWeight:600,marginBottom:6},children:s("loop.label")}),e("div",{style:{display:"flex",alignItems:"baseline",gap:12},children:[e("div",{style:{fontSize:84,fontWeight:700,lineHeight:1,color:o>0?"var(--life)":"var(--text-2)",fontFamily:"var(--font-ui)",letterSpacing:"-0.03em"},children:o>0?o.toLocaleString(me()):"—"}),d!==null&&d!==0&&e("span",{style:{fontSize:14,fontWeight:600,fontFamily:"var(--mono)",color:d>0?"var(--success)":"var(--danger)"},children:[d>0?"↑":"↓"," ",Math.abs(d),"%"]})]}),e("div",{style:{fontSize:14,color:"var(--text-1)",marginTop:4},children:o>0?s("loop.subtitleHas"):s("loop.subtitleNone")}),a&&e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:6,fontStyle:"italic"},children:s("loop.approxNote")})]}),e("div",{style:{flex:"0 0 auto",display:"flex",flexDirection:"column",alignItems:"flex-end",gap:4},children:[e(ba,{trend:n}),e("div",{style:{fontSize:14,color:"var(--text-3)",fontFamily:"var(--mono)"},children:s("loop.sparkLabel")})]})]})}function ss(t,o){const n=getComputedStyle(t),i={};for(const a of o)i[a]=n.getPropertyValue(a).trim();return i}function co(t,o){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),a=parseInt(n[2],16),r=parseInt(n[3],16);return`rgba(${i}, ${a}, ${r}, ${o})`}const Lt=8,xa=24,wa=28,Rt=24,as=120,Sa=14,Ma=8,is="rgba(143, 242, 92, 0.3)",Ca=1.5;function bn(t,o){t.style.width="";const n=window.devicePixelRatio||1,a=t.getBoundingClientRect().width,r=as,l=a-Rt-xa,d=r-Lt-wa;if(o.length===0||l<=0||d<=0)return;t.width=a*n,t.height=r*n,t.style.width=`${a}px`,t.style.height=`${r}px`;const m=t.getContext("2d");if(!m)return;m.scale(n,n);const c=ss(t,["--life","--text-3","--font-ui"]),h=c["--life"],u=c["--text-3"],g=`${Sa}px ${c["--font-ui"]}`,f=Math.max(1,...o.map(F=>F.created)),R=Math.max(1,...o.map(F=>F.recalled)),C=Math.max(f,R),D=o.length,A=1,L=Math.max(1,(l-A*(D-1))/D);m.fillStyle=is;for(let F=0;F<D;F++){const p=o[F].created/C*d,x=Rt+F*(L+A),E=Lt+d-p;m.fillRect(x,E,L,p)}m.beginPath(),m.strokeStyle=h,m.lineWidth=Ca,m.lineJoin="round",m.lineCap="round";for(let F=0;F<D;F++){const j=o[F],p=Rt+F*(L+A)+L/2,x=Lt+d-j.recalled/C*d;F===0?m.moveTo(p,x):m.lineTo(p,x)}m.stroke(),m.fillStyle=u,m.font=g,m.textAlign="center",m.textBaseline="top";const B=Math.max(7,Math.ceil((m.measureText("00-00").width+Ma)/(L+A)));for(let F=0;F<D;F+=B){const j=o[F],p=j.date.split("-"),x=p.length>=3?`${p[1]}-${p[2]}`:j.date,E=Rt+F*(L+A)+L/2,w=Lt+d+4;m.fillText(x,E,w)}}function _a({data:t}){const o=V(null);Z(()=>{const a=o.current;if(!a)return;bn(a,t);const r=new ResizeObserver(()=>bn(a,t));return r.observe(a),()=>r.disconnect()},[t]);const n=t.reduce((a,r)=>a+r.created,0),i=t.reduce((a,r)=>a+r.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:s("timeline.title")}),e("div",{style:{display:"flex",alignItems:"center",gap:12,fontSize:14,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:is}}),s("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(--life)"}}),s("timeline.recalled"),e("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:i})]})]})]}),e("canvas",{ref:o,style:{width:"100%",height:`${as}px`,display:"block"}})]})}const lo=["week","month","quarter","older"];function Aa(t){return s(`ageMatrix.bucket.${t}`)}const Ea=["lesson_learned","lesson","mistake","decision","architecture_decision","pattern","technical_pattern","best_practice","bug_fix","workflow_checkpoint","process","architecture","feature"];function Ta(t,o){return t===0||o===0?"rgba(255,255,255,0.03)":`rgba(143, 242, 92, ${(.05+Math.min(t/o,1)*.15).toFixed(2)})`}function La({data:t}){if(!t||t.length===0)return null;const o=new Map;for(const a of t)o.has(a.type)||o.set(a.type,new Map),o.get(a.type).set(a.bucket,a.count);const n=Ea.filter(a=>o.has(a)),i=Math.max(1,...t.map(a=>a.count));return e("div",{class:"card",children:[e("div",{class:"card-title",style:{marginBottom:16},children:s("ageMatrix.title")}),e("div",{style:{overflowX:"auto"},children:e("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:14,tableLayout:"fixed"},children:[e("colgroup",{children:[e("col",{style:{width:"28%"}}),lo.map(a=>e("col",{style:{width:"18%"}},a))]}),e("thead",{children:e("tr",{children:[e("th",{style:{textAlign:"left",padding:"4px 8px",color:"var(--text-2)",fontWeight:400},children:s("ageMatrix.typeColumn")}),lo.map(a=>e("th",{style:{textAlign:"center",padding:"4px 6px",color:"var(--text-2)",fontWeight:400},children:Aa(a)},a))]})}),e("tbody",{children:n.map(a=>{const r=o.get(a),l=Array.from(r.values()).reduce((d,m)=>d+m,0);return e("tr",{children:[e("td",{style:{padding:"5px 8px",color:"var(--text-1)",fontSize:14,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:[De(a),e("span",{style:{color:"var(--text-3)",marginLeft:4},children:["(",l,")"]})]}),lo.map(d=>{const m=r.get(d)??0;return e("td",{style:{textAlign:"center",padding:"5px 6px",background:Ta(m,i),borderRadius:"var(--radius-xs)",color:m>0?"var(--text-1)":"var(--text-3)",fontFamily:"var(--mono)",fontWeight:m>0?600:400,fontSize:14,transition:"background 0.2s"},children:m>0?m:"·"},d)})]},a)})})]})}),e("div",{style:{marginTop:10,fontSize:14,color:"var(--text-3)",display:"flex",alignItems:"center",gap:6},children:[e("span",{children:s("ageMatrix.low")}),[.05,.1,.15,.2].map(a=>e("span",{style:{display:"inline-block",width:14,height:10,borderRadius:"var(--radius-hairline)",background:`rgba(143,242,92,${a})`}},a)),e("span",{children:s("ageMatrix.high")}),e("span",{style:{marginLeft:8},children:["— ",s("ageMatrix.legend")]})]})]})}function kn(t){return s(`radar.axis.${t}`)}const lt=220,rs=lt/2,cs=lt/2,Pt=80,jt=14,Ra=14,mo=72;function zt(t,o){const n=(t-90)*(Math.PI/180);return[rs+o*Math.cos(n),cs+o*Math.sin(n)]}function Pa({data:t}){if(!t||t.length===0)return null;const o=t.length,n=Math.max(1,...t.map(d=>d.count)),i=t.map((d,m)=>360/o*m),a=t.map((d,m)=>{const c=d.count/n,h=jt+c*(Pt-jt);return zt(i[m],h)}),r=a.map((d,m)=>`${m===0?"M":"L"}${d[0].toFixed(1)},${d[1].toFixed(1)}`).join(" ")+" Z",l=[.25,.5,.75,1];return e("div",{class:"card",children:[e("div",{class:"card-title",style:{marginBottom:8},children:s("radar.title")}),e("div",{style:{display:"flex",alignItems:"center",gap:16,flexWrap:"wrap"},children:[e("div",{style:{maxWidth:"100%",minWidth:0,overflowX:"auto"},children:e("svg",{width:lt+mo*2,height:lt,viewBox:`${-mo} 0 ${lt+mo*2} ${lt}`,style:{display:"block"},children:[l.map(d=>{const m=i.map(c=>{const h=jt+d*(Pt-jt),[u,g]=zt(c,h);return`${u.toFixed(1)},${g.toFixed(1)}`});return e("polygon",{points:m.join(" "),fill:"none",stroke:"rgba(255,255,255,0.06)",strokeWidth:1},d)}),i.map((d,m)=>{const[c,h]=zt(d,Pt);return e("line",{x1:rs,y1:cs,x2:c.toFixed(1),y2:h.toFixed(1),stroke:"rgba(255,255,255,0.06)",strokeWidth:1},m)}),e("path",{d:r,fill:"rgba(143,242,92,0.15)",stroke:"var(--life)",strokeWidth:1.5,strokeLinejoin:"round"}),a.map(([d,m],c)=>e("circle",{cx:d.toFixed(1),cy:m.toFixed(1),r:3,fill:"var(--life)"},c)),t.map((d,m)=>{const c=i[m],[h,u]=zt(c,Pt+18),g=kn(d.axis);return e("text",{x:h.toFixed(1),y:u.toFixed(1),"text-anchor":"middle","dominant-baseline":"middle","font-size":Ra,fill:"var(--text-2)","font-family":"var(--font-ui)",children:g},m)})]})}),e("div",{style:{flex:1,minWidth:120},children:[t.map(d=>{const m=n>0?d.count/n:0;return e("div",{style:{marginBottom:8},children:[e("div",{style:{display:"flex",justifyContent:"space-between",fontSize:14,marginBottom:3},children:[e("span",{style:{color:"var(--text-1)"},children:kn(d.axis)}),e("span",{style:{color:"var(--life)",fontFamily:"var(--mono)",fontSize:14},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:`${(m*100).toFixed(1)}%`,height:"100%",background:"var(--life)",borderRadius:"var(--radius-hairline)",transition:"width 0.3s"}})})]},d.axis)}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:6},children:s("radar.caption")})]})]})]})}function ja({data:t}){const{workSchedule:o,focusAreas:n,workflow:i,strengths:a,learningAreas:r}=t,l=new Map;for(const h of o.hourDistribution)l.set(h.hour,h.count);const d=Math.max(1,...o.hourDistribution.map(h=>h.count)),m=[...o.hourDistribution].sort((h,u)=>u.count-h.count).slice(0,3).map(h=>`${h.hour.toString().padStart(2,"0")}:00`),c=[...o.dayDistribution].sort((h,u)=>u.count-h.count).slice(0,2).map(h=>s(`patterns.day.${h.dayNum}`));return e("div",{class:"card",children:[e("div",{class:"card-title",children:s("patterns.title")}),e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:s("patterns.workSchedule")}),e("div",{style:{display:"flex",gap:2,flexWrap:"wrap"},children:Array.from({length:24},(h,u)=>{const g=l.get(u)||0,f=g/d;return e("div",{title:`${u.toString().padStart(2,"0")}:00 — ${g}`,style:{width:28,height:28,borderRadius:"var(--radius-xs)",background:f>0?`rgba(143, 242, 92, ${.05+f*.15})`:"var(--bg-0)",border:"1px solid var(--border-subtle)",fontSize:14,display:"flex",alignItems:"center",justifyContent:"center",color:"var(--text-1)",fontFamily:"var(--mono)"},children:u},u)})}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:6,fontFamily:"var(--mono)"},children:[s("patterns.peakHours"),": ",m.join(", "),c.length>0&&e("span",{children:[" · ",s("patterns.busiestDays"),": ",c.join(", ")]})]})]}),e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:s("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:i.totalSessions>0?i.commitsPerSession.toFixed(1):"—"}),e("div",{class:"stat-lbl",children:s("patterns.commitsPerSession")})]})})]}),n.length>0&&e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:s("patterns.focus")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:n.slice(0,12).map(h=>e("span",{class:"tag",style:{fontSize:14,padding:"2px 8px"},children:[De(h.type)," ",e("span",{children:["(",h.count,")"]})]},h.type))})]}),(a.length>0||r.length>0)&&e("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12},children:[e("div",{children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:s("patterns.strengths")}),a.slice(0,5).map(h=>e("div",{style:{marginBottom:6},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:3},children:[e("span",{style:{fontSize:14,color:"var(--text-1)"},children:De(h.type)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:14,color:"var(--life)"},children:[Math.round(h.avgConfidence*100),"%"]})]}),e("div",{style:{height:3,borderRadius:"var(--radius-hairline)",background:"var(--bg-0)"},children:e("div",{style:{height:"100%",width:`${Math.round(h.avgConfidence*100)}%`,borderRadius:"var(--radius-hairline)",background:"rgba(143, 242, 92, 0.5)",transition:"width 600ms ease-out"}})})]},h.type)),a.length===0&&e("div",{style:{fontSize:14,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]}),e("div",{children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:s("patterns.learning")}),r.slice(0,5).map(h=>e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:6,fontSize:14},children:[e("span",{style:{color:"var(--text-1)"},children:h.tag}),e("span",{style:{fontFamily:"var(--mono)",fontSize:14,color:"var(--text-3)"},children:h.count})]},h.tag)),r.length===0&&e("div",{style:{fontSize:14,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]})]})]})}function xn(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 za({dataRevision:t=0}){const[o,n]=b(null),[i,a]=b(null),[r,l]=b(!0);if(Z(()=>{let c=!1;return l(!0),a(null),te("GET","/v1/analytics/pm").then(h=>{if(!c){if(!xn(h)){h!==null&&console.warn("[PmAnalyticsPanel] /v1/analytics/pm answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",h),a("unreadable");return}n(h)}}).catch(h=>{c||a(Ze(h))}).finally(()=>{c||l(!1)}),()=>{c=!0}},[t]),r&&!o)return e("div",{class:"empty",children:e("div",{class:"loading"})});if(i&&!o)return e("div",{class:"error-box",role:"alert",children:xe(i)});if(!xn(o))return e("div",{class:"error-box",role:"alert",children:xe("unreadable")});const d=(o.connectedness.orphanRate*100).toFixed(1),m=o.connectedness.orphanRate>.7?"var(--danger)":o.connectedness.orphanRate>.4?"var(--warning)":"var(--success)";return e("div",{children:[r&&e("div",{class:"loading",role:"status"}),i&&e("div",{class:"error-box",role:"alert",children:xe(i)}),e("div",{class:"card",style:{marginTop:8,padding:16},children:[e("div",{class:"card-title",style:{marginBottom:12},children:s("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:o.velocity.decisionsPerWeek.toFixed(1)}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:2},children:s("pm.decisionsPerWeek")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)"},children:o.staleness.openDecisionCount}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:2},children:s("pm.openDecisions")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)",color:m},children:[d,"%"]}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:2},children:s("pm.orphanRate")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)"},children:o.connectedness.totalRelations}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:2},children:s("pm.relationsTotal")})]})]}),o.staleness.stalePlanCount>0&&e("div",{style:{marginTop:10,fontSize:14,color:"var(--warning)"},children:s("pm.stalePlans",{count:o.staleness.stalePlanCount})})]})]})}const Da=["activity","quality","freshness","lessons"];function Ha(t){return typeof t?.totalEntities=="number"&&typeof t.totalObservations=="number"&&typeof t.totalRelations=="number"&&typeof t.totalTags=="number"&&Array.isArray(t.tagDistribution)}function uo(t,o,n){return!n&&o!==null&&console.warn(`[memesh dashboard] ${t} answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:`,o),n}function Na(t){if(typeof t?.healthScore!="number")return!1;const o=t.healthFactors;if(!o)return!1;for(const n of Da)if(typeof o[n]?.score!="number"||typeof o[n]?.weight!="number")return!1;return Array.isArray(t.loopMetric?.trend)&&Array.isArray(t.timeline)}function Ba(t){return Array.isArray(t?.workSchedule?.hourDistribution)&&Array.isArray(t.workSchedule?.dayDistribution)&&Array.isArray(t.focusAreas)&&Array.isArray(t.strengths)&&Array.isArray(t.learningAreas)&&typeof t.workflow?.totalSessions=="number"&&typeof t.workflow?.commitsPerSession=="number"}function Fa({dataRevision:t=0}){const[o,n]=b(null),[i,a]=b(null),[r,l]=b(null),[d,m]=b(!0),[c,h]=b(null),u=V(0),g=be(()=>{const f=++u.current;m(!0),h(null);let R=!1,C=!1;const D=A=>L=>(console.warn(`[memesh dashboard] ${A} failed to load:`,L),Ze(L)==="unreachable"?R=!0:C=!0,null);Promise.all([te("GET","/v1/stats").catch(D("/v1/stats")),te("GET","/v1/analytics").catch(D("/v1/analytics")),te("GET","/v1/patterns").catch(D("/v1/patterns"))]).then(([A,L,B])=>{if(f!==u.current)return;const F=uo("/v1/stats",A,Ha(A)),j=uo("/v1/analytics",L,Na(L)),p=uo("/v1/patterns",B,Ba(B));(A!==null&&!F||L!==null&&!j||B!==null&&!p)&&(C=!0),F&&n(A),j&&a(L),p&&l(B),h(R?"unreachable":C?"unreadable":null)}).finally(()=>{f===u.current&&m(!1)})},[]);return Z(()=>{g()},[g,t]),d&&!o&&!i?e("div",{class:"empty",children:e("div",{class:"loading"})}):!o&&!i?e("div",{class:"error-box",role:"alert",children:c?xe(c):`${s("common.error")}: ${s("analytics.loadFailed")}`}):e("div",{children:[d&&e("div",{class:"loading",role:"status"}),c&&e("div",{class:"error-box",role:"alert",children:xe(c)}),o&&e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:o.totalEntities.toLocaleString(me())}),e("div",{class:"stat-lbl",children:s("analytics.totalMemories")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:o.totalObservations.toLocaleString(me())}),e("div",{class:"stat-lbl",children:s("analytics.knowledgeFacts")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:o.totalRelations.toLocaleString(me())}),e("div",{class:"stat-lbl",children:s("analytics.connections")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:o.totalTags.toLocaleString(me())}),e("div",{class:"stat-lbl",children:s("analytics.topics")})]})]}),i&&e("div",{style:{marginTop:8},children:e(ka,{metric:i.loopMetric})}),i&&e("div",{style:{marginTop:8},children:e(va,{score:i.healthScore,factors:i.healthFactors})}),i&&e("div",{style:{marginTop:8},children:e(_a,{data:i.timeline})}),i&&e("div",{style:{marginTop:8,display:"grid",gridTemplateColumns:"minmax(0, 1.4fr) minmax(0, 1fr)",gap:8},children:[e(La,{data:Array.isArray(i.ageMatrix)?i.ageMatrix:[]}),e(Pa,{data:Array.isArray(i.knowledgeRadar)?i.knowledgeRadar:[]})]}),r&&e("div",{style:{marginTop:8},children:e(ja,{data:r})}),e(za,{dataRevision:t}),o&&(()=>{const f=["auto_saved","auto-tracked","session_end","session:","source:","scope:","date:","urgency:"],R=o.tagDistribution.filter(C=>!f.some(D=>C.tag.startsWith(D))&&!/^\d{4}-\d{2}-\d{2}/.test(C.tag));return R.length>0?e("div",{class:"card",style:{marginTop:8},children:[e("div",{class:"card-title",children:s("analytics.topics")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:R.slice(0,30).map(C=>e("span",{class:"tag",style:{fontSize:14},children:[C.tag," ",e("span",{children:["(",C.count,")"]})]},C.tag))})]}):null})()]})}function Ia(t){return t==="warning"?"var(--warning)":t==="muted"?"var(--text-2)":"var(--life)"}function qa(t){if(!t||typeof t!="object"||typeof t.healthScore!="number")return!1;const o=t.criticalLessons;if(!o||typeof o.critical!="number"||typeof o.severityTagged!="number"||typeof o.total!="number")return!1;const n=t.citationCompliance;return!(n!=null&&(typeof n.cited!="number"||typeof n.total!="number")||!t.loopMetric||typeof t.loopMetric.reusedThisWeek!="number")}function Ua(t,o){const n=c=>c.toLocaleString(o),i={key:"health",label:s("metrics.health"),value:`${t.healthScore}`,note:s("metrics.healthNote"),tone:t.healthScore>=60?"life":t.healthScore>=40?"warning":"muted"},a=t.criticalLessons,r=a.severityTagged===0?{key:"critical",label:s("metrics.critical"),value:null,note:a.total===0?s("metrics.criticalNoLessons"):s("metrics.criticalUnclassified",{total:n(a.total)}),tone:"muted"}:{key:"critical",label:s("metrics.critical"),value:n(a.critical),note:a.severityTagged<a.total?s("metrics.criticalPartial",{tagged:n(a.severityTagged),total:n(a.total)}):s("metrics.criticalAll",{total:n(a.total)}),tone:a.critical>0?"warning":"life"},l=t.citationCompliance,d=l===null?{key:"citation",label:s("metrics.citation"),value:null,note:s("metrics.citationNotMeasured"),tone:"muted"}:{key:"citation",label:s("metrics.citation"),value:`${Math.round(l.cited/l.total*100)}%`,note:s("metrics.citationNote",{cited:n(l.cited),total:n(l.total)})},m={key:"loop",label:s("metrics.reused"),value:n(t.loopMetric.reusedThisWeek),note:s("metrics.reusedNote")};return[i,r,d,m]}function Oa({dataRevision:t=0}){const[o,n]=b(null),[i,a]=b(!0),[r,l]=b(null);if(Z(()=>{let m=!1;return a(!0),l(null),te("GET","/v1/analytics").then(c=>{if(!m){if(!qa(c)){console.warn("[memesh dashboard] /v1/analytics answered without the groups this row reads — stale server or version skew:",c),l("unreadable");return}n(c),l(null)}}).catch(c=>{m||(console.warn("[memesh dashboard] /v1/analytics failed to load for the metrics row:",c),l(Ze(c)))}).finally(()=>{m||a(!1)}),()=>{m=!0}},[t]),i&&!o)return e("div",{class:"stats-row","aria-busy":"true",children:e("div",{class:"stat",children:e("div",{class:"loading"})})});if(r&&!o)return e("div",{role:"alert",class:"card",style:{marginBottom:8,fontSize:14,color:"var(--text-2)"},children:xe(r)});if(!o)return null;const d=Ua(o,me());return e("div",{children:[r&&e("div",{role:"alert",class:"card",style:{marginBottom:8},children:xe(r)}),e("div",{class:"stats-row","aria-busy":i,children:d.map(m=>e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{color:Ia(m.tone),fontSize:m.value===null?16:void 0},children:m.value??s("metrics.notMeasured")}),e("div",{class:"stat-lbl",children:m.label}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:2},children:m.note})]},m.key))})]})}function Wa(t,o){return t===0?"empty":o.failed?"unavailable":o.loading||t===null?"loading":o.pendingCount>0?"insights":"healthy"}function Ga({kind:t,onNavigate:o,onReviewInsights:n}){const i=t==="empty"?()=>o("Memories"):t==="insights"?n:t==="unavailable"?()=>window.location.reload():null;return e("section",{class:"card","aria-labelledby":"home-next-action-title",style:{padding:16,marginBottom:12},children:[e("div",{style:{color:"var(--text-3)",fontSize:14,fontWeight:700,letterSpacing:".08em",textTransform:"uppercase"},children:s("home.nextAction.eyebrow")}),e("h2",{id:"home-next-action-title",style:{margin:"5px 0 6px",fontSize:18},children:s(`home.nextAction.${t}.title`)}),e("p",{style:{margin:"0 0 4px",color:"var(--text-1)",lineHeight:1.5},children:[e("strong",{children:s("home.nextAction.why")})," ",s(`home.nextAction.${t}.why`)]}),e("p",{style:{margin:0,color:"var(--text-2)",lineHeight:1.5},children:[e("strong",{children:s("home.nextAction.result")})," ",s(`home.nextAction.${t}.result`)]}),i&&e("button",{class:"btn btn-primary",style:{marginTop:12},onClick:i,children:s(`home.nextAction.${t}.action`)})]})}function $a({health:t=null,dataRevision:o=0,onNavigate:n=()=>{}}){const[i,a]=b(!1),[r,l]=b(!1),[d,m]=b({pendingCount:0,loading:!0,failed:!1}),c=be(f=>m(f),[]),h=be(()=>{const f=document.getElementById("home-insights");f?.scrollIntoView({behavior:"smooth",block:"start"}),f?.focus({preventScroll:!0})},[]),u=Wa(t?.entity_count??null,d);function g(){const f=!i;a(f),f&&l(!0)}return e("div",{children:[e(Ga,{kind:u,onNavigate:n,onReviewInsights:h}),e(Oa,{dataRevision:o}),e(ga,{dataRevision:o,onStateChange:c}),e("div",{class:"card",style:{marginTop:8},children:[e("button",{onClick:g,"aria-expanded":i,"aria-controls":"home-analytics",style:{display:"flex",alignItems:"center",gap:8,width:"100%",background:"none",border:"none",cursor:"pointer",padding:0,color:"var(--text-0)",font:"600 14px var(--font-ui)",textAlign:"left"},children:[e("svg",{width:"12",height:"12",viewBox:"0 0 16 16","aria-hidden":"true",style:{transform:i?"rotate(90deg)":"none",transition:"transform 150ms",color:"var(--text-2)",flexShrink:0},children:e("path",{d:"M6 4 L10 8 L6 12",stroke:"currentColor",strokeWidth:"1.5",fill:"none",strokeLinecap:"round",strokeLinejoin:"round"})}),s("home.analyticsTitle"),!i&&e("span",{style:{fontWeight:400,fontSize:14,color:"var(--text-3)"},children:s("home.analyticsHint")})]}),e("div",{id:"home-analytics",hidden:!i,style:{marginTop:i?14:0},children:r&&e(Fa,{dataRevision:o})})]})]})}const le=1.5;function Va(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 Ka={lesson:e(Q,{children:[e("path",{d:"M6 9.5 a4 4 0 1 1 4 0 v1 a1 1 0 0 1 -1 1 h-2 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"}),e("path",{d:"M7 13 h2",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"}),e("path",{d:"M7 14.5 h2",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),decision:e(Q,{children:[e("circle",{cx:"8",cy:"8",r:"5.5",fill:"none",stroke:"currentColor",strokeWidth:le}),e("circle",{cx:"8",cy:"8",r:"2",fill:"none",stroke:"currentColor",strokeWidth:le}),e("path",{d:"M8 0.5 v3 M8 12.5 v3 M0.5 8 h3 M12.5 8 h3",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),pattern:e("path",{d:"M3 3 h4 v1.5 a1.5 1.5 0 0 0 3 0 V3 h3 v3 h-1.5 a1.5 1.5 0 0 0 0 3 H13 v4 h-4 v-1.5 a1.5 1.5 0 0 0 -3 0 V13 H3 v-4 h1.5 a1.5 1.5 0 0 0 0 -3 H3 z",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"}),bug:e(Q,{children:[e("ellipse",{cx:"8",cy:"9",rx:"3.5",ry:"4",fill:"none",stroke:"currentColor",strokeWidth:le}),e("path",{d:"M8 5 v-1 M5.5 6.5 L4 5 M10.5 6.5 L12 5 M4.5 9 H2.5 M11.5 9 H13.5 M5 11.5 L3.5 13 M11 11.5 L12.5 13",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),architecture:e(Q,{children:[e("rect",{x:"2",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:le}),e("rect",{x:"9",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:le}),e("rect",{x:"5.5",y:"2",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:le})]}),feature:e(Q,{children:e("path",{d:"M8 2 L9.5 6.5 L14 8 L9.5 9.5 L8 14 L6.5 9.5 L2 8 L6.5 6.5 z",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"})}),commit:e(Q,{children:e("path",{d:"M5 2 L4 14 M11 2 L10 14 M2.5 6 H13.5 M2.5 10 H13.5",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})}),session:e(Q,{children:[e("circle",{cx:"8",cy:"9",r:"5",fill:"none",stroke:"currentColor",strokeWidth:le}),e("path",{d:"M8 9 V5.5 M8 9 L10.5 11",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"}),e("path",{d:"M6.5 2 H9.5",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),milestone:e(Q,{children:[e("path",{d:"M4 2 V14",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"}),e("path",{d:"M4 3 H12 L10 6 L12 9 H4 z",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"})]}),calendar:e(Q,{children:[e("rect",{x:"2",y:"3",width:"12",height:"11",rx:"1",fill:"none",stroke:"currentColor",strokeWidth:le}),e("path",{d:"M2 6.5 H14 M5 1.5 V4.5 M11 1.5 V4.5",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),note:e(Q,{children:[e("path",{d:"M4 2 H10 L13 5 V14 H4 z",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"}),e("path",{d:"M10 2 V5 H13",fill:"none",stroke:"currentColor",strokeWidth:le,strokeLinejoin:"round"}),e("path",{d:"M6 8.5 H11 M6 11 H11",stroke:"currentColor",strokeWidth:le,strokeLinecap:"round"})]}),dot:e("circle",{cx:"8",cy:"8",r:"2",fill:"currentColor"})};function Xt({type:t,size:o=16,color:n,ariaLabel:i}){const a=Va(t),r=i??De(t);return e("svg",{width:o,height:o,viewBox:"0 0 16 16",role:"img","aria-label":r,style:{color:n??"currentColor",flexShrink:0,display:"inline-block",verticalAlign:"text-bottom"},children:[e("title",{children:r}),Ka[a]]})}function wn(t,o){return t.length>o?t.slice(0,o)+"…":t}function Ya(t){if(!t)return"";const o=Je(t);if(Number.isNaN(o.getTime()))return t.slice(0,16).replace("T"," ");const n=i=>String(i).padStart(2,"0");return`${o.getFullYear()}-${n(o.getMonth()+1)}-${n(o.getDate())} ${n(o.getHours())}:${n(o.getMinutes())}`}const Xa={high:{bg:"var(--life-soft)",fg:"var(--life)"},medium:{bg:"var(--life-soft)",fg:"var(--life)"},low:{bg:"var(--border-subtle)",fg:"var(--text-2)"},none:{bg:"var(--border-subtle)",fg:"var(--text-3)"}};function Ut({entity:t,actions:o,highlight:n}){const i=Be(t)||s("memory.noContent"),a=t.observations?.length??0,r=t.archived||t.status==="archived",l=Yt(t),d=ns(t.access_count),m=Xa[d.tone],c=mt(t.last_accessed_at||t.created_at),h=(t.relations?.length??0)>0;return e("div",{class:"mem-row",style:r?{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(Xt,{type:t.type,size:18})}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:2},children:c})]}),e("div",{class:"mem-body",children:[e("div",{class:"mem-preview",children:n?e(Za,{text:wn(i,160),term:n}):wn(i,160)}),e("div",{class:"mem-meta",style:{flexWrap:"wrap",gap:6},children:[e("span",{class:"badge badge-type",children:De(t.type)}),r&&e("span",{class:"badge badge-archived",children:s("memory.archivedBadge")}),l&&e("span",{class:"tag",style:{background:"var(--life-soft)",color:"var(--life)",display:"inline-flex",alignItems:"center",gap:4},title:s("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"})}),l]}),d.tone!=="none"&&e("span",{class:"tag",style:{background:m.bg,color:m.fg,fontWeight:d.tone==="high"?600:400},title:s("memory.tooltip.recalled",{count:d.count}),children:["✓ ",d.label]}),h&&e("span",{class:"tag",style:{opacity:.7},title:s("memory.tooltip.hasRelations",{count:t.relations.length}),children:["→ ",t.relations.length]}),e("span",{style:{color:"var(--text-3)",fontSize:14,fontFamily:"var(--mono)",opacity:.85},title:s("memory.tooltip.createdAt",{date:t.created_at}),children:["· ",Ya(t.created_at)]}),a>1&&e("span",{style:{color:"var(--text-3)",fontSize:14},children:["· ",s("memory.factsCount",{count:a})]}),t.tags?.filter(u=>!u.startsWith("project:")&&!/^\d{4}-\d{2}-\d{2}/.test(u)).slice(0,3).map(u=>e("span",{class:"tag",children:u},u))]})]}),o&&e("div",{class:"mem-actions",children:o})]})}function Za({text:t,term:o}){if(!o)return e(Q,{children:t});const n=[],i=t.toLowerCase(),a=o.toLowerCase();let r=0;for(;r<t.length;){const l=i.indexOf(a,r);if(l===-1){n.push(t.slice(r));break}l>r&&n.push(t.slice(r,l)),n.push(e("mark",{children:t.slice(l,l+a.length)})),r=l+a.length}return e(Q,{children:n})}function zo(){const[t,o]=b(!1),[n,i]=b("");async function a(){i(""),o(!0);try{await te("POST","/v1/demo/seed"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(r){i(qe(r))}finally{o(!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:s("emptyLibrary.title")}),e("div",{style:{fontSize:14,lineHeight:1.55,color:"var(--text-1)",maxWidth:480,margin:"0 auto 14px"},children:s("emptyLibrary.body")}),e("button",{type:"button",class:"btn btn-primary",onClick:()=>void a(),disabled:t,style:{minWidth:160},children:s(t?"onboarding.seedingButton":"onboarding.seedButton")}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:8},children:s("onboarding.seedHint")}),n&&e("div",{role:"alert",style:{marginTop:10,fontSize:14,color:"var(--danger)"},children:n})]})}function Te({label:t,active:o,onClick:n,count:i,dot:a}){return e("button",{onClick:n,"aria-pressed":o,style:{padding:"4px 10px",borderRadius:"var(--radius)",border:"1px solid",borderColor:o?"var(--life)":"var(--border)",background:o?"var(--life-soft)":"transparent",color:o?"var(--life)":"var(--text-2)",fontSize:14,cursor:"pointer",whiteSpace:"nowrap",fontFamily:"var(--font-ui)",display:"inline-flex",alignItems:"center",gap:6},children:[a&&e("span",{"aria-hidden":"true",style:{width:8,height:8,borderRadius:"var(--radius-hairline)",background:a,flexShrink:0}}),t,i!==void 0&&e("span",{style:{fontFamily:"var(--mono)",fontSize:14},children:i})]})}function Ja(t){const o=[];let n=null;for(const i of t){const a=i.trim();a.startsWith("Error:")?(n&&o.push(n),n={error:a.slice(6).trim(),rootCause:"",fix:"",prevention:""}):a.startsWith("Root cause:")?(n||(n={error:"",rootCause:"",fix:"",prevention:""}),n.rootCause=a.slice(11).trim()):a.startsWith("Fix:")||a.startsWith("Solution")?(n||(n={error:"",rootCause:"",fix:"",prevention:""}),n.fix=a.replace(/^(Fix|Solution\s*\d*):/i,"").trim()):a.startsWith("Prevention:")&&(n||(n={error:"",rootCause:"",fix:"",prevention:""}),n.prevention=a.slice(11).trim())}return n&&o.push(n),o}function Qa(t){const o=t.observations??[],n=o[0]?.match(/^Plan "(.+?)" completed \((\d+) steps?\)/),i=o.find(r=>r.startsWith("Steps:"))?.slice(6).trim()??"",a=o.find(r=>r.startsWith("Commits:"))?.slice(8).trim()??"";return{planName:n?.[1]??Be(t),stepCount:n?parseInt(n[2],10):0,steps:i,commits:a?a.split(",").map(r=>r.trim()).filter(Boolean):[]}}const Sn={critical:"var(--danger)",major:"var(--warning)",minor:"var(--info)"};function ei(t){const o=t.tags??[];return o.includes("severity:critical")?"critical":o.includes("severity:major")?"major":o.includes("severity:minor")?"minor":null}function ti({entity:t}){const o=ei(t);return o?e("span",{class:"badge",style:{background:`${Sn[o]}18`,color:Sn[o]},children:s(`lessons.severity.${o}`)}):null}function Dt({label:t,color:o,text:n}){return e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:14,fontWeight:600,color:o,marginBottom:2,fontFamily:"var(--font-ui)"},children:t}),e("div",{style:{fontSize:14,lineHeight:1.55},children:n})]})}function oi({entity:t}){const o=Ja(t.observations??[]);return o.length===0?e("div",{style:{fontSize:14,color:"var(--text-3)",fontStyle:"italic"},children:s("lessons.unstructured")}):e(Q,{children:o.map((n,i)=>e("div",{style:{marginTop:i>0?12:0,paddingTop:i>0?12:0,borderTop:i>0?"1px dashed var(--border-subtle)":"none"},children:[n.error&&e(Dt,{label:s("lessons.error"),color:"var(--danger)",text:n.error}),n.rootCause&&e(Dt,{label:s("lessons.rootCause"),color:"var(--warning)",text:n.rootCause}),n.fix&&e(Dt,{label:s("lessons.fix"),color:"var(--success)",text:n.fix}),n.prevention&&e(Dt,{label:s("lessons.prevention"),color:"var(--info)",text:n.prevention})]},i))})}function ni({entity:t}){const o=Qa(t);return e("div",{children:[e("div",{style:{fontSize:14,color:"var(--text-3)",marginBottom:6,fontFamily:"var(--font-ui)"},children:[e("span",{style:{fontFamily:"var(--mono)"},children:o.stepCount})," ",s("lessons.stepsLabel")," · ",s("lessons.commitsCount",{count:o.commits.length})]}),o.steps&&e("div",{style:{fontSize:14,color:"var(--text-1)",lineHeight:1.55},children:o.steps}),o.commits.length>0&&e("div",{style:{marginTop:8,fontSize:14,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[o.commits.slice(0,6).join(" · "),o.commits.length>6&&e("span",{children:[" · +",o.commits.length-6]})]})]})}function si({entity:t}){const o=t.observations??[];return o.length===0?e("div",{style:{fontSize:14,color:"var(--text-3)",fontStyle:"italic"},children:s("lessons.unstructured")}):e("ul",{style:{fontSize:14,lineHeight:1.6,margin:0,paddingLeft:18,color:"var(--text-1)"},children:[o.slice(0,8).map((n,i)=>e("li",{style:{marginBottom:3},children:n},i)),o.length>8&&e("li",{style:{color:"var(--text-3)",listStyle:"none"},children:s("lessons.moreItems",{count:o.length-8})})]})}function ls({entity:t}){return e("details",{style:{marginTop:10,fontSize:14,color:"var(--text-3)"},children:[e("summary",{style:{cursor:"pointer"},children:s("memory.technicalDetails")}),e("dl",{style:{display:"grid",gridTemplateColumns:"max-content minmax(0, 1fr)",gap:"4px 10px",margin:"8px 0 0"},children:[e("dt",{children:s("memory.canonicalName")}),e("dd",{style:{margin:0,fontFamily:"var(--mono)",overflowWrap:"anywhere"},children:t.name}),e("dt",{children:s("memory.rawType")}),e("dd",{style:{margin:0,fontFamily:"var(--mono)",overflowWrap:"anywhere"},children:t.type})]})]})}function ai({entity:t}){const o=ma(t);return e("div",{style:{padding:"10px 0 4px 40px",fontFamily:"var(--font-memory)"},children:[o==="failure"?e(oi,{entity:t}):o==="plan-completion"?e(ni,{entity:t}):e(si,{entity:t}),e(ls,{entity:t})]})}const ii=new Set(["lesson_learned","lesson","mistake"]),ri=new Set([...ii,"decision","milestone","pattern","technical_pattern","product_improvement","goal","plan","task-state"]),ci=new Set(["commit","session-insight","session-summary","session_keypoint","session-identity","session_identity","weekly-summary","weekly_summary","workflow_checkpoint"]);function Mn(t){return ri.has(t)?"work":ci.has(t)?"evidence":"knowledge"}const ho=30,Cn=2e3,li=30,_n=["knowledge","activity","session","reference"];function vt(t){return!!t.archived||t.status==="archived"}function Co(t){if(!t)return null;const o=ts(t);if(o!==null)return o;const n=Date.parse(t);return Number.isNaN(n)?null:n}function bt(t){return Co(t.last_accessed_at||t.created_at)}function po(t,o){return t===null?o===null?0:1:o===null?-1:o-t}function di(t){const o=bt(t);return o===null?null:new Date(o).toISOString()}function mi({health:t,dataRevision:o=0}){const[n,i]=b([]),[a,r]=b([]),[l,d]=b(""),[m,c]=b(!0),[h,u]=b(""),[g,f]=b(0),[R]=Po(),[C,D]=b({kind:"layer",v:R?"work":"all"}),[A,L]=b("all"),[B,F]=b("all"),[j,p]=b("all"),[x,E]=b("most-recalled"),[w,I]=b(null),[v,M]=b(!1),[K,J]=b(()=>new Set),ae=V(0),ue=V(0);async function k(){const _=++ae.current;c(!0),u("");try{const[W,oe]=await Promise.all([te("GET",`/v1/entities?limit=${Cn}&status=all`),es().catch(()=>[])]);if(_!==ae.current)return;Array.isArray(W)?i(W):(console.warn("[memesh dashboard] /v1/entities answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",W),u(xe("unreadable"))),r(oe),f(0)}catch(W){if(_!==ae.current)return;console.warn("[memesh dashboard] /v1/entities failed to load:",W),u(xe(Ze(W)))}finally{_===ae.current&&c(!1)}}Z(()=>{k()},[o]),Z(()=>{f(0)},[l,C,A,B,j,x]);function z(_=!0){ue.current++,I(null),M(!1),_&&d("")}function P(_){D(_),z()}Z(()=>{D(_=>_.kind==="layer"&&(_.v==="work"||_.v==="all")?{kind:"layer",v:R?"work":"all"}:_)},[R]);const G=de(()=>n.filter(_=>!vt(_)),[n]),ce=de(()=>n.filter(vt),[n]),ie=de(()=>{const _={work:0,evidence:0};for(const W of G){const oe=Mn(W.type);oe==="work"?_.work++:oe==="evidence"&&_.evidence++}return _},[G]),we=de(()=>{const _={knowledge:0,activity:0,session:0,reference:0};for(const W of G)_[Mo(W.type)]++;return _},[G]);function _e(_){return C.kind==="archived"?vt(_):vt(_)?!1:C.kind==="cluster"?Mo(_.type)===C.v:C.v==="all"?!0:Mn(_.type)===C.v}const Ee=de(()=>{const _=l.toLowerCase();return n.filter(W=>!(!_e(W)||A!=="all"&&os(di(W))!==A||B==="recalled"&&(W.access_count??0)===0||B==="never"&&(W.access_count??0)>0||j!=="all"&&Yt(W)!==j||_&&![W.name,W.title??"",W.type,...W.observations??[],...W.tags??[]].join(" ").toLowerCase().includes(_)))},[n,C,A,B,j,l]),fe=de(()=>{const _=[...Ee];return x==="most-recalled"?_.sort((W,oe)=>(oe.access_count??0)-(W.access_count??0)||po(bt(W),bt(oe))):x==="created"?_.sort((W,oe)=>po(Co(W.created_at),Co(oe.created_at))):_.sort((W,oe)=>po(bt(W),bt(oe))),_},[Ee,x]),He=Math.ceil(fe.length/ho),Ve=fe.slice(g*ho,(g+1)*ho);async function nt(){const _=l.trim();if(!_)return;const W=++ue.current;M(!0),u("");try{const oe=await te("POST","/v1/recall",{query:_,limit:li}),Ye=Array.isArray(oe)?oe:oe.entities;if(W!==ue.current)return;if(!Array.isArray(Ye)){console.warn("[memesh dashboard] /v1/recall answered with a shape this bundle cannot read:",oe),u(xe("unreadable"));return}I(Ye)}catch(oe){if(W!==ue.current)return;u(qe(oe))}finally{W===ue.current&&M(!1)}}async function st(_){if(confirm(s("browse.confirmArchive")))try{await te("POST","/v1/forget",{name:_}),window.dispatchEvent(new Event("memesh:data-changed"))}catch(W){u(s("browse.archiveFailed",{message:qe(W)}))}}async function Ue(_){try{await te("POST","/v1/remember",{name:_,type:"restored"}),window.dispatchEvent(new Event("memesh:data-changed"))}catch(W){u(s("browse.restoreFailed",{message:qe(W)}))}}function Ke(_){J(W=>{const oe=new Set(W);return oe.has(_)?oe.delete(_):oe.add(_),oe})}function Oe(_,W){const oe=K.has(_.id),Ye=vt(_);return e("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"12px 0"},children:[e(Ut,{entity:_,highlight:W,actions:e(Q,{children:[e(ti,{entity:_}),e("button",{class:"btn btn-sm",style:{padding:"6px 8px",minHeight:28},"aria-expanded":oe,"aria-controls":`mem-detail-${_.id}`,"aria-label":s(oe?"memories.collapse":"memories.expand"),onClick:()=>Ke(_.id),children:e("svg",{width:"12",height:"12",viewBox:"0 0 16 16","aria-hidden":"true",style:{transform:oe?"rotate(90deg)":"none",transition:"transform 150ms"},children:e("path",{d:"M6 4 L10 8 L6 12",stroke:"currentColor",strokeWidth:"1.5",fill:"none",strokeLinecap:"round",strokeLinejoin:"round"})})}),Ye?e("button",{class:"btn btn-sm",onClick:()=>Ue(_.name),children:s("browse.restore")}):e("button",{class:"btn btn-danger btn-sm",onClick:()=>st(_.name),children:s("browse.archive")})]})}),oe&&e("div",{id:`mem-detail-${_.id}`,children:e(ai,{entity:_})})]},_.id)}const Qt=l!==""||A!=="all"||B!=="all"||j!=="all",Mt=w!==null,pt=G.length;return e("div",{children:e("div",{class:"card",children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:12},children:[e("div",{children:[e("div",{class:"card-title",style:{margin:0},children:s("browse.title")}),!m&&e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:2},children:[e("span",{style:{fontFamily:"var(--mono)"},children:pt.toLocaleString(me())})," ",s("browse.active"),ce.length>0?e(Q,{children:[" · ",e("span",{style:{fontFamily:"var(--mono)"},children:ce.length})," ",s("browse.archived")]}):"",n.length>=Cn&&(t==null?e("span",{children:[" · ",s("browse.truncatedUnknownTotal",{shown:n.length.toLocaleString(me())})]}):t.entity_count>n.length?e("span",{children:[" · ",s("browse.truncated",{shown:n.length.toLocaleString(me()),total:t.entity_count.toLocaleString(me())})]}):null)]})]}),e("button",{class:"btn btn-sm",onClick:k,title:s("browse.refresh"),children:"↻"})]}),e("div",{role:"status",style:{fontSize:14,color:"var(--text-2)",padding:"8px 10px",marginBottom:10,background:"var(--bg-2)",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-xs)"},children:s(R?"globalFilter.focusedStatus":"globalFilter.allStatus")}),e("div",{class:"search-bar",style:{marginBottom:10},children:[e("input",{type:"search",placeholder:s("memories.searchPlaceholder"),value:l,onInput:_=>{d(_.target.value),z(!1)},onKeyDown:_=>_.key==="Enter"&&nt()}),e("button",{class:"btn",onClick:nt,disabled:v||!l.trim(),children:s(v?"search.searching":"search.button")})]}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:8,alignItems:"center"},children:[e("span",{style:{fontSize:14,color:"var(--text-3)",marginRight:4},children:s("memories.scopeLabel")}),e(Te,{label:s("memories.scopeWork"),active:C.kind==="layer"&&C.v==="work",onClick:()=>P({kind:"layer",v:"work"}),count:ie.work}),e(Te,{label:s("memories.scopeEvidence"),active:C.kind==="layer"&&C.v==="evidence",onClick:()=>P({kind:"layer",v:"evidence"}),count:ie.evidence}),e(Te,{label:s("memories.scopeAll"),active:C.kind==="layer"&&C.v==="all",onClick:()=>P({kind:"layer",v:"all"}),count:pt}),e("span",{style:{width:1,alignSelf:"stretch",background:"var(--border-subtle)",margin:"0 6px"}}),e(Te,{label:s("memories.scopeArchived"),active:C.kind==="archived",onClick:()=>P({kind:"archived"}),count:ce.length})]}),pt>0&&e("div",{style:{marginBottom:8},children:[e("div",{"aria-hidden":"true",style:{display:"flex",height:6,borderRadius:"var(--radius-hairline)",overflow:"hidden",background:"var(--bg-0)",marginBottom:6},children:_n.map(_=>we[_]>0&&e("span",{style:{flex:we[_],background:Kt[_]}},_))}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"center"},children:[e("span",{style:{fontSize:14,color:"var(--text-3)",marginRight:4},children:s("memories.composition")}),_n.map(_=>e(Te,{label:s(`cluster.${_}`),dot:Kt[_],count:we[_],active:C.kind==="cluster"&&C.v===_,onClick:()=>P(C.kind==="cluster"&&C.v===_?{kind:"layer",v:"all"}:{kind:"cluster",v:_})},_))]})]}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:6},children:[e("span",{style:{fontSize:14,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:s("browse.filterTime")}),e(Te,{label:s("browse.timeToday"),active:A==="today",onClick:()=>L(A==="today"?"all":"today")}),e(Te,{label:s("browse.timeWeek"),active:A==="week",onClick:()=>L(A==="week"?"all":"week")}),e(Te,{label:s("browse.timeMonth"),active:A==="month",onClick:()=>L(A==="month"?"all":"month")}),e(Te,{label:s("browse.timeOlder"),active:A==="older",onClick:()=>L(A==="older"?"all":"older")}),e("span",{style:{width:1,background:"var(--border-subtle)",margin:"0 6px"}}),e("span",{style:{fontSize:14,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:s("browse.filterValue")}),e(Te,{label:s("browse.valueRecalled"),active:B==="recalled",onClick:()=>F(B==="recalled"?"all":"recalled")}),e(Te,{label:s("browse.valueNever"),active:B==="never",onClick:()=>F(B==="never"?"all":"never")})]}),a.length>0&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:6},children:[e("span",{style:{fontSize:14,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:s("browse.filterProject")}),e(Te,{label:s("cluster.all"),active:j==="all",onClick:()=>p("all")}),a.map(_=>e(Te,{label:_.name,count:_.count,active:j===_.name,onClick:()=>p(_.name)},_.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:14,color:"var(--text-3)"},children:s("browse.filterSort")}),e("select",{value:x,onChange:_=>E(_.target.value),style:{padding:"3px 8px",fontSize:14},children:[e("option",{value:"most-recalled",children:s("browse.sortMostRecalled")}),e("option",{value:"recent",children:s("browse.sortRecent")}),e("option",{value:"created",children:s("browse.sortCreated")})]})]}),h&&e("div",{class:"error-box",role:"alert",style:{marginBottom:12},children:h}),(m||v)&&e("div",{class:"empty",children:e("div",{class:"loading"})}),!m&&!v&&Mt&&e("div",{children:[e("div",{role:"status",style:{display:"flex",alignItems:"center",gap:10,fontSize:14,color:"var(--text-3)",marginBottom:8},children:[e("span",{children:[e("span",{style:{fontFamily:"var(--mono)"},children:w.length})," ",w.length!==1?s("search.results"):s("search.result")," · ",s("memories.rankedBy")]}),e("button",{class:"btn btn-sm",onClick:()=>z(),children:["✕ ",s("memories.backToList")]})]}),w.length===0?e("div",{class:"empty",role:"status",children:[s("search.noResults"),' "',l,'"']}):w.map(_=>Oe(_,l))]}),!m&&!v&&!Mt&&(n.length===0?!h&&e(zo,{}):fe.length===0?e("div",{class:"empty",children:C.kind==="layer"&&C.v==="work"&&!Qt?e(Q,{children:[e("div",{style:{marginBottom:10},children:s("memories.workEmpty")}),e(Te,{label:s("memories.showAll"),active:!1,onClick:()=>P({kind:"layer",v:"all"})})]}):l?e(Q,{children:[s("browse.noMatch"),' "',l,'"']}):e(Q,{children:s("browse.emptyFilter")})}):e("div",{children:[Ve.map(_=>Oe(_,l)),He>1&&e("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:12,padding:"16px 0",fontSize:14},children:[e("button",{class:"btn btn-sm",disabled:g===0,onClick:()=>f(_=>_-1),children:s("browse.prev")}),e("span",{style:{color:"var(--text-3)",fontFamily:"var(--mono)",fontSize:14},children:[g+1," / ",He]}),e("button",{class:"btn btn-sm",disabled:g>=He-1,onClick:()=>f(_=>_+1),children:s("browse.next")})]})]}))]})})}const go=["knowledge","activity","session","reference"],An=34,ui=60,Ht=1440*60*1e3;function hi(t){const o=t/Ht;return o<=31?Ht:o<=217?7*Ht:30*Ht}function pi(t){const o=t.map(d=>Je(d.created_at).getTime()).filter(d=>Number.isFinite(d));if(o.length===0)return[];const n=Math.min(...o),i=Math.max(...o),a=hi(Math.max(i-n,1)),r=Math.min(Math.floor((i-n)/a)+1,ui),l=Array.from({length:r},(d,m)=>({startMs:n+m*a,counts:{knowledge:0,activity:0,session:0,reference:0},total:0}));for(const d of t){const m=Je(d.created_at).getTime();if(!Number.isFinite(m))continue;const c=Math.min(Math.floor((m-n)/a),r-1);l[c].counts[Mo(d.type)]++,l[c].total++}return l}function gi({entities:t}){const o=de(()=>pi(t),[t]),n=de(()=>{const a={knowledge:0,activity:0,session:0,reference:0};for(const r of o)for(const l of go)a[l]+=r.counts[l];return a},[o]);if(o.length===0)return null;const i=Math.max(...o.map(a=>a.total),1);return e("div",{style:{marginBottom:14},children:[e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"baseline",marginBottom:4},children:[e("span",{style:{fontSize:14,color:"var(--text-2)",fontFamily:"var(--font-ui)"},children:s("roadmap.densityTitle")}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:s("roadmap.densityNote")})]}),e("div",{"aria-hidden":"true",style:{display:"flex",alignItems:"flex-end",gap:1,height:An,background:"var(--bg-0)",borderRadius:"var(--radius-hairline)",padding:"2px 2px 0"},children:o.map((a,r)=>e("div",{style:{flex:1,display:"flex",flexDirection:"column",justifyContent:"flex-end",minWidth:0},children:go.map(l=>a.counts[l]>0&&e("div",{style:{height:Math.max(a.counts[l]/i*(An-2),1),background:Kt[l],borderRadius:"var(--radius-hairline)"}},l))},r))}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:10,marginTop:4},children:go.map(a=>n[a]>0&&e("span",{style:{display:"inline-flex",alignItems:"center",gap:5,fontSize:14,color:"var(--text-2)",fontFamily:"var(--font-ui)"},children:[e("span",{"aria-hidden":"true",style:{width:8,height:8,borderRadius:"var(--radius-hairline)",background:Kt[a],flexShrink:0}}),s(`cluster.${a}`),e("span",{style:{fontFamily:"var(--mono)",fontSize:14,opacity:.7},children:n[a]})]},a))})]})}const fi=new Set(["decision","design_decision","architecture_decision"]),yi=new Set(["supersedes","contradicts"]),En=new Set(["release","feature"]),vi=.65,bi=new Set(["release"]),ki=new Set(["lesson_learned","lesson","mistake","bug_fix"]),xi={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 wi(t){if(t.length<3)return[];const i=[...t].sort((d,m)=>d.created_at.localeCompare(m.created_at)),a=[];let r=[i[0]];for(let d=1;d<i.length;d++){const m=i[d-1].created_at,c=i[d].created_at;(new Date(c).getTime()-new Date(m).getTime())/864e5<=7?r.push(i[d]):(a.push(r),r=[i[d]])}a.push(r);const l=[];for(const d of a){if(d.length<3)continue;const m=d.map(c=>({e:c,p:xi[c.type]??99})).sort((c,h)=>c.p-h.p)[0];m.p!==99&&l.push({startIso:d[0].created_at,endIso:d[d.length-1].created_at,entityCount:d.length,label:Be(m.e),anchorId:m.e.id})}return l}const Si={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 ut(t){return Si[t]??50}function Mi(t,o=new Date){const n=new Map;for(const a of t){const r=a.last_accessed_at||a.created_at,l=os(r,o);let d,m,c;if(l==="today")d="today",m=s("time.today"),c=Number.MAX_SAFE_INTEGER;else if(l==="week"){const u=r.slice(0,10);d=`week:${u}`,m=mt(r,o),c=new Date(u).getTime()}else if(l==="month"){const u=r.slice(0,10),g=new Date(u),f=new Date(g);f.setDate(g.getDate()-g.getDay());const R=f.toISOString().slice(0,10);d=`month:${R}`,m=mt(R,o),c=f.getTime()}else{const u=r.slice(0,7);d=`older:${u}`;const g=new Date(u+"-01");m=g.toLocaleDateString(me(),{year:"numeric",month:"long"}),c=g.getTime()}let h=n.get(d);h||(h={key:d,label:m,sort:c,entries:[]},n.set(d,h)),h.entries.push(a)}const i=Array.from(n.values()).sort((a,r)=>r.sort-a.sort);for(const a of i)a.entries.sort((r,l)=>{const d=ut(r.type)-ut(l.type);return d!==0?d:l.created_at.localeCompare(r.created_at)});return i}function Ci({projectName:t,entities:o}){const[n,i]=b("tree"),a=de(()=>{if(o.length===0)return{total:0,first:null,last:null,types:[]};const p=[...o].sort((E,w)=>E.created_at.localeCompare(w.created_at)),x=new Map;for(const E of o)x.set(E.type,(x.get(E.type)??0)+1);return{total:o.length,first:p[0].created_at,last:p[p.length-1].created_at,types:Array.from(x.entries()).sort((E,w)=>w[1]-E[1])}},[o]),r=de(()=>Mi(o),[o]),l=de(()=>o.filter(p=>{if(!En.has(p.type))return!1;if(bi.has(p.type))return!0;const x=p.metadata?.signal_score;return typeof x!="number"?!0:x>=vi}).sort((p,x)=>x.created_at.localeCompare(p.created_at)).slice(0,6),[o]),d=de(()=>o.filter(x=>En.has(x.type)).length-l.length,[o,l]),m=de(()=>o.filter(p=>ki.has(p.type)).sort((p,x)=>(x.access_count??0)-(p.access_count??0)).slice(0,5),[o]),c=de(()=>wi(o),[o]),h=V(new Map),u=p=>x=>{x?h.current.set(p,x):h.current.delete(p)},g=p=>{const x=h.current.get(p);x&&(x.scrollIntoView({behavior:"smooth",block:"center"}),x.focus({preventScroll:!0}),x.style.transition="background 0.2s",x.style.background="var(--life-soft)",window.setTimeout(()=>{x.style.background=""},1400))},f=p=>{i("tree"),window.requestAnimationFrame(()=>g(p))},R=de(()=>{const p=new Map;for(const x of o)p.set(x.name,x.id);return p},[o]),C=de(()=>{const p=[];for(const x of o)for(const E of x.relations??[]){if(!yi.has(E.type))continue;const w=R.get(E.to);w!==void 0&&w!==x.id&&p.push({from:x.id,to:w,type:E.type})}return p},[o,R]),D=V(null),[A,L]=b([]),B=V(()=>{});B.current=()=>{const p=D.current;if(!p||C.length===0||n!=="tree"){L(w=>w.length===0?w:[]);return}const x=p.getBoundingClientRect().top,E=[];for(const w of C){const I=h.current.get(w.from),v=h.current.get(w.to);if(!I||!v)continue;const M=I.getBoundingClientRect(),K=v.getBoundingClientRect(),J=Math.round(M.top-x+M.height/2),ae=Math.round(K.top-x+K.height/2);E.push({d:`M 14 ${J} C 0 ${J}, 0 ${ae}, 14 ${ae}`,type:w.type})}L(w=>w.length===E.length&&w.every((v,M)=>v.d===E[M].d&&v.type===E[M].type)?w:E)},Z(()=>{B.current()}),Z(()=>{const p=()=>B.current();return window.addEventListener("resize",p),()=>window.removeEventListener("resize",p)},[]);const F=A.filter(p=>p.type==="supersedes").length,j=A.filter(p=>p.type==="contradicts").length;return o.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"})]})}),s("roadmap.emptyProject")]}):e("div",{children:[e("div",{style:{padding:"14px 16px",background:"var(--border-subtle)",border:"1px solid rgba(143, 242, 92, 0.12)",borderRadius:"var(--radius-sm)",marginBottom:14},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",flexWrap:"wrap",gap:8},children:[e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:18,fontWeight:600,color:"var(--text-0)",display:"inline-flex",alignItems:"center",gap:8},children:[e("svg",{width:"18",height:"18",viewBox:"0 0 16 16","aria-hidden":"true",style:{color:"var(--life)"},children:e("path",{d:"M2 4 a1 1 0 0 1 1 -1 h4 l2 2 h5 a1 1 0 0 1 1 1 v6 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"})}),e("span",{children:t}),e("span",{style:{color:"var(--text-3)",fontWeight:400,fontSize:14},children:["· ",s("roadmap.title")]})]}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:4},children:s("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":s("roadmap.viewToggle"),style:{display:"inline-flex",background:"var(--border-subtle)",borderRadius:"var(--radius-xs)",padding:2,border:"1px solid var(--border-subtle)"},children:["tree","mindmap","decisions"].map(p=>{const x=n===p,E=p==="tree"?`🌲 ${s("roadmap.viewTree")}`:p==="mindmap"?`🧠 ${s("roadmap.viewMindmap")}`:`⚖️ ${s("roadmap.viewDecisions")}`;return e("button",{role:"tab","aria-selected":x,onClick:()=>i(p),style:{padding:"4px 10px",background:x?"rgba(143,242,92,0.15)":"transparent",color:x?"var(--life)":"var(--text-2)",border:"none",borderRadius:"var(--radius-hairline)",fontSize:14,fontFamily:"inherit",cursor:"pointer",fontWeight:x?600:400},children:E},p)})})})]}),a.types.length>0&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginTop:10},children:[a.types.slice(0,8).map(([p,x])=>e("span",{class:"tag",style:{fontSize:14,background:"var(--border-subtle)"},children:[De(p)," ",e("span",{style:{fontFamily:"var(--mono)"},children:x})]},p)),a.types.length>8&&e("span",{class:"tag",style:{fontSize:14},children:["+",a.types.length-8]})]})]}),e(gi,{entities:o}),n!=="decisions"&&c.length>0&&e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:14,padding:"12px 14px",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-sm)",background:"rgba(255, 255, 255, 0.02)",overflowX:"auto"},children:[e("span",{style:{fontSize:14,textTransform:"uppercase",letterSpacing:"0.08em",color:"var(--text-3)",fontWeight:600,flexShrink:0},children:s("roadmap.phases")}),c.map((p,x)=>e("button",{onClick:()=>p.anchorId!==void 0&&g(p.anchorId),disabled:p.anchorId===void 0,style:{flexShrink:0,display:"flex",flexDirection:"column",alignItems:"flex-start",gap:2,padding:"6px 10px",background:x===c.length-1?"var(--life-soft)":"transparent",border:"1px solid",borderColor:x===c.length-1?"rgba(143, 242, 92, 0.3)":"var(--border-subtle)",borderRadius:"var(--radius-xs)",color:"var(--text-1)",cursor:p.anchorId!==void 0?"pointer":"default",fontFamily:"inherit",textAlign:"left",minWidth:100},title:`${p.startIso.slice(0,10)} → ${p.endIso.slice(0,10)}`,children:[e("span",{style:{fontSize:14,fontWeight:600,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:240},children:p.label}),e("span",{style:{fontSize:14,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[p.entityCount," · ",mt(p.startIso)]})]},`${p.startIso}-${p.label}`))]}),n==="mindmap"&&c.length>0&&e(Ai,{projectName:t,phases:c,entities:o,onNodeClick:f}),n==="mindmap"&&c.length===0&&e("div",{class:"empty",style:{padding:24},children:[s("roadmap.emptyProject")," — ",s("roadmap.mindmapNeedsPhases")]}),n==="decisions"&&e(_i,{entities:o,onJump:f}),n==="tree"&&e("div",{style:{display:"grid",gridTemplateColumns:"minmax(0, 1fr) 280px",gap:16,alignItems:"start"},children:[e("div",{style:{position:"relative",minWidth:0},children:[(F>0||j>0)&&e("div",{style:{fontSize:14,color:"var(--text-3)",marginBottom:6,fontFamily:"var(--font-ui)"},children:[F>0&&e("span",{style:{marginRight:10},children:["— ",s("roadmap.lineageSupersedes",{n:F})]}),j>0&&e("span",{style:{color:"var(--warning)"},children:["⋯ ",s("roadmap.lineageConflicts",{n:j})]})]}),c.length>0?e("div",{ref:D,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)"}}),A.length>0&&e("svg",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,width:28,height:"100%",overflow:"visible",pointerEvents:"none"},children:A.map((p,x)=>e("path",{d:p.d,fill:"none",stroke:p.type==="contradicts"?"var(--warning)":"var(--text-3)",strokeWidth:1.5,strokeDasharray:p.type==="contradicts"?"3 3":void 0,opacity:.8},x))}),(()=>{const p=c.map(()=>[]),x=[];for(const w of o){const I=c.findIndex(v=>w.created_at>=v.startIso&&w.created_at<=v.endIso);I>=0?p[I].push(w):x.push(w)}for(const w of p)w.sort((I,v)=>{const M=ut(I.type)-ut(v.type);return M!==0?M:v.created_at.localeCompare(I.created_at)});const E=c.map((w,I)=>({phase:w,entries:p[I],idx:I})).reverse();return e(Q,{children:[E.map(({phase:w,entries:I},v)=>{const M=v===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:M?"transparent":"var(--life)",border:"2px solid var(--life)",boxSizing:"border-box"}}),e("button",{onClick:()=>w.anchorId!==void 0&&g(w.anchorId),disabled:w.anchorId===void 0,style:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:2,padding:0,background:"transparent",border:"none",color:"inherit",cursor:w.anchorId!==void 0?"pointer":"default",fontFamily:"inherit",textAlign:"left",width:"100%"},children:[e("span",{style:{fontSize:14,fontWeight:600,color:"var(--text-0)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:"100%"},children:[w.label,M&&e("span",{style:{marginLeft:8,fontSize:14,color:"var(--life)",fontFamily:"var(--mono)",fontWeight:500},children:s("roadmap.activePhase")})]}),e("span",{style:{fontSize:14,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[w.startIso.slice(0,10)," → ",w.endIso.slice(0,10)," · ",I.length===1?s("roadmap.entryCount",{count:1}):s("roadmap.entriesCount",{count:I.length})]})]}),e("div",{style:{marginTop:8},children:I.map((K,J)=>{const ae=J===I.length-1;return e("div",{ref:u(K.id),tabIndex:-1,"data-roadmap-entry-id":K.id,style:{position:"relative",paddingLeft:24,paddingTop:6,paddingBottom:6},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,bottom:ae?"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(Ut,{entity:K})]},K.id)})})]},`${w.startIso}-${w.label}`)}),x.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:14,color:"var(--text-2)",fontFamily:"var(--mono)",marginBottom:8},children:s("roadmap.otherGroup",{count:x.length})}),x.map((w,I)=>{const v=I===x.length-1;return e("div",{ref:u(w.id),tabIndex:-1,"data-roadmap-entry-id":w.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(Ut,{entity:w})]},w.id)})]})]})})()]}):r.map(p=>e("div",{style:{marginBottom:18},children:[e("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:8,paddingBottom:6,borderBottom:"1px solid var(--border-subtle)"},children:[e("span",{style:{fontSize:14,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--life)",fontFamily:"var(--mono)"},children:p.label}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:p.entries.length})]}),p.entries.map(x=>e("div",{ref:u(x.id),tabIndex:-1,"data-roadmap-entry-id":x.id,style:{borderBottom:"1px solid var(--border-subtle)",padding:"12px 0"},children:e(Ut,{entity:x})},x.id))]},p.key))]}),e("div",{style:{display:"flex",flexDirection:"column",gap:14,position:"sticky",top:16},children:[l.length>0&&e("div",{class:"card",style:{padding:14},children:[e("div",{style:{fontSize:14,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--text-2)",marginBottom:10,display:"flex",alignItems:"center",gap:4},children:[s("roadmap.milestones"),d>0&&e("span",{style:{fontSize:14,fontWeight:400,opacity:.55,textTransform:"none",letterSpacing:0},children:s("roadmap.lowSignalHidden",{count:d})})]}),l.map(p=>e("button",{onClick:()=>g(p.id),style:{display:"flex",alignItems:"flex-start",gap:8,width:"100%",textAlign:"left",padding:"6px 0",background:"transparent",border:"none",borderTop:"1px solid var(--border-subtle)",color:"inherit",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{flexShrink:0,color:"var(--life)"},children:e(Xt,{type:p.type,size:14})}),e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:14,color:"var(--text-1)",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:Be(p)}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:2},children:mt(p.created_at)})]})]},p.id))]}),m.length>0&&e("div",{class:"card",style:{padding:14},children:[e("div",{style:{fontSize:14,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--text-2)",marginBottom:10},children:s("roadmap.keyLessons")}),m.map(p=>{const x=ns(p.access_count);return e("button",{onClick:()=>g(p.id),style:{display:"flex",alignItems:"flex-start",gap:8,width:"100%",textAlign:"left",padding:"6px 0",background:"transparent",border:"none",borderTop:"1px solid var(--border-subtle)",color:"inherit",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{flexShrink:0,color:"var(--text-2)"},children:e(Xt,{type:p.type,size:14})}),e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:14,color:"var(--text-1)",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:Be(p)}),e("div",{style:{fontSize:14,color:x.tone==="high"?"var(--life)":"var(--text-3)",marginTop:2,fontFamily:"var(--mono)"},children:x.tone!=="none"?x.label:s("memory.access.never")})]})]},p.id)})]})]})]})]})}function _i({entities:t,onJump:o}){const[n,i]=b(()=>new Set),a=c=>i(h=>{const u=new Set(h);return u.has(c)?u.delete(c):u.add(c),u}),r=de(()=>t.filter(c=>fi.has(c.type)).sort((c,h)=>h.created_at.localeCompare(c.created_at)),[t]),l=de(()=>{const c=new Map;for(const h of t)c.set(h.name,h);return c},[t]),d=de(()=>{const c=new Map;for(const h of t)for(const u of h.relations??[]){if(u.type!=="supersedes")continue;const g=c.get(u.to)??[];g.push(h),c.set(u.to,g)}return c},[t]);if(r.length===0)return e("div",{class:"empty",style:{padding:24},children:s("adr.empty")});const m=c=>{const h=l.get(c);return h?e("button",{onClick:()=>o(h.id),style:{background:"transparent",border:"none",padding:0,cursor:"pointer",color:"var(--life)",fontSize:"inherit",fontFamily:"inherit",textDecoration:"underline"},children:Be(h)}):e("span",{style:{color:"var(--text-2)"},children:c})};return e("div",{style:{display:"flex",flexDirection:"column",gap:10},children:r.map(c=>{const h=d.get(c.name)??[],u=h.length>0||!!c.archived||c.status==="archived",g=n.has(c.id),f=`adr-body-${c.id}`,R=(c.relations??[]).filter(C=>C.type==="supersedes").map(C=>C.to);return e("div",{style:{border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-sm)",padding:"10px 12px",opacity:u?.75:1},children:[e("button",{"aria-expanded":g,"aria-controls":f,onClick:()=>a(c.id),style:{display:"flex",alignItems:"center",gap:8,width:"100%",background:"transparent",border:"none",padding:0,cursor:"pointer",color:"inherit",textAlign:"left",fontFamily:"inherit"},children:[e("span",{"aria-hidden":"true",style:{color:"var(--text-3)",fontSize:10,width:10,flexShrink:0},children:g?"▾":"▸"}),e(Xt,{type:c.type,size:14}),e("span",{style:{fontFamily:"var(--font-memory)",fontSize:15,color:"var(--text-0)",flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:Be(c)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:14,color:"var(--text-3)",flexShrink:0},children:c.created_at.slice(0,10)}),e("span",{style:{fontSize:14,padding:"2px 8px",borderRadius:9999,flexShrink:0,background:u?"var(--neutral-soft)":"var(--life-soft)",color:u?"var(--text-2)":"var(--life)"},children:s(u?"adr.statusSuperseded":"adr.statusActive")})]}),g&&e("div",{id:f,style:{marginTop:8,paddingLeft:18},children:[c.observations.map((C,D)=>e("p",{style:{fontFamily:"var(--font-memory)",fontSize:15,lineHeight:1.6,color:"var(--text-1)",margin:"0 0 6px"},children:C},D)),e(ls,{entity:c}),(R.length>0||h.length>0)&&e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:6,display:"flex",flexDirection:"column",gap:3},children:[R.map(C=>e("span",{children:[s("adr.supersedes")," → ",m(C)]},`s-${C}`)),h.map(C=>e("span",{children:[s("adr.supersededBy")," → ",m(C.name)]},`b-${C.id}`))]})]})]},c.id)})})}function Ai({projectName:t,phases:o,entities:n,onNodeClick:i}){const a=o.map(()=>[]);for(const k of n){const z=o.findIndex(P=>k.created_at>=P.startIso&&k.created_at<=P.endIso);z>=0&&a[z].push(k)}for(const k of a)k.sort((z,P)=>{const G=ut(z.type)-ut(P.type);return G!==0?G:P.created_at.localeCompare(z.created_at)});const r=6,l=a.map(k=>({shown:k.slice(0,r),extra:Math.max(0,k.length-r)})),d=Math.max(900,o.length*360),m=600,c=d/2,h=50,u=(d-o.length*360)/2,g=14,f=V(null),R=V({width:d,height:m});R.current={width:d,height:m};const[C,D]=b(1),[A,L]=b(0),[B,F]=b(0),j=V(C),p=V({x:A,y:B});j.current=C,p.current={x:A,y:B};const x=V({active:!1,lastX:0,lastY:0}),[E,w]=b(!1),I=.25,v=4,M=(k,z)=>{const P=f.current;if(!P)return{x:0,y:0};const G=P.getBoundingClientRect();return G.width===0||G.height===0?{x:0,y:0}:{x:(k-G.left)/G.width*R.current.width,y:(z-G.top)/G.height*R.current.height}};Z(()=>{const k=f.current;if(!k)return;const z=P=>{P.preventDefault();const G=j.current,ce=p.current,ie=Math.exp(-P.deltaY*.0015),we=Math.max(I,Math.min(v,G*ie));if(we===G)return;const{x:_e,y:Ee}=M(P.clientX,P.clientY),fe=(_e-ce.x)/G,He=(Ee-ce.y)/G;D(we),L(_e-fe*we),F(Ee-He*we)};return k.addEventListener("wheel",z,{passive:!1}),()=>k.removeEventListener("wheel",z)},[]);const K=k=>{let P=k.target;for(;P&&P!==f.current;){if(P.style?.cursor==="pointer")return;P=P.parentElement}k.preventDefault(),x.current.active=!0,x.current.lastX=k.clientX,x.current.lastY=k.clientY,w(!0)},J=k=>{if(!x.current.active)return;const z=f.current;if(!z)return;const P=z.getBoundingClientRect();if(P.width===0||P.height===0)return;const G=(k.clientX-x.current.lastX)/P.width*d,ce=(k.clientY-x.current.lastY)/P.height*m;x.current.lastX=k.clientX,x.current.lastY=k.clientY,L(ie=>ie+G),F(ie=>ie+ce)},ae=()=>{x.current.active&&(x.current.active=!1,w(!1))},ue=()=>{D(1),L(0),F(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:ue,title:s("roadmap.resetHint"),style:{position:"absolute",top:8,right:8,zIndex:2,padding:"4px 10px",fontSize:14,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:s("graph.resetView")}),e("div",{style:{position:"absolute",bottom:8,left:12,zIndex:2,fontSize:14,fontFamily:"var(--mono)",color:"var(--text-3)",pointerEvents:"none"},children:s("roadmap.zoomHint",{pct:Math.round(C*100)})}),e("div",{style:{overflowX:"auto",overflowY:"hidden"},children:e("svg",{ref:f,viewBox:`0 0 ${d} ${m}`,width:d,height:m,style:{display:"block",width:d,minWidth:d,height:m,minHeight:m,cursor:E?"grabbing":"grab",userSelect:"none",touchAction:"pan-x"},onMouseDown:K,onMouseMove:J,onMouseUp:ae,onMouseLeave:ae,onDblClick:ue,children:e("g",{transform:`translate(${A} ${B}) scale(${C})`,children:[o.map((k,z)=>{const P=u+z*360+180,G=160;return e("path",{d:`M ${c} ${h} Q ${(c+P)/2} ${(h+G)/2-10} ${P} ${G}`,fill:"none",stroke:"rgba(143, 242, 92, 0.4)",strokeWidth:1.5},`p-${z}`)}),o.map((k,z)=>{const{shown:P}=l[z],G=u+z*360+180,ce=160;return P.map((ie,we)=>{const _e=G-140,Ee=240+we*40;return e("path",{d:`M ${G} ${ce} Q ${(G+_e)/2} ${(ce+Ee)/2} ${_e} ${Ee}`,fill:"none",stroke:"rgba(255,255,255,0.18)",strokeWidth:1},`e-${z}-${ie.id}`)})}),e("g",{children:[e("circle",{cx:c,cy:h,r:42,fill:"rgba(143, 242, 92, 0.18)",stroke:"var(--life)",strokeWidth:1.5}),e("text",{x:c,y:h,"text-anchor":"middle","dominant-baseline":"central","font-size":g,"font-weight":600,fill:"var(--text-0)",style:{pointerEvents:"none"},children:t.length>14?t.slice(0,12)+"…":t})]}),o.map((k,z)=>{const P=u+z*360+180,G=160,ce=k.label.length>18?k.label.slice(0,16)+"…":k.label;return e("g",{role:k.anchorId!==void 0?"button":void 0,tabindex:k.anchorId!==void 0?0:void 0,"aria-label":k.anchorId!==void 0?k.label:void 0,style:{cursor:k.anchorId!==void 0?"pointer":"default"},onClick:()=>k.anchorId!==void 0&&i(k.anchorId),onKeyDown:ie=>{k.anchorId!==void 0&&(ie.key==="Enter"||ie.key===" ")&&(ie.preventDefault(),i(k.anchorId))},children:[e("circle",{cx:P,cy:G,r:28,fill:"rgba(143, 242, 92, 0.10)",stroke:"var(--life)",strokeWidth:1.25}),e("text",{x:P,y:G-8,"text-anchor":"middle","font-size":g,"font-weight":600,fill:"var(--text-0)",style:{pointerEvents:"none"},children:[e("tspan",{x:P,dy:0,children:ce}),e("tspan",{x:P,dy:18,"font-size":g,fill:"var(--text-3)","font-weight":400,"font-family":"var(--mono)",children:[k.entityCount," · ",k.startIso.slice(5,10)]})]})]},`phase-${z}`)}),o.map((k,z)=>{const{shown:P,extra:G}=l[z],ce=u+z*360+180;return e("g",{children:[P.map((ie,we)=>{const _e=ce-140,Ee=240+we*40,fe=Be(ie),He=fe.length>22?fe.slice(0,20)+"…":fe;return e("g",{role:"button",tabindex:0,"aria-label":`${fe} (${De(ie.type)})`,style:{cursor:"pointer"},onClick:()=>i(ie.id),onKeyDown:Ve=>{(Ve.key==="Enter"||Ve.key===" ")&&(Ve.preventDefault(),i(ie.id))},children:[e("title",{children:`${fe} (${ie.type})`}),e("circle",{cx:_e,cy:Ee,r:4,fill:"var(--text-2)"}),e("text",{x:_e+12,y:Ee,"text-anchor":"start","dominant-baseline":"middle","font-size":g,fill:"var(--text-1)",style:{pointerEvents:"none"},children:He})]},ie.id)}),G>0&&(()=>{const ie=ce-128,we=240+P.length*40;return e("text",{x:ie,y:we,"text-anchor":"start","font-size":g,fill:"var(--text-3)","font-style":"italic",children:s("roadmap.moreEntities",{count:G})})})()]},`leaves-${z}`)})]})})})]})}function ht({id:t,command:o}){const[n,i]=b(!1);async function a(){try{await navigator.clipboard.writeText(o),i(!0)}catch{i(!1)}}return e("div",{"data-external-handoff":t,"data-destination":"terminal",style:{marginTop:6},children:[e("div",{style:{fontSize:14,color:"var(--warning)",fontWeight:600},children:s("handoff.terminal")}),e("div",{style:{fontSize:14,color:"var(--text-3)",margin:"2px 0 5px"},children:s("handoff.terminalPrereq")}),e("div",{style:{display:"flex",gap:6,alignItems:"center",flexWrap:"wrap"},children:[e("code",{style:{fontFamily:"var(--mono)",fontSize:14},children:o}),e("button",{type:"button",class:"btn btn-sm",onClick:()=>{a()},children:s(n?"handoff.commandCopied":"handoff.copyCommand")})]})]})}function ds({id:t}){return e("span",{"data-external-handoff":t,"data-destination":"github",style:{fontSize:14,color:"var(--text-3)"},children:s("handoff.github")})}const Ei=2e3;function Ti(){try{return new URLSearchParams(window.location.search).get("project")}catch{return null}}function Li(t){try{const o=new URL(window.location.href);o.searchParams.set("project",t),history.replaceState(null,"",o)}catch{}}function Ri(t,o){if(!o)return[];const n=l=>!!l.archived||l.status==="archived",i=t.filter(l=>!n(l)&&Yt(l)===o),a=new Set;for(const l of i)for(const d of l.relations??[])(d.type==="supersedes"||d.type==="contradicts")&&a.add(d.to);const r=t.filter(l=>n(l)&&a.has(l.name)&&Yt(l)===o);return[...i,...r].sort((l,d)=>d.created_at.localeCompare(l.created_at))}function Pi({health:t,dataRevision:o=0}){const[n,i]=b([]),[a,r]=b([]),[l,d]=b(Ti),[m,c]=b(!0),[h,u]=b(""),[g,f]=b(""),R=V(0);Z(()=>{const D=++R.current;c(!0),u(""),f(""),Promise.all([te("GET",`/v1/entities?limit=${Ei}&status=all`),es().then(A=>({ok:!0,list:A}),A=>({ok:!1,failure:Ze(A)}))]).then(([A,L])=>{D===R.current&&(Array.isArray(A)?i(A):u(xe("unreadable")),L.ok?(r(L.list),L.list.length===1&&d(B=>B??L.list[0].name)):f(xe(L.failure)))}).catch(A=>{D===R.current&&u(xe(Ze(A)))}).finally(()=>{D===R.current&&c(!1)})},[o]);const C=de(()=>Ri(n,l),[n,l]);return m&&n.length===0?e("div",{class:"empty",children:e("div",{class:"loading"})}):h&&n.length===0?e("div",{class:"error-box",role:"alert",children:h}):n.length===0&&t==null?e("div",{class:"empty",children:e("div",{class:"loading"})}):t?.entity_count===0?e(zo,{}):g&&a.length===0?e("div",{class:"error-box",role:"alert",children:g}):a.length===0?e("div",{class:"empty",children:[e("div",{children:s("project.empty")}),e(ht,{id:"project-hook-setup",command:"memesh install-hooks"})]}):e("div",{children:[m&&e("div",{class:"loading",role:"status"}),h&&e("div",{class:"error-box",role:"alert",children:h}),g&&e("div",{class:"error-box",role:"alert",children:g}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:12,alignItems:"center"},children:[e("span",{style:{fontSize:14,color:"var(--text-3)",marginRight:4},children:s("project.selectLabel")}),a.map(D=>e(Te,{label:D.name,count:D.count,active:l===D.name,onClick:()=>{d(D.name),Li(D.name)}},D.name))]}),l?e("div",{class:"card",children:e(Ci,{projectName:l,entities:C})}):e("div",{class:"empty",children:s("project.selectPrompt")})]})}function ji(){const[t,o]=b(!1),[n,i]=b(!1),[a,r]=b(null);return Z(()=>{if(!t)return;let l=!0;return i(!0),r(null),te("GET","/v1/doctor").then(d=>{const m=d?.checks?.find(c=>c.code==="shell-cli.versions")?.params;l&&m&&["current","terminal","shellPath","packageRoot"].every(c=>typeof m[c]=="string")&&r(m)}).catch(()=>{}).finally(()=>{l&&i(!1)}),()=>{l=!1}},[t]),e("section",{class:"card",children:[e("button",{type:"button",class:"btn","aria-expanded":t,"aria-controls":"installation-details",onClick:()=>o(!t),children:s("settings.installationDetails")}),t&&e("div",{id:"installation-details",style:{marginTop:12},children:n?e("p",{children:s("common.loading")}):a?e(Q,{children:[e("p",{children:s("doctor.msg.shell-cli.versions.summary",{current:a.current,terminal:a.terminal})}),e("p",{children:s("settings.installationDetailsHint")}),e("details",{children:[e("summary",{children:s("settings.technicalDetails")}),e("dl",{children:[e("dt",{children:s("settings.interfacePath")}),e("dd",{children:e("code",{children:a.packageRoot})}),e("dt",{children:s("settings.terminalPath")}),e("dd",{children:e("code",{children:a.shellPath})})]})]})]}):e("p",{role:"status",children:s("settings.installationDetailsUnavailable")})})]})}function Tn(t){return typeof t?.config=="object"&&t.config!==null}function zi(t){return typeof t?.checkSucceeded=="boolean"&&typeof t.freshness=="string"&&typeof t.updateAvailable=="boolean"}function Ln(t,o){if(!o)return"—";const n=new Date(o);return Number.isNaN(n.getTime())?o:n.toLocaleString(t)}function Di(t){switch(t){case"npm-global":return s("settings.installNpmGlobal");case"npm-local":return s("settings.installNpmLocal");case"source-checkout":return s("settings.installSourceCheckout");default:return s("settings.installUnknown")}}function Hi(t){switch(t){case"npm-global":return s("settings.updateGuidanceNpmGlobal");case"npm-local":return s("settings.updateGuidanceNpmLocal");case"source-checkout":return s("settings.updateGuidanceSourceCheckout");default:return s("settings.updateGuidanceUnknown")}}function Ni({locale:t,onLocaleChange:o}){const[n,i]=b(null),[a,r]=b(null),[l,d]=b(!0),[m,c]=b(!1),[h,u]=b(""),[g,f]=b(!0),[R,C]=b(!1);async function D(z=!0,P=!1){P?C(!0):f(!0);try{const ce=await te("GET",z?"/v1/update-status":"/v1/update-status?cached=1");if(!zi(ce)){console.warn("[memesh dashboard] /v1/update-status answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",ce),P||r(null);return}r(ce)}catch{P||r(null)}finally{P?C(!1):f(!1)}}Z(()=>{let z=!1;return d(!0),te("GET","/v1/config").then(P=>{if(!z){if(!Tn(P)){P!==null&&console.warn("[memesh dashboard] /v1/config answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",P),i(null);return}i(P)}}).catch(P=>{console.warn("[memesh dashboard] /v1/config failed to load:",P),i(null)}).finally(()=>{z||d(!1)}),D(),()=>{z=!0}},[]);async function A(z){c(!0),u("");try{await te("POST","/v1/config",{autoUpdate:z});const P=await te("GET","/v1/config");if(!Tn(P)||P.config.autoUpdate!==z)throw new Error(s("settings.configReadbackFailed"));i(P),u(s("settings.saved"))}catch(P){u(s("common.error")+": "+qe(P))}finally{c(!1)}}function L(z){Ys(z),o(z)}const B=g||R&&!a,F=g||R,j=!!a?.currentVersionDeprecated,p=!!(a?.latestVersion&&a.updateAvailable),x=!!(j&&a?.latestVersion&&a.latestVersion===a.currentVersion&&a?.freshness==="fresh"),E=!!(a?.checkSucceeded&&a?.lastError),w=B?s("settings.updateChecking"):a?j?s(p?"settings.updateAvailable":x?"settings.updateDeprecatedNoTarget":"settings.updateDeprecatedTargetUnknown"):a.freshness==="unavailable"?s("settings.updateNoSuccessfulChecks"):!a.checkSucceeded&&a.freshness==="stale"?s("settings.updateStale"):!a.checkSucceeded&&a.freshness==="cached"?s("settings.updateCachedFallback"):a.updateAvailable?s("settings.updateAvailable"):s(E?"settings.updatePartialSummary":"settings.upToDate"):s("settings.updateUnavailable"),I=a?j?"var(--danger)":a.freshness==="unavailable"||!a.checkSucceeded&&a.freshness==="stale"?"var(--warning)":!a.checkSucceeded&&a.freshness==="cached"||a.updateAvailable?"var(--info)":E?"var(--warning)":"var(--success)":"var(--warning)",v=a?.freshness==="stale"?s("settings.updateSourceStale"):a?.source==="cache"?s("settings.updateSourceCached"):a?.source==="fresh"?s("settings.updateSourceFresh"):s("settings.updateSourceUnavailable"),M=Di(a?.installChannel),K=Hi(a?.installChannel),J=B?s("common.loading"):Ln(t,a?.lastAttemptAt||null),ae=B?s("common.loading"):Ln(t,a?.lastSuccessfulCheckAt||null),ue=!!a?.lastSuccessfulCheckAt,k=!!a?.lastError&&!B;return e("div",{style:{display:"grid",gap:12},children:[e(ji,{}),e("div",{class:"card",children:[e("div",{class:"card-title",children:s("settings.updates")}),a?.currentVersionDeprecated&&a.deprecationMessage&&e("div",{style:{background:"var(--danger-soft)",border:"1px solid rgba(255, 122, 107, 0.4)",borderRadius:"var(--radius-xs)",padding:"10px 12px",marginBottom:12,fontSize:14,color:"var(--text-0)",lineHeight:1.55},"data-testid":"settings-deprecation-warning",children:[e("strong",{style:{color:"var(--danger)"},children:s("settings.updateDeprecatedTitle",{version:a.currentVersion})}),e("div",{style:{marginTop:4,opacity:.9},children:a.deprecationMessage})]}),a&&a.checkSucceeded&&a.lastError&&e("div",{style:{background:"var(--warning-soft)",border:"1px solid rgba(255, 171, 64, 0.4)",borderRadius:"var(--radius-xs)",padding:"10px 12px",marginBottom:12,fontSize:14,color:"var(--text-0)",lineHeight:1.55},"data-testid":"settings-update-partial-warning",children:[e("strong",{style:{color:"var(--warning)"},children:s("settings.updatePartialTitle")}),e("div",{style:{marginTop:4,opacity:.9},children:s("settings.updatePartialDescription",{message:a.lastError??""})})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,alignItems:"baseline",marginBottom:12,flexWrap:"wrap"},children:[e("div",{style:{color:I,fontSize:16,fontWeight:600},children:w}),e("div",{style:{display:"flex",gap:10,alignItems:"center",flexWrap:"wrap"},children:[!B&&a&&e("div",{style:{fontSize:14,color:"var(--text-2)"},children:v}),e("button",{class:"btn btn-sm",type:"button",onClick:()=>{D(!0,!!a)},disabled:F,children:s(F?"settings.updateChecking":"settings.checkNow")})]})]}),e("div",{style:{display:"grid",gap:10},children:[e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:14},children:[e("span",{style:{color:"var(--text-2)"},children:s("settings.installMethod")}),e("span",{style:{color:"var(--text-0)"},children:B?s("common.loading"):M})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:14},children:[e("span",{style:{color:"var(--text-2)"},children:s("settings.currentVersion")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:a?.currentVersion||"—"})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:14},children:[e("span",{style:{color:"var(--text-2)"},children:s("settings.latestVersion")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:a?.latestVersion||"—"})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:14},children:[e("span",{style:{color:"var(--text-2)"},children:s("settings.lastAttempted")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:J})]}),ue&&e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:14},children:[e("span",{style:{color:"var(--text-2)"},children:s("settings.lastSuccessful")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:ae})]}),!g&&a?.updateAvailable&&e("div",{style:{color:"var(--text-2)",fontSize:14,lineHeight:1.5,marginTop:2},children:K}),k&&e("div",{style:{color:"var(--warning)",fontSize:14,lineHeight:1.5},children:s("settings.updateLastError",{message:a?.lastError||""})}),a?.updateAvailable&&a.recommendedCommand&&e("div",{style:{display:"grid",gap:6,marginTop:4},children:[e("span",{style:{color:"var(--text-2)",fontSize:14},children:s("settings.updateCommand")}),e(ht,{id:"settings-update",command:a.recommendedCommand})]})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:s("settings.behaviourTitle")}),e("div",{style:{marginTop:8},children:[l&&e("div",{class:"loading",role:"status"}),e("label",{id:"settings-autoupdate-label",style:{fontSize:14,color:"var(--text-2)",display:"block",marginBottom:4},children:s("settings.autoUpdateLabel")}),e("select",{"aria-labelledby":"settings-autoupdate-label",value:n?.config.autoUpdate??"off",disabled:!n||m,onChange:z=>{A(z.target.value)},style:{fontSize:16,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:s("settings.autoUpdateOff")}),e("option",{value:"patch",children:s("settings.autoUpdatePatch")}),e("option",{value:"minor",children:s("settings.autoUpdateMinor")}),e("option",{value:"major",children:s("settings.autoUpdateMajor")})]}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:4},children:s("settings.autoUpdateHint")}),h&&e("div",{role:h.startsWith(s("common.error"))?"alert":"status",style:{marginTop:8,fontSize:14},children:h})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:s("settings.language")}),e("div",{style:{display:"grid",gap:12},children:e("div",{children:[e("label",{id:"settings-interface-language-label",style:{fontSize:14,color:"var(--text-2)",display:"block",marginBottom:4},children:s("settings.interfaceLanguage")}),e("select",{"aria-labelledby":"settings-interface-language-label",value:t,onChange:z=>L(z.target.value),style:{fontSize:16,padding:"6px 10px",borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--bg-input)",color:"var(--text-1)",cursor:"pointer"},children:Xs().map(z=>e("option",{value:z.code,children:z.name},z.code))}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:4},children:s("settings.interfaceLanguageHint")})]})})]})]})}function Bi({node:t,nodeTitle:o,onClose:n}){const[i,a]=b({phase:"loading"});return Z(()=>{let r=!1;return a({phase:"loading"}),aa(t).then(l=>{r||a({phase:"loaded",data:l})}).catch(l=>{r||(console.warn("[memesh dashboard] evidence drill-down failed:",l),a({phase:"failed"}))}),()=>{r=!0}},[t]),e("div",{style:{marginTop:12,padding:12,background:"var(--bg-2)",border:"1px solid var(--border)",borderRadius:"var(--radius)"},children:[e("div",{style:{display:"flex",alignItems:"baseline",gap:8,marginBottom:8},children:[e("strong",{style:{fontSize:14,minWidth:0,overflowWrap:"anywhere"},children:s("graph.evidenceFor",{node:o})}),e("button",{type:"button",onClick:n,style:{marginLeft:"auto",flexShrink:0,whiteSpace:"nowrap",minHeight:32,background:"transparent",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",color:"var(--text-2)",fontSize:14,padding:"2px 8px",cursor:"pointer"},children:s("graph.evidenceClose")})]}),i.phase==="loading"&&e("div",{style:{color:"var(--text-2)",fontSize:14},children:s("graph.evidenceLoading")}),i.phase==="failed"&&e("div",{role:"alert",style:{color:"var(--danger)",fontSize:14},children:s("graph.evidenceFailed")}),i.phase==="loaded"&&i.data.entities.length===0&&e("div",{style:{color:"var(--text-2)",fontSize:14},children:[s("graph.evidenceEmpty"),e(ht,{id:"graph-evidence-backfill",command:"memesh kg backfill"})]}),i.phase==="loaded"&&i.data.entities.length>0&&e(Q,{children:[e("ul",{style:{listStyle:"none",margin:0,padding:0,display:"grid",gap:6},children:i.data.entities.map(r=>e("li",{style:{display:"flex",gap:8,alignItems:"baseline",fontSize:14},children:[e("span",{style:{color:"var(--text-3)",fontSize:14,minWidth:96},children:De(r.type)}),e("span",{style:{color:"var(--text-1)"},children:Be(r)})]},r.name))}),i.data.truncated&&e("div",{style:{marginTop:8,color:"var(--text-2)",fontSize:14},children:s("graph.evidenceTruncated",{shown:i.data.entities.length})})]})]})}function ms(t){return Array.isArray(t?.entities)&&Array.isArray(t.relations)}function Fi(t){return ms(t)&&typeof t.evidenceCounts=="object"&&t.evidenceCounts!==null&&!Array.isArray(t.evidenceCounts)}const Rn=3,Pn=16,us={decision:"--life","session-insight":"--text-2"},hs="--text-1",Ii=["--life","--life-hover","--text-0","--text-1","--text-2","--text-3","--bg-0","--bg-1","--font-ui","--mono"];function qi(t){const o=us[t];return o?`var(${o})`:ct[t]??`var(${hs})`}function Ui(t,o){const n=us[t];return n?o[n]??"":ct[t]??o[hs]??""}function Oi(t){const o=Math.max(0,Math.min(1,(t-.15)/.85)),n=Math.round(248+-105*o),i=Math.round(113+129*o),a=Math.round(113+-21*o);return`rgb(${n},${i},${a})`}function Wi(t){const o=Number.isFinite(t)&&t>0?t:0;return o===0?3.5:Math.min(9,3.5+Math.log2(o+1)*1.2)}function Gi(t,o=.55){const n=/^#([0-9a-f]{6})$/i.exec(t.trim());if(n){const a=parseInt(n[1],16),r=Math.round((a>>16&255)*o),l=Math.round((a>>8&255)*o),d=Math.round((a&255)*o);return`rgb(${r},${l},${d})`}const i=/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/.exec(t.trim());return i?`rgb(${Math.round(+i[1]*o)},${Math.round(+i[2]*o)},${Math.round(+i[3]*o)})`:t}function jn(t){let o=5381;for(let n=0;n<t.length;n++)o=(o<<5)+o+t.charCodeAt(n)>>>0;return o}function $i(t){if(!t)return .15;const o=Date.now()-Je(t).getTime();return Math.max(.15,1-Math.min(1,o/(30*864e5)))}function Vi(t){const o=Date.now()-Je(t).getTime(),n=Math.floor(o/864e5);return n<1?s("graph.ageToday"):n<7?s("graph.ageDaysAgo",{count:n}):n<30?s("graph.ageWeeksAgo",{count:Math.floor(n/7)}):s("graph.ageDaysAgo",{count:n})}function fo(t,o){return t.length>o?t.slice(0,o-2)+"...":t}const yo=440,Nt=4,Ki=1500;function Yi(t,o=Ki){return t.length<=o?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,o)}function Xi({dataRevision:t=0}){const[o,n]=b(null),[i,a]=b("work"),[r,l]=b("work"),[d,m]=b(!1),[c,h]=b({}),[u,g]=b(null),[f,R]=b(0),[C,D]=b(!0),[A,L]=b(null),[B,F]=b({}),[j]=Po(),[p,x]=b(""),[E,w]=b(null),[I,v]=b(!1),M=V(null),K=V([]),J=V([]),ae=V(new Set),ue=V(0),k=V({scale:1,panX:0,panY:0}),z=V({active:!1,startScreenX:0,startScreenY:0,startPanX:0,startPanY:0,moved:!1}),P=V({node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1}),G=V(null),ce=V({x:0,y:0,node:null}),ie=V(800),we=V({}),_e=V(B),Ee=V(p),fe=V(E),He=V(I),Ve=V(j);Z(()=>{_e.current=B},[B]),Z(()=>{if(!o)return;const S=new Set(o.noiseTypes??[]);F(N=>{const U={...N};let q=!1;for(const Y of S){const ne=!j;U[Y]!==ne&&(U[Y]=ne,q=!0)}return q?U:N})},[j,o]),Z(()=>{Ee.current=p},[p]),Z(()=>{fe.current=E},[E]),Z(()=>{He.current=I},[I]),Z(()=>{Ve.current=j},[j]);const nt=be(S=>{if(!ms(S)){console.warn("[memesh dashboard] /v1/graph answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",S),L("unreadable");return}L(null);const N=Yi(S.entities);N.length<S.entities.length&&console.info(`[memesh dashboard] graph capped at ${N.length} of ${S.entities.length} entities — the O(n²) simulation freezes the tab beyond this; showing the most-recalled nodes.`),R(S.entities.length),n({...S,entities:N});const U=new Set(Array.isArray(S.noiseTypes)?S.noiseTypes:[]),q={},Y=Ve.current;N.forEach(ne=>{q[ne.type]=q[ne.type]??(Y?!U.has(ne.type):!0)}),F(q)},[]);Z(()=>{let S=!1;D(!0),L(null),g(null);const N=()=>na().then(q=>{S||(l("all"),h({}),nt(q))}),U=i==="all"?(m(!1),N()):sa().then(q=>{if(!S){if(!Fi(q)){console.warn("[memesh dashboard] /v1/graph?layer=work answered with a shape this bundle cannot render:",q),L("unreadable"),n(null);return}if(q.entities.length<Rn)return m(!0),N();m(!1),l("work"),h(q.evidenceCounts),nt({...q,noiseTypes:[]})}});return Promise.resolve(U).catch(q=>{S||(console.warn("[memesh dashboard] graph failed to load:",q),L(Ze(q)))}).finally(()=>{S||D(!1)}),()=>{S=!0}},[i,nt,t]);const st=de(()=>{const S=new Map;if(!o)return S;for(const N of o.entities){const U=Be(N);S.set(N.name,{display:U,search:`${N.name} ${U}`.toLowerCase()})}return S},[o]);Z(()=>{if(!o||C)return;const S=M.current;if(!S)return;we.current=ss(S,Ii);const N=S.parentElement?.getBoundingClientRect(),U=N?Math.floor(N.width)-24:800,q=yo,Y=window.devicePixelRatio||1;S.width=U*Y,S.height=q*Y,S.style.width=U+"px",S.style.height=q+"px",ie.current=U;const ne=new Set;o.relations.forEach(H=>{ne.add(H.from),ne.add(H.to)});const he=2.399963229728653,Ae=U/2,Se=q/2,Me=[...new Set(o.entities.map(H=>H.type))].sort(),Qe=new Map,Ct=U*.42,gt=q*.42;Me.forEach((H,$)=>{const y=Math.sqrt(($+1)/Me.length),X=$*he;Qe.set(H,{x:Ae+Math.cos(X)*Ct*y,y:Se+Math.sin(X)*gt*y})});const Fe=new Map;for(const H of Me)o.entities.filter($=>$.type===H).map($=>$.name).sort().forEach(($,y)=>Fe.set($,y));const _t=Math.min(U,q)*.18,We=new Map;o.entities.forEach(H=>{const $=H.last_accessed_at||H.created_at,y=Qe.get(H.type),X=Fe.get(H.name),se=jn(H.name),Le=X*he+se%100/100,Ne=Math.min(_t,14+Math.sqrt(X)*16+se%7),at=st.get(H.name);We.set(H.name,{id:H.name,display:at.display,searchText:at.search,type:H.type,x:Math.min(U-16,Math.max(16,y.x+Math.cos(Le)*Ne)),y:Math.min(q-16,Math.max(16,y.y+Math.sin(Le)*Ne)),vx:0,vy:0,radius:Wi(H.access_count),recency:$i($),isOrphan:!ne.has(H.name),lastDate:$,accessCount:Math.max(0,H.access_count??0),evidenceCount:c[H.name]??0,badge:null})});const bs=Array.from(We.values()).sort(r==="work"?(H,$)=>$.recency-H.recency||$.evidenceCount-H.evidenceCount||H.id.localeCompare($.id):(H,$)=>$.accessCount-H.accessCount||$.recency-H.recency||H.id.localeCompare($.id));K.current=Array.from(We.values()),J.current=o.relations.filter(H=>We.has(H.from)&&We.has(H.to));const qo=new Set;for(const H of J.current){const $=jn(H.from+" "+H.to);(($^$>>>16)&3)===0&&qo.add(H)}const ks=H=>{const $=new Map,y=H.map(se=>{const Le=We.get(se.from),Ne=We.get(se.to),at=Math.sqrt(Math.log2(Le.accessCount+2)*Math.log2(Ne.accessCount+2));return{e:se,p:at*Math.min(Le.recency,Ne.recency)}}).sort((se,Le)=>Le.p-se.p),X=new Set;for(const{e:se}of y){if(X.size>=128)break;const Le=$.get(se.from)??0,Ne=$.get(se.to)??0;Le>=5||Ne>=5||(X.add(se),$.set(se.from,Le+1),$.set(se.to,Ne+1))}return X};let Uo=null;const ft=H=>{if(_e.current[H.type]===!1)return!1;const y=fe.current;return y?H.id===y?!0:J.current.some(se=>se.from===y&&se.to===H.id||se.to===y&&se.from===H.id):!0},xs=H=>{const $=We.get(H.from),y=We.get(H.to);return!$||!y?!1:ft($)&&ft(y)},ws=H=>{const $=Ee.current.toLowerCase();return $?H.searchText.includes($):!1};let et=1;const Ss=.005,Ms=()=>{et=.3};window.__graphReheat=Ms;const Oo=()=>{const H=K.current,$=J.current,y=S.getContext("2d");if(!y)return;const X=we.current,se=window.devicePixelRatio||1;et=Math.max(0,et-Ss);const Le=et>0,Ne=.85,at=2e3*et,Cs=80,_s=.02*et,Wo=.02*et,As=H.length>200,Go=U/2,$o=q/2,At=new Map(H.map(T=>[T.id,T]));if(Le){for(let T=0;T<H.length;T++)for(let O=T+1;O<H.length;O++){const ee=H[O].x-H[T].x,ye=H[O].y-H[T].y,pe=ee*ee+ye*ye;if(As&&pe>9e4)continue;const ke=Math.sqrt(pe)||1,Re=at/(ke*ke),Ie=ee/ke*Re,Pe=ye/ke*Re;H[T].vx-=Ie,H[T].vy-=Pe,H[O].vx+=Ie,H[O].vy+=Pe}for(const T of $){const O=At.get(T.from),ee=At.get(T.to);if(!O||!ee)continue;const ye=ee.x-O.x,pe=ee.y-O.y,ke=Math.sqrt(ye*ye+pe*pe)||1,Re=(ke-Cs)*_s,Ie=ye/ke*Re,Pe=pe/ke*Re;O.vx+=Ie,O.vy+=Pe,ee.vx-=Ie,ee.vy-=Pe}for(const T of H)T.vx+=(Go-T.x)*Wo,T.vy+=($o-T.y)*Wo}let yt=P.current.node;if(yt&&!H.includes(yt)&&(P.current.node=null,yt=null),!(!Le&&!yt&&H.every(T=>T.vx===0&&T.vy===0)))for(const T of H){if(yt===T)continue;T.vx*=Ne,T.vy*=Ne,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>U+O&&(T.x=U+O),T.y<-O?T.y=-O:T.y>q+O&&(T.y=q+O)}const Vo=Ee.current.toLowerCase();if(Vo){const T=H.filter(O=>O.searchText.includes(Vo));if(T.length===1){const O=T[0],ee=Go-O.x,ye=$o-O.y,pe=.05;for(const ke of H)ke.x+=ee*pe,ke.y+=ye*pe}}y.setTransform(se,0,0,se,0,0),y.clearRect(0,0,U,q);const Ce=k.current;y.setTransform(Ce.scale*se,0,0,Ce.scale*se,Ce.panX*se,Ce.panY*se);const Et=$.filter(xs),Es=Et.length<30,Ko=(fe.current??"")+"|"+Object.keys(_e.current).filter(T=>_e.current[T]===!1).sort().join(",");Ko!==Uo&&(Uo=Ko,ae.current=ks(Et));const Ts=ae.current,Ls=Et.length>400,Yo=fe.current!==null;for(const T of Et){const O=At.get(T.from),ee=At.get(T.to);if(!O||!ee)continue;const ye=Ts.has(T);if(!ye&&!Yo){if(Ls&&!qo.has(T))continue;y.globalAlpha=Math.min(O.recency,ee.recency)*.22}else y.globalAlpha=Math.min(O.recency,ee.recency)*.7;if(y.strokeStyle=co(X["--life"],ye||Yo?.5:.35),y.lineWidth=1,y.setLineDash([]),y.beginPath(),y.moveTo(O.x,O.y),y.lineTo(ee.x,ee.y),y.stroke(),Es){const pe=(O.x+ee.x)/2,ke=(O.y+ee.y)/2,Re=y.globalAlpha;y.globalAlpha=1,y.font=`${14/Ce.scale}px ${X["--font-ui"]}`,y.fillStyle=X["--text-2"],y.fillText(la(T.type),pe+2,ke-2),y.globalAlpha=Re}}y.globalAlpha=1;const Rs=H.filter(ft),Ps=Ce.scale<.75?3:Ce.scale<1.5?12:28,oo=new Set;if(!He.current)for(const T of bs){if(oo.size>=Ps)break;if(!ft(T))continue;const O=T.x*Ce.scale+Ce.panX,ee=T.y*Ce.scale+Ce.panY;O<-20||O>U+20||ee<-20||ee>q+20||oo.add(T)}const js=G.current;for(const T of Rs){const O=js===T,ee=ws(T),ye=fe.current===T.id,pe=ye?10:O?9:T.radius;T.badge=null;const ke=O||ee?1:T.recency;y.globalAlpha=ke,y.beginPath(),y.arc(T.x,T.y,pe,0,Math.PI*2);const Re=He.current?Oi(T.recency):Ui(T.type,X);y.fillStyle=Re,y.fill(),T.isOrphan||(y.strokeStyle=Gi(Re),y.lineWidth=1,y.stroke()),T.isOrphan&&(y.setLineDash([3,3]),y.strokeStyle=X["--text-3"],y.lineWidth=1,y.stroke(),y.setLineDash([])),ee&&(y.globalAlpha=1,y.strokeStyle=X["--life-hover"],y.lineWidth=2,y.beginPath(),y.arc(T.x,T.y,pe+3,0,Math.PI*2),y.stroke()),O&&!ee&&(y.globalAlpha=1,y.strokeStyle=X["--life-hover"],y.lineWidth=2,y.beginPath(),y.arc(T.x,T.y,pe,0,Math.PI*2),y.stroke());const Ie=O||ee||ye||oo.has(T);if(Ie){const Pe=O||ee||ye;y.globalAlpha=1,y.font=`${14/Ce.scale}px ${X["--font-ui"]}`;const Ge=ee||ye?fo(T.display,48):fo(T.display,20);y.strokeStyle=X["--bg-0"],y.lineWidth=3/Ce.scale,y.strokeText(Ge,T.x+pe+4,T.y+3),y.fillStyle=Pe?X["--text-1"]:X["--text-2"],y.fillText(Ge,T.x+pe+4,T.y+3),y.globalAlpha=ke}if(T.evidenceCount>0&&Ie){const Pe=Pn/Ce.scale,Ge=T.x-pe-Pe-4/Ce.scale,it=T.y;T.badge={x:Ge,y:it},y.globalAlpha=1,y.beginPath(),y.arc(Ge,it,Pe,0,Math.PI*2),y.fillStyle=X["--bg-0"],y.fill(),y.strokeStyle=X["--life"],y.lineWidth=1/Ce.scale,y.stroke(),y.font=`${14/Ce.scale}px ${X["--mono"]}`,y.fillStyle=X["--life"],y.textAlign="center",y.textBaseline="middle",y.fillText(T.evidenceCount>99?"99+":String(T.evidenceCount),Ge,it),y.textAlign="start",y.textBaseline="alphabetic",y.globalAlpha=ke}}y.globalAlpha=1;const tt=ce.current;if(tt.node&&ft(tt.node)){y.setTransform(se,0,0,se,0,0);const T=De(tt.node.type),O=Vi(tt.node.lastDate),ee=Math.max(0,ie.current-20),ye=no=>{if(y.measureText(no).width<=ee)return no;let rt=no;for(;rt.length&&y.measureText(`${rt}…`).width>ee;)rt=rt.slice(0,-1);return rt?`${rt}…`:""};y.font=`14px ${X["--font-ui"]}`;const pe=ye(fo(tt.node.display,64)),ke=y.measureText(pe).width;y.font=`14px ${X["--mono"]}`;const Re=ye(`${T} | ${O}`),Ie=y.measureText(Re).width,Pe=Math.max(ke,Ie)+12,Ge=44,it=Math.max(4,Math.min(tt.x+8,ie.current-Pe-4)),Xo=Math.max(4,Math.min(tt.y-28,yo-Ge-4)),Zo=it+6,Jo=Xo+18;y.fillStyle=co(X["--bg-1"],.92),y.strokeStyle=co(X["--life"],.3),y.lineWidth=1,y.beginPath(),y.roundRect(it,Xo,Pe,Ge,4),y.fill(),y.stroke(),y.fillStyle=X["--text-0"],y.font=`14px ${X["--font-ui"]}`,y.fillText(pe,Zo,Jo-4),y.fillStyle=X["--text-2"],y.font=`14px ${X["--mono"]}`,y.fillText(Re,Zo,Jo+16)}ue.current=requestAnimationFrame(Oo)};return ue.current=requestAnimationFrame(Oo),()=>cancelAnimationFrame(ue.current)},[o,C,r,c,st]);const Ue=be((S,N)=>{const U=K.current,q=_e.current,Y=fe.current,ne=k.current.scale||1,he=12/ne,Ae=he*he;for(let Se=U.length-1;Se>=0;Se--){const Me=U[Se];if(q[Me.type]===!1||Y&&Me.id!==Y&&!J.current.some(Fe=>Fe.from===Y&&Fe.to===Me.id||Fe.to===Y&&Fe.from===Me.id))continue;const Qe=Me.x-S,Ct=Me.y-N;if(Qe*Qe+Ct*Ct<Ae)return Me;if(Me.badge){const gt=Pn/ne,Fe=Me.badge.x-S,_t=Me.badge.y-N;if(Fe*Fe+_t*_t<gt*gt)return Me}}return null},[]),Ke=be(S=>{const N=M.current;if(!N)return{x:0,y:0};const U=N.getBoundingClientRect();return{x:S.clientX-U.left,y:S.clientY-U.top}},[]),Oe=be((S,N)=>{const U=k.current;return{x:(S-U.panX)/U.scale,y:(N-U.panY)/U.scale}},[]),Qt=be(S=>{M.current?.setPointerCapture?.(S.pointerId);const N=Ke(S),U=Oe(N.x,N.y),q=Ue(U.x,U.y);if(q)window.__graphReheat?.(),P.current={node:q,offsetX:U.x-q.x,offsetY:U.y-q.y,startX:N.x,startY:N.y,dragged:!1},z.current.active=!1;else{const Y=k.current;z.current={active:!0,startScreenX:N.x,startScreenY:N.y,startPanX:Y.panX,startPanY:Y.panY,moved:!1},P.current={node:null,offsetX:0,offsetY:0,startX:N.x,startY:N.y,dragged:!1};const ne=M.current;ne&&(ne.style.cursor="grabbing")}},[Ue,Ke,Oe]),Mt=be(S=>{const N=Ke(S),U=Oe(N.x,N.y),q=P.current,Y=z.current;if(q.node){const Ae=N.x-q.startX,Se=N.y-q.startY;Ae*Ae+Se*Se>Nt*Nt&&(q.dragged=!0),q.node.x=U.x-q.offsetX,q.node.y=U.y-q.offsetY,q.node.vx=0,q.node.vy=0}else if(Y.active){const Ae=N.x-Y.startScreenX,Se=N.y-Y.startScreenY;Ae*Ae+Se*Se>Nt*Nt&&(Y.moved=!0),k.current.panX=Y.startPanX+Ae,k.current.panY=Y.startPanY+Se}const ne=Ue(U.x,U.y);G.current=ne,ce.current=ne?{x:N.x,y:N.y,node:ne}:{x:0,y:0,node:null};const he=M.current;he&&(q.node||Y.active?he.style.cursor="grabbing":ne?he.style.cursor=fe.current?"pointer":"grab":he.style.cursor="grab")},[Ue,Ke,Oe]),pt=be(S=>{M.current?.releasePointerCapture?.(S.pointerId);const N=P.current,U=z.current,q=Ke(S),Y=Oe(q.x,q.y);if(N.node&&!N.dragged){w(Ae=>Ae===N.node.id?null:N.node.id);const he=N.node;g(Ae=>Ae?.id===he.id?null:he)}else!N.node&&U.active&&!U.moved&&(Ue(Y.x,Y.y)||(w(null),g(null)));P.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1},z.current.active=!1,z.current.moved=!1;const ne=M.current;if(ne){const he=Ue(Y.x,Y.y);ne.style.cursor=he&&fe.current?"pointer":"grab"}},[Ue,Ke,Oe]),_=be(()=>{P.current={node:null,offsetX:0,offsetY:0,startX:0,startY:0,dragged:!1},z.current.active=!1,z.current.moved=!1,G.current=null,ce.current={x:0,y:0,node:null};const S=M.current;S&&(S.style.cursor="default")},[]),W=be(S=>{S.preventDefault();const N=M.current;if(!N)return;const U=N.getBoundingClientRect(),q=S.clientX-U.left,Y=S.clientY-U.top,ne=k.current,he=ne.scale,Ae=Math.exp(-S.deltaY*.0015),Se=Math.max(.25,Math.min(4,he*Ae));if(Se===he)return;const Me=(q-ne.panX)/he,Qe=(Y-ne.panY)/he;ne.scale=Se,ne.panX=q-Me*Se,ne.panY=Y-Qe*Se},[]),oe=be(()=>{k.current={scale:1,panX:0,panY:0}},[]);if(Z(()=>{if(C||!o)return;const S=M.current;if(!S)return;const N=U=>W(U);return S.addEventListener("wheel",N,{passive:!1}),()=>S.removeEventListener("wheel",N)},[o,C,W]),C&&!o)return e("div",{class:"empty",children:e("div",{class:"loading"})});if(A&&!o)return e("div",{class:"error-box",role:"alert",children:xe(A)});if(!o)return e("div",{class:"error-box",role:"alert",children:[s("common.error"),": ",s("common.noData")]});const Ye=new Map;o.entities.forEach(S=>Ye.set(S.type,(Ye.get(S.type)||0)+1));const Ho=new Set(o.entities.map(S=>S.name)),eo=new Set;o.relations.forEach(S=>{!Ho.has(S.from)||!Ho.has(S.to)||(eo.add(S.from),eo.add(S.to))});const No=o.entities.filter(S=>!eo.has(S.name)).length,to=de(()=>{if(!p)return[];const S=p.toLowerCase();return[...st.entries()].filter(([,N])=>N.search.includes(S))},[st,p]),Bo=to.length,ys=()=>{if(to.length!==1)return;const[S]=to[0];w(S);const N=K.current.find(U=>U.id===S);N&&g(N)},Fo=E?o.entities.find(S=>S.name===E):null,Io=e("div",{role:"status",style:{fontSize:14,color:"var(--text-2)",padding:"8px 10px",marginBottom:8,background:"var(--bg-2)",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-xs)"},children:s(j?"globalFilter.focusedStatus":"globalFilter.allStatus")});if(o.entities.length===0)return e("div",{children:[C&&e("div",{class:"loading",role:"status"}),A&&e("div",{class:"error-box",role:"alert",children:xe(A)}),Io,e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:"0"}),e("div",{class:"stat-lbl",children:s("graph.entities")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:"0"}),e("div",{class:"stat-lbl",children:s("graph.relations")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:"0"}),e("div",{class:"stat-lbl",children:s("graph.orphans")})]})]}),e("div",{class:"card",style:{padding:12},children:[e("span",{class:"card-title",style:{margin:0},children:s("tab.graph")}),e(zo,{})]})]});const vs=f>o.entities.length;return e("div",{children:[C&&e("div",{class:"loading",role:"status"}),A&&e("div",{class:"error-box",role:"alert",children:xe(A)}),Io,e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:f.toLocaleString(me())}),e("div",{class:"stat-lbl",children:s("graph.entities")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:o.relations.length.toLocaleString(me())}),e("div",{class:"stat-lbl",children:s("graph.relations")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:No.toLocaleString(me())}),e("div",{class:"stat-lbl",children:s("graph.orphans")})]})]}),vs&&e("div",{role:"status",style:{fontSize:14,color:"var(--text-2)",margin:"0 0 8px"},children:s("graph.cappedNote",{shown:o.entities.length.toLocaleString(me()),total:f.toLocaleString(me())})}),e("div",{style:{display:"flex",alignItems:"center",flexWrap:"wrap",gap:8,margin:"0 0 8px"},children:[e("div",{role:"group","aria-label":s("graph.layerLabel"),style:{display:"flex",flexShrink:0,gap:4},children:["work","all"].map(S=>e("button",{type:"button","aria-pressed":i===S,onClick:()=>a(S),style:{fontSize:14,padding:"3px 10px",whiteSpace:"nowrap",minHeight:32,borderRadius:"var(--radius)",cursor:"pointer",border:`1px solid ${i===S?"var(--life)":"var(--border)"}`,background:i===S?"var(--life-soft)":"transparent",color:i===S?"var(--life)":"var(--text-2)"},children:s(S==="work"?"graph.layerWork":"graph.layerAll")},S))}),e("span",{style:{fontSize:14,color:"var(--text-2)"},children:s(r==="work"?"graph.layerWorkHint":"graph.layerAllHint")})]}),d&&e("div",{role:"status",style:{fontSize:14,color:"var(--text-2)",margin:"0 0 8px"},children:s("graph.layerFellBack",{min:Rn})}),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:s("tab.graph")}),Array.from(Ye.entries()).map(([S,N])=>{const U=B[S]!==!1,q=qi(S);return e("label",{style:{display:"inline-flex",alignItems:"center",flexShrink:0,whiteSpace:"nowrap",minHeight:32,gap:4,fontSize:14,color:"var(--text-1)",cursor:"pointer",userSelect:"none"},children:[e("input",{type:"checkbox",checked:U,onChange:()=>F(Y=>({...Y,[S]:!Y[S]})),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}}),De(S)," (",N,")"]},S)})]}),e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8,flexWrap:"wrap"},children:[e("input",{type:"text",placeholder:s("graph.search"),value:p,onInput:S=>x(S.target.value),onKeyDown:S=>{S.key==="Enter"&&ys()},"aria-describedby":"graph-search-hint",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:14,fontFamily:"var(--font-ui)"}}),p&&e("span",{id:"graph-search-hint",role:"status",style:{fontSize:14,fontFamily:"var(--mono)",color:"var(--text-2)"},children:[Bo," ",s("graph.matches"),Bo===1&&` — ${s("graph.enterToOpen")}`]}),e("button",{onClick:oe,title:s("graph.resetViewHint"),style:{marginLeft:"auto",padding:"3px 10px",background:"var(--border-subtle)",border:"1px solid var(--border)",borderRadius:"var(--radius-xs)",color:"var(--text-2)",fontSize:14,cursor:"pointer"},children:s("graph.resetView")}),e("button",{onClick:()=>v(S=>!S),title:s("graph.driftHint"),"aria-pressed":I,style:{padding:"3px 10px",background:I?"rgba(143,242,92,0.15)":"var(--border-subtle)",border:`1px solid ${I?"rgba(143,242,92,0.4)":"var(--border)"}`,borderRadius:"var(--radius-xs)",color:I?"var(--life)":"var(--text-2)",fontSize:14,cursor:"pointer",display:"flex",alignItems:"center",gap:6},children:[e("span",{style:{display:"inline-block",width:32,height:6,borderRadius:"var(--radius-hairline)",background:"linear-gradient(to right, #F87171, var(--life))"}}),s("graph.drift")]})]}),Fo&&e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8,padding:"4px 10px",background:"var(--life-soft)",borderRadius:"var(--radius-xs)",fontSize:14},children:[e("span",{style:{color:"var(--life)",fontWeight:600},children:[s("graph.focusMode"),":"]}),e("span",{style:{color:"var(--text-0)",minWidth:0,overflowWrap:"anywhere"},children:Be(Fo)}),e("button",{onClick:()=>w(null),style:{marginLeft:"auto",flexShrink:0,whiteSpace:"nowrap",minHeight:32,padding:"2px 8px",background:"rgba(143, 242, 92, 0.12)",border:"1px solid rgba(143, 242, 92, 0.2)",borderRadius:"var(--radius-hairline)",color:"var(--life)",fontSize:14,cursor:"pointer"},children:s("graph.showAll")})]}),!E&&e("div",{style:{fontSize:14,color:"var(--text-3)",marginBottom:6},children:s("graph.interactHint")}),e("canvas",{ref:M,role:"img",tabIndex:0,"aria-label":s("graph.canvasA11y",{entities:f.toLocaleString(me()),relations:o.relations.length.toLocaleString(me()),orphans:No.toLocaleString(me())}),style:{width:"100%",height:yo,borderRadius:"var(--radius-sm)",background:"var(--bg-0)",cursor:"grab",touchAction:"none"},onPointerDown:Qt,onPointerMove:Mt,onPointerUp:pt,onPointerCancel:_,onPointerLeave:_}),r==="work"&&u&&e(Bi,{node:u.id,nodeTitle:u.display,onClose:()=>g(null)})]})]})}function ps(t){const o=window.open(t,"_blank");if(!o)return!1;try{o.opener=null}catch{}return!0}function Zi(t){return[...t.matchAll(/`(memesh(?:\s+[^`]+)?)`/g)].map(o=>o[1])}const Ji=["bug","feature","question"],zn={bug:"feedback.bug",feature:"feedback.feature",question:"feedback.question"};function Qi({health:t}){const[o,n]=b(!1),[i,a]=b("bug"),[r,l]=b(""),[d,m]=b(!0),[c,h]=b(!1),[u,g]=b(""),[f,R]=b(""),[C,D]=b(!1),A=V(null),L=V(null),B=V(null),F=()=>{n(!1),L.current?.focus()};Z(()=>{if(!o)return;B.current?.focus();const E=I=>{const v=I.target;L.current?.contains(v)||A.current&&!A.current.contains(v)&&n(!1)},w=I=>{I.key==="Escape"&&(I.preventDefault(),F())};return document.addEventListener("mousedown",E),document.addEventListener("keydown",w),()=>{document.removeEventListener("mousedown",E),document.removeEventListener("keydown",w)}},[o]);function j(E){const w=E.checks.find(J=>J.id==="install_id"),M=E.checks.filter(J=>J.id!=="install_id").sort((J,ae)=>{const ue={fail:0,warn:1,pass:2};return(ue[J.status]??3)-(ue[ae.status]??3)}).map(J=>{const ae=J.status==="fail"?"❌":J.status==="warn"?"⚠️":"✅",ue=J.fix?` _Fix: ${J.fix}_`:"";return`- ${ae} **${J.label}**: ${J.summary}${ue}`}),K=w?`
14
- _Anonymous install ID: \`${(w.summary.match(/[0-9a-f-]{36}/)??["(unavailable)"])[0]}\` — included only because you checked "Include system info"._
15
- `:"";return`**Diagnostics** (overall: ${E.status})${K}
13
+ <script type="module" crossorigin>(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))i(a);new MutationObserver(a=>{for(const r of a)if(r.type==="childList")for(const l of r.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&i(l)}).observe(document,{childList:!0,subtree:!0});function s(a){const r={};return a.integrity&&(r.integrity=a.integrity),a.referrerPolicy&&(r.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?r.credentials="include":a.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function i(a){if(a.ep)return;a.ep=!0;const r=s(a);fetch(a.href,r)}})();var tt,G,vo,he,zt,bo,ko,nt,Oe,_e,xo,wt,pt,gt,$e={},Ke=[],Jo=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,ot=Array.isArray;function me(t,o){for(var s in o)t[s]=o[s];return t}function St(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function Qo(t,o,s){var i,a,r,l={};for(r in o)r=="key"?i=o[r]:r=="ref"?a=o[r]:l[r]=o[r];if(arguments.length>2&&(l.children=arguments.length>3?tt.call(arguments,2):s),typeof t=="function"&&t.defaultProps!=null)for(r in t.defaultProps)l[r]===void 0&&(l[r]=t.defaultProps[r]);return Fe(t,l,i,a,null)}function Fe(t,o,s,i,a){var r={type:t,props:o,key:s,ref:i,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:a??++vo,__i:-1,__u:0};return a==null&&G.vnode!=null&&G.vnode(r),r}function q(t){return t.children}function Ge(t,o){this.props=t,this.context=o}function ke(t,o){if(o==null)return t.__?ke(t.__,t.__i+1):null;for(var s;o<t.__k.length;o++)if((s=t.__k[o])!=null&&s.__e!=null)return s.__e;return typeof t.type=="function"?ke(t):null}function es(t){if(t.__P&&t.__d){var o=t.__v,s=o.__e,i=[],a=[],r=me({},o);r.__v=o.__v+1,G.vnode&&G.vnode(r),Mt(t.__P,r,o,t.__n,t.__P.namespaceURI,32&o.__u?[s]:null,i,s??ke(o),!!(32&o.__u),a),r.__v=o.__v,r.__.__k[r.__i]=r,Co(i,r,a),o.__e=o.__=null,r.__e!=s&&wo(r)}}function wo(t){if((t=t.__)!=null&&t.__c!=null)return t.__e=t.__c.base=null,t.__k.some(function(o){if(o!=null&&o.__e!=null)return t.__e=t.__c.base=o.__e}),wo(t)}function Dt(t){(!t.__d&&(t.__d=!0)&&he.push(t)&&!Ye.__r++||zt!=G.debounceRendering)&&((zt=G.debounceRendering)||bo)(Ye)}function Ye(){try{for(var t,o=1;he.length;)he.length>o&&he.sort(ko),t=he.shift(),o=he.length,es(t)}finally{he.length=Ye.__r=0}}function So(t,o,s,i,a,r,l,d,m,c,h){var u,g,f,E,S,P,_,T=i&&i.__k||Ke,R=o.length;for(m=ts(s,o,T,m,R),u=0;u<R;u++)(f=s.__k[u])!=null&&(g=f.__i!=-1&&T[f.__i]||$e,f.__i=u,P=Mt(t,f,g,a,r,l,d,m,c,h),E=f.__e,f.ref&&g.ref!=f.ref&&(g.ref&&Ct(g.ref,null,f),h.push(f.ref,f.__c||E,f)),S==null&&E!=null&&(S=E),(_=!!(4&f.__u))||g.__k===f.__k?(m=Mo(f,m,t,_),_&&g.__e&&(g.__e=null)):typeof f.type=="function"&&P!==void 0?m=P:E&&(m=E.nextSibling),f.__u&=-7);return s.__e=S,m}function ts(t,o,s,i,a){var r,l,d,m,c,h=s.length,u=h,g=0;for(t.__k=new Array(a),r=0;r<a;r++)(l=o[r])!=null&&typeof l!="boolean"&&typeof l!="function"?(typeof l=="string"||typeof l=="number"||typeof l=="bigint"||l.constructor==String?l=t.__k[r]=Fe(null,l,null,null,null):ot(l)?l=t.__k[r]=Fe(q,{children:l},null,null,null):l.constructor===void 0&&l.__b>0?l=t.__k[r]=Fe(l.type,l.props,l.key,l.ref?l.ref:null,l.__v):t.__k[r]=l,m=r+g,l.__=t,l.__b=t.__b+1,d=null,(c=l.__i=os(l,s,m,u))!=-1&&(u--,(d=s[c])&&(d.__u|=2)),d==null||d.__v==null?(c==-1&&(a>h?g--:a<h&&g++),typeof l.type!="function"&&(l.__u|=4)):c!=m&&(c==m-1?g--:c==m+1?g++:(c>m?g--:g++,l.__u|=4))):t.__k[r]=null;if(u)for(r=0;r<h;r++)(d=s[r])!=null&&(2&d.__u)==0&&(d.__e==i&&(i=ke(d)),Ao(d,d));return i}function Mo(t,o,s,i){var a,r;if(typeof t.type=="function"){for(a=t.__k,r=0;a&&r<a.length;r++)a[r]&&(a[r].__=t,o=Mo(a[r],o,s,i));return o}t.__e!=o&&(i&&(o&&t.type&&!o.parentNode&&(o=ke(t)),s.insertBefore(t.__e,o||null)),o=t.__e);do o=o&&o.nextSibling;while(o!=null&&o.nodeType==8);return o}function os(t,o,s,i){var a,r,l,d=t.key,m=t.type,c=o[s],h=c!=null&&(2&c.__u)==0;if(c===null&&d==null||h&&d==c.key&&m==c.type)return s;if(i>(h?1:0)){for(a=s-1,r=s+1;a>=0||r<o.length;)if((c=o[l=a>=0?a--:r++])!=null&&(2&c.__u)==0&&d==c.key&&m==c.type)return l}return-1}function Nt(t,o,s){o[0]=="-"?t.setProperty(o,s??""):t[o]=s==null?"":typeof s!="number"||Jo.test(o)?s:s+"px"}function Pe(t,o,s,i,a){var r,l;e:if(o=="style")if(typeof s=="string")t.style.cssText=s;else{if(typeof i=="string"&&(t.style.cssText=i=""),i)for(o in i)s&&o in s||Nt(t.style,o,"");if(s)for(o in s)i&&s[o]==i[o]||Nt(t.style,o,s[o])}else if(o[0]=="o"&&o[1]=="n")r=o!=(o=o.replace(xo,"$1")),l=o.toLowerCase(),o=l in t||o=="onFocusOut"||o=="onFocusIn"?l.slice(2):o.slice(2),t.l||(t.l={}),t.l[o+r]=s,s?i?s[_e]=i[_e]:(s[_e]=wt,t.addEventListener(o,r?gt:pt,r)):t.removeEventListener(o,r?gt:pt,r);else{if(a=="http://www.w3.org/2000/svg")o=o.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(o!="width"&&o!="height"&&o!="href"&&o!="list"&&o!="form"&&o!="tabIndex"&&o!="download"&&o!="rowSpan"&&o!="colSpan"&&o!="role"&&o!="popover"&&o in t)try{t[o]=s??"";break e}catch{}typeof s=="function"||(s==null||s===!1&&o[4]!="-"?t.removeAttribute(o):t.setAttribute(o,o=="popover"&&s==1?"":s))}}function Ht(t){return function(o){if(this.l){var s=this.l[o.type+t];if(o[Oe]==null)o[Oe]=wt++;else if(o[Oe]<s[_e])return;return s(G.event?G.event(o):o)}}}function Mt(t,o,s,i,a,r,l,d,m,c){var h,u,g,f,E,S,P,_,T,R,L,A,p,v,C,k=o.type;if(o.constructor!==void 0)return null;128&s.__u&&(m=!!(32&s.__u),r=[d=o.__e=s.__e]),(h=G.__b)&&h(o);e:if(typeof k=="function")try{if(_=o.props,T=k.prototype&&k.prototype.render,R=(h=k.contextType)&&i[h.__c],L=h?R?R.props.value:h.__:i,s.__c?P=(u=o.__c=s.__c).__=u.__E:(T?o.__c=u=new k(_,L):(o.__c=u=new Ge(_,L),u.constructor=k,u.render=ns),R&&R.sub(u),u.state||(u.state={}),u.__n=i,g=u.__d=!0,u.__h=[],u._sb=[]),T&&u.__s==null&&(u.__s=u.state),T&&k.getDerivedStateFromProps!=null&&(u.__s==u.state&&(u.__s=me({},u.__s)),me(u.__s,k.getDerivedStateFromProps(_,u.__s))),f=u.props,E=u.state,u.__v=o,g)T&&k.getDerivedStateFromProps==null&&u.componentWillMount!=null&&u.componentWillMount(),T&&u.componentDidMount!=null&&u.__h.push(u.componentDidMount);else{if(T&&k.getDerivedStateFromProps==null&&_!==f&&u.componentWillReceiveProps!=null&&u.componentWillReceiveProps(_,L),o.__v==s.__v||!u.__e&&u.shouldComponentUpdate!=null&&u.shouldComponentUpdate(_,u.__s,L)===!1){o.__v!=s.__v&&(u.props=_,u.state=u.__s,u.__d=!1),o.__e=s.__e,o.__k=s.__k,o.__k.some(function(D){D&&(D.__=o)}),Ke.push.apply(u.__h,u._sb),u._sb=[],u.__h.length&&l.push(u);break e}u.componentWillUpdate!=null&&u.componentWillUpdate(_,u.__s,L),T&&u.componentDidUpdate!=null&&u.__h.push(function(){u.componentDidUpdate(f,E,S)})}if(u.context=L,u.props=_,u.__P=t,u.__e=!1,A=G.__r,p=0,T)u.state=u.__s,u.__d=!1,A&&A(o),h=u.render(u.props,u.state,u.context),Ke.push.apply(u.__h,u._sb),u._sb=[];else do u.__d=!1,A&&A(o),h=u.render(u.props,u.state,u.context),u.state=u.__s;while(u.__d&&++p<25);u.state=u.__s,u.getChildContext!=null&&(i=me(me({},i),u.getChildContext())),T&&!g&&u.getSnapshotBeforeUpdate!=null&&(S=u.getSnapshotBeforeUpdate(f,E)),v=h!=null&&h.type===q&&h.key==null?_o(h.props.children):h,d=So(t,ot(v)?v:[v],o,s,i,a,r,l,d,m,c),u.base=o.__e,o.__u&=-161,u.__h.length&&l.push(u),P&&(u.__E=u.__=null)}catch(D){if(o.__v=null,m||r!=null)if(D.then){for(o.__u|=m?160:128;d&&d.nodeType==8&&d.nextSibling;)d=d.nextSibling;r[r.indexOf(d)]=null,o.__e=d}else{for(C=r.length;C--;)St(r[C]);ft(o)}else o.__e=s.__e,o.__k=s.__k,D.then||ft(o);G.__e(D,o,s)}else r==null&&o.__v==s.__v?(o.__k=s.__k,o.__e=s.__e):d=o.__e=ss(s.__e,o,s,i,a,r,l,m,c);return(h=G.diffed)&&h(o),128&o.__u?void 0:d}function ft(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(ft))}function Co(t,o,s){for(var i=0;i<s.length;i++)Ct(s[i],s[++i],s[++i]);G.__c&&G.__c(o,t),t.some(function(a){try{t=a.__h,a.__h=[],t.some(function(r){r.call(a)})}catch(r){G.__e(r,a.__v)}})}function _o(t){return typeof t!="object"||t==null||t.__b>0?t:ot(t)?t.map(_o):me({},t)}function ss(t,o,s,i,a,r,l,d,m){var c,h,u,g,f,E,S,P=s.props||$e,_=o.props,T=o.type;if(T=="svg"?a="http://www.w3.org/2000/svg":T=="math"?a="http://www.w3.org/1998/Math/MathML":a||(a="http://www.w3.org/1999/xhtml"),r!=null){for(c=0;c<r.length;c++)if((f=r[c])&&"setAttribute"in f==!!T&&(T?f.localName==T:f.nodeType==3)){t=f,r[c]=null;break}}if(t==null){if(T==null)return document.createTextNode(_);t=document.createElementNS(a,T,_.is&&_),d&&(G.__m&&G.__m(o,r),d=!1),r=null}if(T==null)P===_||d&&t.data==_||(t.data=_);else{if(r=r&&tt.call(t.childNodes),!d&&r!=null)for(P={},c=0;c<t.attributes.length;c++)P[(f=t.attributes[c]).name]=f.value;for(c in P)f=P[c],c=="dangerouslySetInnerHTML"?u=f:c=="children"||c in _||c=="value"&&"defaultValue"in _||c=="checked"&&"defaultChecked"in _||Pe(t,c,null,f,a);for(c in _)f=_[c],c=="children"?g=f:c=="dangerouslySetInnerHTML"?h=f:c=="value"?E=f:c=="checked"?S=f:d&&typeof f!="function"||P[c]===f||Pe(t,c,f,P[c],a);if(h)d||u&&(h.__html==u.__html||h.__html==t.innerHTML)||(t.innerHTML=h.__html),o.__k=[];else if(u&&(t.innerHTML=""),So(o.type=="template"?t.content:t,ot(g)?g:[g],o,s,i,T=="foreignObject"?"http://www.w3.org/1999/xhtml":a,r,l,r?r[0]:s.__k&&ke(s,0),d,m),r!=null)for(c=r.length;c--;)St(r[c]);d||(c="value",T=="progress"&&E==null?t.removeAttribute("value"):E!=null&&(E!==t[c]||T=="progress"&&!E||T=="option"&&E!=P[c])&&Pe(t,c,E,P[c],a),c="checked",S!=null&&S!=t[c]&&Pe(t,c,S,P[c],a))}return t}function Ct(t,o,s){try{if(typeof t=="function"){var i=typeof t.__u=="function";i&&t.__u(),i&&o==null||(t.__u=t(o))}else t.current=o}catch(a){G.__e(a,s)}}function Ao(t,o,s){var i,a;if(G.unmount&&G.unmount(t),(i=t.ref)&&(i.current&&i.current!=t.__e||Ct(i,null,o)),(i=t.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(r){G.__e(r,o)}i.base=i.__P=null}if(i=t.__k)for(a=0;a<i.length;a++)i[a]&&Ao(i[a],o,s||typeof t.type!="function");s||St(t.__e),t.__c=t.__=t.__e=void 0}function ns(t,o,s){return this.constructor(t,s)}function as(t,o,s){var i,a,r,l;o==document&&(o=document.documentElement),G.__&&G.__(t,o),a=(i=!1)?null:o.__k,r=[],l=[],Mt(o,t=o.__k=Qo(q,null,[t]),a||$e,$e,o.namespaceURI,a?null:o.firstChild?tt.call(o.childNodes):null,r,a?a.__e:o.firstChild,i,l),Co(r,t,l)}tt=Ke.slice,G={__e:function(t,o,s,i){for(var a,r,l;o=o.__;)if((a=o.__c)&&!a.__)try{if((r=a.constructor)&&r.getDerivedStateFromError!=null&&(a.setState(r.getDerivedStateFromError(t)),l=a.__d),a.componentDidCatch!=null&&(a.componentDidCatch(t,i||{}),l=a.__d),l)return a.__E=a}catch(d){t=d}throw t}},vo=0,Ge.prototype.setState=function(t,o){var s;s=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=me({},this.state),typeof t=="function"&&(t=t(me({},s),this.props)),t&&me(s,t),t!=null&&this.__v&&(o&&this._sb.push(o),Dt(this))},Ge.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),Dt(this))},Ge.prototype.render=q,he=[],bo=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,ko=function(t,o){return t.__v.__b-o.__v.__b},Ye.__r=0,nt=Math.random().toString(8),Oe="__d"+nt,_e="__a"+nt,xo=/(PointerCapture)$|Capture$/i,wt=0,pt=Ht(!1),gt=Ht(!0);var is=0;function e(t,o,s,i,a,r){o||(o={});var l,d,m=o;if("ref"in m)for(d in m={},o)d=="ref"?l=o[d]:m[d]=o[d];var c={type:t,props:m,key:s,ref:l,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--is,__i:-1,__u:0,__source:a,__self:r};if(typeof t=="function"&&(l=t.defaultProps))for(d in l)m[d]===void 0&&(m[d]=l[d]);return G.vnode&&G.vnode(c),c}var Ae,Y,at,qt,Ee=0,Eo=[],Z=G,Bt=Z.__b,It=Z.__r,Ut=Z.diffed,Ot=Z.__c,Ft=Z.unmount,Gt=Z.__;function _t(t,o){Z.__h&&Z.__h(Y,t,Ee||o),Ee=0;var s=Y.__H||(Y.__H={__:[],__h:[]});return t>=s.__.length&&s.__.push({}),s.__[t]}function b(t){return Ee=1,rs(jo,t)}function rs(t,o,s){var i=_t(Ae++,2);if(i.t=t,!i.__c&&(i.__=[jo(void 0,o),function(d){var m=i.__N?i.__N[0]:i.__[0],c=i.t(m,d);m!==c&&(i.__N=[c,i.__[1]],i.__c.setState({}))}],i.__c=Y,!Y.__f)){var a=function(d,m,c){if(!i.__c.__H)return!0;var h=i.__c.__H.__.filter(function(g){return g.__c});if(h.every(function(g){return!g.__N}))return!r||r.call(this,d,m,c);var u=i.__c.props!==d;return h.some(function(g){if(g.__N){var f=g.__[0];g.__=g.__N,g.__N=void 0,f!==g.__[0]&&(u=!0)}}),r&&r.call(this,d,m,c)||u};Y.__f=!0;var r=Y.shouldComponentUpdate,l=Y.componentWillUpdate;Y.componentWillUpdate=function(d,m,c){if(this.__e){var h=r;r=void 0,a(d,m,c),r=h}l&&l.call(this,d,m,c)},Y.shouldComponentUpdate=a}return i.__N||i.__}function W(t,o){var s=_t(Ae++,3);!Z.__s&&To(s.__H,o)&&(s.__=t,s.u=o,Y.__H.__h.push(s))}function X(t){return Ee=5,K(function(){return{current:t}},[])}function K(t,o){var s=_t(Ae++,7);return To(s.__H,o)&&(s.__=t(),s.__H=o,s.__h=t),s.__}function le(t,o){return Ee=8,K(function(){return t},o)}function cs(){for(var t;t=Eo.shift();){var o=t.__H;if(t.__P&&o)try{o.__h.some(We),o.__h.some(yt),o.__h=[]}catch(s){o.__h=[],Z.__e(s,t.__v)}}}Z.__b=function(t){Y=null,Bt&&Bt(t)},Z.__=function(t,o){t&&o.__k&&o.__k.__m&&(t.__m=o.__k.__m),Gt&&Gt(t,o)},Z.__r=function(t){It&&It(t),Ae=0;var o=(Y=t.__c).__H;o&&(at===Y?(o.__h=[],Y.__h=[],o.__.some(function(s){s.__N&&(s.__=s.__N),s.u=s.__N=void 0})):(o.__h.some(We),o.__h.some(yt),o.__h=[],Ae=0)),at=Y},Z.diffed=function(t){Ut&&Ut(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(Eo.push(o)!==1&&qt===Z.requestAnimationFrame||((qt=Z.requestAnimationFrame)||ls)(cs)),o.__H.__.some(function(s){s.u&&(s.__H=s.u),s.u=void 0})),at=Y=null},Z.__c=function(t,o){o.some(function(s){try{s.__h.some(We),s.__h=s.__h.filter(function(i){return!i.__||yt(i)})}catch(i){o.some(function(a){a.__h&&(a.__h=[])}),o=[],Z.__e(i,s.__v)}}),Ot&&Ot(t,o)},Z.unmount=function(t){Ft&&Ft(t);var o,s=t.__c;s&&s.__H&&(s.__H.__.some(function(i){try{We(i)}catch(a){o=a}}),s.__H=void 0,o&&Z.__e(o,s.__v))};var Wt=typeof requestAnimationFrame=="function";function ls(t){var o,s=function(){clearTimeout(i),Wt&&cancelAnimationFrame(o),setTimeout(t)},i=setTimeout(s,35);Wt&&(o=requestAnimationFrame(s))}function We(t){var o=Y,s=t.__c;typeof s=="function"&&(t.__c=void 0,s()),Y=o}function yt(t){var o=Y;t.__c=t.__(),Y=o}function To(t,o){return!t||t.length!==o.length||o.some(function(s,i){return s!==t[i]})}function jo(t,o){return typeof o=="function"?o(t):o}const Ze={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","header.memory":"memory","tab.settings":"Settings","tab.home":"Home","tab.memories":"Memories","tab.project":"Project","memories.searchPlaceholder":"Filter as you type — press Enter for ranked search","memories.scopeLabel":"Scope","memories.scopeWork":"Work layer","memories.scopeEvidence":"Evidence","memories.scopeAll":"All","memories.scopeArchived":"Archived","memories.composition":"Composition","memories.rankedBy":"ranked by relevance","memories.backToList":"Back to list","memories.workEmpty":"No work-layer memories yet — goals, decisions, lessons and plans land here as they are captured.","memories.showAll":"Show all memories","memories.expand":"Show details","memories.collapse":"Hide details","memory.technicalDetails":"Technical details","memory.canonicalName":"Canonical name","memory.rawType":"Raw type","home.analyticsTitle":"Analytics","handoff.terminal":"Requires Terminal","handoff.terminalPrereq":"Run this on the machine where MeMesh is installed. The Dashboard will not run it for you.","handoff.copyCommand":"Copy command","handoff.commandCopied":"Command copied","handoff.github":"Opens GitHub — review the pre-filled issue before submitting","home.analyticsHint":"Health, timeline, patterns and usage — expands on demand","home.nextAction.eyebrow":"Recommended next step","home.nextAction.why":"Why:","home.nextAction.result":"Expected result:","home.nextAction.loading.title":"Checking what needs attention…","home.nextAction.loading.why":"MeMesh is reading the current library, search index and review queue.","home.nextAction.loading.result":"One recommendation will appear when those checks finish.","home.nextAction.empty.title":"Add your first memory","home.nextAction.empty.why":"The library is empty, so there is nothing to search or organize yet.","home.nextAction.empty.result":"The Memories page lets you load a removable demo or start capturing real work.","home.nextAction.empty.action":"Open Memories","insights.emptyPending":"There are no pending reviews yet. New memory reviews will appear here when available.","home.nextAction.insights.title":"Review memory organization suggestions","home.nextAction.insights.why":"MeMesh has suggestions waiting for your judgment.","home.nextAction.insights.result":"Reviewing them lets you accept useful summaries or reject unsuitable ones.","home.nextAction.insights.action":"Review suggestions","home.nextAction.healthy.title":"No action needed right now","home.nextAction.healthy.why":"The library, search index and review queue have no known action waiting.","home.nextAction.healthy.result":"Continue working; MeMesh will surface the next verified need here.","home.nextAction.unavailable.title":"Current recommendation is unavailable","home.nextAction.unavailable.why":"One of the status checks could not be read, so MeMesh will not guess.","home.nextAction.unavailable.result":"Reload to retry the checks without changing any memory or setting.","home.nextAction.unavailable.action":"Retry status checks","project.selectLabel":"Project","project.selectPrompt":"Pick a project to see its history.","project.empty":"No project memories yet. Work in a git repository with memesh hooks installed and its story will appear here.","project.taskState.title":"Where this project stands","project.taskState.goal":"Goal","project.taskState.next":"Next","project.taskState.blocked":"Blocked","project.taskState.done":"Done","project.taskState.updated":"Updated {when}","project.taskState.provenance":"Stated with `memesh task` — not inferred from memory counts.","project.taskState.empty":"No task state recorded for this project yet. Set one in a session with `memesh task --goal … --next …` and it appears here.","guard.sourceLesson":"Source lesson","guard.pattern":"Trigger pattern","guard.message":"Warning it will speak","guard.shouldMatch":"Must trigger on","guard.shouldNotMatch":"Must stay silent on","insights.title":"Memory organization suggestions","insights.reviewTitle":"Staged memory proposals","insights.reviewSubtitle":"work packages awaiting human review","insights.reviewSource":"Staged proposal — review before applying","insights.source.calendar":"Calendar digest","insights.source.transcript":"Claude Code transcript","insights.reviewBoundary":"The Dashboard reviews proposals that are already staged. It does not run or dispatch an agent.","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.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.rejectConfirm":"Reject this insight? This action cannot be undone.","insights.observations":"Summary observations","insights.tags":"Tags","insights.sourceIds":"Sources","insights.validationWarnings":"Legacy validation warnings","insights.validationClaim":"Claim","insights.validationReason":"Reason","banner.pendingInsights":"{n} new insight{s} waiting for your review →","banner.dismiss":"Dismiss","banner.viewAll":"View all","pattern.title":"Pattern","pattern.evidenceCount":"{n} evidence","pattern.severity":"Severity","pattern.severity.high":"high","pattern.severity.medium":"medium","pattern.severity.low":"low","pattern.description":"Pattern description","search.button":"Search","search.searching":"Searching…","search.results":"results","search.result":"result","search.noResults":"No results for","search.facts":"facts","browse.title":"All Memories","browse.active":"active","browse.archived":"archived","browse.refresh":"Refresh","browse.noMatch":"No memories matching","browse.prev":"← Prev","browse.next":"Next →","browse.archive":"Archive","browse.restore":"Restore","browse.confirmArchive":"Archive this memory?","browse.archiveFailed":"Could not archive memory: {message}","browse.restoreFailed":"Could not restore memory: {message}","analytics.totalMemories":"Total Memories","analytics.knowledgeFacts":"Knowledge Facts","analytics.connections":"Connections","analytics.topics":"Topics","analytics.insights":"Insights","analytics.thisWeek":"This week","analytics.new":"new","analytics.stale":"Stale (30+ days unused)","analytics.archivedLabel":"Archived","analytics.mostRecalled":"Most Recalled","health.title":"Memory Health","metrics.notMeasured":"Not measured yet","metrics.health":"Health","metrics.healthNote":"Activity, quality, freshness, lessons","metrics.critical":"Critical lessons","metrics.criticalPartial":"of {tagged} classified · {total} lessons total","metrics.criticalAll":"of {total} lessons, all classified","metrics.criticalUnclassified":"{total} lessons, none classified by severity yet","metrics.criticalNoLessons":"No lessons recorded yet","metrics.citation":"Citations","metrics.citationNote":"{cited} of {total} sessions cited a memory","metrics.citationNotMeasured":"Citation tracking starts after your next session","metrics.reused":"Reused this week","metrics.reusedNote":"Approximate — counted from last-access dates","health.excellent":"Excellent","health.good":"Good","health.fair":"Fair","health.poor":"Poor","health.activity":"Activity","health.quality":"Quality","health.freshness":"Freshness","health.lessons":"Self-Improvement","timeline.title":"Last 30 Days","timeline.created":"Created","timeline.recalled":"Recalled","value.totalRecalls":"Total Recalls","value.lessonsLearned":"Lessons Learned","value.lessonsSaved":"Lessons Applied","value.coverage":"Knowledge Coverage","cleanup.title":"Cleanup Suggestions","cleanup.allClean":"Your memory is clean. No stale or duplicate entities detected.","cleanup.staleLabel":"Low confidence / unused","cleanup.duplicateLabel":"Possible duplicates","cleanup.confidence":"confidence","cleanup.unused":"unused","cleanup.entityMeta":"{type} · {confidence}% confidence · {days}d unused","settings.saved":"Saved.","settings.configLoadFailed":"Could not read settings. Reload the page to try again.","settings.configReadbackFailed":"The server did not return the saved setting. Try again.","settings.language":"Language","settings.interfaceLanguage":"Interface language","settings.interfaceLanguageHint":"Changes this browser interface immediately.","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":"No newer release available","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":"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.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.updateRetryGuidance":"Check your connection and npm registry settings, then try again. Your installed version has not changed.","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.","settings.installationDetails":"Installation details","settings.installationDetailsUnavailable":"Version comparison is unavailable for this installation.","settings.interfacePath":"This interface","settings.terminalPath":"Terminal command","settings.technicalDetails":"Technical details","settings.installationDetailsHint":"Different installed versions do not necessarily need an update. Check Updates for published releases.","roadmap.resetView":"Reset view","lessons.error":"Error","lessons.rootCause":"Root Cause","lessons.fix":"Fix","lessons.prevention":"Prevention","feedback.button":"💬 Feedback","feedback.title":"Open feedback on GitHub","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…","feedback.popupBlocked":"GitHub did not open. Your draft is still here — allow popups, retry, or copy the prepared link.","feedback.retry":"Try opening GitHub again","feedback.copyLink":"Copy GitHub link","feedback.linkCopied":"Link copied","feedback.copyFailed":"The link could not be copied. Try opening GitHub again.","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","doctorBanner.fix":"Fix automatically","doctorBanner.fixInProgress":"Fixing…","doctorBanner.fixDone":"Fixed","doctorBanner.restartRequired":"Restart the agent to finish applying this update.","doctor.label.readme_locale_parity":"README translations","doctor.label.config":"Config file","doctor.label.mcp-config":"MCP connection file","doctor.label.hooks-config":"Hook definitions","doctor.label.hook-scripts":"Hook scripts","doctor.label.hook-wiring":"Connection to Claude Code","doctor.label.hook-activity":"Auto-capture","doctor.label.node-runtime":"Node.js version","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Plugin code is current","doctor.label.shell-cli":"Terminal command","doctor.label.dashboard":"Dashboard files","doctor.label.claude-channel":"Claude Channel registration","doctor.msg.claude-channel.unregistered.summary":"Live Claude Channel notifications are not enabled. MCP memory tools and durable inbox messaging can still work. This preview is optional.","doctor.msg.claude-channel.unregistered.fix":"To enable this optional channel, run `memesh agent setup claude`, then register the printed MCP command in your Claude user settings.","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.install-channel":"Install method","doctor.label.fts_segmentation":"Keyword 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 (.claude-plugin/mcp.json) is missing.","doctor.msg.mcp-config.missing.fix":"Reinstall MeMesh to restore it.","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/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":".claude-plugin/mcp.json no longer contains the memesh server entry.","doctor.msg.mcp-config.no-entry.fix":"Reinstall MeMesh to restore it.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` starts a file that is not in this install, so every memesh tool inside Claude Code fails to start.","doctor.msg.mcp-config.entry-missing.fix":"Reinstall MeMesh. If you edited `.claude-plugin/mcp.json` by hand, point it back at `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.mcp-config.placeholder-unresolved.summary":"NOT VERIFIED: `.claude-plugin/mcp.json` starts a path containing `${CLAUDE_PLUGIN_ROOT}`, which only the Claude Code plugin runtime fills in. This copy is not running as a plugin, so the file it names was not checked.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Check it the way the plugin runtime would: run `CLAUDE_PLUGIN_ROOT=<this install's folder> memesh doctor`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json is missing, so automatic memory capture cannot run.","doctor.msg.hooks-config.missing.fix":"Reinstall MeMesh to restore it.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json is damaged (not valid JSON).","doctor.msg.hooks-config.invalid-json.fix":"Fix {path} or reinstall MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json is missing these hook types: {types}. Some automatic capture will not run.","doctor.msg.hooks-config.missing-types.fix":"Restore the shipped hook configuration or reinstall MeMesh.","doctor.msg.hook-scripts.none.summary":"The hook configuration contains no scripts, so nothing can be captured automatically.","doctor.msg.hook-scripts.none.fix":"Reinstall MeMesh.","doctor.msg.hook-scripts.missing.summary":"These hook scripts are missing: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstall MeMesh to restore them.","doctor.msg.hook-scripts.not-executable.summary":"These hook scripts exist but are not allowed to run: {files}","doctor.msg.hook-scripts.not-executable.fix":"Run `chmod +x scripts/hooks/*.js`, or `npm run build` in a source checkout.","doctor.msg.hook-wiring.no-marker.summary":"memesh is not connected to Claude Code yet, so nothing gets remembered automatically.","doctor.msg.hook-wiring.no-marker.fix":"Run `memesh install-hooks` once, then `memesh doctor` to confirm.","doctor.msg.hook-wiring.script-missing.summary":"A wired memesh hook points at {path}, which no longer exists — the agent invokes a missing file on every matching event. Usually residue from an upgrade that retired the hook.","doctor.msg.hook-wiring.script-missing.fix":"Run `memesh install-hooks` to re-wire (it removes retired entries), then restart your agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"The connection record at {path} cannot be read.","doctor.msg.hook-wiring.marker-unreadable.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.marker-malformed.summary":"The connection record is damaged.","doctor.msg.hook-wiring.marker-malformed.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.settings-missing.summary":"The Claude Code settings file ({path}) is gone, so the connection is broken.","doctor.msg.hook-wiring.settings-missing.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} is damaged (not valid JSON).","doctor.msg.hook-wiring.settings-invalid.fix":"Restore it from a backup, or run `memesh install-hooks` to recreate it.","doctor.msg.hook-wiring.entries-removed.summary":"The memesh entries were removed from {path}, so the connection is broken.","doctor.msg.hook-wiring.entries-removed.fix":"Run `memesh install-hooks` again.","doctor.msg.hook-wiring.root-moved.summary":"The connection points at {path}, which no longer exists (memesh probably moved).","doctor.msg.hook-wiring.root-moved.fix":"Run `memesh install-hooks` to refresh it.","doctor.msg.hook-activity.never-ran.summary":"No capture hook has run in the {hours} hours since tracking began, even though hook wiring is in place — nothing is being remembered.","doctor.msg.hook-activity.never-ran.fix":"Finish one work session, then run `memesh doctor` again. If it still says no hook has run, run `memesh install-hooks` and restart your agent.","doctor.msg.hook-activity.stale.summary":"The last capture hook ran about {hours} hours ago ({hook}). If you have worked since then, capture has stopped and nothing from those sessions was saved.","doctor.msg.hook-activity.stale.fix":"Restart your agent, end one session, then run `memesh doctor` again. If it does not recover, run `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"The session-summary hook last ran about {hours} hours ago, and no Claude Code writes landed in the last 3 days either. If this machine has moved to another agent (Codex / Gemini), this is expected; if you still use Claude Code here, capture has stopped.","doctor.msg.hook-activity.stale-unconfirmed.fix":"If you still use Claude Code on this machine: restart it, end one session, and re-run `memesh doctor`. If it does not recover, run `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Could not read hook activity from the database: {detail}. Capture health is unknown, which is not the same as healthy.","doctor.msg.hook-activity.query-failed.fix":"Run `memesh doctor --verbose` for the full error, and check that ~/.memesh is readable and not out of disk.","doctor.msg.hook-activity.stale-unknown.summary":"The {hook} hook's last-run timestamp cannot be read (corrupt, or stamped by a machine with a wrong clock). Capture health is unknown, which is not the same as healthy.","doctor.msg.hook-activity.stale-unknown.fix":"End one work session, then run `memesh doctor` again — a fresh run overwrites the bad timestamp.","doctor.msg.hook-activity.disabled.summary":"Automatic capture is turned off (MEMESH_AUTO_CAPTURE or config autoCapture) — deliberately, so hook silence is expected. Re-enable it to resume capturing sessions.","doctor.msg.hook-activity.disabled-env.summary":"Automatic capture is turned off by MEMESH_AUTO_CAPTURE=false in this shell's environment. Doctor can only see its own environment — if your agent runs without this variable, capture there is unaffected.","doctor.msg.hook-activity.not-wired.summary":"No capture hook has ever run — and no capture hook (Stop / PostToolUse / PreCompact) is confirmed wired on this machine, so there is nothing to run.","doctor.msg.hook-activity.not-wired.fix":"If you want automatic capture, run `memesh install-hooks`. If this install is MCP-only (Codex / Gemini), this is expected and safe to ignore.","doctor.msg.hook-activity.stop-silent.summary":"The {hook} hook is stamping, but the session-summary hook has never run once in the {hours} hours since tracking began — session capture may be broken while commit capture hides it.","doctor.msg.hook-activity.stop-silent.fix":"End one work session and run `memesh doctor` again. If session-summary still has not run, run `memesh install-hooks` and restart your agent.","doctor.label.capture-liveness":"Capture liveness","doctor.msg.capture-liveness.silent-hook.summary":"{hook}: {runs} runs, 0 writes — '{reason}'. The hook is alive and deciding there is nothing to save every single time, which is also what a broken capture path looks like.","doctor.msg.capture-liveness.silent-hook.fix":"Run `memesh doctor --json` for the per-hook figures. If the reason does not describe your usage, run `memesh install-hooks` and restart your agent.","doctor.msg.capture-liveness.type-stopped.summary":"Nothing of type '{type}' was captured in the last 7 days, against {prev} in the 7 days before. Something that was being remembered has stopped being remembered.","doctor.msg.capture-liveness.type-stopped.fix":"Run `memesh doctor --json` for the per-hook figures, and check whether the way you work changed — if it did not, run `memesh install-hooks` and restart your agent.","doctor.msg.capture-liveness.never-ran.summary":"The {hook} hook has left no record and no heartbeat in the {hours} hours since tracking began — it has never run, so nothing it would capture is being saved.","doctor.msg.capture-liveness.never-ran.fix":"Run `memesh install-hooks` and restart your agent, then end one work session and re-run `memesh doctor`.","doctor.msg.capture-liveness.not-wired.summary":"The {hook} hook has never run, but no capture hook is wired on this machine.","doctor.msg.capture-liveness.not-wired.fix":"If you want automatic capture, run `memesh install-hooks`. If this is MCP-only (Codex, Gemini, or Cursor), this is expected.","doctor.msg.capture-liveness.never-ran-legacy.summary":"The {hook} hook has no outcome record, but {captured} auto-capture memories landed since tracking began. Older hooks are probably still running.","doctor.msg.capture-liveness.never-ran-legacy.fix":"Update the MeMesh hooks, then restart your agent and run `memesh doctor` again.","doctor.msg.capture-liveness.query-failed.summary":"Could not read capture liveness from the database: {detail}. Whether anything is being saved is unknown, which is not the same as healthy.","doctor.msg.capture-liveness.query-failed.fix":"The error is quoted above. Check that ~/.memesh is readable and that the disk is not full.","doctor.msg.hook-activity.never-ran-legacy.summary":"No hook has stamped the heartbeat, but {captured} auto-capture memories landed since tracking began — hooks from a version before heartbeat tracking are probably still running.","doctor.msg.hook-activity.never-ran-legacy.fix":"Update the memesh hooks to the current version (plugin installs: `/plugin update memesh`; npm installs: `memesh install-hooks`), then restart your agent.","doctor.msg.node-runtime.too-old.summary":"Your Node.js is older than this package supports. {detail}","doctor.msg.node-runtime.too-old.fix":"Upgrade Node.js to {required} or newer, then run `memesh doctor` again.","doctor.msg.native-binding.load-failed.summary":"SQLite could not open a database: {detail}.","doctor.msg.native-binding.load-failed.fix":"Check the Node runtime and reinstall MeMesh if necessary.","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` if you want a separate terminal command. Its database depends on its configuration.","doctor.msg.shell-cli.versions.summary":"Installed versions: this interface {current}; terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"The plugin was installed from commit {installed}, but the marketplace has moved to {marketplace} under the same version. {host} does not refresh a cache whose version did not change, so you are running older code than the marketplace has.","doctor.msg.plugin-cache.stale.fix":"Run `{command}` to refresh the cache, then restart {host}.","doctor.msg.plugin-cache.unverifiable.summary":"Could not tell whether the installed plugin matches the marketplace. The version alone cannot answer this — two builds can carry the same version.","doctor.msg.plugin-cache.unverifiable.fix":"Run `{command}` once; it records the commit, after which this check can answer.","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.config-parse.retired-settings.summary":"The valid config file at {path} still contains {count} retired top-level settings ({keys}). This version ignores them, but legacy provider credentials or settings may remain on disk.","doctor.msg.config-parse.retired-settings.fix":"Review {path} locally and remove only those retired top-level keys. Do not paste the file into an issue because it may contain credentials. Then run memesh doctor again.","doctor.msg.message-capability.probe-failed.summary":"The installed message capability probe failed: {detail}.","doctor.msg.message-router.socket-missing.summary":"No Local router socket exists at {path}; stopped or missing sessions will not be awakened.","doctor.msg.message-router.socket-insecure.summary":"The router socket at {path} is not an owner-private Unix socket.","doctor.msg.message-router.socket-unreachable.summary":"The owner-private router socket at {path} exists but did not accept a local connection.","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.citation.none.summary":"Sessions received injected memories and none cited one.","doctor.msg.citation.none.fix":"Check the citation contract at ~/.claude/rules/memesh-citations.md, then re-check after a few sessions.","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.workflow":"Workflow","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.auth.cross-origin":"This request came from another website, or reached the server under an unexpected name, so it was refused. Open the dashboard from the address `memesh serve` printed.","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.rate.limited":"Too many requests in a short time. Wait a moment and try again.","httpError.server.internal":"The server hit an unexpected error.","httpError.operation.permission-denied":"MeMesh cannot modify the files needed for this repair. Close this dashboard, run `memesh serve` in your own Terminal, and try again. If it still fails, run `memesh doctor`.","time.justNow":"Just now","time.hoursAgo":"{count}h ago","time.today":"Today","time.yesterday":"Yesterday","time.daysAgo":"{count}d ago","time.lastWeek":"Last week","time.weeksAgo":"{count}w ago","time.lastMonth":"Last month","time.monthsAgo":"{count}mo ago","memory.access.frequent":"Frequent · {count} recalls","memory.access.recalls":"{count} recalls","memory.access.never":"Never recalled","cluster.knowledge":"Knowledge","cluster.activity":"Activity","cluster.session":"Sessions","cluster.reference":"Reference","cluster.all":"All","browse.filterTime":"Time","browse.filterValue":"Value","browse.filterProject":"Project","browse.filterSort":"Sort","browse.timeToday":"Today","browse.timeWeek":"This week","browse.timeMonth":"This month","browse.timeOlder":"Older","browse.valueRecalled":"✓ Used","browse.valueNever":"Never recalled","browse.sortMostRecalled":"Most recalled","browse.sortRecent":"Recently used","browse.sortCreated":"Created","browse.emptyFilter":"No memories in this category — try a different filter","lessons.stepsLabel":"steps","lessons.commitsCount":"{count} commits","lessons.unstructured":"(No structured fields — see raw memory)","lessons.moreItems":"+{count} more","roadmap.title":"Project History","roadmap.summary":"{count} memories · {first} → {last}","roadmap.switchToList":"↩ List view","roadmap.switchToRoadmap":"🕘 History view","roadmap.emptyProject":"No memories in this project yet.","loop.label":"Memory loop","loop.subtitleHas":"knowledge memories reused in the past 7 days","loop.subtitleNone":"No knowledge memories reused this week — try recalling a lesson","loop.approxNote":"Approximation — full tracking starts after upgrade.","loop.sparkLabel":"Last 30 days","roadmap.milestones":"Milestones","roadmap.keyLessons":"Key lessons","radar.title":"Knowledge coverage radar","radar.caption":"Active knowledge memories (session and commit excluded)","radar.axis.lessons":"Lessons","radar.axis.decisions":"Decisions","radar.axis.patterns":"Patterns","radar.axis.bugs":"Bug fixes","radar.axis.processes":"Processes","radar.axis.architecture":"Architecture","ageMatrix.title":"Memory age distribution","ageMatrix.low":"Low","ageMatrix.high":"High","ageMatrix.legend":"colour depth = memory density","ageMatrix.typeColumn":"Type","header.signalModeOn":"Focused memories","header.signalModeOff":"All memories","header.signalModeOnHint":"Shows goals, decisions, lessons, and plans. Hides auto-captured session, commit, and activity records on Memories.","header.signalModeOffHint":"Shows every record, including auto-captured session, commit, and activity records on Memories.","globalFilter.focusedStatus":"Global view: Focused memories — auto-captured session, commit, and activity records are hidden on Memories.","globalFilter.allStatus":"Global view: All memories — auto-captured session, commit, and activity records are included on Memories.","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.coreHint":"Local memory: remember, FTS5 keyword recall, hooks, and Dashboard browsing work together.","onboarding.searchHint":"Recall uses local FTS5 keyword search.","onboarding.reviewHint":"An already-running agent can prepare a digest or visible-transcript work package; the Dashboard only reviews the staged proposal.","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.demoLoadedTitle":"Demo data is loaded","onboarding.demoLoadedBody":"{count} demo-tagged memories are present. You can remove only those memories here.","onboarding.resetConfirm":"Remove every memory tagged metadata.demo? The same rows cannot be restored, but you can load a fresh demo later. Real memories will be kept.","onboarding.resetReadbackFailed":"Reset could not be confirmed because demo-tagged memories are still present. The cleanup action remains available; try again or run memesh doctor.","onboarding.dismiss":"Dismiss","common.serverError":"The server reported an error (HTTP {status}). Try again — if it keeps happening, run `memesh doctor`.","emptyLibrary.title":"Your memory is empty","emptyLibrary.body":"Nothing is stored here yet. Load the 30-entry demo tour to see how MeMesh works — you can wipe it later with one click.","browse.truncated":"showing the first {shown} of {total} memories — use search or filters to reach the rest","browse.truncatedUnknownTotal":"showing the first {shown} memories — the total is unavailable, so there may be more","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":'On supported install channels, first use asks for consent once before updating. "Not now" snoozes that version (24h, then 48h, then 7 days); "Never ask again" turns checks off. Other channels show their own update action. After an upgrade, running hosts keep the old version until they restart. Env MEMESH_AUTO_UPDATE sets the allowed bump, but never bypasses consent.',"errors.timeout":"Request timed out","type.lesson_learned":"Lesson","type.lesson":"Lesson","type.mistake":"Mistake","type.decision":"Decision","type.goal":"Goal","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","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","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}","common.unknown":"unknown","insights.entitiesCount":"{n} entities","roadmap.viewToggle":"Project history view","roadmap.viewTree":"Tree","roadmap.viewMindmap":"Mindmap","roadmap.mindmapNeedsPhases":"The mindmap needs at least 3 memories within a 7-day window.","roadmap.activePhase":"active","roadmap.entryCount":"{count} entry","roadmap.entriesCount":"{count} entries","roadmap.otherGroup":"Other ({count})","roadmap.lowSignalHidden":"({count} low-signal hidden)","roadmap.resetHint":"Reset zoom and pan (double-clicking the background also resets)","roadmap.zoomHint":"scroll to zoom · drag to pan · {pct}%","roadmap.moreEntities":"+{count} more","roadmap.viewDecisions":"Decisions","roadmap.densityTitle":"Capture density by category","roadmap.densityNote":"what memesh captured — not everything that happened","roadmap.lineageSupersedes":"{n} superseded","roadmap.lineageConflicts":"{n} unresolved conflicts","adr.empty":'No decisions recorded for this project yet. Record one with type "decision" and it appears here with its history.',"adr.statusActive":"active","adr.statusSuperseded":"superseded","adr.supersedes":"supersedes","adr.supersededBy":"superseded by","nav.ariaLabel":"Dashboard sections","feedback.descLabel":"Feedback description","doctor.msg.capture-liveness.no-records.summary":"Hooks have run on this machine (last heartbeat {hours} hours ago), but not one has left an outcome record. Either the running hooks predate outcome tracking, or they fail as they load and record nothing.","doctor.msg.capture-liveness.no-records.fix":"Update the MeMesh hooks (plugin: `/plugin update memesh`; npm: `memesh install-hooks`), restart your agent, start one session, and run `memesh doctor` again.","project.index.title":"What is known here","project.index.empty":"Nothing in this project is injected automatically yet. Imported memories, memories marked untrusted, and anything saved without a `project:` tag are not counted here — the number on the project chip can be higher. Decisions, lessons, patterns and references saved with `remember` appear here.","project.index.more":'{n} more — `memesh recall --tag "project:…"`',"project.index.older":"{n} older (no change in {days} days) — recall to see them","project.index.cost":"The same index an agent receives at session start · ≈ {tokens} tokens ({bytes} bytes)"},"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":"筆記憶","header.memory":"筆記憶","insights.title":"記憶整理建議","insights.reviewTitle":"已暫存的記憶提案","insights.reviewSubtitle":"等待人工審閱的工作包","insights.reviewSource":"已暫存提案——套用前請先審閱","insights.source.calendar":"日曆摘要","insights.source.transcript":"Claude Code 對話記錄","insights.reviewBoundary":"儀表板只審閱已暫存的提案,不會執行或派送代理。","insights.statPending":"待審","insights.statApplied":"已採用","insights.statRejected":"已拒絕","insights.filter.pending":"待審","insights.filter.applied":"已採用","insights.filter.rejected":"已拒絕","insights.filter.all":"全部","insights.refresh":"重新整理","insights.loading":"讀取中…","insights.emptyOther":"沒有資料。","insights.sources":"來源","insights.status.pending":"待審","insights.status.applied":"已採用","insights.status.rejected":"已拒絕","insights.viewDetail":"查看詳情","insights.collapse":"收合","insights.accept":"採用","insights.applying":"套用中…","insights.reject":"拒絕","insights.rejectConfirm":"要拒絕這則洞察嗎?此操作無法復原。","insights.observations":"摘要觀察","insights.tags":"標籤","insights.sourceIds":"來源實體","insights.validationWarnings":"舊版驗證警告","insights.validationClaim":"陳述","insights.validationReason":"原因","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.settings":"設定","tab.home":"首頁","tab.memories":"記憶","tab.project":"專案","memories.searchPlaceholder":"輸入即時篩選 — 按 Enter 依相關度排序搜尋","memories.scopeLabel":"範圍","memories.scopeWork":"工作層","memories.scopeEvidence":"證據","memories.scopeAll":"全部","memories.scopeArchived":"已封存","memories.composition":"組成","memories.rankedBy":"依相關度排序","memories.backToList":"返回列表","memories.workEmpty":"還沒有工作層記憶 — 目標、決策、教訓與計畫被記錄後會出現在這裡。","memories.showAll":"顯示所有記憶","memories.expand":"顯示詳情","memories.collapse":"隱藏詳情","memory.technicalDetails":"技術詳情","memory.canonicalName":"標準名稱","memory.rawType":"原始類型","home.analyticsTitle":"分析","handoff.terminal":"需要使用終端機","handoff.terminalPrereq":"請在安裝 MeMesh 的電腦上執行;儀表板不會替你執行這個指令。","handoff.copyCommand":"複製指令","handoff.commandCopied":"已複製指令","handoff.github":"將開啟 GitHub — 送出前可先檢查已填內容","home.analyticsHint":"健康度、時間軸、模式與使用情況 — 需要時再展開","home.nextAction.eyebrow":"建議下一步","home.nextAction.why":"原因:","home.nextAction.result":"預期結果:","home.nextAction.loading.title":"正在確認目前最需要處理的事…","home.nextAction.loading.why":"MeMesh 正在讀取記憶庫、搜尋索引與待審清單的目前狀態。","home.nextAction.loading.result":"檢查完成後,這裡只會顯示一項建議。","home.nextAction.empty.title":"加入第一筆記憶","home.nextAction.empty.why":"記憶庫目前是空的,因此還沒有內容可搜尋或整理。","home.nextAction.empty.result":"前往「記憶」可載入能隨時移除的示範資料,或開始記錄真實工作。","home.nextAction.empty.action":"開啟記憶","insights.emptyPending":"目前沒有待審的整理結果。有新的記憶整理結果時,會顯示在這裡。","home.nextAction.insights.title":"審查記憶整理建議","home.nextAction.insights.why":"MeMesh 有等待你判斷的整理建議。","home.nextAction.insights.result":"你可以接受有用的摘要,或拒絕不合適的建議。","home.nextAction.insights.action":"審查建議","home.nextAction.healthy.title":"目前不需要採取動作","home.nextAction.healthy.why":"記憶庫、搜尋索引與待審清單目前都沒有已知待辦。","home.nextAction.healthy.result":"繼續工作即可;MeMesh 會在這裡顯示下一個經狀態確認的需求。","home.nextAction.unavailable.title":"目前無法提供建議","home.nextAction.unavailable.why":"有一項狀態檢查無法讀取,因此 MeMesh 不會猜測。","home.nextAction.unavailable.result":"重新載入可再次檢查,且不會變更任何記憶或設定。","home.nextAction.unavailable.action":"重試狀態檢查","project.selectLabel":"專案","project.selectPrompt":"選擇一個專案即可查看它的歷程。","project.empty":"還沒有專案記憶。在裝有 memesh hook 的 git 儲存庫中工作,它的故事就會出現在這裡。","project.taskState.title":"這個專案的現況","project.taskState.goal":"目標","project.taskState.next":"下一步","project.taskState.blocked":"卡住的地方","project.taskState.done":"已完成","project.taskState.updated":"更新於 {when}","project.taskState.provenance":"由 `memesh task` 明確寫入,不是從記憶數量推算出來的。","project.taskState.empty":"這個專案還沒有任務狀態。在工作 session 裡執行 `memesh task --goal … --next …` 設定,之後就會顯示在這裡。","guard.sourceLesson":"來源教訓","guard.pattern":"觸發樣式","guard.message":"將發出的警告","guard.shouldMatch":"必須觸發於","guard.shouldNotMatch":"必須靜默於","search.button":"搜尋","search.searching":"搜尋中…","search.results":"個結果","search.result":"個結果","search.noResults":"找不到符合的結果:","search.facts":"筆事實","browse.title":"所有記憶","browse.active":"使用中","browse.archived":"已封存","browse.refresh":"重新整理","browse.noMatch":"找不到符合的記憶:","browse.prev":"← 上一頁","browse.next":"下一頁 →","browse.archive":"封存","browse.restore":"還原","browse.confirmArchive":"確定要封存此記憶?","browse.archiveFailed":"封存失敗:{message}","browse.restoreFailed":"還原失敗:{message}","analytics.totalMemories":"記憶總數","analytics.knowledgeFacts":"知識事實","analytics.connections":"關聯","analytics.topics":"主題","analytics.insights":"洞察","analytics.thisWeek":"本週","analytics.new":"筆新增","analytics.stale":"閒置(30 天以上未使用)","analytics.archivedLabel":"已封存","analytics.mostRecalled":"最常查閱","health.title":"記憶健康度","metrics.notMeasured":"尚未量測","metrics.health":"健康度","metrics.healthNote":"活躍度、品質、新鮮度、教訓","metrics.critical":"嚴重教訓","metrics.criticalPartial":"在 {tagged} 筆已分類中 · 共 {total} 筆教訓","metrics.criticalAll":"共 {total} 筆教訓,全數已分類","metrics.criticalUnclassified":"{total} 筆教訓,尚未依嚴重度分類","metrics.criticalNoLessons":"尚未記錄任何教訓","metrics.citation":"引用率","metrics.citationNote":"{total} 次工作階段中有 {cited} 次引用了記憶","metrics.citationNotMeasured":"引用追蹤會在下次工作階段開始計算","metrics.reused":"本週被重用","metrics.reusedNote":"近似值——以最後存取時間推估","health.excellent":"優秀","health.good":"良好","health.fair":"普通","health.poor":"不佳","health.activity":"活躍度","health.quality":"品質","health.freshness":"新鮮度","health.lessons":"自我改善","timeline.title":"最近 30 天","timeline.created":"新增","timeline.recalled":"召回","value.totalRecalls":"總召回次數","value.lessonsLearned":"經驗教訓","value.lessonsSaved":"已應用教訓","value.coverage":"知識覆蓋率","cleanup.title":"清理建議","cleanup.allClean":"記憶庫很乾淨,沒有偵測到過時或重複的實體。","cleanup.staleLabel":"低信心度 / 未使用","cleanup.duplicateLabel":"可能重複","cleanup.confidence":"信心度","cleanup.unused":"未使用","cleanup.entityMeta":"{type} · 信心度 {confidence}% · 已閒置 {days} 天","settings.saved":"已儲存","settings.configLoadFailed":"無法讀取設定。請重新載入頁面再試一次。","settings.configReadbackFailed":"伺服器未回傳已儲存的設定,請再試一次。","settings.language":"語言","settings.interfaceLanguage":"介面語言","settings.interfaceLanguageHint":"立即變更這個瀏覽器中的介面語言。","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":"本次無法確認停用狀態 — 待網路恢復後請重新檢查。","settings.updatePartialSummary":"部分檢查 — 停用狀態未確認","settings.updateDeprecatedTargetUnknown":"已停用 — 升級目標查詢中","settings.currentVersion":"目前版本","settings.latestVersion":"最新版本","settings.lastAttempted":"上次嘗試檢查","settings.lastSuccessful":"上次成功檢查","settings.updateSourceFresh":"即時檢查","settings.updateSourceCached":"使用快取結果","settings.updateSourceStale":"使用過期快取結果","settings.updateSourceUnavailable":"沒有可用快取","settings.updateCommand":"更新指令","settings.checkNow":"立即檢查","settings.updateLastError":"上次檢查錯誤:{message}","settings.updateRetryGuidance":"請檢查網路連線與 npm 套件來源設定,然後重試。已安裝的版本沒有變更。","settings.installMethod":"安裝方式","settings.installNpmGlobal":"npm 全域安裝","settings.installNpmLocal":"專案內套件安裝","settings.installSourceCheckout":"原始碼工作目錄","settings.installUnknown":"未知","settings.updateGuidanceNpmGlobal":"這個安裝可直接透過 MeMesh 更新。","settings.updateGuidanceNpmLocal":"請用安裝此套件的專案套件管理工具來更新。","settings.updateGuidanceSourceCheckout":"請從原始碼儲存庫更新這份工作目錄並重新建置。","settings.updateGuidanceUnknown":"請使用安裝 MeMesh 時的工具或工作流程來更新這個安裝。","settings.installationDetails":"安裝詳情","settings.installationDetailsUnavailable":"此安裝無法比較版本。","settings.interfacePath":"此介面","settings.terminalPath":"終端機指令","settings.technicalDetails":"技術詳情","settings.installationDetailsHint":"不同的已安裝版本不一定需要更新。請到「更新」查看已發佈版本。","roadmap.resetView":"重設視圖","lessons.error":"錯誤","lessons.rootCause":"根本原因","lessons.fix":"修復方式","lessons.prevention":"預防措施","feedback.button":"💬 意見回饋","feedback.title":"在 GitHub 開啟意見回饋","feedback.bug":"錯誤","feedback.feature":"功能建議","feedback.question":"問題","feedback.placeholder":"描述你的意見回饋…","feedback.includeSys":"附帶系統資訊","feedback.submit":"開啟 GitHub Issue","feedback.submitting":"收集診斷資訊中…","feedback.popupBlocked":"GitHub 未開啟。草稿仍完整保留;請允許彈出式視窗、重試或複製已準備的連結。","feedback.retry":"再次嘗試開啟 GitHub","feedback.copyLink":"複製 GitHub 連結","feedback.linkCopied":"已複製連結","feedback.copyFailed":"無法複製連結,請再次嘗試開啟 GitHub。","doctorBanner.warnTitleSoft":"memesh 有幾條設定提醒","doctorBanner.failTitle":"memesh 設定不完整","doctorBanner.dismiss":"關閉","doctorBanner.getHelp":"取得協助","doctorBanner.helpHint":"會開啟一個已填好診斷資訊的 GitHub issue","doctorBanner.preambleForIssue":"memesh doctor 在我的安裝上回報以下狀況:","doctorBanner.moreCount":"…還有 {n} 條——執行 `memesh doctor` 看完整清單","doctorBanner.fix":"自動修復","doctorBanner.fixInProgress":"修復中…","doctorBanner.fixDone":"已修復","doctorBanner.restartRequired":"請重新啟動代理,完成這次更新。","doctor.label.readme_locale_parity":"README 翻譯同步","doctor.label.config":"設定檔","doctor.label.mcp-config":"MCP 連線設定檔","doctor.label.hooks-config":"Hook 定義檔","doctor.label.hook-scripts":"Hook 腳本","doctor.label.hook-wiring":"與 Claude Code 的連接","doctor.label.hook-activity":"自動記錄","doctor.label.node-runtime":"Node.js 版本","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"外掛程式碼是否最新","doctor.label.shell-cli":"終端機指令","doctor.label.dashboard":"儀表板檔案","doctor.label.claude-channel":"Claude Channel 註冊","doctor.msg.claude-channel.unregistered.summary":"Claude Channel 即時通知尚未啟用。MCP 記憶工具與收件匣訊息保存功能仍可運作。此預覽功能為選用。","doctor.msg.claude-channel.unregistered.fix":"若要啟用此選用頻道,請執行 `memesh agent setup claude`,然後在 Claude 使用者設定中註冊指令輸出所顯示的 MCP 項目。","doctor.label.update-status":"版本更新","doctor.label.http-probe":"本機伺服器","doctor.label.skills-manifest":"內附檔案","doctor.label.config_parse":"設定檔","doctor.label.install-channel":"安裝方式","doctor.label.fts_segmentation":"關鍵字索引","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 的檔案(.claude-plugin/mcp.json)不見了。","doctor.msg.mcp-config.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/mcp.json 壞掉了(不是有效的 JSON),Claude Code 讀不到它。","doctor.msg.mcp-config.invalid-json.fix":"修好 {path},或重新安裝 MeMesh。","doctor.msg.mcp-config.no-entry.summary":".claude-plugin/mcp.json 裡的 memesh 伺服器設定不見了。","doctor.msg.mcp-config.no-entry.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` 要啟動的檔案不在這份安裝裡,所以 Claude Code 裡的每個 memesh 工具都起不來。","doctor.msg.mcp-config.entry-missing.fix":"重新安裝 MeMesh。如果你手動改過 `.claude-plugin/mcp.json`,把它指回 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`。","doctor.msg.mcp-config.placeholder-unresolved.summary":"尚未驗證:`.claude-plugin/mcp.json` 要啟動的路徑含有 `${CLAUDE_PLUGIN_ROOT}`,而這個變數只有 Claude Code 的外掛執行環境會代入。這份安裝不是以外掛方式在跑,所以它指向的檔案沒有被檢查。","doctor.msg.mcp-config.placeholder-unresolved.fix":"用外掛執行環境的方式檢查:執行 `CLAUDE_PLUGIN_ROOT=<這份安裝的資料夾> memesh doctor`。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json 不見了,自動記憶功能跑不起來。","doctor.msg.hooks-config.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json 壞掉了(不是有效的 JSON)。","doctor.msg.hooks-config.invalid-json.fix":"修好 {path},或重新安裝 MeMesh。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json 少了這些 hook 類型:{types}。部分自動記錄不會執行。","doctor.msg.hooks-config.missing-types.fix":"還原出廠的 hook 設定,或重新安裝 MeMesh。","doctor.msg.hook-scripts.none.summary":"Hook 設定裡沒有任何腳本,什麼都不會被自動記錄。","doctor.msg.hook-scripts.none.fix":"重新安裝 MeMesh。","doctor.msg.hook-scripts.missing.summary":"這些 hook 腳本不見了:{files}","doctor.msg.hook-scripts.missing.fix":"重新安裝 MeMesh 即可還原。","doctor.msg.hook-scripts.not-executable.summary":"這些 hook 腳本存在但沒有執行權限:{files}","doctor.msg.hook-scripts.not-executable.fix":"執行 `chmod +x scripts/hooks/*.js`;原始碼安裝則跑 `npm run build`。","doctor.msg.hook-wiring.no-marker.summary":"memesh 還沒接上 Claude Code,所以不會自動記住任何東西。","doctor.msg.hook-wiring.no-marker.fix":"執行一次 `memesh install-hooks` 完成連接,再用 `memesh doctor` 確認。","doctor.msg.hook-wiring.script-missing.summary":"已接線的 memesh hook 指向 {path},但這個檔案已不存在——agent 每次觸發對應事件都會呼叫一個不存在的檔案。通常是升級移除某個 hook 後留下的殘留。","doctor.msg.hook-wiring.script-missing.fix":"執行 `memesh install-hooks` 重新接線(它會移除已退役的項目),然後重啟你的 agent。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} 的連接紀錄讀不到。","doctor.msg.hook-wiring.marker-unreadable.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.marker-malformed.summary":"連接紀錄壞掉了。","doctor.msg.hook-wiring.marker-malformed.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 的設定檔({path})不見了,連接已中斷。","doctor.msg.hook-wiring.settings-missing.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} 壞掉了(不是有效的 JSON)。","doctor.msg.hook-wiring.settings-invalid.fix":"從備份還原,或用 `memesh install-hooks` 重建。","doctor.msg.hook-wiring.entries-removed.summary":"{path} 裡的 memesh 設定被移除了,連接已中斷。","doctor.msg.hook-wiring.entries-removed.fix":"再執行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.root-moved.summary":"連接指向的 {path} 已經不存在(memesh 可能被搬走了)。","doctor.msg.hook-wiring.root-moved.fix":"執行 `memesh install-hooks` 更新路徑。","doctor.msg.hook-activity.never-ran.summary":"從開始追蹤到現在 {hours} 小時,沒有任何擷取 hook 跑過——而 hook 接線是好的,代表它們該跑卻沒跑,沒有任何東西被記下來。","doctor.msg.hook-activity.never-ran.fix":"完整用一次工作階段,再跑 `memesh doctor`。如果還是說沒有 hook 跑過,執行 `memesh install-hooks` 然後重啟 agent。","doctor.msg.hook-activity.stale.summary":"最後一次擷取 hook 是大約 {hours} 小時前跑的({hook})。如果你這段時間有在工作,代表擷取已經停了,那些工作階段的內容都沒被存下來。","doctor.msg.hook-activity.stale.fix":"重啟 agent,結束一次工作階段,再跑 `memesh doctor`。如果沒恢復,執行 `memesh install-hooks`。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary hook 上次執行大約在 {hours} 小時前,而且過去 3 天也沒有任何 Claude Code 的寫入。如果這台機器已改用其他 agent(Codex / Gemini),這是正常的;如果你在這裡仍使用 Claude Code,擷取已經停了。","doctor.msg.hook-activity.stale-unconfirmed.fix":"如果這台機器仍在使用 Claude Code:重啟它、結束一個 session,再執行一次 `memesh doctor`。若仍未恢復,執行 `memesh install-hooks`。","doctor.msg.hook-activity.query-failed.summary":"讀不到 hook 活動紀錄:{detail}。擷取狀態現在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.query-failed.fix":"用 `memesh doctor --verbose` 看完整錯誤,並確認 ~/.memesh 讀得到、磁碟沒滿。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} hook 的最後執行時間讀不出來(資料壞了,或是被時鐘不準的機器蓋的章)。擷取狀態現在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.stale-unknown.fix":"結束一次工作階段後再跑 `memesh doctor`——新的一次執行會把壞掉的時間蓋掉。","doctor.msg.hook-activity.disabled.summary":"自動擷取已關閉(MEMESH_AUTO_CAPTURE 或設定檔的 autoCapture)——這是刻意設定,hook 沒動靜是預期中的。想恢復擷取就把它打開。","doctor.msg.hook-activity.disabled-env.summary":"自動擷取被這個 shell 環境中的 MEMESH_AUTO_CAPTURE=false 關閉了。doctor 只能看到自己所在的環境——如果你的 agent 執行時沒有這個變數,那邊的擷取不受影響。","doctor.msg.hook-activity.not-wired.summary":"從來沒有任何擷取 hook 執行過——而且這台機器上沒有確認接好任何擷取 hook(Stop / PostToolUse / PreCompact),所以本來就沒有東西可以執行。","doctor.msg.hook-activity.not-wired.fix":"想要自動擷取就執行 `memesh install-hooks`。如果這個安裝只走 MCP(Codex / Gemini),這是正常狀態,可以放心忽略。","doctor.msg.hook-activity.stop-silent.summary":"{hook} hook 有在蓋章,但從開始追蹤到現在 {hours} 小時,session-summary hook 一次都沒跑過——session 擷取可能壞了,只是被 commit 擷取蓋住看不見。","doctor.msg.hook-activity.stop-silent.fix":"完整結束一次工作階段再跑 `memesh doctor`。如果 session-summary 還是沒跑過,執行 `memesh install-hooks` 然後重啟 agent。","doctor.label.capture-liveness":"記錄是否還在寫","doctor.msg.capture-liveness.silent-hook.summary":"{hook}:跑了 {runs} 次,一次都沒寫入 —— 原因是「{reason}」。這個 hook 還活著,但每一次都判斷沒東西好存;捕捉管線壞掉時看起來也是這樣。","doctor.msg.capture-liveness.silent-hook.fix":"跑 `memesh doctor --json` 看每個 hook 的數字。如果那個原因跟你的用法對不上,執行 `memesh install-hooks` 然後重啟 agent。","doctor.msg.capture-liveness.type-stopped.summary":"最近 7 天沒有存下任何「{type}」,而前 7 天有 {prev} 筆。本來會被記住的東西,現在不再被記住了。","doctor.msg.capture-liveness.type-stopped.fix":"跑 `memesh doctor --json` 看每個 hook 的數字,並確認你的工作方式有沒有改變;如果沒有,執行 `memesh install-hooks` 然後重啟 agent。","doctor.msg.capture-liveness.never-ran.summary":"從開始追蹤到現在的 {hours} 小時裡,{hook} hook 既沒有留下記錄也沒有心跳 —— 它從來沒跑過,所以它該捕捉的東西全都沒有存下來。","doctor.msg.capture-liveness.never-ran.fix":"執行 `memesh install-hooks` 並重啟 agent,然後完整結束一次工作階段,再跑一次 `memesh doctor`。","doctor.msg.capture-liveness.not-wired.summary":"{hook} hook 從未執行,但這台機器沒有接上任何捕捉 hook。","doctor.msg.capture-liveness.not-wired.fix":"如果你要自動捕捉,請執行 `memesh install-hooks`。如果這是純 MCP(Codex、Gemini 或 Cursor),這是正常的。","doctor.msg.capture-liveness.never-ran-legacy.summary":"{hook} hook 沒有結果記錄,但追蹤開始後已有 {captured} 筆自動捕捉記憶落地。可能仍在執行舊版 hook。","doctor.msg.capture-liveness.never-ran-legacy.fix":"更新 MeMesh hooks,重啟 agent,然後再次執行 `memesh doctor`。","doctor.msg.capture-liveness.query-failed.summary":"無法從資料庫讀取捕捉狀態:{detail}。現在不知道有沒有東西被存下來,而「不知道」不等於「正常」。","doctor.msg.capture-liveness.query-failed.fix":"錯誤訊息如上。請確認 ~/.memesh 可以讀取,而且磁碟沒有滿。","doctor.msg.hook-activity.never-ran-legacy.summary":"沒有任何 hook 蓋過心跳章,但追蹤開始以來已存入 {captured} 筆自動擷取的記憶——很可能是心跳追蹤之前版本的 hook 還在執行。","doctor.msg.hook-activity.never-ran-legacy.fix":"把 memesh hooks 更新到目前版本(plugin 安裝:`/plugin update memesh`;npm 安裝:`memesh install-hooks`),然後重啟 agent。","doctor.msg.node-runtime.too-old.summary":"你的 Node.js 版本比這個套件支援的還舊。{detail}","doctor.msg.node-runtime.too-old.fix":"把 Node.js 升級到 {required} 以上,再執行 `memesh doctor`。","doctor.msg.native-binding.load-failed.summary":"SQLite 無法開啟資料庫:{detail}。","doctor.msg.native-binding.load-failed.fix":"請檢查 Node 執行環境,必要時重新安裝 MeMesh。","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.shell-cli.versions.summary":"已安裝版本:此介面 {current};終端機 {terminal}。","doctor.msg.plugin-cache.stale.summary":"外掛是從 commit {installed} 安裝的,但 marketplace 已在同一版號下前進到 {marketplace}。版號沒變時 {host} 不會更新快取,所以你跑的程式碼比 marketplace 上的舊。","doctor.msg.plugin-cache.stale.fix":"執行 `{command}` 更新快取,然後重新啟動 {host}。","doctor.msg.plugin-cache.unverifiable.summary":"無法判斷安裝的外掛是否與 marketplace 一致。光看版號不夠——兩個不同的建置可以有同一個版號。","doctor.msg.plugin-cache.unverifiable.fix":"執行一次 `{command}`,它會記下 commit,之後這項檢查就能判斷。","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.config-parse.retired-settings.summary":"{path} 是有效的設定檔,但仍含有 {count} 個已停用的頂層設定({keys})。此版本會忽略它們,但舊版服務供應商憑證或設定可能仍留在磁碟上。","doctor.msg.config-parse.retired-settings.fix":"請在本機檢查 {path},只移除這些已停用的頂層鍵。檔案可能含有憑證,請勿貼到 issue。完成後再次執行 memesh doctor。","doctor.msg.message-capability.probe-failed.summary":"已安裝的訊息能力探測失敗:{detail}。","doctor.msg.message-router.socket-missing.summary":"{path} 沒有 Local router socket;不會喚醒已停止或不存在的 session。","doctor.msg.message-router.socket-insecure.summary":"{path} 的 router socket 不是僅限擁有者使用的 Unix socket。","doctor.msg.message-router.socket-unreachable.summary":"{path} 的私有 router socket 存在,但未接受本機連線。","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.citation.none.summary":"有 session 收到注入的記憶,但沒有任何一筆被引用。","doctor.msg.citation.none.fix":"檢查 ~/.claude/rules/memesh-citations.md 的引用約定,過幾個 session 後再看一次。","doctor.msg.database.broken.summary":"資料庫無法使用:{detail}","doctor.update_status.prerelease":"正在使用預發布版本({current}),npm 最新版為 {latest}","patterns.title":"你的模式","patterns.workSchedule":"工作時程","patterns.peakHours":"尖峰時段","patterns.busiestDays":"最忙碌的日子","patterns.workflow":"工作流程","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.auth.cross-origin":"這個請求來自別的網站,或是用了非預期的網址到達伺服器,所以被拒絕了。請用 `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.rate.limited":"短時間內送出太多請求。請稍候片刻再試一次。","httpError.server.internal":"伺服器發生預期外的錯誤。","httpError.operation.permission-denied":"MeMesh 沒有權限修改這次修復需要的檔案。請關閉此儀表板,在你自己的終端機執行 `memesh serve`,再重試。若仍失敗,請執行 `memesh doctor`。","time.justNow":"剛剛","time.hoursAgo":"{count} 小時前","time.today":"今天","time.yesterday":"昨天","time.daysAgo":"{count} 天前","time.lastWeek":"上週","time.weeksAgo":"{count} 週前","time.lastMonth":"上個月","time.monthsAgo":"{count} 個月前","memory.access.frequent":"常用 · {count} 次","memory.access.recalls":"{count} 次回憶","memory.access.never":"從未回憶","cluster.knowledge":"知識","cluster.activity":"活動","cluster.session":"工作記錄","cluster.reference":"參考","cluster.all":"全部","browse.filterTime":"時間","browse.filterValue":"價值","browse.filterProject":"專案","browse.filterSort":"排序","browse.timeToday":"今天","browse.timeWeek":"本週","browse.timeMonth":"本月","browse.timeOlder":"更早","browse.valueRecalled":"✓ 用過","browse.valueNever":"從未回憶","browse.sortMostRecalled":"最常回憶","browse.sortRecent":"最近使用","browse.sortCreated":"建立時間","browse.emptyFilter":"此分類沒有記憶 — 試試切換類別或時間","lessons.stepsLabel":"步驟","lessons.commitsCount":"{count} 個 commit","lessons.unstructured":"(此教訓沒有結構化欄位,請查看原始記憶)","lessons.moreItems":"+{count} 條","roadmap.title":"專案歷程","roadmap.summary":"{count} 筆記憶 · {first} → {last}","roadmap.switchToList":"↩ 清單檢視","roadmap.switchToRoadmap":"🕘 歷程檢視","roadmap.emptyProject":"此專案尚無記憶。","loop.label":"記憶循環","loop.subtitleHas":"本週被回憶的知識類型記憶","loop.subtitleNone":"本週尚無知識被回憶 — 試試喚起一則教訓","loop.approxNote":"近似值 — 完整追蹤從升級後開始累積","loop.sparkLabel":"最近 30 天","roadmap.milestones":"里程碑","roadmap.keyLessons":"重要教訓","radar.title":"知識覆蓋雷達","radar.caption":"顯示有效知識記憶 (排除 session 和 commit)","radar.axis.lessons":"教訓","radar.axis.decisions":"決策","radar.axis.patterns":"模式","radar.axis.bugs":"問題修復","radar.axis.processes":"流程","radar.axis.architecture":"架構","ageMatrix.title":"記憶年齡分佈","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"顏色深度 = 記憶密度","ageMatrix.typeColumn":"類型","header.signalModeOn":"重點記憶","header.signalModeOff":"所有記憶","header.signalModeOnHint":"顯示目標、決策、教訓與計畫;在記憶隱藏自動擷取的 session、commit 與活動紀錄。","header.signalModeOffHint":"在記憶顯示所有紀錄,包含自動擷取的 session、commit 與活動紀錄。","globalFilter.focusedStatus":"全域顯示:重點記憶 — 記憶已隱藏自動擷取的 session、commit 與活動紀錄。","globalFilter.allStatus":"全域顯示:所有記憶 — 記憶會包含自動擷取的 session、commit 與活動紀錄。","roadmap.phases":"階段","onboarding.title":"歡迎使用 MeMesh","onboarding.body":"你的記憶庫還是空的。從 30 筆精選範例開始體驗,或直接存下你的第一則教訓。","onboarding.coreHint":"本機記憶:remember、FTS5 關鍵字回憶、hooks 與儀表板瀏覽能協同運作。","onboarding.searchHint":"回憶使用本機 FTS5 關鍵字搜尋。","onboarding.reviewHint":"已在執行中的代理可準備摘要或可見對話記錄工作包;儀表板只審閱暫存提案。","onboarding.seedButton":"一鍵載入示範資料","onboarding.seedingButton":"載入中…","onboarding.seedHint":"直接在這裡載入 30 筆,之後可一鍵清除,不用切到終端機","onboarding.cliReference":"習慣 CLI?","onboarding.hintDemo":"植入 30 筆示範記憶,之後可一鍵清除","onboarding.hintReset":"移除所有 metadata.demo 標記的記憶","onboarding.resetButton":"清除示範資料","onboarding.resettingButton":"清除中…","onboarding.demoLoadedTitle":"已載入示範資料","onboarding.demoLoadedBody":"目前有 {count} 筆標記為 demo 的記憶;可在這裡只移除這些記憶。","onboarding.resetConfirm":"確定移除所有 metadata.demo 標記的記憶?無法還原相同資料列,但之後可重新載入示範資料;你的真實記憶會保留。","onboarding.resetReadbackFailed":"無法確認重設完成,因為仍有 demo 標記的記憶。清理按鈕會保留;請重試或執行 memesh doctor。","onboarding.dismiss":"關閉","common.serverError":"伺服器回報錯誤(HTTP {status})。請再試一次;若持續發生,請執行 `memesh doctor`。","emptyLibrary.title":"你的記憶庫是空的","emptyLibrary.body":"這裡還沒有任何記憶。載入 30 筆示範資料,馬上看到 MeMesh 的完整功能——之後可一鍵清除。","browse.truncated":"目前顯示前 {shown} 筆(共 {total} 筆)——用搜尋或篩選找到其餘的記憶","browse.truncatedUnknownTotal":"目前顯示前 {shown} 筆——讀不到總數,可能還有更多","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":"在支援的安裝管道,首次使用時會先詢問一次同意再更新。回「稍後」會暫緩該版本(24 小時,再拒絕改 48 小時,之後 7 天);回「不要再問」會關閉檢查。其他管道會顯示對應的更新方式。升級後,正在執行的 host 要重啟才會換成新版。MEMESH_AUTO_UPDATE 只設定允許的升級幅度,不會繞過同意。","errors.timeout":"請求逾時","type.lesson_learned":"教訓","type.lesson":"教訓","type.mistake":"錯誤","type.decision":"決策","type.goal":"目標","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":"人物","patterns.day.0":"週日","patterns.day.1":"週一","patterns.day.2":"週二","patterns.day.3":"週三","patterns.day.4":"週四","patterns.day.5":"週五","patterns.day.6":"週六","lessons.severity.critical":"嚴重","lessons.severity.major":"重大","lessons.severity.minor":"輕微","memory.tooltip.project":"專案","memory.tooltip.recalled":"已被回憶 {count} 次","memory.tooltip.hasRelations":"與 {count} 筆記憶相連","memory.tooltip.createdAt":"建立於 {date}","common.unknown":"未知","insights.entitiesCount":"{n} 筆實體","roadmap.viewToggle":"專案歷程檢視","roadmap.viewTree":"樹狀","roadmap.viewMindmap":"心智圖","roadmap.mindmapNeedsPhases":"心智圖需要 7 天內至少 3 筆記憶。","roadmap.activePhase":"進行中","roadmap.entryCount":"{count} 筆","roadmap.entriesCount":"{count} 筆","roadmap.otherGroup":"其他({count})","roadmap.lowSignalHidden":"(已隱藏 {count} 筆低訊號)","roadmap.resetHint":"重設縮放與位置(雙擊背景也可重設)","roadmap.zoomHint":"滾輪縮放 · 拖曳平移 · {pct}%","roadmap.moreEntities":"還有 {count} 筆","roadmap.viewDecisions":"決策","roadmap.densityTitle":"依類別的捕捉密度","roadmap.densityNote":"這是 memesh 捕捉到的,不等於發生過的一切","roadmap.lineageSupersedes":"{n} 筆已被取代","roadmap.lineageConflicts":"{n} 筆衝突未解","adr.empty":"這個專案還沒有記錄任何決策。用類型「decision」記下一筆,它就會帶著自己的歷史出現在這裡。","adr.statusActive":"現行","adr.statusSuperseded":"已被取代","adr.supersedes":"取代","adr.supersededBy":"被取代","nav.ariaLabel":"儀表板分頁","feedback.descLabel":"意見內容","doctor.msg.capture-liveness.no-records.summary":"這台機器上的 hook 有在跑(最後一次心跳是 {hours} 小時前),但沒有任何一個留下結果記錄。可能是正在跑的 hook 版本太舊、還不會記錄結果,或是 hook 一載入就出錯,什麼都沒記下來。","doctor.msg.capture-liveness.no-records.fix":"更新 MeMesh hook(plugin 安裝:`/plugin update memesh`;npm 安裝:`memesh install-hooks`),重新啟動 agent,開始一個工作階段後再執行一次 `memesh doctor`。","project.index.title":"這裡已經知道的事","project.index.empty":"這個專案目前還沒有任何記憶會被自動注入。匯入的記憶、標記為不可信的記憶,以及沒有 `project:` 標籤的記憶都不算在這裡 — 上面專案標籤上的數字可能比較大。用 `remember` 存下的決策、教訓、模式和參考資料會出現在這裡。","project.index.more":'還有 {n} 筆 — `memesh recall --tag "project:…"`',"project.index.older":"{n} 筆較舊({days} 天沒有變動)— 用 recall 查看","project.index.cost":"和 agent 在 session 開始時收到的索引相同 · 約 {tokens} tokens({bytes} bytes)"},"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":"条记忆","header.memory":"条记忆","insights.title":"记忆整理建议","insights.reviewTitle":"已暂存的记忆提案","insights.reviewSubtitle":"等待人工审核的工作包","insights.reviewSource":"已暂存提案——应用前请先审核","insights.source.calendar":"日历摘要","insights.source.transcript":"Claude Code 对话记录","insights.reviewBoundary":"仪表板只审核已暂存的提案,不会运行或派发代理。","insights.statPending":"待审","insights.statApplied":"已采用","insights.statRejected":"已拒绝","insights.filter.pending":"待审","insights.filter.applied":"已采用","insights.filter.rejected":"已拒绝","insights.filter.all":"全部","insights.refresh":"刷新","insights.loading":"读取中…","insights.emptyOther":"没有数据。","insights.sources":"来源","insights.status.pending":"待审","insights.status.applied":"已采用","insights.status.rejected":"已拒绝","insights.viewDetail":"查看详情","insights.collapse":"收起","insights.accept":"采用","insights.applying":"应用中…","insights.reject":"拒绝","insights.rejectConfirm":"要拒绝这条洞察吗?此操作无法撤销。","insights.observations":"摘要观察","insights.tags":"标签","insights.sourceIds":"来源实体","insights.validationWarnings":"旧版验证警告","insights.validationClaim":"陈述","insights.validationReason":"原因","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.settings":"设置","tab.home":"首页","tab.memories":"记忆","tab.project":"项目","memories.searchPlaceholder":"输入即时筛选 — 按 Enter 进行相关度排序搜索","memories.scopeLabel":"范围","memories.scopeWork":"工作层","memories.scopeEvidence":"证据","memories.scopeAll":"全部","memories.scopeArchived":"已归档","memories.composition":"构成","memories.rankedBy":"按相关度排序","memories.backToList":"返回列表","memories.workEmpty":"还没有工作层记忆 — 目标、决策、教训和计划被记录后会出现在这里。","memories.showAll":"显示所有记忆","memories.expand":"显示详情","memories.collapse":"隐藏详情","memory.technicalDetails":"技术详情","memory.canonicalName":"标准名称","memory.rawType":"原始类型","home.analyticsTitle":"分析","handoff.terminal":"需要使用终端","handoff.terminalPrereq":"请在安装 MeMesh 的电脑上运行;仪表板不会替你执行该命令。","handoff.copyCommand":"复制命令","handoff.commandCopied":"命令已复制","handoff.github":"将打开 GitHub — 提交前请检查预填内容","home.analyticsHint":"健康度、时间线、模式与使用情况 — 需要时再展开","home.nextAction.eyebrow":"建议下一步","home.nextAction.why":"原因:","home.nextAction.result":"预期结果:","home.nextAction.loading.title":"正在确认目前最需要处理的事项…","home.nextAction.loading.why":"MeMesh 正在读取记忆库、搜索索引和待审核列表的当前状态。","home.nextAction.loading.result":"检查完成后,此处只会显示一项建议。","home.nextAction.empty.title":"添加第一条记忆","home.nextAction.empty.why":"记忆库目前为空,因此还没有内容可供搜索或整理。","home.nextAction.empty.result":"前往“记忆”可加载随时能移除的演示数据,或开始记录真实工作。","home.nextAction.empty.action":"打开记忆","insights.emptyPending":"目前没有待审的整理结果。有新的记忆整理结果时,会显示在这里。","home.nextAction.insights.title":"审核记忆整理建议","home.nextAction.insights.why":"MeMesh 有等待你判断的整理建议。","home.nextAction.insights.result":"你可以接受有用的摘要,或拒绝不合适的建议。","home.nextAction.insights.action":"审核建议","home.nextAction.healthy.title":"目前无需操作","home.nextAction.healthy.why":"记忆库、搜索索引和待审核列表目前都没有已知待办。","home.nextAction.healthy.result":"继续工作即可;MeMesh 会在此显示下一个经状态确认的需求。","home.nextAction.unavailable.title":"目前无法提供建议","home.nextAction.unavailable.why":"有一项状态检查无法读取,因此 MeMesh 不会猜测。","home.nextAction.unavailable.result":"重新加载可再次检查,且不会更改任何记忆或设置。","home.nextAction.unavailable.action":"重试状态检查","project.selectLabel":"项目","project.selectPrompt":"选择一个项目即可查看它的历程。","project.empty":"还没有项目记忆。在装有 memesh hook 的 git 仓库中工作,它的故事就会出现在这里。","project.taskState.title":"这个项目的现况","project.taskState.goal":"目标","project.taskState.next":"下一步","project.taskState.blocked":"卡住的地方","project.taskState.done":"已完成","project.taskState.updated":"更新于 {when}","project.taskState.provenance":"由 `memesh task` 明确写入,不是从记忆数量推算出来的。","project.taskState.empty":"这个项目还没有任务状态。在工作 session 里执行 `memesh task --goal … --next …` 设置,之后就会显示在这里。","guard.sourceLesson":"来源教训","guard.pattern":"触发模式","guard.message":"将发出的警告","guard.shouldMatch":"必须触发于","guard.shouldNotMatch":"必须静默于","search.button":"搜索","search.searching":"搜索中…","search.results":"个结果","search.result":"个结果","search.noResults":"没有找到结果:","search.facts":"条事实","browse.title":"所有记忆","browse.active":"活跃","browse.archived":"已归档","browse.refresh":"刷新","browse.noMatch":"没有匹配的记忆:","browse.prev":"← 上一页","browse.next":"下一页 →","browse.archive":"归档","browse.restore":"恢复","browse.confirmArchive":"确定要归档此记忆?","browse.archiveFailed":"归档失败:{message}","browse.restoreFailed":"恢复失败:{message}","analytics.totalMemories":"记忆总数","analytics.knowledgeFacts":"知识事实","analytics.connections":"关联","analytics.topics":"主题","analytics.insights":"洞察","analytics.thisWeek":"本周","analytics.new":"条新增","analytics.stale":"闲置(30 天以上未使用)","analytics.archivedLabel":"已归档","analytics.mostRecalled":"最常查阅","health.title":"记忆健康度","metrics.notMeasured":"尚未测量","metrics.health":"健康度","metrics.healthNote":"活跃度、质量、新鲜度、教训","metrics.critical":"严重教训","metrics.criticalPartial":"在 {tagged} 条已分类中 · 共 {total} 条教训","metrics.criticalAll":"共 {total} 条教训,全部已分类","metrics.criticalUnclassified":"{total} 条教训,尚未按严重度分类","metrics.criticalNoLessons":"尚未记录任何教训","metrics.citation":"引用率","metrics.citationNote":"{total} 次会话中有 {cited} 次引用了记忆","metrics.citationNotMeasured":"引用追踪将从下次会话开始计算","metrics.reused":"本周被重用","metrics.reusedNote":"近似值——以最后访问时间推估","health.excellent":"优秀","health.good":"良好","health.fair":"一般","health.poor":"较差","health.activity":"活跃度","health.quality":"质量","health.freshness":"新鲜度","health.lessons":"自我改善","timeline.title":"最近 30 天","timeline.created":"新增","timeline.recalled":"召回","value.totalRecalls":"总召回次数","value.lessonsLearned":"经验教训","value.lessonsSaved":"已应用教训","value.coverage":"知识覆盖率","cleanup.title":"清理建议","cleanup.allClean":"记忆库很干净,没有检测到过时或重复的实体。","cleanup.staleLabel":"低置信度 / 未使用","cleanup.duplicateLabel":"可能重复","cleanup.confidence":"置信度","cleanup.unused":"未使用","cleanup.entityMeta":"{type} · 置信度 {confidence}% · 已闲置 {days} 天","settings.saved":"已保存","settings.configLoadFailed":"无法读取设置。请重新加载页面再试一次。","settings.configReadbackFailed":"服务器未返回已保存的设置,请重试。","settings.language":"语言","settings.interfaceLanguage":"界面语言","settings.interfaceLanguageHint":"立即更改此浏览器中的界面语言。","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":"本次无法确认停用状态 — 待网络恢复后请重新检查。","settings.updatePartialSummary":"部分检查 — 停用状态未确认","settings.updateDeprecatedTargetUnknown":"已停用 — 升级目标查询中","settings.currentVersion":"当前版本","settings.latestVersion":"最新版本","settings.lastAttempted":"上次尝试检查","settings.lastSuccessful":"上次成功检查","settings.updateSourceFresh":"实时检查","settings.updateSourceCached":"使用缓存结果","settings.updateSourceStale":"使用过期缓存结果","settings.updateSourceUnavailable":"没有可用缓存","settings.updateCommand":"更新命令","settings.checkNow":"立即检查","settings.updateLastError":"上次检查错误:{message}","settings.updateRetryGuidance":"请检查网络连接与 npm 软件包源设置,然后重试。已安装的版本没有更改。","settings.installMethod":"安装方式","settings.installNpmGlobal":"npm 全局安装","settings.installNpmLocal":"项目内包安装","settings.installSourceCheckout":"源码工作目录","settings.installUnknown":"未知","settings.updateGuidanceNpmGlobal":"这个安装可以直接通过 MeMesh 更新。","settings.updateGuidanceNpmLocal":"请使用安装此包的项目包管理器来更新。","settings.updateGuidanceSourceCheckout":"请从源码仓库更新这份工作目录并重新构建。","settings.updateGuidanceUnknown":"请使用安装 MeMesh 时所用的工具或流程来更新这个安装。","settings.installationDetails":"安装详情","settings.installationDetailsUnavailable":"此安装无法比较版本。","settings.interfacePath":"此界面","settings.terminalPath":"终端命令","settings.technicalDetails":"技术详情","settings.installationDetailsHint":"不同的已安装版本不一定需要更新。请到“更新”查看已发布版本。","roadmap.resetView":"重置视图","lessons.error":"错误","lessons.rootCause":"根本原因","lessons.fix":"修复方式","lessons.prevention":"预防措施","feedback.button":"💬 反馈","feedback.title":"在 GitHub 打开反馈","feedback.bug":"错误","feedback.feature":"功能建议","feedback.question":"问题","feedback.placeholder":"描述你的反馈…","feedback.includeSys":"附带系统信息","feedback.submit":"打开 GitHub Issue","feedback.submitting":"收集诊断信息中…","feedback.popupBlocked":"GitHub 未打开。草稿仍完整保留;请允许弹出窗口、重试或复制已准备的链接。","feedback.retry":"再次尝试打开 GitHub","feedback.copyLink":"复制 GitHub 链接","feedback.linkCopied":"链接已复制","feedback.copyFailed":"无法复制链接,请再次尝试打开 GitHub。","doctorBanner.warnTitleSoft":"memesh 有几条设置提醒","doctorBanner.failTitle":"memesh 设置不完整","doctorBanner.dismiss":"关闭","doctorBanner.getHelp":"获取帮助","doctorBanner.helpHint":"会打开一个已填好诊断信息的 GitHub issue","doctorBanner.preambleForIssue":"memesh doctor 在我的安装上报告以下情况:","doctorBanner.moreCount":"…还有 {n} 条——运行 `memesh doctor` 看完整清单","doctorBanner.fix":"自动修复","doctorBanner.fixInProgress":"修复中…","doctorBanner.fixDone":"已修复","doctorBanner.restartRequired":"请重新启动代理,完成这次更新。","doctor.label.readme_locale_parity":"README 翻译同步","doctor.label.config":"配置文件","doctor.label.mcp-config":"MCP 连接配置文件","doctor.label.hooks-config":"Hook 定义文件","doctor.label.hook-scripts":"Hook 脚本","doctor.label.hook-wiring":"与 Claude Code 的连接","doctor.label.hook-activity":"自动记录","doctor.label.node-runtime":"Node.js 版本","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"插件代码是否最新","doctor.label.shell-cli":"终端命令","doctor.label.dashboard":"仪表板文件","doctor.label.claude-channel":"Claude 频道注册","doctor.msg.claude-channel.unregistered.summary":"实时的 Claude 频道通知尚未启用。MCP 记忆工具和持久收件箱消息仍然可以工作。此预览是可选的。","doctor.msg.claude-channel.unregistered.fix":"要启用此可选频道,请运行 `memesh agent setup claude`,然后在您的 Claude 用户设置中注册输出中显示的 MCP 命令。","doctor.label.update-status":"版本更新","doctor.label.http-probe":"本机服务器","doctor.label.skills-manifest":"内附文件","doctor.label.config_parse":"配置文件","doctor.label.install-channel":"安装方式","doctor.label.fts_segmentation":"关键字索引","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 的文件(.claude-plugin/mcp.json)不见了。","doctor.msg.mcp-config.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/mcp.json 已损坏(不是有效的 JSON),Claude Code 读不到它。","doctor.msg.mcp-config.invalid-json.fix":"修好 {path},或重新安装 MeMesh。","doctor.msg.mcp-config.no-entry.summary":".claude-plugin/mcp.json 里的 memesh 服务器配置不见了。","doctor.msg.mcp-config.no-entry.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` 要启动的文件不在这份安装里,所以 Claude Code 里的每个 memesh 工具都起不来。","doctor.msg.mcp-config.entry-missing.fix":"重新安装 MeMesh。如果你手动改过 `.claude-plugin/mcp.json`,把它指回 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`。","doctor.msg.mcp-config.placeholder-unresolved.summary":"尚未验证:`.claude-plugin/mcp.json` 要启动的路径含有 `${CLAUDE_PLUGIN_ROOT}`,而这个变量只有 Claude Code 的插件运行环境会替换。这份安装不是以插件方式运行的,所以它指向的文件没有被检查。","doctor.msg.mcp-config.placeholder-unresolved.fix":"用插件运行环境的方式检查:运行 `CLAUDE_PLUGIN_ROOT=<这份安装的目录> memesh doctor`。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json 不见了,自动记忆功能无法运行。","doctor.msg.hooks-config.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json 已损坏(不是有效的 JSON)。","doctor.msg.hooks-config.invalid-json.fix":"修好 {path},或重新安装 MeMesh。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json 少了这些 hook 类型:{types}。部分自动记录不会运行。","doctor.msg.hooks-config.missing-types.fix":"恢复出厂的 hook 配置,或重新安装 MeMesh。","doctor.msg.hook-scripts.none.summary":"Hook 配置里没有任何脚本,什么都不会被自动记录。","doctor.msg.hook-scripts.none.fix":"重新安装 MeMesh。","doctor.msg.hook-scripts.missing.summary":"这些 hook 脚本不见了:{files}","doctor.msg.hook-scripts.missing.fix":"重新安装 MeMesh 即可恢复。","doctor.msg.hook-scripts.not-executable.summary":"这些 hook 脚本存在但没有执行权限:{files}","doctor.msg.hook-scripts.not-executable.fix":"运行 `chmod +x scripts/hooks/*.js`;源码安装则跑 `npm run build`。","doctor.msg.hook-wiring.no-marker.summary":"memesh 还没接入 Claude Code,所以不会自动记住任何东西。","doctor.msg.hook-wiring.no-marker.fix":"运行一次 `memesh install-hooks` 完成连接,再用 `memesh doctor` 确认。","doctor.msg.hook-wiring.script-missing.summary":"已接线的 memesh hook 指向 {path},但这个文件已不存在——agent 每次触发对应事件都会调用一个不存在的文件。通常是升级移除某个 hook 后留下的残留。","doctor.msg.hook-wiring.script-missing.fix":"运行 `memesh install-hooks` 重新接线(它会移除已退役的条目),然后重启你的 agent。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} 的连接记录读不到。","doctor.msg.hook-wiring.marker-unreadable.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.marker-malformed.summary":"连接记录已损坏。","doctor.msg.hook-wiring.marker-malformed.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 的设置文件({path})不见了,连接已中断。","doctor.msg.hook-wiring.settings-missing.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} 已损坏(不是有效的 JSON)。","doctor.msg.hook-wiring.settings-invalid.fix":"从备份恢复,或用 `memesh install-hooks` 重建。","doctor.msg.hook-wiring.entries-removed.summary":"{path} 里的 memesh 配置被移除了,连接已中断。","doctor.msg.hook-wiring.entries-removed.fix":"再运行一次 `memesh install-hooks`。","doctor.msg.hook-wiring.root-moved.summary":"连接指向的 {path} 已不存在(memesh 可能被移动了)。","doctor.msg.hook-wiring.root-moved.fix":"运行 `memesh install-hooks` 更新路径。","doctor.msg.hook-activity.never-ran.summary":"从开始追踪到现在 {hours} 小时,没有任何抓取 hook 跑过——而 hook 接线是好的,代表它们该跑却没跑,没有任何东西被记下来。","doctor.msg.hook-activity.never-ran.fix":"完整用一次工作会话,再跑 `memesh doctor`。如果还是说没有 hook 跑过,执行 `memesh install-hooks` 然后重启 agent。","doctor.msg.hook-activity.stale.summary":"最后一次抓取 hook 是大约 {hours} 小时前跑的({hook})。如果你这段时间有在工作,代表抓取已经停了,那些会话的内容都没被存下来。","doctor.msg.hook-activity.stale.fix":"重启 agent,结束一次工作会话,再跑 `memesh doctor`。如果没恢复,执行 `memesh install-hooks`。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary hook 上次运行大约在 {hours} 小时前,而且过去 3 天也没有任何 Claude Code 的写入。如果这台机器已改用其他 agent(Codex / Gemini),这是正常的;如果你在这里仍使用 Claude Code,捕获已经停了。","doctor.msg.hook-activity.stale-unconfirmed.fix":"如果这台机器仍在使用 Claude Code:重启它、结束一个 session,再运行一次 `memesh doctor`。若仍未恢复,运行 `memesh install-hooks`。","doctor.msg.hook-activity.query-failed.summary":"读不到 hook 活动记录:{detail}。抓取状态现在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.query-failed.fix":"用 `memesh doctor --verbose` 看完整错误,并确认 ~/.memesh 读得到、磁盘没满。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} hook 的最后执行时间读不出来(数据坏了,或是被时钟不准的机器盖的章)。抓取状态现在是「不知道」,那跟「正常」不是同一件事。","doctor.msg.hook-activity.stale-unknown.fix":"结束一次工作会话后再跑 `memesh doctor`——新的一次执行会把坏掉的时间盖掉。","doctor.msg.hook-activity.disabled.summary":"自动抓取已关闭(MEMESH_AUTO_CAPTURE 或配置文件的 autoCapture)——这是刻意设置,hook 没动静是预期中的。想恢复抓取就把它打开。","doctor.msg.hook-activity.disabled-env.summary":"自动捕获被这个 shell 环境中的 MEMESH_AUTO_CAPTURE=false 关闭了。doctor 只能看到自己所在的环境——如果你的 agent 运行时没有这个变量,那边的捕获不受影响。","doctor.msg.hook-activity.not-wired.summary":"从来没有任何捕获 hook 运行过——而且这台机器上没有确认接好任何捕获 hook(Stop / PostToolUse / PreCompact),所以本来就没有东西可以运行。","doctor.msg.hook-activity.not-wired.fix":"想要自动抓取就执行 `memesh install-hooks`。如果这个安装只走 MCP(Codex / Gemini),这是正常状态,可以放心忽略。","doctor.msg.hook-activity.stop-silent.summary":"{hook} hook 有在盖章,但从开始追踪到现在 {hours} 小时,session-summary hook 一次都没跑过——session 抓取可能坏了,只是被 commit 抓取盖住看不见。","doctor.msg.hook-activity.stop-silent.fix":"完整结束一次工作会话再跑 `memesh doctor`。如果 session-summary 还是没跑过,执行 `memesh install-hooks` 然后重启 agent。","doctor.label.capture-liveness":"记录是否还在写","doctor.msg.capture-liveness.silent-hook.summary":"{hook}:跑了 {runs} 次,一次都没写入 —— 原因是“{reason}”。这个 hook 还活着,但每一次都判断没东西可存;捕捉管线坏掉时看起来也是这样。","doctor.msg.capture-liveness.silent-hook.fix":"跑 `memesh doctor --json` 看每个 hook 的数字。如果那个原因跟你的用法对不上,执行 `memesh install-hooks` 然后重启 agent。","doctor.msg.capture-liveness.type-stopped.summary":"最近 7 天没有存下任何“{type}”,而前 7 天有 {prev} 条。本来会被记住的东西,现在不再被记住了。","doctor.msg.capture-liveness.type-stopped.fix":"跑 `memesh doctor --json` 看每个 hook 的数字,并确认你的工作方式有没有改变;如果没有,执行 `memesh install-hooks` 然后重启 agent。","doctor.msg.capture-liveness.never-ran.summary":"从开始追踪到现在的 {hours} 小时里,{hook} hook 既没有留下记录也没有心跳 —— 它从来没跑过,所以它该捕捉的东西全都没有存下来。","doctor.msg.capture-liveness.never-ran.fix":"执行 `memesh install-hooks` 并重启 agent,然后完整结束一次工作会话,再跑一次 `memesh doctor`。","doctor.msg.capture-liveness.not-wired.summary":"{hook} hook 从未运行,但这台机器没有接入任何捕捉 hook。","doctor.msg.capture-liveness.not-wired.fix":"如果你要自动捕捉,请执行 `memesh install-hooks`。如果这是纯 MCP(Codex、Gemini 或 Cursor),这是正常的。","doctor.msg.capture-liveness.never-ran-legacy.summary":"{hook} hook 没有结果记录,但追踪开始后已有 {captured} 条自动捕捉记忆落地。可能仍在运行旧版 hook。","doctor.msg.capture-liveness.never-ran-legacy.fix":"更新 MeMesh hooks,重启 agent,然后再次执行 `memesh doctor`。","doctor.msg.capture-liveness.query-failed.summary":"无法从数据库读取捕捉状态:{detail}。现在不知道有没有东西被存下来,而“不知道”不等于“正常”。","doctor.msg.capture-liveness.query-failed.fix":"错误信息如上。请确认 ~/.memesh 可以读取,而且磁盘没有满。","doctor.msg.hook-activity.never-ran-legacy.summary":"没有任何 hook 盖过心跳章,但追踪开始以来已存入 {captured} 条自动捕获的记忆——很可能是心跳追踪之前版本的 hook 还在运行。","doctor.msg.hook-activity.never-ran-legacy.fix":"把 memesh hooks 更新到当前版本(plugin 安装:`/plugin update memesh`;npm 安装:`memesh install-hooks`),然后重启 agent。","doctor.msg.node-runtime.too-old.summary":"你的 Node.js 版本比这个包支持的还旧。{detail}","doctor.msg.node-runtime.too-old.fix":"把 Node.js 升级到 {required} 以上,再运行 `memesh doctor`。","doctor.msg.native-binding.load-failed.summary":"SQLite 无法打开数据库:{detail}。","doctor.msg.native-binding.load-failed.fix":"请检查 Node 运行环境,必要时重新安装 MeMesh。","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.shell-cli.versions.summary":"已安装版本:此界面 {current};终端 {terminal}。","doctor.msg.plugin-cache.stale.summary":"插件是从 commit {installed} 安装的,但 marketplace 已在同一版本号下前进到 {marketplace}。版本号没变时 {host} 不会刷新缓存,所以你运行的代码比 marketplace 上的旧。","doctor.msg.plugin-cache.stale.fix":"运行 `{command}` 刷新缓存,然后重启 {host}。","doctor.msg.plugin-cache.unverifiable.summary":"无法判断已安装的插件是否与 marketplace 一致。只看版本号不够——两个不同的构建可以有同一个版本号。","doctor.msg.plugin-cache.unverifiable.fix":"运行一次 `{command}`,它会记录 commit,之后这项检查就能判断。","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.config-parse.retired-settings.summary":"{path} 是有效的配置文件,但仍包含 {count} 个已停用的顶层设置({keys})。此版本会忽略它们,但旧版服务提供商凭据或设置可能仍留在磁盘上。","doctor.msg.config-parse.retired-settings.fix":"请在本地检查 {path},只删除这些已停用的顶层键。文件可能包含凭据,请勿粘贴到 issue。完成后再次运行 memesh doctor。","doctor.msg.message-capability.probe-failed.summary":"已安装的消息能力探测失败:{detail}。","doctor.msg.message-router.socket-missing.summary":"{path} 没有 Local router socket;不会唤醒已停止或不存在的 session。","doctor.msg.message-router.socket-insecure.summary":"{path} 的 router socket 不是仅限所有者使用的 Unix socket。","doctor.msg.message-router.socket-unreachable.summary":"{path} 的私有 router socket 存在,但未接受本地连接。","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.citation.none.summary":"有 session 收到注入的记忆,但没有任何一笔被引用。","doctor.msg.citation.none.fix":"检查 ~/.claude/rules/memesh-citations.md 的引用约定,过几个 session 后再看一次。","doctor.msg.database.broken.summary":"数据库无法使用:{detail}","doctor.update_status.prerelease":"正在运行预发布版本({current}),npm 最新版为 {latest}","patterns.title":"你的模式","patterns.workSchedule":"工作时程","patterns.peakHours":"高峰时段","patterns.busiestDays":"最忙碌的日子","patterns.workflow":"工作流程","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.auth.cross-origin":"这个请求来自别的网站,或者用了非预期的网址到达服务器,所以被拒绝了。请用 `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.rate.limited":"短时间内发送的请求过多。请稍候片刻再试一次。","httpError.server.internal":"服务器发生意外错误。","httpError.operation.permission-denied":"MeMesh 没有权限修改这次修复所需的文件。请关闭此仪表板,在你自己的终端中运行 `memesh serve`,然后重试。如果仍然失败,请运行 `memesh doctor`。","time.justNow":"刚刚","time.hoursAgo":"{count} 小时前","time.today":"今天","time.yesterday":"昨天","time.daysAgo":"{count} 天前","time.lastWeek":"上周","time.weeksAgo":"{count} 周前","time.lastMonth":"上个月","time.monthsAgo":"{count} 个月前","memory.access.frequent":"常用 · {count} 次","memory.access.recalls":"{count} 次回忆","memory.access.never":"从未回忆","cluster.knowledge":"知识","cluster.activity":"活动","cluster.session":"工作记录","cluster.reference":"参考","cluster.all":"全部","browse.filterTime":"时间","browse.filterValue":"价值","browse.filterProject":"项目","browse.filterSort":"排序","browse.timeToday":"今天","browse.timeWeek":"本周","browse.timeMonth":"本月","browse.timeOlder":"更早","browse.valueRecalled":"✓ 用过","browse.valueNever":"从未回忆","browse.sortMostRecalled":"最常回忆","browse.sortRecent":"最近使用","browse.sortCreated":"创建时间","browse.emptyFilter":"此分类没有记忆 — 试试切换类别或时间","lessons.stepsLabel":"步骤","lessons.commitsCount":"{count} 个 commit","lessons.unstructured":"(此教训没有结构化字段,请查看原始记忆)","lessons.moreItems":"+{count} 条","roadmap.title":"项目历程","roadmap.summary":"{count} 条记忆 · {first} → {last}","roadmap.switchToList":"↩ 列表视图","roadmap.switchToRoadmap":"🕘 历程视图","roadmap.emptyProject":"此项目尚无记忆。","loop.label":"记忆循环","loop.subtitleHas":"本周被回忆的知识类型记忆","loop.subtitleNone":"本周尚无知识被回忆 — 试试唤起一则教训","loop.approxNote":"近似值 — 完整追踪从升级后开始累积","loop.sparkLabel":"最近 30 天","roadmap.milestones":"里程碑","roadmap.keyLessons":"重要教训","radar.title":"知识覆盖雷达","radar.caption":"显示有效知识记忆 (排除 session 和 commit)","radar.axis.lessons":"教训","radar.axis.decisions":"决策","radar.axis.patterns":"模式","radar.axis.bugs":"问题修复","radar.axis.processes":"流程","radar.axis.architecture":"架构","ageMatrix.title":"记忆年龄分布","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"颜色深度 = 记忆密度","ageMatrix.typeColumn":"类型","header.signalModeOn":"重点记忆","header.signalModeOff":"所有记忆","header.signalModeOnHint":"显示目标、决策、教训与计划;在记忆中隐藏自动捕获的 session、commit 与活动记录。","header.signalModeOffHint":"在记忆中显示所有记录,包括自动捕获的 session、commit 与活动记录。","globalFilter.focusedStatus":"全局显示:重点记忆 — 记忆已隐藏自动捕获的 session、commit 与活动记录。","globalFilter.allStatus":"全局显示:所有记忆 — 记忆会包含自动捕获的 session、commit 与活动记录。","roadmap.phases":"阶段","onboarding.title":"欢迎使用 MeMesh","onboarding.body":"你的记忆库还是空的。从 30 条精选示例开始体验,或直接存下你的第一则教训。","onboarding.coreHint":"本地记忆:remember、FTS5 关键词回忆、hooks 与仪表板浏览可协同运行。","onboarding.searchHint":"回忆使用本地 FTS5 关键词搜索。","onboarding.reviewHint":"已在运行的代理可准备摘要或可见对话记录工作包;仪表板只审核暂存提案。","onboarding.seedButton":"一键载入示范数据","onboarding.seedingButton":"载入中…","onboarding.seedHint":"直接在这里载入 30 条,之后可一键清除,不用切到终端","onboarding.cliReference":"习惯 CLI?","onboarding.hintDemo":"植入 30 条示范记忆,之后可一键清除","onboarding.hintReset":"移除所有 metadata.demo 标记的记忆","onboarding.resetButton":"清除示范数据","onboarding.resettingButton":"清除中…","onboarding.demoLoadedTitle":"已加载示范数据","onboarding.demoLoadedBody":"目前有 {count} 条标记为 demo 的记忆;可在这里仅移除这些记忆。","onboarding.resetConfirm":"确定移除所有带 metadata.demo 标记的记忆?无法还原相同数据行,但之后可重新加载示范数据;你的真实记忆会保留。","onboarding.resetReadbackFailed":"无法确认重置完成,因为仍有 demo 标记的记忆。清理按钮会保留;请重试或运行 memesh doctor。","onboarding.dismiss":"关闭","common.serverError":"服务器报告错误(HTTP {status})。请再试一次;若持续发生,请运行 `memesh doctor`。","emptyLibrary.title":"你的记忆库是空的","emptyLibrary.body":"这里还没有任何记忆。载入 30 条示范数据,马上看到 MeMesh 的完整功能——之后可一键清除。","browse.truncated":"当前显示前 {shown} 条(共 {total} 条)——用搜索或筛选找到其余的记忆","browse.truncatedUnknownTotal":"当前显示前 {shown} 条——读不到总数,可能还有更多","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":"在支持的安装渠道,首次使用时会先询问一次同意再更新。回「稍后」会暂缓该版本(24 小时,再拒绝改 48 小时,之后 7 天);回「不要再问」会关闭检查。其他渠道会显示对应的更新方式。升级后,正在运行的 host 要重启才会换成新版。MEMESH_AUTO_UPDATE 只设定允许的升级幅度,不会绕过同意。","errors.timeout":"请求超时","type.lesson_learned":"教训","type.lesson":"教训","type.mistake":"错误","type.decision":"决策","type.goal":"目标","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":"人物","patterns.day.0":"周日","patterns.day.1":"周一","patterns.day.2":"周二","patterns.day.3":"周三","patterns.day.4":"周四","patterns.day.5":"周五","patterns.day.6":"周六","lessons.severity.critical":"严重","lessons.severity.major":"重大","lessons.severity.minor":"轻微","memory.tooltip.project":"项目","memory.tooltip.recalled":"已被回忆 {count} 次","memory.tooltip.hasRelations":"与 {count} 条记忆相连","memory.tooltip.createdAt":"创建于 {date}","common.unknown":"未知","insights.entitiesCount":"{n} 个实体","roadmap.viewToggle":"项目历程视图","roadmap.viewTree":"树状","roadmap.viewMindmap":"思维导图","roadmap.mindmapNeedsPhases":"思维导图需要 7 天内至少 3 条记忆。","roadmap.activePhase":"进行中","roadmap.entryCount":"{count} 条","roadmap.entriesCount":"{count} 条","roadmap.otherGroup":"其他({count})","roadmap.lowSignalHidden":"(已隐藏 {count} 条低信号)","roadmap.resetHint":"重置缩放与位置(双击背景也可重置)","roadmap.zoomHint":"滚轮缩放 · 拖动平移 · {pct}%","roadmap.moreEntities":"还有 {count} 条","roadmap.viewDecisions":"决策","roadmap.densityTitle":"按类别的捕捉密度","roadmap.densityNote":"这是 memesh 捕捉到的,不等于发生过的一切","roadmap.lineageSupersedes":"{n} 条已被取代","roadmap.lineageConflicts":"{n} 条冲突未解决","adr.empty":"这个项目还没有记录任何决策。用类型「decision」记下一条,它就会带着自己的历史出现在这里。","adr.statusActive":"现行","adr.statusSuperseded":"已被取代","adr.supersedes":"取代","adr.supersededBy":"被取代","nav.ariaLabel":"仪表板分页","feedback.descLabel":"反馈内容","doctor.msg.capture-liveness.no-records.summary":"这台机器上的 hook 在运行(最后一次心跳是 {hours} 小时前),但没有任何一个留下结果记录。可能是正在运行的 hook 版本太旧、还不会记录结果,或者 hook 一加载就出错,什么都没记下来。","doctor.msg.capture-liveness.no-records.fix":"更新 MeMesh hook(plugin 安装:`/plugin update memesh`;npm 安装:`memesh install-hooks`),重新启动 agent,开始一个会话后再运行一次 `memesh doctor`。","project.index.title":"这里已经知道的事","project.index.empty":"这个项目目前还没有任何记忆会被自动注入。导入的记忆、标记为不可信的记忆,以及没有 `project:` 标签的记忆都不计入这里 — 上面项目标签上的数字可能更大。用 `remember` 保存的决策、教训、模式和参考资料会出现在这里。","project.index.more":'还有 {n} 条 — `memesh recall --tag "project:…"`',"project.index.older":"{n} 条较旧({days} 天没有变动)— 用 recall 查看","project.index.cost":"与 agent 在会话开始时收到的索引相同 · 约 {tokens} tokens({bytes} bytes)"},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":"件のメモリ","header.memory":"件のメモリ","insights.title":"メモリ整理の提案","insights.reviewTitle":"ステージ済みメモリ提案","insights.reviewSubtitle":"人のレビューを待つ作業パッケージ","insights.reviewSource":"ステージ済み提案 — 適用前にレビューしてください","insights.source.calendar":"カレンダーダイジェスト","insights.source.transcript":"Claude Code トランスクリプト","insights.reviewBoundary":"ダッシュボードはステージ済み提案のみレビューします。エージェントの実行や派遣はしません。","insights.statPending":"保留中","insights.statApplied":"適用済み","insights.statRejected":"却下済み","insights.filter.pending":"保留中","insights.filter.applied":"適用済み","insights.filter.rejected":"却下済み","insights.filter.all":"すべて","insights.refresh":"更新","insights.loading":"読み込み中…","insights.emptyOther":"データがありません。","insights.sources":"ソース","insights.status.pending":"保留中","insights.status.applied":"適用済み","insights.status.rejected":"却下済み","insights.viewDetail":"詳細を見る","insights.collapse":"折りたたむ","insights.accept":"採用","insights.applying":"適用中…","insights.reject":"拒否","insights.rejectConfirm":"このインサイトを拒否しますか?この操作は元に戻せません。","insights.observations":"要約観察","insights.tags":"タグ","insights.sourceIds":"ソース entity","insights.validationWarnings":"旧形式の検証警告","insights.validationClaim":"主張","insights.validationReason":"理由","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.settings":"設定","tab.home":"ホーム","tab.memories":"メモリ","tab.project":"プロジェクト","memories.searchPlaceholder":"入力しながら絞り込み — Enter で関連度順に検索","memories.scopeLabel":"範囲","memories.scopeWork":"ワークレイヤー","memories.scopeEvidence":"証拠","memories.scopeAll":"すべて","memories.scopeArchived":"アーカイブ済み","memories.composition":"構成","memories.rankedBy":"関連度順","memories.backToList":"一覧に戻る","memories.workEmpty":"ワークレイヤーのメモリはまだありません — 目標・決定・教訓・プランは記録されるとここに表示されます。","memories.showAll":"すべてのメモリを表示","memories.expand":"詳細を表示","memories.collapse":"詳細を隠す","memory.technicalDetails":"技術情報","memory.canonicalName":"正規名","memory.rawType":"元の種類","home.analyticsTitle":"分析","handoff.terminal":"ターミナルが必要","handoff.terminalPrereq":"MeMeshを導入したマシンで実行してください。ダッシュボードは実行しません。","handoff.copyCommand":"コマンドをコピー","handoff.commandCopied":"コピーしました","handoff.github":"GitHubを開きます — 送信前に入力内容を確認してください","home.analyticsHint":"健康度・タイムライン・パターン・利用状況 — 必要なときに展開","home.nextAction.eyebrow":"おすすめの次のステップ","home.nextAction.why":"理由:","home.nextAction.result":"期待される結果:","home.nextAction.loading.title":"対応が必要な項目を確認中…","home.nextAction.loading.why":"MeMesh がメモリ、検索インデックス、レビュー待ち一覧の現在の状態を確認しています。","home.nextAction.loading.result":"確認後、ここには提案が1つだけ表示されます。","home.nextAction.empty.title":"最初のメモリを追加","home.nextAction.empty.why":"メモリが空のため、まだ検索や整理の対象がありません。","home.nextAction.empty.result":"「メモリ」で削除可能なデモを読み込むか、実際の作業の記録を始められます。","home.nextAction.empty.action":"メモリを開く","insights.emptyPending":"保留中のレビューはまだありません。新しいメモリーレビューが準備されると、ここに表示されます。","home.nextAction.insights.title":"メモリ整理の提案を確認","home.nextAction.insights.why":"MeMesh に判断待ちの整理提案があります。","home.nextAction.insights.result":"有用な要約を承認し、不適切な提案を却下できます。","home.nextAction.insights.action":"提案を確認","home.nextAction.healthy.title":"今すぐ必要な操作はありません","home.nextAction.healthy.why":"メモリ、検索インデックス、レビュー待ち一覧に既知の作業はありません。","home.nextAction.healthy.result":"作業を続けてください。次に確認された必要事項をMeMeshがここに表示します。","home.nextAction.unavailable.title":"現在、提案を表示できません","home.nextAction.unavailable.why":"状態確認の一部を読み取れないため、MeMeshは推測しません。","home.nextAction.unavailable.result":"再読み込みすると、メモリや設定を変更せずに再確認できます。","home.nextAction.unavailable.action":"状態確認を再試行","project.selectLabel":"プロジェクト","project.selectPrompt":"プロジェクトを選ぶと履歴が表示されます。","project.empty":"プロジェクトのメモリはまだありません。memesh フックを導入した git リポジトリで作業すると、その歩みがここに表示されます。","project.taskState.title":"このプロジェクトの現状","project.taskState.goal":"目標","project.taskState.next":"次のステップ","project.taskState.blocked":"ブロック要因","project.taskState.done":"完了","project.taskState.updated":"更新: {when}","project.taskState.provenance":"`memesh task` で明示的に記録されたもので、メモリ数からの推定ではありません。","project.taskState.empty":"このプロジェクトのタスク状態はまだありません。作業セッションで `memesh task --goal … --next …` を実行すると、ここに表示されます。","guard.sourceLesson":"元の教訓","guard.pattern":"トリガーパターン","guard.message":"発する警告","guard.shouldMatch":"必ず反応する入力","guard.shouldNotMatch":"反応してはいけない入力","search.button":"検索","search.searching":"検索中…","search.results":"件の結果","search.result":"件の結果","search.noResults":"結果が見つかりません:","search.facts":"件の事実","browse.title":"すべてのメモリ","browse.active":"アクティブ","browse.archived":"アーカイブ済み","browse.refresh":"更新","browse.noMatch":"一致するメモリがありません:","browse.prev":"← 前へ","browse.next":"次へ →","browse.archive":"アーカイブ","browse.restore":"復元","browse.confirmArchive":"このメモリをアーカイブしますか?","browse.archiveFailed":"アーカイブできませんでした: {message}","browse.restoreFailed":"復元できませんでした: {message}","analytics.totalMemories":"メモリ総数","analytics.knowledgeFacts":"知識ファクト","analytics.connections":"接続","analytics.topics":"トピック","analytics.insights":"インサイト","analytics.thisWeek":"今週","analytics.new":"件の新規","analytics.stale":"未使用(30日以上)","analytics.archivedLabel":"アーカイブ済み","analytics.mostRecalled":"よく参照される","health.title":"メモリ健康度","metrics.notMeasured":"未計測","metrics.health":"健全性","metrics.healthNote":"活動・品質・鮮度・教訓","metrics.critical":"重大な教訓","metrics.criticalPartial":"分類済み {tagged} 件のうち · 教訓は全 {total} 件","metrics.criticalAll":"全 {total} 件の教訓、すべて分類済み","metrics.criticalUnclassified":"教訓 {total} 件、重大度は未分類","metrics.criticalNoLessons":"教訓はまだ記録されていません","metrics.citation":"引用率","metrics.citationNote":"{total} セッション中 {cited} 件が記憶を引用","metrics.citationNotMeasured":"引用の計測は次のセッションから始まります","metrics.reused":"今週の再利用","metrics.reusedNote":"概算——最終アクセス日から推定","health.excellent":"優秀","health.good":"良好","health.fair":"普通","health.poor":"不良","health.activity":"アクティビティ","health.quality":"品質","health.freshness":"新鮮度","health.lessons":"自己改善","timeline.title":"過去30日間","timeline.created":"作成","timeline.recalled":"呼び出し","value.totalRecalls":"総呼び出し回数","value.lessonsLearned":"学んだ教訓","value.lessonsSaved":"適用済み教訓","value.coverage":"知識カバレッジ","cleanup.title":"クリーンアップ提案","cleanup.allClean":"メモリはきれいです。古いまたは重複したエンティティは検出されませんでした。","cleanup.staleLabel":"低信頼度 / 未使用","cleanup.duplicateLabel":"重複の可能性","cleanup.confidence":"信頼度","cleanup.unused":"未使用","cleanup.entityMeta":"{type} ・ 信頼度 {confidence}% ・ {days}日未使用","settings.saved":"保存しました","settings.configLoadFailed":"設定を読み込めませんでした。ページを再読み込みして、もう一度お試しください。","settings.configReadbackFailed":"保存済みの設定をサーバーから確認できませんでした。もう一度お試しください。","settings.language":"言語","settings.interfaceLanguage":"インターフェース言語","settings.interfaceLanguageHint":"このブラウザーの表示言語をすぐに変更します。","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":"このセッションでは非推奨ステータスを確認できません — オンラインに復帰してから再実行してください。","settings.updatePartialSummary":"部分的 — 非推奨ステータス未確認","settings.updateDeprecatedTargetUnknown":"非推奨 — アップグレード先を確認中","settings.currentVersion":"現在のバージョン","settings.latestVersion":"最新バージョン","settings.lastAttempted":"最終確認試行","settings.lastSuccessful":"最後に成功した確認","settings.updateSourceFresh":"今すぐ確認","settings.updateSourceCached":"キャッシュ結果を使用","settings.updateSourceStale":"古いキャッシュ結果を使用","settings.updateSourceUnavailable":"利用できるキャッシュなし","settings.updateCommand":"更新コマンド","settings.checkNow":"今すぐ確認","settings.updateLastError":"前回の確認エラー: {message}","settings.updateRetryGuidance":"接続と npm レジストリの設定を確認して、もう一度お試しください。インストールされたバージョンは変更されていません。","settings.installMethod":"インストール方法","settings.installNpmGlobal":"npm グローバルインストール","settings.installNpmLocal":"プロジェクトローカルのパッケージインストール","settings.installSourceCheckout":"ソースチェックアウト","settings.installUnknown":"不明","settings.updateGuidanceNpmGlobal":"このインストールは MeMesh から直接更新できます。","settings.updateGuidanceNpmLocal":"このインストールを追加したプロジェクトのパッケージマネージャーから更新してください。","settings.updateGuidanceSourceCheckout":"このソースチェックアウトはリポジトリから更新して再ビルドしてください。","settings.updateGuidanceUnknown":"MeMesh をインストールしたツールまたは手順からこのインストールを更新してください。","settings.installationDetails":"インストールの詳細","settings.installationDetailsUnavailable":"このインストールではバージョンを比較できません。","settings.interfacePath":"このインターフェース","settings.terminalPath":"ターミナルコマンド","settings.technicalDetails":"技術情報","settings.installationDetailsHint":"インストール済みのバージョンが異なっていても、必ずしも更新が必要とは限りません。公開済みリリースは「アップデート」で確認してください。","roadmap.resetView":"ビューをリセット","lessons.error":"エラー","lessons.rootCause":"根本原因","lessons.fix":"修正方法","lessons.prevention":"予防策","feedback.button":"💬 フィードバック","feedback.title":"GitHub でフィードバックを開く","feedback.bug":"バグ","feedback.feature":"機能提案","feedback.question":"質問","feedback.placeholder":"フィードバックを記入…","feedback.includeSys":"システム情報を含める","feedback.submit":"GitHub Issue を作成","feedback.submitting":"診断情報を収集中…","feedback.popupBlocked":"GitHub を開けませんでした。下書きは保持されています。ポップアップを許可して再試行するか、リンクをコピーしてください。","feedback.retry":"GitHub をもう一度開く","feedback.copyLink":"GitHub リンクをコピー","feedback.linkCopied":"リンクをコピーしました","feedback.copyFailed":"リンクをコピーできませんでした。GitHub をもう一度開いてください。","doctorBanner.warnTitleSoft":"memesh セットアップに注記があります","doctorBanner.failTitle":"memesh のセットアップが不完全です","doctorBanner.dismiss":"閉じる","doctorBanner.getHelp":"サポートを受ける","doctorBanner.helpHint":"診断情報が事前入力された GitHub Issue を開きます","doctorBanner.preambleForIssue":"memesh doctor が私のインストールで以下を検出しました:","doctorBanner.moreCount":"…ほか {n} 件 — 全リストは `memesh doctor` で確認できます","doctorBanner.fix":"自動修復","doctorBanner.fixInProgress":"修復中…","doctorBanner.fixDone":"修復済み","doctorBanner.restartRequired":"更新を完了するにはエージェントを再起動してください。","doctor.label.readme_locale_parity":"README の翻訳","doctor.label.config":"設定ファイル","doctor.label.mcp-config":"MCP 接続ファイル","doctor.label.hooks-config":"フック定義","doctor.label.hook-scripts":"フックスクリプト","doctor.label.hook-wiring":"Claude Code との接続","doctor.label.hook-activity":"自動記録","doctor.label.node-runtime":"Node.js のバージョン","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"プラグインのコードは最新か","doctor.label.shell-cli":"ターミナルコマンド","doctor.label.dashboard":"ダッシュボードのファイル","doctor.label.claude-channel":"Claude チャンネル登録","doctor.msg.claude-channel.unregistered.summary":"ライブの Claude チャンネル通知は有効になっていません。MCP メモリツールと永続的な受信トレイメッセージは引き続き機能することは可能です。このプレビューはオプションです。","doctor.msg.claude-channel.unregistered.fix":"このオプションのチャンネルを有効にするには、`memesh agent setup claude` を実行し、表示された MCP コマンドを Claude のユーザー設定に登録してください。","doctor.label.update-status":"アップデート","doctor.label.http-probe":"ローカルサーバー","doctor.label.skills-manifest":"同梱ファイル","doctor.label.config_parse":"設定ファイル","doctor.label.install-channel":"インストール方法","doctor.label.fts_segmentation":"キーワード索引","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 につなぐファイル(.claude-plugin/mcp.json)が見つかりません。","doctor.msg.mcp-config.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/mcp.json が壊れています(有効な JSON ではありません)。Claude Code が読み取れません。","doctor.msg.mcp-config.invalid-json.fix":"{path} を修正するか、MeMesh を再インストールしてください。","doctor.msg.mcp-config.no-entry.summary":".claude-plugin/mcp.json に memesh サーバーの設定がなくなっています。","doctor.msg.mcp-config.no-entry.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` が起動しようとしているファイルがこのインストールに存在しないため、Claude Code 内の memesh ツールがすべて起動しません。","doctor.msg.mcp-config.entry-missing.fix":"MeMesh を再インストールしてください。`.claude-plugin/mcp.json` を手で編集した場合は `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js` に戻してください。","doctor.msg.mcp-config.placeholder-unresolved.summary":"未検証:`.claude-plugin/mcp.json` が起動するパスには `${CLAUDE_PLUGIN_ROOT}` が含まれており、この変数を展開するのは Claude Code のプラグイン実行環境だけです。このインストールはプラグインとして動いていないため、指定されたファイルは確認できていません。","doctor.msg.mcp-config.placeholder-unresolved.fix":"プラグイン実行環境と同じ条件で確認してください:`CLAUDE_PLUGIN_ROOT=<このインストールのフォルダ> memesh doctor` を実行します。","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json が見つからないため、自動の記憶保存が動きません。","doctor.msg.hooks-config.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json が壊れています(有効な JSON ではありません)。","doctor.msg.hooks-config.invalid-json.fix":"{path} を修正するか、MeMesh を再インストールしてください。","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json に次のフックタイプがありません: {types}。一部の自動記録は動作しません。","doctor.msg.hooks-config.missing-types.fix":"出荷時のフック設定を復元するか、MeMesh を再インストールしてください。","doctor.msg.hook-scripts.none.summary":"フック設定にスクリプトが 1 つもないため、何も自動記録できません。","doctor.msg.hook-scripts.none.fix":"MeMesh を再インストールしてください。","doctor.msg.hook-scripts.missing.summary":"次のフックスクリプトが見つかりません: {files}","doctor.msg.hook-scripts.missing.fix":"MeMesh を再インストールすると復元されます。","doctor.msg.hook-scripts.not-executable.summary":"次のフックスクリプトは存在しますが、実行が許可されていません: {files}","doctor.msg.hook-scripts.not-executable.fix":"`chmod +x scripts/hooks/*.js` を実行してください。ソースからの場合は `npm run build` を実行します。","doctor.msg.hook-wiring.no-marker.summary":"memesh はまだ Claude Code に接続されていないため、何も自動で記憶されません。","doctor.msg.hook-wiring.no-marker.fix":"`memesh install-hooks` を一度実行し、`memesh doctor` で確認してください。","doctor.msg.hook-wiring.script-missing.summary":"配線済みの memesh フックが {path} を指していますが、このファイルはもう存在しません — エージェントは該当イベントのたびに存在しないファイルを呼び出します。フックを廃止したアップグレードの残骸であることが多いです。","doctor.msg.hook-wiring.script-missing.fix":"`memesh install-hooks` を実行して配線し直し(廃止済み項目は削除されます)、エージェントを再起動してください。","doctor.msg.hook-wiring.marker-unreadable.summary":"{path} の接続記録を読み取れません。","doctor.msg.hook-wiring.marker-unreadable.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.marker-malformed.summary":"接続記録が壊れています。","doctor.msg.hook-wiring.marker-malformed.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code の設定ファイル({path})がなくなっているため、接続が切れています。","doctor.msg.hook-wiring.settings-missing.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.settings-invalid.summary":"{path} が壊れています(有効な JSON ではありません)。","doctor.msg.hook-wiring.settings-invalid.fix":"バックアップから復元するか、`memesh install-hooks` で作り直してください。","doctor.msg.hook-wiring.entries-removed.summary":"{path} から memesh の設定が削除されたため、接続が切れています。","doctor.msg.hook-wiring.entries-removed.fix":"もう一度 `memesh install-hooks` を実行してください。","doctor.msg.hook-wiring.root-moved.summary":"接続先の {path} はもう存在しません(memesh が移動された可能性があります)。","doctor.msg.hook-wiring.root-moved.fix":"`memesh install-hooks` を実行して更新してください。","doctor.msg.hook-activity.never-ran.summary":"記録の追跡を始めてから {hours} 時間、キャプチャフックが一度も実行されていません。フックの配線は正常なので、実行されるはずのものが動いておらず、何も記憶されていません。","doctor.msg.hook-activity.never-ran.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。まだフックが実行されていないと表示される場合は `memesh install-hooks` を実行してエージェントを再起動してください。","doctor.msg.hook-activity.stale.summary":"最後にキャプチャフックが実行されたのは約 {hours} 時間前です({hook})。それ以降に作業しているなら、キャプチャは停止しており、そのセッションの内容は保存されていません。","doctor.msg.hook-activity.stale.fix":"エージェントを再起動し、セッションを 1 回終えてから `memesh doctor` を再実行してください。回復しない場合は `memesh install-hooks` を実行してください。","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary フックの最終実行は約 {hours} 時間前で、直近 3 日間 Claude Code からの書き込みもありません。このマシンが別のエージェント(Codex / Gemini)に移行したなら正常です。まだここで Claude Code を使っているなら、キャプチャは停止しています。","doctor.msg.hook-activity.stale-unconfirmed.fix":"このマシンでまだ Claude Code を使っている場合:再起動し、セッションを 1 回終えてから `memesh doctor` を再実行してください。回復しなければ `memesh install-hooks` を実行してください。","doctor.msg.hook-activity.query-failed.summary":"データベースからフックの実行履歴を読めませんでした:{detail}。キャプチャの状態は「不明」であり、「正常」とは違います。","doctor.msg.hook-activity.query-failed.fix":"`memesh doctor --verbose` で完全なエラーを確認し、~/.memesh が読み取り可能でディスクに空きがあることを確認してください。","doctor.msg.hook-activity.stale-unknown.summary":"{hook} フックの最終実行時刻が読み取れません(データ破損、または時計が狂ったマシンが記録した可能性があります)。キャプチャの状態は「不明」であり、「正常」とは違います。","doctor.msg.hook-activity.stale-unknown.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。新しい実行が壊れたタイムスタンプを上書きします。","doctor.msg.hook-activity.disabled.summary":"自動キャプチャはオフになっています(MEMESH_AUTO_CAPTURE または設定の autoCapture)。意図的な設定のため、フックが動かないのは想定どおりです。再開するには設定を戻してください。","doctor.msg.hook-activity.disabled-env.summary":"この shell の環境変数 MEMESH_AUTO_CAPTURE=false により自動キャプチャはオフです。doctor は自分の環境しか見えません — エージェントがこの変数なしで動いていれば、そちらのキャプチャは影響を受けません。","doctor.msg.hook-activity.not-wired.summary":"キャプチャフックは一度も実行されていません — そしてこのマシンではキャプチャフック(Stop / PostToolUse / PreCompact)の配線が確認できないため、実行されるものがそもそもありません。","doctor.msg.hook-activity.not-wired.fix":"自動キャプチャを使うには `memesh install-hooks` を実行してください。MCP のみのインストール(Codex / Gemini)であればこれは正常であり、無視してかまいません。","doctor.msg.hook-activity.stop-silent.summary":"{hook} フックは記録されていますが、追跡開始から {hours} 時間、session-summary フックは一度も実行されていません。コミットのキャプチャに隠れて、セッションのキャプチャが壊れている可能性があります。","doctor.msg.hook-activity.stop-silent.fix":"作業セッションを 1 回終えてから `memesh doctor` を再実行してください。それでも session-summary が実行されていなければ、`memesh install-hooks` を実行してエージェントを再起動してください。","doctor.label.capture-liveness":"記録が続いているか","doctor.msg.capture-liveness.silent-hook.summary":"{hook}: {runs} 回実行、書き込み 0 件 —— 理由は「{reason}」です。フックは動いていますが毎回「保存するものはない」と判断しています。捕捉が壊れているときも同じ見え方になります。","doctor.msg.capture-liveness.silent-hook.fix":"`memesh doctor --json` でフックごとの数値を確認してください。その理由が実際の使い方と合わない場合は `memesh install-hooks` を実行してエージェントを再起動してください。","doctor.msg.capture-liveness.type-stopped.summary":"直近 7 日間に「{type}」は 1 件も保存されていません(その前の 7 日間は {prev} 件)。これまで記憶されていたものが記憶されなくなっています。","doctor.msg.capture-liveness.type-stopped.fix":"`memesh doctor --json` でフックごとの数値を確認し、作業のしかたが変わっていないか確かめてください。変わっていなければ `memesh install-hooks` を実行してエージェントを再起動してください。","doctor.msg.capture-liveness.never-ran.summary":"追跡開始から {hours} 時間、{hook} フックは記録もハートビートも残していません。一度も実行されていないため、このフックが捕捉するはずのものは何も保存されていません。","doctor.msg.capture-liveness.never-ran.fix":"`memesh install-hooks` を実行してエージェントを再起動し、作業セッションを 1 回終えてから `memesh doctor` を再実行してください。","doctor.msg.capture-liveness.not-wired.summary":"{hook} フックは一度も実行されていませんが、このマシンには捕捉フックが接続されていません。","doctor.msg.capture-liveness.not-wired.fix":"自動捕捉を使う場合は `memesh install-hooks` を実行してください。MCP 専用(Codex、Gemini、Cursor)の場合は正常です。","doctor.msg.capture-liveness.never-ran-legacy.summary":"{hook} フックに結果記録はありませんが、追跡開始後に {captured} 件の自動捕捉メモリが保存されています。古いフックが実行中の可能性があります。","doctor.msg.capture-liveness.never-ran-legacy.fix":"MeMesh フックを更新し、エージェントを再起動してから `memesh doctor` を再実行してください。","doctor.msg.capture-liveness.query-failed.summary":"データベースから捕捉状況を読み取れませんでした: {detail}。何かが保存されているかどうか不明であり、不明は正常とは違います。","doctor.msg.capture-liveness.query-failed.fix":"エラーは上記のとおりです。~/.memesh が読み取れること、ディスクに空きがあることを確認してください。","doctor.msg.hook-activity.never-ran-legacy.summary":"ハートビートを記録したフックはありませんが、追跡開始以降に {captured} 件の自動キャプチャの記憶が保存されています。ハートビート機能より前の旧バージョンのフックがまだ動いている可能性が高いです。","doctor.msg.hook-activity.never-ran-legacy.fix":"memesh のフックを現行バージョンに更新し(プラグイン:`/plugin update memesh`、npm:`memesh install-hooks`)、エージェントを再起動してください。","doctor.msg.node-runtime.too-old.summary":"お使いの Node.js はこのパッケージが対応するバージョンより古いです。{detail}","doctor.msg.node-runtime.too-old.fix":"Node.js を {required} 以上に更新し、もう一度 `memesh doctor` を実行してください。","doctor.msg.native-binding.load-failed.summary":"SQLite がデータベースを開けませんでした: {detail}。","doctor.msg.native-binding.load-failed.fix":"Node の実行環境を確認し、必要なら MeMesh を再インストールしてください。","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.shell-cli.versions.summary":"インストール済みバージョン: このインターフェース {current}; ターミナル {terminal}。","doctor.msg.plugin-cache.stale.summary":"プラグインはコミット {installed} からインストールされましたが、marketplace は同じバージョンのまま {marketplace} に進んでいます。バージョンが変わらないと {host} はキャッシュを更新しないため、marketplace より古いコードが動いています。","doctor.msg.plugin-cache.stale.fix":"`{command}` を実行してキャッシュを更新し、{host} を再起動してください。","doctor.msg.plugin-cache.unverifiable.summary":"インストール済みプラグインが marketplace と一致するか判断できませんでした。バージョンだけでは判断できません——異なるビルドが同じバージョンを持つことがあります。","doctor.msg.plugin-cache.unverifiable.fix":"`{command}` を一度実行してください。コミットが記録され、このチェックが判断できるようになります。","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.config-parse.retired-settings.summary":"{path} は有効な設定ファイルですが、廃止されたトップレベル設定が {count} 個残っています({keys})。このバージョンでは無視されますが、以前のプロバイダー認証情報や設定がディスクに残っている可能性があります。","doctor.msg.config-parse.retired-settings.fix":"{path} をローカルで確認し、廃止されたトップレベルキーだけを削除してください。認証情報が含まれる可能性があるため、issue に貼り付けないでください。その後 memesh doctor を再実行してください。","doctor.msg.message-capability.probe-failed.summary":"インストール済みメッセージ機能の検査に失敗しました: {detail}。","doctor.msg.message-router.socket-missing.summary":"{path} に Local router socket がありません。停止中または存在しないセッションは起動されません。","doctor.msg.message-router.socket-insecure.summary":"{path} の router socket は所有者専用の Unix socket ではありません。","doctor.msg.message-router.socket-unreachable.summary":"{path} の所有者専用 router socket は存在しますが、ローカル接続を受け付けませんでした。","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.citation.none.summary":"セッションに記憶が注入されましたが、引用されたものはありません。","doctor.msg.citation.none.fix":"~/.claude/rules/memesh-citations.md の引用規約を確認し、数セッション後に再確認してください。","doctor.msg.database.broken.summary":"データベースが使えません: {detail}","doctor.update_status.prerelease":"プレリリース版を実行中です({current})。npm の latest は {latest} です。","patterns.title":"あなたのパターン","patterns.workSchedule":"作業スケジュール","patterns.peakHours":"ピーク時間帯","patterns.busiestDays":"最も忙しい曜日","patterns.workflow":"ワークフロー","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.auth.cross-origin":"このリクエストは別のサイトから来たか、想定外の名前でサーバーに届いたため拒否されました。`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.rate.limited":"短時間にリクエストが多すぎます。少し待ってからもう一度お試しください。","httpError.server.internal":"サーバーで予期しないエラーが発生しました。","httpError.operation.permission-denied":"この修復に必要なファイルを MeMesh が変更する権限がありません。このダッシュボードを閉じ、自分のターミナルで `memesh serve` を実行してから再試行してください。それでも失敗する場合は `memesh doctor` を実行してください。","time.justNow":"たった今","time.hoursAgo":"{count} 時間前","time.today":"今日","time.yesterday":"昨日","time.daysAgo":"{count} 日前","time.lastWeek":"先週","time.weeksAgo":"{count} 週前","time.lastMonth":"先月","time.monthsAgo":"{count} ヶ月前","memory.access.frequent":"頻繁 · {count} 回","memory.access.recalls":"{count} 回呼出","memory.access.never":"未使用","cluster.knowledge":"知識","cluster.activity":"アクティビティ","cluster.session":"セッション","cluster.reference":"参照","cluster.all":"すべて","browse.filterTime":"時間","browse.filterValue":"価値","browse.filterProject":"プロジェクト","browse.filterSort":"並べ替え","browse.timeToday":"今日","browse.timeWeek":"今週","browse.timeMonth":"今月","browse.timeOlder":"それ以前","browse.valueRecalled":"✓ 使用済み","browse.valueNever":"未使用","browse.sortMostRecalled":"使用頻度順","browse.sortRecent":"最近の使用順","browse.sortCreated":"作成日順","browse.emptyFilter":"このカテゴリには記憶がありません — フィルタを変更してみてください","lessons.stepsLabel":"ステップ","lessons.commitsCount":"{count} コミット","lessons.unstructured":"(構造化フィールドなし — 元のメモリを参照)","lessons.moreItems":"あと {count} 件","roadmap.title":"プロジェクト履歴","roadmap.summary":"{count} 件の記憶 · {first} → {last}","roadmap.switchToList":"↩ リスト表示","roadmap.switchToRoadmap":"🕘 履歴表示","roadmap.emptyProject":"このプロジェクトにはまだ記憶がありません。","loop.label":"メモリループ","loop.subtitleHas":"過去 7 日間に呼び出された知識メモリ","loop.subtitleNone":"今週はまだ呼び出された知識がありません — 教訓を呼び出してみてください","loop.approxNote":"近似値 — 完全な追跡はアップグレード後に開始","loop.sparkLabel":"過去 30 日","roadmap.milestones":"マイルストーン","roadmap.keyLessons":"重要な教訓","radar.title":"知識カバレッジレーダー","radar.caption":"有効な知識メモリ (session と commit を除く)","radar.axis.lessons":"教訓","radar.axis.decisions":"決定","radar.axis.patterns":"パターン","radar.axis.bugs":"バグ修正","radar.axis.processes":"プロセス","radar.axis.architecture":"アーキテクチャ","ageMatrix.title":"メモリ年齢分布","ageMatrix.low":"低","ageMatrix.high":"高","ageMatrix.legend":"色の濃さ = メモリ密度","ageMatrix.typeColumn":"タイプ","header.signalModeOn":"重要なメモリ","header.signalModeOff":"すべてのメモリ","header.signalModeOnHint":"目標・意思決定・教訓・計画を表示し、メモリでは自動取得された session、commit、活動記録を隠します。","header.signalModeOffHint":"メモリですべての記録(自動取得された session、commit、活動記録を含む)を表示します。","globalFilter.focusedStatus":"全体表示:重要なメモリ — メモリでは自動取得された session、commit、活動記録を非表示にしています。","globalFilter.allStatus":"全体表示:すべてのメモリ — メモリに自動取得された session、commit、活動記録も含めます。","roadmap.phases":"フェーズ","onboarding.title":"MeMesh へようこそ","onboarding.body":"メモリは空です。30 件のキュレーション済みツアーで始めるか、最初の教訓を記録してください。","onboarding.coreHint":"ローカルメモリ:remember、FTS5 キーワード検索、フック、ダッシュボード閲覧が連携します。","onboarding.searchHint":"検索にはローカル FTS5 キーワード検索を使います。","onboarding.reviewHint":"実行中のエージェントはダイジェストまたは表示可能な会話記録の作業パッケージを準備できます。ダッシュボードはステージ済み提案のみレビューします。","onboarding.seedButton":"デモツアーを開始","onboarding.seedingButton":"読み込み中…","onboarding.seedHint":"端末を開かずに 30 件追加。後でいつでも削除可能","onboarding.cliReference":"CLI を使う場合","onboarding.hintDemo":"30 件のデモメモリを投入(後で削除可)","onboarding.hintReset":"metadata.demo タグの全エンティティを削除","onboarding.resetButton":"デモを削除","onboarding.resettingButton":"削除中…","onboarding.demoLoadedTitle":"デモデータが読み込まれています","onboarding.demoLoadedBody":"demo タグ付きメモリが {count} 件あります。ここではそのメモリだけを削除できます。","onboarding.resetConfirm":"metadata.demo タグ付きメモリをすべて削除しますか?同じ行は復元できませんが、後で新しいデモを読み込めます。実際のメモリは残ります。","onboarding.resetReadbackFailed":"demo タグ付きメモリが残っているため、リセットを確認できませんでした。削除操作は残ります。再試行するか memesh doctor を実行してください。","onboarding.dismiss":"閉じる","common.serverError":"サーバーがエラーを返しました(HTTP {status})。もう一度お試しください。繰り返す場合は `memesh doctor` を実行してください。","emptyLibrary.title":"メモリは空です","emptyLibrary.body":"まだ何も保存されていません。30 件のデモツアーを読み込めば MeMesh の動きをすぐ確認できます(後で一括削除可)。","browse.truncated":"全 {total} 件のうち先頭 {shown} 件を表示中 — 残りは検索やフィルタで絞り込んでください","browse.truncatedUnknownTotal":"先頭 {shown} 件を表示中 — 総数を取得できないため、さらにある可能性があります","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":"対応するインストール経路では、初回使用時に一度だけ同意を確認してから更新します。「後で」はそのバージョンを保留(24 時間、再度断ると 48 時間、その後 7 日)、「今後は確認しない」はチェックを無効化します。他の経路では各自の更新手順を表示します。更新後、実行中のホストは再起動するまで旧バージョンのままです。MEMESH_AUTO_UPDATE は許可する更新幅だけを設定し、同意を迂回しません。","errors.timeout":"リクエストがタイムアウトしました","type.lesson_learned":"教訓","type.lesson":"教訓","type.mistake":"ミス","type.decision":"決定","type.goal":"目標","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":"人物","patterns.day.0":"日曜","patterns.day.1":"月曜","patterns.day.2":"火曜","patterns.day.3":"水曜","patterns.day.4":"木曜","patterns.day.5":"金曜","patterns.day.6":"土曜","lessons.severity.critical":"致命的","lessons.severity.major":"重大","lessons.severity.minor":"軽微","memory.tooltip.project":"プロジェクト","memory.tooltip.recalled":"{count} 回呼び出されました","memory.tooltip.hasRelations":"{count} 件の記憶とリンク","memory.tooltip.createdAt":"作成: {date}","common.unknown":"不明","insights.entitiesCount":"{n} 件のエンティティ","roadmap.viewToggle":"プロジェクト履歴表示","roadmap.viewTree":"ツリー","roadmap.viewMindmap":"マインドマップ","roadmap.mindmapNeedsPhases":"マインドマップには 7 日以内の記憶が 3 件以上必要です。","roadmap.activePhase":"進行中","roadmap.entryCount":"{count} 件","roadmap.entriesCount":"{count} 件","roadmap.otherGroup":"その他({count})","roadmap.lowSignalHidden":"(低シグナル {count} 件を非表示)","roadmap.resetHint":"ズームと位置をリセット(背景をダブルクリックでも可)","roadmap.zoomHint":"スクロールでズーム · ドラッグでパン · {pct}%","roadmap.moreEntities":"他 {count} 件","roadmap.viewDecisions":"決定","roadmap.densityTitle":"カテゴリ別のキャプチャ密度","roadmap.densityNote":"memesh がキャプチャしたものであり、起きたことのすべてではありません","roadmap.lineageSupersedes":"{n} 件が置き換え済み","roadmap.lineageConflicts":"{n} 件の未解決の矛盾","adr.empty":"このプロジェクトにはまだ決定が記録されていません。タイプ「decision」で記録すると、履歴とともにここに表示されます。","adr.statusActive":"有効","adr.statusSuperseded":"置き換え済み","adr.supersedes":"置き換え元","adr.supersededBy":"置き換え先","nav.ariaLabel":"ダッシュボードのセクション","feedback.descLabel":"フィードバックの内容","doctor.msg.capture-liveness.no-records.summary":"このマシンではフックが動いています(最後のハートビートは {hours} 時間前)が、結果の記録を残したフックが一つもありません。動いているフックが結果記録より前のバージョンか、読み込み時に失敗して何も記録していない可能性があります。","doctor.msg.capture-liveness.no-records.fix":"MeMesh のフックを更新し(プラグイン: `/plugin update memesh`、npm: `memesh install-hooks`)、エージェントを再起動してセッションを 1 回始めてから、もう一度 `memesh doctor` を実行してください。","project.index.title":"ここで分かっていること","project.index.empty":"このプロジェクトには自動的に注入される記憶がまだありません。インポートされた記憶、untrusted と記録された記憶、`project:` タグのない記憶はここには数えられません — 上のプロジェクトチップの数はこれより大きいことがあります。`remember` で保存した決定・教訓・パターン・参考情報がここに表示されます。","project.index.more":'ほか {n} 件 — `memesh recall --tag "project:…"`',"project.index.older":"古い記憶 {n} 件({days} 日間変更なし)— recall で確認できます","project.index.cost":"エージェントがセッション開始時に受け取る索引と同じ · 約 {tokens} トークン({bytes} バイト)"},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":"개의 기억","header.memory":"개의 기억","insights.title":"메모리 정리 제안","insights.reviewTitle":"스테이징된 메모리 제안","insights.reviewSubtitle":"사람의 검토를 기다리는 작업 패키지","insights.reviewSource":"스테이징된 제안 — 적용 전에 검토하세요","insights.source.calendar":"캘린더 다이제스트","insights.source.transcript":"Claude Code 대화 기록","insights.reviewBoundary":"대시보드는 이미 스테이징된 제안만 검토합니다. 에이전트를 실행하거나 디스패치하지 않습니다.","insights.statPending":"대기 중","insights.statApplied":"적용됨","insights.statRejected":"거부됨","insights.filter.pending":"대기 중","insights.filter.applied":"적용됨","insights.filter.rejected":"거부됨","insights.filter.all":"전체","insights.refresh":"새로고침","insights.loading":"불러오는 중…","insights.emptyOther":"데이터가 없습니다.","insights.sources":"소스","insights.status.pending":"대기 중","insights.status.applied":"적용됨","insights.status.rejected":"거부됨","insights.viewDetail":"자세히 보기","insights.collapse":"접기","insights.accept":"채택","insights.applying":"적용 중…","insights.reject":"거부","insights.rejectConfirm":"이 인사이트를 거부할까요? 이 작업은 되돌릴 수 없습니다.","insights.observations":"요약 관찰","insights.tags":"태그","insights.sourceIds":"소스 entity","insights.validationWarnings":"이전 형식의 검증 경고","insights.validationClaim":"주장","insights.validationReason":"이유","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.settings":"설정","tab.home":"홈","tab.memories":"기억","tab.project":"프로젝트","memories.searchPlaceholder":"입력하는 대로 필터링 — Enter를 누르면 관련도순 검색","memories.scopeLabel":"범위","memories.scopeWork":"작업 레이어","memories.scopeEvidence":"증거","memories.scopeAll":"전체","memories.scopeArchived":"보관됨","memories.composition":"구성","memories.rankedBy":"관련도순","memories.backToList":"목록으로 돌아가기","memories.workEmpty":"작업 레이어 기억이 아직 없습니다 — 목표, 결정, 교훈, 계획이 기록되면 여기에 나타납니다.","memories.showAll":"모든 기억 보기","memories.expand":"상세 보기","memories.collapse":"상세 숨기기","memory.technicalDetails":"기술 세부정보","memory.canonicalName":"표준 이름","memory.rawType":"원시 유형","home.analyticsTitle":"분석","handoff.terminal":"터미널 필요","handoff.terminalPrereq":"MeMesh가 설치된 컴퓨터에서 실행하세요. 대시보드는 실행하지 않습니다.","handoff.copyCommand":"명령 복사","handoff.commandCopied":"명령 복사됨","handoff.github":"GitHub 열기 — 제출 전에 미리 채운 내용을 확인하세요","home.analyticsHint":"건강도, 타임라인, 패턴, 사용량 — 필요할 때 펼쳐집니다","home.nextAction.eyebrow":"권장 다음 단계","home.nextAction.why":"이유:","home.nextAction.result":"예상 결과:","home.nextAction.loading.title":"주의가 필요한 항목을 확인하는 중…","home.nextAction.loading.why":"MeMesh가 메모리, 검색 인덱스와 검토 대기열의 현재 상태를 읽고 있습니다.","home.nextAction.loading.result":"확인이 끝나면 한 가지 권장 사항만 표시됩니다.","home.nextAction.empty.title":"첫 메모리 추가","home.nextAction.empty.why":"메모리가 비어 있어 아직 검색하거나 정리할 내용이 없습니다.","home.nextAction.empty.result":"메모리 페이지에서 삭제 가능한 데모를 불러오거나 실제 작업 기록을 시작할 수 있습니다.","home.nextAction.empty.action":"메모리 열기","insights.emptyPending":"아직 검토할 항목이 없습니다. 새 메모리 검토가 준비되면 여기에 표시됩니다.","home.nextAction.insights.title":"메모리 정리 제안 검토","home.nextAction.insights.why":"MeMesh에 판단을 기다리는 정리 제안이 있습니다.","home.nextAction.insights.result":"유용한 요약을 승인하거나 적합하지 않은 제안을 거절할 수 있습니다.","home.nextAction.insights.action":"제안 검토","home.nextAction.healthy.title":"지금은 조치가 필요하지 않습니다","home.nextAction.healthy.why":"메모리, 검색 인덱스와 검토 대기열에 알려진 작업이 없습니다.","home.nextAction.healthy.result":"계속 작업하세요. MeMesh가 다음으로 확인된 필요 사항을 여기에 표시합니다.","home.nextAction.unavailable.title":"현재 권장 사항을 표시할 수 없습니다","home.nextAction.unavailable.why":"상태 확인 중 하나를 읽지 못해 MeMesh가 추측하지 않습니다.","home.nextAction.unavailable.result":"다시 불러오면 메모리나 설정을 변경하지 않고 재확인합니다.","home.nextAction.unavailable.action":"상태 확인 재시도","project.selectLabel":"프로젝트","project.selectPrompt":"프로젝트를 선택하면 그 히스토리가 표시됩니다.","project.empty":"프로젝트 기억이 아직 없습니다. memesh 훅이 설치된 git 저장소에서 작업하면 그 이야기가 여기에 나타납니다.","project.taskState.title":"이 프로젝트의 현재 상태","project.taskState.goal":"목표","project.taskState.next":"다음 단계","project.taskState.blocked":"막힌 부분","project.taskState.done":"완료","project.taskState.updated":"업데이트 {when}","project.taskState.provenance":"`memesh task`로 명시적으로 기록된 것이며 기억 수로 추정한 것이 아닙니다.","project.taskState.empty":"이 프로젝트의 작업 상태가 아직 없습니다. 작업 세션에서 `memesh task --goal … --next …`로 설정하면 여기에 표시됩니다.","guard.sourceLesson":"출처 교훈","guard.pattern":"트리거 패턴","guard.message":"표시될 경고","guard.shouldMatch":"반드시 발동","guard.shouldNotMatch":"발동 금지","search.button":"검색","search.searching":"검색 중…","search.results":"개의 결과","search.result":"개의 결과","search.noResults":"결과를 찾을 수 없습니다:","search.facts":"개의 사실","browse.title":"모든 기억","browse.active":"활성","browse.archived":"보관됨","browse.refresh":"새로고침","browse.noMatch":"일치하는 기억이 없습니다:","browse.prev":"← 이전","browse.next":"다음 →","browse.archive":"보관","browse.restore":"복원","browse.confirmArchive":"이 기억을 보관하시겠습니까?","browse.archiveFailed":"보관하지 못했습니다: {message}","browse.restoreFailed":"복원하지 못했습니다: {message}","analytics.totalMemories":"총 기억 수","analytics.knowledgeFacts":"지식 사실","analytics.connections":"연결","analytics.topics":"주제","analytics.insights":"인사이트","analytics.thisWeek":"이번 주","analytics.new":"개 신규","analytics.stale":"비활성 (30일 이상 미사용)","analytics.archivedLabel":"보관됨","analytics.mostRecalled":"가장 많이 조회됨","health.title":"메모리 건강도","metrics.notMeasured":"아직 측정되지 않음","metrics.health":"건강도","metrics.healthNote":"활동, 품질, 신선도, 교훈","metrics.critical":"심각한 교훈","metrics.criticalPartial":"분류된 {tagged}개 중 · 전체 교훈 {total}개","metrics.criticalAll":"전체 {total}개 교훈, 모두 분류됨","metrics.criticalUnclassified":"교훈 {total}개, 심각도 분류 없음","metrics.criticalNoLessons":"아직 기록된 교훈이 없습니다","metrics.citation":"인용률","metrics.citationNote":"{total}개 세션 중 {cited}개가 기억을 인용","metrics.citationNotMeasured":"인용 추적은 다음 세션부터 시작됩니다","metrics.reused":"이번 주 재사용","metrics.reusedNote":"근사치 — 마지막 접근 시각으로 추정","health.excellent":"우수","health.good":"양호","health.fair":"보통","health.poor":"불량","health.activity":"활동","health.quality":"품질","health.freshness":"최신성","health.lessons":"자기 개선","timeline.title":"최근 30일","timeline.created":"생성","timeline.recalled":"호출","value.totalRecalls":"총 호출 횟수","value.lessonsLearned":"학습된 교훈","value.lessonsSaved":"적용된 교훈","value.coverage":"지식 커버리지","cleanup.title":"정리 제안","cleanup.allClean":"메모리가 깨끗합니다. 오래되었거나 중복된 엔티티가 감지되지 않았습니다.","cleanup.staleLabel":"낮은 신뢰도 / 미사용","cleanup.duplicateLabel":"중복 가능성","cleanup.confidence":"신뢰도","cleanup.unused":"미사용","cleanup.entityMeta":"{type} · 신뢰도 {confidence}% · {days}일 미사용","settings.saved":"저장되었습니다","settings.configLoadFailed":"설정을 읽을 수 없습니다. 페이지를 새로고침하여 다시 시도하세요.","settings.configReadbackFailed":"서버에서 저장된 설정을 확인하지 못했습니다. 다시 시도하세요.","settings.language":"언어","settings.interfaceLanguage":"인터페이스 언어","settings.interfaceLanguageHint":"이 브라우저의 인터페이스 언어를 즉시 변경합니다.","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":"이 세션에서는 사용 중단 상태를 확인할 수 없습니다 — 온라인 상태에서 다시 실행하세요.","settings.updatePartialSummary":"부분 확인됨 — 사용 중단 상태 미확인","settings.updateDeprecatedTargetUnknown":"사용 중단됨 — 업그레이드 대상 확인 중","settings.currentVersion":"현재 버전","settings.latestVersion":"최신 버전","settings.lastAttempted":"마지막 확인 시도","settings.lastSuccessful":"마지막 성공 확인","settings.updateSourceFresh":"방금 확인함","settings.updateSourceCached":"캐시된 결과 사용","settings.updateSourceStale":"오래된 캐시 결과 사용","settings.updateSourceUnavailable":"사용 가능한 캐시 없음","settings.updateCommand":"업데이트 명령","settings.checkNow":"지금 확인","settings.updateLastError":"마지막 확인 오류: {message}","settings.updateRetryGuidance":"연결 및 npm 레지스트리 설정을 확인한 후 다시 시도하세요. 설치된 버전은 변경되지 않았습니다.","settings.installMethod":"설치 방식","settings.installNpmGlobal":"npm 전역 설치","settings.installNpmLocal":"프로젝트 로컬 패키지 설치","settings.installSourceCheckout":"소스 체크아웃","settings.installUnknown":"알 수 없음","settings.updateGuidanceNpmGlobal":"이 설치는 MeMesh에서 직접 업데이트할 수 있습니다.","settings.updateGuidanceNpmLocal":"이 패키지를 설치한 프로젝트의 패키지 관리자에서 업데이트하세요.","settings.updateGuidanceSourceCheckout":"이 소스 체크아웃은 저장소에서 업데이트한 뒤 다시 빌드하세요.","settings.updateGuidanceUnknown":"MeMesh를 설치한 도구나 작업 흐름으로 이 설치를 업데이트하세요.","settings.installationDetails":"설치 세부정보","settings.installationDetailsUnavailable":"이 설치에서는 버전을 비교할 수 없습니다.","settings.interfacePath":"이 인터페이스","settings.terminalPath":"터미널 명령어","settings.technicalDetails":"기술 세부정보","settings.installationDetailsHint":"설치된 버전이 서로 달라도 반드시 업데이트가 필요한 것은 아닙니다. 게시된 릴리스는 업데이트에서 확인하세요.","roadmap.resetView":"뷰 재설정","lessons.error":"오류","lessons.rootCause":"근본 원인","lessons.fix":"수정 방법","lessons.prevention":"예방 조치","feedback.button":"💬 피드백","feedback.title":"GitHub에서 피드백 열기","feedback.bug":"버그","feedback.feature":"기능 제안","feedback.question":"질문","feedback.placeholder":"피드백을 설명해주세요…","feedback.includeSys":"시스템 정보 포함","feedback.submit":"GitHub Issue 열기","feedback.submitting":"진단 정보 수집 중…","feedback.popupBlocked":"GitHub가 열리지 않았습니다. 초안은 그대로 유지됩니다. 팝업을 허용하고 다시 시도하거나 링크를 복사하세요.","feedback.retry":"GitHub 다시 열기","feedback.copyLink":"GitHub 링크 복사","feedback.linkCopied":"링크 복사됨","feedback.copyFailed":"링크를 복사하지 못했습니다. GitHub를 다시 열어 보세요.","doctorBanner.warnTitleSoft":"memesh 설정 안내가 있습니다","doctorBanner.failTitle":"memesh 설정이 완전하지 않습니다","doctorBanner.dismiss":"닫기","doctorBanner.getHelp":"도움 받기","doctorBanner.helpHint":"진단 정보가 미리 입력된 GitHub Issue를 엽니다","doctorBanner.preambleForIssue":"memesh doctor가 내 설치에서 다음을 발견했습니다:","doctorBanner.moreCount":"…외 {n}건 — 전체 목록은 `memesh doctor`로 확인하세요","doctorBanner.fix":"자동 수정","doctorBanner.fixInProgress":"수정 중…","doctorBanner.fixDone":"수정됨","doctorBanner.restartRequired":"업데이트를 완료하려면 에이전트를 다시 시작하세요.","doctor.label.readme_locale_parity":"README 번역","doctor.label.config":"설정 파일","doctor.label.mcp-config":"MCP 연결 파일","doctor.label.hooks-config":"훅 정의","doctor.label.hook-scripts":"훅 스크립트","doctor.label.hook-wiring":"Claude Code 연결","doctor.label.hook-activity":"자동 기록","doctor.label.node-runtime":"Node.js 버전","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"플러그인 코드 최신 여부","doctor.label.shell-cli":"터미널 명령어","doctor.label.dashboard":"대시보드 파일","doctor.label.claude-channel":"Claude 채널 등록","doctor.msg.claude-channel.unregistered.summary":"실시간 Claude 채널 알림이 활성화되어 있지 않습니다. MCP 메모리 도구와 영구 받은 편지함 메시지는 여전히 작동할 수 있습니다. 이 미리 보기는 선택 사항입니다.","doctor.msg.claude-channel.unregistered.fix":"이 선택적 채널을 활성화하려면 `memesh agent setup claude`를 실행한 다음, 표시된 MCP 명령을 Claude 사용자 설정에 등록하세요.","doctor.label.update-status":"업데이트","doctor.label.http-probe":"로컬 서버","doctor.label.skills-manifest":"번들 파일","doctor.label.config_parse":"설정 파일","doctor.label.install-channel":"설치 방법","doctor.label.fts_segmentation":"키워드 색인","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에 연결하는 파일(.claude-plugin/mcp.json)이 없습니다.","doctor.msg.mcp-config.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/mcp.json이 손상되어(올바른 JSON이 아님) Claude Code가 읽을 수 없습니다.","doctor.msg.mcp-config.invalid-json.fix":"{path}를 고치거나 MeMesh를 다시 설치하세요.","doctor.msg.mcp-config.no-entry.summary":".claude-plugin/mcp.json에 memesh 서버 항목이 더 이상 없습니다.","doctor.msg.mcp-config.no-entry.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json`이 실행하려는 파일이 이 설치에 없어서 Claude Code 안의 모든 memesh 도구가 시작되지 않습니다.","doctor.msg.mcp-config.entry-missing.fix":"MeMesh를 다시 설치하세요. `.claude-plugin/mcp.json`을 직접 고쳤다면 `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`로 되돌리세요.","doctor.msg.mcp-config.placeholder-unresolved.summary":"확인되지 않음: `.claude-plugin/mcp.json`이 실행하는 경로에 `${CLAUDE_PLUGIN_ROOT}`가 들어 있으며, 이 변수는 Claude Code 플러그인 실행 환경만 채워 넣습니다. 이 설치본은 플러그인으로 실행 중이 아니므로 그 파일은 검사하지 않았습니다.","doctor.msg.mcp-config.placeholder-unresolved.fix":"플러그인 실행 환경과 같은 방식으로 확인하세요: `CLAUDE_PLUGIN_ROOT=<이 설치 폴더> memesh doctor`를 실행합니다.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json이 없어서 자동 기억 저장이 동작하지 않습니다.","doctor.msg.hooks-config.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json이 손상되었습니다(올바른 JSON이 아님).","doctor.msg.hooks-config.invalid-json.fix":"{path}를 고치거나 MeMesh를 다시 설치하세요.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json에 다음 훅 유형이 없습니다: {types}. 일부 자동 기록이 실행되지 않습니다.","doctor.msg.hooks-config.missing-types.fix":"기본 제공 훅 구성을 복원하거나 MeMesh를 다시 설치하세요.","doctor.msg.hook-scripts.none.summary":"훅 설정에 스크립트가 하나도 없어서 아무것도 자동으로 기록되지 않습니다.","doctor.msg.hook-scripts.none.fix":"MeMesh를 다시 설치하세요.","doctor.msg.hook-scripts.missing.summary":"다음 훅 스크립트가 없습니다: {files}","doctor.msg.hook-scripts.missing.fix":"MeMesh를 다시 설치하면 복원됩니다.","doctor.msg.hook-scripts.not-executable.summary":"다음 훅 스크립트는 있지만 실행 권한이 없습니다: {files}","doctor.msg.hook-scripts.not-executable.fix":"`chmod +x scripts/hooks/*.js`를 실행하세요. 소스 설치라면 `npm run build`를 실행하세요.","doctor.msg.hook-wiring.no-marker.summary":"memesh가 아직 Claude Code에 연결되지 않아 아무것도 자동으로 기억되지 않습니다.","doctor.msg.hook-wiring.no-marker.fix":"`memesh install-hooks`를 한 번 실행한 뒤 `memesh doctor`로 확인하세요.","doctor.msg.hook-wiring.script-missing.summary":"연결된 memesh 훅이 {path}를 가리키지만 이 파일은 더 이상 존재하지 않습니다 — 에이전트가 해당 이벤트마다 없는 파일을 호출합니다. 보통 훅을 은퇴시킨 업그레이드가 남긴 잔재입니다.","doctor.msg.hook-wiring.script-missing.fix":"`memesh install-hooks`를 실행해 다시 연결하고(은퇴한 항목은 제거됩니다) 에이전트를 재시작하세요.","doctor.msg.hook-wiring.marker-unreadable.summary":"{path}의 연결 기록을 읽을 수 없습니다.","doctor.msg.hook-wiring.marker-unreadable.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.marker-malformed.summary":"연결 기록이 손상되었습니다.","doctor.msg.hook-wiring.marker-malformed.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.settings-missing.summary":"Claude Code 설정 파일({path})이 사라져 연결이 끊어졌습니다.","doctor.msg.hook-wiring.settings-missing.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.settings-invalid.summary":"{path}가 손상되었습니다(올바른 JSON이 아님).","doctor.msg.hook-wiring.settings-invalid.fix":"백업에서 복원하거나 `memesh install-hooks`로 다시 만드세요.","doctor.msg.hook-wiring.entries-removed.summary":"{path}에서 memesh 항목이 제거되어 연결이 끊어졌습니다.","doctor.msg.hook-wiring.entries-removed.fix":"`memesh install-hooks`를 다시 실행하세요.","doctor.msg.hook-wiring.root-moved.summary":"연결이 가리키는 {path}가 더 이상 존재하지 않습니다(memesh가 옮겨졌을 수 있음).","doctor.msg.hook-wiring.root-moved.fix":"`memesh install-hooks`를 실행해 갱신하세요.","doctor.msg.hook-activity.never-ran.summary":"추적을 시작한 뒤 {hours}시간 동안 캡처 훅이 한 번도 실행되지 않았습니다. 훅 연결은 정상이므로 실행되어야 할 것이 돌지 않고 있고, 아무것도 기억되지 않고 있습니다.","doctor.msg.hook-activity.never-ran.fix":"작업 세션을 한 번 마친 뒤 `memesh doctor`를 다시 실행하세요. 여전히 훅이 실행되지 않았다고 나오면 `memesh install-hooks`를 실행하고 에이전트를 재시작하세요.","doctor.msg.hook-activity.stale.summary":"마지막 캡처 훅 실행은 약 {hours}시간 전입니다({hook}). 그 뒤로 작업했다면 캡처가 멈춘 것이며 해당 세션의 내용은 저장되지 않았습니다.","doctor.msg.hook-activity.stale.fix":"에이전트를 재시작하고 세션을 한 번 마친 뒤 `memesh doctor`를 다시 실행하세요. 회복되지 않으면 `memesh install-hooks`를 실행하세요.","doctor.msg.hook-activity.stale-unconfirmed.summary":"session-summary 훅이 마지막으로 실행된 것은 약 {hours}시간 전이고, 지난 3일간 Claude Code의 쓰기도 없었습니다. 이 머신이 다른 에이전트(Codex / Gemini)로 옮겨갔다면 정상입니다. 여기서 아직 Claude Code를 쓰고 있다면 캡처가 멈춘 것입니다.","doctor.msg.hook-activity.stale-unconfirmed.fix":"이 머신에서 아직 Claude Code를 쓴다면: 재시작하고 세션을 한 번 끝낸 뒤 `memesh doctor`를 다시 실행하세요. 회복되지 않으면 `memesh install-hooks`를 실행하세요.","doctor.msg.hook-activity.query-failed.summary":'데이터베이스에서 훅 활동을 읽지 못했습니다: {detail}. 캡처 상태는 "알 수 없음"이며 이는 "정상"과 다릅니다.',"doctor.msg.hook-activity.query-failed.fix":"`memesh doctor --verbose`로 전체 오류를 확인하고 ~/.memesh를 읽을 수 있는지, 디스크가 가득 차지 않았는지 확인하세요.","doctor.msg.hook-activity.stale-unknown.summary":'{hook} 훅의 마지막 실행 시각을 읽을 수 없습니다(데이터 손상, 또는 시계가 어긋난 머신이 기록했을 수 있음). 캡처 상태는 "알 수 없음"이며, 이는 "정상"과 같지 않습니다.',"doctor.msg.hook-activity.stale-unknown.fix":"작업 세션을 한 번 끝낸 뒤 `memesh doctor`를 다시 실행하세요. 새 실행이 잘못된 타임스탬프를 덮어씁니다.","doctor.msg.hook-activity.disabled.summary":"자동 캡처가 꺼져 있습니다(MEMESH_AUTO_CAPTURE 또는 설정의 autoCapture). 의도된 설정이므로 훅이 조용한 것은 예상된 동작입니다. 다시 켜면 캡처가 재개됩니다.","doctor.msg.hook-activity.disabled-env.summary":"이 shell 환경의 MEMESH_AUTO_CAPTURE=false 때문에 자동 캡처가 꺼져 있습니다. doctor는 자신의 환경만 볼 수 있습니다 — 에이전트가 이 변수 없이 실행 중이라면 그쪽 캡처는 영향을 받지 않습니다.","doctor.msg.hook-activity.not-wired.summary":"캡처 훅이 한 번도 실행되지 않았습니다 — 그리고 이 머신에는 캡처 훅(Stop / PostToolUse / PreCompact)이 연결된 것이 확인되지 않아, 실행될 것이 애초에 없습니다.","doctor.msg.hook-activity.not-wired.fix":"자동 캡처를 원하면 `memesh install-hooks`를 실행하세요. MCP 전용 설치(Codex / Gemini)라면 정상이며 무시해도 됩니다.","doctor.msg.hook-activity.stop-silent.summary":"{hook} 훅은 기록되고 있지만, 추적을 시작한 지 {hours}시간 동안 session-summary 훅은 한 번도 실행되지 않았습니다. 커밋 캡처에 가려져 세션 캡처가 고장 났을 수 있습니다.","doctor.msg.hook-activity.stop-silent.fix":"작업 세션을 한 번 끝내고 `memesh doctor`를 다시 실행하세요. 그래도 session-summary가 실행되지 않았다면 `memesh install-hooks`를 실행하고 에이전트를 재시작하세요.","doctor.label.capture-liveness":"기록이 계속되는지","doctor.msg.capture-liveness.silent-hook.summary":"{hook}: {runs}번 실행, 0번 기록 — 이유는 '{reason}'입니다. 훅은 살아 있지만 매번 저장할 것이 없다고 판단하고 있으며, 캡처가 망가졌을 때도 똑같이 보입니다.","doctor.msg.capture-liveness.silent-hook.fix":"`memesh doctor --json`으로 훅별 수치를 확인하세요. 그 이유가 실제 사용 방식과 맞지 않으면 `memesh install-hooks`를 실행하고 에이전트를 재시작하세요.","doctor.msg.capture-liveness.type-stopped.summary":"최근 7일 동안 '{type}' 유형이 하나도 저장되지 않았습니다(그 전 7일은 {prev}건). 기억되던 것이 더 이상 기억되지 않고 있습니다.","doctor.msg.capture-liveness.type-stopped.fix":"`memesh doctor --json`으로 훅별 수치를 확인하고 작업 방식이 바뀌었는지 살펴보세요. 바뀌지 않았다면 `memesh install-hooks`를 실행하고 에이전트를 재시작하세요.","doctor.msg.capture-liveness.never-ran.summary":"추적을 시작한 뒤 {hours}시간 동안 {hook} 훅은 기록도 하트비트도 남기지 않았습니다. 한 번도 실행되지 않았으므로 이 훅이 담아야 할 것은 아무것도 저장되지 않았습니다.","doctor.msg.capture-liveness.never-ran.fix":"`memesh install-hooks`를 실행하고 에이전트를 재시작한 뒤, 작업 세션을 한 번 끝내고 `memesh doctor`를 다시 실행하세요.","doctor.msg.capture-liveness.not-wired.summary":"{hook} 훅은 한 번도 실행되지 않았지만 이 컴퓨터에는 캡처 훅이 연결되어 있지 않습니다.","doctor.msg.capture-liveness.not-wired.fix":"자동 캡처를 원하면 `memesh install-hooks`를 실행하세요. MCP 전용(Codex, Gemini, Cursor)이라면 정상입니다.","doctor.msg.capture-liveness.never-ran-legacy.summary":"{hook} 훅의 결과 기록은 없지만 추적 시작 후 자동 캡처 메모리 {captured}개가 저장되었습니다. 이전 버전 훅이 실행 중일 수 있습니다.","doctor.msg.capture-liveness.never-ran-legacy.fix":"MeMesh 훅을 업데이트하고 에이전트를 재시작한 뒤 `memesh doctor`를 다시 실행하세요.","doctor.msg.capture-liveness.query-failed.summary":"데이터베이스에서 캡처 상태를 읽지 못했습니다: {detail}. 무언가 저장되고 있는지 알 수 없으며, 모른다는 것은 정상과 다릅니다.","doctor.msg.capture-liveness.query-failed.fix":"오류는 위에 인용되어 있습니다. ~/.memesh를 읽을 수 있는지, 디스크가 가득 차지 않았는지 확인하세요.","doctor.msg.hook-activity.never-ran-legacy.summary":"하트비트를 기록한 훅은 없지만 추적 시작 이후 {captured}개의 자동 캡처 기억이 저장되었습니다. 하트비트 기능 이전의 구버전 훅이 아직 실행 중일 가능성이 높습니다.","doctor.msg.hook-activity.never-ran-legacy.fix":"memesh 훅을 현재 버전으로 업데이트하고(플러그인: `/plugin update memesh`, npm: `memesh install-hooks`) 에이전트를 재시작하세요.","doctor.msg.node-runtime.too-old.summary":"사용 중인 Node.js가 이 패키지가 지원하는 버전보다 오래되었습니다. {detail}","doctor.msg.node-runtime.too-old.fix":"Node.js를 {required} 이상으로 올린 뒤 `memesh doctor`를 다시 실행하세요.","doctor.msg.native-binding.load-failed.summary":"SQLite가 데이터베이스를 열지 못했습니다: {detail}.","doctor.msg.native-binding.load-failed.fix":"Node 실행 환경을 확인하고 필요한 경우 MeMesh를 다시 설치하세요.","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.shell-cli.versions.summary":"설치된 버전: 이 인터페이스 {current}; 터미널 {terminal}.","doctor.msg.plugin-cache.stale.summary":"플러그인은 커밋 {installed}에서 설치되었지만 marketplace는 같은 버전으로 {marketplace}까지 진행되었습니다. 버전이 바뀌지 않으면 {host}는 캐시를 갱신하지 않으므로 marketplace보다 오래된 코드를 실행 중입니다.","doctor.msg.plugin-cache.stale.fix":"`{command}`을 실행해 캐시를 갱신한 뒤 {host}를 재시작하세요.","doctor.msg.plugin-cache.unverifiable.summary":"설치된 플러그인이 marketplace와 일치하는지 확인할 수 없습니다. 버전만으로는 알 수 없습니다 — 서로 다른 빌드가 같은 버전을 가질 수 있습니다.","doctor.msg.plugin-cache.unverifiable.fix":"`{command}`을 한 번 실행하세요. 커밋이 기록되어 이 검사가 판단할 수 있게 됩니다.","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.config-parse.retired-settings.summary":"{path}은(는) 유효한 설정 파일이지만 사용 중단된 최상위 설정 {count}개가 남아 있습니다({keys}). 이 버전은 이를 무시하지만 이전 공급자 자격 증명이나 설정이 디스크에 남아 있을 수 있습니다.","doctor.msg.config-parse.retired-settings.fix":"{path}을(를) 로컬에서 검토하고 사용 중단된 최상위 키만 제거하세요. 자격 증명이 포함될 수 있으므로 issue에 파일을 붙여 넣지 마세요. 그런 다음 memesh doctor를 다시 실행하세요.","doctor.msg.message-capability.probe-failed.summary":"설치된 메시지 기능 점검에 실패했습니다: {detail}.","doctor.msg.message-router.socket-missing.summary":"{path}에 Local router socket이 없습니다. 중지되었거나 존재하지 않는 세션은 깨우지 않습니다.","doctor.msg.message-router.socket-insecure.summary":"{path}의 router socket이 소유자 전용 Unix socket이 아닙니다.","doctor.msg.message-router.socket-unreachable.summary":"{path}의 소유자 전용 router socket이 있지만 로컬 연결을 받지 않았습니다.","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.citation.none.summary":"세션에 메모리가 주입되었지만 인용된 것이 없습니다.","doctor.msg.citation.none.fix":"~/.claude/rules/memesh-citations.md의 인용 규약을 확인한 뒤 몇 세션 후 다시 확인하세요.","doctor.msg.database.broken.summary":"데이터베이스를 사용할 수 없습니다: {detail}","doctor.update_status.prerelease":"사전 출시 버전({current})을 실행 중입니다. npm 최신 버전은 {latest}입니다.","patterns.title":"나의 패턴","patterns.workSchedule":"작업 일정","patterns.peakHours":"피크 시간대","patterns.busiestDays":"가장 바쁜 요일","patterns.workflow":"워크플로우","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.auth.cross-origin":"이 요청은 다른 사이트에서 왔거나 예상치 못한 이름으로 서버에 도달해 거부되었습니다. `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.rate.limited":"짧은 시간에 요청이 너무 많습니다. 잠시 후 다시 시도하세요.","httpError.server.internal":"서버에서 예기치 않은 오류가 발생했습니다.","httpError.operation.permission-denied":"MeMesh에 이 복구에 필요한 파일을 수정할 권한이 없습니다. 이 대시보드를 닫고 본인의 터미널에서 `memesh serve`를 실행한 뒤 다시 시도하세요. 계속 실패하면 `memesh doctor`를 실행하세요.","time.justNow":"방금","time.hoursAgo":"{count}시간 전","time.today":"오늘","time.yesterday":"어제","time.daysAgo":"{count}일 전","time.lastWeek":"지난주","time.weeksAgo":"{count}주 전","time.lastMonth":"지난달","time.monthsAgo":"{count}개월 전","memory.access.frequent":"자주 사용 · {count}회","memory.access.recalls":"{count}회 회상","memory.access.never":"회상 안 됨","cluster.knowledge":"지식","cluster.activity":"활동","cluster.session":"세션","cluster.reference":"참조","cluster.all":"전체","browse.filterTime":"시간","browse.filterValue":"가치","browse.filterProject":"프로젝트","browse.filterSort":"정렬","browse.timeToday":"오늘","browse.timeWeek":"이번 주","browse.timeMonth":"이번 달","browse.timeOlder":"이전","browse.valueRecalled":"✓ 사용됨","browse.valueNever":"회상 안 됨","browse.sortMostRecalled":"자주 회상","browse.sortRecent":"최근 사용","browse.sortCreated":"생성 시간","browse.emptyFilter":"이 카테고리에 기억이 없습니다 — 필터를 변경해 보세요","lessons.stepsLabel":"단계","lessons.commitsCount":"{count}개 커밋","lessons.unstructured":"(구조화된 필드 없음 — 원본 기억 참조)","lessons.moreItems":"+{count}개","roadmap.title":"프로젝트 이력","roadmap.summary":"{count}개 기억 · {first} → {last}","roadmap.switchToList":"↩ 목록 보기","roadmap.switchToRoadmap":"🕘 이력 보기","roadmap.emptyProject":"이 프로젝트에는 아직 기억이 없습니다.","loop.label":"기억 루프","loop.subtitleHas":"지난 7일간 회상된 지식 기억","loop.subtitleNone":"이번 주 회상된 지식이 없습니다 — 교훈을 떠올려 보세요","loop.approxNote":"근사치 — 완전한 추적은 업그레이드 후 시작됩니다","loop.sparkLabel":"지난 30일","roadmap.milestones":"마일스톤","roadmap.keyLessons":"주요 교훈","radar.title":"지식 커버리지 레이더","radar.caption":"활성 지식 기억 (session 과 commit 제외)","radar.axis.lessons":"교훈","radar.axis.decisions":"결정","radar.axis.patterns":"패턴","radar.axis.bugs":"버그 수정","radar.axis.processes":"프로세스","radar.axis.architecture":"아키텍처","ageMatrix.title":"기억 연령 분포","ageMatrix.low":"낮음","ageMatrix.high":"높음","ageMatrix.legend":"색상 깊이 = 기억 밀도","ageMatrix.typeColumn":"유형","header.signalModeOn":"중요 기억","header.signalModeOff":"모든 기억","header.signalModeOnHint":"목표, 결정, 교훈, 계획을 표시하고 기억에서 자동 수집된 session, commit, 활동 기록을 숨깁니다.","header.signalModeOffHint":"기억에서 자동 수집된 session, commit, 활동 기록을 포함한 모든 기록을 표시합니다.","globalFilter.focusedStatus":"전체 보기: 중요 기억 — 기억에서 자동 수집된 session, commit, 활동 기록을 숨겼습니다.","globalFilter.allStatus":"전체 보기: 모든 기억 — 기억에 자동 수집된 session, commit, 활동 기록도 포함합니다.","roadmap.phases":"단계","onboarding.title":"MeMesh 에 오신 것을 환영합니다","onboarding.body":"기억 저장소가 비어 있습니다. 30개 큐레이션된 투어로 시작하거나 첫 교훈을 저장하세요.","onboarding.coreHint":"로컬 메모리: remember, FTS5 키워드 검색, 훅, 대시보드 탐색이 함께 작동합니다.","onboarding.searchHint":"검색은 로컬 FTS5 키워드 검색을 사용합니다.","onboarding.reviewHint":"실행 중인 에이전트는 다이제스트 또는 표시 가능한 대화 기록 작업 패키지를 준비할 수 있으며, 대시보드는 스테이징된 제안만 검토합니다.","onboarding.seedButton":"데모 투어 시작","onboarding.seedingButton":"시드 중…","onboarding.seedHint":"터미널 없이 여기서 30개 추가, 나중에 한 번에 삭제 가능","onboarding.cliReference":"CLI 를 선호하시나요?","onboarding.hintDemo":"30개 데모 기억을 시드(나중에 제거 가능)","onboarding.hintReset":"metadata.demo 태그가 있는 모든 항목 제거","onboarding.resetButton":"데모 제거","onboarding.resettingButton":"제거 중…","onboarding.demoLoadedTitle":"데모 데이터가 로드됨","onboarding.demoLoadedBody":"demo 태그가 있는 기억 {count}개가 있습니다. 여기서는 그 기억만 제거할 수 있습니다.","onboarding.resetConfirm":"metadata.demo 태그가 있는 모든 기억을 제거할까요? 동일한 행은 복원할 수 없지만 나중에 새 데모를 다시 불러올 수 있습니다. 실제 기억은 유지됩니다.","onboarding.resetReadbackFailed":"demo 태그 기억이 남아 있어 재설정을 확인하지 못했습니다. 정리 작업은 계속 표시됩니다. 다시 시도하거나 memesh doctor를 실행하세요.","onboarding.dismiss":"닫기","common.serverError":"서버가 오류를 반환했습니다 (HTTP {status}). 다시 시도해 보세요. 계속되면 `memesh doctor`를 실행하세요.","emptyLibrary.title":"메모리가 비어 있습니다","emptyLibrary.body":"아직 저장된 것이 없습니다. 30개 데모 투어를 불러와 MeMesh의 동작을 바로 확인해 보세요. 나중에 한 번에 삭제할 수 있습니다.","browse.truncated":"전체 {total}개 중 처음 {shown}개 표시 중 — 나머지는 검색이나 필터로 찾아보세요","browse.truncatedUnknownTotal":"처음 {shown}개 표시 중 — 전체 개수를 읽을 수 없어 더 있을 수 있습니다","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":'지원되는 설치 경로에서는 처음 사용할 때 한 번 동의를 확인한 뒤 업데이트합니다. "나중에"는 해당 버전을 보류하고(24시간, 다시 거절하면 48시간, 이후 7일), "다시 묻지 않기"는 확인을 끕니다. 다른 경로는 각자의 업데이트 방법을 표시합니다. 업그레이드 후 실행 중인 호스트는 재시작할 때까지 이전 버전을 유지합니다. MEMESH_AUTO_UPDATE는 허용 범위만 정하며 동의를 우회하지 않습니다.',"errors.timeout":"요청 시간이 초과되었습니다","type.lesson_learned":"교훈","type.lesson":"교훈","type.mistake":"실수","type.decision":"결정","type.goal":"목표","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":"인물","patterns.day.0":"일요일","patterns.day.1":"월요일","patterns.day.2":"화요일","patterns.day.3":"수요일","patterns.day.4":"목요일","patterns.day.5":"금요일","patterns.day.6":"토요일","lessons.severity.critical":"치명적","lessons.severity.major":"중대","lessons.severity.minor":"경미","memory.tooltip.project":"프로젝트","memory.tooltip.recalled":"{count}회 회상됨","memory.tooltip.hasRelations":"{count}개 기억과 연결됨","memory.tooltip.createdAt":"생성: {date}","common.unknown":"알 수 없음","insights.entitiesCount":"엔터티 {n}개","roadmap.viewToggle":"프로젝트 이력 보기","roadmap.viewTree":"트리","roadmap.viewMindmap":"마인드맵","roadmap.mindmapNeedsPhases":"마인드맵에는 7일 이내의 기억이 3개 이상 필요합니다.","roadmap.activePhase":"진행 중","roadmap.entryCount":"{count}개","roadmap.entriesCount":"{count}개","roadmap.otherGroup":"기타 ({count})","roadmap.lowSignalHidden":"(저신호 {count}개 숨김)","roadmap.resetHint":"확대/축소 및 위치 재설정 (배경 더블 클릭도 가능)","roadmap.zoomHint":"스크롤로 확대/축소 · 드래그로 이동 · {pct}%","roadmap.moreEntities":"외 {count}개","roadmap.viewDecisions":"결정","roadmap.densityTitle":"카테고리별 캡처 밀도","roadmap.densityNote":"memesh가 캡처한 것일 뿐, 일어난 모든 일은 아닙니다","roadmap.lineageSupersedes":"대체됨 {n}개","roadmap.lineageConflicts":"미해결 충돌 {n}개","adr.empty":'이 프로젝트에는 아직 기록된 결정이 없습니다. 타입 "decision"으로 하나 기록하면 히스토리와 함께 여기에 표시됩니다.',"adr.statusActive":"현행","adr.statusSuperseded":"대체됨","adr.supersedes":"대체된 결정","adr.supersededBy":"대체한 결정","nav.ariaLabel":"대시보드 섹션","feedback.descLabel":"피드백 내용","doctor.msg.capture-liveness.no-records.summary":"이 컴퓨터에서 훅이 실행되었지만(마지막 하트비트 {hours}시간 전) 결과 기록을 남긴 훅이 하나도 없습니다. 실행 중인 훅이 결과 기록 이전 버전이거나, 로드할 때 실패해서 아무것도 기록하지 못했을 수 있습니다.","doctor.msg.capture-liveness.no-records.fix":"MeMesh 훅을 업데이트하고(플러그인: `/plugin update memesh`, npm: `memesh install-hooks`) 에이전트를 다시 시작한 뒤, 세션을 한 번 시작하고 `memesh doctor`를 다시 실행하세요.","project.index.title":"여기서 이미 알고 있는 것","project.index.empty":"이 프로젝트에는 아직 자동으로 주입되는 기억이 없습니다. 가져온 기억, untrusted로 표시된 기억, `project:` 태그가 없는 기억은 여기에 포함되지 않습니다 — 위의 프로젝트 칩에 표시된 수가 더 클 수 있습니다. `remember`로 저장한 결정, 교훈, 패턴, 참고 자료가 여기에 표시됩니다.","project.index.more":'{n}개 더 — `memesh recall --tag "project:…"`',"project.index.older":"오래된 기억 {n}개({days}일 동안 변경 없음) — recall로 확인하세요","project.index.cost":"에이전트가 세션 시작 시 받는 색인과 같습니다 · 약 {tokens} 토큰({bytes} 바이트)"},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","header.memory":"memória","insights.title":"Sugestões de organização da memória","insights.reviewTitle":"Propostas de memória preparadas","insights.reviewSubtitle":"pacotes de trabalho aguardando revisão humana","insights.reviewSource":"Proposta preparada — revise antes de aplicar","insights.source.calendar":"Resumo por calendário","insights.source.transcript":"Transcrição do Claude Code","insights.reviewBoundary":"O Dashboard revisa propostas já preparadas. Ele não executa nem despacha agentes.","insights.statPending":"pendente","insights.statApplied":"aplicada","insights.statRejected":"rejeitada","insights.filter.pending":"Pendente","insights.filter.applied":"Aplicada","insights.filter.rejected":"Rejeitada","insights.filter.all":"Todos","insights.refresh":"Atualizar","insights.loading":"carregando…","insights.emptyOther":"Nada aqui.","insights.sources":"fontes","insights.status.pending":"pendente","insights.status.applied":"aplicada","insights.status.rejected":"rejeitada","insights.viewDetail":"Ver detalhes","insights.collapse":"Recolher","insights.accept":"Aceitar","insights.applying":"Aplicando…","insights.reject":"Rejeitar","insights.rejectConfirm":"Rejeitar este insight? Esta ação não pode ser desfeita.","insights.observations":"Observações resumidas","insights.tags":"Tags","insights.sourceIds":"Fontes","insights.validationWarnings":"Avisos de validação antigos","insights.validationClaim":"Afirmação","insights.validationReason":"Motivo","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.settings":"Configurações","tab.home":"Início","tab.memories":"Memórias","tab.project":"Projeto","memories.searchPlaceholder":"Filtre enquanto digita — pressione Enter para busca por relevância","memories.scopeLabel":"Escopo","memories.scopeWork":"Camada de trabalho","memories.scopeEvidence":"Evidência","memories.scopeAll":"Todas","memories.scopeArchived":"Arquivadas","memories.composition":"Composição","memories.rankedBy":"ordenadas por relevância","memories.backToList":"Voltar à lista","memories.workEmpty":"Ainda não há memórias da camada de trabalho — metas, decisões, lições e planos aparecem aqui à medida que são capturados.","memories.showAll":"Mostrar todas as memórias","memories.expand":"Mostrar detalhes","memories.collapse":"Ocultar detalhes","memory.technicalDetails":"Detalhes técnicos","memory.canonicalName":"Nome canônico","memory.rawType":"Tipo bruto","home.analyticsTitle":"Análise","handoff.terminal":"Requer Terminal","handoff.terminalPrereq":"Execute na máquina onde o MeMesh está instalado. O Dashboard não executará o comando.","handoff.copyCommand":"Copiar comando","handoff.commandCopied":"Comando copiado","handoff.github":"Abre o GitHub — revise o issue preenchido antes de enviar","home.analyticsHint":"Saúde, linha do tempo, padrões e uso — expande sob demanda","home.nextAction.eyebrow":"Próxima etapa recomendada","home.nextAction.why":"Por quê:","home.nextAction.result":"Resultado esperado:","home.nextAction.loading.title":"Verificando o que precisa de atenção…","home.nextAction.loading.why":"O MeMesh está lendo a memória, o índice de busca e a fila de revisão atuais.","home.nextAction.loading.result":"Uma única recomendação aparecerá após as verificações.","home.nextAction.empty.title":"Adicione sua primeira memória","home.nextAction.empty.why":"A memória está vazia, portanto ainda não há o que buscar ou organizar.","home.nextAction.empty.result":"Em Memórias, carregue uma demonstração removível ou comece a registrar trabalho real.","home.nextAction.empty.action":"Abrir Memórias","insights.emptyPending":"Ainda não há revisões pendentes. Novas revisões de memória aparecerão aqui quando estiverem disponíveis.","home.nextAction.insights.title":"Revise sugestões de organização","home.nextAction.insights.why":"O MeMesh tem sugestões aguardando sua decisão.","home.nextAction.insights.result":"Aceite resumos úteis ou rejeite sugestões inadequadas.","home.nextAction.insights.action":"Revisar sugestões","home.nextAction.healthy.title":"Nenhuma ação necessária agora","home.nextAction.healthy.why":"Memória, índice e fila de revisão não têm ações conhecidas pendentes.","home.nextAction.healthy.result":"Continue trabalhando; o MeMesh mostrará aqui a próxima necessidade confirmada.","home.nextAction.unavailable.title":"Recomendação indisponível no momento","home.nextAction.unavailable.why":"Uma verificação não pôde ser lida, então o MeMesh não vai adivinhar.","home.nextAction.unavailable.result":"Recarregue para tentar novamente sem alterar memórias ou configurações.","home.nextAction.unavailable.action":"Tentar verificações novamente","project.selectLabel":"Projeto","project.selectPrompt":"Escolha um projeto para ver seu histórico.","project.empty":"Ainda não há memórias de projeto. Trabalhe em um repositório git com os hooks do memesh instalados e a história dele aparecerá aqui.","project.taskState.title":"Onde este projeto está","project.taskState.goal":"Objetivo","project.taskState.next":"Próximo passo","project.taskState.blocked":"Bloqueado","project.taskState.done":"Concluído","project.taskState.updated":"Atualizado {when}","project.taskState.provenance":"Declarado com `memesh task` — não inferido a partir de contagens de memórias.","project.taskState.empty":"Ainda não há estado de tarefa para este projeto. Defina-o numa sessão com `memesh task --goal … --next …` e ele aparecerá aqui.","guard.sourceLesson":"Lição de origem","guard.pattern":"Padrão de disparo","guard.message":"Aviso que será exibido","guard.shouldMatch":"Deve disparar em","guard.shouldNotMatch":"Deve ficar em silêncio em","search.button":"Buscar","search.searching":"Buscando…","search.results":"resultados","search.result":"resultado","search.noResults":"Nenhum resultado para","search.facts":"fatos","browse.title":"Todas as Memórias","browse.active":"ativas","browse.archived":"arquivadas","browse.refresh":"Atualizar","browse.noMatch":"Nenhuma memória corresponde a","browse.prev":"← Anterior","browse.next":"Próximo →","browse.archive":"Arquivar","browse.restore":"Restaurar","browse.confirmArchive":"Arquivar esta memória?","browse.archiveFailed":"Não foi possível arquivar a memória: {message}","browse.restoreFailed":"Não foi possível restaurar a memória: {message}","analytics.totalMemories":"Total de Memórias","analytics.knowledgeFacts":"Fatos","analytics.connections":"Conexões","analytics.topics":"Tópicos","analytics.insights":"Insights","analytics.thisWeek":"Esta semana","analytics.new":"novas","analytics.stale":"Inativas (30+ dias sem uso)","analytics.archivedLabel":"Arquivadas","analytics.mostRecalled":"Mais Consultadas","health.title":"Saúde da Memória","metrics.notMeasured":"Ainda não medido","metrics.health":"Saúde","metrics.healthNote":"Atividade, qualidade, frescura, lições","metrics.critical":"Lições críticas","metrics.criticalPartial":"de {tagged} classificadas · {total} lições no total","metrics.criticalAll":"de {total} lições, todas classificadas","metrics.criticalUnclassified":"{total} lições, nenhuma classificada por severidade","metrics.criticalNoLessons":"Ainda não há lições registadas","metrics.citation":"Citações","metrics.citationNote":"{cited} de {total} sessões citaram uma memória","metrics.citationNotMeasured":"O registo de citações começa na próxima sessão","metrics.reused":"Reutilizadas esta semana","metrics.reusedNote":"Aproximado — contado pelas datas de último acesso","health.excellent":"Excelente","health.good":"Bom","health.fair":"Regular","health.poor":"Fraco","health.activity":"Atividade","health.quality":"Qualidade","health.freshness":"Frescor","health.lessons":"Auto-melhoria","timeline.title":"Últimos 30 Dias","timeline.created":"Criadas","timeline.recalled":"Recuperadas","value.totalRecalls":"Total de Recuperações","value.lessonsLearned":"Lições Aprendidas","value.lessonsSaved":"Lições Aplicadas","value.coverage":"Cobertura de Conhecimento","cleanup.title":"Sugestões de Limpeza","cleanup.allClean":"Sua memória está limpa. Nenhuma entidade obsoleta ou duplicada detectada.","cleanup.staleLabel":"Baixa confiança / não usado","cleanup.duplicateLabel":"Possíveis duplicatas","cleanup.confidence":"confiança","cleanup.unused":"não usado","cleanup.entityMeta":"{type} · confiança {confidence}% · {days}d sem uso","settings.saved":"Salvo.","settings.configLoadFailed":"Não foi possível ler as configurações. Recarregue a página para tentar novamente.","settings.configReadbackFailed":"O servidor não retornou a configuração salva. Tente novamente.","settings.language":"Idioma","settings.interfaceLanguage":"Idioma da interface","settings.interfaceLanguageHint":"Altera imediatamente a interface neste navegador.","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":"Não há uma versão publicada 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":"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.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.updateRetryGuidance":"Verifique sua conexão e as configurações do registro npm e tente novamente. Sua versão instalada não foi alterada.","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.","settings.installationDetails":"Detalhes da instalação","settings.installationDetailsUnavailable":"Não é possível comparar versões nesta instalação.","settings.interfacePath":"Esta interface","settings.terminalPath":"Comando no terminal","settings.technicalDetails":"Detalhes técnicos","settings.installationDetailsHint":"Versões instaladas diferentes não exigem necessariamente uma atualização. Consulte Atualizações para ver as versões publicadas.","roadmap.resetView":"Redefinir vista","lessons.error":"Erro","lessons.rootCause":"Causa Raiz","lessons.fix":"Correção","lessons.prevention":"Prevenção","feedback.button":"💬 Feedback","feedback.title":"Abrir feedback no GitHub","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…","feedback.popupBlocked":"O GitHub não abriu. Seu rascunho foi preservado; permita pop-ups, tente novamente ou copie o link preparado.","feedback.retry":"Tentar abrir o GitHub novamente","feedback.copyLink":"Copiar link do GitHub","feedback.linkCopied":"Link copiado","feedback.copyFailed":"Não foi possível copiar o link. Tente abrir o GitHub novamente.","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","doctorBanner.fix":"Corrigir automaticamente","doctorBanner.fixInProgress":"Corrigindo…","doctorBanner.fixDone":"Corrigido","doctorBanner.restartRequired":"Reinicie o agente para concluir esta atualização.","doctor.label.readme_locale_parity":"Traduções do README","doctor.label.config":"Arquivo de configuração","doctor.label.mcp-config":"Arquivo de conexão MCP","doctor.label.hooks-config":"Definições de hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Conexão com o Claude Code","doctor.label.hook-activity":"Captura automática","doctor.label.node-runtime":"Versão do Node.js","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Código do plugin está atual","doctor.label.shell-cli":"Comando no terminal","doctor.label.dashboard":"Arquivos do painel","doctor.label.claude-channel":"Registro do Canal Claude","doctor.msg.claude-channel.unregistered.summary":"As notificações ao vivo do Canal Claude não estão ativadas. As ferramentas de memória do MCP e a caixa de entrada de mensagens durável ainda podem funcionar. Esta pré-visualização é opcional.","doctor.msg.claude-channel.unregistered.fix":"Para ativar este canal opcional, execute `memesh agent setup claude` e depois registre o comando MCP exibido nas configurações de usuário do seu Claude.","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.install-channel":"Método de instalação","doctor.label.fts_segmentation":"Índice de palavras-chave","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 (.claude-plugin/mcp.json) está faltando.","doctor.msg.mcp-config.missing.fix":"Reinstale o MeMesh para restaurá-lo.","doctor.msg.mcp-config.invalid-json.summary":"O .claude-plugin/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 .claude-plugin/mcp.json não contém mais a entrada do servidor memesh.","doctor.msg.mcp-config.no-entry.fix":"Reinstale o MeMesh para restaurá-la.","doctor.msg.mcp-config.entry-missing.summary":"O `.claude-plugin/mcp.json` inicia um arquivo que não existe nesta instalação, então nenhuma ferramenta do memesh dentro do Claude Code consegue iniciar.","doctor.msg.mcp-config.entry-missing.fix":"Reinstale o MeMesh. Se você editou o `.claude-plugin/mcp.json` à mão, aponte-o de volta para `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.mcp-config.placeholder-unresolved.summary":"NÃO VERIFICADO: o `.claude-plugin/mcp.json` inicia um caminho que contém `${CLAUDE_PLUGIN_ROOT}`, uma variável que só o runtime de plugins do Claude Code preenche. Esta cópia não está sendo executada como plugin, então o arquivo indicado não foi conferido.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Confira do mesmo jeito que o runtime de plugins faria: execute `CLAUDE_PLUGIN_ROOT=<a pasta desta instalação> memesh doctor`.","doctor.msg.hooks-config.missing.summary":"O hooks/hooks.json está faltando, então a captura automática de memória não funciona.","doctor.msg.hooks-config.missing.fix":"Reinstale o MeMesh para restaurá-lo.","doctor.msg.hooks-config.invalid-json.summary":"O hooks/hooks.json está danificado (não é um JSON válido).","doctor.msg.hooks-config.invalid-json.fix":"Corrija {path} ou reinstale o MeMesh.","doctor.msg.hooks-config.missing-types.summary":"O hooks/hooks.json não tem estes tipos de hook: {types}. Parte da captura automática não vai rodar.","doctor.msg.hooks-config.missing-types.fix":"Restaure a configuração de hooks original ou reinstale o MeMesh.","doctor.msg.hook-scripts.none.summary":"A configuração de hooks não tem nenhum script, então nada pode ser capturado automaticamente.","doctor.msg.hook-scripts.none.fix":"Reinstale o MeMesh.","doctor.msg.hook-scripts.missing.summary":"Estes scripts de hook estão faltando: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstale o MeMesh para restaurá-los.","doctor.msg.hook-scripts.not-executable.summary":"Estes scripts de hook existem, mas não têm permissão para executar: {files}","doctor.msg.hook-scripts.not-executable.fix":"Execute `chmod +x scripts/hooks/*.js`, ou `npm run build` se estiver usando o código-fonte.","doctor.msg.hook-wiring.no-marker.summary":"O memesh ainda não está conectado ao Claude Code, então nada é lembrado automaticamente.","doctor.msg.hook-wiring.no-marker.fix":"Execute `memesh install-hooks` uma vez e depois `memesh doctor` para confirmar.","doctor.msg.hook-wiring.script-missing.summary":"Um hook memesh ligado aponta para {path}, que já não existe — o agente invoca um ficheiro inexistente em cada evento correspondente. Normalmente é resíduo de um upgrade que aposentou o hook.","doctor.msg.hook-wiring.script-missing.fix":"Execute `memesh install-hooks` para religar (remove entradas aposentadas) e reinicie o agente.","doctor.msg.hook-wiring.marker-unreadable.summary":"O registro de conexão em {path} não pode ser lido.","doctor.msg.hook-wiring.marker-unreadable.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.marker-malformed.summary":"O registro de conexão está danificado.","doctor.msg.hook-wiring.marker-malformed.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.settings-missing.summary":"O arquivo de configurações do Claude Code ({path}) sumiu, então a conexão está quebrada.","doctor.msg.hook-wiring.settings-missing.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} está danificado (não é um JSON válido).","doctor.msg.hook-wiring.settings-invalid.fix":"Restaure de um backup, ou execute `memesh install-hooks` para recriá-lo.","doctor.msg.hook-wiring.entries-removed.summary":"As entradas do memesh foram removidas de {path}, então a conexão está quebrada.","doctor.msg.hook-wiring.entries-removed.fix":"Execute `memesh install-hooks` de novo.","doctor.msg.hook-wiring.root-moved.summary":"A conexão aponta para {path}, que não existe mais (o memesh provavelmente foi movido).","doctor.msg.hook-wiring.root-moved.fix":"Execute `memesh install-hooks` para atualizá-la.","doctor.msg.hook-activity.never-ran.summary":"Nenhum hook de captura foi executado nas {hours} horas desde que o acompanhamento começou, mesmo com a ligação dos hooks no lugar — nada está a ser guardado.","doctor.msg.hook-activity.never-ran.fix":"Termine uma sessão de trabalho e execute `memesh doctor` outra vez. Se continuar a dizer que nenhum hook correu, execute `memesh install-hooks` e reinicie o agente.","doctor.msg.hook-activity.stale.summary":"O último hook de captura correu há cerca de {hours} horas ({hook}). Se trabalhou desde então, a captura parou e nada dessas sessões foi guardado.","doctor.msg.hook-activity.stale.fix":"Reinicie o agente, termine uma sessão e execute `memesh doctor` outra vez. Se não recuperar, execute `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"O hook session-summary executou pela última vez há cerca de {hours} horas, e nenhuma escrita do Claude Code chegou nos últimos 3 dias. Se esta máquina passou a usar outro agente (Codex / Gemini), isto é esperado; se você ainda usa Claude Code aqui, a captura parou.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Se você ainda usa Claude Code nesta máquina: reinicie-o, termine uma sessão e execute `memesh doctor` de novo. Se não recuperar, execute `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Não foi possível ler a atividade dos hooks na base de dados: {detail}. O estado da captura é desconhecido, o que não é o mesmo que saudável.","doctor.msg.hook-activity.query-failed.fix":"Execute `memesh doctor --verbose` para ver o erro completo e verifique que ~/.memesh é legível e que há espaço em disco.","doctor.msg.hook-activity.stale-unknown.summary":'O timestamp da última execução do hook {hook} não pode ser lido (corrompido, ou gravado por uma máquina com relógio errado). O estado da captura é "desconhecido", o que não é o mesmo que "saudável".',"doctor.msg.hook-activity.stale-unknown.fix":"Termine uma sessão de trabalho e execute `memesh doctor` de novo — uma execução nova sobrescreve o timestamp inválido.","doctor.msg.hook-activity.disabled.summary":"A captura automática está desligada (MEMESH_AUTO_CAPTURE ou autoCapture na configuração) — deliberadamente, então o silêncio dos hooks é esperado. Reative para voltar a capturar sessões.","doctor.msg.hook-activity.disabled-env.summary":"A captura automática está desligada por MEMESH_AUTO_CAPTURE=false no ambiente deste shell. O doctor só enxerga o próprio ambiente — se o seu agente roda sem esta variável, a captura lá não é afetada.","doctor.msg.hook-activity.not-wired.summary":"Nenhum hook de captura jamais executou — e nenhum hook de captura (Stop / PostToolUse / PreCompact) está confirmado como ligado nesta máquina, então não há nada para executar.","doctor.msg.hook-activity.not-wired.fix":"Se quiser captura automática, execute `memesh install-hooks`. Se esta instalação é só MCP (Codex / Gemini), isto é esperado e pode ser ignorado.","doctor.msg.hook-activity.stop-silent.summary":"O hook {hook} está registando, mas o hook session-summary nunca executou nas {hours} horas desde que o rastreamento começou — a captura de sessões pode estar quebrada, escondida pela captura de commits.","doctor.msg.hook-activity.stop-silent.fix":"Termine uma sessão de trabalho e execute `memesh doctor` de novo. Se o session-summary continuar sem executar, execute `memesh install-hooks` e reinicie o agente.","doctor.label.capture-liveness":"Captura ativa","doctor.msg.capture-liveness.silent-hook.summary":"{hook}: {runs} execuções, 0 gravações — '{reason}'. O hook está vivo e decide todas as vezes que não há nada a guardar, que é também como um caminho de captura quebrado se parece.","doctor.msg.capture-liveness.silent-hook.fix":"Execute `memesh doctor --json` para ver os números por hook. Se o motivo não descreve o seu uso, execute `memesh install-hooks` e reinicie o agente.","doctor.msg.capture-liveness.type-stopped.summary":"Nada do tipo '{type}' foi capturado nos últimos 7 dias, contra {prev} nos 7 dias anteriores. Algo que estava a ser lembrado deixou de ser.","doctor.msg.capture-liveness.type-stopped.fix":"Execute `memesh doctor --json` para ver os números por hook e verifique se a sua forma de trabalhar mudou — se não mudou, execute `memesh install-hooks` e reinicie o agente.","doctor.msg.capture-liveness.never-ran.summary":"O hook {hook} não deixou registo nem heartbeat nas {hours} horas desde que o acompanhamento começou — nunca foi executado, por isso nada do que ele captaria está a ser guardado.","doctor.msg.capture-liveness.never-ran.fix":"Execute `memesh install-hooks` e reinicie o agente, depois termine uma sessão de trabalho e execute `memesh doctor` de novo.","doctor.msg.capture-liveness.not-wired.summary":"O hook {hook} nunca foi executado, mas nenhum hook de captura está ligado nesta máquina.","doctor.msg.capture-liveness.not-wired.fix":"Se quiser captura automática, execute `memesh install-hooks`. Se esta instalação for apenas MCP (Codex, Gemini ou Cursor), isso é esperado.","doctor.msg.capture-liveness.never-ran-legacy.summary":"O hook {hook} não tem registo de resultado, mas {captured} memórias de captura automática foram guardadas desde o início do acompanhamento. Hooks antigos provavelmente ainda estão a correr.","doctor.msg.capture-liveness.never-ran-legacy.fix":"Atualize os hooks do MeMesh, reinicie o agente e execute `memesh doctor` novamente.","doctor.msg.capture-liveness.query-failed.summary":"Não foi possível ler o estado da captura na base de dados: {detail}. Saber se algo está a ser guardado é desconhecido, o que não é o mesmo que saudável.","doctor.msg.capture-liveness.query-failed.fix":"O erro está citado acima. Verifique se ~/.memesh é legível e se o disco não está cheio.","doctor.msg.hook-activity.never-ran-legacy.summary":"Nenhum hook registou o heartbeat, mas {captured} memórias de captura automática chegaram desde que o rastreamento começou — hooks de uma versão anterior ao rastreamento provavelmente ainda estão a executar.","doctor.msg.hook-activity.never-ran-legacy.fix":"Atualize os hooks do memesh para a versão atual (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) e reinicie o agente.","doctor.msg.node-runtime.too-old.summary":"Seu Node.js é mais antigo do que este pacote suporta. {detail}","doctor.msg.node-runtime.too-old.fix":"Atualize o Node.js para {required} ou mais novo e execute `memesh doctor` de novo.","doctor.msg.native-binding.load-failed.summary":"O SQLite não conseguiu abrir o banco de dados: {detail}.","doctor.msg.native-binding.load-failed.fix":"Verifique o ambiente Node e reinstale o MeMesh se necessário.","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` se quiser um comando de terminal separado. O banco de dados dele depende da configuração.","doctor.msg.shell-cli.versions.summary":"Versões instaladas: esta interface {current}; terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"O plugin foi instalado a partir do commit {installed}, mas o marketplace avançou para {marketplace} com a mesma versão. O {host} não atualiza um cache cuja versão não mudou, então você está executando código mais antigo que o do marketplace.","doctor.msg.plugin-cache.stale.fix":"Execute `{command}` para atualizar o cache e depois reinicie o {host}.","doctor.msg.plugin-cache.unverifiable.summary":"Não foi possível saber se o plugin instalado corresponde ao marketplace. Só a versão não responde isso — dois builds podem ter a mesma versão.","doctor.msg.plugin-cache.unverifiable.fix":"Execute `{command}` uma vez; ele registra o commit e esta verificação passa a responder.","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.config-parse.retired-settings.summary":"O arquivo de configuração válido em {path} ainda contém {count} configurações de nível superior desativadas ({keys}). Esta versão as ignora, mas credenciais ou configurações antigas de provedores podem continuar no disco.","doctor.msg.config-parse.retired-settings.fix":"Revise {path} localmente e remova somente essas chaves de nível superior desativadas. Não cole o arquivo em uma issue, pois ele pode conter credenciais. Depois, execute memesh doctor novamente.","doctor.msg.message-capability.probe-failed.summary":"A verificação do recurso de mensagens instalado falhou: {detail}.","doctor.msg.message-router.socket-missing.summary":"Não há socket do router Local em {path}; sessões paradas ou ausentes não serão despertadas.","doctor.msg.message-router.socket-insecure.summary":"O socket do router em {path} não é um socket Unix privado do proprietário.","doctor.msg.message-router.socket-unreachable.summary":"O socket privado do router em {path} existe, mas não aceitou uma conexão local.","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.citation.none.summary":"As sessões receberam memórias injetadas, mas nenhuma foi citada.","doctor.msg.citation.none.fix":"Verifique o contrato de citação em ~/.claude/rules/memesh-citations.md e reavalie após algumas sessões.","doctor.msg.database.broken.summary":"O banco de dados não está utilizável: {detail}","doctor.update_status.prerelease":"Executando a versão de pré-lançamento ({current}); a versão latest do npm é {latest}.","patterns.title":"Seus Padrões","patterns.workSchedule":"Agenda de Trabalho","patterns.peakHours":"Horários de pico","patterns.busiestDays":"Dias mais movimentados","patterns.workflow":"Fluxo de Trabalho","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.auth.cross-origin":"Esta requisição veio de outro site, ou chegou ao servidor com um nome inesperado, e foi recusada. Abra o painel pelo endereço que o `memesh serve` imprimiu.","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.rate.limited":"Muitas solicitações em pouco tempo. Aguarde um momento e tente novamente.","httpError.server.internal":"O servidor encontrou um erro inesperado.","httpError.operation.permission-denied":"O MeMesh não tem permissão para modificar os arquivos necessários para este reparo. Feche este painel, execute `memesh serve` no seu próprio Terminal e tente novamente. Se ainda falhar, execute `memesh doctor`.","time.justNow":"Agora","time.hoursAgo":"Há {count}h","time.today":"Hoje","time.yesterday":"Ontem","time.daysAgo":"Há {count}d","time.lastWeek":"Semana passada","time.weeksAgo":"Há {count}sem","time.lastMonth":"Mês passado","time.monthsAgo":"Há {count}m","memory.access.frequent":"Frequente · {count} usos","memory.access.recalls":"{count} usos","memory.access.never":"Nunca usado","cluster.knowledge":"Conhecimento","cluster.activity":"Atividade","cluster.session":"Sessões","cluster.reference":"Referência","cluster.all":"Todos","browse.filterTime":"Tempo","browse.filterValue":"Valor","browse.filterProject":"Projeto","browse.filterSort":"Ordenar","browse.timeToday":"Hoje","browse.timeWeek":"Esta semana","browse.timeMonth":"Este mês","browse.timeOlder":"Mais antigo","browse.valueRecalled":"✓ Usado","browse.valueNever":"Nunca usado","browse.sortMostRecalled":"Mais usado","browse.sortRecent":"Recente","browse.sortCreated":"Criado em","browse.emptyFilter":"Sem memórias nesta categoria — tente outro filtro","lessons.stepsLabel":"passos","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Sem campos estruturados — ver memória bruta)","lessons.moreItems":"+{count} mais","roadmap.title":"Histórico do Projeto","roadmap.summary":"{count} memórias · {first} → {last}","roadmap.switchToList":"↩ Lista","roadmap.switchToRoadmap":"🕘 Histórico","roadmap.emptyProject":"Sem memórias neste projeto ainda.","loop.label":"Loop de memória","loop.subtitleHas":"memórias de conhecimento reutilizadas nos últimos 7 dias","loop.subtitleNone":"Nenhuma memória de conhecimento reutilizada esta semana","loop.approxNote":"Aproximação — rastreamento completo começa após atualização.","loop.sparkLabel":"Últimos 30 dias","roadmap.milestones":"Marcos","roadmap.keyLessons":"Lições principais","radar.title":"Radar de cobertura","radar.caption":"Memórias de conhecimento ativas (session e commit excluídos)","radar.axis.lessons":"Lições","radar.axis.decisions":"Decisões","radar.axis.patterns":"Padrões","radar.axis.bugs":"Correções","radar.axis.processes":"Processos","radar.axis.architecture":"Arquitetura","ageMatrix.title":"Distribuição de idade","ageMatrix.low":"Baixa","ageMatrix.high":"Alta","ageMatrix.legend":"profundidade da cor = densidade","ageMatrix.typeColumn":"Tipo","header.signalModeOn":"Memórias essenciais","header.signalModeOff":"Todas as memórias","header.signalModeOnHint":"Mostra metas, decisões, lições e planos; oculta registros automáticos de session, commit e atividade em Memórias.","header.signalModeOffHint":"Mostra todos os registros, inclusive session, commit e atividade capturados automaticamente, em Memórias.","globalFilter.focusedStatus":"Visão global: Memórias essenciais — registros automáticos de session, commit e atividade ficam ocultos em Memórias.","globalFilter.allStatus":"Visão global: Todas as memórias — registros automáticos de session, commit e atividade são incluídos em Memórias.","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.coreHint":"Memória local: remember, busca FTS5 por palavras-chave, hooks e navegação no Dashboard funcionam em conjunto.","onboarding.searchHint":"A recuperação usa busca local por palavras-chave com FTS5.","onboarding.reviewHint":"Um agente já em execução pode preparar um pacote de resumo ou transcrição visível; o Dashboard apenas revisa a proposta preparada.","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.demoLoadedTitle":"Dados de demonstração carregados","onboarding.demoLoadedBody":"Há {count} memórias marcadas como demo. Aqui você pode remover somente essas memórias.","onboarding.resetConfirm":"Remover todas as memórias com a marca metadata.demo? As mesmas linhas não podem ser restauradas, mas você pode carregar uma nova demo depois. Memórias reais serão mantidas.","onboarding.resetReadbackFailed":"Não foi possível confirmar a redefinição porque ainda há memórias de demo. A ação de limpeza permanece disponível; tente novamente ou execute memesh doctor.","onboarding.dismiss":"Fechar","common.serverError":"O servidor retornou um erro (HTTP {status}). Tente novamente — se persistir, execute `memesh doctor`.","emptyLibrary.title":"Sua memória está vazia","emptyLibrary.body":"Nada foi armazenado ainda. Carregue o tour de demonstração com 30 entradas para ver o MeMesh em ação — você pode apagá-lo depois com um clique.","browse.truncated":"mostrando as primeiras {shown} de {total} memórias — use a busca ou os filtros para alcançar o restante","browse.truncatedUnknownTotal":"mostrando as primeiras {shown} memórias — o total está indisponível, então pode haver mais","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":'Nos canais de instalação suportados, a primeira utilização pede consentimento uma vez antes de atualizar. "Agora não" adia essa versão (24 h, depois 48 h, depois 7 dias); "Não voltar a perguntar" desativa a verificação. Outros canais mostram a sua própria ação de atualização. Após uma atualização, os hosts em execução mantêm a versão antiga até reiniciarem. MEMESH_AUTO_UPDATE define o limite, mas nunca ignora o consentimento.',"errors.timeout":"A solicitação expirou","type.lesson_learned":"Lição","type.lesson":"Lição","type.mistake":"Erro","type.decision":"Decisão","type.goal":"Objetivo","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","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","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}","common.unknown":"desconhecido","insights.entitiesCount":"{n} entidades","roadmap.viewToggle":"Vista do histórico do projeto","roadmap.viewTree":"Árvore","roadmap.viewMindmap":"Mapa mental","roadmap.mindmapNeedsPhases":"O mapa mental precisa de pelo menos 3 memórias numa janela de 7 dias.","roadmap.activePhase":"ativa","roadmap.entryCount":"{count} entrada","roadmap.entriesCount":"{count} entradas","roadmap.otherGroup":"Outros ({count})","roadmap.lowSignalHidden":"({count} de baixo sinal ocultas)","roadmap.resetHint":"Redefinir zoom e posição (duplo clique no fundo também redefine)","roadmap.zoomHint":"role para zoom · arraste para mover · {pct}%","roadmap.moreEntities":"+{count} mais","roadmap.viewDecisions":"Decisões","roadmap.densityTitle":"Densidade de captura por categoria","roadmap.densityNote":"o que o memesh capturou — não tudo o que aconteceu","roadmap.lineageSupersedes":"{n} substituídas","roadmap.lineageConflicts":"{n} conflitos não resolvidos","adr.empty":'Nenhuma decisão registrada neste projeto ainda. Registre uma com o tipo "decision" e ela aparece aqui com seu histórico.',"adr.statusActive":"ativa","adr.statusSuperseded":"substituída","adr.supersedes":"substitui","adr.supersededBy":"substituída por","nav.ariaLabel":"Seções do painel","feedback.descLabel":"Descrição do feedback","doctor.msg.capture-liveness.no-records.summary":"Os hooks rodaram nesta máquina (último sinal há {hours} horas), mas nenhum deixou um registro de resultado. Ou os hooks em execução são anteriores ao registro de resultados, ou falham ao carregar e não registram nada.","doctor.msg.capture-liveness.no-records.fix":"Atualize os hooks do MeMesh (plugin: `/plugin update memesh`; npm: `memesh install-hooks`), reinicie o agente, inicie uma sessão e execute `memesh doctor` novamente.","project.index.title":"O que já se sabe aqui","project.index.empty":"Nada neste projeto é injetado automaticamente ainda. Memórias importadas, memórias marcadas como não confiáveis e qualquer uma salva sem a tag `project:` não são contadas aqui — o número no chip do projeto pode ser maior. Decisões, lições, padrões e referências salvos com `remember` aparecem aqui.","project.index.more":'Mais {n} — `memesh recall --tag "project:…"`',"project.index.older":"{n} mais antigas (sem alterações há {days} dias) — use recall para vê-las","project.index.cost":"O mesmo índice que um agente recebe no início da sessão · ≈ {tokens} tokens ({bytes} bytes)"},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","header.memory":"mémoire","insights.title":"Suggestions d’organisation de la mémoire","insights.reviewTitle":"Propositions mémoire préparées","insights.reviewSubtitle":"paquets de travail en attente d’une revue humaine","insights.reviewSource":"Proposition préparée — examinez-la avant application","insights.source.calendar":"Résumé calendaire","insights.source.transcript":"Transcription Claude Code","insights.reviewBoundary":"Le Dashboard examine les propositions déjà préparées. Il ne lance ni ne dépêche un agent.","insights.statPending":"en attente","insights.statApplied":"appliquée","insights.statRejected":"rejetée","insights.filter.pending":"En attente","insights.filter.applied":"Appliquée","insights.filter.rejected":"Rejetée","insights.filter.all":"Tous","insights.refresh":"Actualiser","insights.loading":"chargement…","insights.emptyOther":"Rien ici.","insights.sources":"sources","insights.status.pending":"en attente","insights.status.applied":"appliquée","insights.status.rejected":"rejetée","insights.viewDetail":"Voir le détail","insights.collapse":"Réduire","insights.accept":"Accepter","insights.applying":"Application…","insights.reject":"Rejeter","insights.rejectConfirm":"Rejeter cette analyse ? Cette action est irréversible.","insights.observations":"Observations résumées","insights.tags":"Tags","insights.sourceIds":"Sources","insights.validationWarnings":"Avertissements de validation hérités","insights.validationClaim":"Affirmation","insights.validationReason":"Raison","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.settings":"Paramètres","tab.home":"Accueil","tab.memories":"Mémoires","tab.project":"Projet","memories.searchPlaceholder":"Filtrez en tapant — appuyez sur Entrée pour une recherche par pertinence","memories.scopeLabel":"Portée","memories.scopeWork":"Couche de travail","memories.scopeEvidence":"Preuves","memories.scopeAll":"Toutes","memories.scopeArchived":"Archivées","memories.composition":"Composition","memories.rankedBy":"classées par pertinence","memories.backToList":"Retour à la liste","memories.workEmpty":"Pas encore de mémoires de la couche de travail — objectifs, décisions, leçons et plans arrivent ici à mesure qu'ils sont capturés.","memories.showAll":"Afficher toutes les mémoires","memories.expand":"Afficher les détails","memories.collapse":"Masquer les détails","memory.technicalDetails":"Détails techniques","memory.canonicalName":"Nom canonique","memory.rawType":"Type brut","home.analyticsTitle":"Analyse","handoff.terminal":"Terminal requis","handoff.terminalPrereq":"Exécutez ceci sur la machine où MeMesh est installé. Le Dashboard ne l’exécutera pas.","handoff.copyCommand":"Copier la commande","handoff.commandCopied":"Commande copiée","handoff.github":"Ouvre GitHub — vérifiez le ticket prérempli avant envoi","home.analyticsHint":"Santé, chronologie, patterns et utilisation — se déploie à la demande","home.nextAction.eyebrow":"Prochaine étape recommandée","home.nextAction.why":"Pourquoi :","home.nextAction.result":"Résultat attendu :","home.nextAction.loading.title":"Vérification des éléments à traiter…","home.nextAction.loading.why":"MeMesh lit l’état actuel des mémoires, de l’index et de la file de révision.","home.nextAction.loading.result":"Une seule recommandation apparaîtra après ces vérifications.","home.nextAction.empty.title":"Ajoutez votre première mémoire","home.nextAction.empty.why":"La bibliothèque est vide ; rien ne peut encore être recherché ou organisé.","home.nextAction.empty.result":"La page Mémoires permet de charger une démo supprimable ou de capturer du travail réel.","home.nextAction.empty.action":"Ouvrir Mémoires","insights.emptyPending":"Aucune révision en attente pour le moment. Les nouvelles révisions de mémoire apparaîtront ici.","home.nextAction.insights.title":"Révisez les suggestions d’organisation","home.nextAction.insights.why":"MeMesh a des suggestions qui attendent votre décision.","home.nextAction.insights.result":"Acceptez les résumés utiles ou refusez les suggestions inadaptées.","home.nextAction.insights.action":"Réviser les suggestions","home.nextAction.healthy.title":"Aucune action nécessaire maintenant","home.nextAction.healthy.why":"Les mémoires, l’index et la file de révision n’ont aucune action connue en attente.","home.nextAction.healthy.result":"Continuez à travailler ; MeMesh affichera ici le prochain besoin confirmé.","home.nextAction.unavailable.title":"Recommandation indisponible","home.nextAction.unavailable.why":"Une vérification est illisible ; MeMesh ne va donc pas deviner.","home.nextAction.unavailable.result":"Rechargez pour réessayer sans modifier les mémoires ni les réglages.","home.nextAction.unavailable.action":"Relancer les vérifications","project.selectLabel":"Projet","project.selectPrompt":"Choisissez un projet pour voir son historique.","project.empty":"Pas encore de mémoires de projet. Travaillez dans un dépôt git avec les hooks memesh installés et son histoire apparaîtra ici.","project.taskState.title":"Où en est ce projet","project.taskState.goal":"Objectif","project.taskState.next":"Prochaine étape","project.taskState.blocked":"Bloqué","project.taskState.done":"Terminé","project.taskState.updated":"Mis à jour {when}","project.taskState.provenance":"Déclaré avec `memesh task` — pas déduit du nombre de mémoires.","project.taskState.empty":"Aucun état de tâche pour ce projet pour l'instant. Définissez-le dans une session avec `memesh task --goal … --next …` et il apparaîtra ici.","guard.sourceLesson":"Leçon d'origine","guard.pattern":"Motif de déclenchement","guard.message":"Avertissement affiché","guard.shouldMatch":"Doit se déclencher sur","guard.shouldNotMatch":"Doit rester silencieux sur","search.button":"Rechercher","search.searching":"Recherche…","search.results":"résultats","search.result":"résultat","search.noResults":"Aucun résultat pour","search.facts":"faits","browse.title":"Toutes les mémoires","browse.active":"actives","browse.archived":"archivées","browse.refresh":"Actualiser","browse.noMatch":"Aucune mémoire correspondant à","browse.prev":"← Précédent","browse.next":"Suivant →","browse.archive":"Archiver","browse.restore":"Restaurer","browse.confirmArchive":"Archiver cette mémoire ?","browse.archiveFailed":"Impossible d’archiver la mémoire : {message}","browse.restoreFailed":"Impossible de restaurer la mémoire : {message}","analytics.totalMemories":"Total des mémoires","analytics.knowledgeFacts":"Faits de connaissance","analytics.connections":"Connexions","analytics.topics":"Sujets","analytics.insights":"Aperçus","analytics.thisWeek":"Cette semaine","analytics.new":"nouvelles","analytics.stale":"Inactives (30+ jours sans utilisation)","analytics.archivedLabel":"Archivées","analytics.mostRecalled":"Les plus consultées","health.title":"Santé de la mémoire","metrics.notMeasured":"Pas encore mesuré","metrics.health":"Santé","metrics.healthNote":"Activité, qualité, fraîcheur, leçons","metrics.critical":"Leçons critiques","metrics.criticalPartial":"sur {tagged} classées · {total} leçons au total","metrics.criticalAll":"sur {total} leçons, toutes classées","metrics.criticalUnclassified":"{total} leçons, aucune classée par gravité","metrics.criticalNoLessons":"Aucune leçon enregistrée pour le moment","metrics.citation":"Citations","metrics.citationNote":"{cited} sessions sur {total} ont cité une mémoire","metrics.citationNotMeasured":"Le suivi des citations démarre à la prochaine session","metrics.reused":"Réutilisées cette semaine","metrics.reusedNote":"Approximatif — d'après les dates de dernier accès","health.excellent":"Excellent","health.good":"Bon","health.fair":"Moyen","health.poor":"Faible","health.activity":"Activité","health.quality":"Qualité","health.freshness":"Fraîcheur","health.lessons":"Auto-amélioration","timeline.title":"30 derniers jours","timeline.created":"Créés","timeline.recalled":"Rappelés","value.totalRecalls":"Total des rappels","value.lessonsLearned":"Leçons apprises","value.lessonsSaved":"Leçons appliquées","value.coverage":"Couverture des connaissances","cleanup.title":"Suggestions de nettoyage","cleanup.allClean":"Votre mémoire est propre. Aucune entité obsolète ou en double détectée.","cleanup.staleLabel":"Faible confiance / non utilisé","cleanup.duplicateLabel":"Doublons possibles","cleanup.confidence":"confiance","cleanup.unused":"non utilisé","cleanup.entityMeta":"{type} · confiance {confidence}% · {days} j sans usage","settings.saved":"Enregistré.","settings.configLoadFailed":"Impossible de lire les paramètres. Rechargez la page pour réessayer.","settings.configReadbackFailed":"Le serveur n’a pas renvoyé le réglage enregistré. Réessayez.","settings.language":"Langue","settings.interfaceLanguage":"Langue de l’interface","settings.interfaceLanguageHint":"Modifie immédiatement l’interface dans ce navigateur.","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":"Aucune version publiée plus récente","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":"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.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.updateRetryGuidance":"Vérifiez votre connexion et les paramètres du registre npm, puis réessayez. Votre version installée n'a pas changé.","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.","settings.installationDetails":"Détails de l’installation","settings.installationDetailsUnavailable":"La comparaison des versions n’est pas disponible pour cette installation.","settings.interfacePath":"Cette interface","settings.terminalPath":"Commande de terminal","settings.technicalDetails":"Détails techniques","settings.installationDetailsHint":"Des versions installées différentes ne nécessitent pas forcément une mise à jour. Consultez Mises à jour pour voir les versions publiées.","roadmap.resetView":"Réinitialiser la vue","lessons.error":"Erreur","lessons.rootCause":"Cause racine","lessons.fix":"Correction","lessons.prevention":"Prévention","feedback.button":"💬 Retour","feedback.title":"Ouvrir le retour sur GitHub","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…","feedback.popupBlocked":"GitHub ne s’est pas ouvert. Votre brouillon est conservé ; autorisez les fenêtres contextuelles, réessayez ou copiez le lien préparé.","feedback.retry":"Réessayer d’ouvrir GitHub","feedback.copyLink":"Copier le lien GitHub","feedback.linkCopied":"Lien copié","feedback.copyFailed":"Impossible de copier le lien. Réessayez d’ouvrir GitHub.","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","doctorBanner.fix":"Réparer automatiquement","doctorBanner.fixInProgress":"Réparation…","doctorBanner.fixDone":"Réparé","doctorBanner.restartRequired":"Redémarrez l’agent pour terminer cette mise à jour.","doctor.label.readme_locale_parity":"Traductions du README","doctor.label.config":"Fichier de configuration","doctor.label.mcp-config":"Fichier de connexion MCP","doctor.label.hooks-config":"Définitions des hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Connexion à Claude Code","doctor.label.hook-activity":"Capture automatique","doctor.label.node-runtime":"Version de Node.js","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Code du plugin à jour","doctor.label.shell-cli":"Commande du terminal","doctor.label.dashboard":"Fichiers du tableau de bord","doctor.label.claude-channel":"Enregistrement du canal Claude","doctor.msg.claude-channel.unregistered.summary":"Les notifications en direct du canal Claude ne sont pas activées. Les outils de mémoire MCP et la messagerie durable de la boîte de réception peuvent toujours fonctionner. Cet aperçu est facultatif.","doctor.msg.claude-channel.unregistered.fix":"Pour activer ce canal facultatif, exécutez `memesh agent setup claude`, puis enregistrez la commande MCP affichée dans les paramètres utilisateur de votre Claude.","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.install-channel":"Méthode d'installation","doctor.label.fts_segmentation":"Index de mots-clés","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 (.claude-plugin/mcp.json) est introuvable.","doctor.msg.mcp-config.missing.fix":"Réinstallez MeMesh pour le restaurer.","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/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":".claude-plugin/mcp.json ne contient plus l'entrée du serveur memesh.","doctor.msg.mcp-config.no-entry.fix":"Réinstallez MeMesh pour la restaurer.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` démarre un fichier absent de cette installation, donc aucun outil memesh dans Claude Code ne peut démarrer.","doctor.msg.mcp-config.entry-missing.fix":"Réinstallez MeMesh. Si vous avez modifié `.claude-plugin/mcp.json` à la main, refaites-le pointer vers `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.mcp-config.placeholder-unresolved.summary":"NON VÉRIFIÉ : `.claude-plugin/mcp.json` démarre un chemin contenant `${CLAUDE_PLUGIN_ROOT}`, une variable que seul le runtime de plugins de Claude Code remplace. Cette copie ne tourne pas comme plugin, donc le fichier visé n'a pas été contrôlé.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Contrôlez-le comme le ferait le runtime de plugins : lancez `CLAUDE_PLUGIN_ROOT=<le dossier de cette installation> memesh doctor`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json est introuvable, la capture automatique de mémoire ne peut donc pas fonctionner.","doctor.msg.hooks-config.missing.fix":"Réinstallez MeMesh pour le restaurer.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json est endommagé (JSON invalide).","doctor.msg.hooks-config.invalid-json.fix":"Corrigez {path} ou réinstallez MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json ne contient pas ces types de hooks : {types}. Une partie de la capture automatique ne fonctionnera pas.","doctor.msg.hooks-config.missing-types.fix":"Restaurez la configuration de hooks d'origine ou réinstallez MeMesh.","doctor.msg.hook-scripts.none.summary":"La configuration des hooks ne contient aucun script, rien ne peut donc être capturé automatiquement.","doctor.msg.hook-scripts.none.fix":"Réinstallez MeMesh.","doctor.msg.hook-scripts.missing.summary":"Ces scripts de hook sont introuvables : {files}","doctor.msg.hook-scripts.missing.fix":"Réinstallez MeMesh pour les restaurer.","doctor.msg.hook-scripts.not-executable.summary":"Ces scripts de hook existent mais n'ont pas le droit de s'exécuter : {files}","doctor.msg.hook-scripts.not-executable.fix":"Exécutez `chmod +x scripts/hooks/*.js`, ou `npm run build` si vous utilisez le code source.","doctor.msg.hook-wiring.no-marker.summary":"memesh n'est pas encore relié à Claude Code, rien n'est donc mémorisé automatiquement.","doctor.msg.hook-wiring.no-marker.fix":"Exécutez `memesh install-hooks` une fois, puis `memesh doctor` pour vérifier.","doctor.msg.hook-wiring.script-missing.summary":"Un hook memesh câblé pointe vers {path}, qui n'existe plus — l'agent invoque un fichier manquant à chaque événement correspondant. Généralement un résidu d'une mise à niveau qui a retiré le hook.","doctor.msg.hook-wiring.script-missing.fix":"Lancez `memesh install-hooks` pour recâbler (les entrées retirées sont supprimées), puis redémarrez l'agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"Le registre de connexion {path} est illisible.","doctor.msg.hook-wiring.marker-unreadable.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.marker-malformed.summary":"Le registre de connexion est endommagé.","doctor.msg.hook-wiring.marker-malformed.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.settings-missing.summary":"Le fichier de réglages de Claude Code ({path}) a disparu, la connexion est donc rompue.","doctor.msg.hook-wiring.settings-missing.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} est endommagé (JSON invalide).","doctor.msg.hook-wiring.settings-invalid.fix":"Restaurez-le depuis une sauvegarde, ou exécutez `memesh install-hooks` pour le recréer.","doctor.msg.hook-wiring.entries-removed.summary":"Les entrées memesh ont été retirées de {path}, la connexion est donc rompue.","doctor.msg.hook-wiring.entries-removed.fix":"Exécutez de nouveau `memesh install-hooks`.","doctor.msg.hook-wiring.root-moved.summary":"La connexion pointe vers {path}, qui n'existe plus (memesh a probablement été déplacé).","doctor.msg.hook-wiring.root-moved.fix":"Exécutez `memesh install-hooks` pour la mettre à jour.","doctor.msg.hook-activity.never-ran.summary":"Aucun hook de capture n'a été exécuté depuis {hours} heures, date de début du suivi, alors que le câblage des hooks est en place — rien n'est mémorisé.","doctor.msg.hook-activity.never-ran.fix":"Terminez une session de travail puis relancez `memesh doctor`. Si le message persiste, exécutez `memesh install-hooks` et redémarrez votre agent.","doctor.msg.hook-activity.stale.summary":"Le dernier hook de capture s'est exécuté il y a environ {hours} heures ({hook}). Si vous avez travaillé depuis, la capture est arrêtée et rien de ces sessions n'a été enregistré.","doctor.msg.hook-activity.stale.fix":"Redémarrez votre agent, terminez une session puis relancez `memesh doctor`. Si cela ne se rétablit pas, exécutez `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Le hook session-summary a tourné pour la dernière fois il y a environ {hours} heures, et aucune écriture Claude Code n'est arrivée depuis 3 jours non plus. Si cette machine est passée à un autre agent (Codex / Gemini), c'est attendu ; si vous utilisez encore Claude Code ici, la capture s'est arrêtée.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Si vous utilisez encore Claude Code sur cette machine : redémarrez-le, terminez une session, puis relancez `memesh doctor`. S'il ne récupère pas, lancez `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Impossible de lire l'activité des hooks dans la base de données : {detail}. L'état de la capture est inconnu, ce qui n'est pas la même chose que sain.","doctor.msg.hook-activity.query-failed.fix":"Lancez `memesh doctor --verbose` pour voir l'erreur complète, et vérifiez que ~/.memesh est lisible et que le disque n'est pas plein.","doctor.msg.hook-activity.stale-unknown.summary":"L'horodatage de la dernière exécution du hook {hook} est illisible (corrompu, ou écrit par une machine à l'horloge déréglée). L'état de la capture est « inconnu », ce qui n'est pas la même chose que « sain ».","doctor.msg.hook-activity.stale-unknown.fix":"Terminez une session de travail puis relancez `memesh doctor` — une nouvelle exécution écrase l'horodatage invalide.","doctor.msg.hook-activity.disabled.summary":"La capture automatique est désactivée (MEMESH_AUTO_CAPTURE ou autoCapture dans la configuration) — délibérément, le silence des hooks est donc attendu. Réactivez-la pour reprendre la capture.","doctor.msg.hook-activity.disabled-env.summary":"La capture automatique est désactivée par MEMESH_AUTO_CAPTURE=false dans l'environnement de ce shell. doctor ne voit que son propre environnement — si votre agent tourne sans cette variable, la capture là-bas n'est pas affectée.","doctor.msg.hook-activity.not-wired.summary":"Aucun hook de capture n'a jamais tourné — et aucun hook de capture (Stop / PostToolUse / PreCompact) n'est confirmé câblé sur cette machine, il n'y a donc rien à exécuter.","doctor.msg.hook-activity.not-wired.fix":"Pour la capture automatique, lancez `memesh install-hooks`. Si cette installation est MCP uniquement (Codex / Gemini), c'est normal et vous pouvez l'ignorer.","doctor.msg.hook-activity.stop-silent.summary":"Le hook {hook} s'enregistre, mais le hook session-summary n'a jamais tourné une seule fois en {hours} heures de suivi — la capture de session est peut-être cassée, masquée par la capture des commits.","doctor.msg.hook-activity.stop-silent.fix":"Terminez une session de travail puis relancez `memesh doctor`. Si session-summary n'a toujours pas tourné, lancez `memesh install-hooks` et redémarrez l'agent.","doctor.label.capture-liveness":"Capture active","doctor.msg.capture-liveness.silent-hook.summary":"{hook} : {runs} exécutions, 0 écriture — « {reason} ». Le hook est vivant et décide chaque fois qu'il n'y a rien à enregistrer, ce à quoi ressemble aussi une capture cassée.","doctor.msg.capture-liveness.silent-hook.fix":"Lancez `memesh doctor --json` pour les chiffres par hook. Si la raison ne correspond pas à votre usage, lancez `memesh install-hooks` et redémarrez l'agent.","doctor.msg.capture-liveness.type-stopped.summary":"Rien du type « {type} » n'a été capturé ces 7 derniers jours, contre {prev} les 7 jours précédents. Quelque chose qui était mémorisé ne l'est plus.","doctor.msg.capture-liveness.type-stopped.fix":"Lancez `memesh doctor --json` pour les chiffres par hook et vérifiez si votre façon de travailler a changé — sinon, lancez `memesh install-hooks` et redémarrez l'agent.","doctor.msg.capture-liveness.never-ran.summary":"Le hook {hook} n'a laissé ni enregistrement ni battement depuis {hours} heures de suivi : il n'a jamais tourné, donc rien de ce qu'il capterait n'est enregistré.","doctor.msg.capture-liveness.never-ran.fix":"Lancez `memesh install-hooks` et redémarrez l'agent, puis terminez une session de travail et relancez `memesh doctor`.","doctor.msg.capture-liveness.not-wired.summary":"Le hook {hook} n'a jamais fonctionné, mais aucun hook de capture n'est connecté sur cette machine.","doctor.msg.capture-liveness.not-wired.fix":"Pour activer la capture automatique, lancez `memesh install-hooks`. Si cette installation est uniquement MCP (Codex, Gemini ou Cursor), c'est normal.","doctor.msg.capture-liveness.never-ran-legacy.summary":"Le hook {hook} n'a aucun enregistrement de résultat, mais {captured} mémoires ont été capturées depuis le début du suivi. Des hooks anciens fonctionnent probablement encore.","doctor.msg.capture-liveness.never-ran-legacy.fix":"Mettez à jour les hooks MeMesh, redémarrez l'agent et relancez `memesh doctor`.","doctor.msg.capture-liveness.query-failed.summary":"Impossible de lire l'état de la capture depuis la base : {detail}. On ignore si quoi que ce soit est enregistré, et ignorer n'est pas la même chose que sain.","doctor.msg.capture-liveness.query-failed.fix":"L'erreur est citée ci-dessus. Vérifiez que ~/.memesh est lisible et que le disque n'est pas plein.","doctor.msg.hook-activity.never-ran-legacy.summary":"Aucun hook n'a enregistré le heartbeat, mais {captured} mémoires de capture automatique sont arrivées depuis le début du suivi — des hooks d'une version antérieure au suivi tournent probablement encore.","doctor.msg.hook-activity.never-ran-legacy.fix":"Mettez à jour les hooks memesh vers la version actuelle (plugin : `/plugin update memesh` ; npm : `memesh install-hooks`), puis redémarrez l'agent.","doctor.msg.node-runtime.too-old.summary":"Votre Node.js est plus ancien que ce que ce paquet prend en charge. {detail}","doctor.msg.node-runtime.too-old.fix":"Mettez Node.js à niveau vers {required} ou plus récent, puis relancez `memesh doctor`.","doctor.msg.native-binding.load-failed.summary":"SQLite n’a pas pu ouvrir la base de données : {detail}.","doctor.msg.native-binding.load-failed.fix":"Vérifiez l’environnement Node et réinstallez MeMesh si nécessaire.","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` si vous voulez une commande de terminal distincte. Sa base de données dépend de sa configuration.","doctor.msg.shell-cli.versions.summary":"Versions installées : cette interface {current} ; terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"Le plugin a été installé depuis le commit {installed}, mais le marketplace est passé à {marketplace} sous la même version. {host} ne rafraîchit pas un cache dont la version n’a pas changé : vous exécutez donc un code plus ancien que celui du marketplace.","doctor.msg.plugin-cache.stale.fix":"Exécutez `{command}` pour rafraîchir le cache, puis redémarrez {host}.","doctor.msg.plugin-cache.unverifiable.summary":"Impossible de savoir si le plugin installé correspond au marketplace. La version seule ne suffit pas : deux builds peuvent porter la même version.","doctor.msg.plugin-cache.unverifiable.fix":"Exécutez `{command}` une fois ; il enregistre le commit et cette vérification pourra répondre.","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.config-parse.retired-settings.summary":"Le fichier de configuration valide {path} contient encore {count} réglages de premier niveau abandonnés ({keys}). Cette version les ignore, mais des identifiants ou réglages de fournisseurs historiques peuvent rester sur le disque.","doctor.msg.config-parse.retired-settings.fix":"Examinez {path} localement et supprimez uniquement ces clés de premier niveau abandonnées. Ne collez pas le fichier dans une issue, car il peut contenir des identifiants. Relancez ensuite memesh doctor.","doctor.msg.message-capability.probe-failed.summary":"La vérification de la fonction de messagerie installée a échoué : {detail}.","doctor.msg.message-router.socket-missing.summary":"Aucun socket du router Local n’existe à {path} ; les sessions arrêtées ou absentes ne seront pas réveillées.","doctor.msg.message-router.socket-insecure.summary":"Le socket du router à {path} n’est pas un socket Unix privé du propriétaire.","doctor.msg.message-router.socket-unreachable.summary":"Le socket privé du router à {path} existe, mais n’a pas accepté la connexion locale.","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.citation.none.summary":"Des sessions ont reçu des mémoires injectées, mais aucune n'a été citée.","doctor.msg.citation.none.fix":"Vérifiez le contrat de citation dans ~/.claude/rules/memesh-citations.md, puis revérifiez après quelques sessions.","doctor.msg.database.broken.summary":"La base de données est inutilisable : {detail}","doctor.update_status.prerelease":"Version préliminaire en cours d’exécution ({current}) ; la version latest de npm est {latest}.","patterns.title":"Vos habitudes","patterns.workSchedule":"Planning de travail","patterns.peakHours":"Heures de pointe","patterns.busiestDays":"Jours les plus chargés","patterns.workflow":"Flux de travail","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.auth.cross-origin":"Cette requête vient d’un autre site, ou a atteint le serveur sous un nom inattendu : elle a été refusée. Ouvrez le tableau de bord à l’adresse affichée par `memesh serve`.","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.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.","httpError.operation.permission-denied":"MeMesh n’a pas l’autorisation de modifier les fichiers nécessaires à cette réparation. Fermez ce tableau de bord, exécutez `memesh serve` dans votre propre terminal, puis réessayez. Si l’échec persiste, exécutez `memesh doctor`.","time.justNow":"À l'instant","time.hoursAgo":"Il y a {count}h","time.today":"Aujourd'hui","time.yesterday":"Hier","time.daysAgo":"Il y a {count}j","time.lastWeek":"Semaine dernière","time.weeksAgo":"Il y a {count}sem","time.lastMonth":"Mois dernier","time.monthsAgo":"Il y a {count}mo","memory.access.frequent":"Fréquent · {count} rappels","memory.access.recalls":"{count} rappels","memory.access.never":"Jamais rappelé","cluster.knowledge":"Connaissance","cluster.activity":"Activité","cluster.session":"Sessions","cluster.reference":"Référence","cluster.all":"Tout","browse.filterTime":"Temps","browse.filterValue":"Valeur","browse.filterProject":"Projet","browse.filterSort":"Trier","browse.timeToday":"Aujourd'hui","browse.timeWeek":"Cette semaine","browse.timeMonth":"Ce mois-ci","browse.timeOlder":"Plus ancien","browse.valueRecalled":"✓ Utilisé","browse.valueNever":"Jamais rappelé","browse.sortMostRecalled":"Plus rappelé","browse.sortRecent":"Récent","browse.sortCreated":"Créé","browse.emptyFilter":"Aucune mémoire dans cette catégorie — essayez un autre filtre","lessons.stepsLabel":"étapes","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Pas de champs structurés — voir mémoire brute)","lessons.moreItems":"+{count} de plus","roadmap.title":"Historique du Projet","roadmap.summary":"{count} mémoires · {first} → {last}","roadmap.switchToList":"↩ Vue Liste","roadmap.switchToRoadmap":"🕘 Vue Historique","roadmap.emptyProject":"Aucune mémoire dans ce projet pour l'instant.","loop.label":"Boucle mémoire","loop.subtitleHas":"mémoires de connaissances rappelées ces 7 derniers jours","loop.subtitleNone":"Aucune mémoire rappelée cette semaine","loop.approxNote":"Approximation — suivi complet à partir de la mise à jour.","loop.sparkLabel":"30 derniers jours","roadmap.milestones":"Jalons","roadmap.keyLessons":"Leçons clés","radar.title":"Radar de couverture","radar.caption":"Mémoires actives (session et commit exclus)","radar.axis.lessons":"Leçons","radar.axis.decisions":"Décisions","radar.axis.patterns":"Patterns","radar.axis.bugs":"Bugs corrigés","radar.axis.processes":"Processus","radar.axis.architecture":"Architecture","ageMatrix.title":"Distribution par âge","ageMatrix.low":"Faible","ageMatrix.high":"Élevé","ageMatrix.legend":"profondeur = densité","ageMatrix.typeColumn":"Type","header.signalModeOn":"Mémoires essentielles","header.signalModeOff":"Toutes les mémoires","header.signalModeOnHint":"Affiche les objectifs, décisions, leçons et plans ; masque les enregistrements automatiques session, commit et activité dans Mémoires.","header.signalModeOffHint":"Affiche tous les enregistrements, y compris session, commit et activité capturés automatiquement, dans Mémoires.","globalFilter.focusedStatus":"Vue globale : Mémoires essentielles — les enregistrements automatiques session, commit et activité sont masqués dans Mémoires.","globalFilter.allStatus":"Vue globale : Toutes les mémoires — les enregistrements automatiques session, commit et activité sont inclus dans Mémoires.","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.coreHint":"Mémoire locale : remember, recherche FTS5 par mots-clés, hooks et navigation du Dashboard fonctionnent ensemble.","onboarding.searchHint":"Le rappel utilise la recherche locale FTS5 par mots-clés.","onboarding.reviewHint":"Un agent déjà actif peut préparer un paquet de résumé ou de transcription visible ; le Dashboard examine seulement la proposition préparée.","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.demoLoadedTitle":"Données de démonstration chargées","onboarding.demoLoadedBody":"{count} mémoires portent le tag demo. Vous pouvez supprimer uniquement ces mémoires ici.","onboarding.resetConfirm":"Supprimer toutes les mémoires portant le tag metadata.demo ? Les mêmes lignes ne peuvent pas être restaurées, mais vous pourrez recharger une nouvelle démo. Les mémoires réelles seront conservées.","onboarding.resetReadbackFailed":"La réinitialisation n’a pas pu être confirmée car des mémoires de démo sont encore présentes. L’action reste disponible ; réessayez ou exécutez memesh doctor.","onboarding.dismiss":"Fermer","common.serverError":"Le serveur a renvoyé une erreur (HTTP {status}). Réessayez — si cela persiste, exécutez `memesh doctor`.","emptyLibrary.title":"Votre mémoire est vide","emptyLibrary.body":"Rien n’est encore enregistré. Chargez la visite de démonstration (30 entrées) pour voir MeMesh en action — supprimable ensuite en un clic.","browse.truncated":"affichage des {shown} premières mémoires sur {total} — utilisez la recherche ou les filtres pour atteindre le reste","browse.truncatedUnknownTotal":"affichage des {shown} premières mémoires — le total est indisponible, il y en a peut-être d’autres","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":"Sur les canaux d'installation pris en charge, la première utilisation demande un consentement une fois avant de mettre à jour. « Pas maintenant » reporte cette version (24 h, puis 48 h, puis 7 jours) ; « Ne plus demander » désactive la vérification. Les autres canaux affichent leur propre action. Après une mise à jour, les hôtes en cours d'exécution gardent l'ancienne version jusqu'au redémarrage. MEMESH_AUTO_UPDATE définit la portée, sans contourner le consentement.","errors.timeout":"La requête a expiré","type.lesson_learned":"Leçon","type.lesson":"Leçon","type.mistake":"Erreur","type.decision":"Décision","type.goal":"Objectif","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","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","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}","common.unknown":"inconnu","insights.entitiesCount":"{n} entités","roadmap.viewToggle":"Vue de l’historique du projet","roadmap.viewTree":"Arbre","roadmap.viewMindmap":"Carte mentale","roadmap.mindmapNeedsPhases":"La carte mentale nécessite au moins 3 mémoires sur une fenêtre de 7 jours.","roadmap.activePhase":"active","roadmap.entryCount":"{count} entrée","roadmap.entriesCount":"{count} entrées","roadmap.otherGroup":"Autres ({count})","roadmap.lowSignalHidden":"({count} à signal faible masquées)","roadmap.resetHint":"Réinitialiser zoom et position (double-clic sur le fond aussi)","roadmap.zoomHint":"molette pour zoomer · glisser pour déplacer · {pct}%","roadmap.moreEntities":"+{count} de plus","roadmap.viewDecisions":"Décisions","roadmap.densityTitle":"Densité de capture par catégorie","roadmap.densityNote":"ce que memesh a capturé — pas tout ce qui s'est passé","roadmap.lineageSupersedes":"{n} remplacées","roadmap.lineageConflicts":"{n} conflits non résolus","adr.empty":"Aucune décision enregistrée pour ce projet pour le moment. Enregistrez-en une avec le type « decision » et elle apparaît ici avec son historique.","adr.statusActive":"active","adr.statusSuperseded":"remplacée","adr.supersedes":"remplace","adr.supersededBy":"remplacée par","nav.ariaLabel":"Sections du tableau de bord","feedback.descLabel":"Description du retour","doctor.msg.capture-liveness.no-records.summary":"Des hooks ont tourné sur cette machine (dernier signal il y a {hours} heures), mais aucun n'a laissé d'enregistrement de résultat. Soit les hooks en service sont antérieurs à ce suivi, soit ils échouent au chargement et n'enregistrent rien.","doctor.msg.capture-liveness.no-records.fix":"Mettez à jour les hooks MeMesh (plugin : `/plugin update memesh` ; npm : `memesh install-hooks`), redémarrez l'agent, lancez une session, puis relancez `memesh doctor`.","project.index.title":"Ce que l’on sait déjà ici","project.index.empty":"Rien n’est encore injecté automatiquement dans ce projet. Les mémoires importées, celles marquées comme non fiables et toute mémoire enregistrée sans étiquette `project:` ne sont pas comptées ici — le nombre affiché sur la puce du projet peut être plus élevé. Les décisions, leçons, modèles et références enregistrés avec `remember` apparaissent ici.","project.index.more":'{n} de plus — `memesh recall --tag "project:…"`',"project.index.older":"{n} plus anciennes (aucun changement depuis {days} jours) — utilisez recall pour les voir","project.index.cost":"Le même index qu’un agent reçoit au début de la session · ≈ {tokens} jetons ({bytes} octets)"},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","header.memory":"Erinnerung","insights.title":"Vorschläge zur Organisation der Erinnerungen","insights.reviewTitle":"Bereitgestellte Memory-Vorschläge","insights.reviewSubtitle":"Arbeitspakete warten auf menschliche Prüfung","insights.reviewSource":"Bereitgestellter Vorschlag — vor dem Anwenden prüfen","insights.source.calendar":"Kalender-Digest","insights.source.transcript":"Claude-Code-Transkript","insights.reviewBoundary":"Das Dashboard prüft bereits bereitgestellte Vorschläge. Es startet oder beauftragt keinen Agenten.","insights.statPending":"ausstehend","insights.statApplied":"angewendet","insights.statRejected":"abgelehnt","insights.filter.pending":"Ausstehend","insights.filter.applied":"Angewendet","insights.filter.rejected":"Abgelehnt","insights.filter.all":"Alle","insights.refresh":"Aktualisieren","insights.loading":"lädt…","insights.emptyOther":"Nichts hier.","insights.sources":"Quellen","insights.status.pending":"ausstehend","insights.status.applied":"angewendet","insights.status.rejected":"abgelehnt","insights.viewDetail":"Details anzeigen","insights.collapse":"Einklappen","insights.accept":"Übernehmen","insights.applying":"Wird angewendet…","insights.reject":"Ablehnen","insights.rejectConfirm":"Diese Erkenntnis ablehnen? Diese Aktion kann nicht rückgängig gemacht werden.","insights.observations":"Zusammenfassende Beobachtungen","insights.tags":"Tags","insights.sourceIds":"Quell-Entities","insights.validationWarnings":"Alte Validierungswarnungen","insights.validationClaim":"Aussage","insights.validationReason":"Grund","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.settings":"Einstellungen","tab.home":"Start","tab.memories":"Erinnerungen","tab.project":"Projekt","memories.searchPlaceholder":"Beim Tippen filtern — Enter für Suche nach Relevanz","memories.scopeLabel":"Bereich","memories.scopeWork":"Arbeitsebene","memories.scopeEvidence":"Belege","memories.scopeAll":"Alle","memories.scopeArchived":"Archiviert","memories.composition":"Zusammensetzung","memories.rankedBy":"nach Relevanz sortiert","memories.backToList":"Zurück zur Liste","memories.workEmpty":"Noch keine Erinnerungen der Arbeitsebene — Ziele, Entscheidungen, Lektionen und Pläne landen hier, sobald sie erfasst werden.","memories.showAll":"Alle Erinnerungen anzeigen","memories.expand":"Details anzeigen","memories.collapse":"Details ausblenden","memory.technicalDetails":"Technische Details","memory.canonicalName":"Kanonischer Name","memory.rawType":"Rohtyp","home.analyticsTitle":"Analyse","handoff.terminal":"Terminal erforderlich","handoff.terminalPrereq":"Auf dem Rechner mit MeMesh ausführen. Das Dashboard führt den Befehl nicht aus.","handoff.copyCommand":"Befehl kopieren","handoff.commandCopied":"Befehl kopiert","handoff.github":"Öffnet GitHub — vorausgefülltes Issue vor dem Senden prüfen","home.analyticsHint":"Gesundheit, Zeitleiste, Patterns und Nutzung — klappt bei Bedarf aus","home.nextAction.eyebrow":"Empfohlener nächster Schritt","home.nextAction.why":"Warum:","home.nextAction.result":"Erwartetes Ergebnis:","home.nextAction.loading.title":"Auf Handlungsbedarf wird geprüft…","home.nextAction.loading.why":"MeMesh liest den aktuellen Speicher, Suchindex und die Prüfliste.","home.nextAction.loading.result":"Nach den Prüfungen erscheint genau eine Empfehlung.","home.nextAction.empty.title":"Erste Erinnerung hinzufügen","home.nextAction.empty.why":"Der Speicher ist leer; es gibt noch nichts zu suchen oder zu ordnen.","home.nextAction.empty.result":"Unter Erinnerungen können Sie eine löschbare Demo laden oder echte Arbeit erfassen.","home.nextAction.empty.action":"Erinnerungen öffnen","insights.emptyPending":"Noch keine offenen Prüfungen. Neue Speicherprüfungen erscheinen hier, sobald sie verfügbar sind.","home.nextAction.insights.title":"Vorschläge zur Speicherordnung prüfen","home.nextAction.insights.why":"MeMesh hat Vorschläge, die auf Ihre Entscheidung warten.","home.nextAction.insights.result":"Nützliche Zusammenfassungen annehmen oder ungeeignete Vorschläge ablehnen.","home.nextAction.insights.action":"Vorschläge prüfen","home.nextAction.healthy.title":"Derzeit keine Aktion nötig","home.nextAction.healthy.why":"Speicher, Suchindex und Prüfliste haben keine bekannten offenen Aktionen.","home.nextAction.healthy.result":"Arbeiten Sie weiter; MeMesh zeigt hier den nächsten bestätigten Bedarf.","home.nextAction.unavailable.title":"Empfehlung derzeit nicht verfügbar","home.nextAction.unavailable.why":"Eine Statusprüfung war nicht lesbar, daher rät MeMesh nicht.","home.nextAction.unavailable.result":"Neu laden, um ohne Änderung an Speicher oder Einstellungen erneut zu prüfen.","home.nextAction.unavailable.action":"Statusprüfungen wiederholen","project.selectLabel":"Projekt","project.selectPrompt":"Wähle ein Projekt, um seine Historie zu sehen.","project.empty":"Noch keine Projekt-Erinnerungen. Arbeite in einem git-Repository mit installierten memesh-Hooks und seine Geschichte erscheint hier.","project.taskState.title":"Wo dieses Projekt steht","project.taskState.goal":"Ziel","project.taskState.next":"Nächster Schritt","project.taskState.blocked":"Blockiert","project.taskState.done":"Erledigt","project.taskState.updated":"Aktualisiert {when}","project.taskState.provenance":"Mit `memesh task` ausdrücklich festgehalten — nicht aus Erinnerungszahlen abgeleitet.","project.taskState.empty":"Für dieses Projekt ist noch kein Aufgabenstand hinterlegt. Setzen Sie ihn in einer Sitzung mit `memesh task --goal … --next …`, dann erscheint er hier.","guard.sourceLesson":"Quell-Lektion","guard.pattern":"Auslösemuster","guard.message":"Angezeigte Warnung","guard.shouldMatch":"Muss auslösen bei","guard.shouldNotMatch":"Muss stumm bleiben bei","search.button":"Suchen","search.searching":"Suche läuft…","search.results":"Ergebnisse","search.result":"Ergebnis","search.noResults":"Keine Ergebnisse für","search.facts":"Fakten","browse.title":"Alle Erinnerungen","browse.active":"aktiv","browse.archived":"archiviert","browse.refresh":"Aktualisieren","browse.noMatch":"Keine passenden Erinnerungen:","browse.prev":"← Zurück","browse.next":"Weiter →","browse.archive":"Archivieren","browse.restore":"Wiederherstellen","browse.confirmArchive":"Diese Erinnerung archivieren?","browse.archiveFailed":"Speicher konnte nicht archiviert werden: {message}","browse.restoreFailed":"Speicher konnte nicht wiederhergestellt werden: {message}","analytics.totalMemories":"Erinnerungen gesamt","analytics.knowledgeFacts":"Wissensfakten","analytics.connections":"Verbindungen","analytics.topics":"Themen","analytics.insights":"Einblicke","analytics.thisWeek":"Diese Woche","analytics.new":"neue","analytics.stale":"Inaktiv (30+ Tage ungenutzt)","analytics.archivedLabel":"Archiviert","analytics.mostRecalled":"Am häufigsten abgerufen","health.title":"Speichergesundheit","metrics.notMeasured":"Noch nicht gemessen","metrics.health":"Gesundheit","metrics.healthNote":"Aktivität, Qualität, Frische, Lehren","metrics.critical":"Kritische Lehren","metrics.criticalPartial":"von {tagged} eingestuften · {total} Lehren insgesamt","metrics.criticalAll":"von {total} Lehren, alle eingestuft","metrics.criticalUnclassified":"{total} Lehren, keine nach Schweregrad eingestuft","metrics.criticalNoLessons":"Noch keine Lehren erfasst","metrics.citation":"Zitate","metrics.citationNote":"{cited} von {total} Sitzungen zitierten eine Erinnerung","metrics.citationNotMeasured":"Die Zitat-Erfassung beginnt mit der nächsten Sitzung","metrics.reused":"Diese Woche genutzt","metrics.reusedNote":"Näherungswert — aus den letzten Zugriffszeiten","health.excellent":"Ausgezeichnet","health.good":"Gut","health.fair":"Mittel","health.poor":"Schlecht","health.activity":"Aktivität","health.quality":"Qualität","health.freshness":"Frische","health.lessons":"Selbstverbesserung","timeline.title":"Letzte 30 Tage","timeline.created":"Erstellt","timeline.recalled":"Abgerufen","value.totalRecalls":"Gesamtabrufe","value.lessonsLearned":"Gelernte Lektionen","value.lessonsSaved":"Angewendete Lektionen","value.coverage":"Wissensabdeckung","cleanup.title":"Aufräumvorschläge","cleanup.allClean":"Ihr Speicher ist sauber. Keine veralteten oder doppelten Entitäten erkannt.","cleanup.staleLabel":"Niedrige Konfidenz / ungenutzt","cleanup.duplicateLabel":"Mögliche Duplikate","cleanup.confidence":"Konfidenz","cleanup.unused":"ungenutzt","cleanup.entityMeta":"{type} · Konfidenz {confidence}% · {days} Tage ungenutzt","settings.saved":"Gespeichert.","settings.configLoadFailed":"Einstellungen konnten nicht gelesen werden. Laden Sie die Seite neu, um es erneut zu versuchen.","settings.configReadbackFailed":"Der Server hat die gespeicherte Einstellung nicht zurückgegeben. Versuchen Sie es erneut.","settings.language":"Sprache","settings.interfaceLanguage":"Sprache der Benutzeroberfläche","settings.interfaceLanguageHint":"Ändert die Oberfläche in diesem Browser sofort.","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":"Keine neuere veröffentlichte Version verfügbar","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":"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.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.updateRetryGuidance":"Überprüfen Sie Ihre Verbindung und die npm-Registry-Einstellungen und versuchen Sie es erneut. Ihre installierte Version wurde nicht geändert.","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.","settings.installationDetails":"Installationsdetails","settings.installationDetailsUnavailable":"Für diese Installation ist kein Versionsvergleich verfügbar.","settings.interfacePath":"Diese Oberfläche","settings.terminalPath":"Terminal-Befehl","settings.technicalDetails":"Technische Details","settings.installationDetailsHint":"Unterschiedliche installierte Versionen müssen nicht unbedingt aktualisiert werden. Prüfe unter Updates die veröffentlichten Releases.","roadmap.resetView":"Ansicht zurücksetzen","lessons.error":"Fehler","lessons.rootCause":"Ursache","lessons.fix":"Lösung","lessons.prevention":"Prävention","feedback.button":"💬 Feedback","feedback.title":"Feedback auf GitHub öffnen","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…","feedback.popupBlocked":"GitHub wurde nicht geöffnet. Ihr Entwurf bleibt erhalten; erlauben Sie Pop-ups, versuchen Sie es erneut oder kopieren Sie den vorbereiteten Link.","feedback.retry":"GitHub erneut öffnen","feedback.copyLink":"GitHub-Link kopieren","feedback.linkCopied":"Link kopiert","feedback.copyFailed":"Der Link konnte nicht kopiert werden. Versuchen Sie erneut, GitHub zu öffnen.","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","doctorBanner.fix":"Automatisch beheben","doctorBanner.fixInProgress":"Wird behoben…","doctorBanner.fixDone":"Behoben","doctorBanner.restartRequired":"Starten Sie den Agenten neu, um dieses Update abzuschließen.","doctor.label.readme_locale_parity":"README-Übersetzungen","doctor.label.config":"Konfigurationsdatei","doctor.label.mcp-config":"MCP-Verbindungsdatei","doctor.label.hooks-config":"Hook-Definitionen","doctor.label.hook-scripts":"Hook-Skripte","doctor.label.hook-wiring":"Verbindung zu Claude Code","doctor.label.hook-activity":"Automatische Erfassung","doctor.label.node-runtime":"Node.js-Version","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Plugin-Code ist aktuell","doctor.label.shell-cli":"Terminal-Befehl","doctor.label.dashboard":"Dashboard-Dateien","doctor.label.claude-channel":"Claude-Kanal-Registrierung","doctor.msg.claude-channel.unregistered.summary":"Live-Benachrichtigungen des Claude-Kanals sind nicht aktiviert. MCP-Speichertools und dauerhafte Posteingangsnachrichten können weiterhin funktionieren. Diese Vorschau ist optional.","doctor.msg.claude-channel.unregistered.fix":"Um diesen optionalen Kanal zu aktivieren, führen Sie `memesh agent setup claude` aus und registrieren Sie dann den angezeigten MCP-Befehl in Ihren Claude-Benutzereinstellungen.","doctor.label.update-status":"Updates","doctor.label.http-probe":"Lokaler Server","doctor.label.skills-manifest":"Mitgelieferte Dateien","doctor.label.config_parse":"Konfigurationsdatei","doctor.label.install-channel":"Installationsart","doctor.label.fts_segmentation":"Stichwort-Index","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 (.claude-plugin/mcp.json), fehlt.","doctor.msg.mcp-config.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/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":".claude-plugin/mcp.json enthält den memesh-Servereintrag nicht mehr.","doctor.msg.mcp-config.no-entry.fix":"Installieren Sie MeMesh neu, um ihn wiederherzustellen.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` startet eine Datei, die in dieser Installation fehlt — daher startet kein memesh-Werkzeug in Claude Code.","doctor.msg.mcp-config.entry-missing.fix":"Installieren Sie MeMesh neu. Wenn Sie `.claude-plugin/mcp.json` von Hand geändert haben, richten Sie es wieder auf `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js` aus.","doctor.msg.mcp-config.placeholder-unresolved.summary":"NICHT GEPRÜFT: `.claude-plugin/mcp.json` startet einen Pfad mit `${CLAUDE_PLUGIN_ROOT}` — diese Variable setzt nur die Plugin-Laufzeit von Claude Code ein. Diese Kopie läuft nicht als Plugin, daher wurde die genannte Datei nicht geprüft.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Prüfen Sie es so, wie es die Plugin-Laufzeit täte: `CLAUDE_PLUGIN_ROOT=<Ordner dieser Installation> memesh doctor` ausführen.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json fehlt, die automatische Erinnerungs-Erfassung kann deshalb nicht laufen.","doctor.msg.hooks-config.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json ist beschädigt (kein gültiges JSON).","doctor.msg.hooks-config.invalid-json.fix":"Reparieren Sie {path} oder installieren Sie MeMesh neu.","doctor.msg.hooks-config.missing-types.summary":"In hooks/hooks.json fehlen diese Hook-Typen: {types}. Ein Teil der automatischen Erfassung läuft nicht.","doctor.msg.hooks-config.missing-types.fix":"Stellen Sie die mitgelieferte Hook-Konfiguration wieder her oder installieren Sie MeMesh neu.","doctor.msg.hook-scripts.none.summary":"Die Hook-Konfiguration enthält keine Skripte, es kann also nichts automatisch erfasst werden.","doctor.msg.hook-scripts.none.fix":"Installieren Sie MeMesh neu.","doctor.msg.hook-scripts.missing.summary":"Diese Hook-Skripte fehlen: {files}","doctor.msg.hook-scripts.missing.fix":"Installieren Sie MeMesh neu, um sie wiederherzustellen.","doctor.msg.hook-scripts.not-executable.summary":"Diese Hook-Skripte existieren, dürfen aber nicht ausgeführt werden: {files}","doctor.msg.hook-scripts.not-executable.fix":"Führen Sie `chmod +x scripts/hooks/*.js` aus, oder `npm run build` in einem Quellcode-Checkout.","doctor.msg.hook-wiring.no-marker.summary":"memesh ist noch nicht mit Claude Code verbunden, es wird also nichts automatisch gemerkt.","doctor.msg.hook-wiring.no-marker.fix":"Führen Sie einmal `memesh install-hooks` aus, danach `memesh doctor` zur Kontrolle.","doctor.msg.hook-wiring.script-missing.summary":"Ein verdrahteter memesh-Hook zeigt auf {path}, das nicht mehr existiert — der Agent ruft bei jedem passenden Ereignis eine fehlende Datei auf. Meist ein Rückstand eines Upgrades, das den Hook stillgelegt hat.","doctor.msg.hook-wiring.script-missing.fix":"Führen Sie `memesh install-hooks` aus (stillgelegte Einträge werden entfernt) und starten Sie den Agenten neu.","doctor.msg.hook-wiring.marker-unreadable.summary":"Der Verbindungsvermerk unter {path} kann nicht gelesen werden.","doctor.msg.hook-wiring.marker-unreadable.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.marker-malformed.summary":"Der Verbindungsvermerk ist beschädigt.","doctor.msg.hook-wiring.marker-malformed.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.settings-missing.summary":"Die Claude-Code-Einstellungsdatei ({path}) ist weg, die Verbindung ist deshalb unterbrochen.","doctor.msg.hook-wiring.settings-missing.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} ist beschädigt (kein gültiges JSON).","doctor.msg.hook-wiring.settings-invalid.fix":"Stellen Sie die Datei aus einem Backup wieder her, oder führen Sie `memesh install-hooks` aus, um sie neu anzulegen.","doctor.msg.hook-wiring.entries-removed.summary":"Die memesh-Einträge wurden aus {path} entfernt, die Verbindung ist deshalb unterbrochen.","doctor.msg.hook-wiring.entries-removed.fix":"Führen Sie `memesh install-hooks` erneut aus.","doctor.msg.hook-wiring.root-moved.summary":"Die Verbindung zeigt auf {path}, das es nicht mehr gibt (memesh wurde vermutlich verschoben).","doctor.msg.hook-wiring.root-moved.fix":"Führen Sie `memesh install-hooks` aus, um sie zu aktualisieren.","doctor.msg.hook-activity.never-ran.summary":"Seit Beginn der Aufzeichnung vor {hours} Stunden wurde kein Capture-Hook ausgeführt, obwohl die Hook-Verdrahtung vorhanden ist — nichts wird gespeichert.","doctor.msg.hook-activity.never-ran.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus. Steht dort weiterhin, dass kein Hook lief, führen Sie `memesh install-hooks` aus und starten Sie den Agenten neu.","doctor.msg.hook-activity.stale.summary":"Der letzte Capture-Hook lief vor etwa {hours} Stunden ({hook}). Wenn Sie seitdem gearbeitet haben, ist die Erfassung gestoppt und nichts aus diesen Sitzungen wurde gespeichert.","doctor.msg.hook-activity.stale.fix":"Starten Sie den Agenten neu, beenden Sie eine Sitzung und führen Sie `memesh doctor` erneut aus. Erholt es sich nicht, führen Sie `memesh install-hooks` aus.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Der session-summary-Hook lief zuletzt vor etwa {hours} Stunden, und in den letzten 3 Tagen kamen auch keine Claude-Code-Schreibvorgänge an. Ist diese Maschine zu einem anderen Agenten (Codex / Gemini) gewechselt, ist das erwartet; nutzen Sie hier noch Claude Code, ist die Erfassung gestoppt.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Wenn Sie auf dieser Maschine noch Claude Code nutzen: neu starten, eine Sitzung beenden und `memesh doctor` erneut ausführen. Erholt es sich nicht, führen Sie `memesh install-hooks` aus.","doctor.msg.hook-activity.query-failed.summary":"Die Hook-Aktivität konnte nicht aus der Datenbank gelesen werden: {detail}. Der Zustand der Erfassung ist unbekannt, und das ist nicht dasselbe wie gesund.","doctor.msg.hook-activity.query-failed.fix":"Führen Sie `memesh doctor --verbose` für den vollständigen Fehler aus und prüfen Sie, ob ~/.memesh lesbar und die Festplatte nicht voll ist.","doctor.msg.hook-activity.stale-unknown.summary":'Der Zeitstempel des letzten Laufs des {hook}-Hooks ist unlesbar (beschädigt, oder von einer Maschine mit falscher Uhr geschrieben). Der Capture-Zustand ist „unbekannt", und das ist nicht dasselbe wie „gesund".',"doctor.msg.hook-activity.stale-unknown.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus — ein frischer Lauf überschreibt den defekten Zeitstempel.","doctor.msg.hook-activity.disabled.summary":"Die automatische Erfassung ist ausgeschaltet (MEMESH_AUTO_CAPTURE oder autoCapture in der Konfiguration) — absichtlich, daher ist die Stille der Hooks zu erwarten. Zum Fortsetzen wieder einschalten.","doctor.msg.hook-activity.disabled-env.summary":"Die automatische Erfassung ist durch MEMESH_AUTO_CAPTURE=false in der Umgebung dieser Shell ausgeschaltet. doctor sieht nur seine eigene Umgebung — läuft Ihr Agent ohne diese Variable, ist die Erfassung dort nicht betroffen.","doctor.msg.hook-activity.not-wired.summary":"Es ist noch nie ein Capture-Hook gelaufen — und auf dieser Maschine ist kein Capture-Hook (Stop / PostToolUse / PreCompact) nachweislich verdrahtet, es gibt also nichts auszuführen.","doctor.msg.hook-activity.not-wired.fix":"Für automatische Erfassung führen Sie `memesh install-hooks` aus. Bei einer reinen MCP-Installation (Codex / Gemini) ist das erwartet und kann ignoriert werden.","doctor.msg.hook-activity.stop-silent.summary":"Der {hook}-Hook stempelt, aber der session-summary-Hook ist in den {hours} Stunden seit Beginn der Aufzeichnung kein einziges Mal gelaufen — die Sitzungserfassung ist womöglich kaputt, verdeckt durch die Commit-Erfassung.","doctor.msg.hook-activity.stop-silent.fix":"Beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus. Läuft session-summary dann immer noch nicht, führen Sie `memesh install-hooks` aus und starten Sie den Agenten neu.","doctor.label.capture-liveness":"Erfassung lebendig","doctor.msg.capture-liveness.silent-hook.summary":"{hook}: {runs} Läufe, 0 Schreibvorgänge — „{reason}“. Der Hook läuft und entscheidet jedes Mal, dass es nichts zu speichern gibt — genauso sieht auch eine kaputte Erfassung aus.","doctor.msg.capture-liveness.silent-hook.fix":"Führen Sie `memesh doctor --json` für die Zahlen je Hook aus. Passt der Grund nicht zu Ihrer Arbeitsweise, führen Sie `memesh install-hooks` aus und starten Sie den Agenten neu.","doctor.msg.capture-liveness.type-stopped.summary":"In den letzten 7 Tagen wurde nichts vom Typ „{type}“ erfasst, in den 7 Tagen davor {prev}. Etwas, das erinnert wurde, wird nicht mehr erinnert.","doctor.msg.capture-liveness.type-stopped.fix":"Führen Sie `memesh doctor --json` für die Zahlen je Hook aus und prüfen Sie, ob sich Ihre Arbeitsweise geändert hat — wenn nicht, führen Sie `memesh install-hooks` aus und starten Sie den Agenten neu.","doctor.msg.capture-liveness.never-ran.summary":"Der Hook {hook} hat in den {hours} Stunden seit Beginn der Aufzeichnung weder einen Eintrag noch einen Herzschlag hinterlassen — er lief nie, also wird nichts gespeichert, was er erfassen würde.","doctor.msg.capture-liveness.never-ran.fix":"Führen Sie `memesh install-hooks` aus, starten Sie den Agenten neu, beenden Sie eine Arbeitssitzung und führen Sie `memesh doctor` erneut aus.","doctor.msg.capture-liveness.not-wired.summary":"Der Hook {hook} wurde noch nie ausgeführt, aber auf diesem Rechner ist kein Erfassungs-Hook verbunden.","doctor.msg.capture-liveness.not-wired.fix":"Für automatische Erfassung führen Sie `memesh install-hooks` aus. Bei einer reinen MCP-Installation (Codex, Gemini oder Cursor) ist dies erwartbar.","doctor.msg.capture-liveness.never-ran-legacy.summary":"Der Hook {hook} hat keinen Ergebnis-Eintrag, aber seit Beginn der Überwachung wurden {captured} automatische Erinnerungen gespeichert. Wahrscheinlich laufen noch ältere Hooks.","doctor.msg.capture-liveness.never-ran-legacy.fix":"Aktualisieren Sie die MeMesh-Hooks, starten Sie den Agenten neu und führen Sie `memesh doctor` erneut aus.","doctor.msg.capture-liveness.query-failed.summary":"Der Erfassungsstatus konnte nicht aus der Datenbank gelesen werden: {detail}. Ob überhaupt etwas gespeichert wird, ist unbekannt — und unbekannt ist nicht dasselbe wie gesund.","doctor.msg.capture-liveness.query-failed.fix":"Der Fehler steht oben. Prüfen Sie, ob ~/.memesh lesbar ist und die Festplatte nicht voll ist.","doctor.msg.hook-activity.never-ran-legacy.summary":"Kein Hook hat den Heartbeat gestempelt, aber seit Beginn der Aufzeichnung sind {captured} automatisch erfasste Erinnerungen angekommen — Hooks aus einer Version vor dem Heartbeat-Tracking laufen wahrscheinlich noch.","doctor.msg.hook-activity.never-ran-legacy.fix":"Aktualisieren Sie die memesh-Hooks auf die aktuelle Version (Plugin: `/plugin update memesh`; npm: `memesh install-hooks`) und starten Sie den Agenten neu.","doctor.msg.node-runtime.too-old.summary":"Ihr Node.js ist älter, als dieses Paket unterstützt. {detail}","doctor.msg.node-runtime.too-old.fix":"Aktualisieren Sie Node.js auf {required} oder neuer und führen Sie `memesh doctor` erneut aus.","doctor.msg.native-binding.load-failed.summary":"SQLite konnte die Datenbank nicht öffnen: {detail}.","doctor.msg.native-binding.load-failed.fix":"Prüfen Sie die Node-Laufzeit und installieren Sie MeMesh bei Bedarf neu.","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, wenn Sie einen separaten Terminal-Befehl möchten. Seine Datenbank hängt von seiner Konfiguration ab.","doctor.msg.shell-cli.versions.summary":"Installierte Versionen: diese Oberfläche {current}; Terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"Das Plugin wurde aus Commit {installed} installiert, der Marketplace ist aber unter derselben Version zu {marketplace} weitergegangen. {host} aktualisiert keinen Cache, dessen Version sich nicht geändert hat — Sie führen also älteren Code aus als der Marketplace hat.","doctor.msg.plugin-cache.stale.fix":"Führen Sie `{command}` aus, um den Cache zu erneuern, und starten Sie {host} dann neu.","doctor.msg.plugin-cache.unverifiable.summary":"Ob das installierte Plugin dem Marketplace entspricht, ließ sich nicht feststellen. Die Version allein reicht nicht — zwei Builds können dieselbe Version tragen.","doctor.msg.plugin-cache.unverifiable.fix":"Führen Sie `{command}` einmal aus; es zeichnet den Commit auf, danach kann diese Prüfung antworten.","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.config-parse.retired-settings.summary":"Die gültige Konfigurationsdatei unter {path} enthält noch {count} eingestellte Werte auf oberster Ebene, die nicht mehr unterstützt werden ({keys}). Diese Version ignoriert sie, aber alte Anbieterzugangsdaten oder Einstellungen können auf dem Datenträger verbleiben.","doctor.msg.config-parse.retired-settings.fix":"Prüfen Sie {path} lokal und entfernen Sie nur diese nicht mehr unterstützten Schlüssel auf oberster Ebene. Fügen Sie die Datei nicht in ein Issue ein, da sie Zugangsdaten enthalten kann. Führen Sie danach memesh doctor erneut aus.","doctor.msg.message-capability.probe-failed.summary":"Die Prüfung der installierten Nachrichtenfunktion ist fehlgeschlagen: {detail}.","doctor.msg.message-router.socket-missing.summary":"Unter {path} gibt es keinen Local-router-Socket; gestoppte oder fehlende Sitzungen werden nicht geweckt.","doctor.msg.message-router.socket-insecure.summary":"Der Router-Socket unter {path} ist kein eigentümerprivater Unix-Socket.","doctor.msg.message-router.socket-unreachable.summary":"Der private Router-Socket unter {path} existiert, nahm aber keine lokale Verbindung an.","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.citation.none.summary":"Sitzungen erhielten eingefügte Memories, aber keines wurde zitiert.","doctor.msg.citation.none.fix":"Prüfen Sie den Zitationsvertrag in ~/.claude/rules/memesh-citations.md und kontrollieren Sie nach einigen Sitzungen erneut.","doctor.msg.database.broken.summary":"Die Datenbank ist nicht nutzbar: {detail}","doctor.update_status.prerelease":"Vorabversion ({current}) wird ausgeführt; npm latest ist {latest}.","patterns.title":"Ihre Muster","patterns.workSchedule":"Arbeitsplan","patterns.peakHours":"Spitzenzeiten","patterns.busiestDays":"Aktivste Tage","patterns.workflow":"Arbeitsablauf","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.auth.cross-origin":"Diese Anfrage kam von einer anderen Website oder erreichte den Server unter einem unerwarteten Namen und wurde abgelehnt. Öffne das Dashboard über die von `memesh serve` ausgegebene Adresse.","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.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.","httpError.operation.permission-denied":"MeMesh darf die für diese Reparatur benötigten Dateien nicht ändern. Schließen Sie dieses Dashboard, führen Sie `memesh serve` in Ihrem eigenen Terminal aus und versuchen Sie es erneut. Falls es weiterhin fehlschlägt, führen Sie `memesh doctor` aus.","time.justNow":"Gerade eben","time.hoursAgo":"Vor {count} Std","time.today":"Heute","time.yesterday":"Gestern","time.daysAgo":"Vor {count} T","time.lastWeek":"Letzte Woche","time.weeksAgo":"Vor {count} W","time.lastMonth":"Letzter Monat","time.monthsAgo":"Vor {count} M","memory.access.frequent":"Häufig · {count} Abrufe","memory.access.recalls":"{count} Abrufe","memory.access.never":"Nie abgerufen","cluster.knowledge":"Wissen","cluster.activity":"Aktivität","cluster.session":"Sitzungen","cluster.reference":"Referenz","cluster.all":"Alle","browse.filterTime":"Zeit","browse.filterValue":"Wert","browse.filterProject":"Projekt","browse.filterSort":"Sortieren","browse.timeToday":"Heute","browse.timeWeek":"Diese Woche","browse.timeMonth":"Dieser Monat","browse.timeOlder":"Älter","browse.valueRecalled":"✓ Verwendet","browse.valueNever":"Nie abgerufen","browse.sortMostRecalled":"Häufigste","browse.sortRecent":"Zuletzt","browse.sortCreated":"Erstellt","browse.emptyFilter":"Keine Erinnerungen in dieser Kategorie — anderen Filter probieren","lessons.stepsLabel":"Schritte","lessons.commitsCount":"{count} Commits","lessons.unstructured":"(Keine strukturierten Felder — siehe Rohspeicher)","lessons.moreItems":"+{count} weitere","roadmap.title":"Projektverlauf","roadmap.summary":"{count} Erinnerungen · {first} → {last}","roadmap.switchToList":"↩ Listenansicht","roadmap.switchToRoadmap":"🕘 Verlaufsansicht","roadmap.emptyProject":"Noch keine Erinnerungen in diesem Projekt.","loop.label":"Memory-Loop","loop.subtitleHas":"Wissens-Erinnerungen in den letzten 7 Tagen wiederverwendet","loop.subtitleNone":"Diese Woche keine Wissens-Erinnerungen abgerufen","loop.approxNote":"Annäherung — vollständige Verfolgung beginnt nach Upgrade.","loop.sparkLabel":"Letzte 30 Tage","roadmap.milestones":"Meilensteine","roadmap.keyLessons":"Wichtige Lektionen","radar.title":"Wissensabdeckung","radar.caption":"Aktive Wissens-Erinnerungen (session und commit ausgeschlossen)","radar.axis.lessons":"Lektionen","radar.axis.decisions":"Entscheidungen","radar.axis.patterns":"Muster","radar.axis.bugs":"Bugfixes","radar.axis.processes":"Prozesse","radar.axis.architecture":"Architektur","ageMatrix.title":"Altersverteilung","ageMatrix.low":"Niedrig","ageMatrix.high":"Hoch","ageMatrix.legend":"Farbtiefe = Dichte","ageMatrix.typeColumn":"Typ","header.signalModeOn":"Wichtige Erinnerungen","header.signalModeOff":"Alle Erinnerungen","header.signalModeOnHint":"Zeigt Ziele, Entscheidungen, Erkenntnisse und Pläne; blendet automatisch erfasste Session-, Commit- und Aktivitätseinträge in Erinnerungen aus.","header.signalModeOffHint":"Zeigt alle Einträge einschließlich automatisch erfasster Session-, Commit- und Aktivitätseinträge in Erinnerungen.","globalFilter.focusedStatus":"Globale Ansicht: Wichtige Erinnerungen — automatisch erfasste Session-, Commit- und Aktivitätseinträge sind in Erinnerungen ausgeblendet.","globalFilter.allStatus":"Globale Ansicht: Alle Erinnerungen — automatisch erfasste Session-, Commit- und Aktivitätseinträge sind in Erinnerungen enthalten.","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.coreHint":"Lokaler Speicher: remember, FTS5-Stichwortsuche, Hooks und Dashboard-Navigation arbeiten zusammen.","onboarding.searchHint":"Der Abruf nutzt lokale FTS5-Stichwortsuche.","onboarding.reviewHint":"Ein bereits laufender Agent kann ein Digest- oder sichtbares Transkript-Arbeitspaket vorbereiten; das Dashboard prüft nur den bereitgestellten Vorschlag.","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.demoLoadedTitle":"Demo-Daten sind geladen","onboarding.demoLoadedBody":"{count} Erinnerungen sind als demo markiert. Hier können Sie nur diese Erinnerungen entfernen.","onboarding.resetConfirm":"Alle mit metadata.demo markierten Erinnerungen entfernen? Dieselben Zeilen können nicht wiederhergestellt werden, aber später kann eine neue Demo geladen werden. Echte Erinnerungen bleiben erhalten.","onboarding.resetReadbackFailed":"Der Reset konnte nicht bestätigt werden, weil Demo-Erinnerungen verbleiben. Die Bereinigungsaktion bleibt verfügbar; versuchen Sie es erneut oder führen Sie memesh doctor aus.","onboarding.dismiss":"Schließen","common.serverError":"Der Server hat einen Fehler gemeldet (HTTP {status}). Versuchen Sie es erneut — falls es weiter auftritt, führen Sie `memesh doctor` aus.","emptyLibrary.title":"Ihr Speicher ist leer","emptyLibrary.body":"Noch ist nichts gespeichert. Laden Sie die Demo-Tour mit 30 Einträgen, um MeMesh in Aktion zu sehen — später mit einem Klick löschbar.","browse.truncated":"die ersten {shown} von {total} Erinnerungen werden angezeigt — nutzen Sie Suche oder Filter für den Rest","browse.truncatedUnknownTotal":"die ersten {shown} Erinnerungen werden angezeigt — die Gesamtzahl ist nicht verfügbar, es könnten mehr sein","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":"Auf unterstützten Installationskanälen wird beim ersten Gebrauch einmal um Zustimmung gebeten, bevor aktualisiert wird. „Jetzt nicht“ verschiebt diese Version (24 h, dann 48 h, dann 7 Tage); „Nicht mehr fragen“ schaltet die Prüfung ab. Andere Kanäle zeigen ihren eigenen Update-Weg. Nach einem Upgrade behalten laufende Hosts die alte Version bis zum Neustart. MEMESH_AUTO_UPDATE legt nur den Umfang fest und umgeht die Zustimmung nicht.","errors.timeout":"Zeitüberschreitung der Anfrage","type.lesson_learned":"Lektion","type.lesson":"Lektion","type.mistake":"Fehler","type.decision":"Entscheidung","type.goal":"Ziel","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","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","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}","common.unknown":"unbekannt","insights.entitiesCount":"{n} Entitäten","roadmap.viewToggle":"Projektverlaufsansicht","roadmap.viewTree":"Baum","roadmap.viewMindmap":"Mindmap","roadmap.mindmapNeedsPhases":"Die Mindmap braucht mindestens 3 Erinnerungen innerhalb von 7 Tagen.","roadmap.activePhase":"aktiv","roadmap.entryCount":"{count} Eintrag","roadmap.entriesCount":"{count} Einträge","roadmap.otherGroup":"Sonstige ({count})","roadmap.lowSignalHidden":"({count} mit schwachem Signal ausgeblendet)","roadmap.resetHint":"Zoom und Position zurücksetzen (Doppelklick auf den Hintergrund geht auch)","roadmap.zoomHint":"scrollen zum Zoomen · ziehen zum Schwenken · {pct}%","roadmap.moreEntities":"+{count} weitere","roadmap.viewDecisions":"Entscheidungen","roadmap.densityTitle":"Erfassungsdichte nach Kategorie","roadmap.densityNote":"was memesh erfasst hat — nicht alles, was passiert ist","roadmap.lineageSupersedes":"{n} ersetzt","roadmap.lineageConflicts":"{n} ungelöste Konflikte","adr.empty":'Für dieses Projekt sind noch keine Entscheidungen erfasst. Erfasse eine mit dem Typ „decision", und sie erscheint hier mit ihrer Historie.',"adr.statusActive":"aktiv","adr.statusSuperseded":"ersetzt","adr.supersedes":"ersetzt","adr.supersededBy":"ersetzt durch","nav.ariaLabel":"Dashboard-Bereiche","feedback.descLabel":"Feedback-Beschreibung","doctor.msg.capture-liveness.no-records.summary":"Auf diesem Rechner sind Hooks gelaufen (letztes Lebenszeichen vor {hours} Stunden), aber keiner hat einen Ergebnis-Eintrag hinterlassen. Entweder stammen die laufenden Hooks aus einer Version vor der Ergebnis-Protokollierung, oder sie scheitern beim Laden und protokollieren nichts.","doctor.msg.capture-liveness.no-records.fix":"Aktualisieren Sie die MeMesh-Hooks (Plugin: `/plugin update memesh`; npm: `memesh install-hooks`), starten Sie den Agenten neu, beginnen Sie eine Sitzung und führen Sie `memesh doctor` erneut aus.","project.index.title":"Was hier schon bekannt ist","project.index.empty":"In diesem Projekt wird noch nichts automatisch eingespielt. Importierte Erinnerungen, als nicht vertrauenswürdig markierte Erinnerungen und alles ohne `project:`-Tag zählen hier nicht mit — die Zahl auf dem Projekt-Chip kann höher sein. Entscheidungen, Lektionen, Muster und Referenzen, die mit `remember` gespeichert wurden, erscheinen hier.","project.index.more":'{n} weitere — `memesh recall --tag "project:…"`',"project.index.older":"{n} ältere (seit {days} Tagen unverändert) — mit recall ansehen","project.index.cost":"Derselbe Index, den ein Agent zu Sitzungsbeginn erhält · ≈ {tokens} Tokens ({bytes} Bytes)"},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","header.memory":"ký ức","insights.title":"Đề xuất sắp xếp bộ nhớ","insights.reviewTitle":"Đề xuất bộ nhớ đã được tạm lưu","insights.reviewSubtitle":"gói công việc chờ con người duyệt","insights.reviewSource":"Đề xuất đã tạm lưu — hãy duyệt trước khi áp dụng","insights.source.calendar":"Bản tóm tắt theo lịch","insights.source.transcript":"Bản ghi Claude Code","insights.reviewBoundary":"Dashboard chỉ duyệt đề xuất đã tạm lưu. Nó không chạy hay điều phối tác nhân.","insights.statPending":"đang chờ","insights.statApplied":"đã áp dụng","insights.statRejected":"đã từ chối","insights.filter.pending":"Đang chờ","insights.filter.applied":"Đã áp dụng","insights.filter.rejected":"Đã từ chối","insights.filter.all":"Tất cả","insights.refresh":"Làm mới","insights.loading":"đang tải…","insights.emptyOther":"Không có gì ở đây.","insights.sources":"nguồn","insights.status.pending":"đang chờ","insights.status.applied":"đã áp dụng","insights.status.rejected":"đã từ chối","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.rejectConfirm":"Từ chối thông tin này? Không thể hoàn tác hành động này.","insights.observations":"Tóm tắt quan sát","insights.tags":"Thẻ","insights.sourceIds":"Entity nguồn","insights.validationWarnings":"Cảnh báo xác thực cũ","insights.validationClaim":"Nhận định","insights.validationReason":"Lý do","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.settings":"Cài đặt","tab.home":"Trang chủ","tab.memories":"Ký ức","tab.project":"Dự án","memories.searchPlaceholder":"Lọc ngay khi gõ — nhấn Enter để tìm theo độ liên quan","memories.scopeLabel":"Phạm vi","memories.scopeWork":"Lớp công việc","memories.scopeEvidence":"Bằng chứng","memories.scopeAll":"Tất cả","memories.scopeArchived":"Đã lưu trữ","memories.composition":"Thành phần","memories.rankedBy":"xếp theo độ liên quan","memories.backToList":"Quay lại danh sách","memories.workEmpty":"Chưa có ký ức lớp công việc — mục tiêu, quyết định, bài học và kế hoạch sẽ xuất hiện ở đây khi được ghi lại.","memories.showAll":"Hiện tất cả ký ức","memories.expand":"Hiện chi tiết","memories.collapse":"Ẩn chi tiết","memory.technicalDetails":"Chi tiết kỹ thuật","memory.canonicalName":"Tên chuẩn","memory.rawType":"Loại thô","home.analyticsTitle":"Phân tích","handoff.terminal":"Cần Terminal","handoff.terminalPrereq":"Chạy trên máy đã cài MeMesh. Dashboard sẽ không chạy lệnh này.","handoff.copyCommand":"Sao chép lệnh","handoff.commandCopied":"Đã sao chép lệnh","handoff.github":"Mở GitHub — kiểm tra issue đã điền trước khi gửi","home.analyticsHint":"Sức khỏe, dòng thời gian, pattern và mức sử dụng — mở rộng khi cần","home.nextAction.eyebrow":"Bước tiếp theo được đề xuất","home.nextAction.why":"Lý do:","home.nextAction.result":"Kết quả mong đợi:","home.nextAction.loading.title":"Đang kiểm tra việc cần chú ý…","home.nextAction.loading.why":"MeMesh đang đọc trạng thái hiện tại của bộ nhớ, chỉ mục và hàng đợi xem xét.","home.nextAction.loading.result":"Một đề xuất duy nhất sẽ xuất hiện sau khi kiểm tra xong.","home.nextAction.empty.title":"Thêm bộ nhớ đầu tiên","home.nextAction.empty.why":"Thư viện đang trống nên chưa có gì để tìm kiếm hoặc sắp xếp.","home.nextAction.empty.result":"Trang Bộ nhớ cho phép tải bản demo có thể xóa hoặc bắt đầu ghi công việc thật.","home.nextAction.empty.action":"Mở Bộ nhớ","insights.emptyPending":"Chưa có mục nào đang chờ xem xét. Các lượt xem xét bộ nhớ mới sẽ xuất hiện ở đây khi có.","home.nextAction.insights.title":"Xem xét đề xuất sắp xếp bộ nhớ","home.nextAction.insights.why":"MeMesh có các đề xuất đang chờ quyết định của bạn.","home.nextAction.insights.result":"Chấp nhận tóm tắt hữu ích hoặc từ chối đề xuất không phù hợp.","home.nextAction.insights.action":"Xem xét đề xuất","home.nextAction.healthy.title":"Hiện không cần hành động","home.nextAction.healthy.why":"Bộ nhớ, chỉ mục và hàng đợi xem xét không có việc đã biết đang chờ.","home.nextAction.healthy.result":"Tiếp tục làm việc; MeMesh sẽ hiển thị nhu cầu đã xác nhận tiếp theo tại đây.","home.nextAction.unavailable.title":"Hiện chưa thể đưa ra đề xuất","home.nextAction.unavailable.why":"Không đọc được một kiểm tra trạng thái nên MeMesh sẽ không đoán.","home.nextAction.unavailable.result":"Tải lại để thử lại mà không thay đổi bộ nhớ hoặc cài đặt.","home.nextAction.unavailable.action":"Thử lại kiểm tra trạng thái","project.selectLabel":"Dự án","project.selectPrompt":"Chọn một dự án để xem lịch sử của nó.","project.empty":"Chưa có ký ức dự án. Hãy làm việc trong một kho git đã cài hooks memesh và câu chuyện của nó sẽ xuất hiện ở đây.","project.taskState.title":"Dự án này đang ở đâu","project.taskState.goal":"Mục tiêu","project.taskState.next":"Bước tiếp theo","project.taskState.blocked":"Đang bị chặn","project.taskState.done":"Đã xong","project.taskState.updated":"Cập nhật {when}","project.taskState.provenance":"Được ghi rõ bằng `memesh task` — không suy ra từ số lượng ký ức.","project.taskState.empty":"Dự án này chưa có trạng thái công việc. Đặt nó trong một phiên làm việc bằng `memesh task --goal … --next …` và nó sẽ hiện ở đây.","guard.sourceLesson":"Bài học nguồn","guard.pattern":"Mẫu kích hoạt","guard.message":"Cảnh báo sẽ hiển thị","guard.shouldMatch":"Phải kích hoạt với","guard.shouldNotMatch":"Phải im lặng với","search.button":"Tìm kiếm","search.searching":"Đang tìm…","search.results":"kết quả","search.result":"kết quả","search.noResults":"Không tìm thấy kết quả cho","search.facts":"sự kiện","browse.title":"Tất cả ký ức","browse.active":"hoạt động","browse.archived":"đã lưu trữ","browse.refresh":"Làm mới","browse.noMatch":"Không có ký ức phù hợp:","browse.prev":"← Trước","browse.next":"Tiếp →","browse.archive":"Lưu trữ","browse.restore":"Khôi phục","browse.confirmArchive":"Lưu trữ ký ức này?","browse.archiveFailed":"Không thể lưu trữ ký ức: {message}","browse.restoreFailed":"Không thể khôi phục ký ức: {message}","analytics.totalMemories":"Tổng ký ức","analytics.knowledgeFacts":"Sự kiện tri thức","analytics.connections":"Kết nối","analytics.topics":"Chủ đề","analytics.insights":"Thông tin","analytics.thisWeek":"Tuần này","analytics.new":"mới","analytics.stale":"Không hoạt động (30+ ngày)","analytics.archivedLabel":"Đã lưu trữ","analytics.mostRecalled":"Được truy xuất nhiều nhất","health.title":"Sức khỏe bộ nhớ","metrics.notMeasured":"Chưa đo được","metrics.health":"Sức khoẻ","metrics.healthNote":"Hoạt động, chất lượng, độ mới, bài học","metrics.critical":"Bài học nghiêm trọng","metrics.criticalPartial":"trong {tagged} mục đã phân loại · tổng {total} bài học","metrics.criticalAll":"trong tổng {total} bài học, đã phân loại hết","metrics.criticalUnclassified":"{total} bài học, chưa phân loại theo mức độ","metrics.criticalNoLessons":"Chưa ghi nhận bài học nào","metrics.citation":"Trích dẫn","metrics.citationNote":"{cited} trong {total} phiên có trích dẫn ký ức","metrics.citationNotMeasured":"Việc theo dõi trích dẫn bắt đầu từ phiên sau","metrics.reused":"Dùng lại tuần này","metrics.reusedNote":"Ước tính — dựa trên thời điểm truy cập cuối","health.excellent":"Xuất sắc","health.good":"Tốt","health.fair":"Trung bình","health.poor":"Kém","health.activity":"Hoạt động","health.quality":"Chất lượng","health.freshness":"Độ mới","health.lessons":"Tự cải thiện","timeline.title":"30 ngày qua","timeline.created":"Đã tạo","timeline.recalled":"Đã gọi lại","value.totalRecalls":"Tổng số lần gọi lại","value.lessonsLearned":"Bài học đã rút ra","value.lessonsSaved":"Bài học đã áp dụng","value.coverage":"Phạm vi kiến thức","cleanup.title":"Gợi ý dọn dẹp","cleanup.allClean":"Bộ nhớ của bạn sạch. Không phát hiện thực thể lỗi thời hoặc trùng lặp.","cleanup.staleLabel":"Độ tin cậy thấp / chưa sử dụng","cleanup.duplicateLabel":"Có thể trùng lặp","cleanup.confidence":"độ tin cậy","cleanup.unused":"chưa sử dụng","cleanup.entityMeta":"{type} · độ tin cậy {confidence}% · không dùng {days} ngày","settings.saved":"Đã lưu.","settings.configLoadFailed":"Không thể đọc cài đặt. Tải lại trang để thử lại.","settings.configReadbackFailed":"Máy chủ không trả về cấu hình đã lưu. Hãy thử lại.","settings.language":"Ngôn ngữ","settings.interfaceLanguage":"Ngôn ngữ giao diện","settings.interfaceLanguageHint":"Thay đổi ngay giao diện trong trình duyệt này.","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":"Chưa có bản phát hành mới hơn","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":"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.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.updateRetryGuidance":"Kiểm tra kết nối và cài đặt registry npm của bạn, sau đó thử lại. Phiên bản đã cài đặt của bạn không thay đổi.","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.","settings.installationDetails":"Chi tiết cài đặt","settings.installationDetailsUnavailable":"Không thể so sánh phiên bản cho bản cài đặt này.","settings.interfacePath":"Giao diện này","settings.terminalPath":"Lệnh trong terminal","settings.technicalDetails":"Chi tiết kỹ thuật","settings.installationDetailsHint":"Các phiên bản đã cài khác nhau không nhất thiết phải cập nhật. Hãy xem Cập nhật để biết các bản phát hành đã công bố.","roadmap.resetView":"Đặt lại chế độ xem","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":"Mở phản hồi trên GitHub","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…","feedback.popupBlocked":"GitHub không mở. Bản nháp vẫn được giữ nguyên; hãy cho phép cửa sổ bật lên, thử lại hoặc sao chép liên kết đã chuẩn bị.","feedback.retry":"Thử mở lại GitHub","feedback.copyLink":"Sao chép liên kết GitHub","feedback.linkCopied":"Đã sao chép liên kết","feedback.copyFailed":"Không thể sao chép liên kết. Hãy thử mở lại GitHub.","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 đủ","doctorBanner.fix":"Tự động khắc phục","doctorBanner.fixInProgress":"Đang khắc phục…","doctorBanner.fixDone":"Đã khắc phục","doctorBanner.restartRequired":"Khởi động lại tác nhân để hoàn tất cập nhật này.","doctor.label.readme_locale_parity":"Bản dịch README","doctor.label.config":"Tệp cấu hình","doctor.label.mcp-config":"Tệp kết nối MCP","doctor.label.hooks-config":"Định nghĩa hook","doctor.label.hook-scripts":"Script hook","doctor.label.hook-wiring":"Kết nối với Claude Code","doctor.label.hook-activity":"Tự động ghi nhớ","doctor.label.node-runtime":"Phiên bản Node.js","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Mã plugin đã mới nhất","doctor.label.shell-cli":"Lệnh trong terminal","doctor.label.dashboard":"Tệp bảng điều khiển","doctor.label.claude-channel":"Đăng ký kênh Claude","doctor.msg.claude-channel.unregistered.summary":"Thông báo trực tiếp của kênh Claude chưa được bật. Các công cụ bộ nhớ MCP và hộp thư đến bền bỉ vẫn có thể hoạt động. Bản xem trước này là tùy chọn.","doctor.msg.claude-channel.unregistered.fix":"Để bật kênh tùy chọn này, hãy chạy `memesh agent setup claude`, sau đó đăng ký lệnh MCP được in trong cài đặt người dùng Claude của bạ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.install-channel":"Cách cài đặt","doctor.label.fts_segmentation":"Chỉ mục từ khóa","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 (.claude-plugin/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":".claude-plugin/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":".claude-plugin/mcp.json không còn mục máy chủ memesh nữa.","doctor.msg.mcp-config.no-entry.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` khởi chạy một tệp không có trong bản cài này, nên mọi công cụ memesh trong Claude Code đều không khởi động được.","doctor.msg.mcp-config.entry-missing.fix":"Cài lại MeMesh. Nếu bạn tự sửa `.claude-plugin/mcp.json`, hãy trỏ nó về `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.mcp-config.placeholder-unresolved.summary":"CHƯA KIỂM TRA: `.claude-plugin/mcp.json` khởi chạy một đường dẫn có chứa `${CLAUDE_PLUGIN_ROOT}`, biến mà chỉ môi trường chạy plugin của Claude Code mới thay thế. Bản cài này không chạy như một plugin, nên tệp mà nó trỏ tới chưa được kiểm tra.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Hãy kiểm tra đúng cách môi trường plugin làm: chạy `CLAUDE_PLUGIN_ROOT=<thư mục của bản cài này> memesh doctor`.","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json đã biến mất nên tính năng ghi nhớ tự động không chạy được.","doctor.msg.hooks-config.missing.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json bị hỏng (không phải JSON hợp lệ).","doctor.msg.hooks-config.invalid-json.fix":"Sửa {path} hoặc cài lại MeMesh.","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json thiếu các loại hook sau: {types}. Một phần ghi nhận tự động sẽ không chạy.","doctor.msg.hooks-config.missing-types.fix":"Khôi phục cấu hình hook gốc hoặc cài đặt lại MeMesh.","doctor.msg.hook-scripts.none.summary":"Cấu hình hook không có script nào nên không thể ghi tự động thứ gì.","doctor.msg.hook-scripts.none.fix":"Cài lại MeMesh.","doctor.msg.hook-scripts.missing.summary":"Các script hook sau đã biến mất: {files}","doctor.msg.hook-scripts.missing.fix":"Cài lại MeMesh để khôi phục.","doctor.msg.hook-scripts.not-executable.summary":"Các script hook sau tồn tại nhưng không được phép chạy: {files}","doctor.msg.hook-scripts.not-executable.fix":"Chạy `chmod +x scripts/hooks/*.js`, hoặc `npm run build` nếu dùng mã nguồn.","doctor.msg.hook-wiring.no-marker.summary":"memesh chưa được nối với Claude Code nên chưa có gì được ghi nhớ tự động.","doctor.msg.hook-wiring.no-marker.fix":"Chạy `memesh install-hooks` một lần, rồi chạy `memesh doctor` để xác nhận.","doctor.msg.hook-wiring.script-missing.summary":"Một hook memesh đã đấu nối trỏ tới {path}, nhưng tệp này không còn tồn tại — agent gọi một tệp không có ở mỗi sự kiện tương ứng. Thường là tàn dư của bản nâng cấp đã loại bỏ hook đó.","doctor.msg.hook-wiring.script-missing.fix":"Chạy `memesh install-hooks` để đấu nối lại (các mục đã loại bỏ sẽ bị xoá), rồi khởi động lại agent.","doctor.msg.hook-wiring.marker-unreadable.summary":"Không đọc được bản ghi kết nối tại {path}.","doctor.msg.hook-wiring.marker-unreadable.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.marker-malformed.summary":"Bản ghi kết nối bị hỏng.","doctor.msg.hook-wiring.marker-malformed.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.settings-missing.summary":"Tệp cài đặt của Claude Code ({path}) đã biến mất nên kết nối bị đứt.","doctor.msg.hook-wiring.settings-missing.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} bị hỏng (không phải JSON hợp lệ).","doctor.msg.hook-wiring.settings-invalid.fix":"Khôi phục từ bản sao lưu, hoặc chạy `memesh install-hooks` để tạo lại.","doctor.msg.hook-wiring.entries-removed.summary":"Các mục memesh đã bị gỡ khỏi {path} nên kết nối bị đứt.","doctor.msg.hook-wiring.entries-removed.fix":"Chạy lại `memesh install-hooks`.","doctor.msg.hook-wiring.root-moved.summary":"Kết nối trỏ tới {path}, nơi này không còn tồn tại (memesh có lẽ đã bị di chuyển).","doctor.msg.hook-wiring.root-moved.fix":"Chạy `memesh install-hooks` để cập nhật.","doctor.msg.hook-activity.never-ran.summary":"Không có hook thu thập nào chạy trong {hours} giờ kể từ khi bắt đầu theo dõi, dù đấu nối hook vẫn ổn — không có gì được ghi nhớ.","doctor.msg.hook-activity.never-ran.fix":"Hoàn tất một phiên làm việc rồi chạy lại `memesh doctor`. Nếu vẫn báo chưa có hook nào chạy, chạy `memesh install-hooks` rồi khởi động lại agent.","doctor.msg.hook-activity.stale.summary":"Hook thu thập cuối cùng chạy khoảng {hours} giờ trước ({hook}). Nếu bạn đã làm việc kể từ đó, việc thu thập đã dừng và không có gì từ các phiên đó được lưu.","doctor.msg.hook-activity.stale.fix":"Khởi động lại agent, kết thúc một phiên rồi chạy lại `memesh doctor`. Nếu không khôi phục, chạy `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"Hook session-summary chạy lần cuối khoảng {hours} giờ trước, và 3 ngày qua cũng không có ghi nào từ Claude Code. Nếu máy này đã chuyển sang agent khác (Codex / Gemini), điều này là bình thường; nếu bạn vẫn dùng Claude Code ở đây, thu thập đã dừng.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Nếu bạn vẫn dùng Claude Code trên máy này: khởi động lại, kết thúc một phiên rồi chạy lại `memesh doctor`. Nếu không hồi phục, chạy `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"Không đọc được hoạt động hook từ cơ sở dữ liệu: {detail}. Tình trạng thu thập là không rõ, và điều đó không giống với bình thường.","doctor.msg.hook-activity.query-failed.fix":"Chạy `memesh doctor --verbose` để xem lỗi đầy đủ, và kiểm tra ~/.memesh đọc được và đĩa còn chỗ trống.","doctor.msg.hook-activity.stale-unknown.summary":'Không đọc được thời điểm chạy gần nhất của hook {hook} (dữ liệu hỏng, hoặc do một máy lệch đồng hồ ghi). Tình trạng thu thập hiện là "không rõ", và điều đó không giống "khỏe mạnh".',"doctor.msg.hook-activity.stale-unknown.fix":"Kết thúc một phiên làm việc rồi chạy lại `memesh doctor` — lần chạy mới sẽ ghi đè dấu thời gian hỏng.","doctor.msg.hook-activity.disabled.summary":"Thu thập tự động đang tắt (MEMESH_AUTO_CAPTURE hoặc autoCapture trong cấu hình) — do chủ ý, nên hook im lặng là điều dự kiến. Bật lại để tiếp tục thu thập phiên.","doctor.msg.hook-activity.disabled-env.summary":"Thu thập tự động bị tắt bởi MEMESH_AUTO_CAPTURE=false trong môi trường shell này. doctor chỉ thấy được môi trường của chính nó — nếu agent của bạn chạy không có biến này, thu thập ở đó không bị ảnh hưởng.","doctor.msg.hook-activity.not-wired.summary":"Chưa có hook thu thập nào từng chạy — và trên máy này không xác nhận được hook thu thập nào (Stop / PostToolUse / PreCompact) đã đấu nối, nên không có gì để chạy.","doctor.msg.hook-activity.not-wired.fix":"Nếu muốn thu thập tự động, chạy `memesh install-hooks`. Nếu bản cài này chỉ dùng MCP (Codex / Gemini), đây là bình thường và có thể bỏ qua.","doctor.msg.hook-activity.stop-silent.summary":"Hook {hook} vẫn đang ghi dấu, nhưng hook session-summary chưa từng chạy lần nào trong {hours} giờ kể từ khi bắt đầu theo dõi — thu thập phiên có thể đã hỏng, bị che bởi thu thập commit.","doctor.msg.hook-activity.stop-silent.fix":"Kết thúc một phiên làm việc rồi chạy lại `memesh doctor`. Nếu session-summary vẫn chưa chạy, chạy `memesh install-hooks` và khởi động lại agent.","doctor.label.capture-liveness":"Ghi nhớ còn sống","doctor.msg.capture-liveness.silent-hook.summary":"{hook}: chạy {runs} lần, ghi 0 lần — lý do «{reason}». Hook vẫn sống nhưng lần nào cũng kết luận không có gì để lưu; một đường bắt giữ bị hỏng cũng trông y hệt.","doctor.msg.capture-liveness.silent-hook.fix":"Chạy `memesh doctor --json` để xem số liệu từng hook. Nếu lý do đó không đúng với cách bạn làm việc, chạy `memesh install-hooks` rồi khởi động lại agent.","doctor.msg.capture-liveness.type-stopped.summary":"Trong 7 ngày qua không có gì thuộc loại «{type}» được lưu, so với {prev} trong 7 ngày trước đó. Thứ từng được ghi nhớ nay không còn được ghi nhớ nữa.","doctor.msg.capture-liveness.type-stopped.fix":"Chạy `memesh doctor --json` để xem số liệu từng hook, và kiểm tra xem cách bạn làm việc có thay đổi không — nếu không, chạy `memesh install-hooks` rồi khởi động lại agent.","doctor.msg.capture-liveness.never-ran.summary":"Trong {hours} giờ kể từ khi bắt đầu theo dõi, hook {hook} không để lại bản ghi lẫn nhịp tim — nó chưa từng chạy, nên không có gì nó đáng lẽ bắt được được lưu lại.","doctor.msg.capture-liveness.never-ran.fix":"Chạy `memesh install-hooks` và khởi động lại agent, sau đó kết thúc một phiên làm việc rồi chạy lại `memesh doctor`.","doctor.msg.capture-liveness.not-wired.summary":"Hook {hook} chưa từng chạy, nhưng máy này chưa kết nối hook ghi nhớ nào.","doctor.msg.capture-liveness.not-wired.fix":"Nếu muốn ghi nhớ tự động, hãy chạy `memesh install-hooks`. Nếu đây chỉ là MCP (Codex, Gemini hoặc Cursor), điều này là bình thường.","doctor.msg.capture-liveness.never-ran-legacy.summary":"Hook {hook} không có bản ghi kết quả, nhưng đã có {captured} ký ức được ghi tự động từ khi bắt đầu theo dõi. Có thể hook phiên bản cũ vẫn đang chạy.","doctor.msg.capture-liveness.never-ran-legacy.fix":"Hãy cập nhật các hook MeMesh, khởi động lại agent rồi chạy lại `memesh doctor`.","doctor.msg.capture-liveness.query-failed.summary":"Không đọc được trạng thái ghi nhớ từ cơ sở dữ liệu: {detail}. Không biết có gì được lưu hay không, và không biết thì không giống với khỏe mạnh.","doctor.msg.capture-liveness.query-failed.fix":"Lỗi được trích ở trên. Hãy kiểm tra ~/.memesh có đọc được không và đĩa còn trống không.","doctor.msg.hook-activity.never-ran-legacy.summary":"Chưa hook nào ghi dấu nhịp tim, nhưng từ khi bắt đầu theo dõi đã có {captured} ký ức thu thập tự động — nhiều khả năng hook từ phiên bản trước khi có theo dõi nhịp tim vẫn đang chạy.","doctor.msg.hook-activity.never-ran-legacy.fix":"Cập nhật hook memesh lên phiên bản hiện tại (plugin: `/plugin update memesh`; npm: `memesh install-hooks`), rồi khởi động lại agent.","doctor.msg.node-runtime.too-old.summary":"Node.js của bạn cũ hơn mức gói này hỗ trợ. {detail}","doctor.msg.node-runtime.too-old.fix":"Nâng cấp Node.js lên {required} trở lên, rồi chạy lại `memesh doctor`.","doctor.msg.native-binding.load-failed.summary":"SQLite không thể mở cơ sở dữ liệu: {detail}.","doctor.msg.native-binding.load-failed.fix":"Kiểm tra môi trường Node và cài đặt lại MeMesh nếu cần.","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` nếu bạn muốn có một lệnh terminal riêng. Cơ sở dữ liệu của nó phụ thuộc vào cấu hình.","doctor.msg.shell-cli.versions.summary":"Phiên bản đã cài: giao diện này {current}; terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"Plugin được cài từ commit {installed}, nhưng marketplace đã tiến tới {marketplace} với cùng một phiên bản. {host} không làm mới cache khi phiên bản không đổi, nên bạn đang chạy mã cũ hơn marketplace.","doctor.msg.plugin-cache.stale.fix":"Chạy `{command}` để làm mới cache, rồi khởi động lại {host}.","doctor.msg.plugin-cache.unverifiable.summary":"Không xác định được plugin đã cài có khớp với marketplace hay không. Chỉ phiên bản thì không đủ — hai bản dựng khác nhau có thể cùng một phiên bản.","doctor.msg.plugin-cache.unverifiable.fix":"Chạy `{command}` một lần; nó ghi lại commit và sau đó kiểm tra này sẽ trả lời được.","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.config-parse.retired-settings.summary":"Tệp cấu hình hợp lệ tại {path} vẫn chứa {count} thiết lập cấp cao nhất đã ngừng dùng ({keys}). Phiên bản này bỏ qua chúng, nhưng thông tin xác thực hoặc thiết lập nhà cung cấp cũ có thể vẫn còn trên đĩa.","doctor.msg.config-parse.retired-settings.fix":"Hãy xem xét {path} cục bộ và chỉ xóa các khóa cấp cao nhất đã ngừng dùng đó. Không dán tệp vào issue vì tệp có thể chứa thông tin xác thực. Sau đó chạy lại memesh doctor.","doctor.msg.message-capability.probe-failed.summary":"Kiểm tra khả năng nhắn tin đã cài đặt thất bại: {detail}.","doctor.msg.message-router.socket-missing.summary":"Không có socket router Local tại {path}; phiên đã dừng hoặc không tồn tại sẽ không bị đánh thức.","doctor.msg.message-router.socket-insecure.summary":"Socket router tại {path} không phải Unix socket riêng của chủ sở hữu.","doctor.msg.message-router.socket-unreachable.summary":"Socket router riêng tại {path} tồn tại nhưng không nhận kết nối cục bộ.","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.citation.none.summary":"Các phiên đã nhận ký ức được chèn nhưng không có ký ức nào được trích dẫn.","doctor.msg.citation.none.fix":"Kiểm tra quy ước trích dẫn tại ~/.claude/rules/memesh-citations.md rồi kiểm tra lại sau vài phiên.","doctor.msg.database.broken.summary":"Cơ sở dữ liệu không dùng được: {detail}","doctor.update_status.prerelease":"Đang chạy phiên bản tiền phát hành ({current}); npm latest là {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.workflow":"Quy trình làm việc","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.auth.cross-origin":"Yêu cầu này đến từ một trang khác, hoặc tới máy chủ dưới một tên không mong đợi, nên đã bị từ chối. Hãy mở bảng điều khiển bằng địa chỉ mà `memesh serve` đã in ra.","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.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.","httpError.operation.permission-denied":"MeMesh không có quyền sửa các tệp cần thiết cho lần khắc phục này. Hãy đóng bảng điều khiển, chạy `memesh serve` trong Terminal của bạn rồi thử lại. Nếu vẫn lỗi, hãy chạy `memesh doctor`.","time.justNow":"Vừa xong","time.hoursAgo":"{count} giờ trước","time.today":"Hôm nay","time.yesterday":"Hôm qua","time.daysAgo":"{count} ngày trước","time.lastWeek":"Tuần trước","time.weeksAgo":"{count} tuần trước","time.lastMonth":"Tháng trước","time.monthsAgo":"{count} tháng trước","memory.access.frequent":"Thường dùng · {count} lần","memory.access.recalls":"{count} lần","memory.access.never":"Chưa dùng","cluster.knowledge":"Kiến thức","cluster.activity":"Hoạt động","cluster.session":"Phiên","cluster.reference":"Tham chiếu","cluster.all":"Tất cả","browse.filterTime":"Thời gian","browse.filterValue":"Giá trị","browse.filterProject":"Dự án","browse.filterSort":"Sắp xếp","browse.timeToday":"Hôm nay","browse.timeWeek":"Tuần này","browse.timeMonth":"Tháng này","browse.timeOlder":"Cũ hơn","browse.valueRecalled":"✓ Đã dùng","browse.valueNever":"Chưa dùng","browse.sortMostRecalled":"Dùng nhiều nhất","browse.sortRecent":"Gần đây","browse.sortCreated":"Tạo lúc","browse.emptyFilter":"Không có ký ức trong danh mục này — thử bộ lọc khác","lessons.stepsLabel":"bước","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Không có trường có cấu trúc — xem bộ nhớ thô)","lessons.moreItems":"+{count} nữa","roadmap.title":"Lịch Sử Dự Án","roadmap.summary":"{count} ký ức · {first} → {last}","roadmap.switchToList":"↩ Xem danh sách","roadmap.switchToRoadmap":"🕘 Xem lịch sử","roadmap.emptyProject":"Chưa có ký ức nào trong dự án này.","loop.label":"Vòng lặp ký ức","loop.subtitleHas":"ký ức kiến thức được nhớ lại trong 7 ngày qua","loop.subtitleNone":"Tuần này chưa có ký ức nào được nhớ lại","loop.approxNote":"Xấp xỉ — theo dõi đầy đủ bắt đầu sau khi nâng cấp.","loop.sparkLabel":"30 ngày qua","roadmap.milestones":"Cột mốc","roadmap.keyLessons":"Bài học chính","radar.title":"Radar phủ kiến thức","radar.caption":"Ký ức kiến thức hoạt động (không tính session và commit)","radar.axis.lessons":"Bài học","radar.axis.decisions":"Quyết định","radar.axis.patterns":"Mẫu","radar.axis.bugs":"Sửa lỗi","radar.axis.processes":"Quy trình","radar.axis.architecture":"Kiến trúc","ageMatrix.title":"Phân bố tuổi ký ức","ageMatrix.low":"Thấp","ageMatrix.high":"Cao","ageMatrix.legend":"độ đậm = mật độ","ageMatrix.typeColumn":"Loại","header.signalModeOn":"Ký ức trọng tâm","header.signalModeOff":"Tất cả ký ức","header.signalModeOnHint":"Hiện mục tiêu, quyết định, bài học và kế hoạch; ẩn bản ghi session, commit và hoạt động tự động trong Ký ức.","header.signalModeOffHint":"Hiện mọi bản ghi, gồm session, commit và hoạt động được thu thập tự động, trong Ký ức.","globalFilter.focusedStatus":"Chế độ toàn cục: Ký ức trọng tâm — bản ghi session, commit và hoạt động tự động bị ẩn trong Ký ức.","globalFilter.allStatus":"Chế độ toàn cục: Tất cả ký ức — bản ghi session, commit và hoạt động tự động được bao gồm trong Ký ức.","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.coreHint":"Bộ nhớ cục bộ: remember, tìm kiếm từ khóa FTS5, hooks và duyệt Dashboard hoạt động cùng nhau.","onboarding.searchHint":"Truy hồi dùng tìm kiếm từ khóa FTS5 cục bộ.","onboarding.reviewHint":"Một tác nhân đang chạy có thể chuẩn bị gói tóm tắt hoặc bản ghi hội thoại hiển thị; Dashboard chỉ duyệt đề xuất đã tạm lưu.","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.demoLoadedTitle":"Đã tải dữ liệu demo","onboarding.demoLoadedBody":"Có {count} ký ức được gắn thẻ demo. Bạn chỉ có thể xóa các ký ức đó tại đây.","onboarding.resetConfirm":"Xóa mọi ký ức có thẻ metadata.demo? Không thể khôi phục đúng các hàng cũ, nhưng bạn có thể tải demo mới sau. Ký ức thật vẫn được giữ lại.","onboarding.resetReadbackFailed":"Không thể xác nhận đặt lại vì vẫn còn ký ức demo. Thao tác dọn dẹp vẫn hiển thị; hãy thử lại hoặc chạy memesh doctor.","onboarding.dismiss":"Đóng","common.serverError":"Máy chủ báo lỗi (HTTP {status}). Hãy thử lại — nếu vẫn xảy ra, chạy `memesh doctor`.","emptyLibrary.title":"Bộ nhớ của bạn đang trống","emptyLibrary.body":"Chưa có gì được lưu. Hãy nạp bản demo 30 mục để xem MeMesh hoạt động — có thể xóa sau chỉ với một cú nhấp.","browse.truncated":"đang hiển thị {shown} ký ức đầu tiên trong tổng số {total} — dùng tìm kiếm hoặc bộ lọc để xem phần còn lại","browse.truncatedUnknownTotal":"đang hiển thị {shown} ký ức đầu tiên — không đọc được tổng số, nên có thể còn nữa","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":'Trên các kênh cài đặt được hỗ trợ, lần dùng đầu sẽ hỏi đồng ý một lần trước khi cập nhật. "Để sau" hoãn phiên bản đó (24 giờ, rồi 48 giờ, rồi 7 ngày); "Không hỏi lại" tắt kiểm tra. Các kênh khác hiển thị cách cập nhật riêng. Sau khi nâng cấp, host đang chạy vẫn giữ bản cũ cho đến khi khởi động lại. MEMESH_AUTO_UPDATE chỉ đặt phạm vi và không bỏ qua đồng ý.',"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.goal":"Mục tiêu","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","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","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}","common.unknown":"không rõ","insights.entitiesCount":"{n} thực thể","roadmap.viewToggle":"Chế độ xem lịch sử dự án","roadmap.viewTree":"Cây","roadmap.viewMindmap":"Sơ đồ tư duy","roadmap.mindmapNeedsPhases":"Sơ đồ tư duy cần ít nhất 3 ký ức trong vòng 7 ngày.","roadmap.activePhase":"đang diễn ra","roadmap.entryCount":"{count} mục","roadmap.entriesCount":"{count} mục","roadmap.otherGroup":"Khác ({count})","roadmap.lowSignalHidden":"(đã ẩn {count} tín hiệu thấp)","roadmap.resetHint":"Đặt lại thu phóng và vị trí (nhấp đúp nền cũng được)","roadmap.zoomHint":"cuộn để thu phóng · kéo để di chuyển · {pct}%","roadmap.moreEntities":"+{count} nữa","roadmap.viewDecisions":"Quyết định","roadmap.densityTitle":"Mật độ ghi nhận theo danh mục","roadmap.densityNote":"những gì memesh ghi nhận được — không phải mọi thứ đã xảy ra","roadmap.lineageSupersedes":"{n} đã bị thay thế","roadmap.lineageConflicts":"{n} xung đột chưa được giải quyết","adr.empty":'Dự án này chưa ghi nhận quyết định nào. Ghi lại một quyết định với loại "decision" và nó sẽ xuất hiện ở đây cùng lịch sử của nó.',"adr.statusActive":"hiện hành","adr.statusSuperseded":"đã bị thay thế","adr.supersedes":"thay thế","adr.supersededBy":"bị thay thế bởi","nav.ariaLabel":"Các mục bảng điều khiển","feedback.descLabel":"Nội dung phản hồi","doctor.msg.capture-liveness.no-records.summary":"Các hook đã chạy trên máy này (nhịp gần nhất cách đây {hours} giờ), nhưng không hook nào để lại bản ghi kết quả. Có thể các hook đang chạy là bản cũ, chưa ghi kết quả, hoặc chúng lỗi ngay khi tải nên không ghi được gì.","doctor.msg.capture-liveness.no-records.fix":"Cập nhật hook MeMesh (plugin: `/plugin update memesh`; npm: `memesh install-hooks`), khởi động lại agent, bắt đầu một phiên làm việc rồi chạy lại `memesh doctor`.","project.index.title":"Những gì đã biết ở đây","project.index.empty":"Dự án này chưa có ký ức nào được tự động đưa vào. Ký ức đã nhập, ký ức bị đánh dấu không đáng tin, và bất kỳ ký ức nào lưu mà không có thẻ `project:` đều không được tính ở đây — con số trên chip dự án phía trên có thể lớn hơn. Quyết định, bài học, mẫu và tài liệu tham khảo lưu bằng `remember` sẽ xuất hiện ở đây.","project.index.more":'Còn {n} mục — `memesh recall --tag "project:…"`',"project.index.older":"{n} mục cũ hơn (không thay đổi trong {days} ngày) — dùng recall để xem","project.index.cost":"Cùng chỉ mục mà agent nhận khi bắt đầu phiên · ≈ {tokens} token ({bytes} byte)"},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","header.memory":"memoria","insights.title":"Sugerencias para organizar la memoria","insights.reviewTitle":"Propuestas de memoria preparadas","insights.reviewSubtitle":"paquetes de trabajo pendientes de revisión humana","insights.reviewSource":"Propuesta preparada — revísala antes de aplicarla","insights.source.calendar":"Resumen de calendario","insights.source.transcript":"Transcripción de Claude Code","insights.reviewBoundary":"El Dashboard revisa propuestas ya preparadas. No ejecuta ni despacha agentes.","insights.statPending":"pendiente","insights.statApplied":"aplicada","insights.statRejected":"rechazada","insights.filter.pending":"Pendiente","insights.filter.applied":"Aplicada","insights.filter.rejected":"Rechazada","insights.filter.all":"Todos","insights.refresh":"Actualizar","insights.loading":"cargando…","insights.emptyOther":"Nada por aquí.","insights.sources":"fuentes","insights.status.pending":"pendiente","insights.status.applied":"aplicada","insights.status.rejected":"rechazada","insights.viewDetail":"Ver detalle","insights.collapse":"Contraer","insights.accept":"Aceptar","insights.applying":"Aplicando…","insights.reject":"Rechazar","insights.rejectConfirm":"¿Rechazar esta idea? Esta acción no se puede deshacer.","insights.observations":"Observaciones resumidas","insights.tags":"Etiquetas","insights.sourceIds":"Fuentes","insights.validationWarnings":"Advertencias de validación heredadas","insights.validationClaim":"Afirmación","insights.validationReason":"Motivo","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.settings":"Configuración","tab.home":"Inicio","tab.memories":"Memorias","tab.project":"Proyecto","memories.searchPlaceholder":"Filtra mientras escribes — pulsa Enter para una búsqueda por relevancia","memories.scopeLabel":"Ámbito","memories.scopeWork":"Capa de trabajo","memories.scopeEvidence":"Evidencia","memories.scopeAll":"Todas","memories.scopeArchived":"Archivadas","memories.composition":"Composición","memories.rankedBy":"ordenadas por relevancia","memories.backToList":"Volver a la lista","memories.workEmpty":"Aún no hay memorias de la capa de trabajo — metas, decisiones, lecciones y planes aparecen aquí a medida que se capturan.","memories.showAll":"Mostrar todas las memorias","memories.expand":"Mostrar detalles","memories.collapse":"Ocultar detalles","memory.technicalDetails":"Detalles técnicos","memory.canonicalName":"Nombre canónico","memory.rawType":"Tipo sin procesar","home.analyticsTitle":"Análisis","handoff.terminal":"Requiere Terminal","handoff.terminalPrereq":"Ejecuta esto en el equipo donde está MeMesh. El Dashboard no ejecutará el comando.","handoff.copyCommand":"Copiar comando","handoff.commandCopied":"Comando copiado","handoff.github":"Abre GitHub — revisa el issue rellenado antes de enviarlo","home.analyticsHint":"Salud, línea de tiempo, patrones y uso — se expande bajo demanda","home.nextAction.eyebrow":"Siguiente paso recomendado","home.nextAction.why":"Por qué:","home.nextAction.result":"Resultado esperado:","home.nextAction.loading.title":"Comprobando qué necesita atención…","home.nextAction.loading.why":"MeMesh está leyendo el estado actual de memorias, índice y cola de revisión.","home.nextAction.loading.result":"Aparecerá una sola recomendación al terminar las comprobaciones.","home.nextAction.empty.title":"Añade tu primera memoria","home.nextAction.empty.why":"La biblioteca está vacía, así que aún no hay nada que buscar u organizar.","home.nextAction.empty.result":"En Memorias puedes cargar una demo eliminable o empezar a registrar trabajo real.","home.nextAction.empty.action":"Abrir Memorias","insights.emptyPending":"Todavía no hay revisiones pendientes. Las nuevas revisiones de memoria aparecerán aquí cuando estén disponibles.","home.nextAction.insights.title":"Revisa sugerencias de organización","home.nextAction.insights.why":"MeMesh tiene sugerencias esperando tu decisión.","home.nextAction.insights.result":"Acepta resúmenes útiles o rechaza sugerencias inadecuadas.","home.nextAction.insights.action":"Revisar sugerencias","home.nextAction.healthy.title":"No hace falta actuar ahora","home.nextAction.healthy.why":"Memorias, índice y cola de revisión no tienen acciones conocidas pendientes.","home.nextAction.healthy.result":"Sigue trabajando; MeMesh mostrará aquí la próxima necesidad confirmada.","home.nextAction.unavailable.title":"Recomendación no disponible","home.nextAction.unavailable.why":"No se pudo leer una comprobación, así que MeMesh no va a adivinar.","home.nextAction.unavailable.result":"Recarga para reintentar sin cambiar memorias ni configuración.","home.nextAction.unavailable.action":"Reintentar comprobaciones","project.selectLabel":"Proyecto","project.selectPrompt":"Elige un proyecto para ver su historial.","project.empty":"Aún no hay memorias de proyecto. Trabaja en un repositorio git con los hooks de memesh instalados y su historia aparecerá aquí.","project.taskState.title":"Dónde está este proyecto","project.taskState.goal":"Objetivo","project.taskState.next":"Siguiente paso","project.taskState.blocked":"Bloqueado","project.taskState.done":"Hecho","project.taskState.updated":"Actualizado {when}","project.taskState.provenance":"Declarado con `memesh task` — no inferido a partir del número de memorias.","project.taskState.empty":"Todavía no hay estado de tarea para este proyecto. Defínelo en una sesión con `memesh task --goal … --next …` y aparecerá aquí.","guard.sourceLesson":"Lección de origen","guard.pattern":"Patrón de activación","guard.message":"Advertencia que mostrará","guard.shouldMatch":"Debe activarse con","guard.shouldNotMatch":"Debe permanecer en silencio con","search.button":"Buscar","search.searching":"Buscando…","search.results":"resultados","search.result":"resultado","search.noResults":"Sin resultados para","search.facts":"hechos","browse.title":"Todas las memorias","browse.active":"activas","browse.archived":"archivadas","browse.refresh":"Actualizar","browse.noMatch":"No hay memorias que coincidan con","browse.prev":"← Anterior","browse.next":"Siguiente →","browse.archive":"Archivar","browse.restore":"Restaurar","browse.confirmArchive":"¿Archivar esta memoria?","browse.archiveFailed":"No se pudo archivar la memoria: {message}","browse.restoreFailed":"No se pudo restaurar la memoria: {message}","analytics.totalMemories":"Total de memorias","analytics.knowledgeFacts":"Hechos","analytics.connections":"Conexiones","analytics.topics":"Temas","analytics.insights":"Información","analytics.thisWeek":"Esta semana","analytics.new":"nuevas","analytics.stale":"Inactivas (30+ días sin uso)","analytics.archivedLabel":"Archivadas","analytics.mostRecalled":"Más consultadas","health.title":"Salud de la memoria","metrics.notMeasured":"Aún sin medir","metrics.health":"Salud","metrics.healthNote":"Actividad, calidad, frescura, lecciones","metrics.critical":"Lecciones críticas","metrics.criticalPartial":"de {tagged} clasificadas · {total} lecciones en total","metrics.criticalAll":"de {total} lecciones, todas clasificadas","metrics.criticalUnclassified":"{total} lecciones, ninguna clasificada por gravedad","metrics.criticalNoLessons":"Todavía no hay lecciones registradas","metrics.citation":"Citas","metrics.citationNote":"{cited} de {total} sesiones citaron una memoria","metrics.citationNotMeasured":"El registro de citas empieza en la próxima sesión","metrics.reused":"Reutilizadas esta semana","metrics.reusedNote":"Aproximado — según las fechas de último acceso","health.excellent":"Excelente","health.good":"Bueno","health.fair":"Regular","health.poor":"Deficiente","health.activity":"Actividad","health.quality":"Calidad","health.freshness":"Frescura","health.lessons":"Auto-mejora","timeline.title":"Últimos 30 días","timeline.created":"Creados","timeline.recalled":"Recuperados","value.totalRecalls":"Total de recuperaciones","value.lessonsLearned":"Lecciones aprendidas","value.lessonsSaved":"Lecciones aplicadas","value.coverage":"Cobertura de conocimiento","cleanup.title":"Sugerencias de limpieza","cleanup.allClean":"Tu memoria está limpia. No se detectaron entidades obsoletas o duplicadas.","cleanup.staleLabel":"Baja confianza / no usado","cleanup.duplicateLabel":"Posibles duplicados","cleanup.confidence":"confianza","cleanup.unused":"no usado","cleanup.entityMeta":"{type} · confianza {confidence}% · {days} d sin uso","settings.saved":"Guardado.","settings.configLoadFailed":"No se pudieron leer los ajustes. Recarga la página para intentarlo de nuevo.","settings.configReadbackFailed":"El servidor no devolvió la configuración guardada. Inténtalo de nuevo.","settings.language":"Idioma","settings.interfaceLanguage":"Idioma de la interfaz","settings.interfaceLanguageHint":"Cambia inmediatamente la interfaz en este navegador.","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":"No hay una versión publicada más reciente","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":"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.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.updateRetryGuidance":"Compruebe su conexión y la configuración del registro npm e inténtelo de nuevo. Su versión instalada no ha cambiado.","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.","settings.installationDetails":"Detalles de instalación","settings.installationDetailsUnavailable":"No se puede comparar versiones en esta instalación.","settings.interfacePath":"Esta interfaz","settings.terminalPath":"Comando de terminal","settings.technicalDetails":"Detalles técnicos","settings.installationDetailsHint":"Tener versiones instaladas diferentes no implica necesariamente que debas actualizar. Consulta Actualizaciones para ver las versiones publicadas.","roadmap.resetView":"Restablecer vista","lessons.error":"Error","lessons.rootCause":"Causa raíz","lessons.fix":"Corrección","lessons.prevention":"Prevención","feedback.button":"💬 Comentarios","feedback.title":"Abrir comentarios en GitHub","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…","feedback.popupBlocked":"GitHub no se abrió. Tu borrador sigue intacto; permite ventanas emergentes, vuelve a intentarlo o copia el enlace preparado.","feedback.retry":"Intentar abrir GitHub de nuevo","feedback.copyLink":"Copiar enlace de GitHub","feedback.linkCopied":"Enlace copiado","feedback.copyFailed":"No se pudo copiar el enlace. Intenta abrir GitHub de nuevo.","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","doctorBanner.fix":"Reparar automáticamente","doctorBanner.fixInProgress":"Reparando…","doctorBanner.fixDone":"Reparado","doctorBanner.restartRequired":"Reinicia el agente para terminar esta actualización.","doctor.label.readme_locale_parity":"Traducciones del README","doctor.label.config":"Archivo de configuración","doctor.label.mcp-config":"Archivo de conexión MCP","doctor.label.hooks-config":"Definiciones de hooks","doctor.label.hook-scripts":"Scripts de hook","doctor.label.hook-wiring":"Conexión con Claude Code","doctor.label.hook-activity":"Captura automática","doctor.label.node-runtime":"Versión de Node.js","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"Código del plugin actualizado","doctor.label.shell-cli":"Comando de terminal","doctor.label.dashboard":"Archivos del panel","doctor.label.claude-channel":"Registro del canal de Claude","doctor.msg.claude-channel.unregistered.summary":"Las notificaciones en vivo del canal de Claude no están habilitadas. Las herramientas de memoria de MCP y los mensajes duraderos de la bandeja de entrada aún pueden funcionar. Esta vista previa es opcional.","doctor.msg.claude-channel.unregistered.fix":"Para habilitar este canal opcional, ejecute `memesh agent setup claude` y luego registre el comando MCP mostrado en la configuración de usuario de su Claude.","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.install-channel":"Método de instalación","doctor.label.fts_segmentation":"Índice de palabras clave","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 (.claude-plugin/mcp.json).","doctor.msg.mcp-config.missing.fix":"Reinstala MeMesh para restaurarlo.","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/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":".claude-plugin/mcp.json ya no contiene la entrada del servidor memesh.","doctor.msg.mcp-config.no-entry.fix":"Reinstala MeMesh para restaurarla.","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` arranca un archivo que no está en esta instalación, así que ninguna herramienta de memesh dentro de Claude Code puede iniciarse.","doctor.msg.mcp-config.entry-missing.fix":"Reinstala MeMesh. Si editaste `.claude-plugin/mcp.json` a mano, vuelve a apuntarlo a `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`.","doctor.msg.mcp-config.placeholder-unresolved.summary":"NO VERIFICADO: `.claude-plugin/mcp.json` arranca una ruta que contiene `${CLAUDE_PLUGIN_ROOT}`, una variable que solo rellena el runtime de plugins de Claude Code. Esta copia no se está ejecutando como plugin, así que no se comprobó el archivo al que apunta.","doctor.msg.mcp-config.placeholder-unresolved.fix":"Compruébalo igual que lo haría el runtime de plugins: ejecuta `CLAUDE_PLUGIN_ROOT=<la carpeta de esta instalación> memesh doctor`.","doctor.msg.hooks-config.missing.summary":"Falta hooks/hooks.json, así que la captura automática de memoria no puede funcionar.","doctor.msg.hooks-config.missing.fix":"Reinstala MeMesh para restaurarlo.","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json está dañado (no es JSON válido).","doctor.msg.hooks-config.invalid-json.fix":"Arregla {path} o reinstala MeMesh.","doctor.msg.hooks-config.missing-types.summary":"A hooks/hooks.json le faltan estos tipos de hook: {types}. Parte de la captura automática no se ejecutará.","doctor.msg.hooks-config.missing-types.fix":"Restaura la configuración de hooks original o reinstala MeMesh.","doctor.msg.hook-scripts.none.summary":"La configuración de hooks no tiene ningún script, así que nada puede capturarse automáticamente.","doctor.msg.hook-scripts.none.fix":"Reinstala MeMesh.","doctor.msg.hook-scripts.missing.summary":"Faltan estos scripts de hook: {files}","doctor.msg.hook-scripts.missing.fix":"Reinstala MeMesh para restaurarlos.","doctor.msg.hook-scripts.not-executable.summary":"Estos scripts de hook existen pero no tienen permiso para ejecutarse: {files}","doctor.msg.hook-scripts.not-executable.fix":"Ejecuta `chmod +x scripts/hooks/*.js`, o `npm run build` si usas el código fuente.","doctor.msg.hook-wiring.no-marker.summary":"memesh aún no está conectado con Claude Code, así que nada se recuerda automáticamente.","doctor.msg.hook-wiring.no-marker.fix":"Ejecuta `memesh install-hooks` una vez, y luego `memesh doctor` para confirmar.","doctor.msg.hook-wiring.script-missing.summary":"Un hook memesh conectado apunta a {path}, que ya no existe — el agente invoca un archivo inexistente en cada evento correspondiente. Suele ser residuo de una actualización que retiró el hook.","doctor.msg.hook-wiring.script-missing.fix":"Ejecuta `memesh install-hooks` para reconectar (elimina entradas retiradas) y reinicia el agente.","doctor.msg.hook-wiring.marker-unreadable.summary":"El registro de conexión en {path} no se puede leer.","doctor.msg.hook-wiring.marker-unreadable.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.marker-malformed.summary":"El registro de conexión está dañado.","doctor.msg.hook-wiring.marker-malformed.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.settings-missing.summary":"El archivo de ajustes de Claude Code ({path}) desapareció, así que la conexión está rota.","doctor.msg.hook-wiring.settings-missing.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.settings-invalid.summary":"{path} está dañado (no es JSON válido).","doctor.msg.hook-wiring.settings-invalid.fix":"Restáuralo desde una copia de seguridad, o ejecuta `memesh install-hooks` para recrearlo.","doctor.msg.hook-wiring.entries-removed.summary":"Las entradas de memesh fueron eliminadas de {path}, así que la conexión está rota.","doctor.msg.hook-wiring.entries-removed.fix":"Ejecuta `memesh install-hooks` otra vez.","doctor.msg.hook-wiring.root-moved.summary":"La conexión apunta a {path}, que ya no existe (probablemente memesh se movió).","doctor.msg.hook-wiring.root-moved.fix":"Ejecuta `memesh install-hooks` para actualizarla.","doctor.msg.hook-activity.never-ran.summary":"Ningún hook de captura se ha ejecutado en las {hours} horas desde que empezó el seguimiento, aun con el cableado de hooks en su sitio — no se está guardando nada.","doctor.msg.hook-activity.never-ran.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor`. Si sigue diciendo que ningún hook se ejecutó, ejecuta `memesh install-hooks` y reinicia el agente.","doctor.msg.hook-activity.stale.summary":"El último hook de captura se ejecutó hace unas {hours} horas ({hook}). Si has trabajado desde entonces, la captura se detuvo y nada de esas sesiones se guardó.","doctor.msg.hook-activity.stale.fix":"Reinicia el agente, termina una sesión y vuelve a ejecutar `memesh doctor`. Si no se recupera, ejecuta `memesh install-hooks`.","doctor.msg.hook-activity.stale-unconfirmed.summary":"El hook session-summary se ejecutó por última vez hace unas {hours} horas, y tampoco llegó ninguna escritura de Claude Code en los últimos 3 días. Si esta máquina pasó a otro agente (Codex / Gemini), es lo esperado; si todavía usas Claude Code aquí, la captura se detuvo.","doctor.msg.hook-activity.stale-unconfirmed.fix":"Si todavía usas Claude Code en esta máquina: reinícialo, termina una sesión y vuelve a ejecutar `memesh doctor`. Si no se recupera, ejecuta `memesh install-hooks`.","doctor.msg.hook-activity.query-failed.summary":"No se pudo leer la actividad de los hooks en la base de datos: {detail}. El estado de la captura es desconocido, que no es lo mismo que sano.","doctor.msg.hook-activity.query-failed.fix":"Ejecuta `memesh doctor --verbose` para ver el error completo y comprueba que ~/.memesh se puede leer y que hay espacio en disco.","doctor.msg.hook-activity.stale-unknown.summary":"La marca de tiempo de la última ejecución del hook {hook} no se puede leer (corrupta, o escrita por una máquina con el reloj mal). El estado de la captura es «desconocido», que no es lo mismo que «sano».","doctor.msg.hook-activity.stale-unknown.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor` — una ejecución nueva sobrescribe la marca de tiempo dañada.","doctor.msg.hook-activity.disabled.summary":"La captura automática está desactivada (MEMESH_AUTO_CAPTURE o autoCapture en la configuración) — deliberadamente, así que el silencio de los hooks es lo esperado. Reactívala para volver a capturar sesiones.","doctor.msg.hook-activity.disabled-env.summary":"La captura automática está desactivada por MEMESH_AUTO_CAPTURE=false en el entorno de este shell. doctor solo ve su propio entorno — si tu agente corre sin esta variable, la captura allí no se ve afectada.","doctor.msg.hook-activity.not-wired.summary":"Ningún hook de captura se ha ejecutado nunca — y ningún hook de captura (Stop / PostToolUse / PreCompact) está confirmado como conectado en esta máquina, así que no hay nada que ejecutar.","doctor.msg.hook-activity.not-wired.fix":"Si quieres captura automática, ejecuta `memesh install-hooks`. Si esta instalación es solo MCP (Codex / Gemini), esto es lo esperado y puedes ignorarlo.","doctor.msg.hook-activity.stop-silent.summary":"El hook {hook} está sellando, pero el hook session-summary no se ha ejecutado ni una vez en las {hours} horas desde que empezó el seguimiento — la captura de sesiones puede estar rota, oculta tras la captura de commits.","doctor.msg.hook-activity.stop-silent.fix":"Termina una sesión de trabajo y vuelve a ejecutar `memesh doctor`. Si session-summary sigue sin ejecutarse, ejecuta `memesh install-hooks` y reinicia el agente.","doctor.label.capture-liveness":"Captura activa","doctor.msg.capture-liveness.silent-hook.summary":"{hook}: {runs} ejecuciones, 0 escrituras — «{reason}». El hook está vivo y decide cada vez que no hay nada que guardar, que es también como se ve una captura rota.","doctor.msg.capture-liveness.silent-hook.fix":"Ejecuta `memesh doctor --json` para ver las cifras por hook. Si el motivo no describe tu uso, ejecuta `memesh install-hooks` y reinicia el agente.","doctor.msg.capture-liveness.type-stopped.summary":"No se capturó nada del tipo «{type}» en los últimos 7 días, frente a {prev} en los 7 días anteriores. Algo que se recordaba ha dejado de recordarse.","doctor.msg.capture-liveness.type-stopped.fix":"Ejecuta `memesh doctor --json` para ver las cifras por hook y comprueba si tu forma de trabajar cambió; si no cambió, ejecuta `memesh install-hooks` y reinicia el agente.","doctor.msg.capture-liveness.never-ran.summary":"El hook {hook} no ha dejado registro ni latido en las {hours} horas desde que empezó el seguimiento: nunca se ejecutó, así que nada de lo que capturaría se está guardando.","doctor.msg.capture-liveness.never-ran.fix":"Ejecuta `memesh install-hooks` y reinicia el agente, luego termina una sesión de trabajo y vuelve a ejecutar `memesh doctor`.","doctor.msg.capture-liveness.not-wired.summary":"El hook {hook} nunca se ha ejecutado, pero esta máquina no tiene conectado ningún hook de captura.","doctor.msg.capture-liveness.not-wired.fix":"Si quieres captura automática, ejecuta `memesh install-hooks`. Si esta instalación solo usa MCP (Codex, Gemini o Cursor), es normal.","doctor.msg.capture-liveness.never-ran-legacy.summary":"El hook {hook} no tiene registro de resultados, pero se guardaron {captured} memorias de captura automática desde que comenzó el seguimiento. Probablemente siguen activos hooks antiguos.","doctor.msg.capture-liveness.never-ran-legacy.fix":"Actualiza los hooks de MeMesh, reinicia el agente y vuelve a ejecutar `memesh doctor`.","doctor.msg.capture-liveness.query-failed.summary":"No se pudo leer el estado de la captura desde la base de datos: {detail}. Se desconoce si se está guardando algo, y desconocido no es lo mismo que sano.","doctor.msg.capture-liveness.query-failed.fix":"El error está citado arriba. Comprueba que ~/.memesh se pueda leer y que el disco no esté lleno.","doctor.msg.hook-activity.never-ran-legacy.summary":"Ningún hook ha sellado el latido, pero {captured} memorias de captura automática llegaron desde que empezó el seguimiento — probablemente siguen ejecutándose hooks de una versión anterior al seguimiento.","doctor.msg.hook-activity.never-ran-legacy.fix":"Actualiza los hooks de memesh a la versión actual (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) y reinicia el agente.","doctor.msg.node-runtime.too-old.summary":"Tu Node.js es más antiguo de lo que este paquete admite. {detail}","doctor.msg.node-runtime.too-old.fix":"Actualiza Node.js a {required} o más nuevo, y luego ejecuta `memesh doctor` de nuevo.","doctor.msg.native-binding.load-failed.summary":"SQLite no pudo abrir la base de datos: {detail}.","doctor.msg.native-binding.load-failed.fix":"Comprueba el entorno de Node y reinstala MeMesh si es necesario.","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` si quieres un comando de terminal independiente. Su base de datos depende de su configuración.","doctor.msg.shell-cli.versions.summary":"Versiones instaladas: esta interfaz {current}; terminal {terminal}.","doctor.msg.plugin-cache.stale.summary":"El plugin se instaló desde el commit {installed}, pero el marketplace avanzó a {marketplace} con la misma versión. {host} no refresca una caché cuya versión no cambió, así que estás ejecutando código más antiguo que el del marketplace.","doctor.msg.plugin-cache.stale.fix":"Ejecuta `{command}` para refrescar la caché y luego reinicia {host}.","doctor.msg.plugin-cache.unverifiable.summary":"No se pudo saber si el plugin instalado coincide con el marketplace. La versión sola no lo responde: dos builds pueden llevar la misma versión.","doctor.msg.plugin-cache.unverifiable.fix":"Ejecuta `{command}` una vez; registra el commit y después esta comprobación podrá responder.","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.config-parse.retired-settings.summary":"El archivo de configuración válido en {path} aún contiene {count} ajustes de nivel superior retirados ({keys}). Esta versión los ignora, pero las credenciales o los ajustes antiguos de proveedores pueden seguir en el disco.","doctor.msg.config-parse.retired-settings.fix":"Revisa {path} localmente y elimina solo esas claves de nivel superior retiradas. No pegues el archivo en una issue porque puede contener credenciales. Después, vuelve a ejecutar memesh doctor.","doctor.msg.message-capability.probe-failed.summary":"Falló la comprobación de la función de mensajería instalada: {detail}.","doctor.msg.message-router.socket-missing.summary":"No existe un socket del router Local en {path}; no se despertarán sesiones detenidas o inexistentes.","doctor.msg.message-router.socket-insecure.summary":"El socket del router en {path} no es un socket Unix privado del propietario.","doctor.msg.message-router.socket-unreachable.summary":"El socket privado del router en {path} existe, pero no aceptó una conexión local.","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.citation.none.summary":"Las sesiones recibieron memorias inyectadas, pero ninguna fue citada.","doctor.msg.citation.none.fix":"Revisa el contrato de citación en ~/.claude/rules/memesh-citations.md y vuelve a comprobarlo tras algunas sesiones.","doctor.msg.database.broken.summary":"La base de datos no se puede usar: {detail}","doctor.update_status.prerelease":"Se está ejecutando la versión preliminar ({current}); npm latest es {latest}.","patterns.title":"Tus patrones","patterns.workSchedule":"Horario de trabajo","patterns.peakHours":"Horas pico","patterns.busiestDays":"Días más ocupados","patterns.workflow":"Flujo de trabajo","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.auth.cross-origin":"Esta solicitud vino de otro sitio, o llegó al servidor con un nombre inesperado, y fue rechazada. Abre el panel con la dirección que imprimió `memesh serve`.","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.rate.limited":"Demasiadas solicitudes en poco tiempo. Espera un momento e inténtalo de nuevo.","httpError.server.internal":"El servidor encontró un error inesperado.","httpError.operation.permission-denied":"MeMesh no tiene permiso para modificar los archivos necesarios para esta reparación. Cierra este panel, ejecuta `memesh serve` en tu propio terminal y vuelve a intentarlo. Si sigue fallando, ejecuta `memesh doctor`.","time.justNow":"Ahora","time.hoursAgo":"Hace {count}h","time.today":"Hoy","time.yesterday":"Ayer","time.daysAgo":"Hace {count}d","time.lastWeek":"Semana pasada","time.weeksAgo":"Hace {count}sem","time.lastMonth":"Mes pasado","time.monthsAgo":"Hace {count}mes","memory.access.frequent":"Frecuente · {count} usos","memory.access.recalls":"{count} usos","memory.access.never":"Nunca usado","cluster.knowledge":"Conocimiento","cluster.activity":"Actividad","cluster.session":"Sesiones","cluster.reference":"Referencia","cluster.all":"Todo","browse.filterTime":"Tiempo","browse.filterValue":"Valor","browse.filterProject":"Proyecto","browse.filterSort":"Ordenar","browse.timeToday":"Hoy","browse.timeWeek":"Esta semana","browse.timeMonth":"Este mes","browse.timeOlder":"Más antiguo","browse.valueRecalled":"✓ Usado","browse.valueNever":"Nunca usado","browse.sortMostRecalled":"Más usado","browse.sortRecent":"Reciente","browse.sortCreated":"Creado","browse.emptyFilter":"Sin memorias en esta categoría — prueba otro filtro","lessons.stepsLabel":"pasos","lessons.commitsCount":"{count} commits","lessons.unstructured":"(Sin campos estructurados — ver memoria sin procesar)","lessons.moreItems":"+{count} más","roadmap.title":"Historial del Proyecto","roadmap.summary":"{count} memorias · {first} → {last}","roadmap.switchToList":"↩ Vista de Lista","roadmap.switchToRoadmap":"🕘 Vista del Historial","roadmap.emptyProject":"Sin memorias en este proyecto todavía.","loop.label":"Bucle de memoria","loop.subtitleHas":"memorias de conocimiento reusadas en los últimos 7 días","loop.subtitleNone":"Ninguna memoria reutilizada esta semana","loop.approxNote":"Aproximación — seguimiento completo comienza después de la actualización.","loop.sparkLabel":"Últimos 30 días","roadmap.milestones":"Hitos","roadmap.keyLessons":"Lecciones clave","radar.title":"Radar de cobertura","radar.caption":"Memorias de conocimiento activas (session y commit excluidos)","radar.axis.lessons":"Lecciones","radar.axis.decisions":"Decisiones","radar.axis.patterns":"Patrones","radar.axis.bugs":"Correcciones","radar.axis.processes":"Procesos","radar.axis.architecture":"Arquitectura","ageMatrix.title":"Distribución por edad","ageMatrix.low":"Bajo","ageMatrix.high":"Alto","ageMatrix.legend":"profundidad = densidad","ageMatrix.typeColumn":"Tipo","header.signalModeOn":"Memorias importantes","header.signalModeOff":"Todas las memorias","header.signalModeOnHint":"Muestra metas, decisiones, lecciones y planes; oculta registros automáticos de session, commit y actividad en Memorias.","header.signalModeOffHint":"Muestra todos los registros, incluidos session, commit y actividad capturados automáticamente, en Memorias.","globalFilter.focusedStatus":"Vista global: Memorias importantes — los registros automáticos de session, commit y actividad están ocultos en Memorias.","globalFilter.allStatus":"Vista global: Todas las memorias — se incluyen los registros automáticos de session, commit y actividad en Memorias.","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.coreHint":"Memoria local: remember, búsqueda FTS5 por palabras clave, hooks y navegación del Dashboard funcionan juntas.","onboarding.searchHint":"La recuperación usa búsqueda local FTS5 por palabras clave.","onboarding.reviewHint":"Un agente ya activo puede preparar un paquete de resumen o transcripción visible; el Dashboard solo revisa la propuesta preparada.","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.demoLoadedTitle":"Datos de demostración cargados","onboarding.demoLoadedBody":"Hay {count} memorias con la etiqueta demo. Aquí puedes eliminar solo esas memorias.","onboarding.resetConfirm":"¿Eliminar todas las memorias con la etiqueta metadata.demo? No se pueden restaurar las mismas filas, pero puedes cargar una demo nueva después. Las memorias reales se conservarán.","onboarding.resetReadbackFailed":"No se pudo confirmar el restablecimiento porque aún quedan memorias demo. La acción de limpieza seguirá disponible; inténtalo de nuevo o ejecuta memesh doctor.","onboarding.dismiss":"Cerrar","common.serverError":"El servidor devolvió un error (HTTP {status}). Inténtalo de nuevo — si persiste, ejecuta `memesh doctor`.","emptyLibrary.title":"Tu memoria está vacía","emptyLibrary.body":"Aún no hay nada guardado. Carga el tour de demostración de 30 entradas para ver MeMesh en acción — puedes borrarlo luego con un clic.","browse.truncated":"mostrando las primeras {shown} de {total} memorias — usa la búsqueda o los filtros para llegar al resto","browse.truncatedUnknownTotal":"mostrando las primeras {shown} memorias — el total no está disponible, así que puede haber más","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":'En los canales de instalación compatibles, el primer uso pide consentimiento una vez antes de actualizar. "Ahora no" posterga esa versión (24 h, luego 48 h, luego 7 días); "No volver a preguntar" desactiva la comprobación. Otros canales muestran su propia acción. Tras una actualización, los hosts en ejecución conservan la versión anterior hasta reiniciarse. MEMESH_AUTO_UPDATE define el alcance, pero nunca omite el consentimiento.',"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.goal":"Objetivo","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","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","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}","common.unknown":"desconocido","insights.entitiesCount":"{n} entidades","roadmap.viewToggle":"Vista del historial del proyecto","roadmap.viewTree":"Árbol","roadmap.viewMindmap":"Mapa mental","roadmap.mindmapNeedsPhases":"El mapa mental necesita al menos 3 memorias en una ventana de 7 días.","roadmap.activePhase":"activa","roadmap.entryCount":"{count} entrada","roadmap.entriesCount":"{count} entradas","roadmap.otherGroup":"Otros ({count})","roadmap.lowSignalHidden":"({count} de señal baja ocultas)","roadmap.resetHint":"Restablecer zoom y posición (doble clic en el fondo también)","roadmap.zoomHint":"rueda para zoom · arrastra para mover · {pct}%","roadmap.moreEntities":"+{count} más","roadmap.viewDecisions":"Decisiones","roadmap.densityTitle":"Densidad de captura por categoría","roadmap.densityNote":"lo que memesh capturó — no todo lo que pasó","roadmap.lineageSupersedes":"{n} reemplazadas","roadmap.lineageConflicts":"{n} conflictos sin resolver","adr.empty":"Aún no hay decisiones registradas para este proyecto. Registra una con el tipo «decision» y aparecerá aquí con su historial.","adr.statusActive":"activa","adr.statusSuperseded":"reemplazada","adr.supersedes":"reemplaza","adr.supersededBy":"reemplazada por","nav.ariaLabel":"Secciones del panel","feedback.descLabel":"Descripción del comentario","doctor.msg.capture-liveness.no-records.summary":"Los hooks se han ejecutado en esta máquina (última señal hace {hours} horas), pero ninguno ha dejado un registro de resultado. O los hooks en uso son anteriores al registro de resultados, o fallan al cargarse y no registran nada.","doctor.msg.capture-liveness.no-records.fix":"Actualiza los hooks de MeMesh (plugin: `/plugin update memesh`; npm: `memesh install-hooks`), reinicia el agente, inicia una sesión y vuelve a ejecutar `memesh doctor`.","project.index.title":"Lo que ya se sabe aquí","project.index.empty":"En este proyecto todavía no se inyecta nada automáticamente. Las memorias importadas, las marcadas como no confiables y cualquiera guardada sin la etiqueta `project:` no se cuentan aquí — el número del chip del proyecto puede ser mayor. Las decisiones, lecciones, patrones y referencias guardados con `remember` aparecen aquí.","project.index.more":'{n} más — `memesh recall --tag "project:…"`',"project.index.older":"{n} más antiguas (sin cambios en {days} días) — usa recall para verlas","project.index.cost":"El mismo índice que recibe un agente al iniciar la sesión · ≈ {tokens} tokens ({bytes} bytes)"},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":"ความทรงจำ","header.memory":"ความทรงจำ","insights.title":"คำแนะนำในการจัดระเบียบความจำ","insights.reviewTitle":"ข้อเสนอความจำที่เตรียมไว้","insights.reviewSubtitle":"แพ็กเกจงานที่รอการตรวจสอบจากมนุษย์","insights.reviewSource":"ข้อเสนอที่เตรียมไว้ — ตรวจสอบก่อนนำไปใช้","insights.source.calendar":"ไดเจสต์ตามปฏิทิน","insights.source.transcript":"บันทึกการสนทนา Claude Code","insights.reviewBoundary":"แดชบอร์ดตรวจสอบเฉพาะข้อเสนอที่เตรียมไว้แล้ว และไม่เรียกใช้หรือส่งงานให้เอเจนต์","insights.statPending":"รอดำเนินการ","insights.statApplied":"นำไปใช้แล้ว","insights.statRejected":"ปฏิเสธแล้ว","insights.filter.pending":"รอดำเนินการ","insights.filter.applied":"นำไปใช้แล้ว","insights.filter.rejected":"ปฏิเสธแล้ว","insights.filter.all":"ทั้งหมด","insights.refresh":"รีเฟรช","insights.loading":"กำลังโหลด…","insights.emptyOther":"ไม่มีข้อมูลที่นี่","insights.sources":"แหล่งที่มา","insights.status.pending":"รอดำเนินการ","insights.status.applied":"นำไปใช้แล้ว","insights.status.rejected":"ปฏิเสธแล้ว","insights.viewDetail":"ดูรายละเอียด","insights.collapse":"ย่อ","insights.accept":"ยอมรับ","insights.applying":"กำลังนำไปใช้…","insights.reject":"ปฏิเสธ","insights.rejectConfirm":"ปฏิเสธข้อมูลเชิงลึกนี้หรือไม่? การดำเนินการนี้ไม่สามารถย้อนกลับได้","insights.observations":"สรุปการสังเกต","insights.tags":"แท็ก","insights.sourceIds":"entity ต้นทาง","insights.validationWarnings":"คำเตือนการตรวจสอบแบบเดิม","insights.validationClaim":"ข้อความ","insights.validationReason":"เหตุผล","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.settings":"ตั้งค่า","tab.home":"หน้าแรก","tab.memories":"ความทรงจำ","tab.project":"โปรเจกต์","memories.searchPlaceholder":"กรองขณะพิมพ์ — กด Enter เพื่อค้นหาตามความเกี่ยวข้อง","memories.scopeLabel":"ขอบเขต","memories.scopeWork":"เลเยอร์งาน","memories.scopeEvidence":"หลักฐาน","memories.scopeAll":"ทั้งหมด","memories.scopeArchived":"เก็บถาวร","memories.composition":"องค์ประกอบ","memories.rankedBy":"จัดอันดับตามความเกี่ยวข้อง","memories.backToList":"กลับไปที่รายการ","memories.workEmpty":"ยังไม่มีความทรงจำในเลเยอร์งาน — เป้าหมาย การตัดสินใจ บทเรียน และแผนจะปรากฏที่นี่เมื่อถูกบันทึก","memories.showAll":"แสดงความทรงจำทั้งหมด","memories.expand":"แสดงรายละเอียด","memories.collapse":"ซ่อนรายละเอียด","memory.technicalDetails":"รายละเอียดทางเทคนิค","memory.canonicalName":"ชื่อมาตรฐาน","memory.rawType":"ประเภทดิบ","home.analyticsTitle":"วิเคราะห์","handoff.terminal":"ต้องใช้ Terminal","handoff.terminalPrereq":"รันบนเครื่องที่ติดตั้ง MeMesh แดชบอร์ดจะไม่รันคำสั่งนี้ให้","handoff.copyCommand":"คัดลอกคำสั่ง","handoff.commandCopied":"คัดลอกคำสั่งแล้ว","handoff.github":"เปิด GitHub — ตรวจข้อมูลที่กรอกไว้ก่อนส่ง","home.analyticsHint":"สุขภาพ ไทม์ไลน์ รูปแบบ และการใช้งาน — ขยายเมื่อต้องการ","home.nextAction.eyebrow":"ขั้นตอนถัดไปที่แนะนำ","home.nextAction.why":"เหตุผล:","home.nextAction.result":"ผลลัพธ์ที่คาดหวัง:","home.nextAction.loading.title":"กำลังตรวจสอบสิ่งที่ต้องดำเนินการ…","home.nextAction.loading.why":"MeMesh กำลังอ่านสถานะปัจจุบันของความจำ ดัชนีค้นหา และคิวตรวจสอบ","home.nextAction.loading.result":"คำแนะนำเพียงหนึ่งรายการจะปรากฏเมื่อการตรวจสอบเสร็จสิ้น","home.nextAction.empty.title":"เพิ่มความจำรายการแรก","home.nextAction.empty.why":"คลังความจำยังว่าง จึงยังไม่มีสิ่งให้ค้นหาหรือจัดระเบียบ","home.nextAction.empty.result":"หน้า ความจำ ให้โหลดเดโมที่ลบได้หรือเริ่มบันทึกงานจริง","home.nextAction.empty.action":"เปิดความจำ","insights.emptyPending":"ยังไม่มีรายการรอตรวจสอบ การตรวจสอบความทรงจำใหม่จะแสดงที่นี่เมื่อพร้อม","home.nextAction.insights.title":"ตรวจสอบคำแนะนำจัดระเบียบความจำ","home.nextAction.insights.why":"MeMesh มีคำแนะนำที่รอการตัดสินใจของคุณ","home.nextAction.insights.result":"ยอมรับสรุปที่เป็นประโยชน์หรือปฏิเสธคำแนะนำที่ไม่เหมาะสม","home.nextAction.insights.action":"ตรวจสอบคำแนะนำ","home.nextAction.healthy.title":"ขณะนี้ไม่ต้องดำเนินการ","home.nextAction.healthy.why":"ความจำ ดัชนี และคิวตรวจสอบไม่มีงานที่ทราบว่ารอดำเนินการ","home.nextAction.healthy.result":"ทำงานต่อได้ MeMesh จะแสดงความต้องการถัดไปที่ยืนยันแล้วที่นี่","home.nextAction.unavailable.title":"ยังไม่สามารถแสดงคำแนะนำ","home.nextAction.unavailable.why":"อ่านการตรวจสอบสถานะหนึ่งไม่ได้ MeMesh จึงจะไม่คาดเดา","home.nextAction.unavailable.result":"โหลดใหม่เพื่อลองอีกครั้งโดยไม่เปลี่ยนความจำหรือการตั้งค่า","home.nextAction.unavailable.action":"ลองตรวจสอบสถานะอีกครั้ง","project.selectLabel":"โปรเจกต์","project.selectPrompt":"เลือกโปรเจกต์เพื่อดูประวัติของมัน","project.empty":"ยังไม่มีความทรงจำของโปรเจกต์ ทำงานใน git repository ที่ติดตั้ง memesh hooks แล้วเรื่องราวของมันจะปรากฏที่นี่","project.taskState.title":"โครงการนี้อยู่ตรงไหน","project.taskState.goal":"เป้าหมาย","project.taskState.next":"ขั้นต่อไป","project.taskState.blocked":"ติดขัด","project.taskState.done":"เสร็จแล้ว","project.taskState.updated":"อัปเดต {when}","project.taskState.provenance":"บันทึกอย่างชัดเจนด้วย `memesh task` — ไม่ได้อนุมานจากจำนวนความทรงจำ","project.taskState.empty":"ยังไม่มีสถานะงานของโครงการนี้ ตั้งค่าในเซสชันทำงานด้วย `memesh task --goal … --next …` แล้วจะแสดงที่นี่","guard.sourceLesson":"บทเรียนต้นทาง","guard.pattern":"รูปแบบทริกเกอร์","guard.message":"คำเตือนที่จะแสดง","guard.shouldMatch":"ต้องทริกเกอร์เมื่อ","guard.shouldNotMatch":"ต้องเงียบเมื่อ","search.button":"ค้นหา","search.searching":"กำลังค้นหา…","search.results":"ผลลัพธ์","search.result":"ผลลัพธ์","search.noResults":"ไม่พบผลลัพธ์สำหรับ","search.facts":"ข้อเท็จจริง","browse.title":"ความทรงจำทั้งหมด","browse.active":"ใช้งานอยู่","browse.archived":"เก็บถาวร","browse.refresh":"รีเฟรช","browse.noMatch":"ไม่พบความทรงจำที่ตรงกัน:","browse.prev":"← ก่อนหน้า","browse.next":"ถัดไป →","browse.archive":"เก็บถาวร","browse.restore":"กู้คืน","browse.confirmArchive":"เก็บถาวรความทรงจำนี้?","browse.archiveFailed":"เก็บถาวรไม่สำเร็จ: {message}","browse.restoreFailed":"กู้คืนไม่สำเร็จ: {message}","analytics.totalMemories":"ความทรงจำทั้งหมด","analytics.knowledgeFacts":"ข้อเท็จจริง","analytics.connections":"การเชื่อมต่อ","analytics.topics":"หัวข้อ","analytics.insights":"ข้อมูลเชิงลึก","analytics.thisWeek":"สัปดาห์นี้","analytics.new":"ใหม่","analytics.stale":"ไม่ได้ใช้งาน (30+ วัน)","analytics.archivedLabel":"เก็บถาวร","analytics.mostRecalled":"ถูกเรียกดูมากที่สุด","health.title":"สุขภาพหน่วยความจำ","metrics.notMeasured":"ยังไม่ได้วัด","metrics.health":"สุขภาพ","metrics.healthNote":"กิจกรรม คุณภาพ ความสดใหม่ บทเรียน","metrics.critical":"บทเรียนร้ายแรง","metrics.criticalPartial":"จาก {tagged} รายการที่จัดประเภทแล้ว · ทั้งหมด {total} บทเรียน","metrics.criticalAll":"จากทั้งหมด {total} บทเรียน จัดประเภทครบแล้ว","metrics.criticalUnclassified":"{total} บทเรียน ยังไม่ได้จัดระดับความร้ายแรง","metrics.criticalNoLessons":"ยังไม่มีบทเรียนที่บันทึกไว้","metrics.citation":"การอ้างอิง","metrics.citationNote":"{cited} จาก {total} เซสชันอ้างอิงความทรงจำ","metrics.citationNotMeasured":"การติดตามการอ้างอิงจะเริ่มในเซสชันถัดไป","metrics.reused":"ใช้ซ้ำสัปดาห์นี้","metrics.reusedNote":"ค่าประมาณ — นับจากเวลาที่เข้าถึงล่าสุด","health.excellent":"ยอดเยี่ยม","health.good":"ดี","health.fair":"พอใช้","health.poor":"ไม่ดี","health.activity":"กิจกรรม","health.quality":"คุณภาพ","health.freshness":"ความสดใหม่","health.lessons":"การพัฒนาตนเอง","timeline.title":"30 วันที่ผ่านมา","timeline.created":"สร้างแล้ว","timeline.recalled":"เรียกคืนแล้ว","value.totalRecalls":"การเรียกคืนทั้งหมด","value.lessonsLearned":"บทเรียนที่เรียนรู้","value.lessonsSaved":"บทเรียนที่นำไปใช้","value.coverage":"ความครอบคลุมความรู้","cleanup.title":"คำแนะนำการทำความสะอาด","cleanup.allClean":"หน่วยความจำของคุณสะอาด ไม่พบเอนทิตีที่ล้าสมัยหรือซ้ำซ้อน","cleanup.staleLabel":"ความเชื่อมั่นต่ำ / ไม่ได้ใช้","cleanup.duplicateLabel":"อาจซ้ำซ้อน","cleanup.confidence":"ความเชื่อมั่น","cleanup.unused":"ไม่ได้ใช้","cleanup.entityMeta":"{type} · ความเชื่อมั่น {confidence}% · ไม่ได้ใช้มา {days} วัน","settings.saved":"บันทึกแล้ว","settings.configLoadFailed":"ไม่สามารถอ่านการตั้งค่าได้ โหลดหน้าใหม่อีกครั้งเพื่อลองอีกครั้ง","settings.configReadbackFailed":"เซิร์ฟเวอร์ไม่ส่งคืนการตั้งค่าที่บันทึกไว้ โปรดลองอีกครั้ง","settings.language":"ภาษา","settings.interfaceLanguage":"ภาษาของส่วนติดต่อ","settings.interfaceLanguageHint":"เปลี่ยนภาษาของส่วนติดต่อในเบราว์เซอร์นี้ทันที","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":"ไม่สามารถยืนยันสถานะเลิกใช้ในเซสชันนี้ — โปรดเรียกใช้ใหม่เมื่อออนไลน์","settings.updatePartialSummary":"บางส่วน — ไม่ทราบสถานะการเลิกใช้","settings.updateDeprecatedTargetUnknown":"เลิกใช้แล้ว — กำลังหาเวอร์ชันสำหรับอัปเกรด","settings.currentVersion":"เวอร์ชันปัจจุบัน","settings.latestVersion":"เวอร์ชันล่าสุด","settings.lastAttempted":"พยายามตรวจสอบล่าสุด","settings.lastSuccessful":"ตรวจสอบสำเร็จล่าสุด","settings.updateSourceFresh":"ตรวจสอบสด","settings.updateSourceCached":"ใช้ผลลัพธ์จากแคช","settings.updateSourceStale":"ใช้ผลลัพธ์แคชที่ล้าสมัย","settings.updateSourceUnavailable":"ไม่มีผลลัพธ์แคช","settings.updateCommand":"คำสั่งอัปเดต","settings.checkNow":"ตรวจสอบตอนนี้","settings.updateLastError":"ข้อผิดพลาดจากการตรวจสอบล่าสุด: {message}","settings.updateRetryGuidance":"ตรวจสอบการเชื่อมต่อและการตั้งค่า npm registry ของคุณ แล้วลองอีกครั้ง เวอร์ชันที่ติดตั้งของคุณไม่มีการเปลี่ยนแปลง","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","settings.installationDetails":"รายละเอียดการติดตั้ง","settings.installationDetailsUnavailable":"ไม่สามารถเปรียบเทียบเวอร์ชันสำหรับการติดตั้งนี้ได้","settings.interfacePath":"อินเทอร์เฟซนี้","settings.terminalPath":"คำสั่งในเทอร์มินัล","settings.technicalDetails":"รายละเอียดทางเทคนิค","settings.installationDetailsHint":"เวอร์ชันที่ติดตั้งแตกต่างกันไม่ได้หมายความว่าต้องอัปเดตเสมอไป ดูรุ่นที่เผยแพร่แล้วได้ที่ การอัปเดต","roadmap.resetView":"รีเซ็ตมุมมอง","lessons.error":"ข้อผิดพลาด","lessons.rootCause":"สาเหตุหลัก","lessons.fix":"วิธีแก้ไข","lessons.prevention":"การป้องกัน","feedback.button":"💬 ความคิดเห็น","feedback.title":"เปิดความคิดเห็นบน GitHub","feedback.bug":"ข้อผิดพลาด","feedback.feature":"ข้อเสนอแนะ","feedback.question":"คำถาม","feedback.placeholder":"อธิบายความคิดเห็นของคุณ…","feedback.includeSys":"รวมข้อมูลระบบ","feedback.submit":"เปิด GitHub Issue","feedback.submitting":"กำลังรวบรวมการวินิจฉัย…","feedback.popupBlocked":"GitHub ไม่ได้เปิด ร่างของคุณยังอยู่ครบ โปรดอนุญาตป๊อปอัป ลองอีกครั้ง หรือคัดลอกลิงก์ที่เตรียมไว้","feedback.retry":"ลองเปิด GitHub อีกครั้ง","feedback.copyLink":"คัดลอกลิงก์ GitHub","feedback.linkCopied":"คัดลอกลิงก์แล้ว","feedback.copyFailed":"คัดลอกลิงก์ไม่ได้ โปรดลองเปิด GitHub อีกครั้ง","doctorBanner.warnTitleSoft":"memesh มีบันทึกการตั้งค่า","doctorBanner.failTitle":"การตั้งค่า memesh ยังไม่สมบูรณ์","doctorBanner.dismiss":"ปิด","doctorBanner.getHelp":"ขอความช่วยเหลือ","doctorBanner.helpHint":"เปิด GitHub issue พร้อมข้อมูลการวินิจฉัยที่กรอกไว้แล้ว","doctorBanner.preambleForIssue":"memesh doctor รายงานสิ่งต่อไปนี้บนการติดตั้งของฉัน:","doctorBanner.moreCount":"…และอีก {n} รายการ — รัน `memesh doctor` เพื่อดูรายการทั้งหมด","doctorBanner.fix":"แก้ไขอัตโนมัติ","doctorBanner.fixInProgress":"กำลังแก้ไข…","doctorBanner.fixDone":"แก้ไขแล้ว","doctorBanner.restartRequired":"เริ่มเอเจนต์ใหม่เพื่อทำการอัปเดตนี้ให้เสร็จ","doctor.label.readme_locale_parity":"คำแปล README","doctor.label.config":"ไฟล์ตั้งค่า","doctor.label.mcp-config":"ไฟล์เชื่อมต่อ MCP","doctor.label.hooks-config":"ข้อกำหนด hook","doctor.label.hook-scripts":"สคริปต์ hook","doctor.label.hook-wiring":"การเชื่อมต่อกับ Claude Code","doctor.label.hook-activity":"บันทึกอัตโนมัติ","doctor.label.node-runtime":"เวอร์ชัน Node.js","doctor.label.native-binding":"SQLite","doctor.label.plugin-cache":"โค้ดปลั๊กอินเป็นเวอร์ชันล่าสุด","doctor.label.shell-cli":"คำสั่งในเทอร์มินัล","doctor.label.dashboard":"ไฟล์แดชบอร์ด","doctor.label.claude-channel":"การลงทะเบียนช่อง Claude","doctor.msg.claude-channel.unregistered.summary":"การแจ้งเตือนสดของช่อง Claude ยังไม่ได้เปิดใช้งาน เครื่องมือหน่วยความจำ MCP และข้อความกล่องขาเข้าที่คงทนยังสามารถทำงานได้ ตัวอย่างนี้เป็นตัวเลือกเสริม","doctor.msg.claude-channel.unregistered.fix":"เพื่อเปิดใช้งานช่องเสริมนี้ ให้รัน `memesh agent setup claude` จากนั้นลงทะเบียนคำสั่ง MCP ที่พิมพ์ใน การตั้งค่าผู้ใช้ Claude ของคุณ","doctor.label.update-status":"การอัปเดต","doctor.label.http-probe":"เซิร์ฟเวอร์ในเครื่อง","doctor.label.skills-manifest":"ไฟล์ที่มาพร้อมแพ็กเกจ","doctor.label.config_parse":"ไฟล์ตั้งค่า","doctor.label.install-channel":"วิธีติดตั้ง","doctor.label.fts_segmentation":"ดัชนีคำสำคัญ","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 (.claude-plugin/mcp.json) หายไป","doctor.msg.mcp-config.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.mcp-config.invalid-json.summary":".claude-plugin/mcp.json เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง) Claude Code จึงอ่านไม่ได้","doctor.msg.mcp-config.invalid-json.fix":"แก้ {path} หรือติดตั้ง MeMesh ใหม่","doctor.msg.mcp-config.no-entry.summary":".claude-plugin/mcp.json ไม่มีรายการเซิร์ฟเวอร์ memesh แล้ว","doctor.msg.mcp-config.no-entry.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.mcp-config.entry-missing.summary":"`.claude-plugin/mcp.json` สั่งเปิดไฟล์ที่ไม่มีอยู่ในการติดตั้งนี้ เครื่องมือ memesh ทุกตัวใน Claude Code จึงเริ่มทำงานไม่ได้","doctor.msg.mcp-config.entry-missing.fix":"ติดตั้ง MeMesh ใหม่ ถ้าคุณแก้ `.claude-plugin/mcp.json` เอง ให้ชี้กลับไปที่ `${CLAUDE_PLUGIN_ROOT}/dist/mcp/server.js`","doctor.msg.mcp-config.placeholder-unresolved.summary":"ยังไม่ได้ตรวจสอบ: `.claude-plugin/mcp.json` สั่งเปิดพาธที่มี `${CLAUDE_PLUGIN_ROOT}` ซึ่งมีเพียงระบบรันปลั๊กอินของ Claude Code เท่านั้นที่แทนค่าให้ การติดตั้งชุดนี้ไม่ได้ทำงานในฐานะปลั๊กอิน จึงยังไม่ได้ตรวจไฟล์ที่มันชี้ไป","doctor.msg.mcp-config.placeholder-unresolved.fix":"ตรวจแบบเดียวกับที่ระบบรันปลั๊กอินทำ: รัน `CLAUDE_PLUGIN_ROOT=<โฟลเดอร์ของการติดตั้งนี้> memesh doctor`","doctor.msg.hooks-config.missing.summary":"hooks/hooks.json หายไป การบันทึกความจำอัตโนมัติจึงทำงานไม่ได้","doctor.msg.hooks-config.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.hooks-config.invalid-json.summary":"hooks/hooks.json เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง)","doctor.msg.hooks-config.invalid-json.fix":"แก้ {path} หรือติดตั้ง MeMesh ใหม่","doctor.msg.hooks-config.missing-types.summary":"hooks/hooks.json ขาด hook ประเภทเหล่านี้: {types} การบันทึกอัตโนมัติบางส่วนจะไม่ทำงาน","doctor.msg.hooks-config.missing-types.fix":"กู้คืนการตั้งค่า hook ดั้งเดิม หรือติดตั้ง MeMesh ใหม่","doctor.msg.hook-scripts.none.summary":"การตั้งค่า hook ไม่มีสคริปต์เลย จึงบันทึกอะไรอัตโนมัติไม่ได้","doctor.msg.hook-scripts.none.fix":"ติดตั้ง MeMesh ใหม่","doctor.msg.hook-scripts.missing.summary":"สคริปต์ hook เหล่านี้หายไป: {files}","doctor.msg.hook-scripts.missing.fix":"ติดตั้ง MeMesh ใหม่เพื่อกู้คืน","doctor.msg.hook-scripts.not-executable.summary":"สคริปต์ hook เหล่านี้มีอยู่ แต่ไม่ได้รับอนุญาตให้รัน: {files}","doctor.msg.hook-scripts.not-executable.fix":"รัน `chmod +x scripts/hooks/*.js` หรือถ้าใช้ซอร์สโค้ดให้รัน `npm run build`","doctor.msg.hook-wiring.no-marker.summary":"memesh ยังไม่ได้เชื่อมกับ Claude Code จึงยังไม่มีอะไรถูกจดจำอัตโนมัติ","doctor.msg.hook-wiring.no-marker.fix":"รัน `memesh install-hooks` หนึ่งครั้ง แล้วรัน `memesh doctor` เพื่อยืนยัน","doctor.msg.hook-wiring.script-missing.summary":"hook ของ memesh ที่เชื่อมต่อไว้ชี้ไปที่ {path} ซึ่งไม่มีอยู่แล้ว — agent จะเรียกไฟล์ที่หายไปทุกครั้งที่เกิดเหตุการณ์ที่ตรงกัน มักเป็นซากจากการอัปเกรดที่เลิกใช้ hook นั้น","doctor.msg.hook-wiring.script-missing.fix":"รัน `memesh install-hooks` เพื่อเชื่อมต่อใหม่ (รายการที่เลิกใช้จะถูกลบ) แล้วรีสตาร์ต agent","doctor.msg.hook-wiring.marker-unreadable.summary":"อ่านบันทึกการเชื่อมต่อที่ {path} ไม่ได้","doctor.msg.hook-wiring.marker-unreadable.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.marker-malformed.summary":"บันทึกการเชื่อมต่อเสียหาย","doctor.msg.hook-wiring.marker-malformed.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.settings-missing.summary":"ไฟล์ตั้งค่าของ Claude Code ({path}) หายไป การเชื่อมต่อจึงขาด","doctor.msg.hook-wiring.settings-missing.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.settings-invalid.summary":"{path} เสียหาย (ไม่ใช่ JSON ที่ถูกต้อง)","doctor.msg.hook-wiring.settings-invalid.fix":"กู้คืนจากไฟล์สำรอง หรือรัน `memesh install-hooks` เพื่อสร้างใหม่","doctor.msg.hook-wiring.entries-removed.summary":"รายการ memesh ถูกลบออกจาก {path} การเชื่อมต่อจึงขาด","doctor.msg.hook-wiring.entries-removed.fix":"รัน `memesh install-hooks` อีกครั้ง","doctor.msg.hook-wiring.root-moved.summary":"การเชื่อมต่อชี้ไปที่ {path} ซึ่งไม่มีอยู่แล้ว (memesh อาจถูกย้ายที่)","doctor.msg.hook-wiring.root-moved.fix":"รัน `memesh install-hooks` เพื่ออัปเดต","doctor.msg.hook-activity.never-ran.summary":"ไม่มี hook เก็บข้อมูลทำงานเลยตลอด {hours} ชั่วโมงนับตั้งแต่เริ่มติดตาม ทั้งที่การเชื่อมต่อ hook ปกติดี — ไม่มีอะไรถูกจดจำไว้เลย","doctor.msg.hook-activity.never-ran.fix":"ทำงานให้จบหนึ่งเซสชัน แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังบอกว่าไม่มี hook ทำงาน ให้รัน `memesh install-hooks` แล้วรีสตาร์ท agent","doctor.msg.hook-activity.stale.summary":"hook เก็บข้อมูลครั้งล่าสุดทำงานเมื่อประมาณ {hours} ชั่วโมงที่แล้ว ({hook}) ถ้าคุณทำงานหลังจากนั้น แปลว่าการเก็บข้อมูลหยุดไปแล้วและไม่มีอะไรจากเซสชันเหล่านั้นถูกบันทึก","doctor.msg.hook-activity.stale.fix":"รีสตาร์ท agent จบหนึ่งเซสชัน แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังไม่กลับมา ให้รัน `memesh install-hooks`","doctor.msg.hook-activity.stale-unconfirmed.summary":"hook session-summary รันครั้งล่าสุดประมาณ {hours} ชั่วโมงก่อน และ 3 วันที่ผ่านมาก็ไม่มีการเขียนจาก Claude Code เลย ถ้าเครื่องนี้ย้ายไปใช้ agent อื่น (Codex / Gemini) นี่เป็นเรื่องปกติ แต่ถ้ายังใช้ Claude Code ที่นี่ การเก็บบันทึกหยุดแล้ว","doctor.msg.hook-activity.stale-unconfirmed.fix":"ถ้ายังใช้ Claude Code บนเครื่องนี้: รีสตาร์ต จบเซสชันหนึ่งครั้ง แล้วรัน `memesh doctor` อีกครั้ง ถ้ายังไม่ฟื้น ให้รัน `memesh install-hooks`","doctor.msg.hook-activity.query-failed.summary":'อ่านประวัติการทำงานของ hook จากฐานข้อมูลไม่ได้: {detail} สถานะการเก็บข้อมูลตอนนี้คือ "ไม่ทราบ" ซึ่งไม่เหมือนกับ "ปกติ"',"doctor.msg.hook-activity.query-failed.fix":"รัน `memesh doctor --verbose` เพื่อดูข้อความผิดพลาดเต็ม และตรวจว่า ~/.memesh อ่านได้และดิสก์ไม่เต็ม","doctor.msg.hook-activity.stale-unknown.summary":'อ่านเวลาการรันล่าสุดของ hook {hook} ไม่ได้ (ข้อมูลเสีย หรือถูกบันทึกโดยเครื่องที่นาฬิกาเพี้ยน) สถานะการเก็บบันทึกตอนนี้คือ "ไม่ทราบ" ซึ่งไม่เหมือนกับ "ปกติ"',"doctor.msg.hook-activity.stale-unknown.fix":"จบเซสชันงานหนึ่งครั้งแล้วรัน `memesh doctor` อีกครั้ง — การรันครั้งใหม่จะเขียนทับเวลาที่เสีย","doctor.msg.hook-activity.disabled.summary":"การเก็บบันทึกอัตโนมัติถูกปิดอยู่ (MEMESH_AUTO_CAPTURE หรือ autoCapture ในการตั้งค่า) — เป็นการตั้งใจ ดังนั้น hook เงียบจึงเป็นเรื่องที่คาดไว้ เปิดกลับเพื่อกลับมาเก็บบันทึกเซสชัน","doctor.msg.hook-activity.disabled-env.summary":"การเก็บบันทึกอัตโนมัติถูกปิดโดย MEMESH_AUTO_CAPTURE=false ในสภาพแวดล้อมของ shell นี้ doctor เห็นได้เฉพาะสภาพแวดล้อมของตัวเอง — ถ้า agent ของคุณรันโดยไม่มีตัวแปรนี้ การเก็บบันทึกฝั่งนั้นไม่ได้รับผลกระทบ","doctor.msg.hook-activity.not-wired.summary":"ไม่มี hook เก็บบันทึกใดเคยรันเลย — และบนเครื่องนี้ไม่พบการเชื่อมต่อ hook เก็บบันทึก (Stop / PostToolUse / PreCompact) ที่ยืนยันได้ จึงไม่มีอะไรให้รัน","doctor.msg.hook-activity.not-wired.fix":"ถ้าต้องการเก็บบันทึกอัตโนมัติ ให้รัน `memesh install-hooks` ถ้าการติดตั้งนี้ใช้เฉพาะ MCP (Codex / Gemini) นี่เป็นเรื่องปกติและข้ามได้","doctor.msg.hook-activity.stop-silent.summary":"hook {hook} ยังประทับเวลาอยู่ แต่ hook session-summary ไม่เคยรันเลยสักครั้งตลอด {hours} ชั่วโมงนับตั้งแต่เริ่มติดตาม — การเก็บบันทึกเซสชันอาจพังอยู่ โดยถูกการเก็บบันทึก commit บังไว้","doctor.msg.hook-activity.stop-silent.fix":"จบเซสชันงานหนึ่งครั้งแล้วรัน `memesh doctor` อีกครั้ง ถ้า session-summary ยังไม่รัน ให้รัน `memesh install-hooks` แล้วรีสตาร์ต agent","doctor.label.capture-liveness":"การบันทึกยังทำงานอยู่ไหม","doctor.msg.capture-liveness.silent-hook.summary":"{hook}: รัน {runs} ครั้ง เขียน 0 ครั้ง — เหตุผลคือ «{reason}» hook ยังทำงานอยู่แต่ตัดสินทุกครั้งว่าไม่มีอะไรให้บันทึก ซึ่งเป็นภาพเดียวกับตอนที่เส้นทางการบันทึกพัง","doctor.msg.capture-liveness.silent-hook.fix":"รัน `memesh doctor --json` เพื่อดูตัวเลขของแต่ละ hook ถ้าเหตุผลนั้นไม่ตรงกับวิธีที่คุณใช้งาน ให้รัน `memesh install-hooks` แล้วรีสตาร์ต agent","doctor.msg.capture-liveness.type-stopped.summary":"ใน 7 วันที่ผ่านมาไม่มีข้อมูลชนิด «{type}» ถูกบันทึกเลย เทียบกับ {prev} รายการใน 7 วันก่อนหน้า สิ่งที่เคยถูกจดจำได้หยุดถูกจดจำแล้ว","doctor.msg.capture-liveness.type-stopped.fix":"รัน `memesh doctor --json` เพื่อดูตัวเลขของแต่ละ hook และตรวจว่าวิธีทำงานของคุณเปลี่ยนไปหรือไม่ ถ้าไม่เปลี่ยน ให้รัน `memesh install-hooks` แล้วรีสตาร์ต agent","doctor.msg.capture-liveness.never-ran.summary":"ตลอด {hours} ชั่วโมงนับจากเริ่มติดตาม hook {hook} ไม่ได้ทิ้งทั้งบันทึกและสัญญาณชีพไว้เลย มันไม่เคยรัน สิ่งที่มันควรบันทึกจึงไม่ถูกเก็บไว้เลย","doctor.msg.capture-liveness.never-ran.fix":"รัน `memesh install-hooks` แล้วรีสตาร์ต agent จากนั้นจบเซสชันงานหนึ่งครั้งแล้วรัน `memesh doctor` อีกครั้ง","doctor.msg.capture-liveness.not-wired.summary":"hook {hook} ยังไม่เคยทำงาน แต่เครื่องนี้ยังไม่ได้เชื่อมต่อ hook สำหรับบันทึกความจำ","doctor.msg.capture-liveness.not-wired.fix":"หากต้องการบันทึกอัตโนมัติ ให้รัน `memesh install-hooks` หากเป็นการติดตั้งแบบ MCP เท่านั้น (Codex, Gemini หรือ Cursor) นี่เป็นเรื่องปกติ","doctor.msg.capture-liveness.never-ran-legacy.summary":"hook {hook} ไม่มีบันทึกผลลัพธ์ แต่มีความจำจากการบันทึกอัตโนมัติ {captured} รายการตั้งแต่เริ่มติดตาม อาจยังมี hook รุ่นเก่าทำงานอยู่","doctor.msg.capture-liveness.never-ran-legacy.fix":"อัปเดต hook ของ MeMesh รีสตาร์ต agent แล้วรัน `memesh doctor` อีกครั้ง","doctor.msg.capture-liveness.query-failed.summary":'อ่านสถานะการบันทึกจากฐานข้อมูลไม่ได้: {detail} ตอนนี้ไม่รู้ว่ามีอะไรถูกเก็บไว้หรือไม่ และ "ไม่รู้" ไม่เท่ากับ "ปกติ"',"doctor.msg.capture-liveness.query-failed.fix":"ข้อความผิดพลาดอยู่ด้านบน ตรวจสอบว่า ~/.memesh อ่านได้และดิสก์ไม่เต็ม","doctor.msg.hook-activity.never-ran-legacy.summary":"ไม่มี hook ใดประทับเวลาหัวใจเต้นเลย แต่นับตั้งแต่เริ่มติดตามมีความทรงจำจากการเก็บบันทึกอัตโนมัติ {captured} รายการเข้ามา — น่าจะเป็น hook รุ่นเก่าก่อนมีระบบติดตามที่ยังรันอยู่","doctor.msg.hook-activity.never-ran-legacy.fix":"อัปเดต hook ของ memesh เป็นรุ่นปัจจุบัน (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) แล้วรีสตาร์ต agent","doctor.msg.node-runtime.too-old.summary":"Node.js ของคุณเก่ากว่าที่แพ็กเกจนี้รองรับ {detail}","doctor.msg.node-runtime.too-old.fix":"อัปเกรด Node.js เป็น {required} ขึ้นไป แล้วรัน `memesh doctor` อีกครั้ง","doctor.msg.native-binding.load-failed.summary":"SQLite ไม่สามารถเปิดฐานข้อมูลได้: {detail}","doctor.msg.native-binding.load-failed.fix":"ตรวจสอบสภาพแวดล้อม Node และติดตั้ง MeMesh ใหม่หากจำเป็น","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.shell-cli.versions.summary":"เวอร์ชันที่ติดตั้ง: อินเทอร์เฟซนี้ {current}; เทอร์มินัล {terminal}","doctor.msg.plugin-cache.stale.summary":"ปลั๊กอินติดตั้งจาก commit {installed} แต่ marketplace ไปถึง {marketplace} แล้วภายใต้เวอร์ชันเดียวกัน {host} ไม่รีเฟรชแคชเมื่อเวอร์ชันไม่เปลี่ยน คุณจึงกำลังรันโค้ดที่เก่ากว่าที่ marketplace มี","doctor.msg.plugin-cache.stale.fix":"รัน `{command}` เพื่อรีเฟรชแคช แล้วรีสตาร์ต {host}","doctor.msg.plugin-cache.unverifiable.summary":"ไม่สามารถบอกได้ว่าปลั๊กอินที่ติดตั้งตรงกับ marketplace หรือไม่ ดูแค่เวอร์ชันไม่พอ — บิลด์สองชุดอาจมีเวอร์ชันเดียวกัน","doctor.msg.plugin-cache.unverifiable.fix":"รัน `{command}` หนึ่งครั้ง มันจะบันทึก commit และการตรวจสอบนี้จะตอบได้","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.config-parse.retired-settings.summary":"ไฟล์ตั้งค่าที่ถูกต้องใน {path} ยังมีการตั้งค่าระดับบนสุดที่เลิกใช้แล้ว {count} รายการ ({keys}) เวอร์ชันนี้จะข้ามค่าเหล่านี้ แต่ข้อมูลรับรองหรือการตั้งค่าผู้ให้บริการเดิมอาจยังอยู่บนดิสก์","doctor.msg.config-parse.retired-settings.fix":"ตรวจสอบ {path} ในเครื่องและลบเฉพาะคีย์ระดับบนสุดที่เลิกใช้แล้วเหล่านั้น อย่าวางไฟล์ใน issue เพราะอาจมีข้อมูลรับรอง จากนั้นรัน memesh doctor อีกครั้ง","doctor.msg.message-capability.probe-failed.summary":"การตรวจสอบความสามารถด้านข้อความที่ติดตั้งล้มเหลว: {detail}","doctor.msg.message-router.socket-missing.summary":"ไม่มี socket ของ router Local ที่ {path} และจะไม่ปลุก session ที่หยุดหรือไม่มีอยู่","doctor.msg.message-router.socket-insecure.summary":"socket ของ router ที่ {path} ไม่ใช่ Unix socket ส่วนตัวของเจ้าของ","doctor.msg.message-router.socket-unreachable.summary":"มี socket ส่วนตัวของ router ที่ {path} แต่ไม่รับการเชื่อมต่อภายในเครื่อง","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.citation.none.summary":"เซสชันได้รับความทรงจำที่ถูกแทรกเข้ามา แต่ไม่มีรายการใดถูกอ้างอิง","doctor.msg.citation.none.fix":"ตรวจสอบข้อตกลงการอ้างอิงที่ ~/.claude/rules/memesh-citations.md แล้วตรวจอีกครั้งหลังผ่านไปหลายเซสชัน","doctor.msg.database.broken.summary":"ฐานข้อมูลใช้งานไม่ได้: {detail}","doctor.update_status.prerelease":"กำลังใช้งานรุ่นก่อนเผยแพร่ ({current}); npm latest คือ {latest}","patterns.title":"รูปแบบของคุณ","patterns.workSchedule":"ตารางการทำงาน","patterns.peakHours":"ช่วงเวลาพีค","patterns.busiestDays":"วันที่ยุ่งที่สุด","patterns.workflow":"กระบวนการทำงาน","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.auth.cross-origin":"คำขอนี้มาจากเว็บไซต์อื่น หรือมาถึงเซิร์ฟเวอร์ด้วยชื่อที่ไม่คาดคิด จึงถูกปฏิเสธ กรุณาเปิดแดชบอร์ดจากที่อยู่ที่ `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.rate.limited":"มีคำขอมากเกินไปในช่วงเวลาสั้น ๆ กรุณารอสักครู่แล้วลองใหม่อีกครั้ง","httpError.server.internal":"เซิร์ฟเวอร์เกิดข้อผิดพลาดที่ไม่คาดคิด","httpError.operation.permission-denied":"MeMesh ไม่มีสิทธิ์แก้ไขไฟล์ที่จำเป็นสำหรับการซ่อมแซมนี้ ปิดแดชบอร์ดนี้ เรียกใช้ `memesh serve` ใน Terminal ของคุณ แล้วลองอีกครั้ง หากยังล้มเหลว ให้เรียกใช้ `memesh doctor`","time.justNow":"เมื่อสักครู่","time.hoursAgo":"{count} ชั่วโมงที่แล้ว","time.today":"วันนี้","time.yesterday":"เมื่อวาน","time.daysAgo":"{count} วันที่แล้ว","time.lastWeek":"สัปดาห์ที่แล้ว","time.weeksAgo":"{count} สัปดาห์ที่แล้ว","time.lastMonth":"เดือนที่แล้ว","time.monthsAgo":"{count} เดือนที่แล้ว","memory.access.frequent":"ใช้บ่อย · {count} ครั้ง","memory.access.recalls":"{count} ครั้ง","memory.access.never":"ไม่เคยเรียก","cluster.knowledge":"ความรู้","cluster.activity":"กิจกรรม","cluster.session":"เซสชัน","cluster.reference":"อ้างอิง","cluster.all":"ทั้งหมด","browse.filterTime":"เวลา","browse.filterValue":"มูลค่า","browse.filterProject":"โปรเจกต์","browse.filterSort":"จัดเรียง","browse.timeToday":"วันนี้","browse.timeWeek":"สัปดาห์นี้","browse.timeMonth":"เดือนนี้","browse.timeOlder":"เก่ากว่า","browse.valueRecalled":"✓ ใช้แล้ว","browse.valueNever":"ไม่เคยเรียก","browse.sortMostRecalled":"ใช้มากที่สุด","browse.sortRecent":"ล่าสุด","browse.sortCreated":"สร้างเมื่อ","browse.emptyFilter":"ไม่มีหน่วยความจำในหมวดนี้ — ลองตัวกรองอื่น","lessons.stepsLabel":"ขั้น","lessons.commitsCount":"{count} commits","lessons.unstructured":"(ไม่มีฟิลด์ที่มีโครงสร้าง — ดูหน่วยความจำดิบ)","lessons.moreItems":"+{count} เพิ่มเติม","roadmap.title":"ประวัติโครงการ","roadmap.summary":"{count} ความทรงจำ · {first} → {last}","roadmap.switchToList":"↩ มุมมองรายการ","roadmap.switchToRoadmap":"🕘 มุมมองประวัติ","roadmap.emptyProject":"ยังไม่มีความทรงจำในโครงการนี้","loop.label":"ลูปความทรงจำ","loop.subtitleHas":"ความทรงจำเชิงความรู้ที่ถูกเรียกในช่วง 7 วันที่ผ่านมา","loop.subtitleNone":"สัปดาห์นี้ยังไม่มีความทรงจำที่ถูกเรียก","loop.approxNote":"ค่าประมาณ — การติดตามเต็มรูปแบบเริ่มหลังการอัพเกรด","loop.sparkLabel":"30 วันล่าสุด","roadmap.milestones":"เหตุการณ์สำคัญ","roadmap.keyLessons":"บทเรียนสำคัญ","radar.title":"เรดาร์ความครอบคลุม","radar.caption":"ความทรงจำที่ใช้งาน (ไม่รวม session และ commit)","radar.axis.lessons":"บทเรียน","radar.axis.decisions":"การตัดสินใจ","radar.axis.patterns":"แพทเทิร์น","radar.axis.bugs":"แก้ไขบั๊ก","radar.axis.processes":"กระบวนการ","radar.axis.architecture":"สถาปัตยกรรม","ageMatrix.title":"การกระจายอายุ","ageMatrix.low":"ต่ำ","ageMatrix.high":"สูง","ageMatrix.legend":"ความเข้ม = ความหนาแน่น","ageMatrix.typeColumn":"ประเภท","header.signalModeOn":"ความทรงจำสำคัญ","header.signalModeOff":"ความทรงจำทั้งหมด","header.signalModeOnHint":"แสดงเป้าหมาย การตัดสินใจ บทเรียน และแผน พร้อมซ่อนบันทึก session, commit และกิจกรรมที่เก็บอัตโนมัติในความทรงจำ","header.signalModeOffHint":"แสดงบันทึกทั้งหมด รวมถึง session, commit และกิจกรรมที่เก็บอัตโนมัติในความทรงจำ","globalFilter.focusedStatus":"มุมมองรวม: ความทรงจำสำคัญ — ซ่อนบันทึก session, commit และกิจกรรมที่เก็บอัตโนมัติในความทรงจำ","globalFilter.allStatus":"มุมมองรวม: ความทรงจำทั้งหมด — รวมบันทึก session, commit และกิจกรรมที่เก็บอัตโนมัติในความทรงจำ","roadmap.phases":"ระยะ","onboarding.title":"ยินดีต้อนรับสู่ MeMesh","onboarding.body":"ที่เก็บความทรงจำว่างเปล่า เริ่มด้วยทัวร์ 30 รายการที่คัดสรรแล้วหรือบันทึกบทเรียนแรก","onboarding.coreHint":"หน่วยความจำภายใน: remember การค้นหาคำสำคัญด้วย FTS5 hooks และการดู Dashboard ทำงานร่วมกัน","onboarding.searchHint":"การเรียกคืนใช้การค้นหาคำสำคัญด้วย FTS5 ภายในเครื่อง","onboarding.reviewHint":"เอเจนต์ที่กำลังทำงานสามารถเตรียมแพ็กเกจไดเจสต์หรือบทสนทนาที่มองเห็นได้ ส่วนแดชบอร์ดมีหน้าที่ตรวจสอบข้อเสนอที่เตรียมไว้เท่านั้น","onboarding.seedButton":"เริ่มทัวร์ตัวอย่าง","onboarding.seedingButton":"กำลังโหลด…","onboarding.seedHint":"เพิ่ม 30 ความทรงจำที่นี่เลย — ไม่ต้องเปิดเทอร์มินัล","onboarding.cliReference":"ชอบใช้ CLI ใช่ไหม?","onboarding.hintDemo":"ใส่ 30 ความทรงจำตัวอย่าง ลบทีหลังได้","onboarding.hintReset":"ลบทุกอย่างที่ติด metadata.demo","onboarding.resetButton":"ล้างข้อมูลตัวอย่าง","onboarding.resettingButton":"กำลังลบ…","onboarding.demoLoadedTitle":"โหลดข้อมูลตัวอย่างแล้ว","onboarding.demoLoadedBody":"มีความทรงจำที่ติดแท็ก demo จำนวน {count} รายการ ที่นี่จะลบเฉพาะรายการเหล่านั้น","onboarding.resetConfirm":"ลบความทรงจำทั้งหมดที่ติดแท็ก metadata.demo หรือไม่? ไม่สามารถกู้คืนแถวเดิมได้ แต่โหลดตัวอย่างใหม่ภายหลังได้ ความทรงจำจริงจะยังอยู่","onboarding.resetReadbackFailed":"ยืนยันการรีเซ็ตไม่ได้เพราะยังมีความทรงจำ demo ปุ่มล้างข้อมูลจะยังแสดงอยู่ โปรดลองอีกครั้งหรือเรียก memesh doctor","onboarding.dismiss":"ปิด","common.serverError":"เซิร์ฟเวอร์ตอบกลับข้อผิดพลาด (HTTP {status}) ลองอีกครั้ง — หากยังเกิดซ้ำ ให้รัน `memesh doctor`","emptyLibrary.title":"ความทรงจำของคุณยังว่างเปล่า","emptyLibrary.body":"ยังไม่มีข้อมูลบันทึกไว้ โหลดทัวร์ตัวอย่าง 30 รายการเพื่อดูการทำงานของ MeMesh — ลบทีหลังได้ในคลิกเดียว","browse.truncated":"กำลังแสดง {shown} รายการแรกจากทั้งหมด {total} — ใช้การค้นหาหรือตัวกรองเพื่อดูที่เหลือ","browse.truncatedUnknownTotal":"กำลังแสดง {shown} รายการแรก — อ่านจำนวนทั้งหมดไม่ได้ จึงอาจมีมากกว่านี้","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":'ในช่องทางติดตั้งที่รองรับ การใช้ครั้งแรกจะขอความยินยอมหนึ่งครั้งก่อนอัปเดต "ไว้ก่อน" จะเลื่อนเวอร์ชันนั้น (24 ชั่วโมง จากนั้น 48 ชั่วโมง แล้ว 7 วัน) "ไม่ต้องถามอีก" จะปิดการตรวจสอบ ช่องทางอื่นจะแสดงวิธีอัปเดตของตนเอง หลังอัปเกรด โฮสต์ที่กำลังทำงานจะใช้เวอร์ชันเดิมจนกว่าจะรีสตาร์ท MEMESH_AUTO_UPDATE กำหนดขอบเขตเท่านั้นและไม่ข้ามการยินยอม',"errors.timeout":"คำขอหมดเวลา","type.lesson_learned":"บทเรียน","type.lesson":"บทเรียน","type.mistake":"ความผิดพลาด","type.decision":"การตัดสินใจ","type.goal":"เป้าหมาย","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":"บุคคล","patterns.day.0":"วันอาทิตย์","patterns.day.1":"วันจันทร์","patterns.day.2":"วันอังคาร","patterns.day.3":"วันพุธ","patterns.day.4":"วันพฤหัสบดี","patterns.day.5":"วันศุกร์","patterns.day.6":"วันเสาร์","lessons.severity.critical":"วิกฤต","lessons.severity.major":"รุนแรง","lessons.severity.minor":"เล็กน้อย","memory.tooltip.project":"โครงการ","memory.tooltip.recalled":"ถูกเรียกคืน {count} ครั้ง","memory.tooltip.hasRelations":"เชื่อมโยงกับความทรงจำอื่น {count} รายการ","memory.tooltip.createdAt":"สร้างเมื่อ {date}","common.unknown":"ไม่ทราบ","insights.entitiesCount":"{n} เอนทิตี","roadmap.viewToggle":"มุมมองประวัติโครงการ","roadmap.viewTree":"ต้นไม้","roadmap.viewMindmap":"มายด์แมป","roadmap.mindmapNeedsPhases":"มายด์แมปต้องมีความทรงจำอย่างน้อย 3 รายการภายใน 7 วัน","roadmap.activePhase":"กำลังดำเนิน","roadmap.entryCount":"{count} รายการ","roadmap.entriesCount":"{count} รายการ","roadmap.otherGroup":"อื่น ๆ ({count})","roadmap.lowSignalHidden":"(ซ่อน {count} รายการสัญญาณต่ำ)","roadmap.resetHint":"รีเซ็ตการซูมและตำแหน่ง (ดับเบิลคลิกพื้นหลังก็ได้)","roadmap.zoomHint":"เลื่อนเพื่อซูม · ลากเพื่อเลื่อน · {pct}%","roadmap.moreEntities":"อีก {count} รายการ","roadmap.viewDecisions":"การตัดสินใจ","roadmap.densityTitle":"ความหนาแน่นของการบันทึกตามหมวดหมู่","roadmap.densityNote":"สิ่งที่ memesh บันทึกไว้ — ไม่ใช่ทุกอย่างที่เกิดขึ้น","roadmap.lineageSupersedes":"ถูกแทนที่แล้ว {n} รายการ","roadmap.lineageConflicts":"ความขัดแย้งที่ยังไม่ได้แก้ไข {n} รายการ","adr.empty":'โครงการนี้ยังไม่มีการตัดสินใจที่บันทึกไว้ บันทึกหนึ่งรายการด้วยประเภท "decision" แล้วรายการนั้นจะปรากฏที่นี่พร้อมประวัติของมัน',"adr.statusActive":"ใช้งานอยู่","adr.statusSuperseded":"ถูกแทนที่แล้ว","adr.supersedes":"แทนที่","adr.supersededBy":"ถูกแทนที่โดย","nav.ariaLabel":"ส่วนต่าง ๆ ของแดชบอร์ด","feedback.descLabel":"รายละเอียดข้อเสนอแนะ","doctor.msg.capture-liveness.no-records.summary":"hook ทำงานบนเครื่องนี้แล้ว (สัญญาณล่าสุดเมื่อ {hours} ชั่วโมงก่อน) แต่ไม่มี hook ใดทิ้งบันทึกผลลัพธ์ไว้เลย อาจเป็นเพราะ hook ที่ทำงานอยู่เป็นเวอร์ชันเก่าที่ยังไม่บันทึกผลลัพธ์ หรือ hook ล้มเหลวตอนโหลดจึงไม่ได้บันทึกอะไร","doctor.msg.capture-liveness.no-records.fix":"อัปเดต hook ของ MeMesh (plugin: `/plugin update memesh`; npm: `memesh install-hooks`) รีสตาร์ต agent เริ่มเซสชันหนึ่งครั้ง แล้วรัน `memesh doctor` อีกครั้ง","project.index.title":"สิ่งที่รู้อยู่แล้วที่นี่","project.index.empty":"โปรเจกต์นี้ยังไม่มีความจำที่ถูกใส่ให้อัตโนมัติ ความจำที่นำเข้ามา ความจำที่ถูกทำเครื่องหมายว่าไม่น่าเชื่อถือ และความจำที่บันทึกโดยไม่มีแท็ก `project:` จะไม่ถูกนับที่นี่ — ตัวเลขบนชิปโปรเจกต์ด้านบนอาจมากกว่า การตัดสินใจ บทเรียน รูปแบบ และข้อมูลอ้างอิงที่บันทึกด้วย `remember` จะแสดงที่นี่","project.index.more":'อีก {n} รายการ — `memesh recall --tag "project:…"`',"project.index.older":"{n} รายการที่เก่ากว่า (ไม่มีการเปลี่ยนแปลงใน {days} วัน) — ใช้ recall เพื่อดู","project.index.cost":"ดัชนีเดียวกับที่เอเจนต์ได้รับเมื่อเริ่มเซสชัน · ประมาณ {tokens} โทเค็น ({bytes} ไบต์)"}},ds={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 Te="en";function ms(){const t=localStorage.getItem("memesh-locale");if(t&&Ze[t])return t;const o=navigator.language;if(o.startsWith("zh-TW")||o.startsWith("zh-Hant"))return"zh-TW";if(o.startsWith("zh"))return"zh-CN";const s=o.split("-")[0];return Ze[s]?s:"en"}function us(){return Te=ms(),Te}function hs(t){Te=t,localStorage.setItem("memesh-locale",t)}function n(t,o){const s=Ze[Te]?.[t]||Ze.en[t]||t;return o?s.replace(/\{(\w+)\}/g,(i,a)=>{const r=o[a];return r===void 0?`{${a}}`:String(r)}):s}function oe(){return Te}function ps(){return Object.entries(ds).map(([t,o])=>({code:t,name:o}))}const At="memesh.signalMode",it="memesh:signal-mode-changed",gs=!0;function rt(){try{const t=localStorage.getItem(At);if(t==="true")return!0;if(t==="false")return!1}catch{}return gs}function fs(t){try{localStorage.setItem(At,String(t))}catch{}}function Lo(){const[t,o]=b(rt);W(()=>{function i(r){const l=r.detail;l&&typeof l.value=="boolean"?o(l.value):o(rt())}function a(r){r.key===At&&o(rt())}return window.addEventListener(it,i),window.addEventListener("storage",a),()=>{window.removeEventListener(it,i),window.removeEventListener("storage",a)}},[]);function s(i){fs(i),o(i),window.dispatchEvent(new CustomEvent(it,{detail:{value:i}}))}return[t,s]}function ys({health:t,error:o}){const[s,i]=Lo();return e("div",{class:"header",children:[e("div",{class:"header-brand",children:e("h1",{children:"MeMesh"})}),e("div",{class:"header-right",children:e("div",{class:"header-meta",children:[e("button",{type:"button",class:"signal-toggle",onClick:()=>i(!s),"aria-pressed":s,"aria-label":`${n(s?"header.signalModeOn":"header.signalModeOff")}. ${n(s?"header.signalModeOnHint":"header.signalModeOffHint")}`,title:n(s?"header.signalModeOnHint":"header.signalModeOffHint"),style:{fontSize:14,padding:"4px 10px",borderRadius:"var(--radius)",border:`1px solid ${s?"rgba(143, 242, 92, 0.4)":"var(--border)"}`,background:s?"var(--life-soft)":"transparent",color:s?"var(--life)":"var(--text-2)",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{marginRight:4},children:s?"●":"○"}),n(s?"header.signalModeOn":"header.signalModeOff")]}),t?e(q,{children:[e("span",{children:[e("span",{class:"dot dot-ok"}),n("header.connected")]}),e("span",{class:"badge-version",children:["v",t.version," · ",t.entity_count.toLocaleString(oe())," ",n(t.entity_count===1?"header.memory":"header.memories")]})]}):o?e("span",{children:[e("span",{class:"dot dot-err"}),n("header.disconnected")]}):e("span",{style:{color:"var(--text-3)"},children:n("header.connecting")})]})})]})}function vs({tabs:t,active:o,onSelect:s}){const i=X(null),a=X([]),[r,l]=b(!1),d=le(()=>{const c=i.current;c&&l(c.scrollLeft+c.clientWidth<c.scrollWidth-1)},[]);W(()=>{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 m=(c,h)=>{let u;if(c.key==="ArrowRight"||c.key==="ArrowDown")u=(h+1)%t.length;else if(c.key==="ArrowLeft"||c.key==="ArrowUp")u=(h-1+t.length)%t.length;else if(c.key==="Home")u=0;else if(c.key==="End")u=t.length-1;else return;c.preventDefault(),s(t[u].key),a.current[u]?.focus(),a.current[u]?.scrollIntoView({block:"nearest",inline:"nearest"})};return e("nav",{"aria-label":n("nav.ariaLabel"),style:{position:"relative"},children:[e("div",{ref:i,class:"nav",role:"tablist","aria-label":n("nav.ariaLabel"),children:t.map(({key:c,label:h},u)=>{const g=c===o;return e("button",{ref:f=>{a.current[u]=f},id:`tab-${c}`,role:"tab","aria-selected":g?"true":"false","aria-controls":`panel-${c}`,tabIndex:g?0:-1,class:`nav-btn ${g?"active":""}`,onClick:()=>s(c),onKeyDown:f=>m(f,u),children:h},c)})}),r&&e("div",{"aria-hidden":"true",class:"nav-overflow-fade"})]})}const bs=1e4,vt="memesh_token";function bt(){try{return localStorage.getItem(vt)}catch{return null}}function ks(t){try{t?localStorage.setItem(vt,t):localStorage.removeItem(vt)}catch{}}class Et extends Error{constructor(){super("auth_required"),this.name="AuthRequiredError"}}class Po extends Error{constructor(o){super(`HTTP ${o}`),this.name="HttpError",this.status=o}}class Xe extends Error{constructor(o){super(o),this.name="NetworkError"}}class Ro extends Error{constructor(o){super(o),this.name="RateLimitError"}}function Vt(t){if(typeof t.errorCode=="string"&&t.errorCode){const s=`httpError.${t.errorCode}`,i=n(s);if(i!==s)return new Error(i.includes("`memesh")?`${n("handoff.terminal")}: ${i}`:i)}const o=typeof t.error=="string"&&t.error?t.error:n("errors.unknown");return new Error(o.includes("`memesh")?`${n("handoff.terminal")}: ${o}`:o)}async function I(t,o,s){const i=new AbortController,a=setTimeout(()=>i.abort(),bs);try{const r={"Content-Type":"application/json"},l=bt();l&&(r.Authorization=`Bearer ${l}`);const d={method:t,headers:r,signal:i.signal};s&&(d.body=JSON.stringify(s));const m=await fetch(o,d);if(m.status===401)throw window.dispatchEvent(new Event("memesh:auth-required")),new Et;if(!m.ok){if(m.status===429)throw new Ro(n("httpError.rate.limited"));let h=null;try{h=await m.json()}catch{}throw h&&typeof h=="object"&&h.success===!1?Vt(h):new Po(m.status)}const c=await m.json();if(!c.success)throw Vt(c);return c.data}catch(r){throw r instanceof Error&&r.name==="AbortError"?new Xe(n("errors.timeout")):r instanceof TypeError?new Xe(r.message):r}finally{clearTimeout(a)}}async function xs(t){const o=await I("GET",`/v1/task-state?project=${encodeURIComponent(t)}`);if(!o||typeof o!="object"||typeof o.project!="string"||typeof o.state!="object")throw console.warn("[memesh dashboard] /v1/task-state answered with a shape this bundle cannot read:",o),new Error("unreadable task-state payload");return o}function ws(t){if(!t||typeof t!="object")return!1;const o=t;return typeof o.project=="string"&&typeof o.staleDays=="number"&&Array.isArray(o.lines)&&o.lines.every(s=>typeof s=="string")&&typeof o.shown=="number"&&typeof o.more=="number"&&typeof o.older=="number"&&typeof o.truncated=="boolean"&&typeof o.bytes=="number"&&typeof o.tokens=="number"&&Array.isArray(o.ids)&&o.ids.every(s=>typeof s=="number")}async function Ss(t){const o=await I("GET",`/v1/briefing-index?project=${encodeURIComponent(t)}`);if(!ws(o))throw console.warn("[memesh dashboard] /v1/briefing-index answered with a shape this bundle cannot read:",o),new Error("unreadable briefing-index payload");return o}async function zo(){const t=await I("GET","/v1/projects");if(!Array.isArray(t))throw console.warn("[memesh dashboard] /v1/projects answered with a shape this bundle cannot read:",t),new Error("unreadable projects payload");return t}function pe(t){return t instanceof Ro?"ratelimited":t instanceof Xe?"unreachable":"unreadable"}function Q(t){return t==="unreachable"?`${n("common.serverUnreachable")} ${n("handoff.terminal")}: ${n("common.serverUnreachableAction")}`:t==="ratelimited"?n("httpError.rate.limited"):`${n("common.responseUnreadable")} ${n("common.responseUnreadableAction")}`}function de(t){return t instanceof Xe?Q("unreachable"):t instanceof Et?n("auth.title"):t instanceof Po?n("common.serverError",{status:t.status}):t instanceof Error&&t.message?t.message:n("errors.unknown")}const Ms=/^(Steps|Commits|Branch|Diff stats|Compaction reason|Tool calls|Plan ".+" completed)[:\s]/;function Cs(t){return Ms.test(t.trim())}function Do(t){const o=/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2}):(\d{2})$/.exec(t??"");if(!o)return null;const s=Date.UTC(+o[1],+o[2]-1,+o[3],+o[4],+o[5],+o[6]);if(!Number.isFinite(s))return null;const i=new Date(s);return i.getUTCFullYear()!==+o[1]||i.getUTCMonth()!==+o[2]-1||i.getUTCDate()!==+o[3]||i.getUTCHours()!==+o[4]||i.getUTCMinutes()!==+o[5]||i.getUTCSeconds()!==+o[6]?null:s}const Re={lesson_learned:"#DBB155",commit:"#A8AFFF",session_keypoint:"#52D0B3",note:"#BCBE5E"},_s={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 kt(t){return _s[t]??"reference"}const Je={knowledge:Re.lesson_learned,activity:Re.commit,session:Re.session_keypoint,reference:Re.note};function ue(t){const o=`type.${t}`,s=n(o);return s===o?t:s}function xe(t){return new Date(Do(t)??t)}function ve(t,o=new Date){if(!t)return"—";const s=xe(t);if(Number.isNaN(s.getTime()))return"—";const i=o.getTime()-s.getTime(),a=Math.floor(i/864e5);if(a<0)return s.toLocaleDateString(oe(),{month:"short",day:"numeric"});if(a===0){const r=Math.floor(i/36e5);return r<1?n("time.justNow"):r<24?n("time.hoursAgo",{count:r}):n("time.today")}return a===1?n("time.yesterday"):a<7?n("time.daysAgo",{count:a}):a<14?n("time.lastWeek"):a<30?n("time.weeksAgo",{count:Math.floor(a/7)}):a<60?n("time.lastMonth"):a<365?n("time.monthsAgo",{count:Math.floor(a/30)}):s.toLocaleDateString(oe(),{year:"numeric",month:"short",day:"numeric"})}function No(t,o=new Date){if(!t)return"older";const s=o.getTime()-xe(t).getTime(),i=Math.floor(s/864e5);return i<1?"today":i<7?"week":i<30?"month":"older"}const $t="project:";function Qe(t){const o=t.tags?.find(s=>s.startsWith($t));return o?o.slice($t.length):null}function As(t){if(!t||t.length===0)return"";const o=t.filter(i=>i.length>30&&!Cs(i)),s=o.length>0?o:t;return s.slice(0,3).reduce((i,a)=>a.length>i.length?a:i,s[0])}function ge(t){const o=t.title?.trim();if(o)return o;const s=As(t.observations);if(s)return s;const i=t.created_at?xe(t.created_at).toLocaleDateString(oe(),{year:"numeric",month:"short",day:"numeric"}):"";return i?`${ue(t.type)} · ${i}`:ue(t.type)}function Ho(t){const o=t??0;return o===0?{count:o,label:n("memory.access.never"),tone:"none"}:o>=20?{count:o,label:n("memory.access.frequent",{count:o}),tone:"high"}:o>=5?{count:o,label:n("memory.access.recalls",{count:o}),tone:"medium"}:{count:o,label:n("memory.access.recalls",{count:o}),tone:"low"}}function Es(t){if((t.tags??[]).some(r=>r==="plan-completion"||r.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"}function Ts(t){if(!t)return null;for(const o of t){const s=/^severity:(high|medium|low)$/i.exec(o);if(s)return s[1].toLowerCase()}return null}function Kt(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 js(t){const{proposal:o,detail:s,expanded:i,inFlight:a,onToggleExpand:r,onAccept:l,onReject:d,formatRelative:m,statusBadgeStyle:c,statusLabel:h}=t,u=o.status==="pending",g=Ts(s?.proposed_digest?.tags),f=c(o.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:["#",o.id]}),e("span",{class:"tag",style:{fontSize:14,background:"var(--warning)",color:"var(--bg-0)",fontWeight:600},children:n("pattern.title")}),e("span",{style:{fontWeight:600},children:o.digest_name}),e("span",{class:"tag",style:{fontSize:14},children:o.project}),e("span",{class:"tag",style:{fontSize:14,color:"var(--text-2)"},children:n("pattern.evidenceCount",{n:String(o.source_count)})}),g&&e("span",{class:"tag",style:{fontSize:14,color:Kt(g),borderColor:Kt(g)},children:[n("pattern.severity"),": ",n(`pattern.severity.${g}`)]}),e("span",{class:"tag",style:{fontSize:14,...f},children:h(o.status)})]}),e("div",{style:{marginTop:6,color:"var(--text-2)",fontSize:14,lineHeight:1.5},children:o.digest_observations_preview!==null?e(q,{children:[o.digest_observations_preview,"…"]}):e("span",{style:{fontStyle:"italic",color:"var(--text-3)"},children:n("insights.noPreview")})}),e("div",{style:{marginTop:4,color:"var(--text-3)",fontSize:14},children:m(o.created_at)})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[e("button",{class:"btn btn-ghost",onClick:()=>r(o.id),disabled:a,"aria-expanded":i,children:n(i?"insights.collapse":"insights.viewDetail")}),u&&i&&s?.proposed_digest&&e(q,{children:[e("button",{class:"btn btn-primary",onClick:()=>l(o.id),disabled:a,children:n(a?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>d(o.id),disabled:a,style:{color:"var(--danger)"},children:n("insights.reject")})]})]})]}),s&&s.proposed_digest&&e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:14},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:14},children:n("insights.reviewSource")}),Array.isArray(s.proposed_digest.validation_warnings)&&s.proposed_digest.validation_warnings.length>0&&e("div",{style:{marginBottom:10,padding:10,borderRadius:"var(--radius-xs)",borderLeft:"3px solid var(--warning)",background:"var(--warning-soft)"},children:[e("div",{style:{fontWeight:600,color:"var(--warning)",marginBottom:6},children:["⚠ ",n("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:s.proposed_digest.validation_warnings.map((E,S)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[n("insights.validationClaim"),": "]}),e("code",{style:{fontSize:14},children:E.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[n("insights.validationReason"),": "]}),e("span",{children:E.reason})]})]},S))})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:[n("pattern.description"),":"]}),e("ol",{style:{margin:"4px 0 0 18px",padding:0},children:s.proposed_digest.observations.map((E,S)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:E},S))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[n("insights.tags"),":"]})," ",s.proposed_digest.tags.map(E=>e("span",{class:"tag",style:{marginLeft:4,fontSize:14},children:E},E))]}),Array.isArray(s.source_ids)&&e("div",{style:{color:"var(--text-3)",fontSize:14,marginTop:6},children:[n("insights.sourceIds"),": ",s.source_ids.length," (",s.source_ids.slice(0,8).join(", "),s.source_ids.length>8?"…":"",")"]})]})]})}function Ls(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;const o=t;return o.source?.host==="claude-code"&&o.source.scope==="mcp-workspace-root"&&typeof o.sessionId=="string"&&/^[a-f0-9]{64}$/.test(o.workspaceHash??"")&&o.trust==="untrusted"&&typeof o.coverage?.truncated=="boolean"&&Number.isSafeInteger(o.coverage.total_turns)&&o.coverage.total_turns>=0&&Number.isSafeInteger(o.coverage.included_turns)&&o.coverage.included_turns>=0&&o.coverage.included_turns<=o.coverage.total_turns&&Array.isArray(o.sources)&&o.sources.length===o.coverage.included_turns&&o.sources.every(s=>s&&(s.role==="user"||s.role==="assistant")&&typeof s.text=="string")}function Yt(t){return t?ve(t.includes(" ")?t.replace(" ","T")+"Z":t):""}function Zt(t){switch(t){case"pending":return{background:"var(--warning-soft)",color:"var(--warning)"};case"applied":return{background:"rgba(143,242,92,0.12)",color:"var(--life)"};case"rejected":return{background:"var(--danger-soft)",color:"var(--danger)"};default:return{background:"var(--neutral-soft)",color:"var(--text-3)"}}}function Xt(t){const o=`insights.status.${t}`,s=n(o);return s===o?t:s}function Ps({dataRevision:t=0,onStateChange:o}){const[s,i]=b([]),[a,r]=b("pending"),[l,d]=b(new Map),[m,c]=b(!1),[h,u]=b(""),[g,f]=b(!1),[E,S]=b(new Set),P=X(0),_=le(async()=>{const y=++P.current;c(!0),u(""),f(!1);try{const M=await I("GET","/v1/dream/proposals?status=all");if(y!==P.current)return;Array.isArray(M)?i(M):(console.warn("[memesh dashboard] /v1/dream/proposals answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",M),f(!0),u(Q("unreadable")))}catch(M){if(y!==P.current)return;console.warn("[memesh dashboard] /v1/dream/proposals failed to load:",M),f(!0),u(Q(pe(M)))}finally{y===P.current&&c(!1)}},[]);W(()=>{_()},[_,t]);const T=a==="all"?s:s.filter(y=>y.status===a),R=le(async y=>{if(l.has(y)){const M=new Map(l);M.delete(y),d(M);return}try{const M=await I("GET",`/v1/dream/proposals/${y}`),B=new Map(l);B.set(y,M),d(B)}catch(M){u(de(M))}},[l]),L=y=>{S(M=>{const B=new Set(M);return B.add(y),B})},A=y=>{S(M=>{const B=new Set(M);return B.delete(y),B})},p=le(async y=>{L(y);try{await I("POST",`/v1/dream/proposals/${y}/accept`),window.dispatchEvent(new Event("memesh:data-changed"))}catch(M){u(de(M))}finally{A(y)}},[]),v=le(async y=>{if(confirm(n("insights.rejectConfirm"))){L(y);try{await I("POST",`/v1/dream/proposals/${y}/reject`,{reason:"rejected via dashboard"}),window.dispatchEvent(new Event("memesh:data-changed"))}catch(M){u(de(M))}finally{A(y)}}},[]),C=s.filter(y=>y.status==="pending").length,k=s.filter(y=>y.status==="applied").length,D=s.filter(y=>y.status==="rejected").length;return W(()=>{o?.({pendingCount:C,loading:m,failed:g})},[m,o,C,g]),e("div",{id:"home-insights",tabIndex:-1,style:{display:"flex",flexDirection:"column",gap:16,scrollMarginTop:12},children:[e("div",{class:"card",style:{padding:16},children:[e("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",flexWrap:"wrap",gap:8},children:[e("h2",{style:{margin:0,fontSize:18},children:n("insights.reviewTitle")}),e("span",{style:{color:"var(--text-2)",fontSize:14},children:n("insights.reviewSubtitle")})]}),e("p",{style:{margin:"8px 0 0",color:"var(--text-2)",fontSize:14,lineHeight:1.5},children:n("insights.reviewBoundary")}),e("div",{style:{marginTop:10,display:"flex",gap:16,flexWrap:"wrap",color:"var(--text-2)",fontSize:14},children:[e("span",{children:[e("strong",{style:{color:"var(--life)",fontFamily:"var(--mono)"},children:C})," ",n("insights.statPending")]}),e("span",{children:[e("strong",{style:{fontFamily:"var(--mono)"},children:k})," ",n("insights.statApplied")]}),e("span",{children:[e("strong",{style:{fontFamily:"var(--mono)"},children:D})," ",n("insights.statRejected")]})]})]}),e("div",{style:{display:"flex",gap:8,flexWrap:"wrap"},role:"group","aria-label":n("insights.title"),children:[["pending","applied","rejected","all"].map(y=>{const M=a===y;return e("button",{class:"tag","aria-pressed":M,style:{padding:"4px 10px",borderRadius:"var(--radius-xs)",cursor:"pointer",border:"1px solid "+(M?"var(--life)":"var(--border)"),background:M?"rgba(143,242,92,0.12)":"transparent",color:M?"var(--life)":"var(--text-2)"},onClick:()=>r(y),children:n(`insights.filter.${y}`)},y)}),e("button",{class:"btn btn-ghost",onClick:_,style:{marginLeft:"auto"},children:n("insights.refresh")})]}),h&&e("div",{class:"card",role:"alert",style:{padding:12,color:"var(--danger)"},children:h}),m&&e("div",{style:{color:"var(--text-3)",fontSize:14},children:n("insights.loading")}),!m&&T.length===0&&e("div",{class:"card",style:{padding:16,textAlign:"center",color:"var(--text-2)"},children:n(a!=="pending"?"insights.emptyOther":"insights.emptyPending")}),T.map(y=>{const M=l.get(y.id),B=l.has(y.id),O=y.status==="pending",V=E.has(y.id);if(y.kind==="pattern_emergent")return e(js,{proposal:y,detail:M,expanded:B,inFlight:V,onToggleExpand:R,onAccept:p,onReject:v,formatRelative:Yt,statusBadgeStyle:Zt,statusLabel:Xt},y.id);const J=y.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:["#",y.id]}),e("span",{style:{fontWeight:600},children:y.digest_name}),e("span",{class:"tag",style:{fontSize:14},children:y.project}),e("span",{class:"tag",style:{fontSize:14},children:y.cluster_key}),y.kind==="digest"&&y.source_kind&&e("span",{class:"tag",style:{fontSize:14},children:y.source_kind==="transcript"?n("insights.source.transcript"):n("insights.source.calendar")}),y.kind==="product_improvement"&&e("code",{class:"tag",style:{fontSize:14},children:"product_improvement"}),e("span",{class:"tag",style:{fontSize:14,color:"var(--text-2)"},children:[y.source_count," ",n("insights.sources")]}),e("span",{class:"tag",style:{fontSize:14,...Zt(y.status)},children:Xt(y.status)})]}),e("div",{style:{marginTop:6,color:"var(--text-2)",fontSize:14,lineHeight:1.5},children:J!==null?e(q,{children:[J,"…"]}):e("span",{style:{fontStyle:"italic",color:"var(--text-3)"},children:n("insights.noPreview")})}),e("div",{style:{marginTop:4,color:"var(--text-3)",fontSize:14},children:Yt(y.created_at)})]}),e("div",{style:{display:"flex",gap:6,flexShrink:0,flexWrap:"wrap"},children:[e("button",{class:"btn btn-ghost",onClick:()=>R(y.id),disabled:V,"aria-expanded":B,children:n(B?"insights.collapse":"insights.viewDetail")}),O&&B&&M&&e(q,{children:[e("button",{class:"btn btn-primary",onClick:()=>p(y.id),disabled:V,children:n(V?"insights.applying":"insights.accept")}),e("button",{class:"btn btn-ghost",onClick:()=>v(y.id),disabled:V,style:{color:"var(--danger)"},children:n("insights.reject")})]})]})]}),M&&M.proposed_digest&&y.kind==="relation"&&(()=>{const x=M.proposed_digest,[N,j]=x.relation_type==="supersedes"&&x.direction==="b_supersedes_a"?[x.b?.name,x.a?.name]:[x.a?.name,x.b?.name];return e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:14},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:14},children:n("insights.reviewSource")}),e("div",{style:{marginBottom:8},children:[e("strong",{children:x.verdict}),x.severity&&e("span",{class:"tag",style:{marginLeft:8,fontSize:14},children:x.severity})]}),e("div",{style:{marginBottom:8,fontFamily:"var(--mono)",fontSize:14},children:[N," —",x.relation_type,"→ ",j]}),x.rationale&&e("div",{style:{marginBottom:8,lineHeight:1.5},children:x.rationale}),x.recommended_action&&e("div",{style:{marginBottom:8,color:"var(--text-2)",lineHeight:1.5},children:["→ ",x.recommended_action]}),(x.excerpts?.a||x.excerpts?.b)&&e("div",{style:{marginBottom:4,color:"var(--text-2)",fontSize:14},children:[e("div",{children:[e("code",{children:"A"})," ",x.a?.name,": “",x.excerpts?.a,"”"]}),e("div",{children:[e("code",{children:"B"})," ",x.b?.name,": “",x.excerpts?.b,"”"]})]})]})})(),M&&M.proposed_digest&&y.kind==="guard"&&(()=>{const x=M.proposed_digest;return e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:14},children:[e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:14},children:n("insights.reviewSource")}),e("div",{style:{marginBottom:8},children:[e("span",{class:"tag",style:{fontSize:14},children:x.guard?.tool}),e("span",{style:{marginLeft:8,color:"var(--text-3)",fontSize:14},children:[n("guard.sourceLesson"),":"]})," ",e("span",{style:{fontSize:14},children:x.source_lesson?.title||x.source_lesson?.name})]}),e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:14,color:"var(--text-3)",marginBottom:2},children:n("guard.pattern")}),e("code",{style:{fontFamily:"var(--mono)",fontSize:14,wordBreak:"break-all"},children:x.guard?.pattern})]}),e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:14,color:"var(--text-3)",marginBottom:2},children:n("guard.message")}),e("div",{style:{lineHeight:1.5},children:x.guard?.message})]}),x.guard?.should_match?.length||x.guard?.should_not_match?.length?e("div",{style:{fontSize:14,color:"var(--text-2)"},children:[x.guard?.should_match?.length?e("div",{style:{marginBottom:4},children:[e("span",{style:{color:"var(--text-3)",fontSize:14},children:[n("guard.shouldMatch"),":"]})," ",x.guard.should_match.map((N,j)=>e("code",{style:{fontFamily:"var(--mono)",fontSize:14,marginRight:8},children:N},j))]}):null,x.guard?.should_not_match?.length?e("div",{children:[e("span",{style:{color:"var(--text-3)",fontSize:14},children:[n("guard.shouldNotMatch"),":"]})," ",x.guard.should_not_match.map((N,j)=>e("code",{style:{fontFamily:"var(--mono)",fontSize:14,marginRight:8},children:N},j))]}):null]}):null]})})(),M&&M.proposed_digest&&y.kind!=="relation"&&y.kind!=="guard"&&e("div",{style:{marginTop:12,padding:12,background:"var(--bg-1)",borderRadius:"var(--radius-xs)",fontSize:14},children:[y.kind==="product_improvement"?e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:14},children:e("code",{children:"product_improvement"})}):e("div",{style:{marginBottom:8,color:"var(--text-3)",fontSize:14},children:M.source_kind==="transcript"?n("insights.source.transcript"):n("insights.source.calendar")}),Array.isArray(M.proposed_digest.validation_warnings)&&M.proposed_digest.validation_warnings.length>0&&e("div",{style:{marginBottom:10,padding:10,borderRadius:"var(--radius-xs)",borderLeft:"3px solid var(--warning)",background:"var(--warning-soft)"},children:[e("div",{style:{fontWeight:600,color:"var(--warning)",marginBottom:6},children:["⚠ ",n("insights.validationWarnings")]}),e("ul",{style:{margin:0,paddingLeft:18},children:M.proposed_digest.validation_warnings.map((x,N)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[n("insights.validationClaim"),": "]}),e("code",{style:{fontSize:14},children:x.claim})]}),e("div",{children:[e("span",{style:{color:"var(--text-3)"},children:[n("insights.validationReason"),": "]}),e("span",{children:x.reason})]})]},N))})]}),e("div",{style:{marginBottom:8},children:[e("strong",{children:[n("insights.observations"),":"]}),e("ol",{style:{margin:"4px 0 0 18px",padding:0},children:M.proposed_digest.observations.map((x,N)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:x},N))})]}),e("div",{style:{marginBottom:4},children:[e("strong",{children:[n("insights.tags"),":"]})," ",M.proposed_digest.tags.map(x=>e("span",{class:"tag",style:{marginLeft:4,fontSize:14},children:x},x))]}),Array.isArray(M.source_ids)&&e("div",{style:{color:"var(--text-3)",fontSize:14,marginTop:6},children:[n("insights.sourceIds"),": ",n("insights.entitiesCount",{n:M.source_ids.length})," (",M.source_ids.slice(0,8).join(", "),M.source_ids.length>8?"…":"",")"]}),Ls(M.source_ids)&&e("div",{"data-testid":"transcript-source-evidence",style:{marginTop:12,padding:10,background:"var(--bg-2)",borderRadius:"var(--radius)"},children:[e("div",{style:{color:"var(--text-2)",fontSize:14,marginBottom:6},children:[e("strong",{children:n("insights.source.transcript")})," ",e("code",{children:M.source_ids.source.host})," · ",e("code",{children:M.source_ids.sessionId})," ·"," ",M.source_ids.coverage.included_turns,"/",M.source_ids.coverage.total_turns," ",n("insights.sources"),M.source_ids.coverage.truncated?"…":""]}),e("ol",{style:{margin:"0 0 0 18px",padding:0},children:M.source_ids.sources.map((x,N)=>e("li",{style:{marginBottom:6,lineHeight:1.5},children:[e("code",{style:{fontSize:14},children:x.role})," ",x.text]},N))})]})]})]},y.id)})]})}function Jt(t){return t>=80?"var(--success)":t>=60?"var(--life)":t>=40?"var(--warning)":"var(--danger)"}function Rs(t){return t>=80?n("health.excellent"):t>=60?n("health.good"):t>=40?n("health.fair"):n("health.poor")}const zs=["activity","quality","freshness","lessons"];function Ds({score:t,factors:o}){const s=Jt(t);return e("div",{class:"card",children:[e("div",{class:"card-title",children:n("health.title")}),e("div",{style:{display:"flex",gap:"24px",alignItems:"center"},children:[e("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",flexShrink:0},children:[e("div",{style:{width:"80px",height:"80px",borderRadius:"50%",border:`3px solid ${s}`,display:"flex",alignItems:"center",justifyContent:"center"},children:e("span",{style:{fontFamily:"var(--mono)",fontSize:"24px",fontWeight:700,color:s,letterSpacing:"-0.02em"},children:t})}),e("span",{style:{marginTop:"6px",fontSize:14,fontWeight:500,color:"var(--text-2)"},children:Rs(t)})]}),e("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:"10px"},children:zs.map(i=>{const a=o[i],r=Math.round(a.score/a.weight*100),l=Jt(r);return e("div",{children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"4px"},children:[e("span",{style:{fontSize:14,color:"var(--text-2)"},children:n(`health.${i}`)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:14,color:"var(--text-3)"},children:[r,"%"]})]}),e("div",{style:{height:"4px",borderRadius:"2px",background:"var(--bg-0)",overflow:"hidden"},children:e("div",{style:{height:"100%",width:`${r}%`,borderRadius:"2px",background:l,transition:"width 600ms ease-out"}})})]},i)})})]})]})}const ye=220,ne=36,ae=2;function Ns({trend:t}){if(!t||t.length===0)return e("svg",{width:ye,height:ne,style:{display:"block"},children:e("line",{x1:0,y1:ne/2,x2:ye,y2:ne/2,stroke:"rgba(255,255,255,0.06)",strokeWidth:1})});if(t.length===1){const l=ye/2,d=ne/2;return e("svg",{width:ye,height:ne,style:{display:"block"},children:[e("line",{x1:ae,y1:ne-ae,x2:ye-ae,y2:ne-ae,stroke:"rgba(255,255,255,0.06)",strokeWidth:1}),e("circle",{cx:l,cy:d,r:3,fill:"var(--life)"})]})}const o=Math.max(1,...t.map(l=>l.count)),s=(ye-ae*2)/(t.length-1),i=t.map((l,d)=>{const m=ae+d*s,c=ne-ae-l.count/o*(ne-ae*2);return`${m.toFixed(1)},${c.toFixed(1)}`}),a=`M${i[0]} L${i.slice(1).join(" L")}`,r=`${a} L${ae+(t.length-1)*s},${ne-ae} L${ae},${ne-ae} Z`;return e("svg",{width:ye,height:ne,style:{display:"block"},children:[e("path",{d:r,fill:"rgba(143, 242, 92, 0.12)"}),e("path",{d:a,fill:"none",stroke:"var(--life)",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"}),t.map((l,d)=>{const[m,c]=i[d].split(",");return d===t.length-1?e("circle",{cx:m,cy:c,r:2.5,fill:"var(--life)"},d):null})]})}function Hs({metric:t}){const{reusedThisWeek:o,trend:s,computedFrom:i}=t,a=i==="last_accessed_at_approximation",r=s.slice(0,Math.max(0,s.length-7)).slice(-7).reduce((m,c)=>m+c.count,0),l=s.slice(-7).reduce((m,c)=>m+c.count,0),d=r>0?Math.round((l-r)/r*100):null;return e("div",{class:"card",style:{display:"flex",gap:24,alignItems:"center",flexWrap:"wrap",padding:"20px 24px",background:"var(--life-soft)",border:"1px solid rgba(143, 242, 92, 0.18)"},children:[e("div",{style:{flex:"1 1 200px",minWidth:200},children:[e("div",{style:{fontSize:14,textTransform:"uppercase",letterSpacing:"0.08em",color:"var(--text-2)",fontWeight:600,marginBottom:6},children:n("loop.label")}),e("div",{style:{display:"flex",alignItems:"baseline",gap:12},children:[e("div",{style:{fontSize:84,fontWeight:700,lineHeight:1,color:o>0?"var(--life)":"var(--text-2)",fontFamily:"var(--font-ui)",letterSpacing:"-0.03em"},children:o>0?o.toLocaleString(oe()):"—"}),d!==null&&d!==0&&e("span",{style:{fontSize:14,fontWeight:600,fontFamily:"var(--mono)",color:d>0?"var(--success)":"var(--danger)"},children:[d>0?"↑":"↓"," ",Math.abs(d),"%"]})]}),e("div",{style:{fontSize:14,color:"var(--text-1)",marginTop:4},children:o>0?n("loop.subtitleHas"):n("loop.subtitleNone")}),a&&e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:6,fontStyle:"italic"},children:n("loop.approxNote")})]}),e("div",{style:{flex:"0 0 auto",display:"flex",flexDirection:"column",alignItems:"flex-end",gap:4},children:[e(Ns,{trend:s}),e("div",{style:{fontSize:14,color:"var(--text-3)",fontFamily:"var(--mono)"},children:n("loop.sparkLabel")})]})]})}function qs(t,o){const s=getComputedStyle(t),i={};for(const a of o)i[a]=s.getPropertyValue(a).trim();return i}const ze=8,Bs=24,Is=28,De=24,qo=120,Us=14,Os=8,Bo="rgba(143, 242, 92, 0.3)",Fs=1.5;function Qt(t,o){t.style.width="";const s=window.devicePixelRatio||1,a=t.getBoundingClientRect().width,r=qo,l=a-De-Bs,d=r-ze-Is;if(o.length===0||l<=0||d<=0)return;t.width=a*s,t.height=r*s,t.style.width=`${a}px`,t.style.height=`${r}px`;const m=t.getContext("2d");if(!m)return;m.scale(s,s);const c=qs(t,["--life","--text-3","--font-ui"]),h=c["--life"],u=c["--text-3"],g=`${Us}px ${c["--font-ui"]}`,f=Math.max(1,...o.map(L=>L.created)),E=Math.max(1,...o.map(L=>L.recalled)),S=Math.max(f,E),P=o.length,_=1,T=Math.max(1,(l-_*(P-1))/P);m.fillStyle=Bo;for(let L=0;L<P;L++){const p=o[L].created/S*d,v=De+L*(T+_),C=ze+d-p;m.fillRect(v,C,T,p)}m.beginPath(),m.strokeStyle=h,m.lineWidth=Fs,m.lineJoin="round",m.lineCap="round";for(let L=0;L<P;L++){const A=o[L],p=De+L*(T+_)+T/2,v=ze+d-A.recalled/S*d;L===0?m.moveTo(p,v):m.lineTo(p,v)}m.stroke(),m.fillStyle=u,m.font=g,m.textAlign="center",m.textBaseline="top";const R=Math.max(7,Math.ceil((m.measureText("00-00").width+Os)/(T+_)));for(let L=0;L<P;L+=R){const A=o[L],p=A.date.split("-"),v=p.length>=3?`${p[1]}-${p[2]}`:A.date,C=De+L*(T+_)+T/2,k=ze+d+4;m.fillText(v,C,k)}}function Gs({data:t}){const o=X(null);W(()=>{const a=o.current;if(!a)return;Qt(a,t);const r=new ResizeObserver(()=>Qt(a,t));return r.observe(a),()=>r.disconnect()},[t]);const s=t.reduce((a,r)=>a+r.created,0),i=t.reduce((a,r)=>a+r.recalled,0);return e("div",{class:"card",children:[e("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:14},children:[e("div",{class:"card-title",style:{marginBottom:0},children:n("timeline.title")}),e("div",{style:{display:"flex",alignItems:"center",gap:12,fontSize:14,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:Bo}}),n("timeline.created"),e("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:s})]}),e("span",{style:{display:"flex",alignItems:"center",gap:4},children:[e("span",{style:{display:"inline-block",width:10,height:2,borderRadius:"var(--radius-hairline)",background:"var(--life)"}}),n("timeline.recalled"),e("span",{style:{fontFamily:"var(--mono)",color:"var(--text-3)",marginLeft:2},children:i})]})]})]}),e("canvas",{ref:o,style:{width:"100%",height:`${qo}px`,display:"block"}})]})}const ct=["week","month","quarter","older"];function Ws(t){return n(`ageMatrix.bucket.${t}`)}const Vs=["lesson_learned","lesson","mistake","decision","architecture_decision","pattern","technical_pattern","best_practice","bug_fix","workflow_checkpoint","process","architecture","feature"];function $s(t,o){return t===0||o===0?"rgba(255,255,255,0.03)":`rgba(143, 242, 92, ${(.05+Math.min(t/o,1)*.15).toFixed(2)})`}function Ks({data:t}){if(!t||t.length===0)return null;const o=new Map;for(const a of t)o.has(a.type)||o.set(a.type,new Map),o.get(a.type).set(a.bucket,a.count);const s=Vs.filter(a=>o.has(a)),i=Math.max(1,...t.map(a=>a.count));return e("div",{class:"card",children:[e("div",{class:"card-title",style:{marginBottom:16},children:n("ageMatrix.title")}),e("div",{style:{overflowX:"auto"},children:e("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:14,tableLayout:"fixed"},children:[e("colgroup",{children:[e("col",{style:{width:"28%"}}),ct.map(a=>e("col",{style:{width:"18%"}},a))]}),e("thead",{children:e("tr",{children:[e("th",{style:{textAlign:"left",padding:"4px 8px",color:"var(--text-2)",fontWeight:400},children:n("ageMatrix.typeColumn")}),ct.map(a=>e("th",{style:{textAlign:"center",padding:"4px 6px",color:"var(--text-2)",fontWeight:400},children:Ws(a)},a))]})}),e("tbody",{children:s.map(a=>{const r=o.get(a),l=Array.from(r.values()).reduce((d,m)=>d+m,0);return e("tr",{children:[e("td",{style:{padding:"5px 8px",color:"var(--text-1)",fontSize:14,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:[ue(a),e("span",{style:{color:"var(--text-3)",marginLeft:4},children:["(",l,")"]})]}),ct.map(d=>{const m=r.get(d)??0;return e("td",{style:{textAlign:"center",padding:"5px 6px",background:$s(m,i),borderRadius:"var(--radius-xs)",color:m>0?"var(--text-1)":"var(--text-3)",fontFamily:"var(--mono)",fontWeight:m>0?600:400,fontSize:14,transition:"background 0.2s"},children:m>0?m:"·"},d)})]},a)})})]})}),e("div",{style:{marginTop:10,fontSize:14,color:"var(--text-3)",display:"flex",alignItems:"center",gap:6},children:[e("span",{children:n("ageMatrix.low")}),[.05,.1,.15,.2].map(a=>e("span",{style:{display:"inline-block",width:14,height:10,borderRadius:"var(--radius-hairline)",background:`rgba(143,242,92,${a})`}},a)),e("span",{children:n("ageMatrix.high")}),e("span",{style:{marginLeft:8},children:["— ",n("ageMatrix.legend")]})]})]})}function eo(t){return n(`radar.axis.${t}`)}const be=220,Io=be/2,Uo=be/2,Ne=80,He=14,Ys=14,lt=72;function qe(t,o){const s=(t-90)*(Math.PI/180);return[Io+o*Math.cos(s),Uo+o*Math.sin(s)]}function Zs({data:t}){if(!t||t.length===0)return null;const o=t.length,s=Math.max(1,...t.map(d=>d.count)),i=t.map((d,m)=>360/o*m),a=t.map((d,m)=>{const c=d.count/s,h=He+c*(Ne-He);return qe(i[m],h)}),r=a.map((d,m)=>`${m===0?"M":"L"}${d[0].toFixed(1)},${d[1].toFixed(1)}`).join(" ")+" Z",l=[.25,.5,.75,1];return e("div",{class:"card",children:[e("div",{class:"card-title",style:{marginBottom:8},children:n("radar.title")}),e("div",{style:{display:"flex",alignItems:"center",gap:16,flexWrap:"wrap"},children:[e("div",{style:{maxWidth:"100%",minWidth:0,overflowX:"auto"},children:e("svg",{width:be+lt*2,height:be,viewBox:`${-lt} 0 ${be+lt*2} ${be}`,style:{display:"block"},children:[l.map(d=>{const m=i.map(c=>{const h=He+d*(Ne-He),[u,g]=qe(c,h);return`${u.toFixed(1)},${g.toFixed(1)}`});return e("polygon",{points:m.join(" "),fill:"none",stroke:"rgba(255,255,255,0.06)",strokeWidth:1},d)}),i.map((d,m)=>{const[c,h]=qe(d,Ne);return e("line",{x1:Io,y1:Uo,x2:c.toFixed(1),y2:h.toFixed(1),stroke:"rgba(255,255,255,0.06)",strokeWidth:1},m)}),e("path",{d:r,fill:"rgba(143,242,92,0.15)",stroke:"var(--life)",strokeWidth:1.5,strokeLinejoin:"round"}),a.map(([d,m],c)=>e("circle",{cx:d.toFixed(1),cy:m.toFixed(1),r:3,fill:"var(--life)"},c)),t.map((d,m)=>{const c=i[m],[h,u]=qe(c,Ne+18),g=eo(d.axis);return e("text",{x:h.toFixed(1),y:u.toFixed(1),"text-anchor":"middle","dominant-baseline":"middle","font-size":Ys,fill:"var(--text-2)","font-family":"var(--font-ui)",children:g},m)})]})}),e("div",{style:{flex:1,minWidth:120},children:[t.map(d=>{const m=s>0?d.count/s:0;return e("div",{style:{marginBottom:8},children:[e("div",{style:{display:"flex",justifyContent:"space-between",fontSize:14,marginBottom:3},children:[e("span",{style:{color:"var(--text-1)"},children:eo(d.axis)}),e("span",{style:{color:"var(--life)",fontFamily:"var(--mono)",fontSize:14},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:`${(m*100).toFixed(1)}%`,height:"100%",background:"var(--life)",borderRadius:"var(--radius-hairline)",transition:"width 0.3s"}})})]},d.axis)}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:6},children:n("radar.caption")})]})]})]})}function Xs({data:t}){const{workSchedule:o,focusAreas:s,workflow:i,strengths:a,learningAreas:r}=t,l=new Map;for(const h of o.hourDistribution)l.set(h.hour,h.count);const d=Math.max(1,...o.hourDistribution.map(h=>h.count)),m=[...o.hourDistribution].sort((h,u)=>u.count-h.count).slice(0,3).map(h=>`${h.hour.toString().padStart(2,"0")}:00`),c=[...o.dayDistribution].sort((h,u)=>u.count-h.count).slice(0,2).map(h=>n(`patterns.day.${h.dayNum}`));return e("div",{class:"card",children:[e("div",{class:"card-title",children:n("patterns.title")}),e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:n("patterns.workSchedule")}),e("div",{style:{display:"flex",gap:2,flexWrap:"wrap"},children:Array.from({length:24},(h,u)=>{const g=l.get(u)||0,f=g/d;return e("div",{title:`${u.toString().padStart(2,"0")}:00 — ${g}`,style:{width:28,height:28,borderRadius:"var(--radius-xs)",background:f>0?`rgba(143, 242, 92, ${.05+f*.15})`:"var(--bg-0)",border:"1px solid var(--border-subtle)",fontSize:14,display:"flex",alignItems:"center",justifyContent:"center",color:"var(--text-1)",fontFamily:"var(--mono)"},children:u},u)})}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:6,fontFamily:"var(--mono)"},children:[n("patterns.peakHours"),": ",m.join(", "),c.length>0&&e("span",{children:[" · ",n("patterns.busiestDays"),": ",c.join(", ")]})]})]}),e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:n("patterns.workflow")}),e("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:8},children:e("div",{class:"stat",style:{padding:12},children:[e("div",{class:"stat-val",style:{fontSize:18},children:i.totalSessions>0?i.commitsPerSession.toFixed(1):"—"}),e("div",{class:"stat-lbl",children:n("patterns.commitsPerSession")})]})})]}),s.length>0&&e("div",{style:{marginBottom:16},children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:n("patterns.focus")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:s.slice(0,12).map(h=>e("span",{class:"tag",style:{fontSize:14,padding:"2px 8px"},children:[ue(h.type)," ",e("span",{children:["(",h.count,")"]})]},h.type))})]}),(a.length>0||r.length>0)&&e("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12},children:[e("div",{children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:n("patterns.strengths")}),a.slice(0,5).map(h=>e("div",{style:{marginBottom:6},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:3},children:[e("span",{style:{fontSize:14,color:"var(--text-1)"},children:ue(h.type)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:14,color:"var(--life)"},children:[Math.round(h.avgConfidence*100),"%"]})]}),e("div",{style:{height:3,borderRadius:"var(--radius-hairline)",background:"var(--bg-0)"},children:e("div",{style:{height:"100%",width:`${Math.round(h.avgConfidence*100)}%`,borderRadius:"var(--radius-hairline)",background:"rgba(143, 242, 92, 0.5)",transition:"width 600ms ease-out"}})})]},h.type)),a.length===0&&e("div",{style:{fontSize:14,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]}),e("div",{children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-3)",textTransform:"uppercase",letterSpacing:".06em",marginBottom:8},children:n("patterns.learning")}),r.slice(0,5).map(h=>e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:6,fontSize:14},children:[e("span",{style:{color:"var(--text-1)"},children:h.tag}),e("span",{style:{fontFamily:"var(--mono)",fontSize:14,color:"var(--text-3)"},children:h.count})]},h.tag)),r.length===0&&e("div",{style:{fontSize:14,color:"var(--text-3)",fontStyle:"italic"},children:"—"})]})]})]})}function to(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 Js({dataRevision:t=0}){const[o,s]=b(null),[i,a]=b(null),[r,l]=b(!0);if(W(()=>{let c=!1;return l(!0),a(null),I("GET","/v1/analytics/pm").then(h=>{if(!c){if(!to(h)){h!==null&&console.warn("[PmAnalyticsPanel] /v1/analytics/pm answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",h),a("unreadable");return}s(h)}}).catch(h=>{c||a(pe(h))}).finally(()=>{c||l(!1)}),()=>{c=!0}},[t]),r&&!o)return e("div",{class:"empty",children:e("div",{class:"loading"})});if(i&&!o)return e("div",{class:"error-box",role:"alert",children:Q(i)});if(!to(o))return e("div",{class:"error-box",role:"alert",children:Q("unreadable")});const d=(o.connectedness.orphanRate*100).toFixed(1),m=o.connectedness.orphanRate>.7?"var(--danger)":o.connectedness.orphanRate>.4?"var(--warning)":"var(--success)";return e("div",{children:[r&&e("div",{class:"loading",role:"status"}),i&&e("div",{class:"error-box",role:"alert",children:Q(i)}),e("div",{class:"card",style:{marginTop:8,padding:16},children:[e("div",{class:"card-title",style:{marginBottom:12},children:n("pm.title")}),e("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, 1fr)",gap:12},children:[e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)"},children:o.velocity.decisionsPerWeek.toFixed(1)}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:2},children:n("pm.decisionsPerWeek")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)"},children:o.staleness.openDecisionCount}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:2},children:n("pm.openDecisions")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)",color:m},children:[d,"%"]}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:2},children:n("pm.orphanRate")})]}),e("div",{style:{textAlign:"center"},children:[e("div",{style:{fontSize:22,fontWeight:700,fontFamily:"var(--mono)"},children:o.connectedness.totalRelations}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:2},children:n("pm.relationsTotal")})]})]}),o.staleness.stalePlanCount>0&&e("div",{style:{marginTop:10,fontSize:14,color:"var(--warning)"},children:n("pm.stalePlans",{count:o.staleness.stalePlanCount})})]})]})}const Qs=["activity","quality","freshness","lessons"];function en(t){return typeof t?.totalEntities=="number"&&typeof t.totalObservations=="number"&&typeof t.totalRelations=="number"&&typeof t.totalTags=="number"&&Array.isArray(t.tagDistribution)}function dt(t,o,s){return!s&&o!==null&&console.warn(`[memesh dashboard] ${t} answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:`,o),s}function tn(t){if(typeof t?.healthScore!="number")return!1;const o=t.healthFactors;if(!o)return!1;for(const s of Qs)if(typeof o[s]?.score!="number"||typeof o[s]?.weight!="number")return!1;return Array.isArray(t.loopMetric?.trend)&&Array.isArray(t.timeline)}function on(t){return Array.isArray(t?.workSchedule?.hourDistribution)&&Array.isArray(t.workSchedule?.dayDistribution)&&Array.isArray(t.focusAreas)&&Array.isArray(t.strengths)&&Array.isArray(t.learningAreas)&&typeof t.workflow?.totalSessions=="number"&&typeof t.workflow?.commitsPerSession=="number"}function sn({dataRevision:t=0}){const[o,s]=b(null),[i,a]=b(null),[r,l]=b(null),[d,m]=b(!0),[c,h]=b(null),u=X(0),g=le(()=>{const f=++u.current;m(!0),h(null);let E=!1,S=!1;const P=_=>T=>(console.warn(`[memesh dashboard] ${_} failed to load:`,T),pe(T)==="unreachable"?E=!0:S=!0,null);Promise.all([I("GET","/v1/stats").catch(P("/v1/stats")),I("GET","/v1/analytics").catch(P("/v1/analytics")),I("GET","/v1/patterns").catch(P("/v1/patterns"))]).then(([_,T,R])=>{if(f!==u.current)return;const L=dt("/v1/stats",_,en(_)),A=dt("/v1/analytics",T,tn(T)),p=dt("/v1/patterns",R,on(R));(_!==null&&!L||T!==null&&!A||R!==null&&!p)&&(S=!0),L&&s(_),A&&a(T),p&&l(R),h(E?"unreachable":S?"unreadable":null)}).finally(()=>{f===u.current&&m(!1)})},[]);return W(()=>{g()},[g,t]),d&&!o&&!i?e("div",{class:"empty",children:e("div",{class:"loading"})}):!o&&!i?e("div",{class:"error-box",role:"alert",children:c?Q(c):`${n("common.error")}: ${n("analytics.loadFailed")}`}):e("div",{children:[d&&e("div",{class:"loading",role:"status"}),c&&e("div",{class:"error-box",role:"alert",children:Q(c)}),o&&e("div",{class:"stats-row",children:[e("div",{class:"stat",children:[e("div",{class:"stat-val",children:o.totalEntities.toLocaleString(oe())}),e("div",{class:"stat-lbl",children:n("analytics.totalMemories")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:o.totalObservations.toLocaleString(oe())}),e("div",{class:"stat-lbl",children:n("analytics.knowledgeFacts")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:o.totalRelations.toLocaleString(oe())}),e("div",{class:"stat-lbl",children:n("analytics.connections")})]}),e("div",{class:"stat",children:[e("div",{class:"stat-val",children:o.totalTags.toLocaleString(oe())}),e("div",{class:"stat-lbl",children:n("analytics.topics")})]})]}),i&&e("div",{style:{marginTop:8},children:e(Hs,{metric:i.loopMetric})}),i&&e("div",{style:{marginTop:8},children:e(Ds,{score:i.healthScore,factors:i.healthFactors})}),i&&e("div",{style:{marginTop:8},children:e(Gs,{data:i.timeline})}),i&&e("div",{style:{marginTop:8,display:"grid",gridTemplateColumns:"minmax(0, 1.4fr) minmax(0, 1fr)",gap:8},children:[e(Ks,{data:Array.isArray(i.ageMatrix)?i.ageMatrix:[]}),e(Zs,{data:Array.isArray(i.knowledgeRadar)?i.knowledgeRadar:[]})]}),r&&e("div",{style:{marginTop:8},children:e(Xs,{data:r})}),e(Js,{dataRevision:t}),o&&(()=>{const f=["auto_saved","auto-tracked","session_end","session:","source:","scope:","date:","urgency:"],E=o.tagDistribution.filter(S=>!f.some(P=>S.tag.startsWith(P))&&!/^\d{4}-\d{2}-\d{2}/.test(S.tag));return E.length>0?e("div",{class:"card",style:{marginTop:8},children:[e("div",{class:"card-title",children:n("analytics.topics")}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:E.slice(0,30).map(S=>e("span",{class:"tag",style:{fontSize:14},children:[S.tag," ",e("span",{children:["(",S.count,")"]})]},S.tag))})]}):null})()]})}function nn(t){return t==="warning"?"var(--warning)":t==="muted"?"var(--text-2)":"var(--life)"}function an(t){if(!t||typeof t!="object"||typeof t.healthScore!="number")return!1;const o=t.criticalLessons;if(!o||typeof o.critical!="number"||typeof o.severityTagged!="number"||typeof o.total!="number")return!1;const s=t.citationCompliance;return!(s!=null&&(typeof s.cited!="number"||typeof s.total!="number")||!t.loopMetric||typeof t.loopMetric.reusedThisWeek!="number")}function rn(t,o){const s=c=>c.toLocaleString(o),i={key:"health",label:n("metrics.health"),value:`${t.healthScore}`,note:n("metrics.healthNote"),tone:t.healthScore>=60?"life":t.healthScore>=40?"warning":"muted"},a=t.criticalLessons,r=a.severityTagged===0?{key:"critical",label:n("metrics.critical"),value:null,note:a.total===0?n("metrics.criticalNoLessons"):n("metrics.criticalUnclassified",{total:s(a.total)}),tone:"muted"}:{key:"critical",label:n("metrics.critical"),value:s(a.critical),note:a.severityTagged<a.total?n("metrics.criticalPartial",{tagged:s(a.severityTagged),total:s(a.total)}):n("metrics.criticalAll",{total:s(a.total)}),tone:a.critical>0?"warning":"life"},l=t.citationCompliance,d=l===null?{key:"citation",label:n("metrics.citation"),value:null,note:n("metrics.citationNotMeasured"),tone:"muted"}:{key:"citation",label:n("metrics.citation"),value:`${Math.round(l.cited/l.total*100)}%`,note:n("metrics.citationNote",{cited:s(l.cited),total:s(l.total)})},m={key:"loop",label:n("metrics.reused"),value:s(t.loopMetric.reusedThisWeek),note:n("metrics.reusedNote")};return[i,r,d,m]}function cn({dataRevision:t=0}){const[o,s]=b(null),[i,a]=b(!0),[r,l]=b(null);if(W(()=>{let m=!1;return a(!0),l(null),I("GET","/v1/analytics").then(c=>{if(!m){if(!an(c)){console.warn("[memesh dashboard] /v1/analytics answered without the groups this row reads — stale server or version skew:",c),l("unreadable");return}s(c),l(null)}}).catch(c=>{m||(console.warn("[memesh dashboard] /v1/analytics failed to load for the metrics row:",c),l(pe(c)))}).finally(()=>{m||a(!1)}),()=>{m=!0}},[t]),i&&!o)return e("div",{class:"stats-row","aria-busy":"true",children:e("div",{class:"stat",children:e("div",{class:"loading"})})});if(r&&!o)return e("div",{role:"alert",class:"card",style:{marginBottom:8,fontSize:14,color:"var(--text-2)"},children:Q(r)});if(!o)return null;const d=rn(o,oe());return e("div",{children:[r&&e("div",{role:"alert",class:"card",style:{marginBottom:8},children:Q(r)}),e("div",{class:"stats-row","aria-busy":i,children:d.map(m=>e("div",{class:"stat",children:[e("div",{class:"stat-val",style:{color:nn(m.tone),fontSize:m.value===null?16:void 0},children:m.value??n("metrics.notMeasured")}),e("div",{class:"stat-lbl",children:m.label}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:2},children:m.note})]},m.key))})]})}function ln(t,o){return t===0?"empty":o.failed?"unavailable":o.loading||t===null?"loading":o.pendingCount>0?"insights":"healthy"}function dn({kind:t,onNavigate:o,onReviewInsights:s}){const i=t==="empty"?()=>o("Memories"):t==="insights"?s:t==="unavailable"?()=>window.location.reload():null;return e("section",{class:"card","aria-labelledby":"home-next-action-title",style:{padding:16,marginBottom:12},children:[e("div",{style:{color:"var(--text-3)",fontSize:14,fontWeight:700,letterSpacing:".08em",textTransform:"uppercase"},children:n("home.nextAction.eyebrow")}),e("h2",{id:"home-next-action-title",style:{margin:"5px 0 6px",fontSize:18},children:n(`home.nextAction.${t}.title`)}),e("p",{style:{margin:"0 0 4px",color:"var(--text-1)",lineHeight:1.5},children:[e("strong",{children:n("home.nextAction.why")})," ",n(`home.nextAction.${t}.why`)]}),e("p",{style:{margin:0,color:"var(--text-2)",lineHeight:1.5},children:[e("strong",{children:n("home.nextAction.result")})," ",n(`home.nextAction.${t}.result`)]}),i&&e("button",{class:"btn btn-primary",style:{marginTop:12},onClick:i,children:n(`home.nextAction.${t}.action`)})]})}function mn({health:t=null,dataRevision:o=0,onNavigate:s=()=>{}}){const[i,a]=b(!1),[r,l]=b(!1),[d,m]=b({pendingCount:0,loading:!0,failed:!1}),c=le(f=>m(f),[]),h=le(()=>{const f=document.getElementById("home-insights");f?.scrollIntoView({behavior:"smooth",block:"start"}),f?.focus({preventScroll:!0})},[]),u=ln(t?.entity_count??null,d);function g(){const f=!i;a(f),f&&l(!0)}return e("div",{children:[e(dn,{kind:u,onNavigate:s,onReviewInsights:h}),e(cn,{dataRevision:o}),e(Ps,{dataRevision:o,onStateChange:c}),e("div",{class:"card",style:{marginTop:8},children:[e("button",{onClick:g,"aria-expanded":i,"aria-controls":"home-analytics",style:{display:"flex",alignItems:"center",gap:8,width:"100%",background:"none",border:"none",cursor:"pointer",padding:0,color:"var(--text-0)",font:"600 14px var(--font-ui)",textAlign:"left"},children:[e("svg",{width:"12",height:"12",viewBox:"0 0 16 16","aria-hidden":"true",style:{transform:i?"rotate(90deg)":"none",transition:"transform 150ms",color:"var(--text-2)",flexShrink:0},children:e("path",{d:"M6 4 L10 8 L6 12",stroke:"currentColor",strokeWidth:"1.5",fill:"none",strokeLinecap:"round",strokeLinejoin:"round"})}),n("home.analyticsTitle"),!i&&e("span",{style:{fontWeight:400,fontSize:14,color:"var(--text-3)"},children:n("home.analyticsHint")})]}),e("div",{id:"home-analytics",hidden:!i,style:{marginTop:i?14:0},children:r&&e(sn,{dataRevision:o})})]})]})}const $=1.5;function un(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 hn={lesson:e(q,{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:$,strokeLinejoin:"round"}),e("path",{d:"M7 13 h2",stroke:"currentColor",strokeWidth:$,strokeLinecap:"round"}),e("path",{d:"M7 14.5 h2",stroke:"currentColor",strokeWidth:$,strokeLinecap:"round"})]}),decision:e(q,{children:[e("circle",{cx:"8",cy:"8",r:"5.5",fill:"none",stroke:"currentColor",strokeWidth:$}),e("circle",{cx:"8",cy:"8",r:"2",fill:"none",stroke:"currentColor",strokeWidth:$}),e("path",{d:"M8 0.5 v3 M8 12.5 v3 M0.5 8 h3 M12.5 8 h3",stroke:"currentColor",strokeWidth:$,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:$,strokeLinejoin:"round"}),bug:e(q,{children:[e("ellipse",{cx:"8",cy:"9",rx:"3.5",ry:"4",fill:"none",stroke:"currentColor",strokeWidth:$}),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:$,strokeLinecap:"round"})]}),architecture:e(q,{children:[e("rect",{x:"2",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:$}),e("rect",{x:"9",y:"9",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:$}),e("rect",{x:"5.5",y:"2",width:"5",height:"5",rx:"0.5",fill:"none",stroke:"currentColor",strokeWidth:$})]}),feature:e(q,{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:$,strokeLinejoin:"round"})}),commit:e(q,{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:$,strokeLinecap:"round"})}),session:e(q,{children:[e("circle",{cx:"8",cy:"9",r:"5",fill:"none",stroke:"currentColor",strokeWidth:$}),e("path",{d:"M8 9 V5.5 M8 9 L10.5 11",stroke:"currentColor",strokeWidth:$,strokeLinecap:"round"}),e("path",{d:"M6.5 2 H9.5",stroke:"currentColor",strokeWidth:$,strokeLinecap:"round"})]}),milestone:e(q,{children:[e("path",{d:"M4 2 V14",stroke:"currentColor",strokeWidth:$,strokeLinecap:"round"}),e("path",{d:"M4 3 H12 L10 6 L12 9 H4 z",fill:"none",stroke:"currentColor",strokeWidth:$,strokeLinejoin:"round"})]}),calendar:e(q,{children:[e("rect",{x:"2",y:"3",width:"12",height:"11",rx:"1",fill:"none",stroke:"currentColor",strokeWidth:$}),e("path",{d:"M2 6.5 H14 M5 1.5 V4.5 M11 1.5 V4.5",stroke:"currentColor",strokeWidth:$,strokeLinecap:"round"})]}),note:e(q,{children:[e("path",{d:"M4 2 H10 L13 5 V14 H4 z",fill:"none",stroke:"currentColor",strokeWidth:$,strokeLinejoin:"round"}),e("path",{d:"M10 2 V5 H13",fill:"none",stroke:"currentColor",strokeWidth:$,strokeLinejoin:"round"}),e("path",{d:"M6 8.5 H11 M6 11 H11",stroke:"currentColor",strokeWidth:$,strokeLinecap:"round"})]}),dot:e("circle",{cx:"8",cy:"8",r:"2",fill:"currentColor"})};function et({type:t,size:o=16,color:s,ariaLabel:i}){const a=un(t),r=i??ue(t);return e("svg",{width:o,height:o,viewBox:"0 0 16 16",role:"img","aria-label":r,style:{color:s??"currentColor",flexShrink:0,display:"inline-block",verticalAlign:"text-bottom"},children:[e("title",{children:r}),hn[a]]})}function oo(t,o){return t.length>o?t.slice(0,o)+"…":t}function pn(t){if(!t)return"";const o=xe(t);if(Number.isNaN(o.getTime()))return t.slice(0,16).replace("T"," ");const s=i=>String(i).padStart(2,"0");return`${o.getFullYear()}-${s(o.getMonth()+1)}-${s(o.getDate())} ${s(o.getHours())}:${s(o.getMinutes())}`}const gn={high:{bg:"var(--life-soft)",fg:"var(--life)"},medium:{bg:"var(--life-soft)",fg:"var(--life)"},low:{bg:"var(--border-subtle)",fg:"var(--text-2)"},none:{bg:"var(--border-subtle)",fg:"var(--text-3)"}};function Ve({entity:t,actions:o,highlight:s}){const i=ge(t)||n("memory.noContent"),a=t.observations?.length??0,r=t.archived||t.status==="archived",l=Qe(t),d=Ho(t.access_count),m=gn[d.tone],c=ve(t.last_accessed_at||t.created_at),h=(t.relations?.length??0)>0;return e("div",{class:"mem-row",style:r?{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(et,{type:t.type,size:18})}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:2},children:c})]}),e("div",{class:"mem-body",children:[e("div",{class:"mem-preview",children:s?e(fn,{text:oo(i,160),term:s}):oo(i,160)}),e("div",{class:"mem-meta",style:{flexWrap:"wrap",gap:6},children:[e("span",{class:"badge badge-type",children:ue(t.type)}),r&&e("span",{class:"badge badge-archived",children:n("memory.archivedBadge")}),l&&e("span",{class:"tag",style:{background:"var(--life-soft)",color:"var(--life)",display:"inline-flex",alignItems:"center",gap:4},title:n("memory.tooltip.project"),children:[e("svg",{width:"11",height:"11",viewBox:"0 0 16 16","aria-hidden":"true",style:{flexShrink:0},children:e("path",{d:"M2 4 a1 1 0 0 1 1 -1 h4 l2 2 h5 a1 1 0 0 1 1 1 v6 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"})}),l]}),d.tone!=="none"&&e("span",{class:"tag",style:{background:m.bg,color:m.fg,fontWeight:d.tone==="high"?600:400},title:n("memory.tooltip.recalled",{count:d.count}),children:["✓ ",d.label]}),h&&e("span",{class:"tag",style:{opacity:.7},title:n("memory.tooltip.hasRelations",{count:t.relations.length}),children:["→ ",t.relations.length]}),e("span",{style:{color:"var(--text-3)",fontSize:14,fontFamily:"var(--mono)",opacity:.85},title:n("memory.tooltip.createdAt",{date:t.created_at}),children:["· ",pn(t.created_at)]}),a>1&&e("span",{style:{color:"var(--text-3)",fontSize:14},children:["· ",n("memory.factsCount",{count:a})]}),t.tags?.filter(u=>!u.startsWith("project:")&&!/^\d{4}-\d{2}-\d{2}/.test(u)).slice(0,3).map(u=>e("span",{class:"tag",children:u},u))]})]}),o&&e("div",{class:"mem-actions",children:o})]})}function fn({text:t,term:o}){if(!o)return e(q,{children:t});const s=[],i=t.toLowerCase(),a=o.toLowerCase();let r=0;for(;r<t.length;){const l=i.indexOf(a,r);if(l===-1){s.push(t.slice(r));break}l>r&&s.push(t.slice(r,l)),s.push(e("mark",{children:t.slice(l,l+a.length)})),r=l+a.length}return e(q,{children:s})}function Oo(){const[t,o]=b(!1),[s,i]=b("");async function a(){i(""),o(!0);try{await I("POST","/v1/demo/seed"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(r){i(de(r))}finally{o(!1)}}return e("div",{class:"empty",style:{padding:"32px 20px"},children:[e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-0)",marginBottom:6},children:n("emptyLibrary.title")}),e("div",{style:{fontSize:14,lineHeight:1.55,color:"var(--text-1)",maxWidth:480,margin:"0 auto 14px"},children:n("emptyLibrary.body")}),e("button",{type:"button",class:"btn btn-primary",onClick:()=>void a(),disabled:t,style:{minWidth:160},children:n(t?"onboarding.seedingButton":"onboarding.seedButton")}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:8},children:n("onboarding.seedHint")}),s&&e("div",{role:"alert",style:{marginTop:10,fontSize:14,color:"var(--danger)"},children:s})]})}function te({label:t,active:o,onClick:s,count:i,dot:a}){return e("button",{onClick:s,"aria-pressed":o,style:{padding:"4px 10px",borderRadius:"var(--radius)",border:"1px solid",borderColor:o?"var(--life)":"var(--border)",background:o?"var(--life-soft)":"transparent",color:o?"var(--life)":"var(--text-2)",fontSize:14,cursor:"pointer",whiteSpace:"nowrap",fontFamily:"var(--font-ui)",display:"inline-flex",alignItems:"center",gap:6},children:[a&&e("span",{"aria-hidden":"true",style:{width:8,height:8,borderRadius:"var(--radius-hairline)",background:a,flexShrink:0}}),t,i!==void 0&&e("span",{style:{fontFamily:"var(--mono)",fontSize:14},children:i})]})}function yn(t){const o=[];let s=null;for(const i of t){const a=i.trim();a.startsWith("Error:")?(s&&o.push(s),s={error:a.slice(6).trim(),rootCause:"",fix:"",prevention:""}):a.startsWith("Root cause:")?(s||(s={error:"",rootCause:"",fix:"",prevention:""}),s.rootCause=a.slice(11).trim()):a.startsWith("Fix:")||a.startsWith("Solution")?(s||(s={error:"",rootCause:"",fix:"",prevention:""}),s.fix=a.replace(/^(Fix|Solution\s*\d*):/i,"").trim()):a.startsWith("Prevention:")&&(s||(s={error:"",rootCause:"",fix:"",prevention:""}),s.prevention=a.slice(11).trim())}return s&&o.push(s),o}function vn(t){const o=t.observations??[],s=o[0]?.match(/^Plan "(.+?)" completed \((\d+) steps?\)/),i=o.find(r=>r.startsWith("Steps:"))?.slice(6).trim()??"",a=o.find(r=>r.startsWith("Commits:"))?.slice(8).trim()??"";return{planName:s?.[1]??ge(t),stepCount:s?parseInt(s[2],10):0,steps:i,commits:a?a.split(",").map(r=>r.trim()).filter(Boolean):[]}}const so={critical:"var(--danger)",major:"var(--warning)",minor:"var(--info)"};function bn(t){const o=t.tags??[];return o.includes("severity:critical")?"critical":o.includes("severity:major")?"major":o.includes("severity:minor")?"minor":null}function kn({entity:t}){const o=bn(t);return o?e("span",{class:"badge",style:{background:`${so[o]}18`,color:so[o]},children:n(`lessons.severity.${o}`)}):null}function Be({label:t,color:o,text:s}){return e("div",{style:{marginBottom:8},children:[e("div",{style:{fontSize:14,fontWeight:600,color:o,marginBottom:2,fontFamily:"var(--font-ui)"},children:t}),e("div",{style:{fontSize:14,lineHeight:1.55},children:s})]})}function xn({entity:t}){const o=yn(t.observations??[]);return o.length===0?e("div",{style:{fontSize:14,color:"var(--text-3)",fontStyle:"italic"},children:n("lessons.unstructured")}):e(q,{children:o.map((s,i)=>e("div",{style:{marginTop:i>0?12:0,paddingTop:i>0?12:0,borderTop:i>0?"1px dashed var(--border-subtle)":"none"},children:[s.error&&e(Be,{label:n("lessons.error"),color:"var(--danger)",text:s.error}),s.rootCause&&e(Be,{label:n("lessons.rootCause"),color:"var(--warning)",text:s.rootCause}),s.fix&&e(Be,{label:n("lessons.fix"),color:"var(--success)",text:s.fix}),s.prevention&&e(Be,{label:n("lessons.prevention"),color:"var(--info)",text:s.prevention})]},i))})}function wn({entity:t}){const o=vn(t);return e("div",{children:[e("div",{style:{fontSize:14,color:"var(--text-3)",marginBottom:6,fontFamily:"var(--font-ui)"},children:[e("span",{style:{fontFamily:"var(--mono)"},children:o.stepCount})," ",n("lessons.stepsLabel")," · ",n("lessons.commitsCount",{count:o.commits.length})]}),o.steps&&e("div",{style:{fontSize:14,color:"var(--text-1)",lineHeight:1.55},children:o.steps}),o.commits.length>0&&e("div",{style:{marginTop:8,fontSize:14,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[o.commits.slice(0,6).join(" · "),o.commits.length>6&&e("span",{children:[" · +",o.commits.length-6]})]})]})}function Sn({entity:t}){const o=t.observations??[];return o.length===0?e("div",{style:{fontSize:14,color:"var(--text-3)",fontStyle:"italic"},children:n("lessons.unstructured")}):e("ul",{style:{fontSize:14,lineHeight:1.6,margin:0,paddingLeft:18,color:"var(--text-1)"},children:[o.slice(0,8).map((s,i)=>e("li",{style:{marginBottom:3},children:s},i)),o.length>8&&e("li",{style:{color:"var(--text-3)",listStyle:"none"},children:n("lessons.moreItems",{count:o.length-8})})]})}function Fo({entity:t}){return e("details",{style:{marginTop:10,fontSize:14,color:"var(--text-3)"},children:[e("summary",{style:{cursor:"pointer"},children:n("memory.technicalDetails")}),e("dl",{style:{display:"grid",gridTemplateColumns:"max-content minmax(0, 1fr)",gap:"4px 10px",margin:"8px 0 0"},children:[e("dt",{children:n("memory.canonicalName")}),e("dd",{style:{margin:0,fontFamily:"var(--mono)",overflowWrap:"anywhere"},children:t.name}),e("dt",{children:n("memory.rawType")}),e("dd",{style:{margin:0,fontFamily:"var(--mono)",overflowWrap:"anywhere"},children:t.type})]})]})}function Mn({entity:t}){const o=Es(t);return e("div",{style:{padding:"10px 0 4px 40px",fontFamily:"var(--font-memory)"},children:[o==="failure"?e(xn,{entity:t}):o==="plan-completion"?e(wn,{entity:t}):e(Sn,{entity:t}),e(Fo,{entity:t})]})}const Cn=new Set(["lesson_learned","lesson","mistake"]),_n=new Set([...Cn,"decision","milestone","pattern","technical_pattern","product_improvement","goal","plan","task-state"]),An=new Set(["commit","session-insight","session-summary","session_keypoint","session-identity","session_identity","weekly-summary","weekly_summary","workflow_checkpoint"]);function no(t){return _n.has(t)?"work":An.has(t)?"evidence":"knowledge"}const mt=30,ao=2e3,En=30,io=["knowledge","activity","session","reference"];function Me(t){return!!t.archived||t.status==="archived"}function xt(t){if(!t)return null;const o=Do(t);if(o!==null)return o;const s=Date.parse(t);return Number.isNaN(s)?null:s}function Ce(t){return xt(t.last_accessed_at||t.created_at)}function ut(t,o){return t===null?o===null?0:1:o===null?-1:o-t}function Tn(t){const o=Ce(t);return o===null?null:new Date(o).toISOString()}function jn({health:t,dataRevision:o=0}){const[s,i]=b([]),[a,r]=b([]),[l,d]=b(""),[m,c]=b(!0),[h,u]=b(""),[g,f]=b(0),[E]=Lo(),[S,P]=b({kind:"layer",v:E?"work":"all"}),[_,T]=b("all"),[R,L]=b("all"),[A,p]=b("all"),[v,C]=b("most-recalled"),[k,D]=b(null),[y,M]=b(!1),[B,O]=b(()=>new Set),V=X(0),J=X(0);async function x(){const w=++V.current;c(!0),u("");try{const[H,U]=await Promise.all([I("GET",`/v1/entities?limit=${ao}&status=all`),zo().catch(()=>[])]);if(w!==V.current)return;Array.isArray(H)?i(H):(console.warn("[memesh dashboard] /v1/entities answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",H),u(Q("unreadable"))),r(U),f(0)}catch(H){if(w!==V.current)return;console.warn("[memesh dashboard] /v1/entities failed to load:",H),u(Q(pe(H)))}finally{w===V.current&&c(!1)}}W(()=>{x()},[o]),W(()=>{f(0)},[l,S,_,R,A,v]);function N(w=!0){J.current++,D(null),M(!1),w&&d("")}function j(w){P(w),N()}W(()=>{P(w=>w.kind==="layer"&&(w.v==="work"||w.v==="all")?{kind:"layer",v:E?"work":"all"}:w)},[E]);const z=K(()=>s.filter(w=>!Me(w)),[s]),ee=K(()=>s.filter(Me),[s]),F=K(()=>{const w={work:0,evidence:0};for(const H of z){const U=no(H.type);U==="work"?w.work++:U==="evidence"&&w.evidence++}return w},[z]),se=K(()=>{const w={knowledge:0,activity:0,session:0,reference:0};for(const H of z)w[kt(H.type)]++;return w},[z]);function ce(w){return S.kind==="archived"?Me(w):Me(w)?!1:S.kind==="cluster"?kt(w.type)===S.v:S.v==="all"?!0:no(w.type)===S.v}const ie=K(()=>{const w=l.toLowerCase();return s.filter(H=>!(!ce(H)||_!=="all"&&No(Tn(H))!==_||R==="recalled"&&(H.access_count??0)===0||R==="never"&&(H.access_count??0)>0||A!=="all"&&Qe(H)!==A||w&&![H.name,H.title??"",H.type,...H.observations??[],...H.tags??[]].join(" ").toLowerCase().includes(w)))},[s,S,_,R,A,l]),re=K(()=>{const w=[...ie];return v==="most-recalled"?w.sort((H,U)=>(U.access_count??0)-(H.access_count??0)||ut(Ce(H),Ce(U))):v==="created"?w.sort((H,U)=>ut(xt(H.created_at),xt(U.created_at))):w.sort((H,U)=>ut(Ce(H),Ce(U))),w},[ie,v]),fe=Math.ceil(re.length/mt),Se=re.slice(g*mt,(g+1)*mt);async function Lt(){const w=l.trim();if(!w)return;const H=++J.current;M(!0),u("");try{const U=await I("POST","/v1/recall",{query:w,limit:En}),Le=Array.isArray(U)?U:U.entities;if(H!==J.current)return;if(!Array.isArray(Le)){console.warn("[memesh dashboard] /v1/recall answered with a shape this bundle cannot read:",U),u(Q("unreadable"));return}D(Le)}catch(U){if(H!==J.current)return;u(de(U))}finally{H===J.current&&M(!1)}}async function Ko(w){if(confirm(n("browse.confirmArchive")))try{await I("POST","/v1/forget",{name:w}),window.dispatchEvent(new Event("memesh:data-changed"))}catch(H){u(n("browse.archiveFailed",{message:de(H)}))}}async function Yo(w){try{await I("POST","/v1/remember",{name:w,type:"restored"}),window.dispatchEvent(new Event("memesh:data-changed"))}catch(H){u(n("browse.restoreFailed",{message:de(H)}))}}function Zo(w){O(H=>{const U=new Set(H);return U.has(w)?U.delete(w):U.add(w),U})}function Pt(w,H){const U=B.has(w.id),Le=Me(w);return e("div",{style:{borderBottom:"1px solid var(--border-subtle)",padding:"12px 0"},children:[e(Ve,{entity:w,highlight:H,actions:e(q,{children:[e(kn,{entity:w}),e("button",{class:"btn btn-sm",style:{padding:"6px 8px",minHeight:28},"aria-expanded":U,"aria-controls":`mem-detail-${w.id}`,"aria-label":n(U?"memories.collapse":"memories.expand"),onClick:()=>Zo(w.id),children:e("svg",{width:"12",height:"12",viewBox:"0 0 16 16","aria-hidden":"true",style:{transform:U?"rotate(90deg)":"none",transition:"transform 150ms"},children:e("path",{d:"M6 4 L10 8 L6 12",stroke:"currentColor",strokeWidth:"1.5",fill:"none",strokeLinecap:"round",strokeLinejoin:"round"})})}),Le?e("button",{class:"btn btn-sm",onClick:()=>Yo(w.name),children:n("browse.restore")}):e("button",{class:"btn btn-danger btn-sm",onClick:()=>Ko(w.name),children:n("browse.archive")})]})}),U&&e("div",{id:`mem-detail-${w.id}`,children:e(Mn,{entity:w})})]},w.id)}const Xo=l!==""||_!=="all"||R!=="all"||A!=="all",Rt=k!==null,st=z.length;return e("div",{children:e("div",{class:"card",children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:12},children:[e("div",{children:[e("div",{class:"card-title",style:{margin:0},children:n("browse.title")}),!m&&e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:2},children:[e("span",{style:{fontFamily:"var(--mono)"},children:st.toLocaleString(oe())})," ",n("browse.active"),ee.length>0?e(q,{children:[" · ",e("span",{style:{fontFamily:"var(--mono)"},children:ee.length})," ",n("browse.archived")]}):"",s.length>=ao&&(t==null?e("span",{children:[" · ",n("browse.truncatedUnknownTotal",{shown:s.length.toLocaleString(oe())})]}):t.entity_count>s.length?e("span",{children:[" · ",n("browse.truncated",{shown:s.length.toLocaleString(oe()),total:t.entity_count.toLocaleString(oe())})]}):null)]})]}),e("button",{class:"btn btn-sm",onClick:x,title:n("browse.refresh"),children:"↻"})]}),e("div",{role:"status",style:{fontSize:14,color:"var(--text-2)",padding:"8px 10px",marginBottom:10,background:"var(--bg-2)",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-xs)"},children:n(E?"globalFilter.focusedStatus":"globalFilter.allStatus")}),e("div",{class:"search-bar",style:{marginBottom:10},children:[e("input",{type:"search",placeholder:n("memories.searchPlaceholder"),value:l,onInput:w=>{d(w.target.value),N(!1)},onKeyDown:w=>w.key==="Enter"&&Lt()}),e("button",{class:"btn",onClick:Lt,disabled:y||!l.trim(),children:n(y?"search.searching":"search.button")})]}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:8,alignItems:"center"},children:[e("span",{style:{fontSize:14,color:"var(--text-3)",marginRight:4},children:n("memories.scopeLabel")}),e(te,{label:n("memories.scopeWork"),active:S.kind==="layer"&&S.v==="work",onClick:()=>j({kind:"layer",v:"work"}),count:F.work}),e(te,{label:n("memories.scopeEvidence"),active:S.kind==="layer"&&S.v==="evidence",onClick:()=>j({kind:"layer",v:"evidence"}),count:F.evidence}),e(te,{label:n("memories.scopeAll"),active:S.kind==="layer"&&S.v==="all",onClick:()=>j({kind:"layer",v:"all"}),count:st}),e("span",{style:{width:1,alignSelf:"stretch",background:"var(--border-subtle)",margin:"0 6px"}}),e(te,{label:n("memories.scopeArchived"),active:S.kind==="archived",onClick:()=>j({kind:"archived"}),count:ee.length})]}),st>0&&e("div",{style:{marginBottom:8},children:[e("div",{"aria-hidden":"true",style:{display:"flex",height:6,borderRadius:"var(--radius-hairline)",overflow:"hidden",background:"var(--bg-0)",marginBottom:6},children:io.map(w=>se[w]>0&&e("span",{style:{flex:se[w],background:Je[w]}},w))}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"center"},children:[e("span",{style:{fontSize:14,color:"var(--text-3)",marginRight:4},children:n("memories.composition")}),io.map(w=>e(te,{label:n(`cluster.${w}`),dot:Je[w],count:se[w],active:S.kind==="cluster"&&S.v===w,onClick:()=>j(S.kind==="cluster"&&S.v===w?{kind:"layer",v:"all"}:{kind:"cluster",v:w})},w))]})]}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:6},children:[e("span",{style:{fontSize:14,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:n("browse.filterTime")}),e(te,{label:n("browse.timeToday"),active:_==="today",onClick:()=>T(_==="today"?"all":"today")}),e(te,{label:n("browse.timeWeek"),active:_==="week",onClick:()=>T(_==="week"?"all":"week")}),e(te,{label:n("browse.timeMonth"),active:_==="month",onClick:()=>T(_==="month"?"all":"month")}),e(te,{label:n("browse.timeOlder"),active:_==="older",onClick:()=>T(_==="older"?"all":"older")}),e("span",{style:{width:1,background:"var(--border-subtle)",margin:"0 6px"}}),e("span",{style:{fontSize:14,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:n("browse.filterValue")}),e(te,{label:n("browse.valueRecalled"),active:R==="recalled",onClick:()=>L(R==="recalled"?"all":"recalled")}),e(te,{label:n("browse.valueNever"),active:R==="never",onClick:()=>L(R==="never"?"all":"never")})]}),a.length>0&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:6},children:[e("span",{style:{fontSize:14,color:"var(--text-3)",alignSelf:"center",marginRight:4},children:n("browse.filterProject")}),e(te,{label:n("cluster.all"),active:A==="all",onClick:()=>p("all")}),a.map(w=>e(te,{label:w.name,count:w.count,active:A===w.name,onClick:()=>p(w.name)},w.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:14,color:"var(--text-3)"},children:n("browse.filterSort")}),e("select",{value:v,onChange:w=>C(w.target.value),style:{padding:"3px 8px",fontSize:14},children:[e("option",{value:"most-recalled",children:n("browse.sortMostRecalled")}),e("option",{value:"recent",children:n("browse.sortRecent")}),e("option",{value:"created",children:n("browse.sortCreated")})]})]}),h&&e("div",{class:"error-box",role:"alert",style:{marginBottom:12},children:h}),(m||y)&&e("div",{class:"empty",children:e("div",{class:"loading"})}),!m&&!y&&Rt&&e("div",{children:[e("div",{role:"status",style:{display:"flex",alignItems:"center",gap:10,fontSize:14,color:"var(--text-3)",marginBottom:8},children:[e("span",{children:[e("span",{style:{fontFamily:"var(--mono)"},children:k.length})," ",k.length!==1?n("search.results"):n("search.result")," · ",n("memories.rankedBy")]}),e("button",{class:"btn btn-sm",onClick:()=>N(),children:["✕ ",n("memories.backToList")]})]}),k.length===0?e("div",{class:"empty",role:"status",children:[n("search.noResults"),' "',l,'"']}):k.map(w=>Pt(w,l))]}),!m&&!y&&!Rt&&(s.length===0?!h&&e(Oo,{}):re.length===0?e("div",{class:"empty",children:S.kind==="layer"&&S.v==="work"&&!Xo?e(q,{children:[e("div",{style:{marginBottom:10},children:n("memories.workEmpty")}),e(te,{label:n("memories.showAll"),active:!1,onClick:()=>j({kind:"layer",v:"all"})})]}):l?e(q,{children:[n("browse.noMatch"),' "',l,'"']}):e(q,{children:n("browse.emptyFilter")})}):e("div",{children:[Se.map(w=>Pt(w,l)),fe>1&&e("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:12,padding:"16px 0",fontSize:14},children:[e("button",{class:"btn btn-sm",disabled:g===0,onClick:()=>f(w=>w-1),children:n("browse.prev")}),e("span",{style:{color:"var(--text-3)",fontFamily:"var(--mono)",fontSize:14},children:[g+1," / ",fe]}),e("button",{class:"btn btn-sm",disabled:g>=fe-1,onClick:()=>f(w=>w+1),children:n("browse.next")})]})]}))]})})}const ht=["knowledge","activity","session","reference"],ro=34,Ln=60,Ie=1440*60*1e3;function Pn(t){const o=t/Ie;return o<=31?Ie:o<=217?7*Ie:30*Ie}function Rn(t){const o=t.map(d=>xe(d.created_at).getTime()).filter(d=>Number.isFinite(d));if(o.length===0)return[];const s=Math.min(...o),i=Math.max(...o),a=Pn(Math.max(i-s,1)),r=Math.min(Math.floor((i-s)/a)+1,Ln),l=Array.from({length:r},(d,m)=>({startMs:s+m*a,counts:{knowledge:0,activity:0,session:0,reference:0},total:0}));for(const d of t){const m=xe(d.created_at).getTime();if(!Number.isFinite(m))continue;const c=Math.min(Math.floor((m-s)/a),r-1);l[c].counts[kt(d.type)]++,l[c].total++}return l}function zn({entities:t}){const o=K(()=>Rn(t),[t]),s=K(()=>{const a={knowledge:0,activity:0,session:0,reference:0};for(const r of o)for(const l of ht)a[l]+=r.counts[l];return a},[o]);if(o.length===0)return null;const i=Math.max(...o.map(a=>a.total),1);return e("div",{style:{marginBottom:14},children:[e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"baseline",marginBottom:4},children:[e("span",{style:{fontSize:14,color:"var(--text-2)",fontFamily:"var(--font-ui)"},children:n("roadmap.densityTitle")}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:n("roadmap.densityNote")})]}),e("div",{"aria-hidden":"true",style:{display:"flex",alignItems:"flex-end",gap:1,height:ro,background:"var(--bg-0)",borderRadius:"var(--radius-hairline)",padding:"2px 2px 0"},children:o.map((a,r)=>e("div",{style:{flex:1,display:"flex",flexDirection:"column",justifyContent:"flex-end",minWidth:0},children:ht.map(l=>a.counts[l]>0&&e("div",{style:{height:Math.max(a.counts[l]/i*(ro-2),1),background:Je[l],borderRadius:"var(--radius-hairline)"}},l))},r))}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:10,marginTop:4},children:ht.map(a=>s[a]>0&&e("span",{style:{display:"inline-flex",alignItems:"center",gap:5,fontSize:14,color:"var(--text-2)",fontFamily:"var(--font-ui)"},children:[e("span",{"aria-hidden":"true",style:{width:8,height:8,borderRadius:"var(--radius-hairline)",background:Je[a],flexShrink:0}}),n(`cluster.${a}`),e("span",{style:{fontFamily:"var(--mono)",fontSize:14,opacity:.7},children:s[a]})]},a))})]})}const Dn=new Set(["decision","design_decision","architecture_decision"]),Nn=new Set(["supersedes","contradicts"]),co=new Set(["release","feature"]),Hn=.65,qn=new Set(["release"]),Bn=new Set(["lesson_learned","lesson","mistake","bug_fix"]),In={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 Un(t){if(t.length<3)return[];const i=[...t].sort((d,m)=>d.created_at.localeCompare(m.created_at)),a=[];let r=[i[0]];for(let d=1;d<i.length;d++){const m=i[d-1].created_at,c=i[d].created_at;(new Date(c).getTime()-new Date(m).getTime())/864e5<=7?r.push(i[d]):(a.push(r),r=[i[d]])}a.push(r);const l=[];for(const d of a){if(d.length<3)continue;const m=d.map(c=>({e:c,p:In[c.type]??99})).sort((c,h)=>c.p-h.p)[0];m.p!==99&&l.push({startIso:d[0].created_at,endIso:d[d.length-1].created_at,entityCount:d.length,label:ge(m.e),anchorId:m.e.id})}return l}const On={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 On[t]??50}function Fn(t,o=new Date){const s=new Map;for(const a of t){const r=a.last_accessed_at||a.created_at,l=No(r,o);let d,m,c;if(l==="today")d="today",m=n("time.today"),c=Number.MAX_SAFE_INTEGER;else if(l==="week"){const u=r.slice(0,10);d=`week:${u}`,m=ve(r,o),c=new Date(u).getTime()}else if(l==="month"){const u=r.slice(0,10),g=new Date(u),f=new Date(g);f.setDate(g.getDate()-g.getDay());const E=f.toISOString().slice(0,10);d=`month:${E}`,m=ve(E,o),c=f.getTime()}else{const u=r.slice(0,7);d=`older:${u}`;const g=new Date(u+"-01");m=g.toLocaleDateString(oe(),{year:"numeric",month:"long"}),c=g.getTime()}let h=s.get(d);h||(h={key:d,label:m,sort:c,entries:[]},s.set(d,h)),h.entries.push(a)}const i=Array.from(s.values()).sort((a,r)=>r.sort-a.sort);for(const a of i)a.entries.sort((r,l)=>{const d=we(r.type)-we(l.type);return d!==0?d:l.created_at.localeCompare(r.created_at)});return i}function Gn({projectName:t,entities:o}){const[s,i]=b("tree"),a=K(()=>{if(o.length===0)return{total:0,first:null,last:null,types:[]};const p=[...o].sort((C,k)=>C.created_at.localeCompare(k.created_at)),v=new Map;for(const C of o)v.set(C.type,(v.get(C.type)??0)+1);return{total:o.length,first:p[0].created_at,last:p[p.length-1].created_at,types:Array.from(v.entries()).sort((C,k)=>k[1]-C[1])}},[o]),r=K(()=>Fn(o),[o]),l=K(()=>o.filter(p=>{if(!co.has(p.type))return!1;if(qn.has(p.type))return!0;const v=p.metadata?.signal_score;return typeof v!="number"?!0:v>=Hn}).sort((p,v)=>v.created_at.localeCompare(p.created_at)).slice(0,6),[o]),d=K(()=>o.filter(v=>co.has(v.type)).length-l.length,[o,l]),m=K(()=>o.filter(p=>Bn.has(p.type)).sort((p,v)=>(v.access_count??0)-(p.access_count??0)).slice(0,5),[o]),c=K(()=>Un(o),[o]),h=X(new Map),u=p=>v=>{v?h.current.set(p,v):h.current.delete(p)},g=p=>{const v=h.current.get(p);v&&(v.scrollIntoView({behavior:"smooth",block:"center"}),v.focus({preventScroll:!0}),v.style.transition="background 0.2s",v.style.background="var(--life-soft)",window.setTimeout(()=>{v.style.background=""},1400))},f=p=>{i("tree"),window.requestAnimationFrame(()=>g(p))},E=K(()=>{const p=new Map;for(const v of o)p.set(v.name,v.id);return p},[o]),S=K(()=>{const p=[];for(const v of o)for(const C of v.relations??[]){if(!Nn.has(C.type))continue;const k=E.get(C.to);k!==void 0&&k!==v.id&&p.push({from:v.id,to:k,type:C.type})}return p},[o,E]),P=X(null),[_,T]=b([]),R=X(()=>{});R.current=()=>{const p=P.current;if(!p||S.length===0||s!=="tree"){T(k=>k.length===0?k:[]);return}const v=p.getBoundingClientRect().top,C=[];for(const k of S){const D=h.current.get(k.from),y=h.current.get(k.to);if(!D||!y)continue;const M=D.getBoundingClientRect(),B=y.getBoundingClientRect(),O=Math.round(M.top-v+M.height/2),V=Math.round(B.top-v+B.height/2);C.push({d:`M 14 ${O} C 0 ${O}, 0 ${V}, 14 ${V}`,type:k.type})}T(k=>k.length===C.length&&k.every((y,M)=>y.d===C[M].d&&y.type===C[M].type)?k:C)},W(()=>{R.current()}),W(()=>{const p=()=>R.current();return window.addEventListener("resize",p),()=>window.removeEventListener("resize",p)},[]);const L=_.filter(p=>p.type==="supersedes").length,A=_.filter(p=>p.type==="contradicts").length;return o.length===0?e("div",{class:"empty",children:[e("span",{class:"empty-icon",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",color:"var(--text-3)"},children:e("svg",{width:"32",height:"32",viewBox:"0 0 16 16","aria-hidden":"true",children:[e("path",{d:"M2 4 L6 2 L10 4 L14 2 V12 L10 14 L6 12 L2 14 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"}),e("path",{d:"M6 2 V12 M10 4 V14",stroke:"currentColor",strokeWidth:"1.5"})]})}),n("roadmap.emptyProject")]}):e("div",{children:[e("div",{style:{padding:"14px 16px",background:"var(--border-subtle)",border:"1px solid rgba(143, 242, 92, 0.12)",borderRadius:"var(--radius-sm)",marginBottom:14},children:[e("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",flexWrap:"wrap",gap:8},children:[e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:18,fontWeight:600,color:"var(--text-0)",display:"inline-flex",alignItems:"center",gap:8},children:[e("svg",{width:"18",height:"18",viewBox:"0 0 16 16","aria-hidden":"true",style:{color:"var(--life)"},children:e("path",{d:"M2 4 a1 1 0 0 1 1 -1 h4 l2 2 h5 a1 1 0 0 1 1 1 v6 a1 1 0 0 1 -1 1 H3 a1 1 0 0 1 -1 -1 z",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinejoin:"round"})}),e("span",{children:t}),e("span",{style:{color:"var(--text-3)",fontWeight:400,fontSize:14},children:["· ",n("roadmap.title")]})]}),e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:4},children:n("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":n("roadmap.viewToggle"),style:{display:"inline-flex",background:"var(--border-subtle)",borderRadius:"var(--radius-xs)",padding:2,border:"1px solid var(--border-subtle)"},children:["tree","mindmap","decisions"].map(p=>{const v=s===p,C=p==="tree"?`🌲 ${n("roadmap.viewTree")}`:p==="mindmap"?`🧠 ${n("roadmap.viewMindmap")}`:`⚖️ ${n("roadmap.viewDecisions")}`;return e("button",{role:"tab","aria-selected":v,onClick:()=>i(p),style:{padding:"4px 10px",background:v?"rgba(143,242,92,0.15)":"transparent",color:v?"var(--life)":"var(--text-2)",border:"none",borderRadius:"var(--radius-hairline)",fontSize:14,fontFamily:"inherit",cursor:"pointer",fontWeight:v?600:400},children:C},p)})})})]}),a.types.length>0&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginTop:10},children:[a.types.slice(0,8).map(([p,v])=>e("span",{class:"tag",style:{fontSize:14,background:"var(--border-subtle)"},children:[ue(p)," ",e("span",{style:{fontFamily:"var(--mono)"},children:v})]},p)),a.types.length>8&&e("span",{class:"tag",style:{fontSize:14},children:["+",a.types.length-8]})]})]}),e(zn,{entities:o}),s!=="decisions"&&c.length>0&&e("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:14,padding:"12px 14px",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-sm)",background:"rgba(255, 255, 255, 0.02)",overflowX:"auto"},children:[e("span",{style:{fontSize:14,textTransform:"uppercase",letterSpacing:"0.08em",color:"var(--text-3)",fontWeight:600,flexShrink:0},children:n("roadmap.phases")}),c.map((p,v)=>e("button",{onClick:()=>p.anchorId!==void 0&&g(p.anchorId),disabled:p.anchorId===void 0,style:{flexShrink:0,display:"flex",flexDirection:"column",alignItems:"flex-start",gap:2,padding:"6px 10px",background:v===c.length-1?"var(--life-soft)":"transparent",border:"1px solid",borderColor:v===c.length-1?"rgba(143, 242, 92, 0.3)":"var(--border-subtle)",borderRadius:"var(--radius-xs)",color:"var(--text-1)",cursor:p.anchorId!==void 0?"pointer":"default",fontFamily:"inherit",textAlign:"left",minWidth:100},title:`${p.startIso.slice(0,10)} → ${p.endIso.slice(0,10)}`,children:[e("span",{style:{fontSize:14,fontWeight:600,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:240},children:p.label}),e("span",{style:{fontSize:14,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[p.entityCount," · ",ve(p.startIso)]})]},`${p.startIso}-${p.label}`))]}),s==="mindmap"&&c.length>0&&e(Vn,{projectName:t,phases:c,entities:o,onNodeClick:f}),s==="mindmap"&&c.length===0&&e("div",{class:"empty",style:{padding:24},children:[n("roadmap.emptyProject")," — ",n("roadmap.mindmapNeedsPhases")]}),s==="decisions"&&e(Wn,{entities:o,onJump:f}),s==="tree"&&e("div",{style:{display:"grid",gridTemplateColumns:"minmax(0, 1fr) 280px",gap:16,alignItems:"start"},children:[e("div",{style:{position:"relative",minWidth:0},children:[(L>0||A>0)&&e("div",{style:{fontSize:14,color:"var(--text-3)",marginBottom:6,fontFamily:"var(--font-ui)"},children:[L>0&&e("span",{style:{marginRight:10},children:["— ",n("roadmap.lineageSupersedes",{n:L})]}),A>0&&e("span",{style:{color:"var(--warning)"},children:["⋯ ",n("roadmap.lineageConflicts",{n:A})]})]}),c.length>0?e("div",{ref:P,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)"}}),_.length>0&&e("svg",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,width:28,height:"100%",overflow:"visible",pointerEvents:"none"},children:_.map((p,v)=>e("path",{d:p.d,fill:"none",stroke:p.type==="contradicts"?"var(--warning)":"var(--text-3)",strokeWidth:1.5,strokeDasharray:p.type==="contradicts"?"3 3":void 0,opacity:.8},v))}),(()=>{const p=c.map(()=>[]),v=[];for(const k of o){const D=c.findIndex(y=>k.created_at>=y.startIso&&k.created_at<=y.endIso);D>=0?p[D].push(k):v.push(k)}for(const k of p)k.sort((D,y)=>{const M=we(D.type)-we(y.type);return M!==0?M:y.created_at.localeCompare(D.created_at)});const C=c.map((k,D)=>({phase:k,entries:p[D],idx:D})).reverse();return e(q,{children:[C.map(({phase:k,entries:D},y)=>{const M=y===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:M?"transparent":"var(--life)",border:"2px solid var(--life)",boxSizing:"border-box"}}),e("button",{onClick:()=>k.anchorId!==void 0&&g(k.anchorId),disabled:k.anchorId===void 0,style:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:2,padding:0,background:"transparent",border:"none",color:"inherit",cursor:k.anchorId!==void 0?"pointer":"default",fontFamily:"inherit",textAlign:"left",width:"100%"},children:[e("span",{style:{fontSize:14,fontWeight:600,color:"var(--text-0)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:"100%"},children:[k.label,M&&e("span",{style:{marginLeft:8,fontSize:14,color:"var(--life)",fontFamily:"var(--mono)",fontWeight:500},children:n("roadmap.activePhase")})]}),e("span",{style:{fontSize:14,color:"var(--text-3)",fontFamily:"var(--mono)"},children:[k.startIso.slice(0,10)," → ",k.endIso.slice(0,10)," · ",D.length===1?n("roadmap.entryCount",{count:1}):n("roadmap.entriesCount",{count:D.length})]})]}),e("div",{style:{marginTop:8},children:D.map((B,O)=>{const V=O===D.length-1;return e("div",{ref:u(B.id),tabIndex:-1,"data-roadmap-entry-id":B.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(Ve,{entity:B})]},B.id)})})]},`${k.startIso}-${k.label}`)}),v.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:14,color:"var(--text-2)",fontFamily:"var(--mono)",marginBottom:8},children:n("roadmap.otherGroup",{count:v.length})}),v.map((k,D)=>{const y=D===v.length-1;return e("div",{ref:u(k.id),tabIndex:-1,"data-roadmap-entry-id":k.id,style:{position:"relative",paddingLeft:24,paddingTop:6,paddingBottom:6},children:[e("span",{"aria-hidden":"true",style:{position:"absolute",left:0,top:0,bottom:y?"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(Ve,{entity:k})]},k.id)})]})]})})()]}):r.map(p=>e("div",{style:{marginBottom:18},children:[e("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:8,paddingBottom:6,borderBottom:"1px solid var(--border-subtle)"},children:[e("span",{style:{fontSize:14,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--life)",fontFamily:"var(--mono)"},children:p.label}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:p.entries.length})]}),p.entries.map(v=>e("div",{ref:u(v.id),tabIndex:-1,"data-roadmap-entry-id":v.id,style:{borderBottom:"1px solid var(--border-subtle)",padding:"12px 0"},children:e(Ve,{entity:v})},v.id))]},p.key))]}),e("div",{style:{display:"flex",flexDirection:"column",gap:14,position:"sticky",top:16},children:[l.length>0&&e("div",{class:"card",style:{padding:14},children:[e("div",{style:{fontSize:14,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--text-2)",marginBottom:10,display:"flex",alignItems:"center",gap:4},children:[n("roadmap.milestones"),d>0&&e("span",{style:{fontSize:14,fontWeight:400,opacity:.55,textTransform:"none",letterSpacing:0},children:n("roadmap.lowSignalHidden",{count:d})})]}),l.map(p=>e("button",{onClick:()=>g(p.id),style:{display:"flex",alignItems:"flex-start",gap:8,width:"100%",textAlign:"left",padding:"6px 0",background:"transparent",border:"none",borderTop:"1px solid var(--border-subtle)",color:"inherit",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{flexShrink:0,color:"var(--life)"},children:e(et,{type:p.type,size:14})}),e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:14,color:"var(--text-1)",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:ge(p)}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:2},children:ve(p.created_at)})]})]},p.id))]}),m.length>0&&e("div",{class:"card",style:{padding:14},children:[e("div",{style:{fontSize:14,textTransform:"uppercase",letterSpacing:"0.08em",fontWeight:600,color:"var(--text-2)",marginBottom:10},children:n("roadmap.keyLessons")}),m.map(p=>{const v=Ho(p.access_count);return e("button",{onClick:()=>g(p.id),style:{display:"flex",alignItems:"flex-start",gap:8,width:"100%",textAlign:"left",padding:"6px 0",background:"transparent",border:"none",borderTop:"1px solid var(--border-subtle)",color:"inherit",cursor:"pointer",fontFamily:"inherit"},children:[e("span",{style:{flexShrink:0,color:"var(--text-2)"},children:e(et,{type:p.type,size:14})}),e("div",{style:{flex:1,minWidth:0},children:[e("div",{style:{fontSize:14,color:"var(--text-1)",fontWeight:500,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:ge(p)}),e("div",{style:{fontSize:14,color:v.tone==="high"?"var(--life)":"var(--text-3)",marginTop:2,fontFamily:"var(--mono)"},children:v.tone!=="none"?v.label:n("memory.access.never")})]})]},p.id)})]})]})]})]})}function Wn({entities:t,onJump:o}){const[s,i]=b(()=>new Set),a=c=>i(h=>{const u=new Set(h);return u.has(c)?u.delete(c):u.add(c),u}),r=K(()=>t.filter(c=>Dn.has(c.type)).sort((c,h)=>h.created_at.localeCompare(c.created_at)),[t]),l=K(()=>{const c=new Map;for(const h of t)c.set(h.name,h);return c},[t]),d=K(()=>{const c=new Map;for(const h of t)for(const u of h.relations??[]){if(u.type!=="supersedes")continue;const g=c.get(u.to)??[];g.push(h),c.set(u.to,g)}return c},[t]);if(r.length===0)return e("div",{class:"empty",style:{padding:24},children:n("adr.empty")});const m=c=>{const h=l.get(c);return h?e("button",{onClick:()=>o(h.id),style:{background:"transparent",border:"none",padding:0,cursor:"pointer",color:"var(--life)",fontSize:"inherit",fontFamily:"inherit",textDecoration:"underline"},children:ge(h)}):e("span",{style:{color:"var(--text-2)"},children:c})};return e("div",{style:{display:"flex",flexDirection:"column",gap:10},children:r.map(c=>{const h=d.get(c.name)??[],u=h.length>0||!!c.archived||c.status==="archived",g=s.has(c.id),f=`adr-body-${c.id}`,E=(c.relations??[]).filter(S=>S.type==="supersedes").map(S=>S.to);return e("div",{style:{border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-sm)",padding:"10px 12px",opacity:u?.75:1},children:[e("button",{"aria-expanded":g,"aria-controls":f,onClick:()=>a(c.id),style:{display:"flex",alignItems:"center",gap:8,width:"100%",background:"transparent",border:"none",padding:0,cursor:"pointer",color:"inherit",textAlign:"left",fontFamily:"inherit"},children:[e("span",{"aria-hidden":"true",style:{color:"var(--text-3)",fontSize:10,width:10,flexShrink:0},children:g?"▾":"▸"}),e(et,{type:c.type,size:14}),e("span",{style:{fontFamily:"var(--font-memory)",fontSize:15,color:"var(--text-0)",flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:ge(c)}),e("span",{style:{fontFamily:"var(--mono)",fontSize:14,color:"var(--text-3)",flexShrink:0},children:c.created_at.slice(0,10)}),e("span",{style:{fontSize:14,padding:"2px 8px",borderRadius:9999,flexShrink:0,background:u?"var(--neutral-soft)":"var(--life-soft)",color:u?"var(--text-2)":"var(--life)"},children:n(u?"adr.statusSuperseded":"adr.statusActive")})]}),g&&e("div",{id:f,style:{marginTop:8,paddingLeft:18},children:[c.observations.map((S,P)=>e("p",{style:{fontFamily:"var(--font-memory)",fontSize:15,lineHeight:1.6,color:"var(--text-1)",margin:"0 0 6px"},children:S},P)),e(Fo,{entity:c}),(E.length>0||h.length>0)&&e("div",{style:{fontSize:14,color:"var(--text-2)",marginTop:6,display:"flex",flexDirection:"column",gap:3},children:[E.map(S=>e("span",{children:[n("adr.supersedes")," → ",m(S)]},`s-${S}`)),h.map(S=>e("span",{children:[n("adr.supersededBy")," → ",m(S.name)]},`b-${S.id}`))]})]})]},c.id)})})}function Vn({projectName:t,phases:o,entities:s,onNodeClick:i}){const a=o.map(()=>[]);for(const x of s){const N=o.findIndex(j=>x.created_at>=j.startIso&&x.created_at<=j.endIso);N>=0&&a[N].push(x)}for(const x of a)x.sort((N,j)=>{const z=we(N.type)-we(j.type);return z!==0?z:j.created_at.localeCompare(N.created_at)});const r=6,l=a.map(x=>({shown:x.slice(0,r),extra:Math.max(0,x.length-r)})),d=Math.max(900,o.length*360),m=600,c=d/2,h=50,u=(d-o.length*360)/2,g=14,f=X(null),E=X({width:d,height:m});E.current={width:d,height:m};const[S,P]=b(1),[_,T]=b(0),[R,L]=b(0),A=X(S),p=X({x:_,y:R});A.current=S,p.current={x:_,y:R};const v=X({active:!1,lastX:0,lastY:0}),[C,k]=b(!1),D=.25,y=4,M=(x,N)=>{const j=f.current;if(!j)return{x:0,y:0};const z=j.getBoundingClientRect();return z.width===0||z.height===0?{x:0,y:0}:{x:(x-z.left)/z.width*E.current.width,y:(N-z.top)/z.height*E.current.height}};W(()=>{const x=f.current;if(!x)return;const N=j=>{j.preventDefault();const z=A.current,ee=p.current,F=Math.exp(-j.deltaY*.0015),se=Math.max(D,Math.min(y,z*F));if(se===z)return;const{x:ce,y:ie}=M(j.clientX,j.clientY),re=(ce-ee.x)/z,fe=(ie-ee.y)/z;P(se),T(ce-re*se),L(ie-fe*se)};return x.addEventListener("wheel",N,{passive:!1}),()=>x.removeEventListener("wheel",N)},[]);const B=x=>{let j=x.target;for(;j&&j!==f.current;){if(j.style?.cursor==="pointer")return;j=j.parentElement}x.preventDefault(),v.current.active=!0,v.current.lastX=x.clientX,v.current.lastY=x.clientY,k(!0)},O=x=>{if(!v.current.active)return;const N=f.current;if(!N)return;const j=N.getBoundingClientRect();if(j.width===0||j.height===0)return;const z=(x.clientX-v.current.lastX)/j.width*d,ee=(x.clientY-v.current.lastY)/j.height*m;v.current.lastX=x.clientX,v.current.lastY=x.clientY,T(F=>F+z),L(F=>F+ee)},V=()=>{v.current.active&&(v.current.active=!1,k(!1))},J=()=>{P(1),T(0),L(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:J,title:n("roadmap.resetHint"),style:{position:"absolute",top:8,right:8,zIndex:2,padding:"4px 10px",fontSize:14,fontFamily:"inherit",background:"rgba(0,0,0,0.4)",color:"var(--text-1)",border:"1px solid var(--border-subtle)",borderRadius:"var(--radius-xs)",cursor:"pointer"},children:n("roadmap.resetView")}),e("div",{style:{position:"absolute",bottom:8,left:12,zIndex:2,fontSize:14,fontFamily:"var(--mono)",color:"var(--text-3)",pointerEvents:"none"},children:n("roadmap.zoomHint",{pct:Math.round(S*100)})}),e("div",{style:{overflowX:"auto",overflowY:"hidden"},children:e("svg",{ref:f,viewBox:`0 0 ${d} ${m}`,width:d,height:m,style:{display:"block",width:d,minWidth:d,height:m,minHeight:m,cursor:C?"grabbing":"grab",userSelect:"none",touchAction:"pan-x"},onMouseDown:B,onMouseMove:O,onMouseUp:V,onMouseLeave:V,onDblClick:J,children:e("g",{transform:`translate(${_} ${R}) scale(${S})`,children:[o.map((x,N)=>{const j=u+N*360+180,z=160;return e("path",{d:`M ${c} ${h} Q ${(c+j)/2} ${(h+z)/2-10} ${j} ${z}`,fill:"none",stroke:"rgba(143, 242, 92, 0.4)",strokeWidth:1.5},`p-${N}`)}),o.map((x,N)=>{const{shown:j}=l[N],z=u+N*360+180,ee=160;return j.map((F,se)=>{const ce=z-140,ie=240+se*40;return e("path",{d:`M ${z} ${ee} Q ${(z+ce)/2} ${(ee+ie)/2} ${ce} ${ie}`,fill:"none",stroke:"rgba(255,255,255,0.18)",strokeWidth:1},`e-${N}-${F.id}`)})}),e("g",{children:[e("circle",{cx:c,cy:h,r:42,fill:"rgba(143, 242, 92, 0.18)",stroke:"var(--life)",strokeWidth:1.5}),e("text",{x:c,y:h,"text-anchor":"middle","dominant-baseline":"central","font-size":g,"font-weight":600,fill:"var(--text-0)",style:{pointerEvents:"none"},children:t.length>14?t.slice(0,12)+"…":t})]}),o.map((x,N)=>{const j=u+N*360+180,z=160,ee=x.label.length>18?x.label.slice(0,16)+"…":x.label;return e("g",{role:x.anchorId!==void 0?"button":void 0,tabindex:x.anchorId!==void 0?0:void 0,"aria-label":x.anchorId!==void 0?x.label:void 0,style:{cursor:x.anchorId!==void 0?"pointer":"default"},onClick:()=>x.anchorId!==void 0&&i(x.anchorId),onKeyDown:F=>{x.anchorId!==void 0&&(F.key==="Enter"||F.key===" ")&&(F.preventDefault(),i(x.anchorId))},children:[e("circle",{cx:j,cy:z,r:28,fill:"rgba(143, 242, 92, 0.10)",stroke:"var(--life)",strokeWidth:1.25}),e("text",{x:j,y:z-8,"text-anchor":"middle","font-size":g,"font-weight":600,fill:"var(--text-0)",style:{pointerEvents:"none"},children:[e("tspan",{x:j,dy:0,children:ee}),e("tspan",{x:j,dy:18,"font-size":g,fill:"var(--text-3)","font-weight":400,"font-family":"var(--mono)",children:[x.entityCount," · ",x.startIso.slice(5,10)]})]})]},`phase-${N}`)}),o.map((x,N)=>{const{shown:j,extra:z}=l[N],ee=u+N*360+180;return e("g",{children:[j.map((F,se)=>{const ce=ee-140,ie=240+se*40,re=ge(F),fe=re.length>22?re.slice(0,20)+"…":re;return e("g",{role:"button",tabindex:0,"aria-label":`${re} (${ue(F.type)})`,style:{cursor:"pointer"},onClick:()=>i(F.id),onKeyDown:Se=>{(Se.key==="Enter"||Se.key===" ")&&(Se.preventDefault(),i(F.id))},children:[e("title",{children:`${re} (${F.type})`}),e("circle",{cx:ce,cy:ie,r:4,fill:"var(--text-2)"}),e("text",{x:ce+12,y:ie,"text-anchor":"start","dominant-baseline":"middle","font-size":g,fill:"var(--text-1)",style:{pointerEvents:"none"},children:fe})]},F.id)}),z>0&&(()=>{const F=ee-128,se=240+j.length*40;return e("text",{x:F,y:se,"text-anchor":"start","font-size":g,fill:"var(--text-3)","font-style":"italic",children:n("roadmap.moreEntities",{count:z})})})()]},`leaves-${N}`)})]})})})]})}function je({id:t,command:o}){const[s,i]=b(!1);async function a(){try{await navigator.clipboard.writeText(o),i(!0)}catch{i(!1)}}return e("div",{"data-external-handoff":t,"data-destination":"terminal",style:{marginTop:6},children:[e("div",{style:{fontSize:14,color:"var(--warning)",fontWeight:600},children:n("handoff.terminal")}),e("div",{style:{fontSize:14,color:"var(--text-3)",margin:"2px 0 5px"},children:n("handoff.terminalPrereq")}),e("div",{style:{display:"flex",gap:6,alignItems:"center",flexWrap:"wrap"},children:[e("code",{style:{fontFamily:"var(--mono)",fontSize:14},children:o}),e("button",{type:"button",class:"btn btn-sm",onClick:()=>{a()},children:n(s?"handoff.commandCopied":"handoff.copyCommand")})]})]})}function Go({id:t}){return e("span",{"data-external-handoff":t,"data-destination":"github",style:{fontSize:14,color:"var(--text-3)"},children:n("handoff.github")})}const $n=2e3;function Kn(){try{return new URLSearchParams(window.location.search).get("project")}catch{return null}}function Yn(t){try{const o=new URL(window.location.href);o.searchParams.set("project",t),history.replaceState(null,"",o)}catch{}}function Zn(t,o){if(!o)return[];const s=l=>!!l.archived||l.status==="archived",i=t.filter(l=>!s(l)&&Qe(l)===o),a=new Set;for(const l of i)for(const d of l.relations??[])(d.type==="supersedes"||d.type==="contradicts")&&a.add(d.to);const r=t.filter(l=>s(l)&&a.has(l.name)&&Qe(l)===o);return[...i,...r].sort((l,d)=>d.created_at.localeCompare(l.created_at))}const Xn=["goal","next","blocked","done"];function Jn({data:t,error:o}){if(o)return e("div",{class:"card",children:e("div",{class:"error-box",role:"alert",children:o})});if(!t)return e("div",{class:"card",children:e(Tt,{})});const s=Xn.filter(i=>typeof t.state[i]=="string"&&t.state[i].trim().length>0);return e("section",{class:"card","aria-labelledby":"task-state-title",children:[e("h3",{id:"task-state-title",style:{margin:"0 0 8px",fontSize:15},children:n("project.taskState.title")}),s.length===0?e("p",{style:{margin:0,color:"var(--text-2)"},children:n("project.taskState.empty")}):e(q,{children:[e("dl",{style:{display:"grid",gridTemplateColumns:"max-content 1fr",gap:"6px 16px",margin:0},children:s.map(i=>e(q,{children:[e("dt",{style:{color:i==="blocked"?"var(--amber)":"var(--text-3)",fontSize:14},children:n(`project.taskState.${i}`)}),e("dd",{style:{margin:0,color:"var(--text-1)"},children:t.state[i]})]},i))}),e("p",{style:{margin:"10px 0 0",fontSize:14,color:"var(--text-3)"},children:[t.state.updated_at?`${n("project.taskState.updated",{when:ve(t.state.updated_at)})} · `:"",n("project.taskState.provenance")]})]})]})}const Qn=/^(.*?)(\s\[mem:\d{1,10}\])$/;function Ue(t){return t.split("`").map((o,s)=>s%2===1?e("code",{style:{fontFamily:"var(--mono)",fontSize:14},children:o},s):e(q,{children:o},s))}function Tt(){return e("div",{class:"loading",role:"status","aria-label":n("common.loading")})}function ea({data:t,error:o}){if(o)return e("div",{class:"card",style:{marginTop:12},children:e("div",{class:"error-box",role:"alert",children:o})});if(!t)return e("div",{class:"card",style:{marginTop:12},children:e(Tt,{})});const s=t.lines.map(a=>Qn.exec(a)).filter(a=>a!==null);if(s.length!==t.shown)return console.warn("[memesh dashboard] /v1/briefing-index rendered",t.shown,"memory lines but this bundle recognised",s.length),e("div",{class:"card",style:{marginTop:12},children:e("div",{class:"error-box",role:"alert",children:Q("unreadable")})});const i=t.truncated?"+":"";return e("section",{class:"card",style:{marginTop:12},"aria-labelledby":"briefing-index-title",children:[e("h3",{id:"briefing-index-title",style:{margin:"0 0 8px",fontSize:15},children:n("project.index.title")}),t.shown===0?e("p",{style:{margin:0,color:"var(--text-2)"},children:Ue(n("project.index.empty"))}):e("ul",{style:{margin:0,paddingLeft:18,display:"grid",gap:4},children:s.map(([a,r,l])=>e("li",{style:{fontFamily:"var(--font-memory)",fontSize:15,lineHeight:1.6,color:"var(--text-1)",overflowWrap:"anywhere"},children:[r.replace(/^- /,""),e("span",{style:{fontFamily:"var(--mono)",fontSize:14,color:"var(--text-3)"},children:l})]},a))}),t.more>0&&e("p",{style:{margin:"8px 0 0",fontSize:14,color:"var(--text-3)"},children:Ue(n("project.index.more",{n:`\`${t.more}${i}\``}))}),t.older>0&&e("p",{style:{margin:"8px 0 0",fontSize:14,color:"var(--text-3)"},children:Ue(n("project.index.older",{n:`\`${t.older}${i}\``,days:`\`${t.staleDays}\``}))}),e("p",{style:{margin:"10px 0 0",fontSize:14,color:"var(--text-3)"},children:Ue(n("project.index.cost",{tokens:`\`${t.tokens}\``,bytes:`\`${t.bytes}\``}))})]})}function lo(t,o,s){const[i,a]=b(null),[r,l]=b("");return W(()=>{if(a(null),l(""),!o)return;let d=!1;return t(o).then(m=>{d||a(m)},m=>{d||l(Q(pe(m)))}),()=>{d=!0}},[o,s]),[i,r]}function ta({health:t,dataRevision:o=0}){const[s,i]=b([]),[a,r]=b([]),[l,d]=b(Kn),[m,c]=b(!0),[h,u]=b(""),[g,f]=b(""),E=X(0);W(()=>{const L=++E.current;c(!0),u(""),f(""),Promise.all([I("GET",`/v1/entities?limit=${$n}&status=all`),zo().then(A=>({ok:!0,list:A}),A=>({ok:!1,failure:pe(A)}))]).then(([A,p])=>{L===E.current&&(Array.isArray(A)?i(A):u(Q("unreadable")),p.ok?(r(p.list),p.list.length===1&&d(v=>v??p.list[0].name)):f(Q(p.failure)))}).catch(A=>{L===E.current&&u(Q(pe(A)))}).finally(()=>{L===E.current&&c(!1)})},[o]);const S=K(()=>Zn(s,l),[s,l]),[P,_]=lo(xs,l,o),[T,R]=lo(Ss,l,o);return m&&s.length===0?e("div",{class:"empty",children:e("div",{class:"loading"})}):h&&s.length===0?e("div",{class:"error-box",role:"alert",children:h}):s.length===0&&t==null?e("div",{class:"empty",children:e("div",{class:"loading"})}):t?.entity_count===0?e(Oo,{}):g&&a.length===0?e("div",{class:"error-box",role:"alert",children:g}):a.length===0?e("div",{class:"empty",children:[e("div",{children:n("project.empty")}),e(je,{id:"project-hook-setup",command:"memesh install-hooks"})]}):e("div",{children:[m&&e(Tt,{}),h&&e("div",{class:"error-box",role:"alert",children:h}),g&&e("div",{class:"error-box",role:"alert",children:g}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginBottom:12,alignItems:"center"},children:[e("span",{style:{fontSize:14,color:"var(--text-3)",marginRight:4},children:n("project.selectLabel")}),a.map(L=>e(te,{label:L.name,count:L.count,active:l===L.name,onClick:()=>{d(L.name),Yn(L.name)}},L.name))]}),l?e(q,{children:[e(Jn,{data:P,error:_}),e(ea,{data:T,error:R}),e("div",{class:"card",style:{marginTop:12},children:e(Gn,{projectName:l,entities:S})})]}):e("div",{class:"empty",children:n("project.selectPrompt")})]})}function oa(){const[t,o]=b(!1),[s,i]=b(!1),[a,r]=b(null);return W(()=>{if(!t)return;let l=!0;return i(!0),r(null),I("GET","/v1/doctor").then(d=>{const m=d?.checks?.find(c=>c.code==="shell-cli.versions")?.params;l&&m&&["current","terminal","shellPath","packageRoot"].every(c=>typeof m[c]=="string")&&r(m)}).catch(()=>{}).finally(()=>{l&&i(!1)}),()=>{l=!1}},[t]),e("section",{class:"card",children:[e("button",{type:"button",class:"btn","aria-expanded":t,"aria-controls":"installation-details",onClick:()=>o(!t),children:n("settings.installationDetails")}),t&&e("div",{id:"installation-details",style:{marginTop:12},children:s?e("p",{children:n("common.loading")}):a?e(q,{children:[e("p",{children:n("doctor.msg.shell-cli.versions.summary",{current:a.current,terminal:a.terminal})}),e("p",{children:n("settings.installationDetailsHint")}),e("details",{children:[e("summary",{children:n("settings.technicalDetails")}),e("dl",{children:[e("dt",{children:n("settings.interfacePath")}),e("dd",{children:e("code",{children:a.packageRoot})}),e("dt",{children:n("settings.terminalPath")}),e("dd",{children:e("code",{children:a.shellPath})})]})]})]}):e("p",{role:"status",children:n("settings.installationDetailsUnavailable")})})]})}function mo(t){return typeof t?.config=="object"&&t.config!==null}function sa(t){return typeof t?.checkSucceeded=="boolean"&&typeof t.freshness=="string"&&typeof t.updateAvailable=="boolean"}function uo(t,o){if(!o)return"—";const s=new Date(o);return Number.isNaN(s.getTime())?o:s.toLocaleString(t)}function na(t){switch(t){case"npm-global":return n("settings.installNpmGlobal");case"npm-local":return n("settings.installNpmLocal");case"source-checkout":return n("settings.installSourceCheckout");default:return n("settings.installUnknown")}}function aa(t){switch(t){case"npm-global":return n("settings.updateGuidanceNpmGlobal");case"npm-local":return n("settings.updateGuidanceNpmLocal");case"source-checkout":return n("settings.updateGuidanceSourceCheckout");default:return n("settings.updateGuidanceUnknown")}}function ia({locale:t,onLocaleChange:o}){const[s,i]=b(null),[a,r]=b(null),[l,d]=b(!0),[m,c]=b(!1),[h,u]=b(""),[g,f]=b(!0),[E,S]=b(!1);async function P(j=!0,z=!1){z?S(!0):f(!0);try{const F=await I("GET",j?"/v1/update-status":"/v1/update-status?cached=1");if(!sa(F)){console.warn("[memesh dashboard] /v1/update-status answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",F),z||r(null);return}r(F)}catch{z||r(null)}finally{z?S(!1):f(!1)}}W(()=>{let j=!1;return d(!0),I("GET","/v1/config").then(z=>{if(!j){if(!mo(z)){z!==null&&console.warn("[memesh dashboard] /v1/config answered, but with a shape this bundle cannot render — stale bundle or version skew, not an outage:",z),i(null);return}i(z)}}).catch(z=>{console.warn("[memesh dashboard] /v1/config failed to load:",z),i(null)}).finally(()=>{j||d(!1)}),P(),()=>{j=!0}},[]);async function _(j){c(!0),u("");try{await I("POST","/v1/config",{autoUpdate:j});const z=await I("GET","/v1/config");if(!mo(z)||z.config.autoUpdate!==j)throw new Error(n("settings.configReadbackFailed"));i(z),u(n("settings.saved"))}catch(z){u(n("common.error")+": "+de(z))}finally{c(!1)}}function T(j){hs(j),o(j)}const R=g||E&&!a,L=g||E,A=!!a?.currentVersionDeprecated,p=!!(a?.latestVersion&&a.updateAvailable),v=!!(A&&a?.latestVersion&&a.latestVersion===a.currentVersion&&a?.freshness==="fresh"),C=!!(a?.checkSucceeded&&a?.lastError),k=R?n("settings.updateChecking"):a?A?n(p?"settings.updateAvailable":v?"settings.updateDeprecatedNoTarget":"settings.updateDeprecatedTargetUnknown"):a.freshness==="unavailable"?n(a.lastError?"settings.updateUnavailable":"settings.updateNoSuccessfulChecks"):!a.checkSucceeded&&a.freshness==="stale"?n("settings.updateStale"):!a.checkSucceeded&&a.freshness==="cached"?n("settings.updateCachedFallback"):a.updateAvailable?n("settings.updateAvailable"):n(C?"settings.updatePartialSummary":"settings.upToDate"):n("settings.updateUnavailable"),D=a?A?"var(--danger)":a.freshness==="unavailable"||!a.checkSucceeded&&a.freshness==="stale"?"var(--warning)":!a.checkSucceeded&&a.freshness==="cached"||a.updateAvailable?"var(--info)":C?"var(--warning)":"var(--success)":"var(--warning)",y=a?.freshness==="stale"?n("settings.updateSourceStale"):a?.source==="cache"?n("settings.updateSourceCached"):a?.source==="fresh"?n("settings.updateSourceFresh"):n("settings.updateSourceUnavailable"),M=na(a?.installChannel),B=aa(a?.installChannel),O=R?n("common.loading"):uo(t,a?.lastAttemptAt||null),V=R?n("common.loading"):uo(t,a?.lastSuccessfulCheckAt||null),J=!!a?.lastSuccessfulCheckAt,x=!!a?.lastError&&!R,N=!l&&!s;return e("div",{style:{display:"grid",gap:12},children:[e(oa,{}),e("div",{class:"card",children:[e("div",{class:"card-title",children:n("settings.updates")}),a?.currentVersionDeprecated&&a.deprecationMessage&&e("div",{style:{background:"var(--danger-soft)",border:"1px solid rgba(255, 122, 107, 0.4)",borderRadius:"var(--radius-xs)",padding:"10px 12px",marginBottom:12,fontSize:14,color:"var(--text-0)",lineHeight:1.55},"data-testid":"settings-deprecation-warning",children:[e("strong",{style:{color:"var(--danger)"},children:n("settings.updateDeprecatedTitle",{version:a.currentVersion})}),e("div",{style:{marginTop:4,opacity:.9},children:a.deprecationMessage})]}),a&&a.checkSucceeded&&a.lastError&&e("div",{style:{background:"var(--warning-soft)",border:"1px solid rgba(255, 171, 64, 0.4)",borderRadius:"var(--radius-xs)",padding:"10px 12px",marginBottom:12,fontSize:14,color:"var(--text-0)",lineHeight:1.55},"data-testid":"settings-update-partial-warning",children:[e("strong",{style:{color:"var(--warning)"},children:n("settings.updatePartialTitle")}),e("div",{style:{marginTop:4,opacity:.9},children:n("settings.updatePartialDescription")})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,alignItems:"baseline",marginBottom:12,flexWrap:"wrap"},children:[e("div",{style:{color:D,fontSize:16,fontWeight:600},children:k}),e("div",{style:{display:"flex",gap:10,alignItems:"center",flexWrap:"wrap"},children:[!R&&a&&e("div",{style:{fontSize:14,color:"var(--text-2)"},children:y}),e("button",{class:"btn btn-sm",type:"button",onClick:()=>{P(!0,!!a)},disabled:L,children:n(L?"settings.updateChecking":"settings.checkNow")})]})]}),e("div",{style:{display:"grid",gap:10},children:[e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:14},children:[e("span",{style:{color:"var(--text-2)"},children:n("settings.installMethod")}),e("span",{style:{color:"var(--text-0)"},children:R?n("common.loading"):M})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:14},children:[e("span",{style:{color:"var(--text-2)"},children:n("settings.currentVersion")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:a?.currentVersion||"—"})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:14},children:[e("span",{style:{color:"var(--text-2)"},children:n("settings.latestVersion")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:a?.latestVersion||"—"})]}),e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:14},children:[e("span",{style:{color:"var(--text-2)"},children:n("settings.lastAttempted")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:O})]}),J&&e("div",{style:{display:"flex",justifyContent:"space-between",gap:16,fontSize:14},children:[e("span",{style:{color:"var(--text-2)"},children:n("settings.lastSuccessful")}),e("span",{style:{color:"var(--text-0)",fontFamily:"var(--mono)"},children:V})]}),!g&&a?.updateAvailable&&e("div",{style:{color:"var(--text-2)",fontSize:14,lineHeight:1.5,marginTop:2},children:B}),x&&e("div",{style:{color:"var(--warning)",fontSize:14,lineHeight:1.5},children:[e("div",{role:"alert",children:n("settings.updateRetryGuidance")}),e("details",{style:{marginTop:6},children:[e("summary",{style:{cursor:"pointer"},children:n("settings.technicalDetails")}),e("div",{style:{overflowWrap:"anywhere",marginTop:6},children:n("settings.updateLastError",{message:a?.lastError||""})})]})]}),a?.updateAvailable&&a.recommendedCommand&&e("div",{style:{display:"grid",gap:6,marginTop:4},children:[e("span",{style:{color:"var(--text-2)",fontSize:14},children:n("settings.updateCommand")}),e(je,{id:"settings-update",command:a.recommendedCommand})]})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:n("settings.behaviourTitle")}),e("div",{style:{marginTop:8},children:[l&&e("div",{class:"loading",role:"status"}),e("label",{id:"settings-autoupdate-label",style:{fontSize:14,color:"var(--text-2)",display:"block",marginBottom:4},children:n("settings.autoUpdateLabel")}),e("select",{"aria-labelledby":"settings-autoupdate-label",value:s?s.config.autoUpdate??"off":"",disabled:!s||m,onChange:j=>{_(j.target.value)},style:{fontSize:16,padding:"6px 10px",borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--bg-input)",color:"var(--text-1)",cursor:"pointer"},children:[!s&&e("option",{value:"",disabled:!0,children:n(l?"common.loading":"common.unknown")}),e("option",{value:"off",children:n("settings.autoUpdateOff")}),e("option",{value:"patch",children:n("settings.autoUpdatePatch")}),e("option",{value:"minor",children:n("settings.autoUpdateMinor")}),e("option",{value:"major",children:n("settings.autoUpdateMajor")})]}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:4},children:n("settings.autoUpdateHint")}),(N||h)&&e("div",{role:N||h.startsWith(n("common.error"))?"alert":"status",style:{marginTop:8,fontSize:14},children:N?n("common.error")+": "+n("settings.configLoadFailed"):h})]})]}),e("div",{class:"card",children:[e("div",{class:"card-title",children:n("settings.language")}),e("div",{style:{display:"grid",gap:12},children:e("div",{children:[e("label",{id:"settings-interface-language-label",style:{fontSize:14,color:"var(--text-2)",display:"block",marginBottom:4},children:n("settings.interfaceLanguage")}),e("select",{"aria-labelledby":"settings-interface-language-label",value:t,onChange:j=>T(j.target.value),style:{fontSize:16,padding:"6px 10px",borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--bg-input)",color:"var(--text-1)",cursor:"pointer"},children:ps().map(j=>e("option",{value:j.code,children:j.name},j.code))}),e("div",{style:{fontSize:14,color:"var(--text-3)",marginTop:4},children:n("settings.interfaceLanguageHint")})]})})]})]})}function Wo(t){const o=window.open(t,"_blank");if(!o)return!1;try{o.opener=null}catch{}return!0}function ra(t){return[...t.matchAll(/`(memesh(?:\s+[^`]+)?)`/g)].map(o=>o[1])}const ca=["bug","feature","question"],ho={bug:"feedback.bug",feature:"feedback.feature",question:"feedback.question"};function la({health:t}){const[o,s]=b(!1),[i,a]=b("bug"),[r,l]=b(""),[d,m]=b(!0),[c,h]=b(!1),[u,g]=b(""),[f,E]=b(""),[S,P]=b(!1),_=X(null),T=X(null),R=X(null),L=()=>{s(!1),T.current?.focus()};W(()=>{if(!o)return;R.current?.focus();const C=D=>{const y=D.target;T.current?.contains(y)||_.current&&!_.current.contains(y)&&s(!1)},k=D=>{D.key==="Escape"&&(D.preventDefault(),L())};return document.addEventListener("mousedown",C),document.addEventListener("keydown",k),()=>{document.removeEventListener("mousedown",C),document.removeEventListener("keydown",k)}},[o]);function A(C){const k=C.checks.find(O=>O.id==="install_id"),M=C.checks.filter(O=>O.id!=="install_id").sort((O,V)=>{const J={fail:0,warn:1,pass:2};return(J[O.status]??3)-(J[V.status]??3)}).map(O=>{const V=O.status==="fail"?"❌":O.status==="warn"?"⚠️":"✅",J=O.fix?` _Fix: ${O.fix}_`:"";return`- ${V} **${O.label}**: ${O.summary}${J}`}),B=k?`
14
+ _Anonymous install ID: \`${(k.summary.match(/[0-9a-f-]{36}/)??["(unavailable)"])[0]}\` — included only because you checked "Include system info"._
15
+ `:"";return`**Diagnostics** (overall: ${C.status})${B}
16
16
  ${M.join(`
17
- `)}`}const p=async()=>{if(!(!r.trim()||c)){h(!0),R(""),D(!1);try{const E=`feedback,from-dashboard,${i}`;let w=r.trim();if(d&&t){w+=`
17
+ `)}`}const p=async()=>{if(!(!r.trim()||c)){h(!0),E(""),P(!1);try{const C=`feedback,from-dashboard,${i}`;let k=r.trim();if(d&&t){k+=`
18
18
 
19
19
  ---
20
20
  **System Info**
21
21
  - Version: \`${t.version}\`
22
22
  - Entities: ${t.entity_count}
23
23
  - Platform: \`${navigator.platform}\`
24
- - User Agent: \`${navigator.userAgent}\``;try{const M=await te("GET","/v1/doctor");w+=`
24
+ - User Agent: \`${navigator.userAgent}\``;try{const M=await I("GET","/v1/doctor");k+=`
25
25
 
26
- ${j(M)}`}catch{}}const I=s(zn[i]),v=`https://github.com/PCIRCLE-AI/memesh/issues/new?title=${encodeURIComponent(`[${I}] `)}&body=${encodeURIComponent(w)}&labels=${encodeURIComponent(E)}`;if(!ps(v)){g(v),R(s("feedback.popupBlocked"));return}g(""),l(""),n(!1)}finally{h(!1)}}},x=async()=>{if(u)try{await navigator.clipboard.writeText(u),D(!0)}catch{R(s("feedback.copyFailed"))}};return e(Q,{children:[e("button",{ref:L,class:"fb-btn",onClick:()=>n(!o),"aria-haspopup":"dialog","aria-expanded":o,"aria-controls":"fb-panel",children:s("feedback.button")}),o&&e("div",{class:"fb-panel",ref:A,role:"dialog",id:"fb-panel","aria-labelledby":"fb-title",children:[e("h3",{class:"fb-title",id:"fb-title",children:s("feedback.title")}),e("div",{class:"fb-types",children:Ji.map(E=>e("label",{class:`fb-type ${i===E?"selected":""}`,children:[e("input",{type:"radio",name:"fb-type",value:E,checked:i===E,onChange:()=>a(E)}),s(zn[E])]},E))}),e("textarea",{ref:B,class:"fb-desc","aria-label":s("feedback.descLabel"),placeholder:s("feedback.placeholder"),value:r,onInput:E=>l(E.target.value)}),e("label",{class:"fb-sys-row",children:[e("input",{type:"checkbox",checked:d,onChange:()=>m(!d)}),s("feedback.includeSys")]}),e(ds,{id:"feedback-submit"}),e("button",{class:"btn btn-primary fb-submit",onClick:p,disabled:c,children:s(c?"feedback.submitting":"feedback.submit")}),f&&e("div",{role:"alert",class:"fb-handoff-error",children:[e("div",{children:f}),u&&e("div",{class:"fb-handoff-actions",children:[e("a",{href:u,target:"_blank",rel:"noopener noreferrer",children:s("feedback.retry")}),e("button",{type:"button",class:"btn btn-sm",onClick:x,children:s(C?"feedback.linkCopied":"feedback.copyLink")})]})]})]})]})}function er({currentToken:t,onSubmit:o,rejected:n=!1}){const[i,a]=b(t??""),[r,l]=b(!1);function d(u){u.preventDefault(),l(!0),i.trim()&&o(i.trim())}const m=r&&!i.trim(),c=n&&!m,h=m||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:s("auth.title")}),e("p",{children:s("auth.intro")}),e("label",{children:[e("span",{children:s("auth.tokenLabel")}),e("input",{type:"password",autocomplete:"off",value:i,onInput:u=>a(u.target.value),placeholder:s("auth.tokenPlaceholder"),"aria-invalid":h!==void 0,"aria-describedby":h,autofocus:!0})]}),m&&e("p",{class:"auth-prompt-error",id:h,role:"alert",children:s("auth.empty")}),c&&e("p",{class:"auth-prompt-error",id:h,role:"alert",children:s("auth.invalid")}),e("button",{type:"submit",class:"auth-prompt-submit",children:s("auth.submit")})]})})}const Dn="memesh.onboardingDismissed";function Hn({health:t}){const[o,n]=b(()=>{try{return localStorage.getItem(Dn)==="true"}catch{return!1}}),[i,a]=b(null),[r,l]=b("");if(!t)return null;const d=t.demo_entity_count??0,m=t.entity_count===0&&!o,c=d>0;if(!m&&!c)return null;function h(){n(!0);try{localStorage.setItem(Dn,"true")}catch{}}async function u(){l(""),a("seed");try{await te("POST","/v1/demo/seed"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(f){l(qe(f))}finally{a(null)}}async function g(){if(confirm(s("onboarding.resetConfirm"))){l(""),a("reset");try{if(await te("POST","/v1/demo/reset"),((await te("GET","/v1/health")).demo_entity_count??0)!==0)throw new Error(s("onboarding.resetReadbackFailed"));window.dispatchEvent(new Event("memesh:data-changed"))}catch(f){l(qe(f))}finally{a(null)}}}return e("div",{role:"region","aria-label":s(c?"onboarding.demoLoadedTitle":"onboarding.title"),style:{position:"relative",margin:"12px auto 8px",maxWidth:920,padding:"14px 18px",border:"1px solid rgba(143, 242, 92, 0.28)",borderRadius:"var(--radius)",background:"var(--life-soft)",color:"var(--text-1)"},children:[m&&e("button",{type:"button",onClick:h,"aria-label":s("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:s(c?"onboarding.demoLoadedTitle":"onboarding.title")}),e("div",{style:{fontSize:14,lineHeight:1.55,color:"var(--text-1)"},children:c?s("onboarding.demoLoadedBody",{count:d}):s("onboarding.body")}),m&&e("ul",{style:{fontSize:14,lineHeight:1.55,color:"var(--text-3)",margin:"6px 0 0",paddingLeft:18},children:[e("li",{children:s("onboarding.coreHint")}),e("li",{children:s("onboarding.searchHint")}),e("li",{children:s("onboarding.reviewHint")})]}),m&&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:s(i==="seed"?"onboarding.seedingButton":"onboarding.seedButton")}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:s("onboarding.seedHint")})]}),c&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:10,marginTop:12,alignItems:"center"},children:[e("button",{type:"button",class:"btn",onClick:g,disabled:i!==null,children:s(i==="reset"?"onboarding.resettingButton":"onboarding.resetButton")}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:s("onboarding.hintReset")})]}),m&&e("details",{style:{marginTop:10,fontSize:14,color:"var(--text-3)"},children:[e("summary",{style:{cursor:"pointer"},children:s("onboarding.cliReference")}),e(ht,{id:"demo-cli-fallback",command:"memesh demo"}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:12,marginTop:8},children:e("span",{style:{fontSize:14,color:"var(--text-3)"},children:s("onboarding.hintDemo")})}),e(ht,{id:"demo-cli-fallback",command:"memesh demo --reset --yes"}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:12,marginTop:8,alignItems:"center"},children:[e("button",{type:"button",class:"btn",onClick:g,disabled:i!==null,style:{fontSize:14,padding:"4px 10px"},children:s(i==="reset"?"onboarding.resettingButton":"onboarding.resetButton")}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:s("onboarding.hintReset")})]})]}),r&&e("div",{role:"alert",style:{marginTop:10,fontSize:14,color:"var(--danger)"},children:r})]})}const Nn="memesh.doctorBanner.dismissedSig";function Do(t,o,n){const i=s(t,n);return i===t?o:i}function tr(t){return t.code?Do(`doctor.msg.${t.code}.summary`,t.summary,t.params):t.summary}function or(t){if(t.fix)return t.code?Do(`doctor.msg.${t.code}.fix`,t.fix,t.params):t.fix}function nr(t){const o=t.id.startsWith("plugin-cache-")?"plugin-cache":t.id;return Do(`doctor.label.${o}`,t.label)}const sr=new Set(["update-status.no-cache","update-status.stale","update-status.deprecation-unknown","hook-activity.not-wired","shell-cli.not-on-path","skills-manifest.missing-dev","install-channel.unknown","mcp-config.placeholder-unresolved","http-probe.no-server","readme-parity.unreadable","readme-parity.drift"]);function ar(t){if(t.status==="fail")return!0;if(t.status!=="warn"||t.code&&sr.has(t.code)||!t.fix)return!1;const o=t.fix.trim().toLowerCase();return!(!o||o==="no action needed"||o.startsWith("no action"))}function ir(){const[t,o]=b(null),[n,i]=b(()=>{try{return localStorage.getItem(Nn)??""}catch{return""}}),[a,r]=b(""),[l,d]=b(!1),[m,c]=b(null),[h,u]=b(null),[g,f]=b(null);if(Z(()=>{let E=!0;const w=()=>{te("GET","/v1/doctor").then(v=>{E&&o(Array.isArray(v?.checks)?v:null)}).catch(()=>{})};w();const I=()=>w();return window.addEventListener("memesh:data-changed",I),()=>{E=!1,window.removeEventListener("memesh:data-changed",I)}},[]),!t||t.status==="PASS")return null;const R=t.checks.filter(ar);if(R.length===0)return null;const C=R.map(E=>`${E.id}:${E.status}:${E.code??""}:${E.params?.hook??""}`).sort().join("|");if(C===n)return null;function D(){i(C);try{localStorage.setItem(Nn,C)}catch{}}function A(){const E=R.map(M=>{const K=M.status==="fail"?"❌":"⚠️",J=M.fix?` _Fix: ${M.fix}_`:"";return`- ${K} **${M.label}**: ${M.summary}${J}`}),w=`${s("doctorBanner.preambleForIssue")}
26
+ ${A(M)}`}catch{}}const D=n(ho[i]),y=`https://github.com/PCIRCLE-AI/memesh/issues/new?title=${encodeURIComponent(`[${D}] `)}&body=${encodeURIComponent(k)}&labels=${encodeURIComponent(C)}`;if(!Wo(y)){g(y),E(n("feedback.popupBlocked"));return}g(""),l(""),s(!1)}finally{h(!1)}}},v=async()=>{if(u)try{await navigator.clipboard.writeText(u),P(!0)}catch{E(n("feedback.copyFailed"))}};return e(q,{children:[e("button",{ref:T,class:"fb-btn",onClick:()=>s(!o),"aria-haspopup":"dialog","aria-expanded":o,"aria-controls":"fb-panel",children:n("feedback.button")}),o&&e("div",{class:"fb-panel",ref:_,role:"dialog",id:"fb-panel","aria-labelledby":"fb-title",children:[e("h3",{class:"fb-title",id:"fb-title",children:n("feedback.title")}),e("div",{class:"fb-types",children:ca.map(C=>e("label",{class:`fb-type ${i===C?"selected":""}`,children:[e("input",{type:"radio",name:"fb-type",value:C,checked:i===C,onChange:()=>a(C)}),n(ho[C])]},C))}),e("textarea",{ref:R,class:"fb-desc","aria-label":n("feedback.descLabel"),placeholder:n("feedback.placeholder"),value:r,onInput:C=>l(C.target.value)}),e("label",{class:"fb-sys-row",children:[e("input",{type:"checkbox",checked:d,onChange:()=>m(!d)}),n("feedback.includeSys")]}),e(Go,{id:"feedback-submit"}),e("button",{class:"btn btn-primary fb-submit",onClick:p,disabled:c,children:n(c?"feedback.submitting":"feedback.submit")}),f&&e("div",{role:"alert",class:"fb-handoff-error",children:[e("div",{children:f}),u&&e("div",{class:"fb-handoff-actions",children:[e("a",{href:u,target:"_blank",rel:"noopener noreferrer",children:n("feedback.retry")}),e("button",{type:"button",class:"btn btn-sm",onClick:v,children:n(S?"feedback.linkCopied":"feedback.copyLink")})]})]})]})]})}function da({currentToken:t,onSubmit:o,rejected:s=!1}){const[i,a]=b(t??""),[r,l]=b(!1);function d(u){u.preventDefault(),l(!0),i.trim()&&o(i.trim())}const m=r&&!i.trim(),c=s&&!m,h=m||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:n("auth.title")}),e("p",{children:n("auth.intro")}),e("label",{children:[e("span",{children:n("auth.tokenLabel")}),e("input",{type:"password",autocomplete:"off",value:i,onInput:u=>a(u.target.value),placeholder:n("auth.tokenPlaceholder"),"aria-invalid":h!==void 0,"aria-describedby":h,autofocus:!0})]}),m&&e("p",{class:"auth-prompt-error",id:h,role:"alert",children:n("auth.empty")}),c&&e("p",{class:"auth-prompt-error",id:h,role:"alert",children:n("auth.invalid")}),e("button",{type:"submit",class:"auth-prompt-submit",children:n("auth.submit")})]})})}const po="memesh.onboardingDismissed";function go({health:t}){const[o,s]=b(()=>{try{return localStorage.getItem(po)==="true"}catch{return!1}}),[i,a]=b(null),[r,l]=b("");if(!t)return null;const d=t.demo_entity_count??0,m=t.entity_count===0&&!o,c=d>0;if(!m&&!c)return null;function h(){s(!0);try{localStorage.setItem(po,"true")}catch{}}async function u(){l(""),a("seed");try{await I("POST","/v1/demo/seed"),window.dispatchEvent(new Event("memesh:data-changed"))}catch(f){l(de(f))}finally{a(null)}}async function g(){if(confirm(n("onboarding.resetConfirm"))){l(""),a("reset");try{if(await I("POST","/v1/demo/reset"),((await I("GET","/v1/health")).demo_entity_count??0)!==0)throw new Error(n("onboarding.resetReadbackFailed"));window.dispatchEvent(new Event("memesh:data-changed"))}catch(f){l(de(f))}finally{a(null)}}}return e("div",{role:"region","aria-label":n(c?"onboarding.demoLoadedTitle":"onboarding.title"),style:{position:"relative",margin:"12px auto 8px",maxWidth:920,padding:"14px 18px",border:"1px solid rgba(143, 242, 92, 0.28)",borderRadius:"var(--radius)",background:"var(--life-soft)",color:"var(--text-1)"},children:[m&&e("button",{type:"button",onClick:h,"aria-label":n("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,minWidth:24,minHeight:24},children:"×"}),e("div",{style:{fontSize:14,fontWeight:600,color:"var(--text-0)",marginBottom:6},children:n(c?"onboarding.demoLoadedTitle":"onboarding.title")}),e("div",{style:{fontSize:14,lineHeight:1.55,color:"var(--text-1)"},children:c?n("onboarding.demoLoadedBody",{count:d}):n("onboarding.body")}),m&&e("ul",{style:{fontSize:14,lineHeight:1.55,color:"var(--text-3)",margin:"6px 0 0",paddingLeft:18},children:[e("li",{children:n("onboarding.coreHint")}),e("li",{children:n("onboarding.searchHint")}),e("li",{children:n("onboarding.reviewHint")})]}),m&&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:n(i==="seed"?"onboarding.seedingButton":"onboarding.seedButton")}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:n("onboarding.seedHint")})]}),c&&e("div",{style:{display:"flex",flexWrap:"wrap",gap:10,marginTop:12,alignItems:"center"},children:[e("button",{type:"button",class:"btn",onClick:g,disabled:i!==null,children:n(i==="reset"?"onboarding.resettingButton":"onboarding.resetButton")}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:n("onboarding.hintReset")})]}),m&&e("details",{style:{marginTop:10,fontSize:14,color:"var(--text-3)"},children:[e("summary",{style:{cursor:"pointer"},children:n("onboarding.cliReference")}),e(je,{id:"demo-cli-fallback",command:"memesh demo"}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:12,marginTop:8},children:e("span",{style:{fontSize:14,color:"var(--text-3)"},children:n("onboarding.hintDemo")})}),e(je,{id:"demo-cli-fallback",command:"memesh demo --reset --yes"}),e("div",{style:{display:"flex",flexWrap:"wrap",gap:12,marginTop:8,alignItems:"center"},children:[e("button",{type:"button",class:"btn",onClick:g,disabled:i!==null,style:{fontSize:14,padding:"4px 10px"},children:n(i==="reset"?"onboarding.resettingButton":"onboarding.resetButton")}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:n("onboarding.hintReset")})]})]}),r&&e("div",{role:"alert",style:{marginTop:10,fontSize:14,color:"var(--danger)"},children:r})]})}const fo="memesh.doctorBanner.dismissedSig";function jt(t,o,s){const i=n(t,s);return i===t?o:i}function ma(t){return t.code?jt(`doctor.msg.${t.code}.summary`,t.summary,t.params):t.summary}function ua(t){if(t.fix)return t.code?jt(`doctor.msg.${t.code}.fix`,t.fix,t.params):t.fix}function ha(t){const o=t.id.startsWith("plugin-cache-")?"plugin-cache":t.id;return jt(`doctor.label.${o}`,t.label)}const pa=new Set(["update-status.no-cache","update-status.stale","update-status.deprecation-unknown","hook-activity.not-wired","shell-cli.not-on-path","skills-manifest.missing-dev","install-channel.unknown","mcp-config.placeholder-unresolved","http-probe.no-server","readme-parity.unreadable","readme-parity.drift"]);function ga(t){if(t.status==="fail")return!0;if(t.status!=="warn"||t.code&&pa.has(t.code)||!t.fix)return!1;const o=t.fix.trim().toLowerCase();return!(!o||o==="no action needed"||o.startsWith("no action"))}function fa(){const[t,o]=b(null),[s,i]=b(()=>{try{return localStorage.getItem(fo)??""}catch{return""}}),[a,r]=b(""),[l,d]=b(!1),[m,c]=b(null),[h,u]=b(null),[g,f]=b(null);if(W(()=>{let C=!0;const k=()=>{I("GET","/v1/doctor").then(y=>{C&&o(Array.isArray(y?.checks)?y:null)}).catch(()=>{})};k();const D=()=>k();return window.addEventListener("memesh:data-changed",D),()=>{C=!1,window.removeEventListener("memesh:data-changed",D)}},[]),!t||t.status==="PASS")return null;const E=t.checks.filter(ga);if(E.length===0)return null;const S=E.map(C=>`${C.id}:${C.status}:${C.code??""}:${C.params?.hook??""}`).sort().join("|");if(S===s)return null;function P(){i(S);try{localStorage.setItem(fo,S)}catch{}}function _(){const C=E.map(M=>{const B=M.status==="fail"?"❌":"⚠️",O=M.fix?` _Fix: ${M.fix}_`:"";return`- ${B} **${M.label}**: ${M.summary}${O}`}),k=`${n("doctorBanner.preambleForIssue")}
27
27
 
28
- ${E.join(`
29
- `)}`,v=`https://github.com/PCIRCLE-AI/memesh/issues/new?title=${encodeURIComponent("[Bug] memesh doctor reported issues")}&body=${encodeURIComponent(w)}&labels=${encodeURIComponent("feedback,from-dashboard,bug,doctor-warning")}`;ps(v)||(r(v),d(!1))}async function L(E){if(!(!E.fixId||m)){c(E.id),u(null),f(null);try{const w=await te("POST","/v1/doctor/fix",{id:E.id});u(E.id),w?.restartRequired&&f(s("doctorBanner.restartRequired")),window.dispatchEvent(new Event("memesh:data-changed"))}catch(w){f(w instanceof Error?w.message:String(w))}finally{c(null)}}}async function B(){if(a)try{await navigator.clipboard.writeText(a),d(!0)}catch{d(!1)}}const F=t.status==="FAIL",j=F?"var(--danger)":"var(--warning)",p=F?"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 ${j}`,borderRadius:"var(--radius)",background:p,color:"var(--text-1)"},children:[e("button",{type:"button",onClick:D,"aria-label":s("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:14,fontWeight:600,color:j,marginBottom:6},children:s(F?"doctorBanner.failTitle":"doctorBanner.warnTitleSoft")}),e("ul",{style:{margin:"6px 0 10px",paddingLeft:18,fontSize:14,lineHeight:1.5,color:"var(--text-2)"},children:[R.slice(0,3).map(E=>{const w=or(E),I=E.fixId==="config-retired-settings"||E.fixId==="plugin-cache-refresh";return e("li",{children:[e("strong",{children:[nr(E),":"]})," ",tr(E),w&&e(Q,{children:[!I&&e(Q,{children:[" — ",e("em",{style:{color:"var(--text-3)"},children:w}),Zi(w).map(v=>e(ht,{id:"doctor-fix-command",command:v},v))]}),I&&e("div",{style:{marginTop:7},children:e("button",{type:"button",class:"btn btn-sm",disabled:m!==null,onClick:()=>{L(E)},children:m===E.id?s("doctorBanner.fixInProgress"):h===E.id?s("doctorBanner.fixDone"):s("doctorBanner.fix")})})]})]},E.id)}),R.length>3&&e("li",{style:{color:"var(--text-3)"},children:s("doctorBanner.moreCount",{n:R.length-3})})]}),g&&e("div",{role:"status",style:{margin:"4px 0 8px",color:"var(--text-2)",fontSize:14},children:g}),F&&e("div",{style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap"},children:[e("button",{type:"button",class:"btn",onClick:A,style:{fontSize:14,padding:"4px 12px"},children:s("doctorBanner.getHelp")}),e(ds,{id:"doctor-help"}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:s("doctorBanner.helpHint")})]}),a&&e("div",{role:"alert",style:{marginTop:8,fontSize:14},children:[e("div",{children:s("feedback.popupBlocked")}),e("a",{href:a,target:"_blank",rel:"noopener noreferrer",children:s("feedback.retry")})," ",e("button",{type:"button",class:"btn btn-sm",onClick:()=>{B()},children:s(l?"feedback.linkCopied":"feedback.copyLink")})]})]})}const Bn="memesh.insightsBanner.dismissed";function rr({currentTab:t,onNavigateToInsights:o}){const[n,i]=b(0),[a,r]=b(()=>{try{return sessionStorage.getItem(Bn)==="true"}catch{return!1}});if(Z(()=>{let m=!0;const c=()=>{te("GET","/v1/dream/proposals?status=pending").then(u=>{if(!m)return;const g=Array.isArray(u)?u:u?.data??[];i(g.length)}).catch(()=>{})};c();const h=()=>c();return window.addEventListener("memesh:data-changed",h),()=>{m=!1,window.removeEventListener("memesh:data-changed",h)}},[]),t==="Home"||a||n===0)return null;function l(m){m.stopPropagation(),r(!0);try{sessionStorage.setItem(Bn,"true")}catch{}}const d=s("banner.pendingInsights",{n,s:n===1?"":"s"});return e("div",{role:"button","aria-label":s("banner.viewAll"),onClick:o,onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),o())},tabIndex:0,style:{position:"relative",margin:"12px auto 0",maxWidth:920,padding:"10px 40px 10px 16px",border:"1px solid rgba(143, 242, 92, 0.32)",borderRadius:"var(--radius)",background:"var(--life-soft)",color:"var(--text-1)",cursor:"pointer",fontSize:14,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:l,"aria-label":s("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 gs=["Home","Memories","Project","Graph","Settings"],cr={Home:"tab.home",Memories:"tab.memories",Project:"tab.project",Graph:"tab.graph",Settings:"tab.settings"},lr={Insights:"Home",Analytics:"Home",Search:"Memories",Browse:"Memories",Manage:"Memories",Lessons:"Memories"},fs="memesh.tab";function dr(){const t=o=>o?gs.includes(o)?o:lr[o]??null:null;try{const o=new URLSearchParams(window.location.search),n=t(o.get("tab"));if(n)return n;const i=t(localStorage.getItem(fs));if(i)return i}catch{}return"Home"}function mr(){const[t,o]=b(()=>Ks()),[n,i]=b(dr),a=be(j=>{i(j)},[]),[r,l]=b(()=>new Set);Z(()=>{l(j=>j.has(n)?j:new Set(j).add(n))},[n]);const d=j=>r.has(j)||n===j;Z(()=>{try{localStorage.setItem(fs,n)}catch{}try{const j=new URL(window.location.href);j.searchParams.set("tab",n),history.replaceState(null,"",j)}catch{}},[n]);const[m,c]=b(null),[h,u]=b(0),g=V(0),[f,R]=b(""),[C,D]=b(!1);Z(()=>{const j=()=>D(!0);return window.addEventListener("memesh:auth-required",j),()=>window.removeEventListener("memesh:auth-required",j)},[]);const[A,L]=b(!1),B=be(()=>{const j=++g.current;te("GET","/v1/health").then(p=>{j===g.current&&(c(p),R(""),D(!1))}).catch(p=>{if(j===g.current){if(p instanceof jo){L(So()!==null),D(!0),R("");return}R(p.message)}})},[]);Z(()=>{B();const j=()=>{u(p=>p+1),B()};return window.addEventListener("memesh:data-changed",j),()=>window.removeEventListener("memesh:data-changed",j)},[B]);const F=gs.map(j=>({key:j,label:s(cr[j])}));return C?e(er,{currentToken:So(),rejected:A,onSubmit:j=>{oa(j),L(!1),D(!1),B()}}):e("div",{class:"shell",children:[e(Qs,{health:m,error:f}),m&&f&&e("div",{class:"error-box",role:"alert",style:{margin:"8px 16px 0"},children:[s("common.error"),": ",f]}),(m?.demo_entity_count??0)>0&&e(Hn,{health:m}),e("div",{class:"notice-slot",children:[e(ir,{}),(m?.demo_entity_count??0)===0&&e(Hn,{health:m}),e(rr,{currentTab:n,onNavigateToInsights:()=>a("Home")})]}),e(ea,{tabs:F,active:n,onSelect:j=>a(j)}),e("div",{class:"main",children:[e("div",{id:"panel-Home",role:"tabpanel","aria-labelledby":"tab-Home",class:`panel ${n==="Home"?"active":""}`,children:n==="Home"&&e($a,{health:m,dataRevision:h,onNavigate:a})}),e("div",{id:"panel-Memories",role:"tabpanel","aria-labelledby":"tab-Memories",class:`panel ${n==="Memories"?"active":""}`,children:d("Memories")&&e(mi,{health:m,dataRevision:h})}),e("div",{id:"panel-Project",role:"tabpanel","aria-labelledby":"tab-Project",class:`panel ${n==="Project"?"active":""}`,children:d("Project")&&e(Pi,{health:m,dataRevision:h})}),e("div",{id:"panel-Graph",role:"tabpanel","aria-labelledby":"tab-Graph",class:`panel ${n==="Graph"?"active":""}`,children:n==="Graph"&&e(Xi,{dataRevision:h})}),e("div",{id:"panel-Settings",role:"tabpanel","aria-labelledby":"tab-Settings",class:`panel ${n==="Settings"?"active":""}`,children:n==="Settings"&&e(Ni,{locale:t,onLocaleChange:o})})]}),e(Qi,{health:m}),e("footer",{class:"app-footer",children:s("brand.subtitle")})]})}qs(e(mr,{}),document.getElementById("app"));</script>
28
+ ${C.join(`
29
+ `)}`,y=`https://github.com/PCIRCLE-AI/memesh/issues/new?title=${encodeURIComponent("[Bug] memesh doctor reported issues")}&body=${encodeURIComponent(k)}&labels=${encodeURIComponent("feedback,from-dashboard,bug,doctor-warning")}`;Wo(y)||(r(y),d(!1))}async function T(C){if(!(!C.fixId||m)){c(C.id),u(null),f(null);try{const k=await I("POST","/v1/doctor/fix",{id:C.id});u(C.id),k?.restartRequired&&f(n("doctorBanner.restartRequired")),window.dispatchEvent(new Event("memesh:data-changed"))}catch(k){f(k instanceof Error?k.message:String(k))}finally{c(null)}}}async function R(){if(a)try{await navigator.clipboard.writeText(a),d(!0)}catch{d(!1)}}const L=t.status==="FAIL",A=L?"var(--danger)":"var(--warning)",p=L?"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 ${A}`,borderRadius:"var(--radius)",background:p,color:"var(--text-1)"},children:[e("button",{type:"button",onClick:P,"aria-label":n("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,minWidth:24,minHeight:24},children:"×"}),e("div",{style:{fontSize:14,fontWeight:600,color:A,marginBottom:6},children:n(L?"doctorBanner.failTitle":"doctorBanner.warnTitleSoft")}),e("ul",{style:{margin:"6px 0 10px",paddingLeft:18,fontSize:14,lineHeight:1.5,color:"var(--text-2)"},children:[E.slice(0,3).map(C=>{const k=ua(C),D=C.fixId==="config-retired-settings"||C.fixId==="plugin-cache-refresh";return e("li",{children:[e("strong",{children:[ha(C),":"]})," ",ma(C),k&&e(q,{children:[!D&&e(q,{children:[" — ",e("em",{style:{color:"var(--text-3)"},children:k}),ra(k).map(y=>e(je,{id:"doctor-fix-command",command:y},y))]}),D&&e("div",{style:{marginTop:7},children:e("button",{type:"button",class:"btn btn-sm",disabled:m!==null,onClick:()=>{T(C)},children:m===C.id?n("doctorBanner.fixInProgress"):h===C.id?n("doctorBanner.fixDone"):n("doctorBanner.fix")})})]})]},C.id)}),E.length>3&&e("li",{style:{color:"var(--text-3)"},children:n("doctorBanner.moreCount",{n:E.length-3})})]}),g&&e("div",{role:"status",style:{margin:"4px 0 8px",color:"var(--text-2)",fontSize:14},children:g}),L&&e("div",{style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap"},children:[e("button",{type:"button",class:"btn",onClick:_,style:{fontSize:14,padding:"4px 12px"},children:n("doctorBanner.getHelp")}),e(Go,{id:"doctor-help"}),e("span",{style:{fontSize:14,color:"var(--text-3)"},children:n("doctorBanner.helpHint")})]}),a&&e("div",{role:"alert",style:{marginTop:8,fontSize:14},children:[e("div",{children:n("feedback.popupBlocked")}),e("a",{href:a,target:"_blank",rel:"noopener noreferrer",children:n("feedback.retry")})," ",e("button",{type:"button",class:"btn btn-sm",onClick:()=>{R()},children:n(l?"feedback.linkCopied":"feedback.copyLink")})]})]})}const yo="memesh.insightsBanner.dismissed";function ya({currentTab:t,onNavigateToInsights:o}){const[s,i]=b(0),[a,r]=b(()=>{try{return sessionStorage.getItem(yo)==="true"}catch{return!1}});if(W(()=>{let m=!0;const c=()=>{I("GET","/v1/dream/proposals?status=pending").then(u=>{if(!m)return;const g=Array.isArray(u)?u:u?.data??[];i(g.length)}).catch(()=>{})};c();const h=()=>c();return window.addEventListener("memesh:data-changed",h),()=>{m=!1,window.removeEventListener("memesh:data-changed",h)}},[]),t==="Home"||a||s===0)return null;function l(m){m.stopPropagation(),r(!0);try{sessionStorage.setItem(yo,"true")}catch{}}const d=n("banner.pendingInsights",{n:s,s:s===1?"":"s"});return e("div",{role:"button","aria-label":n("banner.viewAll"),onClick:o,onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),o())},tabIndex:0,style:{position:"relative",margin:"12px auto 0",maxWidth:920,padding:"10px 40px 10px 16px",border:"1px solid rgba(143, 242, 92, 0.32)",borderRadius:"var(--radius)",background:"var(--life-soft)",color:"var(--text-1)",cursor:"pointer",fontSize:14,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:l,"aria-label":n("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,minWidth:24,minHeight:24},children:"×"})]})}const Vo=["Home","Memories","Project","Settings"],va={Home:"tab.home",Memories:"tab.memories",Project:"tab.project",Settings:"tab.settings"},ba={Insights:"Home",Analytics:"Home",Search:"Memories",Browse:"Memories",Manage:"Memories",Lessons:"Memories",Graph:"Project"},$o="memesh.tab";function ka(){const t=o=>o?Vo.includes(o)?o:ba[o]??null:null;try{const o=new URLSearchParams(window.location.search),s=t(o.get("tab"));if(s)return s;const i=t(localStorage.getItem($o));if(i)return i}catch{}return"Home"}function xa(){const[t,o]=b(()=>us()),[s,i]=b(ka),a=le(A=>{i(A)},[]),[r,l]=b(()=>new Set);W(()=>{l(A=>A.has(s)?A:new Set(A).add(s))},[s]);const d=A=>r.has(A)||s===A;W(()=>{try{localStorage.setItem($o,s)}catch{}try{const A=new URL(window.location.href);A.searchParams.set("tab",s),history.replaceState(null,"",A)}catch{}},[s]);const[m,c]=b(null),[h,u]=b(0),g=X(0),[f,E]=b(""),[S,P]=b(!1);W(()=>{const A=()=>P(!0);return window.addEventListener("memesh:auth-required",A),()=>window.removeEventListener("memesh:auth-required",A)},[]);const[_,T]=b(!1),R=le(()=>{const A=++g.current;I("GET","/v1/health").then(p=>{A===g.current&&(c(p),E(""),P(!1))}).catch(p=>{if(A===g.current){if(p instanceof Et){T(bt()!==null),P(!0),E("");return}E(p.message)}})},[]);W(()=>{R();const A=()=>{u(p=>p+1),R()};return window.addEventListener("memesh:data-changed",A),()=>window.removeEventListener("memesh:data-changed",A)},[R]);const L=Vo.map(A=>({key:A,label:n(va[A])}));return S?e(da,{currentToken:bt(),rejected:_,onSubmit:A=>{ks(A),T(!1),P(!1),R()}}):e("div",{class:"shell",children:[e(ys,{health:m,error:f}),m&&f&&e("div",{class:"error-box",role:"alert",style:{margin:"8px 16px 0"},children:[n("common.error"),": ",f]}),(m?.demo_entity_count??0)>0&&e(go,{health:m}),e("div",{class:"notice-slot",children:[e(fa,{}),(m?.demo_entity_count??0)===0&&e(go,{health:m}),e(ya,{currentTab:s,onNavigateToInsights:()=>a("Home")})]}),e(vs,{tabs:L,active:s,onSelect:A=>a(A)}),e("div",{class:"main",children:[e("div",{id:"panel-Home",role:"tabpanel","aria-labelledby":"tab-Home",class:`panel ${s==="Home"?"active":""}`,children:s==="Home"&&e(mn,{health:m,dataRevision:h,onNavigate:a})}),e("div",{id:"panel-Memories",role:"tabpanel","aria-labelledby":"tab-Memories",class:`panel ${s==="Memories"?"active":""}`,children:d("Memories")&&e(jn,{health:m,dataRevision:h})}),e("div",{id:"panel-Project",role:"tabpanel","aria-labelledby":"tab-Project",class:`panel ${s==="Project"?"active":""}`,children:d("Project")&&e(ta,{health:m,dataRevision:h})}),e("div",{id:"panel-Settings",role:"tabpanel","aria-labelledby":"tab-Settings",class:`panel ${s==="Settings"?"active":""}`,children:s==="Settings"&&e(ia,{locale:t,onLocaleChange:o})})]}),e(la,{health:m}),e("footer",{class:"app-footer",children:n("brand.subtitle")})]})}as(e(xa,{}),document.getElementById("app"));</script>
30
30
  <style rel="stylesheet" crossorigin>:root{--bg-0: #09090A;--bg-1: #0F0F11;--bg-2: #151518;--bg-card: rgba(15, 15, 17, .9);--bg-hover: #1B1B1F;--bg-input: #0F0F11;--border: rgba(255, 255, 255, .08);--border-subtle: rgba(255, 255, 255, .04);--border-focus: #8FF25C;--text-0: #EDEDEE;--text-1: #B4B5B7;--text-2: #AAACB0;--text-3: #96999F;--life: #8FF25C;--life-soft: rgba(143, 242, 92, .08);--life-hover: #A9FF75;--amber: #E4C590;--amber-soft: rgba(228, 197, 144, .08);--success: #8FF25C;--success-soft: rgba(143, 242, 92, .08);--danger: #FF7A6B;--danger-soft: rgba(255, 122, 107, .08);--warning: #FFAB40;--warning-soft: rgba(255, 171, 64, .08);--info: #6FB7D9;--info-soft: rgba(111, 183, 217, .08);--neutral-soft: rgba(160, 160, 160, .1);--font-ui: "Bricolage Grotesque", -apple-system, system-ui, sans-serif;--font-memory: "Newsreader", "Songti TC", Georgia, serif;--mono: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;--radius: 8px;--radius-sm: 6px;--radius-xs: 4px;--radius-hairline: 2px;--t-heartbeat: 3.2s;--t-germinate: .45s;--t-replay-max: 2.5s;--t-pulse: .6s}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}html{font-size:16px}body{font-family:var(--font-ui);background:var(--bg-0);color:var(--text-1);line-height:1.55;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-hairline)}.shell{min-height:100vh;display:flex;flex-direction:column}.app-footer{padding:16px 24px 20px;color:var(--text-3);font-size:14px;letter-spacing:.04em;text-align:center;border-top:1px solid var(--border);margin-top:auto}.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:14px;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:14px;color:var(--text-2)}.dot{width:6px;height:6px;border-radius:50%;display:inline-block;margin-right:4px}.dot-ok{background:var(--life);animation:heartbeat var(--t-heartbeat) ease-in-out infinite}@keyframes heartbeat{0%,to{box-shadow:0 0 2px #8ff25c59}50%{box-shadow:0 0 8px 2px #8ff25c80}}@media(prefers-reduced-motion:reduce){.dot-ok{animation:none;box-shadow:0 0 6px #8ff25c66}}.dot-err{background:var(--danger)}.badge-version{font-family:var(--mono);font-size:14px;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:14px;transition:border-color .15s}.theme-btn:hover{border-color:var(--text-3)}.notice-slot>*~*{display:none}.nav{display:flex;background:var(--bg-0);border-bottom:1px solid var(--border);padding:0 24px;gap:0;overflow-x:auto;scrollbar-width:none}.nav::-webkit-scrollbar{display:none}.nav-btn{padding:14px 16px;border:none;background:none;cursor:pointer;font:500 15px/1.4 var(--font-ui);color:var(--text-3);border-bottom:2px solid transparent;transition:color .15s,border-color .15s;white-space:nowrap;letter-spacing:.01em;min-height:44px}.nav-btn:hover{color:var(--text-2)}.nav-btn.active{color:var(--life);border-bottom-color:var(--life)}.nav-overflow-fade{position:absolute;top:0;right:0;bottom:0;width:32px;pointer-events:none;background:linear-gradient(to right,transparent,var(--bg-0))}.main{flex:1;max-width:1100px;width:100%;margin:0 auto;padding:20px 24px}.panel{display:none}.panel.active{display:block}.card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px 18px;margin-bottom:8px;backdrop-filter:blur(8px);transition:border-color .2s,box-shadow .2s}.card:hover{border-color:var(--border)}.card-title{font-size:16px;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:16px/1.5 var(--font-ui);outline:none;transition:border-color .15s}input:focus,textarea:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--life-soft)}input::placeholder,textarea::placeholder{color:var(--text-3)}.btn{display:inline-flex;align-items:center;gap:6px;padding:9px 16px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-2);color:var(--text-1);font:600 15px/1.4 var(--font-ui);cursor:pointer;transition:all .15s;white-space:nowrap}.btn:hover{border-color:var(--text-3);background:var(--bg-hover)}.btn:disabled{opacity:.35;cursor:not-allowed}.btn-primary{background:var(--life);border-color:var(--life);color:var(--bg-0)}.btn-primary:hover{background:var(--life-hover)}.btn-danger{color:var(--danger);border-color:#ff7a6b33;background:transparent}.btn-danger:hover{background:var(--danger-soft)}.btn-sm{padding:8px 14px;font-size:14px;min-height:40px}.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:14px;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:14px;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:14px;font-weight:500;letter-spacing:.01em}.badge-active{background:var(--success-soft);color:var(--life)}.badge-archived{background:var(--danger-soft);color:var(--danger)}.badge-type{background:var(--life-soft);color:var(--life)}.tag{display:inline-block;padding:1px 7px;margin:1px 2px;border-radius:var(--radius-xs);font:400 14px var(--mono);background:var(--bg-2);color:var(--text-2);border:1px solid var(--border)}.stats-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px;margin-bottom:20px}.stat{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:16px;transition:border-color .15s}.stat:hover{border-color:#8ff25c33;box-shadow:0 2px 12px #8ff25c0a}.stat-val{font:700 24px/1.1 var(--mono);color:var(--life);letter-spacing:-.02em}.stat-lbl{font:500 14px/1.5 var(--font-ui);color:var(--text-2);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 14px var(--mono);color:var(--text-3);padding-top:2px;line-height:1.4}.mem-body{flex:1;min-width:0}.mem-preview{font-family:var(--font-memory);font-size:15px;line-height:1.6;color:var(--text-1);word-break:break-word}.mem-meta{margin-top:3px;font:400 14px 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:14px;color:var(--text-1)}.insight-val{font:600 14px var(--mono);color:var(--life)}.empty{text-align:center;padding:48px 20px;color:var(--text-3);font-size:14px}.empty-icon{font-size:28px;margin-bottom:8px;display:block}.loading{width:18px;height:18px;border:2px solid var(--border);border-top-color:var(--life);border-radius:50%;animation:spin .6s linear infinite;margin:0 auto}@keyframes spin{to{transform:rotate(360deg)}}.error-box{background:var(--danger-soft);border:1px solid rgba(255,122,107,.12);border-radius:var(--radius-sm);padding:10px 14px;color:var(--danger);font-size:14px}.fb-btn{position:fixed;bottom:20px;right:20px;background:var(--life);color:var(--bg-0);border:none;padding:9px 16px;border-radius:9999px;cursor:pointer;font:600 14px var(--font-ui);box-shadow:0 4px 14px #8ff25c40;transition:transform .15s,box-shadow .15s;z-index:50}.fb-btn:hover{transform:translateY(-2px);box-shadow:0 6px 20px #8ff25c59}.fb-panel{position:fixed;bottom:64px;right:20px;width:340px;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);padding:18px;box-shadow:0 16px 48px #00000080;z-index:51;animation:fb-slide-up .15s ease-out}@keyframes fb-slide-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.fb-title{font:600 14px var(--font-ui);color:var(--text-0);margin-bottom:14px}.fb-types{display:flex;gap:6px;margin-bottom:12px}.fb-type{display:flex;align-items:center;gap:5px;padding:5px 10px;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;font:500 14px var(--font-ui);color:var(--text-2);transition:border-color .15s,background .15s}.fb-type:hover{border-color:var(--text-3)}.fb-type.selected{border-color:var(--life);background:var(--life-soft);color:var(--life)}.fb-type input{accent-color:var(--life)}.fb-desc{width:100%;height:80px;padding:9px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);font:400 14px var(--font-ui);resize:vertical;outline:none;margin-bottom:10px;background:var(--bg-0);color:var(--text-0)}.fb-desc:focus{border-color:var(--life)}.fb-desc::placeholder{color:var(--text-3)}.fb-sys-row{display:flex;align-items:center;gap:6px;font:400 14px var(--font-ui);color:var(--text-2);margin-bottom:12px;cursor:pointer}.fb-sys-row input{accent-color:var(--life)}.fb-submit{width:100%;justify-content:center}mark{background:#8ff25c26;color:inherit;padding:1px 2px;border-radius:var(--radius-hairline)}.overlay{position:fixed;inset:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:200}.modal{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);padding:24px;max-width:480px;width:90%;max-height:80vh;overflow-y:auto;box-shadow:0 16px 48px #00000080}.modal h3{font-size:15px;font-weight:600;color:var(--text-0);margin-bottom:14px}@media(max-width:768px){.main{padding:14px}.nav-btn{padding:10px 11px;font-size:14px}.header-brand h1{font-size:14px}.search-bar{flex-direction:column}.stats-row{grid-template-columns:1fr 1fr}.mem-time{width:60px;font-size:14px}}@media(max-width:480px){.fb-btn{position:static;align-self:flex-end;margin:16px}.fb-panel{width:calc(100% - 32px);right:16px}.nav-btn{flex:1;font-size:14px;padding:9px 8px;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:14px;line-height:1.55;opacity:.85;margin:0}.auth-prompt-card label{display:flex;flex-direction:column;gap:6px;font-size:14px}.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:14px}.auth-prompt-card input:focus{outline:none;border-color:var(--border-focus)}.auth-prompt-error{color:var(--danger);font-size:14px;margin:0}.auth-prompt-submit{background:var(--border-focus);color:var(--bg-0);border:none;border-radius:4px;padding:10px 14px;font-size:14px;cursor:pointer;font-weight:500}.auth-prompt-submit:hover{filter:brightness(1.1)}</style>
31
31
  </head>
32
32
  <body>