open-mem 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,28 +1,29 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var k=import.meta.require;import{createInterface as BJ}from"readline";import{parseArgs as JJ}from"util";var A0={name:"claude-code",version:"0.1",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}},V0={name:"cursor",version:"0.1",capabilities:{nativeSessionLifecycle:!1,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}};function l(){return new Date().toISOString()}function I(B){if(!B||typeof B!=="object"||Array.isArray(B))return null;return B}function M(B){return typeof B==="string"&&B.trim().length>0?B:null}function x(B,J){let K=I(J);if(!K)return null;let z=M(K.kind),$=M(K.sessionId);if(!z||!$)return null;if(z==="session.start"||z==="session.end"||z==="idle.flush")return{kind:z,platform:B,sessionId:$,occurredAt:M(K.occurredAt)??l(),metadata:I(K.metadata)??void 0};if(z==="chat.message"){let N=M(K.text);if(!N)return null;let W=M(K.role);return{kind:z,platform:B,sessionId:$,text:N,role:W==="assistant"||W==="system"?W:"user",occurredAt:M(K.occurredAt)??l(),metadata:I(K.metadata)??void 0}}if(z==="tool.execute"){let N=M(K.toolName),W=M(K.output);if(!N||!W)return null;return{kind:z,platform:B,sessionId:$,callId:M(K.callId)??`${B}-${Date.now()}`,toolName:N,output:W,occurredAt:M(K.occurredAt)??l(),metadata:I(K.metadata)??void 0}}return null}function KB(B){let J=B.type??B.event;if(!J)return null;if(J==="session.start")return"session.start";if(J==="session.end")return"session.end";if(J==="idle.flush")return"idle.flush";if(J==="tool.execute")return"tool.execute";if(J==="chat.message")return"chat.message";return null}class U0{descriptor=A0;normalize(B){if(!B||typeof B!=="object"||Array.isArray(B))return null;let J=B,K=KB(J);if(!K||!J.sessionId)return null;return x("claude-code",{kind:K,sessionId:J.sessionId,callId:J.callId,toolName:J.toolName,output:J.output,role:J.role,text:J.text,occurredAt:J.occurredAt,metadata:J.metadata})}}function X0(){return new U0}function zB(B){let J=B.eventName??B.event;if(!J)return null;if(J==="sessionStart")return"session.start";if(J==="sessionEnd")return"session.end";if(J==="idleFlush")return"idle.flush";if(J==="toolExecute")return"tool.execute";if(J==="chatMessage")return"chat.message";return null}class Y0{descriptor=V0;normalize(B){if(!B||typeof B!=="object"||Array.isArray(B))return null;let J=B,K=zB(J),z=J.sessionId??J.session;if(!K||!z)return null;return x("cursor",{kind:K,sessionId:z,callId:J.callId??J.invocationId,toolName:J.toolName??J.tool,output:J.output,role:J.role,text:J.text??J.message,occurredAt:J.occurredAt??J.timestamp,metadata:J.metadata??J.meta})}}function H0(){return new Y0}function w(B,J=""){if(!B)return B;return B.replace(/<private>[\s\S]*?<\/private>/gi,J)}var L0=200,$B=/(\([\s\S]*[+*]\)\s*[+*?])|(\(\.\*\)\+)|(\(\.\+\)\+)/;function g(B,J,K="[REDACTED]"){if(!B||J.length===0)return B;let z=B;for(let $ of J){if($.length>L0){console.warn(`[open-mem] Skipping oversized redaction pattern (${$.length} chars, max ${L0})`);continue}if($B.test($)){console.warn("[open-mem] Skipping potentially dangerous redaction pattern (nested quantifiers detected)");continue}try{z=z.replace(new RegExp($,"g"),K)}catch{}}return z}var NB=20,u0=2000,S0=60;function WB(B){let J=B.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter((K)=>K.length>4);return[...new Set(J)].slice(0,5)}function D0(B){let{observations:J,sessions:K,projectPath:z,sessionId:$,text:N,agent:W,sensitivePatterns:Q=[]}=B;if(W!==void 0&&W!=="user")return!1;let R=g(w(N),Q);if(R.length<NB)return!1;K.getOrCreate($,z);let Z=`User request: ${R.length>S0?`${R.slice(0,S0)}...`:R}`,A=R.length>u0?`${R.slice(0,u0)}...`:R;return J.create({sessionId:$,type:"discovery",title:Z,subtitle:"",facts:[],narrative:A,concepts:WB(R),filesRead:[],filesModified:[],rawToolOutput:"",toolName:"chat.message",tokenCount:Math.ceil(A.length/4),discoveryTokens:0,importance:3}),!0}import{existsSync as LB}from"fs";import{readFile as uB,writeFile as SB}from"fs/promises";import{join as DB}from"path";import{existsSync as C0}from"fs";import{mkdir as EB,readFile as RB,rename as QB,unlink as ZB,writeFile as AB}from"fs/promises";import{dirname as p,isAbsolute as d,join as T,normalize as VB,relative as r,resolve as j,sep as b}from"path";var q="<!-- open-mem-context -->",O="<!-- /open-mem-context -->",_0={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"},M0=new Map,UB=new Set(["node_modules",".git","dist","coverage",".open-mem","build","__pycache__",".next",".nuxt"]);async function G0(B,J,K){if(J.length===0)return;if(K.mode==="single")return XB(B,J,K);let{maxDepth:z,filename:$}=K,N=[];for(let R of J){for(let E of R.filesModified)N.push(E);for(let E of R.filesRead)N.push(E)}let W=F0(N,B,z);if(W.size===0)return;let Q=m0(J,W,B);for(let[R,E]of Q)try{let Z=YB(R,E,B);await k0(R,Z,$)}catch(Z){console.error(`[open-mem] Failed to update AGENTS.md in ${R}:`,Z)}}async function XB(B,J,K){let{maxDepth:z,filename:$}=K,N=J.filter(n);if(N.length===0)return;let W=[];for(let U of N){for(let L of U.filesModified)W.push(L);for(let L of U.filesRead)W.push(L)}let Q=F0(W,B,z),R=m0(N,Q,B),E=N.filter((U)=>{return[...U.filesModified,...U.filesRead].some((u)=>{if(!u)return!1;let S=d(u)?u:T(B,u);return j(p(S))===j(B)})});if(E.length>0)R.set(j(B),E);if(R.size===0)return;let Z=[];Z.push("## Project Activity (auto-generated by open-mem)"),Z.push("");let A=[...R.entries()].map(([U,L])=>({relPath:r(B,U)||".",observations:L})).sort((U,L)=>U.relPath.localeCompare(L.relPath));for(let{relPath:U,observations:L}of A){let u=L.filter(n).sort((X,H)=>H.createdAt.localeCompare(X.createdAt)).slice(0,10);if(u.length===0)continue;Z.push(`### ${U}/`),Z.push("| ID | Type | Title | Date |"),Z.push("|----|------|-------|------|");for(let X of u){let H=_0[X.type]||"\uD83D\uDCDD",G=X.createdAt.split("T")[0],JB=X.title.replace(/\|/g,"\\|");Z.push(`| ${X.id} | ${H} ${X.type} | ${JB} | ${G} |`)}let S=new Set;for(let X of u)for(let H of X.concepts)S.add(H);if(S.size>0){let X=[...S].slice(0,10).join(", ");Z.push(""),Z.push(`**Key concepts:** ${X}`)}let D=u.filter((X)=>X.type==="decision").map((X)=>X.title);if(D.length>0)Z.push(""),Z.push(`**Recent decisions:** ${D.slice(0,5).join("; ")}`);Z.push("")}Z.push("\uD83D\uDCA1 *Use `mem-find` to search full details. Use `mem-create` to save important decisions.*");let Y=Z.join(`
4
- `);await k0(B,Y,$)}function n(B){return!/^\w[\w-]*\s+execution$/i.test(B.title)}function YB(B,J,K){let z=[...J].filter(n).sort((E,Z)=>Z.createdAt.localeCompare(E.createdAt)).slice(0,10),$=r(K,B)||".",N=[];N.push(`## Recent Activity in \`${$}/\` (auto-generated by open-mem)`),N.push(""),N.push("| ID | Type | Title | Date |"),N.push("|----|------|-------|------|");for(let E of z){let Z=_0[E.type]||"\uD83D\uDCDD",A=E.createdAt.split("T")[0],Y=E.title.replace(/\|/g,"\\|");N.push(`| ${E.id} | ${Z} ${E.type} | ${Y} | ${A} |`)}let W=new Set;for(let E of z)for(let Z of E.concepts)W.add(Z);if(W.size>0){let E=[...W].slice(0,10).join(", ");N.push(""),N.push(`**Key concepts:** ${E}`)}let Q=z.filter((E)=>E.type==="decision").map((E)=>E.title);if(Q.length>0)N.push(""),N.push(`**Recent decisions:** ${Q.slice(0,5).join("; ")}`);let R=z.filter((E)=>E.type==="decision"&&E.narrative).slice(0,3);if(R.length>0){N.push(""),N.push("**Decision details:**");for(let E of R){let Z=E.narrative.split(/[.!?]\s/)[0],A=Z.length>120?`${Z.slice(0,117)}...`:Z;N.push(`- \u2696\uFE0F ${E.title}: ${A}`)}}return N.push(""),N.push("\uD83D\uDCA1 *Use `mem-find` to search full details across all sessions. Use `mem-create` to save important decisions.*"),N.join(`
5
- `)}async function k0(B,J,K){if(!C0(B))return;let $=(M0.get(B)??Promise.resolve()).then(async()=>{let N=T(B,K),W=T(B,`.${K}.tmp`),Q="";try{Q=await RB(N,"utf-8")}catch{}let R=HB(Q,J);try{await EB(p(W),{recursive:!0}),await AB(W,R,"utf-8"),await QB(W,N)}catch(E){try{await ZB(W)}catch{}throw E}});return M0.set(B,$.catch(()=>{})),$}function HB(B,J){if(!B)return`${q}
3
+ var F=import.meta.require;import{createInterface as EJ}from"readline";import{parseArgs as ZJ}from"util";var A0={name:"claude-code",version:"0.1",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}},X0={name:"cursor",version:"0.1",capabilities:{nativeSessionLifecycle:!1,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}};function c(){return new Date().toISOString()}function I(B){if(!B||typeof B!=="object"||Array.isArray(B))return null;return B}function G(B){return typeof B==="string"&&B.trim().length>0?B:null}function w(B,J){let K=I(J);if(!K)return null;let z=G(K.kind),$=G(K.sessionId);if(!z||!$)return null;if(z==="session.start"||z==="session.end"||z==="idle.flush")return{kind:z,platform:B,sessionId:$,occurredAt:G(K.occurredAt)??c(),metadata:I(K.metadata)??void 0};if(z==="chat.message"){let N=G(K.text);if(!N)return null;let W=G(K.role);return{kind:z,platform:B,sessionId:$,text:N,role:W==="assistant"||W==="system"?W:"user",occurredAt:G(K.occurredAt)??c(),metadata:I(K.metadata)??void 0}}if(z==="tool.execute"){let N=G(K.toolName),W=G(K.output);if(!N||!W)return null;return{kind:z,platform:B,sessionId:$,callId:G(K.callId)??`${B}-${Date.now()}`,toolName:N,output:W,occurredAt:G(K.occurredAt)??c(),metadata:I(K.metadata)??void 0}}return null}function WB(B){let J=B.type??B.event;if(!J)return null;if(J==="session.start")return"session.start";if(J==="session.end")return"session.end";if(J==="idle.flush")return"idle.flush";if(J==="tool.execute")return"tool.execute";if(J==="chat.message")return"chat.message";return null}class Y0{descriptor=A0;normalize(B){if(!B||typeof B!=="object"||Array.isArray(B))return null;let J=B,K=WB(J);if(!K||!J.sessionId)return null;return w("claude-code",{kind:K,sessionId:J.sessionId,callId:J.callId,toolName:J.toolName,output:J.output,role:J.role,text:J.text,occurredAt:J.occurredAt,metadata:J.metadata})}}function H0(){return new Y0}function QB(B){let J=B.eventName??B.event;if(!J)return null;if(J==="sessionStart")return"session.start";if(J==="sessionEnd")return"session.end";if(J==="idleFlush")return"idle.flush";if(J==="toolExecute")return"tool.execute";if(J==="chatMessage")return"chat.message";return null}class L0{descriptor=X0;normalize(B){if(!B||typeof B!=="object"||Array.isArray(B))return null;let J=B,K=QB(J),z=J.sessionId??J.session;if(!K||!z)return null;return w("cursor",{kind:K,sessionId:z,callId:J.callId??J.invocationId,toolName:J.toolName??J.tool,output:J.output,role:J.role,text:J.text??J.message,occurredAt:J.occurredAt??J.timestamp,metadata:J.metadata??J.meta})}}function u0(){return new L0}function g(B,J=""){if(!B)return B;return B.replace(/<private>[\s\S]*?<\/private>/gi,J)}var S0=200,EB=/(\([\s\S]*[+*]\)\s*[+*?])|(\(\.\*\)\+)|(\(\.\+\)\+)/;function p(B,J,K="[REDACTED]"){if(!B||J.length===0)return B;let z=B;for(let $ of J){if($.length>S0){console.warn(`[open-mem] Skipping oversized redaction pattern (${$.length} chars, max ${S0})`);continue}if(EB.test($)){console.warn("[open-mem] Skipping potentially dangerous redaction pattern (nested quantifiers detected)");continue}try{z=z.replace(new RegExp($,"g"),K)}catch{}}return z}var ZB=20,D0=2000,G0=60;function RB(B){let J=B.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter((K)=>K.length>4);return[...new Set(J)].slice(0,5)}function M0(B){let{observations:J,sessions:K,projectPath:z,sessionId:$,text:N,agent:W,sensitivePatterns:Z=[]}=B;if(W!==void 0&&W!=="user")return!1;let Q=p(g(N),Z);if(Q.length<ZB)return!1;K.getOrCreate($,z);let R=`User request: ${Q.length>G0?`${Q.slice(0,G0)}...`:Q}`,V=Q.length>D0?`${Q.slice(0,D0)}...`:Q;return J.create({sessionId:$,type:"discovery",title:R,subtitle:"",facts:[],narrative:V,concepts:RB(Q),filesRead:[],filesModified:[],rawToolOutput:"",toolName:"chat.message",tokenCount:Math.ceil(V.length/4),discoveryTokens:0,importance:3}),!0}import{existsSync as GB}from"fs";import{readFile as MB,writeFile as _B}from"fs/promises";import{join as kB}from"path";import{existsSync as k0}from"fs";import{mkdir as VB,readFile as UB,rename as AB,unlink as XB,writeFile as YB}from"fs/promises";import{dirname as v,isAbsolute as r,join as h,normalize as HB,relative as s,resolve as j,sep as n}from"path";var f="<!-- open-mem-context -->",m="<!-- /open-mem-context -->",F0={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"},_0=new Map,LB=new Set(["node_modules",".git","dist","coverage",".open-mem","build","__pycache__",".next",".nuxt"]);async function C0(B,J,K){if(J.length===0)return;if(K.mode==="single")return uB(B,J,K);let{maxDepth:z,filename:$}=K,N=[];for(let Q of J){for(let E of Q.filesModified)N.push(E);for(let E of Q.filesRead)N.push(E)}let W=O0(N,B,z);if(W.size===0)return;let Z=m0(J,W,B);for(let[Q,E]of Z)try{let R=SB(Q,E,B);await y0(Q,R,$)}catch(R){console.error(`[open-mem] Failed to update AGENTS.md in ${Q}:`,R)}}async function uB(B,J,K){let{maxDepth:z,filename:$}=K,N=J.filter(d);if(N.length===0)return;let W=[];for(let A of N){for(let L of A.filesModified)W.push(L);for(let L of A.filesRead)W.push(L)}let Z=O0(W,B,z),Q=m0(N,Z,B),E=N.filter((A)=>{return[...A.filesModified,...A.filesRead].some((u)=>{if(!u)return!1;let S=r(u)?u:h(B,u);return j(v(S))===j(B)})});if(E.length>0)Q.set(j(B),E);if(Q.size===0)return;let R=[];R.push("## Project Activity (auto-generated by open-mem)"),R.push("");let V=[...Q.entries()].map(([A,L])=>({relPath:s(B,A)||".",observations:L})).sort((A,L)=>A.relPath.localeCompare(L.relPath));for(let{relPath:A,observations:L}of V){let u=L.filter(d).sort((X,H)=>H.createdAt.localeCompare(X.createdAt)).slice(0,10);if(u.length===0)continue;R.push(`### ${A}/`),R.push("| ID | Type | Title | Date |"),R.push("|----|------|-------|------|");for(let X of u){let H=F0[X.type]||"\uD83D\uDCDD",k=X.createdAt.split("T")[0],NB=X.title.replace(/\|/g,"\\|");R.push(`| ${X.id} | ${H} ${X.type} | ${NB} | ${k} |`)}let S=new Set;for(let X of u)for(let H of X.concepts)S.add(H);if(S.size>0){let X=[...S].slice(0,10).join(", ");R.push(""),R.push(`**Key concepts:** ${X}`)}let D=u.filter((X)=>X.type==="decision").map((X)=>X.title);if(D.length>0)R.push(""),R.push(`**Recent decisions:** ${D.slice(0,5).join("; ")}`);R.push("")}R.push("\uD83D\uDCA1 *Use `mem-find` to search full details. Use `mem-create` to save important decisions.*");let Y=R.join(`
4
+ `);await y0(B,Y,$)}function d(B){return!/^\w[\w-]*\s+execution$/i.test(B.title)}function SB(B,J,K){let z=[...J].filter(d).sort((E,R)=>R.createdAt.localeCompare(E.createdAt)).slice(0,10),$=s(K,B)||".",N=[];N.push(`## Recent Activity in \`${$}/\` (auto-generated by open-mem)`),N.push(""),N.push("| ID | Type | Title | Date |"),N.push("|----|------|-------|------|");for(let E of z){let R=F0[E.type]||"\uD83D\uDCDD",V=E.createdAt.split("T")[0],Y=E.title.replace(/\|/g,"\\|");N.push(`| ${E.id} | ${R} ${E.type} | ${Y} | ${V} |`)}let W=new Set;for(let E of z)for(let R of E.concepts)W.add(R);if(W.size>0){let E=[...W].slice(0,10).join(", ");N.push(""),N.push(`**Key concepts:** ${E}`)}let Z=z.filter((E)=>E.type==="decision").map((E)=>E.title);if(Z.length>0)N.push(""),N.push(`**Recent decisions:** ${Z.slice(0,5).join("; ")}`);let Q=z.filter((E)=>E.type==="decision"&&E.narrative).slice(0,3);if(Q.length>0){N.push(""),N.push("**Decision details:**");for(let E of Q){let R=E.narrative.split(/[.!?]\s/)[0],V=R.length>120?`${R.slice(0,117)}...`:R;N.push(`- \u2696\uFE0F ${E.title}: ${V}`)}}return N.push(""),N.push("\uD83D\uDCA1 *Use `mem-find` to search full details across all sessions. Use `mem-create` to save important decisions.*"),N.join(`
5
+ `)}async function y0(B,J,K){if(!k0(B))return;let $=(_0.get(B)??Promise.resolve()).then(async()=>{let N=h(B,K),W=h(B,`.${K}.tmp`),Z="";try{Z=await UB(N,"utf-8")}catch{}let Q=DB(Z,J);try{await VB(v(W),{recursive:!0}),await YB(W,Q,"utf-8"),await AB(W,N)}catch(E){try{await XB(W)}catch{}throw E}});return _0.set(B,$.catch(()=>{})),$}function DB(B,J){if(!B)return`${f}
6
6
  ${J}
7
- ${O}
8
- `;let K=B.indexOf(q),z=B.indexOf(O);if(K!==-1&&z!==-1&&z>K){let N=B.substring(0,K),W=B.substring(z+O.length);return`${N}${q}
7
+ ${m}
8
+ `;let K=B.indexOf(f),z=B.indexOf(m);if(K!==-1&&z!==-1&&z>K){let N=B.substring(0,K),W=B.substring(z+m.length);return`${N}${f}
9
9
  ${J}
10
- ${O}${W}`}let $=B;if(K!==-1&&z===-1)$=$.replace(q,"").trim();else if(K===-1&&z!==-1)$=$.replace(O,"").trim();else if(K!==-1&&z!==-1&&z<=K)$=$.replace(O,"").replace(q,"").trim();return`${$}
10
+ ${m}${W}`}let $=B;if(K!==-1&&z===-1)$=$.replace(f,"").trim();else if(K===-1&&z!==-1)$=$.replace(m,"").trim();else if(K!==-1&&z!==-1&&z<=K)$=$.replace(m,"").replace(f,"").trim();return`${$}
11
11
 
12
- ${q}
12
+ ${f}
13
13
  ${J}
14
- ${O}
15
- `}function F0(B,J,K){let z=new Set,$=j(J);for(let N of B){if(!N||!N.trim())continue;if(N.startsWith("~")||N.startsWith("http"))continue;let W=d(N)?N:T(J,N),Q=p(W),R=j(Q);if(!R.startsWith($+b)&&R!==$)continue;if(R===$)continue;let E=r($,R);if(E.split(b).length>K)continue;if(VB(E).split(b).some((Y)=>UB.has(Y)))continue;if(!C0(R))continue;z.add(R)}return z}function m0(B,J,K){let z=new Map;for(let $ of B){let N=[...$.filesModified,...$.filesRead],W=new Set;for(let Q of N){if(!Q)continue;let R=d(Q)?Q:T(K,Q),E=j(p(R));if(J.has(E))W.add(E)}for(let Q of W){let R=z.get(Q)??[];R.push($),z.set(Q,R)}}return z}function y0(B,J,K){if(B.retentionDays===0)return;try{let z=J.deleteOlderThan(B.retentionDays),$=K.deleteCompletedOlderThan(B.retentionDays);if(z>0||$>0)console.log(`[open-mem] Retention: deleted ${z} observations, ${$} pending messages`)}catch(z){console.error("[open-mem] Retention enforcement error:",z)}}async function v(B,J,K){let{queue:z,sessions:$,projectPath:N,config:W,observations:Q,pendingMessages:R}=B;switch(J){case"session.created":{if(K)$.getOrCreate(K,N);try{y0(W,Q,R)}catch(E){console.error("[open-mem] Retention enforcement error:",E)}try{await MB(N)}catch(E){console.error("[open-mem] Gitignore entry error:",E)}break}case"session.idle":{if(z.processBatch().catch((E)=>{console.error("[open-mem] Background processing error:",E)}),K)$.updateStatus(K,"idle"),O0(K,N,W,Q).catch((E)=>{console.error("[open-mem] Folder context error:",E)});break}case"session.completed":case"session.ended":{if(K)await z.processBatch(),await z.summarizeSession(K),$.markCompleted(K),await O0(K,N,W,Q);break}}}async function O0(B,J,K,z){if(!K.folderContextEnabled)return;try{let $=z.getBySession(B);if($.length>0)await G0(J,$,{mode:K.folderContextMode,filename:K.folderContextFilename,maxDepth:K.folderContextMaxDepth})}catch($){console.error("[open-mem] Folder context update error:",$)}}async function MB(B){let J=DB(B,".gitignore");if(!LB(J))return;let K=await uB(J,"utf-8");if(K.includes("AGENTS.md"))return;let z=`
14
+ ${m}
15
+ `}function O0(B,J,K){let z=new Set,$=j(J);for(let N of B){if(!N||!N.trim())continue;if(N.startsWith("~")||N.startsWith("http"))continue;let W=r(N)?N:h(J,N),Z=v(W),Q=j(Z);if(!Q.startsWith($+n)&&Q!==$)continue;if(Q===$)continue;let E=s($,Q);if(E.split(n).length>K)continue;if(HB(E).split(n).some((Y)=>LB.has(Y)))continue;if(!k0(Q))continue;z.add(Q)}return z}function m0(B,J,K){let z=new Map;for(let $ of B){let N=[...$.filesModified,...$.filesRead],W=new Set;for(let Z of N){if(!Z)continue;let Q=r(Z)?Z:h(K,Z),E=j(v(Q));if(J.has(E))W.add(E)}for(let Z of W){let Q=z.get(Z)??[];Q.push($),z.set(Z,Q)}}return z}function P0(B,J,K){if(B.retentionDays===0)return;try{let z=J.deleteOlderThan(B.retentionDays),$=K.deleteCompletedOlderThan(B.retentionDays);if(z>0||$>0)console.log(`[open-mem] Retention: deleted ${z} observations, ${$} pending messages`)}catch(z){console.error("[open-mem] Retention enforcement error:",z)}}async function b(B,J,K){let{queue:z,sessions:$,projectPath:N,config:W,observations:Z,pendingMessages:Q}=B;switch(J){case"session.created":{if(K)$.getOrCreate(K,N);try{P0(W,Z,Q)}catch(E){console.error("[open-mem] Retention enforcement error:",E)}try{await FB(N)}catch(E){console.error("[open-mem] Gitignore entry error:",E)}break}case"session.idle":{if(z.processBatch().catch((E)=>{console.error("[open-mem] Background processing error:",E)}),K)$.updateStatus(K,"idle"),q0(K,N,W,Z).catch((E)=>{console.error("[open-mem] Folder context error:",E)});break}case"session.completed":case"session.ended":{if(K)await z.processBatch(),await z.summarizeSession(K),$.markCompleted(K),await q0(K,N,W,Z);break}}}async function q0(B,J,K,z){if(!K.folderContextEnabled)return;try{let $=z.getBySession(B);if($.length>0)await C0(J,$,{mode:K.folderContextMode,filename:K.folderContextFilename,maxDepth:K.folderContextMaxDepth})}catch($){console.error("[open-mem] Folder context update error:",$)}}async function FB(B){let J=kB(B,".gitignore");if(!GB(J))return;let K=await MB(J,"utf-8");if(K.includes("AGENTS.md"))return;let z=`
16
16
  # open-mem: Auto-generated folder context files.
17
17
  # Uncomment to exclude from version control (recommended for large projects):
18
18
  # **/AGENTS.md
19
- `;await SB(J,K.endsWith(`
19
+ `;await _B(J,K.endsWith(`
20
20
  `)?K+z:`${K}
21
- ${z}`,"utf-8")}function f0(B){let{config:J,queue:K,sessions:z,projectPath:$,tool:N,sessionId:W,callId:Q,toolOutput:R}=B;if(J.ignoredTools.includes(N))return!1;if(!R||R.length<J.minOutputLength)return!1;let E=g(R,J.sensitivePatterns);return E=w(E,"[PRIVATE]"),z.getOrCreate(W,$),K.enqueue(W,N,E,Q),!0}class s{adapter;lifecycleDeps;queue;sessions;observations;projectPath;config;constructor(B){this.adapter=B.adapter,this.queue=B.queue,this.sessions=B.sessions,this.observations=B.observations,this.projectPath=B.projectPath,this.config=B.config,this.lifecycleDeps={queue:B.queue,sessions:B.sessions,projectPath:B.projectPath,config:B.config,observations:B.observations,pendingMessages:B.pendingMessages}}platform(){return this.adapter.descriptor.name}normalize(B){return this.adapter.normalize(B)}async ingestRaw(B){let J=this.normalize(B);if(!J)return!1;return await this.ingestNormalized(J),!0}async ingestNormalized(B){switch(B.kind){case"session.start":await v(this.lifecycleDeps,"session.created",B.sessionId);return;case"session.end":await v(this.lifecycleDeps,"session.ended",B.sessionId);return;case"idle.flush":await v(this.lifecycleDeps,"session.idle",B.sessionId);return;case"tool.execute":f0({config:this.config,queue:this.queue,sessions:this.sessions,projectPath:this.projectPath,tool:B.toolName,sessionId:B.sessionId,callId:B.callId,toolOutput:B.output});return;case"chat.message":D0({observations:this.observations,sessions:this.sessions,projectPath:this.projectPath,sessionId:B.sessionId,text:B.text,agent:B.role==="user"?"user":B.role,sensitivePatterns:this.config.sensitivePatterns});return}}}import{generateText as PB}from"ai";function C(B){if(typeof B!=="object"||B===null)return!1;let J=B,K=J.status;if(K===429||K===500||K===503)return!0;let z=J.error;if(typeof z==="object"&&z!==null&&z.type==="overloaded_error")return!0;return!1}function i(B){if(B&&typeof B==="object"){let J=B.status;if(typeof J==="number")return J===400||J===401||J===403}return!1}function f(B){return new Promise((J)=>setTimeout(J,B))}var CB=new Set(["decision","bugfix","feature","refactor","discovery","change"]);function V(B,J){let K=new RegExp(`<${J}[^>]*>([\\s\\S]*?)</${J}>`,"i"),z=B.match(K);return z?z[1].trim():""}function _(B,J){let K=new RegExp(`<${J}[^>]*>([\\s\\S]*?)</${J}>`,"gi"),z=[];for(let $ of B.matchAll(K)){let N=$[1].trim();if(N)z.push(N)}return z}function P0(B){let J=V(B,"observation");if(!J)return null;let K=V(J,"type").toLowerCase(),z=CB.has(K)?K:"discovery",$=V(J,"title")||"Untitled observation",N=V(J,"subtitle"),W=V(J,"narrative"),Q=_(V(J,"facts"),"fact"),R=_(V(J,"concepts"),"concept"),E=_(V(J,"files_read"),"file"),Z=_(V(J,"files_modified"),"file"),A=V(J,"importance"),Y=Number.parseInt(A,10),U=Number.isNaN(Y)?3:Math.max(1,Math.min(5,Y));return{type:z,title:$,subtitle:N,facts:Q,narrative:W,concepts:R,filesRead:E,filesModified:Z,importance:U}}function q0(B){let J=V(B,"session_summary");if(!J)return null;let K=V(J,"summary")||"No summary available",z=_(V(J,"key_decisions"),"decision"),$=_(V(J,"files_modified"),"file"),N=_(V(J,"concepts"),"concept"),W=V(J,"request")||void 0,Q=V(J,"investigated")||void 0,R=V(J,"learned")||void 0,E=V(J,"completed")||void 0,Z=V(J,"next_steps")||void 0;return{summary:K,keyDecisions:z,filesModified:$,concepts:N,request:W,investigated:Q,learned:R,completed:E,nextSteps:Z}}var _B=new Set(["new_fact","update","duplicate"]);function j0(B){let J=V(B,"evaluation");if(!J)return null;let K=V(J,"outcome").toLowerCase().trim();if(!_B.has(K))return null;let z=K,$=V(J,"reason");if(!$)return null;let N=V(J,"supersedes"),W={outcome:z,reason:$};if(z==="update"&&N)W.supersedesId=N;if(z==="update"&&!W.supersedesId)return null;return W}var GB=new Set(["technology","library","pattern","concept","file","person","project","other"]),kB=new Set(["uses","depends_on","implements","extends","related_to","replaces","configures"]);function T0(B){let J=V(B,"extraction");if(!J)return null;let K=V(J,"entities"),z=V(J,"relations"),$=_(K,"entity"),N=[];for(let R of $){let E=V(R,"name");if(!E)continue;let Z=V(R,"type").toLowerCase(),A=GB.has(Z)?Z:"other";N.push({name:E,entityType:A})}let W=_(z,"relation"),Q=[];for(let R of W){let E=V(R,"source"),Z=V(R,"target"),A=V(R,"relationship").toLowerCase();if(!E||!Z||!A)continue;if(!kB.has(A))continue;Q.push({sourceName:E,targetName:Z,relationship:A})}return{entities:N,relations:Q}}function P(B){return Math.ceil(B.length/4)}function h0(B,J,K){let z=K?`<session_context>
21
+ ${z}`,"utf-8")}function f0(B){let{config:J,queue:K,sessions:z,projectPath:$,tool:N,sessionId:W,callId:Z,toolOutput:Q}=B;if(J.ignoredTools.includes(N))return!1;if(!Q||Q.length<J.minOutputLength)return!1;let E=p(Q,J.sensitivePatterns);return E=g(E,"[PRIVATE]"),z.getOrCreate(W,$),K.enqueue(W,N,E,Z),!0}class i{adapter;lifecycleDeps;queue;sessions;observations;projectPath;config;constructor(B){this.adapter=B.adapter,this.queue=B.queue,this.sessions=B.sessions,this.observations=B.observations,this.projectPath=B.projectPath,this.config=B.config,this.lifecycleDeps={queue:B.queue,sessions:B.sessions,projectPath:B.projectPath,config:B.config,observations:B.observations,pendingMessages:B.pendingMessages}}platform(){return this.adapter.descriptor.name}normalize(B){return this.adapter.normalize(B)}async ingestRaw(B){let J=this.normalize(B);if(!J)return!1;return await this.ingestNormalized(J),!0}async ingestNormalized(B){switch(B.kind){case"session.start":await b(this.lifecycleDeps,"session.created",B.sessionId);return;case"session.end":await b(this.lifecycleDeps,"session.ended",B.sessionId);return;case"idle.flush":await b(this.lifecycleDeps,"session.idle",B.sessionId);return;case"tool.execute":f0({config:this.config,queue:this.queue,sessions:this.sessions,projectPath:this.projectPath,tool:B.toolName,sessionId:B.sessionId,callId:B.callId,toolOutput:B.output});return;case"chat.message":M0({observations:this.observations,sessions:this.sessions,projectPath:this.projectPath,sessionId:B.sessionId,text:B.text,agent:B.role==="user"?"user":B.role,sensitivePatterns:this.config.sensitivePatterns});return}}}import{generateText as hB}from"ai";function M(B){if(typeof B!=="object"||B===null)return!1;let J=B,K=J.status;if(K===429||K===500||K===503)return!0;let z=J.error;if(typeof z==="object"&&z!==null&&z.type==="overloaded_error")return!0;return!1}function t(B){if(B&&typeof B==="object"){let J=B.status;if(typeof J==="number")return J===400||J===401||J===403}return!1}function P(B){return new Promise((J)=>setTimeout(J,B))}var CB=new Set(["decision","bugfix","feature","refactor","discovery","change"]);function U(B,J){let K=new RegExp(`<${J}[^>]*>([\\s\\S]*?)</${J}>`,"i"),z=B.match(K);return z?z[1].trim():""}function _(B,J){let K=new RegExp(`<${J}[^>]*>([\\s\\S]*?)</${J}>`,"gi"),z=[];for(let $ of B.matchAll(K)){let N=$[1].trim();if(N)z.push(N)}return z}function j0(B){let J=U(B,"observation");if(!J)return null;let K=U(J,"type").toLowerCase(),z=CB.has(K)?K:"discovery",$=U(J,"title")||"Untitled observation",N=U(J,"subtitle"),W=U(J,"narrative"),Z=_(U(J,"facts"),"fact"),Q=_(U(J,"concepts"),"concept"),E=_(U(J,"files_read"),"file"),R=_(U(J,"files_modified"),"file"),V=U(J,"importance"),Y=Number.parseInt(V,10),A=Number.isNaN(Y)?3:Math.max(1,Math.min(5,Y));return{type:z,title:$,subtitle:N,facts:Z,narrative:W,concepts:Q,filesRead:E,filesModified:R,importance:A}}function T0(B){let J=U(B,"session_summary");if(!J)return null;let K=U(J,"summary")||"No summary available",z=_(U(J,"key_decisions"),"decision"),$=_(U(J,"files_modified"),"file"),N=_(U(J,"concepts"),"concept"),W=U(J,"request")||void 0,Z=U(J,"investigated")||void 0,Q=U(J,"learned")||void 0,E=U(J,"completed")||void 0,R=U(J,"next_steps")||void 0;return{summary:K,keyDecisions:z,filesModified:$,concepts:N,request:W,investigated:Z,learned:Q,completed:E,nextSteps:R}}var yB=new Set(["new_fact","update","duplicate"]);function h0(B){let J=U(B,"evaluation");if(!J)return null;let K=U(J,"outcome").toLowerCase().trim();if(!yB.has(K))return null;let z=K,$=U(J,"reason");if(!$)return null;let N=U(J,"supersedes"),W={outcome:z,reason:$};if(z==="update"&&N)W.supersedesId=N;if(z==="update"&&!W.supersedesId)return null;return W}var OB=new Set(["technology","library","pattern","concept","file","person","project","other"]),mB=new Set(["uses","depends_on","implements","extends","related_to","replaces","configures"]);function x0(B){let J=U(B,"extraction");if(!J)return null;let K=U(J,"entities"),z=U(J,"relations"),$=_(K,"entity"),N=[];for(let Q of $){let E=U(Q,"name");if(!E)continue;let R=U(Q,"type").toLowerCase(),V=OB.has(R)?R:"other";N.push({name:E,entityType:V})}let W=_(z,"relation"),Z=[];for(let Q of W){let E=U(Q,"source"),R=U(Q,"target"),V=U(Q,"relationship").toLowerCase();if(!E||!R||!V)continue;if(!mB.has(V))continue;Z.push({sourceName:E,targetName:R,relationship:V})}return{entities:N,relations:Z}}function q(B){return Math.ceil(B.length/4)}function I0(B,J,K,z){let $=K?`<session_context>
22
22
  ${K}
23
23
  </session_context>
24
24
 
25
- `:"";return`<task>
25
+ `:"",N=z?z.observationTypes.join("|"):"decision|bugfix|feature|refactor|discovery|change",Z=(z?z.conceptVocabulary:["how-it-works","why-it-exists","what-changed","problem-solution","gotcha","pattern","trade-off"]).map((Q)=>{let R={"how-it-works":"Technical mechanisms and behaviors","why-it-exists":"Rationale and motivations","what-changed":"Modifications and their effects","problem-solution":"Issues encountered and how they were resolved",gotcha:"Surprising behaviors, edge cases, or pitfalls",pattern:"Recurring design patterns or approaches","trade-off":"Deliberate compromises between competing concerns",hypothesis:"Proposed explanations or predictions",finding:"Key results or discoveries",methodology:"Research methods and approaches",evidence:"Supporting data or observations",limitation:"Known constraints or boundaries",implication:"Consequences or downstream effects",comparison:"Similarities and differences between approaches"}[Q];return R?`- ${Q}: ${R}`:`- ${Q}`}).join(`
26
+ `);return`<task>
26
27
  Analyze the following tool output and extract a structured observation.
27
28
  </task>
28
29
 
@@ -32,22 +33,16 @@ Analyze the following tool output and extract a structured observation.
32
33
  ${J}
33
34
  </tool_output>
34
35
 
35
- ${z}<instructions>
36
+ ${$}<instructions>
36
37
  Extract a structured observation from the tool output. Determine the most appropriate type and provide a concise but informative summary.
37
38
 
38
39
  When extracting concepts, prefer established vocabulary where appropriate:
39
- - how-it-works: Technical mechanisms and behaviors
40
- - why-it-exists: Rationale and motivations
41
- - what-changed: Modifications and their effects
42
- - problem-solution: Issues encountered and how they were resolved
43
- - gotcha: Surprising behaviors, edge cases, or pitfalls
44
- - pattern: Recurring design patterns or approaches
45
- - trade-off: Deliberate compromises between competing concerns
40
+ ${Z}
46
41
  You may also use any domain-specific concepts relevant to the observation.
47
42
 
48
43
  Respond with EXACTLY this XML format:
49
44
  <observation>
50
- <type>decision|bugfix|feature|refactor|discovery|change</type>
45
+ <type>${N}</type>
51
46
  <title>Brief descriptive title (max 80 chars)</title>
52
47
  <subtitle>One-line elaboration</subtitle>
53
48
  <importance>1-5 (1=trivial/routine, 2=low, 3=normal, 4=significant, 5=critical decision or discovery)</importance>
@@ -67,7 +62,7 @@ Respond with EXACTLY this XML format:
67
62
  <file>path/to/file/modified</file>
68
63
  </files_modified>
69
64
  </observation>
70
- </instructions>`}function I0(B,J){let K=B.map((z,$)=>` <obs index="${$+1}" type="${z.type}">
65
+ </instructions>`}function w0(B,J){let K=B.map((z,$)=>` <obs index="${$+1}" type="${z.type}">
71
66
  <title>${z.title}</title>
72
67
  <narrative>${z.narrative}</narrative>
73
68
  </obs>`).join(`
@@ -102,7 +97,7 @@ Respond with EXACTLY this XML format:
102
97
  <concept>key-concept</concept>
103
98
  </concepts>
104
99
  </session_summary>
105
- </instructions>`}function x0(B,J){let K=J.map((z)=>` <candidate id="${z.id}">
100
+ </instructions>`}function g0(B,J){let K=J.map((z)=>` <candidate id="${z.id}">
106
101
  <title>${z.title}</title>
107
102
  <narrative>${z.narrative}</narrative>
108
103
  <concepts>${z.concepts.join(", ")}</concepts>
@@ -131,22 +126,22 @@ Respond with EXACTLY this XML format:
131
126
  <reason>Brief explanation</reason>
132
127
  </evaluation>
133
128
  </instructions>
134
- </conflict_evaluation>`}function w0(B){let J=[...B.filesRead,...B.filesModified];return`<entity_extraction>
129
+ </conflict_evaluation>`}function p0(B,J){let K=[...B.filesRead,...B.filesModified],z=J?J.entityTypes.join(", "):"technology, library, pattern, concept, file, person, project, other",$=J?J.relationshipTypes.join(", "):"uses, depends_on, implements, extends, related_to, replaces, configures";return`<entity_extraction>
135
130
  <observation>
136
131
  <title>${B.title}</title>
137
132
  <type>${B.type}</type>
138
133
  <narrative>${B.narrative}</narrative>
139
134
  <facts>${B.facts.join(`
140
135
  `)}</facts>
141
- <files>${J.join(`
136
+ <files>${K.join(`
142
137
  `)}</files>
143
138
  <concepts>${B.concepts.join(", ")}</concepts>
144
139
  </observation>
145
140
  <instructions>
146
141
  Extract entities and relationships from this observation.
147
142
 
148
- Entity types: technology, library, pattern, concept, file, person, project, other
149
- Relationship types: uses, depends_on, implements, extends, related_to, replaces, configures
143
+ Entity types: ${z}
144
+ Relationship types: ${$}
150
145
 
151
146
  Extract entities that are clearly mentioned or strongly implied. For example, "React hooks" implies a relationship between React and hooks. Do not extract speculative relationships.
152
147
  Respond with EXACTLY this XML format:
@@ -160,19 +155,19 @@ Respond with EXACTLY this XML format:
160
155
  </relations>
161
156
  </extraction>
162
157
  </instructions>
163
- </entity_extraction>`}class o{specificationVersion;provider;modelId;supportedUrls;providers;constructor(B){if(B.length===0)throw Error("At least one provider required");let J=B[0].model;this.specificationVersion=J.specificationVersion,this.provider=J.provider,this.modelId=J.modelId,this.supportedUrls=J.supportedUrls,this.providers=B}async doGenerate(B){let J;for(let K=0;K<this.providers.length;K++){let z=this.providers[K];try{return await z.model.doGenerate(B)}catch($){if(J=$,i($))throw $;if(C($)&&K<this.providers.length-1){let N=this.providers[K+1],W=$.status??"unknown";console.error(`[open-mem] Provider ${z.name} failed (${W}), falling over to ${N.name}`);continue}throw $}}throw J}async doStream(B){let J;for(let K=0;K<this.providers.length;K++){let z=this.providers[K];try{return await z.model.doStream(B)}catch($){if(J=$,i($))throw $;if(C($)&&K<this.providers.length-1){let N=this.providers[K+1],W=$.status??"unknown";console.error(`[open-mem] Provider ${z.name} failed (${W}), falling over to ${N.name}`);continue}throw $}}throw J}}var FB={"claude-sonnet-4-20250514":"us.anthropic.claude-sonnet-4-20250514-v1:0","claude-opus-4-20250514":"us.anthropic.claude-opus-4-20250514-v1:0","claude-3-5-sonnet-20241022":"us.anthropic.claude-3-5-sonnet-20241022-v2:0","claude-3-5-haiku-20241022":"us.anthropic.claude-3-5-haiku-20241022-v1:0","claude-3-haiku-20240307":"anthropic.claude-3-haiku-20240307-v1:0"};function mB(B){if(B.includes("."))return B;return FB[B]||`us.anthropic.${B}-v1:0`}function g0(B){switch(B.provider){case"anthropic":{let{createAnthropic:J}=k("@ai-sdk/anthropic");return J({apiKey:B.apiKey})(B.model)}case"bedrock":{let{createAmazonBedrock:J}=k("@ai-sdk/amazon-bedrock");return J()(mB(B.model))}case"openai":{let{createOpenAI:J}=k("@ai-sdk/openai");return J({apiKey:B.apiKey})(B.model)}case"google":{let{createGoogleGenerativeAI:J}=k("@ai-sdk/google");return J({apiKey:B.apiKey})(B.model)}case"openrouter":{let{createOpenRouter:J}=k("@openrouter/ai-sdk-provider");return J({apiKey:B.apiKey})(B.model)}default:throw Error(`Unknown provider: ${B.provider}. Supported: anthropic, bedrock, openai, google, openrouter`)}}function p0(B){try{switch(B.provider){case"google":{let{createGoogleGenerativeAI:J}=k("@ai-sdk/google");return J({apiKey:B.apiKey}).embedding("text-embedding-004")}case"openai":{let{createOpenAI:J}=k("@ai-sdk/openai");return J({apiKey:B.apiKey}).embedding("text-embedding-3-small")}case"bedrock":{let{createAmazonBedrock:J}=k("@ai-sdk/amazon-bedrock");return J().embedding("amazon.titan-embed-text-v2:0")}case"anthropic":return null;case"openrouter":return null;default:return null}}catch{return null}}var yB={google:"gemini-2.5-flash-lite",anthropic:"claude-sonnet-4-20250514",openai:"gpt-4o-mini",bedrock:"us.anthropic.claude-3-5-haiku-20241022-v1:0",openrouter:"google/gemini-2.5-flash-lite"};function OB(B){switch(B){case"google":return process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;case"anthropic":return process.env.ANTHROPIC_API_KEY;case"openai":return process.env.OPENAI_API_KEY;case"openrouter":return process.env.OPENROUTER_API_KEY;case"bedrock":return;default:return}}function F(B){if(!B.fallbackProviders||B.fallbackProviders.length===0)return[];return B.fallbackProviders.map((J)=>({provider:J,model:yB[J]??"gemini-2.5-flash-lite",apiKey:OB(J)}))}function m(B,J=[]){let K=g0(B);if(J.length===0)return K;let z=[{name:B.provider,model:K},...J.map(($)=>({name:$.provider,model:g0($)}))];return new o(z)}var fB={"gemini-2.5-flash-lite":10,"gemini-2.5-flash":10,"gemini-2.5-pro":5,"gemini-2.0-flash":15,"gemini-2.0-flash-lite":30,"gemini-3-flash":5},v0=0;async function y(B,J){if(!J)return;let K=fB[B]||5,z=Math.ceil(60000/K)+100,N=Date.now()-v0;if(N<z){let W=z-N;await new Promise((Q)=>setTimeout(Q,W))}v0=Date.now()}class h{model;config;_generate=PB;constructor(B){this.config=B,this.model=null;let J=B.provider!=="bedrock";if(B.compressionEnabled&&(!J||B.apiKey))try{this.model=m({provider:B.provider,model:B.model,apiKey:B.apiKey},F(B))}catch{}}static MAX_INPUT_LENGTH=50000;async compress(B,J,K){if(!this.config.compressionEnabled||!this.model)return null;if(J.length<this.config.minOutputLength)return null;let z=P(J),$=J.length>h.MAX_INPUT_LENGTH?`${J.substring(0,h.MAX_INPUT_LENGTH)}
158
+ </entity_extraction>`}class a{specificationVersion;provider;modelId;supportedUrls;providers;constructor(B){if(B.length===0)throw Error("At least one provider required");let J=B[0].model;this.specificationVersion=J.specificationVersion,this.provider=J.provider,this.modelId=J.modelId,this.supportedUrls=J.supportedUrls,this.providers=B}async doGenerate(B){let J;for(let K=0;K<this.providers.length;K++){let z=this.providers[K];try{return await z.model.doGenerate(B)}catch($){if(J=$,t($))throw $;if(M($)&&K<this.providers.length-1){let N=this.providers[K+1],W=$.status??"unknown";console.error(`[open-mem] Provider ${z.name} failed (${W}), falling over to ${N.name}`);continue}throw $}}throw J}async doStream(B){let J;for(let K=0;K<this.providers.length;K++){let z=this.providers[K];try{return await z.model.doStream(B)}catch($){if(J=$,t($))throw $;if(M($)&&K<this.providers.length-1){let N=this.providers[K+1],W=$.status??"unknown";console.error(`[open-mem] Provider ${z.name} failed (${W}), falling over to ${N.name}`);continue}throw $}}throw J}}var PB={"claude-sonnet-4-20250514":"us.anthropic.claude-sonnet-4-20250514-v1:0","claude-opus-4-20250514":"us.anthropic.claude-opus-4-20250514-v1:0","claude-3-5-sonnet-20241022":"us.anthropic.claude-3-5-sonnet-20241022-v2:0","claude-3-5-haiku-20241022":"us.anthropic.claude-3-5-haiku-20241022-v1:0","claude-3-haiku-20240307":"anthropic.claude-3-haiku-20240307-v1:0"};function qB(B){if(B.includes("."))return B;return PB[B]||`us.anthropic.${B}-v1:0`}function v0(B){switch(B.provider){case"anthropic":{let{createAnthropic:J}=F("@ai-sdk/anthropic");return J({apiKey:B.apiKey})(B.model)}case"bedrock":{let{createAmazonBedrock:J}=F("@ai-sdk/amazon-bedrock");return J()(qB(B.model))}case"openai":{let{createOpenAI:J}=F("@ai-sdk/openai");return J({apiKey:B.apiKey})(B.model)}case"google":{let{createGoogleGenerativeAI:J}=F("@ai-sdk/google");return J({apiKey:B.apiKey})(B.model)}case"openrouter":{let{createOpenRouter:J}=F("@openrouter/ai-sdk-provider");return J({apiKey:B.apiKey})(B.model)}default:throw Error(`Unknown provider: ${B.provider}. Supported: anthropic, bedrock, openai, google, openrouter`)}}function b0(B){try{switch(B.provider){case"google":{let{createGoogleGenerativeAI:J}=F("@ai-sdk/google");return J({apiKey:B.apiKey}).embedding("text-embedding-004")}case"openai":{let{createOpenAI:J}=F("@ai-sdk/openai");return J({apiKey:B.apiKey}).embedding("text-embedding-3-small")}case"bedrock":{let{createAmazonBedrock:J}=F("@ai-sdk/amazon-bedrock");return J().embedding("amazon.titan-embed-text-v2:0")}case"anthropic":return null;case"openrouter":return null;default:return null}}catch{return null}}var fB={google:"gemini-2.5-flash-lite",anthropic:"claude-sonnet-4-20250514",openai:"gpt-4o-mini",bedrock:"us.anthropic.claude-3-5-haiku-20241022-v1:0",openrouter:"google/gemini-2.5-flash-lite"};function jB(B){switch(B){case"google":return process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;case"anthropic":return process.env.ANTHROPIC_API_KEY;case"openai":return process.env.OPENAI_API_KEY;case"openrouter":return process.env.OPENROUTER_API_KEY;case"bedrock":return;default:return}}function C(B){if(!B.fallbackProviders||B.fallbackProviders.length===0)return[];return B.fallbackProviders.map((J)=>({provider:J,model:fB[J]??"gemini-2.5-flash-lite",apiKey:jB(J)}))}function y(B,J=[]){let K=v0(B);if(J.length===0)return K;let z=[{name:B.provider,model:K},...J.map(($)=>({name:$.provider,model:v0($)}))];return new a(z)}var TB={"gemini-2.5-flash-lite":10,"gemini-2.5-flash":10,"gemini-2.5-pro":5,"gemini-2.0-flash":15,"gemini-2.0-flash-lite":30,"gemini-3-flash":5},l0=0;async function O(B,J){if(!J)return;let K=TB[B]||5,z=Math.ceil(60000/K)+100,N=Date.now()-l0;if(N<z){let W=z-N;await new Promise((Z)=>setTimeout(Z,W))}l0=Date.now()}class x{model;config;_generate=hB;constructor(B){this.config=B,this.model=null;let J=B.provider!=="bedrock";if(B.compressionEnabled&&(!J||B.apiKey))try{this.model=y({provider:B.provider,model:B.model,apiKey:B.apiKey},C(B))}catch{}}static MAX_INPUT_LENGTH=50000;async compress(B,J,K){if(!this.config.compressionEnabled||!this.model)return null;if(J.length<this.config.minOutputLength)return null;let z=q(J),$=J.length>x.MAX_INPUT_LENGTH?`${J.substring(0,x.MAX_INPUT_LENGTH)}
164
159
 
165
- [... truncated ...]`:J,N=h0(B,$,K),W=2;for(let Q=0;Q<=W;Q++)try{if(this.config.provider==="google")await y(this.config.model,this.config.rateLimitingEnabled);let{text:R}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:N}),E=P0(R);if(E)E.discoveryTokens=z;return E}catch(R){if(C(R)&&Q<W){let E=2**Q*1000;await f(E);continue}return null}return null}async compressBatch(B){let J=new Map;for(let K=0;K<B.length;K++){let z=B[K],$=await this.compress(z.toolName,z.toolOutput,z.sessionContext);if(J.set(z.callId,$),K<B.length-1)await f(200)}return J}createFallbackObservation(B,J){let K=TB(J),z=qB[B]??"discovery";return{type:z,title:`${B} execution`,subtitle:J.substring(0,100).replace(/\n/g," "),facts:[],narrative:`Tool ${B} was executed. Output length: ${J.length} chars.`,concepts:[],filesRead:z==="discovery"?K:[],filesModified:z==="change"?K:[],discoveryTokens:P(J),importance:2}}async isAvailable(){if(!this.model)return!1;try{return await this._generate({model:this.model,maxOutputTokens:10,prompt:"ping"}),!0}catch{return!1}}}var qB={Read:"discovery",Write:"change",Edit:"change",Bash:"change",Glob:"discovery",Grep:"discovery"},jB=/(?:^|\s)((?:\.\/|\/|src\/|tests\/|lib\/)\S+\.\w+)/gm;function TB(B){let J=[];for(let K of B.matchAll(jB))J.push(K[1]);return[...new Set(J)]}import{generateText as hB}from"ai";class t{model;config;_generate=hB;constructor(B){if(this.config=B,this.model=null,B.provider==="bedrock"||B.apiKey)try{this.model=m({provider:B.provider,model:B.model,apiKey:B.apiKey},F(B))}catch{}}async evaluate(B,J){if(!this.model||J.length===0)return null;let K=x0(B,J),z=2;for(let $=0;$<=z;$++)try{if(this.config.provider==="google")await y(this.config.model,this.config.rateLimitingEnabled);let{text:N}=await this._generate({model:this.model,maxOutputTokens:512,prompt:K});return j0(N)}catch(N){if(C(N)&&$<z){let W=2**$*1000;await f(W);continue}return null}return null}}import{generateText as IB}from"ai";class a{model;config;_generate=IB;constructor(B){if(this.config=B,this.model=null,B.provider==="bedrock"||B.apiKey)try{this.model=m({provider:B.provider,model:B.model,apiKey:B.apiKey},F(B))}catch{}}async extract(B){if(!this.model)return null;let J=w0(B),K=2;for(let z=0;z<=K;z++)try{if(this.config.provider==="google")await y(this.config.model,this.config.rateLimitingEnabled);let{text:$}=await this._generate({model:this.model,maxOutputTokens:1024,prompt:J});return T0($)}catch($){if(C($)&&z<K){let N=2**z*1000;await f(N);continue}return null}return null}}import{generateText as xB}from"ai";class e{model;config;_generate=xB;constructor(B){this.config=B,this.model=null;let J=B.provider!=="bedrock";if(B.compressionEnabled&&(!J||B.apiKey))try{this.model=m({provider:B.provider,model:B.model,apiKey:B.apiKey},F(B))}catch{}}async summarize(B,J){if(J.length===0)return null;if(!this.config.compressionEnabled||!this.model)return this.createFallbackSummary(J);let K=I0(J.map((z)=>({type:z.type,title:z.title,narrative:z.narrative})),B);try{if(this.config.provider==="google")await y(this.config.model,this.config.rateLimitingEnabled);let{text:z}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:K}),$=q0(z);if(!$)return this.createFallbackSummary(J);return $}catch{return this.createFallbackSummary(J)}}createFallbackSummary(B){let J=new Set,K=new Set,z=[];for(let Q of B){for(let R of Q.filesModified)J.add(R);for(let R of Q.concepts)K.add(R);if(Q.type==="decision")z.push(Q.title)}let $=new Map;for(let Q of B)$.set(Q.type,($.get(Q.type)??0)+1);let N=Array.from($.entries()).map(([Q,R])=>`${R} ${Q}${R>1?"s":""}`).join(", "),W=Array.from(K).slice(0,5).join(", ");return{summary:`Session with ${B.length} observations: ${N}. Files modified: ${J.size}. Key concepts: ${W}.`,keyDecisions:z.slice(0,5),filesModified:Array.from(J),concepts:Array.from(K)}}shouldSummarize(B){return B>=2}}import{existsSync as wB,readFileSync as gB}from"fs";var pB={dbPath:".open-mem/memory.db",provider:"google",apiKey:void 0,model:"gemini-2.5-flash-lite",maxTokensPerCompression:1024,compressionEnabled:!0,contextInjectionEnabled:!0,maxContextTokens:4000,batchSize:5,batchIntervalMs:30000,ignoredTools:[],minOutputLength:50,maxIndexEntries:20,sensitivePatterns:[],retentionDays:90,maxDatabaseSizeMb:500,logLevel:"warn",contextShowTokenCosts:!0,contextObservationTypes:"all",contextFullObservationCount:3,maxObservations:50,contextShowLastSummary:!0,rateLimitingEnabled:!0,folderContextEnabled:!0,folderContextMaxDepth:5,folderContextMode:"dispersed",folderContextFilename:"AGENTS.md",daemonEnabled:!1,dashboardEnabled:!1,dashboardPort:3737,platformOpenCodeEnabled:!0,platformClaudeCodeEnabled:!1,platformCursorEnabled:!1,mcpCompatibilityMode:"strict",mcpProtocolVersion:"2024-11-05",mcpSupportedProtocolVersions:["2024-11-05"],embeddingDimension:void 0,conflictResolutionEnabled:!1,conflictSimilarityBandLow:0.7,conflictSimilarityBandHigh:0.92,userMemoryEnabled:!1,userMemoryDbPath:"~/.config/open-mem/user-memory.db",userMemoryMaxContextTokens:1000,rerankingEnabled:!1,rerankingMaxCandidates:20,entityExtractionEnabled:!1,fallbackProviders:void 0};function vB(){let B={};if(process.env.OPEN_MEM_DB_PATH)B.dbPath=process.env.OPEN_MEM_DB_PATH;if(process.env.OPEN_MEM_PROVIDER)B.provider=process.env.OPEN_MEM_PROVIDER;if(process.env.OPEN_MEM_MODEL)B.model=process.env.OPEN_MEM_MODEL;if(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS)B.maxContextTokens=Number.parseInt(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS,10);if(process.env.OPEN_MEM_COMPRESSION==="false")B.compressionEnabled=!1;if(process.env.OPEN_MEM_CONTEXT_INJECTION==="false")B.contextInjectionEnabled=!1;if(process.env.OPEN_MEM_IGNORED_TOOLS)B.ignoredTools=process.env.OPEN_MEM_IGNORED_TOOLS.split(",").map((J)=>J.trim());if(process.env.OPEN_MEM_BATCH_SIZE)B.batchSize=Number.parseInt(process.env.OPEN_MEM_BATCH_SIZE,10);if(process.env.OPEN_MEM_RETENTION_DAYS)B.retentionDays=Number.parseInt(process.env.OPEN_MEM_RETENTION_DAYS,10);if(process.env.OPEN_MEM_LOG_LEVEL)B.logLevel=process.env.OPEN_MEM_LOG_LEVEL;if(process.env.OPEN_MEM_CONTEXT_SHOW_TOKEN_COSTS==="false")B.contextShowTokenCosts=!1;if(process.env.OPEN_MEM_CONTEXT_TYPES)B.contextObservationTypes=process.env.OPEN_MEM_CONTEXT_TYPES==="all"?"all":process.env.OPEN_MEM_CONTEXT_TYPES.split(",").map((J)=>J.trim());if(process.env.OPEN_MEM_CONTEXT_FULL_COUNT)B.contextFullObservationCount=Number.parseInt(process.env.OPEN_MEM_CONTEXT_FULL_COUNT,10);if(process.env.OPEN_MEM_MAX_OBSERVATIONS)B.maxObservations=Number.parseInt(process.env.OPEN_MEM_MAX_OBSERVATIONS,10);if(process.env.OPEN_MEM_CONTEXT_SHOW_LAST_SUMMARY==="false")B.contextShowLastSummary=!1;if(process.env.OPEN_MEM_RATE_LIMITING==="false")B.rateLimitingEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT==="false")B.folderContextEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH)B.folderContextMaxDepth=Number.parseInt(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH,10);if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="single")B.folderContextMode="single";if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="dispersed")B.folderContextMode="dispersed";if(process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME)B.folderContextFilename=process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME;if(process.env.OPEN_MEM_DAEMON==="true")B.daemonEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD==="true")B.dashboardEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD_PORT)B.dashboardPort=Number.parseInt(process.env.OPEN_MEM_DASHBOARD_PORT,10);if(process.env.OPEN_MEM_PLATFORM_OPENCODE==="false")B.platformOpenCodeEnabled=!1;if(process.env.OPEN_MEM_PLATFORM_CLAUDE_CODE==="true")B.platformClaudeCodeEnabled=!0;if(process.env.OPEN_MEM_PLATFORM_CURSOR==="true")B.platformCursorEnabled=!0;if(process.env.OPEN_MEM_MCP_COMPAT_MODE)B.mcpCompatibilityMode=process.env.OPEN_MEM_MCP_COMPAT_MODE;if(process.env.OPEN_MEM_MCP_PROTOCOL_VERSION)B.mcpProtocolVersion=process.env.OPEN_MEM_MCP_PROTOCOL_VERSION;if(process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS)B.mcpSupportedProtocolVersions=process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS.split(",").map((J)=>J.trim()).filter(Boolean);if(process.env.OPEN_MEM_EMBEDDING_DIMENSION)B.embeddingDimension=Number.parseInt(process.env.OPEN_MEM_EMBEDDING_DIMENSION,10);if(process.env.OPEN_MEM_CONFLICT_RESOLUTION==="true")B.conflictResolutionEnabled=!0;if(process.env.OPEN_MEM_CONFLICT_BAND_LOW){let J=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_LOW);if(!Number.isNaN(J))B.conflictSimilarityBandLow=J}if(process.env.OPEN_MEM_CONFLICT_BAND_HIGH){let J=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_HIGH);if(!Number.isNaN(J))B.conflictSimilarityBandHigh=J}if(process.env.OPEN_MEM_USER_MEMORY==="true")B.userMemoryEnabled=!0;if(process.env.OPEN_MEM_USER_MEMORY_DB_PATH)B.userMemoryDbPath=process.env.OPEN_MEM_USER_MEMORY_DB_PATH;if(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS)B.userMemoryMaxContextTokens=Number.parseInt(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS,10);if(process.env.OPEN_MEM_RERANKING==="true")B.rerankingEnabled=!0;if(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES)B.rerankingMaxCandidates=Number.parseInt(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES,10);if(process.env.OPEN_MEM_ENTITY_EXTRACTION==="true")B.entityExtractionEnabled=!0;if(process.env.OPEN_MEM_FALLBACK_PROVIDERS)B.fallbackProviders=process.env.OPEN_MEM_FALLBACK_PROVIDERS.split(",").map((J)=>J.trim()).filter(Boolean);return B}function cB(B){let J=`${B}/.open-mem/config.json`;if(!wB(J))return{};try{let K=gB(J,"utf-8"),z=JSON.parse(K);if(!z||typeof z!=="object"||Array.isArray(z))return{};return z}catch{return{}}}function lB(B){switch(B){case"google":return 768;case"openai":return 1536;case"bedrock":return 1024;case"anthropic":return 0;case"openrouter":return 0;default:return 768}}function c0(B,J){let K=cB(B),z=vB(),$={...pB,...K,...z,...J};if(!$.dbPath.startsWith("/"))$.dbPath=`${B}/${$.dbPath}`;if(!process.env.OPEN_MEM_PROVIDER&&!J?.provider){if(process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY)$.provider="google";else if(process.env.ANTHROPIC_API_KEY)$.provider="anthropic";else if(process.env.AWS_BEARER_TOKEN_BEDROCK||process.env.AWS_ACCESS_KEY_ID||process.env.AWS_PROFILE)$.provider="bedrock";else if(process.env.OPENROUTER_API_KEY)$.provider="openrouter"}if(!$.apiKey)switch($.provider){case"google":$.apiKey=process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;break;case"anthropic":$.apiKey=process.env.ANTHROPIC_API_KEY;break;case"openai":$.apiKey=process.env.OPENAI_API_KEY;break;case"openrouter":$.apiKey=process.env.OPENROUTER_API_KEY;break;case"bedrock":break}if($.provider==="openrouter"&&$.model==="gemini-2.5-flash-lite")$.model="google/gemini-2.5-flash-lite";if($.embeddingDimension===void 0)$.embeddingDimension=lB($.provider);return $}import{Database as l0}from"bun:sqlite";import{existsSync as B0,mkdirSync as bB,unlinkSync as b0}from"fs";import*as n0 from"sqlite-vec";class c{db;dbPath;_hasVectorExtension=!1;static enableExtensionSupport(){let B=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite/lib/libsqlite3.dylib"];for(let J of B)try{if(B0(J))return l0.setCustomSQLite(J),!0}catch{return!1}return!1}constructor(B){this.dbPath=B,this.db=this.open(B),this.configure()}open(B){let J=B.lastIndexOf("/");if(J>0){let K=B.substring(0,J);bB(K,{recursive:!0})}return new l0(B,{create:!0})}configure(){try{this.applyPragmas(),this.loadExtensions()}catch(B){console.warn("[open-mem] Database configure failed, attempting recovery by removing WAL/SHM files:",B.message);try{this.db.close()}catch{}this.deleteSidecarFiles();try{this.db=this.open(this.dbPath),this.applyPragmas(),this.loadExtensions(),console.warn("[open-mem] Recovery successful after removing WAL/SHM files");return}catch(J){console.warn("[open-mem] WAL/SHM cleanup insufficient, recreating database from scratch:",J.message);try{this.db.close()}catch{}this.deleteDatabaseFiles();try{this.db=this.open(this.dbPath),this.applyPragmas(),this.loadExtensions(),console.warn("[open-mem] Recovery successful after full database recreation");return}catch(K){throw console.warn("[open-mem] All recovery attempts failed, filesystem may be broken:",K.message),B}}}}applyPragmas(){this.db.exec("PRAGMA journal_mode = WAL"),this.db.exec("PRAGMA synchronous = NORMAL"),this.db.exec("PRAGMA foreign_keys = ON"),this.db.exec("PRAGMA busy_timeout = 5000")}loadExtensions(){try{n0.load(this.db),this._hasVectorExtension=!0}catch{this._hasVectorExtension=!1}}get hasVectorExtension(){return this._hasVectorExtension}deleteSidecarFiles(){for(let B of["-wal","-shm"]){let J=this.dbPath+B;try{if(B0(J))b0(J)}catch{}}}deleteDatabaseFiles(){this.deleteSidecarFiles();try{if(B0(this.dbPath))b0(this.dbPath)}catch{}}ensureMigrationTable(){this.db.exec(`
160
+ [... truncated ...]`:J,N=I0(B,$,K),W=2;for(let Z=0;Z<=W;Z++)try{if(this.config.provider==="google")await O(this.config.model,this.config.rateLimitingEnabled);let{text:Q}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:N}),E=j0(Q);if(E)E.discoveryTokens=z;return E}catch(Q){if(M(Q)&&Z<W){let E=2**Z*1000;await P(E);continue}return null}return null}async compressBatch(B){let J=new Map;for(let K=0;K<B.length;K++){let z=B[K],$=await this.compress(z.toolName,z.toolOutput,z.sessionContext);if(J.set(z.callId,$),K<B.length-1)await P(200)}return J}createFallbackObservation(B,J){let K=wB(J),z=xB[B]??"discovery";return{type:z,title:`${B} execution`,subtitle:J.substring(0,100).replace(/\n/g," "),facts:[],narrative:`Tool ${B} was executed. Output length: ${J.length} chars.`,concepts:[],filesRead:z==="discovery"?K:[],filesModified:z==="change"?K:[],discoveryTokens:q(J),importance:2}}async isAvailable(){if(!this.model)return!1;try{return await this._generate({model:this.model,maxOutputTokens:10,prompt:"ping"}),!0}catch{return!1}}}var xB={Read:"discovery",Write:"change",Edit:"change",Bash:"change",Glob:"discovery",Grep:"discovery"},IB=/(?:^|\s)((?:\.\/|\/|src\/|tests\/|lib\/)\S+\.\w+)/gm;function wB(B){let J=[];for(let K of B.matchAll(IB))J.push(K[1]);return[...new Set(J)]}import{generateText as gB}from"ai";class o{model;config;_generate=gB;constructor(B){if(this.config=B,this.model=null,B.provider==="bedrock"||B.apiKey)try{this.model=y({provider:B.provider,model:B.model,apiKey:B.apiKey},C(B))}catch{}}async evaluate(B,J){if(!this.model||J.length===0)return null;let K=g0(B,J),z=2;for(let $=0;$<=z;$++)try{if(this.config.provider==="google")await O(this.config.model,this.config.rateLimitingEnabled);let{text:N}=await this._generate({model:this.model,maxOutputTokens:512,prompt:K});return h0(N)}catch(N){if(M(N)&&$<z){let W=2**$*1000;await P(W);continue}return null}return null}}import{generateText as pB}from"ai";class e{model;config;_generate=pB;constructor(B){if(this.config=B,this.model=null,B.provider==="bedrock"||B.apiKey)try{this.model=y({provider:B.provider,model:B.model,apiKey:B.apiKey},C(B))}catch{}}async extract(B){if(!this.model)return null;let J=p0(B),K=2;for(let z=0;z<=K;z++)try{if(this.config.provider==="google")await O(this.config.model,this.config.rateLimitingEnabled);let{text:$}=await this._generate({model:this.model,maxOutputTokens:1024,prompt:J});return x0($)}catch($){if(M($)&&z<K){let N=2**z*1000;await P(N);continue}return null}return null}}import{generateText as vB}from"ai";class B0{model;config;_generate=vB;constructor(B){this.config=B,this.model=null;let J=B.provider!=="bedrock";if(B.compressionEnabled&&(!J||B.apiKey))try{this.model=y({provider:B.provider,model:B.model,apiKey:B.apiKey},C(B))}catch{}}async summarize(B,J){if(J.length===0)return null;if(!this.config.compressionEnabled||!this.model)return this.createFallbackSummary(J);let K=w0(J.map((z)=>({type:z.type,title:z.title,narrative:z.narrative})),B);try{if(this.config.provider==="google")await O(this.config.model,this.config.rateLimitingEnabled);let{text:z}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:K}),$=T0(z);if(!$)return this.createFallbackSummary(J);return $}catch{return this.createFallbackSummary(J)}}createFallbackSummary(B){let J=new Set,K=new Set,z=[];for(let Z of B){for(let Q of Z.filesModified)J.add(Q);for(let Q of Z.concepts)K.add(Q);if(Z.type==="decision")z.push(Z.title)}let $=new Map;for(let Z of B)$.set(Z.type,($.get(Z.type)??0)+1);let N=Array.from($.entries()).map(([Z,Q])=>`${Q} ${Z}${Q>1?"s":""}`).join(", "),W=Array.from(K).slice(0,5).join(", ");return{summary:`Session with ${B.length} observations: ${N}. Files modified: ${J.size}. Key concepts: ${W}.`,keyDecisions:z.slice(0,5),filesModified:Array.from(J),concepts:Array.from(K)}}shouldSummarize(B){return B>=2}}import{existsSync as dB,readFileSync as rB}from"fs";import{existsSync as bB,readdirSync as lB,readFileSync as cB}from"fs";import{join as c0}from"path";var J0=c0(import.meta.dir,"."),T=null;function nB(){if(T)return T;if(T=new Map,!bB(J0))return T;for(let B of lB(J0)){if(!B.endsWith(".json"))continue;try{let J=cB(c0(J0,B),"utf-8"),K=JSON.parse(J);if(K.id&&K.observationTypes&&K.conceptVocabulary)T.set(K.id,K)}catch{}}return T}function n0(){return[...nB().keys()].sort()}var sB={dbPath:".open-mem/memory.db",provider:"google",apiKey:void 0,model:"gemini-2.5-flash-lite",maxTokensPerCompression:1024,compressionEnabled:!0,contextInjectionEnabled:!0,maxContextTokens:4000,batchSize:5,batchIntervalMs:30000,ignoredTools:[],minOutputLength:50,maxIndexEntries:20,sensitivePatterns:[],retentionDays:90,maxDatabaseSizeMb:500,logLevel:"warn",contextShowTokenCosts:!0,contextObservationTypes:"all",contextFullObservationCount:3,maxObservations:50,contextShowLastSummary:!0,rateLimitingEnabled:!0,folderContextEnabled:!0,folderContextMaxDepth:5,folderContextMode:"dispersed",folderContextFilename:"AGENTS.md",daemonEnabled:!1,dashboardEnabled:!1,dashboardPort:3737,platformOpenCodeEnabled:!0,platformClaudeCodeEnabled:!1,platformCursorEnabled:!1,mcpCompatibilityMode:"strict",mcpProtocolVersion:"2024-11-05",mcpSupportedProtocolVersions:["2024-11-05"],embeddingDimension:void 0,conflictResolutionEnabled:!1,conflictSimilarityBandLow:0.7,conflictSimilarityBandHigh:0.92,userMemoryEnabled:!1,userMemoryDbPath:"~/.config/open-mem/user-memory.db",userMemoryMaxContextTokens:1000,rerankingEnabled:!1,rerankingMaxCandidates:20,entityExtractionEnabled:!1,fallbackProviders:void 0,mode:"code"};function iB(){let B={};if(process.env.OPEN_MEM_DB_PATH)B.dbPath=process.env.OPEN_MEM_DB_PATH;if(process.env.OPEN_MEM_PROVIDER)B.provider=process.env.OPEN_MEM_PROVIDER;if(process.env.OPEN_MEM_MODEL)B.model=process.env.OPEN_MEM_MODEL;if(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS)B.maxContextTokens=Number.parseInt(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS,10);if(process.env.OPEN_MEM_COMPRESSION==="false")B.compressionEnabled=!1;if(process.env.OPEN_MEM_CONTEXT_INJECTION==="false")B.contextInjectionEnabled=!1;if(process.env.OPEN_MEM_IGNORED_TOOLS)B.ignoredTools=process.env.OPEN_MEM_IGNORED_TOOLS.split(",").map((J)=>J.trim());if(process.env.OPEN_MEM_BATCH_SIZE)B.batchSize=Number.parseInt(process.env.OPEN_MEM_BATCH_SIZE,10);if(process.env.OPEN_MEM_RETENTION_DAYS)B.retentionDays=Number.parseInt(process.env.OPEN_MEM_RETENTION_DAYS,10);if(process.env.OPEN_MEM_LOG_LEVEL)B.logLevel=process.env.OPEN_MEM_LOG_LEVEL;if(process.env.OPEN_MEM_CONTEXT_SHOW_TOKEN_COSTS==="false")B.contextShowTokenCosts=!1;if(process.env.OPEN_MEM_CONTEXT_TYPES)B.contextObservationTypes=process.env.OPEN_MEM_CONTEXT_TYPES==="all"?"all":process.env.OPEN_MEM_CONTEXT_TYPES.split(",").map((J)=>J.trim());if(process.env.OPEN_MEM_CONTEXT_FULL_COUNT)B.contextFullObservationCount=Number.parseInt(process.env.OPEN_MEM_CONTEXT_FULL_COUNT,10);if(process.env.OPEN_MEM_MAX_OBSERVATIONS)B.maxObservations=Number.parseInt(process.env.OPEN_MEM_MAX_OBSERVATIONS,10);if(process.env.OPEN_MEM_CONTEXT_SHOW_LAST_SUMMARY==="false")B.contextShowLastSummary=!1;if(process.env.OPEN_MEM_RATE_LIMITING==="false")B.rateLimitingEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT==="false")B.folderContextEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH)B.folderContextMaxDepth=Number.parseInt(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH,10);if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="single")B.folderContextMode="single";if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="dispersed")B.folderContextMode="dispersed";if(process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME)B.folderContextFilename=process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME;if(process.env.OPEN_MEM_DAEMON==="true")B.daemonEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD==="true")B.dashboardEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD_PORT)B.dashboardPort=Number.parseInt(process.env.OPEN_MEM_DASHBOARD_PORT,10);if(process.env.OPEN_MEM_PLATFORM_OPENCODE==="false")B.platformOpenCodeEnabled=!1;if(process.env.OPEN_MEM_PLATFORM_CLAUDE_CODE==="true")B.platformClaudeCodeEnabled=!0;if(process.env.OPEN_MEM_PLATFORM_CURSOR==="true")B.platformCursorEnabled=!0;if(process.env.OPEN_MEM_MCP_COMPAT_MODE)B.mcpCompatibilityMode=process.env.OPEN_MEM_MCP_COMPAT_MODE;if(process.env.OPEN_MEM_MCP_PROTOCOL_VERSION)B.mcpProtocolVersion=process.env.OPEN_MEM_MCP_PROTOCOL_VERSION;if(process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS)B.mcpSupportedProtocolVersions=process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS.split(",").map((J)=>J.trim()).filter(Boolean);if(process.env.OPEN_MEM_EMBEDDING_DIMENSION)B.embeddingDimension=Number.parseInt(process.env.OPEN_MEM_EMBEDDING_DIMENSION,10);if(process.env.OPEN_MEM_CONFLICT_RESOLUTION==="true")B.conflictResolutionEnabled=!0;if(process.env.OPEN_MEM_CONFLICT_BAND_LOW){let J=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_LOW);if(!Number.isNaN(J))B.conflictSimilarityBandLow=J}if(process.env.OPEN_MEM_CONFLICT_BAND_HIGH){let J=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_HIGH);if(!Number.isNaN(J))B.conflictSimilarityBandHigh=J}if(process.env.OPEN_MEM_USER_MEMORY==="true")B.userMemoryEnabled=!0;if(process.env.OPEN_MEM_USER_MEMORY_DB_PATH)B.userMemoryDbPath=process.env.OPEN_MEM_USER_MEMORY_DB_PATH;if(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS)B.userMemoryMaxContextTokens=Number.parseInt(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS,10);if(process.env.OPEN_MEM_RERANKING==="true")B.rerankingEnabled=!0;if(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES)B.rerankingMaxCandidates=Number.parseInt(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES,10);if(process.env.OPEN_MEM_ENTITY_EXTRACTION==="true")B.entityExtractionEnabled=!0;if(process.env.OPEN_MEM_FALLBACK_PROVIDERS)B.fallbackProviders=process.env.OPEN_MEM_FALLBACK_PROVIDERS.split(",").map((J)=>J.trim()).filter(Boolean);if(process.env.OPEN_MEM_MODE)B.mode=process.env.OPEN_MEM_MODE;return B}function tB(B){let J=`${B}/.open-mem/config.json`;if(!dB(J))return{};try{let K=rB(J,"utf-8"),z=JSON.parse(K);if(!z||typeof z!=="object"||Array.isArray(z))return{};return z}catch{return{}}}function aB(B){switch(B){case"google":return 768;case"openai":return 1536;case"bedrock":return 1024;case"anthropic":return 0;case"openrouter":return 0;default:return 768}}function d0(B,J){let K=tB(B),z=iB(),$={...sB,...K,...z,...J};if(!$.dbPath.startsWith("/"))$.dbPath=`${B}/${$.dbPath}`;if(!process.env.OPEN_MEM_PROVIDER&&!J?.provider){if(process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY)$.provider="google";else if(process.env.ANTHROPIC_API_KEY)$.provider="anthropic";else if(process.env.AWS_BEARER_TOKEN_BEDROCK||process.env.AWS_ACCESS_KEY_ID||process.env.AWS_PROFILE)$.provider="bedrock";else if(process.env.OPENROUTER_API_KEY)$.provider="openrouter"}if(!$.apiKey)switch($.provider){case"google":$.apiKey=process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;break;case"anthropic":$.apiKey=process.env.ANTHROPIC_API_KEY;break;case"openai":$.apiKey=process.env.OPENAI_API_KEY;break;case"openrouter":$.apiKey=process.env.OPENROUTER_API_KEY;break;case"bedrock":break}if($.provider==="openrouter"&&$.model==="gemini-2.5-flash-lite")$.model="google/gemini-2.5-flash-lite";if($.embeddingDimension===void 0)$.embeddingDimension=aB($.provider);if($.mode&&!n0().includes($.mode))$.mode="code";return $}import{Database as r0}from"bun:sqlite";import{existsSync as K0,mkdirSync as oB,unlinkSync as s0}from"fs";import*as i0 from"sqlite-vec";class l{db;dbPath;_hasVectorExtension=!1;static enableExtensionSupport(){let B=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite/lib/libsqlite3.dylib"];for(let J of B)try{if(K0(J))return r0.setCustomSQLite(J),!0}catch{return!1}return!1}constructor(B){this.dbPath=B,this.db=this.open(B),this.configure()}open(B){let J=B.lastIndexOf("/");if(J>0){let K=B.substring(0,J);oB(K,{recursive:!0})}return new r0(B,{create:!0})}configure(){try{this.applyPragmas(),this.loadExtensions()}catch(B){console.warn("[open-mem] Database configure failed, attempting recovery by removing WAL/SHM files:",B.message);try{this.db.close()}catch{}this.deleteSidecarFiles();try{this.db=this.open(this.dbPath),this.applyPragmas(),this.loadExtensions(),console.warn("[open-mem] Recovery successful after removing WAL/SHM files");return}catch(J){console.warn("[open-mem] WAL/SHM cleanup insufficient, recreating database from scratch:",J.message);try{this.db.close()}catch{}this.deleteDatabaseFiles();try{this.db=this.open(this.dbPath),this.applyPragmas(),this.loadExtensions(),console.warn("[open-mem] Recovery successful after full database recreation");return}catch(K){throw console.warn("[open-mem] All recovery attempts failed, filesystem may be broken:",K.message),B}}}}applyPragmas(){this.db.exec("PRAGMA journal_mode = WAL"),this.db.exec("PRAGMA synchronous = NORMAL"),this.db.exec("PRAGMA foreign_keys = ON"),this.db.exec("PRAGMA busy_timeout = 5000")}loadExtensions(){try{i0.load(this.db),this._hasVectorExtension=!0}catch{this._hasVectorExtension=!1}}get hasVectorExtension(){return this._hasVectorExtension}deleteSidecarFiles(){for(let B of["-wal","-shm"]){let J=this.dbPath+B;try{if(K0(J))s0(J)}catch{}}}deleteDatabaseFiles(){this.deleteSidecarFiles();try{if(K0(this.dbPath))s0(this.dbPath)}catch{}}ensureMigrationTable(){this.db.exec(`
166
161
  CREATE TABLE IF NOT EXISTS _migrations (
167
162
  version INTEGER PRIMARY KEY,
168
163
  name TEXT NOT NULL,
169
164
  applied_at TEXT NOT NULL DEFAULT (datetime('now'))
170
165
  )
171
- `)}migrate(B){this.ensureMigrationTable();let J=this.db.query("SELECT version FROM _migrations ORDER BY version").all(),K=new Set(J.map(($)=>$.version)),z=B.filter(($)=>!K.has($.version)).sort(($,N)=>$.version-N.version);for(let $ of z)this.db.transaction(()=>{this.db.exec($.up),this.db.query("INSERT INTO _migrations (version, name) VALUES ($version, $name)").run({$version:$.version,$name:$.name})})()}run(B,J){let K=this.db.query(B);if(J)K.run(...J);else K.run()}get(B,J){let K=this.db.query(B);return J?K.get(...J):K.get()}all(B,J){let K=this.db.query(B);return J?K.all(...J):K.all()}exec(B){this.db.exec(B)}transaction(B){return this.db.transaction(B)()}close(){this.db.close()}get isOpen(){try{return this.db.query("SELECT 1").get(),!0}catch{return!1}}get raw(){return this.db}}function d0(B){return new c(B)}import{randomUUID as r0}from"crypto";class J0{db;constructor(B){this.db=B}upsertEntity(B,J){let K=r0(),z=new Date().toISOString();this.db.run(`INSERT INTO entities (id, name, entity_type, first_seen_at, last_seen_at, mention_count)
166
+ `)}migrate(B){this.ensureMigrationTable();let J=this.db.query("SELECT version FROM _migrations ORDER BY version").all(),K=new Set(J.map(($)=>$.version)),z=B.filter(($)=>!K.has($.version)).sort(($,N)=>$.version-N.version);for(let $ of z)this.db.transaction(()=>{this.db.exec($.up),this.db.query("INSERT INTO _migrations (version, name) VALUES ($version, $name)").run({$version:$.version,$name:$.name})})()}run(B,J){let K=this.db.query(B);if(J)K.run(...J);else K.run()}get(B,J){let K=this.db.query(B);return J?K.get(...J):K.get()}all(B,J){let K=this.db.query(B);return J?K.all(...J):K.all()}exec(B){this.db.exec(B)}transaction(B){return this.db.transaction(B)()}close(){this.db.close()}get isOpen(){try{return this.db.query("SELECT 1").get(),!0}catch{return!1}}get raw(){return this.db}}function t0(B){return new l(B)}import{randomUUID as a0}from"crypto";class z0{db;constructor(B){this.db=B}upsertEntity(B,J){let K=a0(),z=new Date().toISOString();this.db.run(`INSERT INTO entities (id, name, entity_type, first_seen_at, last_seen_at, mention_count)
172
167
  VALUES (?, ?, ?, ?, ?, 1)
173
168
  ON CONFLICT(name, entity_type) DO UPDATE SET
174
169
  mention_count = mention_count + 1,
175
- last_seen_at = ?`,[K,B,J,z,z,z]);let $=this.db.get("SELECT * FROM entities WHERE name = ? AND entity_type = ?",[B,J]);if(!$)throw Error(`Failed to upsert entity: ${B} (${J})`);return this.mapEntityRow($)}createRelation(B,J,K,z){let $=r0(),N=new Date().toISOString();try{this.db.run(`INSERT OR IGNORE INTO entity_relations
170
+ last_seen_at = ?`,[K,B,J,z,z,z]);let $=this.db.get("SELECT * FROM entities WHERE name = ? AND entity_type = ?",[B,J]);if(!$)throw Error(`Failed to upsert entity: ${B} (${J})`);return this.mapEntityRow($)}createRelation(B,J,K,z){let $=a0(),N=new Date().toISOString();try{this.db.run(`INSERT OR IGNORE INTO entity_relations
176
171
  (id, source_entity_id, target_entity_id, relationship, observation_id, created_at)
177
172
  VALUES (?, ?, ?, ?, ?, ?)`,[$,B,J,K,z,N])}catch{return null}let W=this.db.get(`SELECT * FROM entity_relations
178
173
  WHERE source_entity_id = ? AND target_entity_id = ? AND relationship = ?`,[B,J,K]);return W?this.mapRelationRow(W):null}linkObservation(B,J){this.db.run("INSERT OR IGNORE INTO entity_observations (entity_id, observation_id) VALUES (?, ?)",[B,J])}findByName(B){try{return this.db.all(`SELECT e.*
@@ -180,8 +175,8 @@ Respond with EXACTLY this XML format:
180
175
  JOIN entities_fts fts ON e._rowid = fts.rowid
181
176
  WHERE entities_fts MATCH ?
182
177
  ORDER BY rank`,[B]).map((K)=>this.mapEntityRow(K))}catch{return[]}}getRelationsFor(B){return this.db.all(`SELECT * FROM entity_relations
183
- WHERE source_entity_id = ? OR target_entity_id = ?`,[B,B]).map((K)=>this.mapRelationRow(K))}traverseRelations(B,J=1){let K=Math.min(J,2),z=100,$=new Set,N=[{id:B,currentDepth:0}];$.add(B);while(N.length>0){if($.size>=100)break;let W=N.shift();if(!W)continue;if(W.currentDepth>=K)continue;let Q=this.getRelationsFor(W.id);for(let R of Q){let E=R.sourceEntityId===W.id?R.targetEntityId:R.sourceEntityId;if(!$.has(E))$.add(E),N.push({id:E,currentDepth:W.currentDepth+1})}}return $}getObservationsForEntity(B){return this.db.all("SELECT observation_id FROM entity_observations WHERE entity_id = ?",[B]).map((K)=>K.observation_id)}getById(B){let J=this.db.get("SELECT * FROM entities WHERE id = ?",[B]);return J?this.mapEntityRow(J):null}mapEntityRow(B){return{id:B.id,name:B.name,entityType:B.entity_type,firstSeenAt:B.first_seen_at,lastSeenAt:B.last_seen_at,mentionCount:B.mention_count}}mapRelationRow(B){return{id:B.id,sourceEntityId:B.source_entity_id,targetEntityId:B.target_entity_id,relationship:B.relationship,observationId:B.observation_id,createdAt:B.created_at}}}import{randomUUID as dB}from"crypto";import{embed as nB}from"ai";async function K0(B,J){try{let{embedding:K}=await nB({model:B,value:J});return K}catch{return null}}function s0(B,J){if(B.length!==J.length||B.length===0)return 0;let K=0,z=0,$=0;for(let W=0;W<B.length;W++)K+=B[W]*J[W],z+=B[W]*B[W],$+=J[W]*J[W];let N=Math.sqrt(z)*Math.sqrt($);if(N===0)return 0;return K/N}function z0(B){let J=[B.title,B.narrative];if(B.concepts.length>0)J.push(B.concepts.join(", "));return J.join(`
184
- `)}function rB(B){return B.replace(/[%_\\]/g,"\\$&")}class $0{db;constructor(B){this.db=B}create(B){let J=dB(),K=new Date().toISOString(),z=B.discoveryTokens??0,$=B.importance??3,N=B.scope??"project";return this.db.run(`INSERT INTO observations
178
+ WHERE source_entity_id = ? OR target_entity_id = ?`,[B,B]).map((K)=>this.mapRelationRow(K))}traverseRelations(B,J=1){let K=Math.min(J,2),z=100,$=new Set,N=[{id:B,currentDepth:0}];$.add(B);while(N.length>0){if($.size>=100)break;let W=N.shift();if(!W)continue;if(W.currentDepth>=K)continue;let Z=this.getRelationsFor(W.id);for(let Q of Z){let E=Q.sourceEntityId===W.id?Q.targetEntityId:Q.sourceEntityId;if(!$.has(E))$.add(E),N.push({id:E,currentDepth:W.currentDepth+1})}}return $}getObservationsForEntity(B){return this.db.all("SELECT observation_id FROM entity_observations WHERE entity_id = ?",[B]).map((K)=>K.observation_id)}getById(B){let J=this.db.get("SELECT * FROM entities WHERE id = ?",[B]);return J?this.mapEntityRow(J):null}mapEntityRow(B){return{id:B.id,name:B.name,entityType:B.entity_type,firstSeenAt:B.first_seen_at,lastSeenAt:B.last_seen_at,mentionCount:B.mention_count}}mapRelationRow(B){return{id:B.id,sourceEntityId:B.source_entity_id,targetEntityId:B.target_entity_id,relationship:B.relationship,observationId:B.observation_id,createdAt:B.created_at}}}import{randomUUID as BJ}from"crypto";import{embed as eB}from"ai";async function $0(B,J){try{let{embedding:K}=await eB({model:B,value:J});return K}catch{return null}}function o0(B,J){if(B.length!==J.length||B.length===0)return 0;let K=0,z=0,$=0;for(let W=0;W<B.length;W++)K+=B[W]*J[W],z+=B[W]*B[W],$+=J[W]*J[W];let N=Math.sqrt(z)*Math.sqrt($);if(N===0)return 0;return K/N}function N0(B){let J=[B.title,B.narrative];if(B.concepts.length>0)J.push(B.concepts.join(", "));return J.join(`
179
+ `)}function JJ(B){return B.replace(/[%_\\]/g,"\\$&")}class W0{db;constructor(B){this.db=B}create(B){let J=BJ(),K=new Date().toISOString(),z=B.discoveryTokens??0,$=B.importance??3,N=B.scope??"project";return this.db.run(`INSERT INTO observations
185
180
  (id, session_id, scope, type, title, subtitle, facts, narrative,
186
181
  concepts, files_read, files_modified, raw_tool_output,
187
182
  tool_name, created_at, token_count, discovery_tokens, importance, revision_of, deleted_at)
@@ -206,17 +201,17 @@ Respond with EXACTLY this XML format:
206
201
  WHERE s.project_path = ? AND o.created_at > ?
207
202
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
208
203
  ORDER BY o.created_at ASC
209
- LIMIT ?`,[z,B,K]):[];return[...$,...N].map((W)=>this.mapRow(W))}listByProject(B,J={}){let{limit:K=50,offset:z=0,type:$,state:N,sessionId:W}=J,Q=`SELECT o.*
204
+ LIMIT ?`,[z,B,K]):[];return[...$,...N].map((W)=>this.mapRow(W))}listByProject(B,J={}){let{limit:K=50,offset:z=0,type:$,state:N,sessionId:W}=J,Z=`SELECT o.*
210
205
  FROM observations o
211
206
  JOIN sessions s ON o.session_id = s.id
212
- WHERE s.project_path = ?`,R=[B];if(W)Q+=" AND o.session_id = ?",R.push(W);if($)Q+=" AND o.type = ?",R.push($);if(N==="current")Q+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";else if(N==="superseded")Q+=" AND o.superseded_by IS NOT NULL AND o.deleted_at IS NULL";else if(N==="tombstoned")Q+=" AND o.deleted_at IS NOT NULL";else Q+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";return Q+=" ORDER BY o.created_at DESC LIMIT ? OFFSET ?",R.push(K,z),this.db.all(Q,R).map((E)=>this.mapRow(E))}search(B){let J=!!B.projectPath,K=`
207
+ WHERE s.project_path = ?`,Q=[B];if(W)Z+=" AND o.session_id = ?",Q.push(W);if($)Z+=" AND o.type = ?",Q.push($);if(N==="current")Z+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";else if(N==="superseded")Z+=" AND o.superseded_by IS NOT NULL AND o.deleted_at IS NULL";else if(N==="tombstoned")Z+=" AND o.deleted_at IS NOT NULL";else Z+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";return Z+=" ORDER BY o.created_at DESC LIMIT ? OFFSET ?",Q.push(K,z),this.db.all(Z,Q).map((E)=>this.mapRow(E))}search(B){let J=!!B.projectPath,K=`
213
208
  SELECT o.*, rank
214
209
  FROM observations o
215
210
  JOIN observations_fts fts ON o._rowid = fts.rowid
216
211
  ${J?"JOIN sessions s ON o.session_id = s.id":""}
217
212
  WHERE observations_fts MATCH ? AND o.superseded_by IS NULL AND o.deleted_at IS NULL
218
213
  `,z=[B.query];if(J&&B.projectPath)K+=" AND s.project_path = ?",z.push(B.projectPath);if(B.sessionId)K+=" AND o.session_id = ?",z.push(B.sessionId);if(B.type)K+=" AND o.type = ?",z.push(B.type);if(B.importanceMin!==void 0)K+=" AND o.importance >= ?",z.push(B.importanceMin);if(B.importanceMax!==void 0)K+=" AND o.importance <= ?",z.push(B.importanceMax);if(B.createdAfter)K+=" AND o.created_at >= ?",z.push(B.createdAfter);if(B.createdBefore)K+=" AND o.created_at <= ?",z.push(B.createdBefore);if(B.concepts&&B.concepts.length>0){let $=B.concepts.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE LOWER(value) = LOWER(?))");K+=` AND (${$.join(" OR ")})`;for(let N of B.concepts)z.push(N)}if(B.files&&B.files.length>0){let $=B.files.map(()=>`(EXISTS (SELECT 1 FROM json_each(o.files_read) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\')
219
- OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\'))`);K+=` AND (${$.join(" OR ")})`;for(let N of B.files){let W=`%${rB(N)}%`;z.push(W,W)}}return K+=" ORDER BY rank LIMIT ? OFFSET ?",z.push(B.limit??10),z.push(B.offset??0),this.db.all(K,z).map(($)=>({observation:this.mapRow($),rank:$.rank,snippet:$.title}))}searchByConcept(B,J=10,K){let z=!!K,$=`SELECT o.*
214
+ OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\'))`);K+=` AND (${$.join(" OR ")})`;for(let N of B.files){let W=`%${JJ(N)}%`;z.push(W,W)}}return K+=" ORDER BY rank LIMIT ? OFFSET ?",z.push(B.limit??10),z.push(B.offset??0),this.db.all(K,z).map(($)=>({observation:this.mapRow($),rank:$.rank,snippet:$.title}))}searchByConcept(B,J=10,K){let z=!!K,$=`SELECT o.*
220
215
  FROM observations o
221
216
  JOIN observations_fts fts ON o._rowid = fts.rowid
222
217
  ${z?"JOIN sessions s ON o.session_id = s.id":""}
@@ -240,14 +235,14 @@ Respond with EXACTLY this XML format:
240
235
  LIMIT ?`,[B,J]).map((K)=>{try{return{id:K.id,embedding:JSON.parse(K.embedding),title:K.title}}catch{return null}}).filter((K)=>K!==null)}findSimilar(B,J,K,z){let $=this.db.all(`SELECT id, embedding FROM observations
241
236
  WHERE embedding IS NOT NULL AND type = ? AND superseded_by IS NULL AND deleted_at IS NULL
242
237
  ORDER BY created_at DESC
243
- LIMIT 200`,[J]),N=[];for(let W of $)try{let Q=JSON.parse(W.embedding);if(!Array.isArray(Q)||Q.length!==B.length)continue;let R=s0(B,Q);if(R>=K)N.push({id:W.id,similarity:R})}catch{}return N.sort((W,Q)=>Q.similarity-W.similarity).slice(0,z)}insertVecEmbedding(B,J){let K=new Float32Array(J);this.db.run("BEGIN");try{this.db.run("DELETE FROM observation_embeddings WHERE observation_id = ?",[B]),this.db.run("INSERT INTO observation_embeddings (observation_id, embedding) VALUES (?, ?)",[B,K]),this.db.run("COMMIT")}catch(z){throw this.db.run("ROLLBACK"),z}}migrateExistingEmbeddings(B){let J=this.db.all("SELECT id, embedding FROM observations WHERE embedding IS NOT NULL"),K=0,z=0;for(let $ of J)try{let N=JSON.parse($.embedding);if(!Array.isArray(N)||N.length!==B){z++;continue}this.insertVecEmbedding($.id,N),K++}catch{z++}return{migrated:K,skipped:z}}getVecEmbeddingMatches(B,J){try{let K=new Float32Array(B);return this.db.all(`SELECT observation_id, distance
238
+ LIMIT 200`,[J]),N=[];for(let W of $)try{let Z=JSON.parse(W.embedding);if(!Array.isArray(Z)||Z.length!==B.length)continue;let Q=o0(B,Z);if(Q>=K)N.push({id:W.id,similarity:Q})}catch{}return N.sort((W,Z)=>Z.similarity-W.similarity).slice(0,z)}insertVecEmbedding(B,J){let K=new Float32Array(J);this.db.run("BEGIN");try{this.db.run("DELETE FROM observation_embeddings WHERE observation_id = ?",[B]),this.db.run("INSERT INTO observation_embeddings (observation_id, embedding) VALUES (?, ?)",[B,K]),this.db.run("COMMIT")}catch(z){throw this.db.run("ROLLBACK"),z}}migrateExistingEmbeddings(B){let J=this.db.all("SELECT id, embedding FROM observations WHERE embedding IS NOT NULL"),K=0,z=0;for(let $ of J)try{let N=JSON.parse($.embedding);if(!Array.isArray(N)||N.length!==B){z++;continue}this.insertVecEmbedding($.id,N),K++}catch{z++}return{migrated:K,skipped:z}}getVecEmbeddingMatches(B,J){try{let K=new Float32Array(B);return this.db.all(`SELECT observation_id, distance
244
239
  FROM observation_embeddings
245
240
  WHERE embedding MATCH ? AND k = ?`,[K,J]).map((z)=>({observationId:z.observation_id,distance:z.distance}))}catch{return[]}}searchVecSubset(B,J,K){if(J.length===0)return[];try{let z=new Float32Array(B),$=Math.max(K*5,J.length),N=this.db.all(`SELECT observation_id, distance
246
241
  FROM observation_embeddings
247
- WHERE embedding MATCH ? AND k = ?`,[z,$]),W=new Set(J);return N.filter((Q)=>W.has(Q.observation_id)).slice(0,K).map((Q)=>({observationId:Q.observation_id,distance:Q.distance}))}catch{return[]}}update(B,J){let K=this.getById(B);if(!K)return null;if(Object.keys(J).length===0)return K;let z=this.create({sessionId:K.sessionId,scope:K.scope??"project",type:J.type??K.type,title:J.title??K.title,subtitle:J.subtitle??K.subtitle,facts:J.facts??K.facts,narrative:J.narrative??K.narrative,concepts:J.concepts??K.concepts,filesRead:J.filesRead??K.filesRead,filesModified:J.filesModified??K.filesModified,rawToolOutput:K.rawToolOutput,toolName:"mem-revise",tokenCount:K.tokenCount,discoveryTokens:K.discoveryTokens,importance:J.importance??K.importance});return this.db.run("UPDATE observations SET revision_of = ? WHERE id = ?",[B,z.id]),this.supersede(B,z.id),this.getById(z.id)}supersede(B,J){let K=new Date().toISOString();this.db.run("UPDATE observations SET superseded_by = ?, superseded_at = ? WHERE id = ?",[J,K,B])}delete(B){if(this.db.all("SELECT id FROM observations WHERE id = ?",[B]).length===0)return!1;let K=new Date().toISOString();return this.db.run("UPDATE observations SET deleted_at = ? WHERE id = ?",[K,B]),this.deleteEmbeddingsForObservations([B]),!0}getLineage(B){let J=this.getByIdIncludingArchived(B);if(!J)return[];let K=new Set([J.id]),z=[J];while(z[0].revisionOf){let $=this.getByIdIncludingArchived(z[0].revisionOf);if(!$||K.has($.id))break;z.unshift($),K.add($.id)}while(z[z.length-1].supersededBy){let $=z[z.length-1].supersededBy;if(!$)break;let N=this.getByIdIncludingArchived($);if(!N||K.has(N.id))break;z.push(N),K.add(N.id)}return z}deleteOlderThan(B){return this.db.all(`DELETE FROM observations
242
+ WHERE embedding MATCH ? AND k = ?`,[z,$]),W=new Set(J);return N.filter((Z)=>W.has(Z.observation_id)).slice(0,K).map((Z)=>({observationId:Z.observation_id,distance:Z.distance}))}catch{return[]}}update(B,J){let K=this.getById(B);if(!K)return null;if(Object.keys(J).length===0)return K;let z=this.create({sessionId:K.sessionId,scope:K.scope??"project",type:J.type??K.type,title:J.title??K.title,subtitle:J.subtitle??K.subtitle,facts:J.facts??K.facts,narrative:J.narrative??K.narrative,concepts:J.concepts??K.concepts,filesRead:J.filesRead??K.filesRead,filesModified:J.filesModified??K.filesModified,rawToolOutput:K.rawToolOutput,toolName:"mem-revise",tokenCount:K.tokenCount,discoveryTokens:K.discoveryTokens,importance:J.importance??K.importance});return this.db.run("UPDATE observations SET revision_of = ? WHERE id = ?",[B,z.id]),this.supersede(B,z.id),this.getById(z.id)}supersede(B,J){let K=new Date().toISOString();this.db.run("UPDATE observations SET superseded_by = ?, superseded_at = ? WHERE id = ?",[J,K,B])}delete(B){if(this.db.all("SELECT id FROM observations WHERE id = ?",[B]).length===0)return!1;let K=new Date().toISOString();return this.db.run("UPDATE observations SET deleted_at = ? WHERE id = ?",[K,B]),this.deleteEmbeddingsForObservations([B]),!0}getLineage(B){let J=this.getByIdIncludingArchived(B);if(!J)return[];let K=new Set([J.id]),z=[J];while(z[0].revisionOf){let $=this.getByIdIncludingArchived(z[0].revisionOf);if(!$||K.has($.id))break;z.unshift($),K.add($.id)}while(z[z.length-1].supersededBy){let $=z[z.length-1].supersededBy;if(!$)break;let N=this.getByIdIncludingArchived($);if(!N||K.has(N.id))break;z.push(N),K.add(N.id)}return z}deleteOlderThan(B){return this.db.all(`DELETE FROM observations
248
243
  WHERE (created_at < datetime('now', '-' || ? || ' days') OR deleted_at IS NOT NULL)
249
244
  AND session_id NOT IN (SELECT id FROM sessions WHERE status != 'completed')
250
- RETURNING id`,[B]).length}deleteEmbeddingsForObservations(B){if(B.length===0)return;let J=B.map(()=>"?").join(",");try{this.db.run(`DELETE FROM observation_embeddings WHERE observation_id IN (${J})`,B)}catch{}this.db.run(`UPDATE observations SET embedding = NULL WHERE id IN (${J})`,B)}mapRow(B){return{id:B.id,sessionId:B.session_id,scope:B.scope??"project",type:B.type,title:B.title,subtitle:B.subtitle,facts:JSON.parse(B.facts),narrative:B.narrative,concepts:JSON.parse(B.concepts),filesRead:JSON.parse(B.files_read),filesModified:JSON.parse(B.files_modified),rawToolOutput:B.raw_tool_output,toolName:B.tool_name,createdAt:B.created_at,tokenCount:B.token_count,discoveryTokens:B.discovery_tokens??0,importance:B.importance??3,revisionOf:B.revision_of??null,deletedAt:B.deleted_at??null,supersededBy:B.superseded_by??null,supersededAt:B.superseded_at??null}}}import{randomUUID as sB}from"crypto";class N0{db;constructor(B){this.db=B}create(B){let J=sB(),K=new Date().toISOString();return this.db.run(`INSERT INTO pending_messages
245
+ RETURNING id`,[B]).length}deleteEmbeddingsForObservations(B){if(B.length===0)return;let J=B.map(()=>"?").join(",");try{this.db.run(`DELETE FROM observation_embeddings WHERE observation_id IN (${J})`,B)}catch{}this.db.run(`UPDATE observations SET embedding = NULL WHERE id IN (${J})`,B)}mapRow(B){return{id:B.id,sessionId:B.session_id,scope:B.scope??"project",type:B.type,title:B.title,subtitle:B.subtitle,facts:JSON.parse(B.facts),narrative:B.narrative,concepts:JSON.parse(B.concepts),filesRead:JSON.parse(B.files_read),filesModified:JSON.parse(B.files_modified),rawToolOutput:B.raw_tool_output,toolName:B.tool_name,createdAt:B.created_at,tokenCount:B.token_count,discoveryTokens:B.discovery_tokens??0,importance:B.importance??3,revisionOf:B.revision_of??null,deletedAt:B.deleted_at??null,supersededBy:B.superseded_by??null,supersededAt:B.superseded_at??null}}}import{randomUUID as KJ}from"crypto";class Q0{db;constructor(B){this.db=B}create(B){let J=KJ(),K=new Date().toISOString();return this.db.run(`INSERT INTO pending_messages
251
246
  (id, session_id, tool_name, tool_output, call_id, created_at)
252
247
  VALUES (?, ?, ?, ?, ?, ?)`,[J,B.sessionId,B.toolName,B.toolOutput,B.callId,K]),{...B,id:J,createdAt:K,status:"pending",retryCount:0,error:null}}getPending(B=10){return this.db.all("SELECT * FROM pending_messages WHERE status = 'pending' ORDER BY created_at ASC LIMIT ?",[B]).map((J)=>this.mapRow(J))}getByStatus(B){return this.db.all("SELECT * FROM pending_messages WHERE status = ? ORDER BY created_at ASC",[B]).map((J)=>this.mapRow(J))}markProcessing(B){this.db.run("UPDATE pending_messages SET status = 'processing' WHERE id = ?",[B])}markCompleted(B){this.db.run("UPDATE pending_messages SET status = 'completed' WHERE id = ?",[B])}markFailed(B,J){this.db.run("UPDATE pending_messages SET status = 'failed', error = ?, retry_count = retry_count + 1 WHERE id = ?",[J,B])}resetStale(B=5){return this.db.all(`UPDATE pending_messages SET status = 'pending'
253
248
  WHERE status = 'processing'
@@ -255,7 +250,7 @@ Respond with EXACTLY this XML format:
255
250
  RETURNING id`,[`-${B}`]).length}deleteCompletedOlderThan(B){return this.db.all(`DELETE FROM pending_messages
256
251
  WHERE status = 'completed'
257
252
  AND created_at < datetime('now', '-' || ? || ' days')
258
- RETURNING id`,[B]).length}mapRow(B){return{id:B.id,sessionId:B.session_id,toolName:B.tool_name,toolOutput:B.tool_output,callId:B.call_id,createdAt:B.created_at,status:B.status,retryCount:B.retry_count,error:B.error??null}}}var iB=[{version:1,name:"create-schema",up:`
253
+ RETURNING id`,[B]).length}mapRow(B){return{id:B.id,sessionId:B.session_id,toolName:B.tool_name,toolOutput:B.tool_output,callId:B.call_id,createdAt:B.created_at,status:B.status,retryCount:B.retry_count,error:B.error??null}}}var zJ=[{version:1,name:"create-schema",up:`
259
254
  -- Sessions table
260
255
  CREATE TABLE IF NOT EXISTS sessions (
261
256
  _rowid INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -549,11 +544,11 @@ Respond with EXACTLY this XML format:
549
544
  INSERT INTO entities_fts(rowid, name, entity_type)
550
545
  VALUES (new._rowid, new.name, new.entity_type);
551
546
  END;
552
- `}];function i0(B,J){if(B.migrate(iB),J?.hasVectorExtension&&J?.embeddingDimension&&J.embeddingDimension>0)oB(B,J.embeddingDimension)}function oB(B,J){if(B.get("SELECT name FROM sqlite_master WHERE type='table' AND name='observation_embeddings'")){let z=B.get("SELECT value FROM _embedding_meta WHERE key = 'dimension'");if(z&&Number(z.value)!==J){console.warn(`[open-mem] vec0 table exists with dimension ${z.value}, but config specifies ${J}. Drop observation_embeddings to re-create with new dimension.`);return}}else B.exec(`CREATE VIRTUAL TABLE observation_embeddings USING vec0(
547
+ `}];function e0(B,J){if(B.migrate(zJ),J?.hasVectorExtension&&J?.embeddingDimension&&J.embeddingDimension>0)$J(B,J.embeddingDimension)}function $J(B,J){if(B.get("SELECT name FROM sqlite_master WHERE type='table' AND name='observation_embeddings'")){let z=B.get("SELECT value FROM _embedding_meta WHERE key = 'dimension'");if(z&&Number(z.value)!==J){console.warn(`[open-mem] vec0 table exists with dimension ${z.value}, but config specifies ${J}. Drop observation_embeddings to re-create with new dimension.`);return}}else B.exec(`CREATE VIRTUAL TABLE observation_embeddings USING vec0(
553
548
  observation_id TEXT PRIMARY KEY,
554
549
  embedding float[${J}] distance_metric=cosine
555
- )`);B.run("INSERT OR REPLACE INTO _embedding_meta (key, value) VALUES (?, ?)",["dimension",String(J)])}class W0{db;constructor(B){this.db=B}create(B,J){let K=new Date().toISOString();return this.db.run(`INSERT INTO sessions (id, project_path, started_at, status)
556
- VALUES (?, ?, ?, 'active')`,[B,J,K]),this.getById(B)}getOrCreate(B,J){let K=this.getById(B);if(K)return K;return this.create(B,J)}getById(B){let J=this.db.get("SELECT * FROM sessions WHERE id = ?",[B]);return J?this.mapRow(J):null}getRecent(B,J=10){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC LIMIT ?",[B,J]).map((K)=>this.mapRow(K))}getAll(B){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC",[B]).map((J)=>this.mapRow(J))}getActive(){return this.db.all("SELECT * FROM sessions WHERE status = 'active' ORDER BY started_at DESC").map((B)=>this.mapRow(B))}updateStatus(B,J){this.db.run("UPDATE sessions SET status = ? WHERE id = ?",[J,B])}markCompleted(B){this.db.run("UPDATE sessions SET status = 'completed', ended_at = datetime('now') WHERE id = ?",[B])}incrementObservationCount(B){this.db.run("UPDATE sessions SET observation_count = observation_count + 1 WHERE id = ?",[B])}setSummary(B,J){this.db.run("UPDATE sessions SET summary_id = ? WHERE id = ?",[J,B])}mapRow(B){return{id:B.id,projectPath:B.project_path,startedAt:B.started_at,endedAt:B.ended_at??null,status:B.status,observationCount:B.observation_count,summaryId:B.summary_id??null}}}import{randomUUID as tB}from"crypto";class E0{db;constructor(B){this.db=B}create(B){let J=tB(),K=new Date().toISOString();return this.db.run(`INSERT INTO session_summaries
550
+ )`);B.run("INSERT OR REPLACE INTO _embedding_meta (key, value) VALUES (?, ?)",["dimension",String(J)])}class E0{db;constructor(B){this.db=B}create(B,J){let K=new Date().toISOString();return this.db.run(`INSERT INTO sessions (id, project_path, started_at, status)
551
+ VALUES (?, ?, ?, 'active')`,[B,J,K]),this.getById(B)}getOrCreate(B,J){let K=this.getById(B);if(K)return K;return this.create(B,J)}getById(B){let J=this.db.get("SELECT * FROM sessions WHERE id = ?",[B]);return J?this.mapRow(J):null}getRecent(B,J=10){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC LIMIT ?",[B,J]).map((K)=>this.mapRow(K))}getAll(B){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC",[B]).map((J)=>this.mapRow(J))}getActive(){return this.db.all("SELECT * FROM sessions WHERE status = 'active' ORDER BY started_at DESC").map((B)=>this.mapRow(B))}updateStatus(B,J){this.db.run("UPDATE sessions SET status = ? WHERE id = ?",[J,B])}markCompleted(B){this.db.run("UPDATE sessions SET status = 'completed', ended_at = datetime('now') WHERE id = ?",[B])}incrementObservationCount(B){this.db.run("UPDATE sessions SET observation_count = observation_count + 1 WHERE id = ?",[B])}setSummary(B,J){this.db.run("UPDATE sessions SET summary_id = ? WHERE id = ?",[J,B])}mapRow(B){return{id:B.id,projectPath:B.project_path,startedAt:B.started_at,endedAt:B.ended_at??null,status:B.status,observationCount:B.observation_count,summaryId:B.summary_id??null}}}import{randomUUID as NJ}from"crypto";class Z0{db;constructor(B){this.db=B}create(B){let J=NJ(),K=new Date().toISOString();return this.db.run(`INSERT INTO session_summaries
557
552
  (id, session_id, summary, key_decisions, files_modified,
558
553
  concepts, created_at, token_count,
559
554
  request, investigated, learned, completed, next_steps)
@@ -566,5 +561,5 @@ Respond with EXACTLY this XML format:
566
561
  JOIN summaries_fts fts ON ss._rowid = fts.rowid
567
562
  WHERE summaries_fts MATCH ?
568
563
  ORDER BY rank
569
- LIMIT ?`,[B,J]).map((K)=>this.mapRow(K))}mapRow(B){return{id:B.id,sessionId:B.session_id,summary:B.summary,keyDecisions:JSON.parse(B.key_decisions),filesModified:JSON.parse(B.files_modified),concepts:JSON.parse(B.concepts),createdAt:B.created_at,tokenCount:B.token_count,request:B.request||void 0,investigated:B.investigated||void 0,learned:B.learned||void 0,completed:B.completed||void 0,nextSteps:B.next_steps||void 0}}}class R0{config;compressor;summarizer;pendingRepo;observationRepo;sessionRepo;summaryRepo;embeddingModel;conflictEvaluator;entityExtractor;entityRepo;observer;processing=!1;timer=null;mode="in-process";onEnqueue=null;constructor(B,J,K,z,$,N,W,Q=null,R=null,E=null,Z=null,A=null){this.config=B;this.compressor=J;this.summarizer=K;this.pendingRepo=z;this.observationRepo=$;this.sessionRepo=N;this.summaryRepo=W;this.embeddingModel=Q;this.conflictEvaluator=R;this.entityExtractor=E;this.entityRepo=Z;this.observer=A}setMode(B){if(this.mode=B,B==="enqueue-only")this.stop()}getMode(){return this.mode}setOnEnqueue(B){this.onEnqueue=B}enqueue(B,J,K,z){if(this.pendingRepo.create({sessionId:B,toolName:J,toolOutput:K,callId:z}),this.observer?.onEnqueue?.({sessionId:B,toolName:J,createdAt:new Date().toISOString()}),this.mode==="enqueue-only")this.onEnqueue?.()}async processBatch(){if(this.mode==="enqueue-only")return 0;if(this.processing)return 0;this.processing=!0;let B=0,J=0,K=Date.now();try{this.pendingRepo.resetStale(5);let z=this.pendingRepo.getPending(this.config.batchSize);if(this.observer?.onBatchStart?.({pending:z.length,mode:this.mode,startedAt:new Date(K).toISOString()}),z.length===0)return 0;for(let $ of z)try{this.pendingRepo.markProcessing($.id);let W=await this.compressor.compress($.toolName,$.toolOutput)??this.compressor.createFallbackObservation($.toolName,$.toolOutput),Q=!1,R=null;if(this.embeddingModel)try{let Z=z0({title:W.title,narrative:W.narrative,concepts:W.concepts}),A=await K0(this.embeddingModel,Z);if(A){let Y=this.config.conflictResolutionEnabled&&this.conflictEvaluator,U=this.config.conflictSimilarityBandLow??0.7,L=this.config.conflictSimilarityBandHigh??0.92;if(Y){let u=this.observationRepo.findSimilar(A,W.type,U,5),S=u.find((D)=>D.similarity>L);if(S)console.log(`[open-mem] Dedup: skipping duplicate of ${S.id} (similarity: ${S.similarity.toFixed(3)})`),Q=!0;else{let D=u.filter((X)=>X.similarity>=U&&X.similarity<=L);if(D.length>0)try{let X=D.map((H)=>{let G=this.observationRepo.getById(H.id);return G?{id:G.id,title:G.title,narrative:G.narrative,concepts:G.concepts,type:G.type}:null}).filter((H)=>H!==null);if(X.length>0&&this.conflictEvaluator){let H=await this.conflictEvaluator.evaluate({title:W.title,narrative:W.narrative,concepts:W.concepts,type:W.type},X);if(H&&H.outcome==="duplicate")console.log(`[open-mem] Conflict eval: duplicate (${H.reason})`),Q=!0;else if(H&&H.outcome==="update"&&H.supersedesId)console.log(`[open-mem] Conflict eval: update supersedes ${H.supersedesId} (${H.reason})`),R=H.supersedesId}}catch{}}}else{let u=this.observationRepo.findSimilar(A,W.type,0.92,1);if(u.length>0)console.log(`[open-mem] Dedup: skipping duplicate of ${u[0].id} (similarity: ${u[0].similarity.toFixed(3)})`),Q=!0}}}catch{}if(Q){this.pendingRepo.markCompleted($.id);continue}let E=this.observationRepo.create({sessionId:$.sessionId,type:W.type,title:W.title,subtitle:W.subtitle,facts:W.facts,narrative:W.narrative,concepts:W.concepts,filesRead:W.filesRead,filesModified:W.filesModified,rawToolOutput:$.toolOutput,toolName:$.toolName,tokenCount:P(`${W.title} ${W.narrative} ${W.facts.join(" ")}`),discoveryTokens:W.discoveryTokens??P($.toolOutput),importance:W.importance??3});if(this.embeddingModel)try{let Z=z0({title:E.title,narrative:E.narrative,concepts:E.concepts}),A=await K0(this.embeddingModel,Z);if(A)this.observationRepo.setEmbedding(E.id,A)}catch{}if(R)try{this.observationRepo.supersede(R,E.id),console.log(`[open-mem] Superseded observation ${R} with ${E.id}`)}catch(Z){console.error(`[open-mem] Failed to supersede ${R}:`,Z)}if(this.config.entityExtractionEnabled&&this.entityExtractor&&this.entityRepo)try{let Z=await this.entityExtractor.extract({title:E.title,narrative:E.narrative,concepts:E.concepts,facts:E.facts,filesRead:E.filesRead,filesModified:E.filesModified,type:E.type});if(Z){let A=new Map;for(let Y of Z.entities){let U=this.entityRepo.upsertEntity(Y.name,Y.entityType);A.set(Y.name,U.id),this.entityRepo.linkObservation(U.id,E.id)}for(let Y of Z.relations){let U=A.get(Y.sourceName),L=A.get(Y.targetName);if(U&&L)this.entityRepo.createRelation(U,L,Y.relationship,E.id)}}}catch{}this.sessionRepo.incrementObservationCount($.sessionId),this.pendingRepo.markCompleted($.id),B++}catch(N){this.pendingRepo.markFailed($.id,String(N)),J++,this.observer?.onItemFailed?.({pendingId:$.id,error:String(N),failedAt:new Date().toISOString()})}return B}finally{this.observer?.onBatchEnd?.({processed:B,failed:J,durationMs:Date.now()-K,finishedAt:new Date().toISOString()}),this.processing=!1}}async summarizeSession(B){let J=this.observationRepo.getBySession(B);if(!this.summarizer.shouldSummarize(J.length))return;if(this.summaryRepo.getBySessionId(B))return;let z=await this.summarizer.summarize(B,J);if(!z)return;let $=this.summaryRepo.create({sessionId:B,summary:z.summary,keyDecisions:z.keyDecisions,filesModified:z.filesModified,concepts:z.concepts,tokenCount:P(z.summary)});this.sessionRepo.setSummary(B,$.id)}start(){if(this.mode==="enqueue-only")return;if(this.timer)return;this.timer=setInterval(async()=>{try{await this.processBatch()}catch{}},this.config.batchIntervalMs)}stop(){if(this.timer)clearInterval(this.timer),this.timer=null}get isRunning(){return this.timer!==null}get isProcessing(){return this.processing}getStats(){return{pending:this.pendingRepo.getPending(1000).length,processing:this.processing}}}import{spawnSync as o0}from"child_process";import{dirname as aB,resolve as t0}from"path";function eB(B){try{let J=o0("git",["rev-parse","--git-common-dir"],{cwd:B,encoding:"utf-8",timeout:5000});if(J.status!==0||!J.stdout)return null;let K=J.stdout.trim();if(K===".git")return null;let z=o0("git",["rev-parse","--git-dir"],{cwd:B,encoding:"utf-8",timeout:5000});if(z.status!==0||!z.stdout)return null;let $=z.stdout.trim(),N=t0(B,K),W=t0(B,$);if(N===W)return null;let Q=aB(N);if(Q===N||Q==="/")return null;return Q}catch{return null}}function a0(B){return eB(B)??B}function Q0(B){process.stdout.write(`${JSON.stringify(B)}
570
- `)}function KJ(){let{values:B}=JJ({options:{project:{type:"string",short:"p"},"http-port":{type:"string"}},strict:!1}),J=typeof B.project==="string"?B.project:process.cwd(),K=B["http-port"],z=typeof K==="string"&&Number.parseInt(K,10)>0?Number.parseInt(K,10):void 0;return{projectDir:J,httpPort:z}}function zJ(B,J){if(B==="claude-code"&&!J.platformClaudeCodeEnabled)throw Error("Claude Code adapter is disabled. Set OPEN_MEM_PLATFORM_CLAUDE_CODE=true.");if(B==="cursor"&&!J.platformCursorEnabled)throw Error("Cursor adapter is disabled. Set OPEN_MEM_PLATFORM_CURSOR=true.")}function $J(B,J){let K=a0(J),z=c0(K);zJ(B,z),c.enableExtensionSupport();let $=d0(z.dbPath);i0($,{hasVectorExtension:$.hasVectorExtension,embeddingDimension:z.embeddingDimension});let N=new W0($),W=new $0($),Q=new E0($),R=new N0($),E=new h(z),Z=new e(z),A=z.provider!=="bedrock",Y=z.compressionEnabled&&(!A||z.apiKey)?p0({provider:z.provider,model:z.model,apiKey:z.apiKey}):null,U=z.conflictResolutionEnabled&&(!A||z.apiKey)?new t({provider:z.provider,apiKey:z.apiKey,model:z.model,rateLimitingEnabled:z.rateLimitingEnabled}):null,L=z.entityExtractionEnabled&&(!A||z.apiKey)?new a({provider:z.provider,apiKey:z.apiKey,model:z.model,rateLimitingEnabled:z.rateLimitingEnabled}):null,u=new J0($),S=new R0(z,E,Z,R,W,N,Q,Y,U,L,u),D=B==="claude-code"?X0():H0(),X=new s({adapter:D,queue:S,sessions:N,observations:W,pendingMessages:R,projectPath:K,config:z});return{db:$,queue:S,runtime:X,platform:B,projectPath:K}}function e0(B,J){let K=B.queue.getStats();return{id:J,ok:!0,code:"OK",status:{platform:B.platform,projectPath:B.projectPath,queue:{mode:B.queue.getMode(),running:B.queue.isRunning,processing:K.processing,pending:K.pending}}}}function Z0(B){if(!B||typeof B!=="object"||Array.isArray(B))return{command:"event",payload:B};let J=B,K=typeof J.command==="string"&&(J.command==="event"||J.command==="flush"||J.command==="health"||J.command==="shutdown")?J.command:void 0,z=typeof J.id==="string"||typeof J.id==="number"?J.id:void 0;if(!K)return{command:"event",payload:B,id:z};return{id:z,command:K,payload:"payload"in J?J.payload:void 0}}async function BB(B){let J=KJ(),K=$J(B,J.projectDir);K.queue.start();let z=!1,$=async()=>{if(z)return;z=!0;try{await K.queue.processBatch()}catch{}K.queue.stop(),K.db.close(),process.exit(0)},N=async(R)=>{let E=R.command??"event";if(E==="health")return e0(K,R.id);if(E==="flush"){let A=await K.queue.processBatch();return{id:R.id,ok:!0,code:"OK",processed:A}}if(E==="shutdown")return{id:R.id,ok:!0,code:"OK",message:"shutting down"};if(!await K.runtime.ingestRaw(R.payload))return{id:R.id,ok:!1,code:"UNSUPPORTED_EVENT",message:"Payload did not match adapter event schema"};return{id:R.id,ok:!0,code:"OK",ingested:!0}};if(J.httpPort)Bun.serve({port:J.httpPort,hostname:"127.0.0.1",idleTimeout:0,fetch:async(R)=>{if(R.method==="GET"&&new URL(R.url).pathname==="/v1/health")return Response.json(e0(K));if(R.method==="POST"&&new URL(R.url).pathname==="/v1/events"){let E;try{E=await R.json()}catch{return Response.json({ok:!1,code:"INVALID_JSON",message:"Invalid JSON payload"},{status:400})}try{let Z=await N(Z0(E));if((Z0(E).command??"event")==="shutdown")setTimeout(()=>{$()},0);return Response.json(Z,{status:Z.ok?200:422})}catch(Z){return Response.json({ok:!1,code:"INGESTION_FAILED",message:String(Z)},{status:500})}}return Response.json({ok:!1,code:"NOT_FOUND"},{status:404})}});process.on("SIGINT",()=>{$()}),process.on("SIGTERM",()=>{$()});let W=Promise.resolve(),Q=BJ({input:process.stdin,terminal:!1});Q.on("line",(R)=>{let E=R.trim();if(!E)return;W=W.then(async()=>{let Z;try{Z=JSON.parse(E)}catch{Q0({ok:!1,code:"INVALID_JSON",message:"Invalid JSON payload"});return}try{let A=Z0(Z),Y=await N(A);if(Q0(Y),(A.command??"event")==="shutdown")await $()}catch(A){Q0({ok:!1,code:"INGESTION_FAILED",message:String(A)})}})}),Q.on("close",()=>{W.finally(()=>$())})}BB("claude-code");
564
+ LIMIT ?`,[B,J]).map((K)=>this.mapRow(K))}mapRow(B){return{id:B.id,sessionId:B.session_id,summary:B.summary,keyDecisions:JSON.parse(B.key_decisions),filesModified:JSON.parse(B.files_modified),concepts:JSON.parse(B.concepts),createdAt:B.created_at,tokenCount:B.token_count,request:B.request||void 0,investigated:B.investigated||void 0,learned:B.learned||void 0,completed:B.completed||void 0,nextSteps:B.next_steps||void 0}}}class R0{config;compressor;summarizer;pendingRepo;observationRepo;sessionRepo;summaryRepo;embeddingModel;conflictEvaluator;entityExtractor;entityRepo;observer;processing=!1;timer=null;mode="in-process";onEnqueue=null;constructor(B,J,K,z,$,N,W,Z=null,Q=null,E=null,R=null,V=null){this.config=B;this.compressor=J;this.summarizer=K;this.pendingRepo=z;this.observationRepo=$;this.sessionRepo=N;this.summaryRepo=W;this.embeddingModel=Z;this.conflictEvaluator=Q;this.entityExtractor=E;this.entityRepo=R;this.observer=V}setMode(B){if(this.mode=B,B==="enqueue-only")this.stop()}getMode(){return this.mode}setOnEnqueue(B){this.onEnqueue=B}enqueue(B,J,K,z){if(this.pendingRepo.create({sessionId:B,toolName:J,toolOutput:K,callId:z}),this.observer?.onEnqueue?.({sessionId:B,toolName:J,createdAt:new Date().toISOString()}),this.mode==="enqueue-only")this.onEnqueue?.()}async processBatch(){if(this.mode==="enqueue-only")return 0;if(this.processing)return 0;this.processing=!0;let B=0,J=0,K=Date.now();try{this.pendingRepo.resetStale(5);let z=this.pendingRepo.getPending(this.config.batchSize);if(this.observer?.onBatchStart?.({pending:z.length,mode:this.mode,startedAt:new Date(K).toISOString()}),z.length===0)return 0;for(let $ of z)try{this.pendingRepo.markProcessing($.id);let W=await this.compressor.compress($.toolName,$.toolOutput)??this.compressor.createFallbackObservation($.toolName,$.toolOutput),Z=!1,Q=null;if(this.embeddingModel)try{let R=N0({title:W.title,narrative:W.narrative,concepts:W.concepts}),V=await $0(this.embeddingModel,R);if(V){let Y=this.config.conflictResolutionEnabled&&this.conflictEvaluator,A=this.config.conflictSimilarityBandLow??0.7,L=this.config.conflictSimilarityBandHigh??0.92;if(Y){let u=this.observationRepo.findSimilar(V,W.type,A,5),S=u.find((D)=>D.similarity>L);if(S)console.log(`[open-mem] Dedup: skipping duplicate of ${S.id} (similarity: ${S.similarity.toFixed(3)})`),Z=!0;else{let D=u.filter((X)=>X.similarity>=A&&X.similarity<=L);if(D.length>0)try{let X=D.map((H)=>{let k=this.observationRepo.getById(H.id);return k?{id:k.id,title:k.title,narrative:k.narrative,concepts:k.concepts,type:k.type}:null}).filter((H)=>H!==null);if(X.length>0&&this.conflictEvaluator){let H=await this.conflictEvaluator.evaluate({title:W.title,narrative:W.narrative,concepts:W.concepts,type:W.type},X);if(H&&H.outcome==="duplicate")console.log(`[open-mem] Conflict eval: duplicate (${H.reason})`),Z=!0;else if(H&&H.outcome==="update"&&H.supersedesId)console.log(`[open-mem] Conflict eval: update supersedes ${H.supersedesId} (${H.reason})`),Q=H.supersedesId}}catch{}}}else{let u=this.observationRepo.findSimilar(V,W.type,0.92,1);if(u.length>0)console.log(`[open-mem] Dedup: skipping duplicate of ${u[0].id} (similarity: ${u[0].similarity.toFixed(3)})`),Z=!0}}}catch{}if(Z){this.pendingRepo.markCompleted($.id);continue}let E=this.observationRepo.create({sessionId:$.sessionId,type:W.type,title:W.title,subtitle:W.subtitle,facts:W.facts,narrative:W.narrative,concepts:W.concepts,filesRead:W.filesRead,filesModified:W.filesModified,rawToolOutput:$.toolOutput,toolName:$.toolName,tokenCount:q(`${W.title} ${W.narrative} ${W.facts.join(" ")}`),discoveryTokens:W.discoveryTokens??q($.toolOutput),importance:W.importance??3});if(this.embeddingModel)try{let R=N0({title:E.title,narrative:E.narrative,concepts:E.concepts}),V=await $0(this.embeddingModel,R);if(V)this.observationRepo.setEmbedding(E.id,V)}catch{}if(Q)try{this.observationRepo.supersede(Q,E.id),console.log(`[open-mem] Superseded observation ${Q} with ${E.id}`)}catch(R){console.error(`[open-mem] Failed to supersede ${Q}:`,R)}if(this.config.entityExtractionEnabled&&this.entityExtractor&&this.entityRepo)try{let R=await this.entityExtractor.extract({title:E.title,narrative:E.narrative,concepts:E.concepts,facts:E.facts,filesRead:E.filesRead,filesModified:E.filesModified,type:E.type});if(R){let V=new Map;for(let Y of R.entities){let A=this.entityRepo.upsertEntity(Y.name,Y.entityType);V.set(Y.name,A.id),this.entityRepo.linkObservation(A.id,E.id)}for(let Y of R.relations){let A=V.get(Y.sourceName),L=V.get(Y.targetName);if(A&&L)this.entityRepo.createRelation(A,L,Y.relationship,E.id)}}}catch{}this.sessionRepo.incrementObservationCount($.sessionId),this.pendingRepo.markCompleted($.id),B++}catch(N){this.pendingRepo.markFailed($.id,String(N)),J++,this.observer?.onItemFailed?.({pendingId:$.id,error:String(N),failedAt:new Date().toISOString()})}return B}finally{this.observer?.onBatchEnd?.({processed:B,failed:J,durationMs:Date.now()-K,finishedAt:new Date().toISOString()}),this.processing=!1}}async summarizeSession(B){let J=this.observationRepo.getBySession(B);if(!this.summarizer.shouldSummarize(J.length))return;if(this.summaryRepo.getBySessionId(B))return;let z=await this.summarizer.summarize(B,J);if(!z)return;let $=this.summaryRepo.create({sessionId:B,summary:z.summary,keyDecisions:z.keyDecisions,filesModified:z.filesModified,concepts:z.concepts,tokenCount:q(z.summary)});this.sessionRepo.setSummary(B,$.id)}start(){if(this.mode==="enqueue-only")return;if(this.timer)return;this.timer=setInterval(async()=>{try{await this.processBatch()}catch{}},this.config.batchIntervalMs)}stop(){if(this.timer)clearInterval(this.timer),this.timer=null}get isRunning(){return this.timer!==null}get isProcessing(){return this.processing}getStats(){return{pending:this.pendingRepo.getPending(1000).length,processing:this.processing}}}import{spawnSync as BB}from"child_process";import{dirname as WJ,resolve as JB}from"path";function QJ(B){try{let J=BB("git",["rev-parse","--git-common-dir"],{cwd:B,encoding:"utf-8",timeout:5000});if(J.status!==0||!J.stdout)return null;let K=J.stdout.trim();if(K===".git")return null;let z=BB("git",["rev-parse","--git-dir"],{cwd:B,encoding:"utf-8",timeout:5000});if(z.status!==0||!z.stdout)return null;let $=z.stdout.trim(),N=JB(B,K),W=JB(B,$);if(N===W)return null;let Z=WJ(N);if(Z===N||Z==="/")return null;return Z}catch{return null}}function KB(B){return QJ(B)??B}function V0(B){process.stdout.write(`${JSON.stringify(B)}
565
+ `)}function RJ(){let{values:B}=ZJ({options:{project:{type:"string",short:"p"},"http-port":{type:"string"}},strict:!1}),J=typeof B.project==="string"?B.project:process.cwd(),K=B["http-port"],z=typeof K==="string"&&Number.parseInt(K,10)>0?Number.parseInt(K,10):void 0;return{projectDir:J,httpPort:z}}function VJ(B,J){if(B==="claude-code"&&!J.platformClaudeCodeEnabled)throw Error("Claude Code adapter is disabled. Set OPEN_MEM_PLATFORM_CLAUDE_CODE=true.");if(B==="cursor"&&!J.platformCursorEnabled)throw Error("Cursor adapter is disabled. Set OPEN_MEM_PLATFORM_CURSOR=true.")}function UJ(B,J){let K=KB(J),z=d0(K);VJ(B,z),l.enableExtensionSupport();let $=t0(z.dbPath);e0($,{hasVectorExtension:$.hasVectorExtension,embeddingDimension:z.embeddingDimension});let N=new E0($),W=new W0($),Z=new Z0($),Q=new Q0($),E=new x(z),R=new B0(z),V=z.provider!=="bedrock",Y=z.compressionEnabled&&(!V||z.apiKey)?b0({provider:z.provider,model:z.model,apiKey:z.apiKey}):null,A=z.conflictResolutionEnabled&&(!V||z.apiKey)?new o({provider:z.provider,apiKey:z.apiKey,model:z.model,rateLimitingEnabled:z.rateLimitingEnabled}):null,L=z.entityExtractionEnabled&&(!V||z.apiKey)?new e({provider:z.provider,apiKey:z.apiKey,model:z.model,rateLimitingEnabled:z.rateLimitingEnabled}):null,u=new z0($),S=new R0(z,E,R,Q,W,N,Z,Y,A,L,u),D=B==="claude-code"?H0():u0(),X=new i({adapter:D,queue:S,sessions:N,observations:W,pendingMessages:Q,projectPath:K,config:z});return{db:$,queue:S,runtime:X,platform:B,projectPath:K}}function zB(B,J){let K=B.queue.getStats();return{id:J,ok:!0,code:"OK",status:{platform:B.platform,projectPath:B.projectPath,queue:{mode:B.queue.getMode(),running:B.queue.isRunning,processing:K.processing,pending:K.pending}}}}function U0(B){if(!B||typeof B!=="object"||Array.isArray(B))return{command:"event",payload:B};let J=B,K=typeof J.command==="string"&&(J.command==="event"||J.command==="flush"||J.command==="health"||J.command==="shutdown")?J.command:void 0,z=typeof J.id==="string"||typeof J.id==="number"?J.id:void 0;if(!K)return{command:"event",payload:B,id:z};return{id:z,command:K,payload:"payload"in J?J.payload:void 0}}async function $B(B){let J=RJ(),K=UJ(B,J.projectDir);K.queue.start();let z=!1,$=async()=>{if(z)return;z=!0;try{await K.queue.processBatch()}catch{}K.queue.stop(),K.db.close(),process.exit(0)},N=async(Q)=>{let E=Q.command??"event";if(E==="health")return zB(K,Q.id);if(E==="flush"){let V=await K.queue.processBatch();return{id:Q.id,ok:!0,code:"OK",processed:V}}if(E==="shutdown")return{id:Q.id,ok:!0,code:"OK",message:"shutting down"};if(!await K.runtime.ingestRaw(Q.payload))return{id:Q.id,ok:!1,code:"UNSUPPORTED_EVENT",message:"Payload did not match adapter event schema"};return{id:Q.id,ok:!0,code:"OK",ingested:!0}};if(J.httpPort)Bun.serve({port:J.httpPort,hostname:"127.0.0.1",idleTimeout:0,fetch:async(Q)=>{if(Q.method==="GET"&&new URL(Q.url).pathname==="/v1/health")return Response.json(zB(K));if(Q.method==="POST"&&new URL(Q.url).pathname==="/v1/events"){let E;try{E=await Q.json()}catch{return Response.json({ok:!1,code:"INVALID_JSON",message:"Invalid JSON payload"},{status:400})}try{let R=await N(U0(E));if((U0(E).command??"event")==="shutdown")setTimeout(()=>{$()},0);return Response.json(R,{status:R.ok?200:422})}catch(R){return Response.json({ok:!1,code:"INGESTION_FAILED",message:String(R)},{status:500})}}return Response.json({ok:!1,code:"NOT_FOUND"},{status:404})}});process.on("SIGINT",()=>{$()}),process.on("SIGTERM",()=>{$()});let W=Promise.resolve(),Z=EJ({input:process.stdin,terminal:!1});Z.on("line",(Q)=>{let E=Q.trim();if(!E)return;W=W.then(async()=>{let R;try{R=JSON.parse(E)}catch{V0({ok:!1,code:"INVALID_JSON",message:"Invalid JSON payload"});return}try{let V=U0(R),Y=await N(V);if(V0(Y),(V.command??"event")==="shutdown")await $()}catch(V){V0({ok:!1,code:"INGESTION_FAILED",message:String(V)})}})}),Z.on("close",()=>{W.finally(()=>$())})}$B("claude-code");
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,SAAS,CAAC;AA2M9D,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAe5D;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAC5B,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAChC,aAAa,CAgEf;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAuB9D;AAMD,8CAA8C;AAC9C,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED,2CAA2C;AAC3C,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,SAAS,CAAC;AA+M9D,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAe5D;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAC5B,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAChC,aAAa,CAoEf;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAuB9D;AAMD,8CAA8C;AAC9C,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED,2CAA2C;AAC3C,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5E"}