openclaw 织忆插件 v0.2.0 - commit/recall/feedback/prefetch/forget/stats

This commit is contained in:
xiaowei 2026-06-14 19:14:19 +08:00
commit 58db5e9e19
5 changed files with 288 additions and 0 deletions

113
main.js Normal file

File diff suppressed because one or more lines are too long

102
main.js.bak1 Normal file
View File

@ -0,0 +1,102 @@
var E=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var Y=Object.prototype.hasOwnProperty;var j=(a,r,e)=>r in a?E(a,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[r]=e;var Q=(a,r)=>{for(var e in r)E(a,e,{get:r[e],enumerable:!0})},K=(a,r,e,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of W(r))!Y.call(a,n)&&n!==e&&E(a,n,{get:()=>r[n],enumerable:!(i=O(r,n))||i.enumerable});return a};var U=a=>K(E({},"__esModule",{value:!0}),a);var s=(a,r,e)=>j(a,typeof r!="symbol"?r+"":r,e);var Z={};Q(Z,{default:()=>M});module.exports=U(Z);var m=require("obsidian");var I=require("obsidian");var X="http://localhost:7821",F="zhiyi-dev-key-2026";async function x(a,r={}){let n={method:r.method??"GET",headers:{"X-API-Key":F,"Content-Type":"application/json"}};r.body!==void 0&&(n.body=JSON.stringify(r.body));let o=await fetch(`${X}${a}`,n);if(!o.ok)throw new Error(`API ${a} failed: ${o.status} ${o.statusText}`);let l=await o.text();return l?JSON.parse(l):{}}async function P(a){let r=new URLSearchParams;a.namespace&&r.set("namespace",a.namespace),a.limit&&r.set("limit",String(a.limit)),a.offset!==void 0&&r.set("offset",String(a.offset));let e=r.toString();return x(`/api/v1/memories?${e}`)}async function R(a,r="hermes-main"){return x("/api/v1/search/recall",{method:"POST",body:{query:a,namespace:r,top_k:20}})}async function _(a){return x(`/api/v1/graph/navigate?entity=${encodeURIComponent(a)}&depth=1`)}async function N(a="hermes-main",r=100){return x(`/api/v1/graph/export?namespace=${a}&limit=${r}`)}async function H(){return x("/api/v1/distill/status")}async function V(){return x("/api/v1/distill/quota")}async function C(a=30){return x(`/api/v1/graph/pagerank?limit=${a}`)}async function $(a){return x(`/api/v1/memories/by-entity/${encodeURIComponent(a)}`)}var b="zhiyi-memory-view",k=class extends I.ItemView{constructor(e){super(e);s(this,"container");s(this,"memories",[]);s(this,"currentPage",0);s(this,"pageSize",20);s(this,"totalMemories",0);s(this,"status_interval",null);this.container=this.contentEl}getViewType(){return b}getDisplayText(){return"\u7EC7\u5FC6\u8BB0\u5FC6"}async onOpen(){this.render(),this.startStatusPoll()}async onClose(){this.status_interval!==null&&window.clearInterval(this.status_interval)}startStatusPoll(){let e=window.setInterval(()=>this.renderDistillBanner(),3e4);this.status_interval=e}async renderDistillBanner(){let e=this.container.querySelector(".zhiyi-distill-banner");if(e)try{let[i,n]=await Promise.all([H(),V()]);i.queue_len>0?(e.innerHTML=`<span class="zhiyi-warn">\u26A0\uFE0F \u84B8\u998F\u961F\u5217: ${i.queue_len} \u6761</span>`,e.style.display="block"):e.style.display="none"}catch{}}async render(){this.container.empty(),this.container.createEl("style",{text:`
.zhiyi-memory-view { height: 100%; display: flex; flex-direction: column; font-size: 13px; }
.zhiyi-header { padding: 10px 12px 6px; border-bottom: 1px solid var(--background-modifier-border); }
.zhiyi-header h1 { font-size: 14px; font-weight: 600; margin: 0 0 4px; }
.zhiyi-stats { color: var(--text-muted); font-size: 11px; margin: 0; }
.zhiyi-distill-banner {
display: none; background: #c44; color: white; padding: 4px 12px;
font-size: 12px; font-weight: 600; cursor: pointer;
}
.zhiyi-body { flex: 1; overflow-y: auto; }
.zhiyi-item {
padding: 8px 12px; border-bottom: 1px solid var(--background-modifier-border);
cursor: pointer;
}
.zhiyi-item:hover { background: var(--background-modifier-hover); }
.zhiyi-item-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 2px; }
.zhiyi-item-cat { font-size: 10px; color: var(--text-muted); background: var(--background-secondary); padding: 1px 4px; border-radius: 2px; }
.zhiyi-item-score { font-size: 10px; color: var(--text-muted); }
.zhiyi-item-content { font-size: 12px; color: var(--text-normal); line-height: 1.4; }
.zhiyi-item-time { font-size: 10px; color: var(--text-muted); margin-top: 2px; }
.zhiyi-item-id { font-size: 10px; color: var(--text-faint); font-family: monospace; margin-top: 2px; overflow: hidden; text-overflow: ellipsis; }
.zhiyi-pagination { display: flex; gap: 6px; padding: 8px 12px; border-top: 1px solid var(--background-modifier-border); }
.zhiyi-pagination button { flex: 1; padding: 4px; background: var(--background-secondary); border: 1px solid var(--background-modifier-border); border-radius: 4px; cursor: pointer; font-size: 11px; }
.zhiyi-pagination button:disabled { opacity: 0.4; cursor: not-allowed; }
.zhiyi-loading { padding: 20px; text-align: center; color: var(--text-muted); }
.zhiyi-empty { padding: 20px; text-align: center; color: var(--text-muted); }
`}),this.container.createEl("div",{cls:"zhiyi-memory-view"}).append(this.container.createEl("div",{cls:"zhiyi-distill-banner"}),this.container.createEl("div",{cls:"zhiyi-header"}).append(this.container.createEl("h1",{text:"\u{1F9E0} \u7EC7\u5FC6\u8BB0\u5FC6"}),this.container.createEl("p",{cls:"zhiyi-stats",text:"\u52A0\u8F7D\u4E2D..."})),this.container.createEl("div",{cls:"zhiyi-body"}),this.container.createEl("div",{cls:"zhiyi-pagination"})),await this.loadMemories(),await this.renderDistillBanner()}async loadMemories(){let e=this.container.querySelector(".zhiyi-body"),i=this.container.querySelector(".zhiyi-stats");e.innerHTML='<div class="zhiyi-loading">\u52A0\u8F7D\u4E2D\u2026</div>';try{let n=await P({namespace:"hermes-main",limit:this.pageSize,offset:this.currentPage*this.pageSize});this.memories=n.memories||[],this.totalMemories=n.total||0,i.setText(`${this.totalMemories} \u6761\u8BB0\u5FC6 \xB7 \u7B2C ${this.currentPage+1} \u9875`),this.renderList()}catch(n){e.innerHTML=`<div class="zhiyi-empty">\u52A0\u8F7D\u5931\u8D25: ${n.message}</div>`}}renderList(){let e=this.container.querySelector(".zhiyi-body"),i=this.container.querySelector(".zhiyi-pagination");e.empty(),this.memories.length===0&&e.createEl("div",{cls:"zhiyi-empty",text:"\u6682\u65E0\u8BB0\u5FC6"});for(let o of this.memories){let l=e.createEl("div",{cls:"zhiyi-item"}),d=l.createEl("div",{cls:"zhiyi-item-header"});d.createEl("span",{cls:"zhiyi-item-cat",text:o.category||"normal"}),d.createEl("span",{cls:"zhiyi-item-score",text:`score: ${(o.quality_score??0).toFixed(2)}`}),l.createEl("div",{cls:"zhiyi-item-content",text:this.truncate(o.content,120)}),l.createEl("div",{cls:"zhiyi-item-time",text:this.formatTime(o.created_at)}),l.createEl("div",{cls:"zhiyi-item-id",text:o.id})}let n=Math.ceil(this.totalMemories/this.pageSize);if(i.empty(),n>1){let o=i.createEl("button",{text:"\u25C0 \u4E0A\u4E00\u9875"});o.setAttr("disabled",this.currentPage===0?"true":""),o.onclick=()=>{this.currentPage--,this.loadMemories()},i.createEl("span",{text:`${this.currentPage+1}/${n}`,cls:"zhiyi-item-cat"});let l=i.createEl("button",{text:"\u4E0B\u4E00\u9875 \u25B6"});l.setAttr("disabled",this.currentPage>=n-1?"true":""),l.onclick=()=>{this.currentPage++,this.loadMemories()}}}truncate(e,i){return e?e.length>i?e.slice(0,i)+"\u2026":e:""}formatTime(e){if(!e)return"";try{return new Date(e).toLocaleString("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}catch{return e}}};var D=require("obsidian");async function J(){return window.d3?window.d3:new Promise((a,r)=>{let e=document.createElement("script");e.src="https://cdn.jsdelivr.net/npm/d3@7/dist/d3.min.js",e.onload=()=>a(window.d3),e.onerror=r,document.head.appendChild(e)})}var w="zhiyi-graph-view",S=class extends D.ItemView{constructor(e){super(e);s(this,"container");s(this,"currentEntity","");s(this,"d3",null);s(this,"svg",null);s(this,"simulation",null);this.container=this.contentEl}getViewType(){return w}getDisplayText(){return"\u7EC7\u5FC6\u56FE\u8C31"}async onOpen(){this.render()}async onClose(){this.simulation?.stop()}async render(){this.container.empty(),this.container.createEl("style",{text:`
.zhiyi-graph-view { height: 100%; display: flex; flex-direction: column; }
.zhiyi-graph-toolbar {
display: flex; gap: 6px; padding: 6px 10px;
border-bottom: 1px solid var(--background-modifier-border);
align-items: center;
}
.zhiyi-graph-toolbar input {
flex: 1; padding: 4px 8px; font-size: 12px;
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 4px; color: var(--text-normal);
}
.zhiyi-graph-toolbar button {
padding: 4px 10px; font-size: 12px; cursor: pointer;
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 4px;
}
.zhiyi-graph-toolbar .info {
font-size: 11px; color: var(--text-muted); padding: 0 6px;
}
.zhiyi-graph-canvas { flex: 1; position: relative; overflow: hidden; }
.zhiyi-graph-canvas svg { width: 100%; height: 100%; }
.zhiyi-graph-detail {
position: absolute; bottom: 0; left: 0; right: 0;
background: var(--background-secondary);
border-top: 1px solid var(--background-modifier-border);
padding: 8px 12px; font-size: 11px; max-height: 120px; overflow-y: auto;
}
.zhiyi-graph-detail-title { font-weight: 600; margin-bottom: 4px; }
.zhiyi-graph-node-label { font-size: 10px; fill: var(--text-muted); pointer-events: none; }
.zhiyi-legend { position: absolute; top: 8px; right: 8px; background: var(--background-secondary); border: 1px solid var(--background-modifier-border); border-radius: 4px; padding: 6px 8px; font-size: 10px; }
.zhiyi-legend-item { display: flex; align-items: center; gap: 4px; margin: 2px 0; }
.zhiyi-legend-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.zhiyi-tooltip {
position: absolute; background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 4px; padding: 6px 8px; font-size: 11px;
pointer-events: none; opacity: 0; transition: opacity 0.15s;
max-width: 200px; z-index: 10;
}
`});let e=this.container.createEl("div",{cls:"zhiyi-graph-view"}),i=e.createEl("div",{cls:"zhiyi-graph-toolbar"}),n=i.createEl("input",{attr:{placeholder:"\u8F93\u5165\u5B9E\u4F53\u540D\u79F0\uFF0C\u56DE\u8F66\u67E5\u770B ego-network\uFF08\u5982: \u7267\u5C18\uFF09"}}),o=i.createEl("button",{text:"\u52A0\u8F7D\u56FE\u8C31"});i.createEl("span",{cls:"info",text:"\u70B9\u51FB\u8282\u70B9\u67E5\u770B\u8BE6\u60C5"});let l=i.createEl("button",{text:"Top \u8282\u70B9"}),d=e.createEl("div",{cls:"zhiyi-graph-canvas"}),p=d.createEl("div",{cls:"zhiyi-tooltip"}),u=d.createEl("div",{cls:"zhiyi-legend"});u.innerHTML=`
<div class="zhiyi-legend-item"><span class="zhiyi-legend-dot" style="background:#4a9eff"></span> \u9ED8\u8BA4</div>
<div class="zhiyi-legend-item"><span class="zhiyi-legend-dot" style="background:#f6c945"></span> \u4EBA\u7269</div>
<div class="zhiyi-legend-item"><span class="zhiyi-legend-dot" style="background:#34c759"></span> \u9879\u76EE</div>
<div class="zhiyi-legend-item"><span class="zhiyi-legend-dot" style="background:#ff6b6b"></span> \u4E8B\u4EF6</div>
`;let y=e.createEl("div",{cls:"zhiyi-graph-detail",attr:{style:"display:none"}}),g=y.createEl("div",{cls:"zhiyi-graph-detail-title"}),f=y.createEl("div",{cls:"zhiyi-graph-detail-content"});this.d3=await J(),this.svg=this.d3.select(d.createEl("svg")),await this.renderGlobalGraph(),o.onclick=async()=>{n.value.trim()&&await this.renderEgoGraph(n.value.trim(),d,p,y,g,f)},n.onkeydown=async h=>{h.key==="Enter"&&n.value.trim()&&await this.renderEgoGraph(n.value.trim(),d,p,y,g,f)},l.onclick=async()=>{try{let z=(await C(20)).pagerank?.[0]?.entity||"\u7267\u5C18";n.value=z,await this.renderEgoGraph(z,d,p,y,g,f)}catch{}}}async renderGlobalGraph(){try{let e=await N("hermes-main",80);await this.renderD3Graph(e.nodes,e.edges,null)}catch{}}async renderEgoGraph(e,i,n,o,l,d){this.currentEntity=e,this.simulation?.stop();try{let[p,u]=await Promise.all([_(e),$(e)]),g=[{id:e,label:e},...p.nodes.filter(h=>h.id!==e)];await this.renderD3Graph(g,p.edges,e),o.style.display="block",l.setText(`\u{1F4CC} ${e}`);let f=u.memories||[];d.innerHTML=f.slice(0,3).map(h=>`<div style="margin:2px 0">\u2022 ${this.truncate(h.content,100)}</div>`).join("")||"<div>\u65E0\u5173\u8054\u8BB0\u5FC6</div>"}catch(p){let u=i.createEl("div",{text:`\u52A0\u8F7D\u5931\u8D25: ${p.message}`,cls:"zhiyi-empty"});setTimeout(()=>u.remove(),3e3)}}async renderD3Graph(e,i,n){if(!this.d3||!this.svg)return;let o=this.d3,l=this.svg;l.selectAll("*").remove();let d=l.node().clientWidth||600,p=l.node().clientHeight||400,u={\u4EBA\u7269:"#f6c945",\u4EBA\u7269_name:"#f6c945",project:"#34c759",\u9879\u76EE:"#34c759",event:"#ff6b6b",\u4E8B\u4EF6:"#ff6b6b",concept:"#a855f7",\u6982\u5FF5:"#a855f7",location:"#06b6d4",distilled:"#4a9eff",default:"#4a9eff"},y=t=>t.id===n?"#ff4d4d":t.category&&u[t.category]?u[t.category]:u[t.weight!==void 0&&t.weight>5?"distilled":"default"],g=e.map(t=>({id:t.id,label:t.label||t.id,category:t.category,weight:t.weight,isCentral:t.id===n})),f=new Map(g.map(t=>[t.id,t])),h=i.filter(t=>f.has(t.source)&&f.has(t.target)).map(t=>({source:t.source,target:t.target,relation:t.relation,weight:t.weight})),z=o.zoom().scaleExtent([.2,5]).on("zoom",t=>{L.attr("transform",t.transform)});l.call(z);let L=l.append("g");l.append("defs").append("marker").attr("id","arrowhead").attr("viewBox","-0 -5 10 10").attr("refX",15).attr("refY",0).attr("orient","auto").attr("markerWidth",6).attr("markerHeight",6).append("path").attr("d","M 0,-5 L 10,0 L 0,5").attr("fill","#666");let q=L.append("g").selectAll("line").data(h).enter().append("line").attr("stroke","#999").attr("stroke-opacity",.6).attr("stroke-width",t=>Math.min(2,t.weight||1)).attr("marker-end","url(#arrowhead)"),v=L.append("g").selectAll("g").data(g).enter().append("g").style("cursor","pointer");v.append("circle").attr("r",t=>t.isCentral?12:6+(t.weight||1)*.5).attr("fill",t=>y(t)).attr("stroke",t=>t.isCentral?"#ff4d4d":"white").attr("stroke-width",t=>t.isCentral?2:1.5),v.append("text").text(t=>t.label.length>12?t.label.slice(0,12)+"\u2026":t.label).attr("dy",-8).attr("text-anchor","middle").attr("class","zhiyi-graph-node-label").style("font-size",t=>t.isCentral?"11px":"9px").style("fill","var(--text-muted)");let B=o.drag().on("start",(t,c)=>{t.active||this.simulation.alphaTarget(.3).restart(),c.fx=c.x,c.fy=c.y}).on("drag",(t,c)=>{c.fx=t.x,c.fy=t.y}).on("end",(t,c)=>{t.active||this.simulation.alphaTarget(0),c.fx=null,c.fy=null});v.call(B),v.on("click",(t,c)=>{this.renderEgoGraph(c.id,canvas.parentElement,tooltip,canvas.parentElement.querySelector(".zhiyi-graph-detail"),canvas.parentElement.querySelector(".zhiyi-graph-detail-title"),canvas.parentElement.querySelector(".zhiyi-graph-detail-content"))}),v.on("mouseover",(t,c)=>{tooltip.style.opacity="1",tooltip.style.left=t.offsetX+10+"px",tooltip.style.top=t.offsetY-10+"px",tooltip.setText(`${c.label}${c.weight!==void 0?` (\xD7${c.weight})`:""}`)}),v.on("mouseout",()=>{tooltip.style.opacity="0"}),this.simulation=o.forceSimulation(g).force("link",o.forceLink(h).id(t=>t.id).distance(80)).force("charge",o.forceManyBody().strength(-200)).force("center",o.forceCenter(d/2,p/2)).force("collision",o.forceCollide(20)).on("tick",()=>{q.attr("x1",t=>t.source.x).attr("y1",t=>t.source.y).attr("x2",t=>t.target.x).attr("y2",t=>t.target.y),v.attr("transform",t=>`translate(${t.x},${t.y})`)})}truncate(e,i){return e?e.length>i?e.slice(0,i)+"\u2026":e:""}};var A=require("obsidian");var T=class extends A.Modal{constructor(e){super(e);s(this,"results",[]);s(this,"inputEl");s(this,"listEl");s(this,"loading",!1);s(this,"debounceTimer",null);s(this,"onSelect")}onOpen(){this.contentEl.createEl("style",{text:`
.zhiyi-search-modal { width: 600px; max-height: 80vh; display: flex; flex-direction: column; }
.zhiyi-search-header {
display: flex; align-items: center; gap: 8px;
padding: 12px 16px; border-bottom: 1px solid var(--background-modifier-border);
}
.zhiyi-search-header h2 { margin: 0; font-size: 14px; font-weight: 600; flex: 1; }
.zhiyi-search-input {
flex: 1; padding: 8px 12px; font-size: 14px;
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 6px; color: var(--text-normal); outline: none;
}
.zhiyi-search-input:focus { border-color: var(--text-accent); }
.zhiyi-search-results { flex: 1; overflow-y: auto; padding: 8px 0; }
.zhiyi-search-result {
padding: 10px 16px; border-bottom: 1px solid var(--background-modifier-border);
cursor: pointer;
}
.zhiyi-search-result:hover { background: var(--background-modifier-hover); }
.zhiyi-search-result-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 4px; }
.zhiyi-search-score { font-size: 10px; color: var(--text-muted); }
.zhiyi-search-cat { font-size: 10px; background: var(--background-secondary); padding: 1px 4px; border-radius: 2px; color: var(--text-muted); }
.zhiyi-search-content { font-size: 12px; color: var(--text-normal); line-height: 1.5; }
.zhiyi-search-id { font-size: 10px; color: var(--text-faint); font-family: monospace; margin-top: 3px; }
.zhiyi-search-loading { padding: 20px; text-align: center; color: var(--text-muted); }
.zhiyi-search-empty { padding: 20px; text-align: center; color: var(--text-muted); }
.zhiyi-search-hint { padding: 8px 16px; font-size: 11px; color: var(--text-muted); text-align: center; }
`});let e=this.contentEl.createEl("div",{cls:"zhiyi-search-modal"}),i=e.createEl("div",{cls:"zhiyi-search-header"});i.createEl("h2",{text:"\u{1F50D} \u7EC7\u5FC6\u8BED\u4E49\u641C\u7D22"}),this.inputEl=i.createEl("input",{cls:"zhiyi-search-input",attr:{placeholder:"\u8F93\u5165\u5173\u952E\u8BCD\uFF0C\u8BED\u4E49\u641C\u7D22\u8BB0\u5FC6\u2026",autofocus:"true"}}),this.listEl=e.createEl("div",{cls:"zhiyi-search-results"}),e.createEl("div",{cls:"zhiyi-search-hint",text:"\u5B9E\u65F6\u641C\u7D22 \xB7 \u6309 Enter \u9009\u62E9\u7B2C\u4E00\u6761\u7ED3\u679C"}),this.inputEl.oninput=()=>{this.debounceTimer!==null&&window.clearTimeout(this.debounceTimer),this.debounceTimer=window.setTimeout(()=>this.doSearch(),300)},this.inputEl.onkeydown=n=>{n.key==="Enter"&&this.results.length>0&&this.selectResult(this.results[0]),n.key==="Escape"&&this.close()}}async doSearch(){let e=this.inputEl.value.trim();if(!e){this.results=[],this.listEl.empty();return}this.listEl.innerHTML='<div class="zhiyi-search-loading">\u641C\u7D22\u4E2D\u2026</div>',this.loading=!0;try{let i=await R(e,"hermes-main");this.results=i.memories||[],this.renderResults()}catch(i){this.listEl.innerHTML=`<div class="zhiyi-search-empty">\u641C\u7D22\u5931\u8D25: ${i.message}</div>`}}renderResults(){if(this.listEl.empty(),this.results.length===0){this.listEl.createEl("div",{cls:"zhiyi-search-empty",text:"\u672A\u627E\u5230\u7ED3\u679C"});return}for(let e of this.results){let i=this.listEl.createEl("div",{cls:"zhiyi-search-result"}),n=i.createEl("div",{cls:"zhiyi-search-result-header"});n.createEl("span",{cls:"zhiyi-search-cat",text:e.category||"normal"}),n.createEl("span",{cls:"zhiyi-search-score",text:` relevance: ${(e.score??0).toFixed(3)}`}),i.createEl("div",{cls:"zhiyi-search-content",text:this.truncate(e.content,200)}),i.createEl("div",{cls:"zhiyi-search-id",text:e.id}),i.onclick=()=>this.selectResult(e)}}selectResult(e){this.onSelect?.(e.id,e.content),this.close()}truncate(e,i){return e?e.length>i?e.slice(0,i)+"\u2026":e:""}onClose(){this.listEl.empty()}};var M=class extends m.Plugin{constructor(){super(...arguments);s(this,"ribbonIcon",null)}async onload(){this.registerView(b,e=>new k(e)),this.registerView(w,e=>new S(e)),this.addCommand({id:"zhiyi-open-memory-view",name:"\u6253\u5F00\u7EC7\u5FC6\u8BB0\u5FC6\u9762\u677F",callback:()=>this.openMemoryView()}),this.addCommand({id:"zhiyi-open-graph-view",name:"\u6253\u5F00\u7EC7\u5FC6\u56FE\u8C31\u9762\u677F",callback:()=>this.openGraphView()}),this.addCommand({id:"zhiyi-search-memories",name:"\u641C\u7D22\u7EC7\u5FC6\u8BB0\u5FC6",callback:()=>this.openSearchModal()}),this.addStatusBarItem().setText("\u{1F9E0} \u7EC7\u5FC6"),this.addStatusBarItem().setText("Ctrl+P \u2192 \u7EC7\u5FC6"),this.addSettingTab(new G(this.app,this))}onunload(){this.app.workspace.getLeavesOfType(b).forEach(e=>e.detach()),this.app.workspace.getLeavesOfType(w).forEach(e=>e.detach())}async openMemoryView(){let e=this.app.workspace.getLeaf("right");await e.setViewState({type:b,active:!0}),this.app.workspace.revealLeaf(e)}async openGraphView(){let e=this.app.workspace.getLeaf("right");await e.setViewState({type:w,active:!0}),this.app.workspace.revealLeaf(e)}openSearchModal(){let e=new T(this.app);e.onSelect=(i,n)=>{navigator.clipboard.writeText(n).catch(()=>{}),new this.app.notify(`\u5DF2\u590D\u5236: ${n.slice(0,80)}\u2026`)},e.open()}},G=class extends m.PluginSettingTab{constructor(r,e){super(r,e)}display(){let{containerEl:r}=this;r.empty(),r.createEl("h2",{text:"\u{1F9E0} \u7EC7\u5FC6\u8BBE\u7F6E"}),new m.Setting(r).setName("API \u5730\u5740").setDesc("\u7EC7\u5FC6 Go API \u670D\u52A1\u5730\u5740\uFF08\u9ED8\u8BA4 http://localhost:7821\uFF09").addText(e=>e.setPlaceholder("http://localhost:7821").setValue("http://localhost:7821").onChange(i=>{window.zhiyi_api_url=i})),new m.Setting(r).setName("API Key").setDesc("\u7EC7\u5FC6\u8BA4\u8BC1\u5BC6\u94A5").addText(e=>e.setPlaceholder("zhiyi-dev-key-2026").onChange(i=>{window.zhiyi_api_key=i})),new m.Setting(r).setName("\u9ED8\u8BA4 Namespace").setDesc("\u641C\u7D22\u548C\u67E5\u8BE2\u4F7F\u7528\u7684\u9ED8\u8BA4\u547D\u540D\u7A7A\u95F4").addText(e=>e.setValue("hermes-main").onChange(i=>{window.zhiyi_namespace=i})),new m.Setting(r).setName("\u6253\u5F00\u8BB0\u5FC6\u9762\u677F").addButton(e=>e.setButtonText("\u6253\u5F00 \u{1F9E0}").onClick(()=>{this.plugin.openMemoryView()})),new m.Setting(r).setName("\u6253\u5F00\u56FE\u8C31\u9762\u677F").addButton(e=>e.setButtonText("\u6253\u5F00 \u{1F4D0}").onClick(()=>{this.plugin.openGraphView()}))}};

13
manifest.json Normal file
View File

@ -0,0 +1,13 @@
{
"id": "zhiyi-memory",
"name": "织忆",
"version": "1.1.0",
"minAppVersion": "0.15.0",
"description": "织忆记忆系统可视化 — 图谱探索、记忆搜索、蒸馏状态监控、语义搜索、分类过滤、记忆写入",
"author": "小唯 A06",
"fundingurl": "",
"isDesktopOnly": false,
"jsEngine": "esbuild",
"main": "main.js",
"styles": ["styles.css"]
}

13
manifest.json.bak1 Normal file
View File

@ -0,0 +1,13 @@
{
"id": "zhiyi-memory",
"name": "织忆",
"version": "0.1.0",
"minAppVersion": "0.15.0",
"description": "织忆记忆系统可视化 — 图谱探索、记忆搜索、蒸馏状态监控",
"author": "小唯 A06",
"fundingurl": "",
"isDesktopOnly": false,
"jsEngine": "esbuild",
"main": "main.js",
"styles": ["styles.css"]
}

47
styles.css Normal file
View File

@ -0,0 +1,47 @@
/* 织忆插件全局样式 */
/* 侧边栏视图通用 */
.workspace-leaf-content[data-type="zhiyi-memory-view"],
.workspace-leaf-content[data-type="zhiyi-graph-view"] {
height: 100%;
}
/* 分页按钮 */
.zhiyi-pagination button:hover:not(:disabled) {
background: var(--background-modifier-hover);
}
/* 搜索模态框覆盖层 */
.zhiyi-search-modal .modal-bg {
background: rgba(0, 0, 0, 0.4);
}
.zhiyi-search-modal .modal-container {
border: 1px solid var(--background-modifier-border);
border-radius: 8px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}
/* 图谱 tooltip */
.zhiyi-tooltip {
pointer-events: none;
z-index: 100;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
/* 设置页 */
.zhiyi-settings-section {
padding: 12px 0;
}
.zhiyi-settings-section h3 {
font-size: 13px;
font-weight: 600;
color: var(--text-normal);
margin: 0 0 8px;
}
/* 蒸馏警告高亮 */
.zhiyi-warn {
color: #ff6b6b;
font-weight: 700;
}