open-mem 0.8.0 → 0.9.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.
package/dist/index.js CHANGED
@@ -1,24 +1,24 @@
1
1
  // @bun
2
- var kN=Object.create;var{getPrototypeOf:PN,defineProperty:r0,getOwnPropertyNames:wN}=Object;var qN=Object.prototype.hasOwnProperty;var vN=(f,N,O)=>{O=f!=null?kN(PN(f)):{};let E=N||!f||!f.__esModule?r0(O,"default",{value:f,enumerable:!0}):O;for(let M of wN(f))if(!qN.call(E,M))r0(E,M,{get:()=>f[M],enumerable:!0});return E};var xN=(f,N)=>{for(var O in N)r0(f,O,{get:N[O],enumerable:!0,configurable:!0,set:(E)=>N[O]=()=>E})};var b1=(f,N)=>()=>(f&&(N=f(f=0)),N);var u=import.meta.require;import{existsSync as oN,readFileSync as eN}from"fs";function fO(){let f={};if(process.env.OPEN_MEM_DB_PATH)f.dbPath=process.env.OPEN_MEM_DB_PATH;if(process.env.OPEN_MEM_PROVIDER)f.provider=process.env.OPEN_MEM_PROVIDER;if(process.env.OPEN_MEM_MODEL)f.model=process.env.OPEN_MEM_MODEL;if(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS)f.maxContextTokens=Number.parseInt(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS,10);if(process.env.OPEN_MEM_COMPRESSION==="false")f.compressionEnabled=!1;if(process.env.OPEN_MEM_CONTEXT_INJECTION==="false")f.contextInjectionEnabled=!1;if(process.env.OPEN_MEM_IGNORED_TOOLS)f.ignoredTools=process.env.OPEN_MEM_IGNORED_TOOLS.split(",").map((N)=>N.trim());if(process.env.OPEN_MEM_BATCH_SIZE)f.batchSize=Number.parseInt(process.env.OPEN_MEM_BATCH_SIZE,10);if(process.env.OPEN_MEM_RETENTION_DAYS)f.retentionDays=Number.parseInt(process.env.OPEN_MEM_RETENTION_DAYS,10);if(process.env.OPEN_MEM_LOG_LEVEL)f.logLevel=process.env.OPEN_MEM_LOG_LEVEL;if(process.env.OPEN_MEM_CONTEXT_SHOW_TOKEN_COSTS==="false")f.contextShowTokenCosts=!1;if(process.env.OPEN_MEM_CONTEXT_TYPES)f.contextObservationTypes=process.env.OPEN_MEM_CONTEXT_TYPES==="all"?"all":process.env.OPEN_MEM_CONTEXT_TYPES.split(",").map((N)=>N.trim());if(process.env.OPEN_MEM_CONTEXT_FULL_COUNT)f.contextFullObservationCount=Number.parseInt(process.env.OPEN_MEM_CONTEXT_FULL_COUNT,10);if(process.env.OPEN_MEM_MAX_OBSERVATIONS)f.maxObservations=Number.parseInt(process.env.OPEN_MEM_MAX_OBSERVATIONS,10);if(process.env.OPEN_MEM_CONTEXT_SHOW_LAST_SUMMARY==="false")f.contextShowLastSummary=!1;if(process.env.OPEN_MEM_RATE_LIMITING==="false")f.rateLimitingEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT==="false")f.folderContextEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH)f.folderContextMaxDepth=Number.parseInt(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH,10);if(process.env.OPEN_MEM_DAEMON==="true")f.daemonEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD==="true")f.dashboardEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD_PORT)f.dashboardPort=Number.parseInt(process.env.OPEN_MEM_DASHBOARD_PORT,10);if(process.env.OPEN_MEM_PLATFORM_OPENCODE==="false")f.platformOpenCodeEnabled=!1;if(process.env.OPEN_MEM_PLATFORM_CLAUDE_CODE==="true")f.platformClaudeCodeEnabled=!0;if(process.env.OPEN_MEM_PLATFORM_CURSOR==="true")f.platformCursorEnabled=!0;if(process.env.OPEN_MEM_MCP_COMPAT_MODE)f.mcpCompatibilityMode=process.env.OPEN_MEM_MCP_COMPAT_MODE;if(process.env.OPEN_MEM_MCP_PROTOCOL_VERSION)f.mcpProtocolVersion=process.env.OPEN_MEM_MCP_PROTOCOL_VERSION;if(process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS)f.mcpSupportedProtocolVersions=process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS.split(",").map((N)=>N.trim()).filter(Boolean);if(process.env.OPEN_MEM_EMBEDDING_DIMENSION)f.embeddingDimension=Number.parseInt(process.env.OPEN_MEM_EMBEDDING_DIMENSION,10);if(process.env.OPEN_MEM_CONFLICT_RESOLUTION==="true")f.conflictResolutionEnabled=!0;if(process.env.OPEN_MEM_CONFLICT_BAND_LOW){let N=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_LOW);if(!Number.isNaN(N))f.conflictSimilarityBandLow=N}if(process.env.OPEN_MEM_CONFLICT_BAND_HIGH){let N=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_HIGH);if(!Number.isNaN(N))f.conflictSimilarityBandHigh=N}if(process.env.OPEN_MEM_USER_MEMORY==="true")f.userMemoryEnabled=!0;if(process.env.OPEN_MEM_USER_MEMORY_DB_PATH)f.userMemoryDbPath=process.env.OPEN_MEM_USER_MEMORY_DB_PATH;if(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS)f.userMemoryMaxContextTokens=Number.parseInt(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS,10);if(process.env.OPEN_MEM_RERANKING==="true")f.rerankingEnabled=!0;if(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES)f.rerankingMaxCandidates=Number.parseInt(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES,10);if(process.env.OPEN_MEM_ENTITY_EXTRACTION==="true")f.entityExtractionEnabled=!0;return f}function NO(f){let N=`${f}/.open-mem/config.json`;if(!oN(N))return{};try{let O=eN(N,"utf-8"),E=JSON.parse(O);if(!E||typeof E!=="object"||Array.isArray(E))return{};return E}catch{return{}}}function OO(f){switch(f){case"google":return 768;case"openai":return 1536;case"bedrock":return 1024;case"anthropic":return 0;default:return 768}}function _0(f,N){let O=NO(f),E=fO(),M={...Qf,...O,...E,...N};if(!M.dbPath.startsWith("/"))M.dbPath=`${f}/${M.dbPath}`;if(!process.env.OPEN_MEM_PROVIDER&&!N?.provider){if(process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY)M.provider="google";else if(process.env.ANTHROPIC_API_KEY)M.provider="anthropic";else if(process.env.AWS_BEARER_TOKEN_BEDROCK||process.env.AWS_ACCESS_KEY_ID||process.env.AWS_PROFILE)M.provider="bedrock"}if(!M.apiKey)switch(M.provider){case"google":M.apiKey=process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;break;case"anthropic":M.apiKey=process.env.ANTHROPIC_API_KEY;break;case"openai":M.apiKey=process.env.OPENAI_API_KEY;break;case"bedrock":break}if(M.embeddingDimension===void 0)M.embeddingDimension=OO(M.provider);return M}function Wf(f){let N=[],O=f.provider!=="bedrock";if(f.compressionEnabled&&O&&!f.apiKey)N.push("AI compression enabled but no API key found. Get a free Gemini API key at https://aistudio.google.com/apikey and set GOOGLE_GENERATIVE_AI_API_KEY, or set OPEN_MEM_PROVIDER and the appropriate API key for your provider.");if(f.maxContextTokens<500)N.push("maxContextTokens must be at least 500");if(f.batchSize<1)N.push("batchSize must be at least 1");if(f.minOutputLength<0)N.push("minOutputLength must be non-negative");return N}function E1(){return{...Qf}}async function Df(f){let N=f.dbPath.substring(0,f.dbPath.lastIndexOf("/")),{mkdir:O}=await import("fs/promises");await O(N,{recursive:!0})}var Qf;var M1=b1(()=>{Qf={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,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}});var Zf={};xN(Zf,{writeProjectConfig:()=>Rf,validatePatch:()=>$1,readProjectConfig:()=>b,previewConfig:()=>S1,patchConfig:()=>G0,getEffectiveConfig:()=>h,getConfigSchema:()=>A1});import{existsSync as EO}from"fs";import{mkdir as MO,readFile as AO,writeFile as $O}from"fs/promises";import{dirname as SO,join as _O}from"path";function Bf(f){return _O(f,".open-mem","config.json")}function Kf(f){return Xf.find((N)=>N.key===f)}function JO(f,N){let O=Kf(f);if(!O)return null;if(O.type==="string"&&typeof N!=="string")return`${String(f)} must be a string`;if(O.type==="number"&&typeof N!=="number")return`${String(f)} must be a number`;if(O.type==="boolean"&&typeof N!=="boolean")return`${String(f)} must be a boolean`;if(O.type==="array"&&!Array.isArray(N))return`${String(f)} must be an array`;if(O.enum&&typeof N==="string"&&!O.enum.includes(N))return`${String(f)} must be one of: ${O.enum.join(", ")}`;if(typeof N==="number"){if(O.min!==void 0&&N<O.min)return`${String(f)} must be >= ${O.min}`;if(O.max!==void 0&&N>O.max)return`${String(f)} must be <= ${O.max}`}return null}function A1(){return Xf}async function b(f){let N=Bf(f);if(!EO(N))return{};try{let O=await AO(N,"utf-8"),E=JSON.parse(O);if(!E||typeof E!=="object"||Array.isArray(E))return{};return E}catch{return{}}}async function Rf(f,N){let O=Bf(f),M={...await b(f),...N};await MO(SO(O),{recursive:!0}),await $O(O,JSON.stringify(M,null,2),"utf-8")}function $1(f){let N=[];for(let[O,E]of Object.entries(f)){let A=JO(O,E);if(A)N.push(A)}return N}async function h(f){let N=E1(),O=await b(f),E=_0(f),M=[],A={};for(let[S,$]of Object.entries(N)){let _=S,V=Kf(_),Q=(VO[_]??[]).some((L)=>typeof process.env[L]==="string"),W=Object.hasOwn(O,_),D="default";if(W)D="file";if(Q)D="env";if(A[_]={source:D,locked:Q,restartRequired:V?.restartRequired??!1,liveApply:V?.liveApply??!1},D==="env"&&W)M.push(`${String(_)} is overridden by environment variable.`);if(E[_]===void 0&&$!==void 0)M.push(`${String(_)} resolved to undefined unexpectedly.`)}return{config:E,meta:A,warnings:M}}async function S1(f,N){let O=$1(N);if(O.length>0)return{...await h(f),warnings:O};let E=E1(),M=await b(f),A={...E,...M,...N},$={..._0(f,N),...A},_=(await h(f)).meta;return{config:$,meta:_,warnings:[]}}async function G0(f,N){let O=$1(N);if(O.length>0)return{...await h(f),warnings:O};return await Rf(f,N),h(f)}var Xf,VO;var _1=b1(()=>{M1();Xf=[{key:"dbPath",label:"Database Path",type:"string",group:"Storage",liveApply:!1,restartRequired:!0},{key:"provider",label:"Provider",type:"string",group:"AI",liveApply:!1,restartRequired:!0,enum:["google","anthropic","openai","bedrock"]},{key:"model",label:"Model",type:"string",group:"AI",liveApply:!1,restartRequired:!0},{key:"maxTokensPerCompression",label:"Max Tokens Per Compression",type:"number",group:"AI",liveApply:!0,restartRequired:!1,min:128,max:8192},{key:"compressionEnabled",label:"Compression Enabled",type:"boolean",group:"Behavior",liveApply:!0,restartRequired:!1},{key:"contextInjectionEnabled",label:"Context Injection Enabled",type:"boolean",group:"Behavior",liveApply:!0,restartRequired:!1},{key:"maxContextTokens",label:"Max Context Tokens",type:"number",group:"Behavior",liveApply:!0,restartRequired:!1,min:500,max:64000},{key:"batchSize",label:"Batch Size",type:"number",group:"Behavior",liveApply:!0,restartRequired:!1,min:1,max:100},{key:"batchIntervalMs",label:"Batch Interval (ms)",type:"number",group:"Behavior",liveApply:!0,restartRequired:!1,min:1000,max:300000},{key:"ignoredTools",label:"Ignored Tools",type:"array",group:"Filtering",liveApply:!0,restartRequired:!1},{key:"minOutputLength",label:"Min Output Length",type:"number",group:"Filtering",liveApply:!0,restartRequired:!1,min:0,max:1e4},{key:"maxObservations",label:"Max Observations",type:"number",group:"Progressive Disclosure",liveApply:!0,restartRequired:!1,min:1,max:200},{key:"contextFullObservationCount",label:"Full Observation Count",type:"number",group:"Progressive Disclosure",liveApply:!0,restartRequired:!1,min:0,max:20},{key:"contextShowTokenCosts",label:"Show Token Costs",type:"boolean",group:"Progressive Disclosure",liveApply:!0,restartRequired:!1},{key:"sensitivePatterns",label:"Sensitive Patterns",type:"array",group:"Privacy",liveApply:!0,restartRequired:!1},{key:"retentionDays",label:"Retention Days",type:"number",group:"Data Retention",liveApply:!1,restartRequired:!0,min:0,max:3650},{key:"maxDatabaseSizeMb",label:"Max Database Size (MB)",type:"number",group:"Data Retention",liveApply:!1,restartRequired:!0,min:0,max:1e5},{key:"dashboardEnabled",label:"Dashboard Enabled",type:"boolean",group:"Dashboard",liveApply:!1,restartRequired:!0},{key:"dashboardPort",label:"Dashboard Port",type:"number",group:"Dashboard",liveApply:!1,restartRequired:!0,min:1,max:65535},{key:"platformOpenCodeEnabled",label:"OpenCode Adapter",type:"boolean",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"platformClaudeCodeEnabled",label:"Claude Code Adapter",type:"boolean",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"platformCursorEnabled",label:"Cursor Adapter",type:"boolean",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"mcpCompatibilityMode",label:"MCP Compatibility Mode",type:"string",group:"Advanced",liveApply:!1,restartRequired:!0,enum:["strict","legacy"]},{key:"mcpProtocolVersion",label:"MCP Protocol Version",type:"string",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"mcpSupportedProtocolVersions",label:"MCP Supported Protocols",type:"array",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"rerankingEnabled",label:"Reranking Enabled",type:"boolean",group:"Advanced",liveApply:!0,restartRequired:!1},{key:"entityExtractionEnabled",label:"Entity Extraction Enabled",type:"boolean",group:"Advanced",liveApply:!0,restartRequired:!1},{key:"userMemoryEnabled",label:"User Memory Enabled",type:"boolean",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"userMemoryMaxContextTokens",label:"User Memory Max Context Tokens",type:"number",group:"Advanced",liveApply:!0,restartRequired:!1,min:0,max:8000}],VO={dbPath:["OPEN_MEM_DB_PATH"],provider:["OPEN_MEM_PROVIDER"],model:["OPEN_MEM_MODEL"],compressionEnabled:["OPEN_MEM_COMPRESSION"],contextInjectionEnabled:["OPEN_MEM_CONTEXT_INJECTION"],maxContextTokens:["OPEN_MEM_MAX_CONTEXT_TOKENS"],ignoredTools:["OPEN_MEM_IGNORED_TOOLS"],batchSize:["OPEN_MEM_BATCH_SIZE"],retentionDays:["OPEN_MEM_RETENTION_DAYS"],contextShowTokenCosts:["OPEN_MEM_CONTEXT_SHOW_TOKEN_COSTS"],contextFullObservationCount:["OPEN_MEM_CONTEXT_FULL_COUNT"],maxObservations:["OPEN_MEM_MAX_OBSERVATIONS"],dashboardEnabled:["OPEN_MEM_DASHBOARD"],dashboardPort:["OPEN_MEM_DASHBOARD_PORT"],platformOpenCodeEnabled:["OPEN_MEM_PLATFORM_OPENCODE"],platformClaudeCodeEnabled:["OPEN_MEM_PLATFORM_CLAUDE_CODE"],platformCursorEnabled:["OPEN_MEM_PLATFORM_CURSOR"],mcpCompatibilityMode:["OPEN_MEM_MCP_COMPAT_MODE"],mcpProtocolVersion:["OPEN_MEM_MCP_PROTOCOL_VERSION"],mcpSupportedProtocolVersions:["OPEN_MEM_MCP_SUPPORTED_PROTOCOLS"],rerankingEnabled:["OPEN_MEM_RERANKING"],userMemoryEnabled:["OPEN_MEM_USER_MEMORY"]}});import{existsSync as MM}from"fs";import{dirname as AM,join as r}from"path";import{fileURLToPath as $M}from"url";import{randomUUID as V0}from"crypto";import{normalize as QO,resolve as V1,sep as Lf}from"path";import{fileURLToPath as WO}from"url";var d0=(f,N,O)=>{return(E,M)=>{let A=-1;return S(0);async function S($){if($<=A)throw Error("next() called multiple times");A=$;let _,V=!1,J;if(f[$])J=f[$][0][0],E.req.routeIndex=$;else J=$===f.length&&M||void 0;if(J)try{_=await J(E,()=>S($+1))}catch(Q){if(Q instanceof Error&&N)E.error=Q,_=await N(Q,E),V=!0;else throw Q}else if(E.finalized===!1&&O)_=await O(E);if(_&&(E.finalized===!1||V))E.res=_;return E}}};var n1=Symbol();var p1=async(f,N=Object.create(null))=>{let{all:O=!1,dot:E=!1}=N,A=(f instanceof K0?f.raw.headers:f.headers).get("Content-Type");if(A?.startsWith("multipart/form-data")||A?.startsWith("application/x-www-form-urlencoded"))return gN(f,{all:O,dot:E});return{}};async function gN(f,N){let O=await f.formData();if(O)return uN(O,N);return{}}function uN(f,N){let O=Object.create(null);if(f.forEach((E,M)=>{if(!(N.all||M.endsWith("[]")))O[M]=E;else mN(O,M,E)}),N.dot)Object.entries(O).forEach(([E,M])=>{if(E.includes("."))lN(O,E,M),delete O[E]});return O}var mN=(f,N,O)=>{if(f[N]!==void 0)if(Array.isArray(f[N]))f[N].push(O);else f[N]=[f[N],O];else if(!N.endsWith("[]"))f[N]=O;else f[N]=[O]},lN=(f,N,O)=>{let E=f,M=N.split(".");M.forEach((A,S)=>{if(S===M.length-1)E[A]=O;else{if(!E[A]||typeof E[A]!=="object"||Array.isArray(E[A])||E[A]instanceof File)E[A]=Object.create(null);E=E[A]}})};var a0=(f)=>{let N=f.split("/");if(N[0]==="")N.shift();return N},i1=(f)=>{let{groups:N,path:O}=cN(f),E=a0(O);return hN(E,N)},cN=(f)=>{let N=[];return f=f.replace(/\{[^}]+\}/g,(O,E)=>{let M=`@${E}`;return N.push([M,O]),M}),{groups:N,path:f}},hN=(f,N)=>{for(let O=N.length-1;O>=0;O--){let[E]=N[O];for(let M=f.length-1;M>=0;M--)if(f[M].includes(E)){f[M]=f[M].replace(E,N[O][1]);break}}return f},R0={},r1=(f,N)=>{if(f==="*")return"*";let O=f.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(O){let E=`${f}#${N}`;if(!R0[E])if(O[2])R0[E]=N&&N[0]!==":"&&N[0]!=="*"?[E,O[1],new RegExp(`^${O[2]}(?=/${N})`)]:[f,O[1],new RegExp(`^${O[2]}$`)];else R0[E]=[f,O[1],!0];return R0[E]}return null},Z0=(f,N)=>{try{return N(f)}catch{return f.replace(/(?:%[0-9A-Fa-f]{2})+/g,(O)=>{try{return N(O)}catch{return O}})}},bN=(f)=>Z0(f,decodeURI),s0=(f)=>{let N=f.url,O=N.indexOf("/",N.indexOf(":")+4),E=O;for(;E<N.length;E++){let M=N.charCodeAt(E);if(M===37){let A=N.indexOf("?",E),S=N.slice(O,A===-1?void 0:A);return bN(S.includes("%25")?S.replace(/%25/g,"%2525"):S)}else if(M===63)break}return N.slice(O,E)};var d1=(f)=>{let N=s0(f);return N.length>1&&N.at(-1)==="/"?N.slice(0,-1):N},l=(f,N,...O)=>{if(O.length)N=l(N,...O);return`${f?.[0]==="/"?"":"/"}${f}${N==="/"?"":`${f?.at(-1)==="/"?"":"/"}${N?.[0]==="/"?N.slice(1):N}`}`},L0=(f)=>{if(f.charCodeAt(f.length-1)!==63||!f.includes(":"))return null;let N=f.split("/"),O=[],E="";return N.forEach((M)=>{if(M!==""&&!/\:/.test(M))E+="/"+M;else if(/\:/.test(M))if(/\?/.test(M)){if(O.length===0&&E==="")O.push("/");else O.push(E);let A=M.replace("?","");E+="/"+A,O.push(E)}else E+="/"+M}),O.filter((M,A,S)=>S.indexOf(M)===A)},t0=(f)=>{if(!/[%+]/.test(f))return f;if(f.indexOf("+")!==-1)f=f.replace(/\+/g," ");return f.indexOf("%")!==-1?Z0(f,o0):f},t1=(f,N,O)=>{let E;if(!O&&N&&!/[%+]/.test(N)){let S=f.indexOf("?",8);if(S===-1)return;if(!f.startsWith(N,S+1))S=f.indexOf(`&${N}`,S+1);while(S!==-1){let $=f.charCodeAt(S+N.length+1);if($===61){let _=S+N.length+2,V=f.indexOf("&",_);return t0(f.slice(_,V===-1?void 0:V))}else if($==38||isNaN($))return"";S=f.indexOf(`&${N}`,S+1)}if(E=/[%+]/.test(f),!E)return}let M={};E??=/[%+]/.test(f);let A=f.indexOf("?",8);while(A!==-1){let S=f.indexOf("&",A+1),$=f.indexOf("=",A);if($>S&&S!==-1)$=-1;let _=f.slice(A+1,$===-1?S===-1?void 0:S:$);if(E)_=t0(_);if(A=S,_==="")continue;let V;if($===-1)V="";else if(V=f.slice($+1,S===-1?void 0:S),E)V=t0(V);if(O){if(!(M[_]&&Array.isArray(M[_])))M[_]=[];M[_].push(V)}else M[_]??=V}return N?M[N]:M},a1=t1,s1=(f,N)=>{return t1(f,N,!0)},o0=decodeURIComponent;var o1=(f)=>Z0(f,o0),K0=class{raw;#f;#N;routeIndex=0;path;bodyCache={};constructor(f,N="/",O=[[]]){this.raw=f,this.path=N,this.#N=O,this.#f={}}param(f){return f?this.#O(f):this.#A()}#O(f){let N=this.#N[0][this.routeIndex][1][f],O=this.#M(N);return O&&/\%/.test(O)?o1(O):O}#A(){let f={},N=Object.keys(this.#N[0][this.routeIndex][1]);for(let O of N){let E=this.#M(this.#N[0][this.routeIndex][1][O]);if(E!==void 0)f[O]=/\%/.test(E)?o1(E):E}return f}#M(f){return this.#N[1]?this.#N[1][f]:f}query(f){return a1(this.url,f)}queries(f){return s1(this.url,f)}header(f){if(f)return this.raw.headers.get(f)??void 0;let N={};return this.raw.headers.forEach((O,E)=>{N[E]=O}),N}async parseBody(f){return this.bodyCache.parsedBody??=await p1(this,f)}#E=(f)=>{let{bodyCache:N,raw:O}=this,E=N[f];if(E)return E;let M=Object.keys(N)[0];if(M)return N[M].then((A)=>{if(M==="json")A=JSON.stringify(A);return new Response(A)[f]()});return N[f]=O[f]()};json(){return this.#E("text").then((f)=>JSON.parse(f))}text(){return this.#E("text")}arrayBuffer(){return this.#E("arrayBuffer")}blob(){return this.#E("blob")}formData(){return this.#E("formData")}addValidatedData(f,N){this.#f[f]=N}valid(f){return this.#f[f]}get url(){return this.raw.url}get method(){return this.raw.method}get[n1](){return this.#N}get matchedRoutes(){return this.#N[0].map(([[,f]])=>f)}get routePath(){return this.#N[0].map(([[,f]])=>f)[this.routeIndex].path}};var U0={Stringify:1,BeforeStream:2,Stream:3},nN=(f,N)=>{let O=new String(f);return O.isEscaped=!0,O.callbacks=N,O};var E0=async(f,N,O,E,M)=>{if(typeof f==="object"&&!(f instanceof String)){if(!(f instanceof Promise))f=f.toString();if(f instanceof Promise)f=await f}let A=f.callbacks;if(!A?.length)return Promise.resolve(f);if(M)M[0]+=f;else M=[f];let S=Promise.all(A.map(($)=>$({phase:N,buffer:M,context:E}))).then(($)=>Promise.all($.filter(Boolean).map((_)=>E0(_,N,!1,E,M))).then(()=>M[0]));if(O)return nN(await S,A);else return S};var e1="text/plain; charset=UTF-8",e0=(f,N)=>{return{"Content-Type":f,...N}},ff=class{#f;#N;env={};#O;finalized=!1;error;#A;#M;#E;#J;#_;#V;#S;#Q;#W;constructor(f,N){if(this.#f=f,N)this.#M=N.executionCtx,this.env=N.env,this.#V=N.notFoundHandler,this.#W=N.path,this.#Q=N.matchResult}get req(){return this.#N??=new K0(this.#f,this.#W,this.#Q),this.#N}get event(){if(this.#M&&"respondWith"in this.#M)return this.#M;else throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#M)return this.#M;else throw Error("This context has no ExecutionContext")}get res(){return this.#E||=new Response(null,{headers:this.#S??=new Headers})}set res(f){if(this.#E&&f){f=new Response(f.body,f);for(let[N,O]of this.#E.headers.entries()){if(N==="content-type")continue;if(N==="set-cookie"){let E=this.#E.headers.getSetCookie();f.headers.delete("set-cookie");for(let M of E)f.headers.append("set-cookie",M)}else f.headers.set(N,O)}}this.#E=f,this.finalized=!0}render=(...f)=>{return this.#_??=(N)=>this.html(N),this.#_(...f)};setLayout=(f)=>this.#J=f;getLayout=()=>this.#J;setRenderer=(f)=>{this.#_=f};header=(f,N,O)=>{if(this.finalized)this.#E=new Response(this.#E.body,this.#E);let E=this.#E?this.#E.headers:this.#S??=new Headers;if(N===void 0)E.delete(f);else if(O?.append)E.append(f,N);else E.set(f,N)};status=(f)=>{this.#A=f};set=(f,N)=>{this.#O??=new Map,this.#O.set(f,N)};get=(f)=>{return this.#O?this.#O.get(f):void 0};get var(){if(!this.#O)return{};return Object.fromEntries(this.#O)}#$(f,N,O){let E=this.#E?new Headers(this.#E.headers):this.#S??new Headers;if(typeof N==="object"&&"headers"in N){let A=N.headers instanceof Headers?N.headers:new Headers(N.headers);for(let[S,$]of A)if(S.toLowerCase()==="set-cookie")E.append(S,$);else E.set(S,$)}if(O)for(let[A,S]of Object.entries(O))if(typeof S==="string")E.set(A,S);else{E.delete(A);for(let $ of S)E.append(A,$)}let M=typeof N==="number"?N:N?.status??this.#A;return new Response(f,{status:M,headers:E})}newResponse=(...f)=>this.#$(...f);body=(f,N,O)=>this.#$(f,N,O);text=(f,N,O)=>{return!this.#S&&!this.#A&&!N&&!O&&!this.finalized?new Response(f):this.#$(f,N,e0(e1,O))};json=(f,N,O)=>{return this.#$(JSON.stringify(f),N,e0("application/json",O))};html=(f,N,O)=>{let E=(M)=>this.#$(M,N,e0("text/html; charset=UTF-8",O));return typeof f==="object"?E0(f,U0.Stringify,!1,{}).then(E):E(f)};redirect=(f,N)=>{let O=String(f);return this.header("Location",!/[^\x00-\xFF]/.test(O)?O:encodeURI(O)),this.newResponse(null,N??302)};notFound=()=>{return this.#V??=()=>new Response,this.#V(this)}};var Y="ALL",Nf="all",Of=["get","post","put","delete","options","patch"],Y0="Can not add a route since the matcher is already built.",C0=class extends Error{};var Ef="__COMPOSED_HANDLER";var pN=(f)=>{return f.text("404 Not Found",404)},Mf=(f,N)=>{if("getResponse"in f){let O=f.getResponse();return N.newResponse(O.body,O)}return console.error(f),N.text("Internal Server Error",500)},Af=class f{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#f="/";routes=[];constructor(N={}){[...Of,Nf].forEach((A)=>{this[A]=(S,...$)=>{if(typeof S==="string")this.#f=S;else this.#A(A,this.#f,S);return $.forEach((_)=>{this.#A(A,this.#f,_)}),this}}),this.on=(A,S,...$)=>{for(let _ of[S].flat()){this.#f=_;for(let V of[A].flat())$.map((J)=>{this.#A(V.toUpperCase(),this.#f,J)})}return this},this.use=(A,...S)=>{if(typeof A==="string")this.#f=A;else this.#f="*",S.unshift(A);return S.forEach(($)=>{this.#A(Y,this.#f,$)}),this};let{strict:E,...M}=N;Object.assign(this,M),this.getPath=E??!0?N.getPath??s0:d1}#N(){let N=new f({router:this.router,getPath:this.getPath});return N.errorHandler=this.errorHandler,N.#O=this.#O,N.routes=this.routes,N}#O=pN;errorHandler=Mf;route(N,O){let E=this.basePath(N);return O.routes.map((M)=>{let A;if(O.errorHandler===Mf)A=M.handler;else A=async(S,$)=>(await d0([],O.errorHandler)(S,()=>M.handler(S,$))).res,A[Ef]=M.handler;E.#A(M.method,M.path,A)}),this}basePath(N){let O=this.#N();return O._basePath=l(this._basePath,N),O}onError=(N)=>{return this.errorHandler=N,this};notFound=(N)=>{return this.#O=N,this};mount(N,O,E){let M,A;if(E)if(typeof E==="function")A=E;else if(A=E.optionHandler,E.replaceRequest===!1)M=(_)=>_;else M=E.replaceRequest;let S=A?(_)=>{let V=A(_);return Array.isArray(V)?V:[V]}:(_)=>{let V=void 0;try{V=_.executionCtx}catch{}return[_.env,V]};M||=(()=>{let _=l(this._basePath,N),V=_==="/"?0:_.length;return(J)=>{let Q=new URL(J.url);return Q.pathname=Q.pathname.slice(V)||"/",new Request(Q,J)}})();let $=async(_,V)=>{let J=await O(M(_.req.raw),...S(_));if(J)return J;await V()};return this.#A(Y,l(N,"*"),$),this}#A(N,O,E){N=N.toUpperCase(),O=l(this._basePath,O);let M={basePath:this._basePath,path:O,method:N,handler:E};this.router.add(N,O,[E,M]),this.routes.push(M)}#M(N,O){if(N instanceof Error)return this.errorHandler(N,O);throw N}#E(N,O,E,M){if(M==="HEAD")return(async()=>new Response(null,await this.#E(N,O,E,"GET")))();let A=this.getPath(N,{env:E}),S=this.router.match(M,A),$=new ff(N,{path:A,matchResult:S,env:E,executionCtx:O,notFoundHandler:this.#O});if(S[0].length===1){let V;try{V=S[0][0][0][0]($,async()=>{$.res=await this.#O($)})}catch(J){return this.#M(J,$)}return V instanceof Promise?V.then((J)=>J||($.finalized?$.res:this.#O($))).catch((J)=>this.#M(J,$)):V??this.#O($)}let _=d0(S[0],this.errorHandler,this.#O);return(async()=>{try{let V=await _($);if(!V.finalized)throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return V.res}catch(V){return this.#M(V,$)}})()}fetch=(N,...O)=>{return this.#E(N,O[1],O[0],N.method)};request=(N,O,E,M)=>{if(N instanceof Request)return this.fetch(O?new Request(N,O):N,E,M);return N=N.toString(),this.fetch(new Request(/^https?:\/\//.test(N)?N:`http://localhost${l("/",N)}`,O),E,M)};fire=()=>{addEventListener("fetch",(N)=>{N.respondWith(this.#E(N.request,N,void 0,N.request.method))})}};var M0=[];function z0(f,N){let O=this.buildAllMatchers(),E=(M,A)=>{let S=O[M]||O[Y],$=S[2][A];if($)return $;let _=A.match(S[0]);if(!_)return[[],M0];let V=_.indexOf("",1);return[S[1][V],_]};return this.match=E,E(f,N)}var F0="[^/]+",A0=".*",$0="(?:|/.*)",c=Symbol(),iN=new Set(".\\+*[^]$()");function rN(f,N){if(f.length===1)return N.length===1?f<N?-1:1:-1;if(N.length===1)return 1;if(f===A0||f===$0)return 1;else if(N===A0||N===$0)return-1;if(f===F0)return 1;else if(N===F0)return-1;return f.length===N.length?f<N?-1:1:N.length-f.length}var $f=class f{#f;#N;#O=Object.create(null);insert(N,O,E,M,A){if(N.length===0){if(this.#f!==void 0)throw c;if(A)return;this.#f=O;return}let[S,...$]=N,_=S==="*"?$.length===0?["","",A0]:["","",F0]:S==="/*"?["","",$0]:S.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),V;if(_){let J=_[1],Q=_[2]||F0;if(J&&_[2]){if(Q===".*")throw c;if(Q=Q.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(Q))throw c}if(V=this.#O[Q],!V){if(Object.keys(this.#O).some((W)=>W!==A0&&W!==$0))throw c;if(A)return;if(V=this.#O[Q]=new f,J!=="")V.#N=M.varIndex++}if(!A&&J!=="")E.push([J,V.#N])}else if(V=this.#O[S],!V){if(Object.keys(this.#O).some((J)=>J.length>1&&J!==A0&&J!==$0))throw c;if(A)return;V=this.#O[S]=new f}V.insert($,O,E,M,A)}buildRegExpStr(){let O=Object.keys(this.#O).sort(rN).map((E)=>{let M=this.#O[E];return(typeof M.#N==="number"?`(${E})@${M.#N}`:iN.has(E)?`\\${E}`:E)+M.buildRegExpStr()});if(typeof this.#f==="number")O.unshift(`#${this.#f}`);if(O.length===0)return"";if(O.length===1)return O[0];return"(?:"+O.join("|")+")"}};var Sf=class{#f={varIndex:0};#N=new $f;insert(f,N,O){let E=[],M=[];for(let S=0;;){let $=!1;if(f=f.replace(/\{[^}]+\}/g,(_)=>{let V=`@\\${S}`;return M[S]=[V,_],S++,$=!0,V}),!$)break}let A=f.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let S=M.length-1;S>=0;S--){let[$]=M[S];for(let _=A.length-1;_>=0;_--)if(A[_].indexOf($)!==-1){A[_]=A[_].replace($,M[S][1]);break}}return this.#N.insert(A,N,E,this.#f,O),E}buildRegExp(){let f=this.#N.buildRegExpStr();if(f==="")return[/^$/,[],[]];let N=0,O=[],E=[];return f=f.replace(/#(\d+)|@(\d+)|\.\*\$/g,(M,A,S)=>{if(A!==void 0)return O[++N]=Number(A),"$()";if(S!==void 0)return E[Number(S)]=++N,"";return""}),[new RegExp(`^${f}`),O,E]}};var dN=[/^$/,[],Object.create(null)],_f=Object.create(null);function Vf(f){return _f[f]??=new RegExp(f==="*"?"":`^${f.replace(/\/\*$|([.\\+*[^\]$()])/g,(N,O)=>O?`\\${O}`:"(?:|/.*)")}$`)}function tN(){_f=Object.create(null)}function aN(f){let N=new Sf,O=[];if(f.length===0)return dN;let E=f.map((V)=>[!/\*|\/:/.test(V[0]),...V]).sort(([V,J],[Q,W])=>V?1:Q?-1:J.length-W.length),M=Object.create(null);for(let V=0,J=-1,Q=E.length;V<Q;V++){let[W,D,L]=E[V];if(W)M[D]=[L.map(([Z])=>[Z,Object.create(null)]),M0];else J++;let K;try{K=N.insert(D,J,W)}catch(Z){throw Z===c?new C0(D):Z}if(W)continue;O[J]=L.map(([Z,C])=>{let y=Object.create(null);C-=1;for(;C>=0;C--){let[F,G]=K[C];y[F]=G}return[Z,y]})}let[A,S,$]=N.buildRegExp();for(let V=0,J=O.length;V<J;V++)for(let Q=0,W=O[V].length;Q<W;Q++){let D=O[V][Q]?.[1];if(!D)continue;let L=Object.keys(D);for(let K=0,Z=L.length;K<Z;K++)D[L[K]]=$[D[L[K]]]}let _=[];for(let V in S)_[V]=O[S[V]];return[A,_,M]}function t(f,N){if(!f)return;for(let O of Object.keys(f).sort((E,M)=>M.length-E.length))if(Vf(O).test(N))return[...f[O]];return}var j0=class{name="RegExpRouter";#f;#N;constructor(){this.#f={[Y]:Object.create(null)},this.#N={[Y]:Object.create(null)}}add(f,N,O){let E=this.#f,M=this.#N;if(!E||!M)throw Error(Y0);if(!E[f])[E,M].forEach(($)=>{$[f]=Object.create(null),Object.keys($[Y]).forEach((_)=>{$[f][_]=[...$[Y][_]]})});if(N==="/*")N="*";let A=(N.match(/\/:/g)||[]).length;if(/\*$/.test(N)){let $=Vf(N);if(f===Y)Object.keys(E).forEach((_)=>{E[_][N]||=t(E[_],N)||t(E[Y],N)||[]});else E[f][N]||=t(E[f],N)||t(E[Y],N)||[];Object.keys(E).forEach((_)=>{if(f===Y||f===_)Object.keys(E[_]).forEach((V)=>{$.test(V)&&E[_][V].push([O,A])})}),Object.keys(M).forEach((_)=>{if(f===Y||f===_)Object.keys(M[_]).forEach((V)=>$.test(V)&&M[_][V].push([O,A]))});return}let S=L0(N)||[N];for(let $=0,_=S.length;$<_;$++){let V=S[$];Object.keys(M).forEach((J)=>{if(f===Y||f===J)M[J][V]||=[...t(E[J],V)||t(E[Y],V)||[]],M[J][V].push([O,A-_+$+1])})}}match=z0;buildAllMatchers(){let f=Object.create(null);return Object.keys(this.#N).concat(Object.keys(this.#f)).forEach((N)=>{f[N]||=this.#O(N)}),this.#f=this.#N=void 0,tN(),f}#O(f){let N=[],O=f===Y;if([this.#f,this.#N].forEach((E)=>{let M=E[f]?Object.keys(E[f]).map((A)=>[A,E[f][A]]):[];if(M.length!==0)O||=!0,N.push(...M);else if(f!==Y)N.push(...Object.keys(E[Y]).map((A)=>[A,E[Y][A]]))}),!O)return null;else return aN(N)}};var sN=class{name="PreparedRegExpRouter";#f;#N;constructor(f,N){this.#f=f,this.#N=N}#O(f,N){let O=this.#f[f];O[1].forEach((E)=>E&&E.push(N)),Object.values(O[2]).forEach((E)=>E[0].push(N))}#A(f,N,O,E,M){let A=this.#f[f];if(!M)A[2][N][0].push([O,{}]);else E.forEach((S)=>{if(typeof S==="number")A[1][S].push([O,M]);else A[2][S||N][0].push([O,M])})}add(f,N,O){if(!this.#f[f]){let M=this.#f[Y],A={};for(let S in M[2])A[S]=[M[2][S][0].slice(),M0];this.#f[f]=[M[0],M[1].map((S)=>Array.isArray(S)?S.slice():0),A]}if(N==="/*"||N==="*"){let M=[O,{}];if(f===Y)for(let A in this.#f)this.#O(A,M);else this.#O(f,M);return}let E=this.#N[N];if(!E)throw Error(`Path ${N} is not registered`);for(let[M,A]of E)if(f===Y)for(let S in this.#f)this.#A(S,N,O,M,A);else this.#A(f,N,O,M,A)}buildAllMatchers(){return this.#f}match=z0};var f1=class{name="SmartRouter";#f=[];#N=[];constructor(f){this.#f=f.routers}add(f,N,O){if(!this.#N)throw Error(Y0);this.#N.push([f,N,O])}match(f,N){if(!this.#N)throw Error("Fatal error");let O=this.#f,E=this.#N,M=O.length,A=0,S;for(;A<M;A++){let $=O[A];try{for(let _=0,V=E.length;_<V;_++)$.add(...E[_]);S=$.match(f,N)}catch(_){if(_ instanceof C0)continue;throw _}this.match=$.match.bind($),this.#f=[$],this.#N=void 0;break}if(A===M)throw Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,S}get activeRouter(){if(this.#N||this.#f.length!==1)throw Error("No active router has been determined yet.");return this.#f[0]}};var S0=Object.create(null),Jf=class f{#f;#N;#O;#A=0;#M=S0;constructor(N,O,E){if(this.#N=E||Object.create(null),this.#f=[],N&&O){let M=Object.create(null);M[N]={handler:O,possibleKeys:[],score:0},this.#f=[M]}this.#O=[]}insert(N,O,E){this.#A=++this.#A;let M=this,A=i1(O),S=[];for(let $=0,_=A.length;$<_;$++){let V=A[$],J=A[$+1],Q=r1(V,J),W=Array.isArray(Q)?Q[0]:V;if(W in M.#N){if(M=M.#N[W],Q)S.push(Q[1]);continue}if(M.#N[W]=new f,Q)M.#O.push(Q),S.push(Q[1]);M=M.#N[W]}return M.#f.push({[N]:{handler:E,possibleKeys:S.filter(($,_,V)=>V.indexOf($)===_),score:this.#A}}),M}#E(N,O,E,M){let A=[];for(let S=0,$=N.#f.length;S<$;S++){let _=N.#f[S],V=_[O]||_[Y],J={};if(V!==void 0){if(V.params=Object.create(null),A.push(V),E!==S0||M&&M!==S0)for(let Q=0,W=V.possibleKeys.length;Q<W;Q++){let D=V.possibleKeys[Q],L=J[V.score];V.params[D]=M?.[D]&&!L?M[D]:E[D]??M?.[D],J[V.score]=!0}}}return A}search(N,O){let E=[];this.#M=S0;let A=[this],S=a0(O),$=[];for(let _=0,V=S.length;_<V;_++){let J=S[_],Q=_===V-1,W=[];for(let D=0,L=A.length;D<L;D++){let K=A[D],Z=K.#N[J];if(Z)if(Z.#M=K.#M,Q){if(Z.#N["*"])E.push(...this.#E(Z.#N["*"],N,K.#M));E.push(...this.#E(Z,N,K.#M))}else W.push(Z);for(let C=0,y=K.#O.length;C<y;C++){let F=K.#O[C],G=K.#M===S0?{}:{...K.#M};if(F==="*"){let k=K.#N["*"];if(k)E.push(...this.#E(k,N,K.#M)),k.#M=G,W.push(k);continue}let[D0,x,T]=F;if(!J&&!(T instanceof RegExp))continue;let I=K.#N[D0],b0=S.slice(_).join("/");if(T instanceof RegExp){let k=T.exec(b0);if(k){if(G[x]=k[0],E.push(...this.#E(I,N,K.#M,G)),Object.keys(I.#N).length){I.#M=G;let X0=k[0].match(/\//)?.length??0;($[X0]||=[]).push(I)}continue}}if(T===!0||T.test(J))if(G[x]=J,Q){if(E.push(...this.#E(I,N,G,K.#M)),I.#N["*"])E.push(...this.#E(I.#N["*"],N,G,K.#M))}else I.#M=G,W.push(I)}}A=W.concat($.shift()??[])}if(E.length>1)E.sort((_,V)=>{return _.score-V.score});return[E.map(({handler:_,params:V})=>[_,V])]}};var N1=class{name="TrieRouter";#f;constructor(){this.#f=new Jf}add(f,N,O){let E=L0(N);if(E){for(let M=0,A=E.length;M<A;M++)this.#f.insert(f,E[M],O);return}this.#f.insert(f,N,O)}match(f,N){return this.#f.search(f,N)}};var O1=class extends Af{constructor(f={}){super(f);this.router=f.router??new f1({routers:[new j0,new N1]})}};_1();import{z as X}from"zod";var a=X.enum(["decision","bugfix","feature","refactor","discovery","change"]);function B(f,N={}){return{data:f,error:null,meta:N}}function R(f,N,O){return{data:null,error:{code:f,message:N,details:O},meta:{}}}var j={find:X.object({query:X.string().min(1),scope:X.enum(["project","user","all"]).optional().default("project"),types:X.array(a).optional(),limit:X.number().int().min(1).max(50).optional().default(10),cursor:X.string().optional(),include:X.object({snippets:X.boolean().optional(),scores:X.boolean().optional(),relations:X.boolean().optional()}).optional()}),history:X.object({limit:X.number().int().min(1).max(20).optional().default(5),cursor:X.string().optional(),sessionId:X.string().optional()}),get:X.object({ids:X.array(X.string()).min(1),includeHistory:X.boolean().optional().default(!1),limit:X.number().int().min(1).max(50).optional().default(10)}),create:X.object({title:X.string(),type:a,narrative:X.string(),concepts:X.array(X.string()).optional(),files:X.array(X.string()).optional(),importance:X.number().int().min(1).max(5).optional(),scope:X.enum(["project","user"]).optional().default("project")}),revise:X.object({id:X.string(),title:X.string().optional(),narrative:X.string().optional(),type:a.optional(),concepts:X.array(X.string()).optional(),importance:X.number().int().min(1).max(5).optional(),reason:X.string().optional()}),remove:X.object({id:X.string(),reason:X.string().optional()}),transferExport:X.object({scope:X.enum(["project"]).optional().default("project"),type:a.optional(),limit:X.number().int().min(1).optional(),format:X.enum(["json"]).optional().default("json")}),transferImport:X.object({payload:X.string(),mode:X.enum(["skip","merge","replace"]).optional().default("skip")}),maintenance:X.object({action:X.enum(["folderContextDryRun","folderContextClean","folderContextRebuild"])}),help:X.object({})};var DO=new Set(a.options);function J1(f,N,O=100){if(!f)return N;let E=Number.parseInt(f,10);if(Number.isNaN(E))return N;return Math.max(1,Math.min(E,O))}function XO(f){if(!f)return 0;let N=Number.parseInt(f,10);if(Number.isNaN(N))return 0;return Math.max(0,N)}function Uf(f){if(!f)return;if(DO.has(f))return f;return}function H0(f){let N={};for(let[O,E]of Object.entries(f)){let M=O.toLowerCase();N[O]=typeof E==="string"&&(M.includes("key")||M.includes("api"))?"***REDACTED***":E}return N}function Yf(f){let{projectPath:N,memoryEngine:O,runtimeStatusProvider:E,dashboardDir:M}=f,A=new O1;A.get("/v1/memory/observations",($)=>{let _=J1($.req.query("limit"),50),V=XO($.req.query("offset")),J=Uf($.req.query("type")),Q=$.req.query("sessionId"),W=$.req.query("state"),D=W==="current"||W==="superseded"||W==="tombstoned"?W:void 0,L=O.listObservations({limit:_,offset:V,type:J,sessionId:Q,state:D});return $.json(B(L,{limit:_,offset:V}))}),A.post("/v1/memory/observations",async($)=>{try{let _=await $.req.json(),V=await O.save({..._,sessionId:_.sessionId??`http-${Date.now()}`});if(!V)return $.json(R("CONFLICT","Unable to create observation"),409);return $.json(B(V),201)}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),A.get("/v1/memory/observations/:id",($)=>{let _=$.req.param("id"),V=O.getObservation(_);if(!V)return $.json(R("NOT_FOUND","Observation not found"),404);return $.json(B(V))}),A.get("/v1/memory/observations/:id/lineage",($)=>{let _=$.req.param("id"),V=O.getLineage(_);if(!V)return $.json(R("NOT_FOUND","Observation not found"),404);return $.json(B({observationId:_,lineage:V}))}),A.get("/v1/memory/observations/:id/revision-diff",($)=>{let _=$.req.param("id"),V=$.req.query("against");if(!V)return $.json(R("VALIDATION_ERROR","Query parameter 'against' is required"),400);let J=O.getRevisionDiff(_,V);if(!J)return $.json(R("NOT_FOUND","One or both observations not found"),404);if($.req.query("version")==="1")return $.json(B({baseId:J.toId,againstId:J.fromId,changes:J.changedFields}));return $.json(B(J))}),A.post("/v1/memory/observations/:id/revisions",async($)=>{let _=$.req.param("id");try{let V=await $.req.json(),J=await O.update({id:_,...V});if(!J)return $.json(R("NOT_FOUND","Observation not found"),404);return $.json(B({previousId:_,newId:J.id,observation:J}))}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),A.post("/v1/memory/observations/:id/tombstone",async($)=>{let _=$.req.param("id");if(await O.delete([_])===0)return $.json(R("NOT_FOUND","Observation not found"),404);return $.json(B({id:_,tombstoned:!0}))}),A.get("/v1/memory/sessions",($)=>{let _=J1($.req.query("limit"),20),V=$.req.query("projectPath")||N;return $.json(B(O.listSessions({limit:_,projectPath:V}),{limit:_}))}),A.get("/v1/memory/sessions/:id",($)=>{let _=$.req.param("id"),V=O.getSession(_);if(!V)return $.json(R("NOT_FOUND","Session not found"),404);return $.json(B({...V.session,observations:V.observations,summary:V.summary}))}),A.get("/v1/memory/search",async($)=>{let _=$.req.query("q");if(!_)return $.json(R("VALIDATION_ERROR","Query parameter 'q' is required"),400);let V=Uf($.req.query("type")),J=J1($.req.query("limit"),20);try{let Q=await O.search(_,{type:V,limit:J});return $.json(B(Q,{limit:J}))}catch{return $.json(B([],{limit:J}))}}),A.post("/v1/memory/recall",async($)=>{try{let _=await $.req.json(),V=await O.recall(_.ids??[],_.limit??10);return $.json(B(V))}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),A.post("/v1/memory/export",async($)=>{try{let _=await $.req.json().catch(()=>({})),V=await O.export("project",{type:_.type,limit:_.limit});return $.json(B(V))}catch(_){return $.json(R("INTERNAL_ERROR",String(_)),500)}}),A.post("/v1/memory/import",async($)=>{try{let _=await $.req.json(),V=_.mode==="replace"?"overwrite":"skip-duplicates",J=await O.import(_.payload,{mode:V});return $.json(B(J))}catch{return $.json(R("VALIDATION_ERROR","Invalid import payload"),400)}}),A.get("/v1/memory/stats",($)=>{return $.json(B(O.stats()))}),A.get("/v1/health",($)=>{let _=O.getHealth(),V=O.getMetrics(),J=E?.(),Q={status:_.status,timestamp:_.timestamp,uptimeMs:process.uptime()*1000,queue:{mode:"in-process",running:!1,processing:!1,pending:0,lastBatchDurationMs:0,lastProcessedAt:null,lastFailedAt:null,lastError:null},batches:{total:0,processedItems:0,failedItems:0,avgDurationMs:0},enqueueCount:0},W=J??Q;return $.json(B({status:W.status,timestamp:W.timestamp,uptimeMs:W.uptimeMs,queue:W.queue,memory:{totalObservations:V.memory.totalObservations,totalSessions:V.memory.totalSessions}}))}),A.get("/v1/metrics",($)=>{let _=O.getHealth(),J=E?.()??{status:_.status,timestamp:_.timestamp,uptimeMs:process.uptime()*1000,queue:{mode:"in-process",running:!1,processing:!1,pending:0,lastBatchDurationMs:0,lastProcessedAt:null,lastFailedAt:null,lastError:null},batches:{total:0,processedItems:0,failedItems:0,avgDurationMs:0},enqueueCount:0};return $.json(B(J))}),A.get("/v1/platforms",($)=>{let _=O.getAdapterStatuses();return $.json(B({platforms:_.map((V)=>({name:V.name,version:V.version,enabled:V.enabled,capabilities:V.capabilities}))}))}),A.get("/v1/adapters/status",($)=>{return $.json(B(O.getAdapterStatuses()))}),A.get("/v1/config/schema",($)=>$.json(B(A1()))),A.get("/v1/config/effective",async($)=>{let _=await h(N);return $.json(B({config:H0(_.config),meta:_.meta,warnings:_.warnings}))}),A.post("/v1/config/preview",async($)=>{try{let _=await $.req.json(),V=await S1(N,_);return $.json(B({config:H0(V.config),meta:V.meta,warnings:V.warnings}))}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),A.patch("/v1/config",async($)=>{let _;try{_=await $.req.json()}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}try{let V=await b(N),J=await G0(N,_),Q={};for(let W of Object.keys(_))if(Object.hasOwn(V,W))Q[W]=V[W];return O.trackConfigAudit({id:V0(),timestamp:new Date().toISOString(),patch:_,previousValues:Q,source:"api"}),$.json(B({config:H0(J.config),meta:J.meta,warnings:J.warnings}))}catch(V){return $.json(R("INTERNAL_ERROR",String(V)),500)}}),A.get("/v1/config/audit",($)=>{return $.json(B(O.getConfigAuditTimeline()))}),A.post("/v1/config/rollback",async($)=>{let _;try{_=await $.req.json()}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}if(!_.eventId)return $.json(R("VALIDATION_ERROR","eventId is required"),400);try{let V=await O.rollbackConfig(_.eventId);if(!V)return $.json(R("NOT_FOUND","Audit event not found"),404);return $.json(B(V))}catch(V){return $.json(R("INTERNAL_ERROR",String(V)),500)}});let S={balanced:{minOutputLength:50,contextFullObservationCount:3,maxObservations:50,batchSize:5},focus:{minOutputLength:120,contextFullObservationCount:2,maxObservations:30,batchSize:3},chill:{minOutputLength:200,contextFullObservationCount:1,maxObservations:15,batchSize:2,compressionEnabled:!1}};if(A.get("/v1/modes",($)=>$.json(B({modes:Object.entries(S).map(([_,V])=>({id:_,patch:V}))}))),A.post("/v1/modes/:id/apply",async($)=>{let _=$.req.param("id"),V=S[_];if(!V)return $.json(R("NOT_FOUND","Unknown mode"),404);try{let J=await b(N),Q=await G0(N,V),W={};for(let D of Object.keys(V))if(Object.hasOwn(J,D))W[D]=J[D];return O.trackConfigAudit({id:V0(),timestamp:new Date().toISOString(),patch:V,previousValues:W,source:"mode"}),$.json(B({applied:_,config:H0(Q.config),meta:Q.meta,warnings:Q.warnings}))}catch(J){return $.json(R("INTERNAL_ERROR",String(J)),500)}}),A.post("/v1/maintenance/folder-context/dry-run",async($)=>{try{let V=(await $.req.json().catch(()=>({}))).action??"clean",J=await O.maintainFolderContext(V,!0);return O.trackMaintenanceResult({id:V0(),timestamp:new Date().toISOString(),action:`folder-context-${V}-dry-run`,dryRun:!0,result:J}),$.json(B(J))}catch(_){return $.json(R("INTERNAL_ERROR",String(_)),500)}}),A.post("/v1/maintenance/folder-context/clean",async($)=>{try{let _=await O.maintainFolderContext("clean",!1);return O.trackMaintenanceResult({id:V0(),timestamp:new Date().toISOString(),action:"folder-context-clean",dryRun:!1,result:_}),$.json(B(_))}catch(_){return $.json(R("INTERNAL_ERROR",String(_)),500)}}),A.post("/v1/maintenance/folder-context/rebuild",async($)=>{try{let _=await O.maintainFolderContext("rebuild",!1);return O.trackMaintenanceResult({id:V0(),timestamp:new Date().toISOString(),action:"folder-context-rebuild",dryRun:!1,result:_}),$.json(B(_))}catch(_){return $.json(R("INTERNAL_ERROR",String(_)),500)}}),A.get("/v1/maintenance/history",($)=>{return $.json(B(O.getMaintenanceHistory()))}),f.sseHandler)A.get("/v1/events",f.sseHandler);return A.get("*",async($)=>{let _=$.req.path;if(_.startsWith("/v1/"))return $.json(R("NOT_FOUND","Not found"),404);let V=M??V1(WO(import.meta.url),"../../dist/dashboard"),J=QO(V),Q=J.endsWith(Lf)?J:`${J}${Lf}`,W=_==="/"?"index.html":_.replace(/^\//,""),D=V1(V,W);if(!D.startsWith(Q))return $.json(R("NOT_FOUND","Not found"),404);try{let K=Bun.file(D);if(await K.exists())return new Response(K)}catch{}let L=V1(V,"index.html");if(!L.startsWith(Q))return $.json(R("NOT_FOUND","Not found"),404);try{let K=Bun.file(L);if(await K.exists())return new Response(K,{headers:{"Content-Type":"text/html; charset=utf-8"}})}catch{}return $.json(R("NOT_FOUND","Dashboard not found. Run the dashboard build first."),404)}),A}var Q1=class{writer;encoder;writable;abortSubscribers=[];responseReadable;aborted=!1;closed=!1;constructor(f,N){this.writable=f,this.writer=f.getWriter(),this.encoder=new TextEncoder;let O=N.getReader();this.abortSubscribers.push(async()=>{await O.cancel()}),this.responseReadable=new ReadableStream({async pull(E){let{done:M,value:A}=await O.read();M?E.close():E.enqueue(A)},cancel:()=>{this.abort()}})}async write(f){try{if(typeof f==="string")f=this.encoder.encode(f);await this.writer.write(f)}catch{}return this}async writeln(f){return await this.write(f+`
3
- `),this}sleep(f){return new Promise((N)=>setTimeout(N,f))}async close(){try{await this.writer.close()}catch{}this.closed=!0}async pipe(f){this.writer.releaseLock(),await f.pipeTo(this.writable,{preventClose:!0}),this.writer=this.writable.getWriter()}onAbort(f){this.abortSubscribers.push(f)}abort(){if(!this.aborted)this.aborted=!0,this.abortSubscribers.forEach((f)=>f())}};var y0=()=>{let f=typeof Bun<"u"?Bun.version:void 0;if(f===void 0)return!1;let N=f.startsWith("1.1")||f.startsWith("1.0")||f.startsWith("0.");return y0=()=>N,N};var Cf=class extends Q1{constructor(f,N){super(f,N)}async writeSSE(f){let O=(await E0(f.data,U0.Stringify,!1,{})).split(/\r\n|\r|\n/).map((M)=>{return`data: ${M}`}).join(`
4
- `),E=[f.event&&`event: ${f.event}`,O,f.id&&`id: ${f.id}`,f.retry&&`retry: ${f.retry}`].filter(Boolean).join(`
2
+ var bE=Object.create;var{getPrototypeOf:pE,defineProperty:a0,getOwnPropertyNames:nE}=Object;var rE=Object.prototype.hasOwnProperty;var iE=(N,E,f)=>{f=N!=null?bE(pE(N)):{};let O=E||!N||!N.__esModule?a0(f,"default",{value:N,enumerable:!0}):f;for(let M of nE(N))if(!rE.call(O,M))a0(O,M,{get:()=>N[M],enumerable:!0});return O};var dE=(N,E)=>{for(var f in E)a0(N,f,{get:E[f],enumerable:!0,configurable:!0,set:(O)=>E[f]=()=>O})};var s1=(N,E)=>()=>(N&&(E=N(N=0)),E);var g=import.meta.require;import{existsSync as Jf,readFileSync as Qf}from"fs";function Wf(){let N={};if(process.env.OPEN_MEM_DB_PATH)N.dbPath=process.env.OPEN_MEM_DB_PATH;if(process.env.OPEN_MEM_PROVIDER)N.provider=process.env.OPEN_MEM_PROVIDER;if(process.env.OPEN_MEM_MODEL)N.model=process.env.OPEN_MEM_MODEL;if(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS)N.maxContextTokens=Number.parseInt(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS,10);if(process.env.OPEN_MEM_COMPRESSION==="false")N.compressionEnabled=!1;if(process.env.OPEN_MEM_CONTEXT_INJECTION==="false")N.contextInjectionEnabled=!1;if(process.env.OPEN_MEM_IGNORED_TOOLS)N.ignoredTools=process.env.OPEN_MEM_IGNORED_TOOLS.split(",").map((E)=>E.trim());if(process.env.OPEN_MEM_BATCH_SIZE)N.batchSize=Number.parseInt(process.env.OPEN_MEM_BATCH_SIZE,10);if(process.env.OPEN_MEM_RETENTION_DAYS)N.retentionDays=Number.parseInt(process.env.OPEN_MEM_RETENTION_DAYS,10);if(process.env.OPEN_MEM_LOG_LEVEL)N.logLevel=process.env.OPEN_MEM_LOG_LEVEL;if(process.env.OPEN_MEM_CONTEXT_SHOW_TOKEN_COSTS==="false")N.contextShowTokenCosts=!1;if(process.env.OPEN_MEM_CONTEXT_TYPES)N.contextObservationTypes=process.env.OPEN_MEM_CONTEXT_TYPES==="all"?"all":process.env.OPEN_MEM_CONTEXT_TYPES.split(",").map((E)=>E.trim());if(process.env.OPEN_MEM_CONTEXT_FULL_COUNT)N.contextFullObservationCount=Number.parseInt(process.env.OPEN_MEM_CONTEXT_FULL_COUNT,10);if(process.env.OPEN_MEM_MAX_OBSERVATIONS)N.maxObservations=Number.parseInt(process.env.OPEN_MEM_MAX_OBSERVATIONS,10);if(process.env.OPEN_MEM_CONTEXT_SHOW_LAST_SUMMARY==="false")N.contextShowLastSummary=!1;if(process.env.OPEN_MEM_RATE_LIMITING==="false")N.rateLimitingEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT==="false")N.folderContextEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH)N.folderContextMaxDepth=Number.parseInt(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH,10);if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="single")N.folderContextMode="single";if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="dispersed")N.folderContextMode="dispersed";if(process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME)N.folderContextFilename=process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME;if(process.env.OPEN_MEM_DAEMON==="true")N.daemonEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD==="true")N.dashboardEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD_PORT)N.dashboardPort=Number.parseInt(process.env.OPEN_MEM_DASHBOARD_PORT,10);if(process.env.OPEN_MEM_PLATFORM_OPENCODE==="false")N.platformOpenCodeEnabled=!1;if(process.env.OPEN_MEM_PLATFORM_CLAUDE_CODE==="true")N.platformClaudeCodeEnabled=!0;if(process.env.OPEN_MEM_PLATFORM_CURSOR==="true")N.platformCursorEnabled=!0;if(process.env.OPEN_MEM_MCP_COMPAT_MODE)N.mcpCompatibilityMode=process.env.OPEN_MEM_MCP_COMPAT_MODE;if(process.env.OPEN_MEM_MCP_PROTOCOL_VERSION)N.mcpProtocolVersion=process.env.OPEN_MEM_MCP_PROTOCOL_VERSION;if(process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS)N.mcpSupportedProtocolVersions=process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS.split(",").map((E)=>E.trim()).filter(Boolean);if(process.env.OPEN_MEM_EMBEDDING_DIMENSION)N.embeddingDimension=Number.parseInt(process.env.OPEN_MEM_EMBEDDING_DIMENSION,10);if(process.env.OPEN_MEM_CONFLICT_RESOLUTION==="true")N.conflictResolutionEnabled=!0;if(process.env.OPEN_MEM_CONFLICT_BAND_LOW){let E=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_LOW);if(!Number.isNaN(E))N.conflictSimilarityBandLow=E}if(process.env.OPEN_MEM_CONFLICT_BAND_HIGH){let E=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_HIGH);if(!Number.isNaN(E))N.conflictSimilarityBandHigh=E}if(process.env.OPEN_MEM_USER_MEMORY==="true")N.userMemoryEnabled=!0;if(process.env.OPEN_MEM_USER_MEMORY_DB_PATH)N.userMemoryDbPath=process.env.OPEN_MEM_USER_MEMORY_DB_PATH;if(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS)N.userMemoryMaxContextTokens=Number.parseInt(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS,10);if(process.env.OPEN_MEM_RERANKING==="true")N.rerankingEnabled=!0;if(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES)N.rerankingMaxCandidates=Number.parseInt(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES,10);if(process.env.OPEN_MEM_ENTITY_EXTRACTION==="true")N.entityExtractionEnabled=!0;return N}function Df(N){let E=`${N}/.open-mem/config.json`;if(!Jf(E))return{};try{let f=Qf(E,"utf-8"),O=JSON.parse(f);if(!O||typeof O!=="object"||Array.isArray(O))return{};return O}catch{return{}}}function Xf(N){switch(N){case"google":return 768;case"openai":return 1536;case"bedrock":return 1024;case"anthropic":return 0;default:return 768}}function V0(N,E){let f=Df(N),O=Wf(),M={...RN,...f,...O,...E};if(!M.dbPath.startsWith("/"))M.dbPath=`${N}/${M.dbPath}`;if(!process.env.OPEN_MEM_PROVIDER&&!E?.provider){if(process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY)M.provider="google";else if(process.env.ANTHROPIC_API_KEY)M.provider="anthropic";else if(process.env.AWS_BEARER_TOKEN_BEDROCK||process.env.AWS_ACCESS_KEY_ID||process.env.AWS_PROFILE)M.provider="bedrock"}if(!M.apiKey)switch(M.provider){case"google":M.apiKey=process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;break;case"anthropic":M.apiKey=process.env.ANTHROPIC_API_KEY;break;case"openai":M.apiKey=process.env.OPENAI_API_KEY;break;case"bedrock":break}if(M.embeddingDimension===void 0)M.embeddingDimension=Xf(M.provider);return M}function LN(N){let E=[],f=N.provider!=="bedrock";if(N.compressionEnabled&&f&&!N.apiKey)E.push("AI compression enabled but no API key found. Get a free Gemini API key at https://aistudio.google.com/apikey and set GOOGLE_GENERATIVE_AI_API_KEY, or set OPEN_MEM_PROVIDER and the appropriate API key for your provider.");if(N.maxContextTokens<500)E.push("maxContextTokens must be at least 500");if(N.batchSize<1)E.push("batchSize must be at least 1");if(N.minOutputLength<0)E.push("minOutputLength must be non-negative");return E}function A1(){return{...RN}}async function YN(N){let E=N.dbPath.substring(0,N.dbPath.lastIndexOf("/")),{mkdir:f}=await import("fs/promises");await f(E,{recursive:!0})}var RN;var $1=s1(()=>{RN={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}});var HN={};dE(HN,{writeProjectConfig:()=>FN,validatePatch:()=>_1,readProjectConfig:()=>b,previewConfig:()=>V1,patchConfig:()=>y0,getEffectiveConfig:()=>l,getConfigSchema:()=>S1});import{existsSync as Uf}from"fs";import{mkdir as Bf,readFile as Kf,writeFile as Zf}from"fs/promises";import{dirname as Rf,join as Lf}from"path";function zN(N){return Lf(N,".open-mem","config.json")}function GN(N){return CN.find((E)=>E.key===N)}function Cf(N,E){let f=GN(N);if(!f)return null;if(f.type==="string"&&typeof E!=="string")return`${String(N)} must be a string`;if(f.type==="number"&&typeof E!=="number")return`${String(N)} must be a number`;if(f.type==="boolean"&&typeof E!=="boolean")return`${String(N)} must be a boolean`;if(f.type==="array"&&!Array.isArray(E))return`${String(N)} must be an array`;if(f.enum&&typeof E==="string"&&!f.enum.includes(E))return`${String(N)} must be one of: ${f.enum.join(", ")}`;if(typeof E==="number"){if(f.min!==void 0&&E<f.min)return`${String(N)} must be >= ${f.min}`;if(f.max!==void 0&&E>f.max)return`${String(N)} must be <= ${f.max}`}return null}function S1(){return CN}async function b(N){let E=zN(N);if(!Uf(E))return{};try{let f=await Kf(E,"utf-8"),O=JSON.parse(f);if(!O||typeof O!=="object"||Array.isArray(O))return{};return O}catch{return{}}}async function FN(N,E){let f=zN(N),M={...await b(N),...E};await Bf(Rf(f),{recursive:!0}),await Zf(f,JSON.stringify(M,null,2),"utf-8")}function _1(N){let E=[];for(let[f,O]of Object.entries(N)){let A=Cf(f,O);if(A)E.push(A)}return E}async function l(N){let E=A1(),f=await b(N),O=V0(N),M=[],A={};for(let[S,$]of Object.entries(E)){let _=S,V=GN(_),Q=(Yf[_]??[]).some((Z)=>typeof process.env[Z]==="string"),W=Object.hasOwn(f,_),D="default";if(W)D="file";if(Q)D="env";if(A[_]={source:D,locked:Q,restartRequired:V?.restartRequired??!1,liveApply:V?.liveApply??!1},D==="env"&&W)M.push(`${String(_)} is overridden by environment variable.`);if(O[_]===void 0&&$!==void 0)M.push(`${String(_)} resolved to undefined unexpectedly.`)}return{config:O,meta:A,warnings:M}}async function V1(N,E){let f=_1(E);if(f.length>0)return{...await l(N),warnings:f};let O=A1(),M=await b(N),A={...O,...M,...E},$={...V0(N,E),...A},_=(await l(N)).meta;return{config:$,meta:_,warnings:[]}}async function y0(N,E){let f=_1(E);if(f.length>0)return{...await l(N),warnings:f};return await FN(N,E),l(N)}var CN,Yf;var J1=s1(()=>{$1();CN=[{key:"dbPath",label:"Database Path",type:"string",group:"Storage",liveApply:!1,restartRequired:!0},{key:"provider",label:"Provider",type:"string",group:"AI",liveApply:!1,restartRequired:!0,enum:["google","anthropic","openai","bedrock"]},{key:"model",label:"Model",type:"string",group:"AI",liveApply:!1,restartRequired:!0},{key:"maxTokensPerCompression",label:"Max Tokens Per Compression",type:"number",group:"AI",liveApply:!0,restartRequired:!1,min:128,max:8192},{key:"compressionEnabled",label:"Compression Enabled",type:"boolean",group:"Behavior",liveApply:!0,restartRequired:!1},{key:"contextInjectionEnabled",label:"Context Injection Enabled",type:"boolean",group:"Behavior",liveApply:!0,restartRequired:!1},{key:"maxContextTokens",label:"Max Context Tokens",type:"number",group:"Behavior",liveApply:!0,restartRequired:!1,min:500,max:64000},{key:"batchSize",label:"Batch Size",type:"number",group:"Behavior",liveApply:!0,restartRequired:!1,min:1,max:100},{key:"batchIntervalMs",label:"Batch Interval (ms)",type:"number",group:"Behavior",liveApply:!0,restartRequired:!1,min:1000,max:300000},{key:"ignoredTools",label:"Ignored Tools",type:"array",group:"Filtering",liveApply:!0,restartRequired:!1},{key:"minOutputLength",label:"Min Output Length",type:"number",group:"Filtering",liveApply:!0,restartRequired:!1,min:0,max:1e4},{key:"maxObservations",label:"Max Observations",type:"number",group:"Progressive Disclosure",liveApply:!0,restartRequired:!1,min:1,max:200},{key:"contextFullObservationCount",label:"Full Observation Count",type:"number",group:"Progressive Disclosure",liveApply:!0,restartRequired:!1,min:0,max:20},{key:"contextShowTokenCosts",label:"Show Token Costs",type:"boolean",group:"Progressive Disclosure",liveApply:!0,restartRequired:!1},{key:"sensitivePatterns",label:"Sensitive Patterns",type:"array",group:"Privacy",liveApply:!0,restartRequired:!1},{key:"retentionDays",label:"Retention Days",type:"number",group:"Data Retention",liveApply:!1,restartRequired:!0,min:0,max:3650},{key:"maxDatabaseSizeMb",label:"Max Database Size (MB)",type:"number",group:"Data Retention",liveApply:!1,restartRequired:!0,min:0,max:1e5},{key:"dashboardEnabled",label:"Dashboard Enabled",type:"boolean",group:"Dashboard",liveApply:!1,restartRequired:!0},{key:"dashboardPort",label:"Dashboard Port",type:"number",group:"Dashboard",liveApply:!1,restartRequired:!0,min:1,max:65535},{key:"platformOpenCodeEnabled",label:"OpenCode Adapter",type:"boolean",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"platformClaudeCodeEnabled",label:"Claude Code Adapter",type:"boolean",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"platformCursorEnabled",label:"Cursor Adapter",type:"boolean",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"mcpCompatibilityMode",label:"MCP Compatibility Mode",type:"string",group:"Advanced",liveApply:!1,restartRequired:!0,enum:["strict","legacy"]},{key:"mcpProtocolVersion",label:"MCP Protocol Version",type:"string",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"mcpSupportedProtocolVersions",label:"MCP Supported Protocols",type:"array",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"rerankingEnabled",label:"Reranking Enabled",type:"boolean",group:"Advanced",liveApply:!0,restartRequired:!1},{key:"entityExtractionEnabled",label:"Entity Extraction Enabled",type:"boolean",group:"Advanced",liveApply:!0,restartRequired:!1},{key:"userMemoryEnabled",label:"User Memory Enabled",type:"boolean",group:"Advanced",liveApply:!1,restartRequired:!0},{key:"userMemoryMaxContextTokens",label:"User Memory Max Context Tokens",type:"number",group:"Advanced",liveApply:!0,restartRequired:!1,min:0,max:8000}],Yf={dbPath:["OPEN_MEM_DB_PATH"],provider:["OPEN_MEM_PROVIDER"],model:["OPEN_MEM_MODEL"],compressionEnabled:["OPEN_MEM_COMPRESSION"],contextInjectionEnabled:["OPEN_MEM_CONTEXT_INJECTION"],maxContextTokens:["OPEN_MEM_MAX_CONTEXT_TOKENS"],ignoredTools:["OPEN_MEM_IGNORED_TOOLS"],batchSize:["OPEN_MEM_BATCH_SIZE"],retentionDays:["OPEN_MEM_RETENTION_DAYS"],contextShowTokenCosts:["OPEN_MEM_CONTEXT_SHOW_TOKEN_COSTS"],contextFullObservationCount:["OPEN_MEM_CONTEXT_FULL_COUNT"],maxObservations:["OPEN_MEM_MAX_OBSERVATIONS"],dashboardEnabled:["OPEN_MEM_DASHBOARD"],dashboardPort:["OPEN_MEM_DASHBOARD_PORT"],platformOpenCodeEnabled:["OPEN_MEM_PLATFORM_OPENCODE"],platformClaudeCodeEnabled:["OPEN_MEM_PLATFORM_CLAUDE_CODE"],platformCursorEnabled:["OPEN_MEM_PLATFORM_CURSOR"],mcpCompatibilityMode:["OPEN_MEM_MCP_COMPAT_MODE"],mcpProtocolVersion:["OPEN_MEM_MCP_PROTOCOL_VERSION"],mcpSupportedProtocolVersions:["OPEN_MEM_MCP_SUPPORTED_PROTOCOLS"],rerankingEnabled:["OPEN_MEM_RERANKING"],userMemoryEnabled:["OPEN_MEM_USER_MEMORY"]}});import{existsSync as WM}from"fs";import{dirname as DM,join as i}from"path";import{fileURLToPath as XM}from"url";import{randomUUID as J0}from"crypto";import{normalize as zf,resolve as Q1,sep as jN}from"path";import{fileURLToPath as Gf}from"url";var t0=(N,E,f)=>{return(O,M)=>{let A=-1;return S(0);async function S($){if($<=A)throw Error("next() called multiple times");A=$;let _,V=!1,J;if(N[$])J=N[$][0][0],O.req.routeIndex=$;else J=$===N.length&&M||void 0;if(J)try{_=await J(O,()=>S($+1))}catch(Q){if(Q instanceof Error&&E)O.error=Q,_=await E(Q,O),V=!0;else throw Q}else if(O.finalized===!1&&f)_=await f(O);if(_&&(O.finalized===!1||V))O.res=_;return O}}};var o1=Symbol();var e1=async(N,E=Object.create(null))=>{let{all:f=!1,dot:O=!1}=E,A=(N instanceof Z0?N.raw.headers:N.headers).get("Content-Type");if(A?.startsWith("multipart/form-data")||A?.startsWith("application/x-www-form-urlencoded"))return aE(N,{all:f,dot:O});return{}};async function aE(N,E){let f=await N.formData();if(f)return tE(f,E);return{}}function tE(N,E){let f=Object.create(null);if(N.forEach((O,M)=>{if(!(E.all||M.endsWith("[]")))f[M]=O;else sE(f,M,O)}),E.dot)Object.entries(f).forEach(([O,M])=>{if(O.includes("."))oE(f,O,M),delete f[O]});return f}var sE=(N,E,f)=>{if(N[E]!==void 0)if(Array.isArray(N[E]))N[E].push(f);else N[E]=[N[E],f];else if(!E.endsWith("[]"))N[E]=f;else N[E]=[f]},oE=(N,E,f)=>{let O=N,M=E.split(".");M.forEach((A,S)=>{if(S===M.length-1)O[A]=f;else{if(!O[A]||typeof O[A]!=="object"||Array.isArray(O[A])||O[A]instanceof File)O[A]=Object.create(null);O=O[A]}})};var o0=(N)=>{let E=N.split("/");if(E[0]==="")E.shift();return E},NN=(N)=>{let{groups:E,path:f}=eE(N),O=o0(f);return Nf(O,E)},eE=(N)=>{let E=[];return N=N.replace(/\{[^}]+\}/g,(f,O)=>{let M=`@${O}`;return E.push([M,f]),M}),{groups:E,path:N}},Nf=(N,E)=>{for(let f=E.length-1;f>=0;f--){let[O]=E[f];for(let M=N.length-1;M>=0;M--)if(N[M].includes(O)){N[M]=N[M].replace(O,E[f][1]);break}}return N},R0={},EN=(N,E)=>{if(N==="*")return"*";let f=N.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(f){let O=`${N}#${E}`;if(!R0[O])if(f[2])R0[O]=E&&E[0]!==":"&&E[0]!=="*"?[O,f[1],new RegExp(`^${f[2]}(?=/${E})`)]:[N,f[1],new RegExp(`^${f[2]}$`)];else R0[O]=[N,f[1],!0];return R0[O]}return null},L0=(N,E)=>{try{return E(N)}catch{return N.replace(/(?:%[0-9A-Fa-f]{2})+/g,(f)=>{try{return E(f)}catch{return f}})}},Ef=(N)=>L0(N,decodeURI),e0=(N)=>{let E=N.url,f=E.indexOf("/",E.indexOf(":")+4),O=f;for(;O<E.length;O++){let M=E.charCodeAt(O);if(M===37){let A=E.indexOf("?",O),S=E.slice(f,A===-1?void 0:A);return Ef(S.includes("%25")?S.replace(/%25/g,"%2525"):S)}else if(M===63)break}return E.slice(f,O)};var fN=(N)=>{let E=e0(N);return E.length>1&&E.at(-1)==="/"?E.slice(0,-1):E},h=(N,E,...f)=>{if(f.length)E=h(E,...f);return`${N?.[0]==="/"?"":"/"}${N}${E==="/"?"":`${N?.at(-1)==="/"?"":"/"}${E?.[0]==="/"?E.slice(1):E}`}`},Y0=(N)=>{if(N.charCodeAt(N.length-1)!==63||!N.includes(":"))return null;let E=N.split("/"),f=[],O="";return E.forEach((M)=>{if(M!==""&&!/\:/.test(M))O+="/"+M;else if(/\:/.test(M))if(/\?/.test(M)){if(f.length===0&&O==="")f.push("/");else f.push(O);let A=M.replace("?","");O+="/"+A,f.push(O)}else O+="/"+M}),f.filter((M,A,S)=>S.indexOf(M)===A)},s0=(N)=>{if(!/[%+]/.test(N))return N;if(N.indexOf("+")!==-1)N=N.replace(/\+/g," ");return N.indexOf("%")!==-1?L0(N,N1):N},ON=(N,E,f)=>{let O;if(!f&&E&&!/[%+]/.test(E)){let S=N.indexOf("?",8);if(S===-1)return;if(!N.startsWith(E,S+1))S=N.indexOf(`&${E}`,S+1);while(S!==-1){let $=N.charCodeAt(S+E.length+1);if($===61){let _=S+E.length+2,V=N.indexOf("&",_);return s0(N.slice(_,V===-1?void 0:V))}else if($==38||isNaN($))return"";S=N.indexOf(`&${E}`,S+1)}if(O=/[%+]/.test(N),!O)return}let M={};O??=/[%+]/.test(N);let A=N.indexOf("?",8);while(A!==-1){let S=N.indexOf("&",A+1),$=N.indexOf("=",A);if($>S&&S!==-1)$=-1;let _=N.slice(A+1,$===-1?S===-1?void 0:S:$);if(O)_=s0(_);if(A=S,_==="")continue;let V;if($===-1)V="";else if(V=N.slice($+1,S===-1?void 0:S),O)V=s0(V);if(f){if(!(M[_]&&Array.isArray(M[_])))M[_]=[];M[_].push(V)}else M[_]??=V}return E?M[E]:M},MN=ON,AN=(N,E)=>{return ON(N,E,!0)},N1=decodeURIComponent;var $N=(N)=>L0(N,N1),Z0=class{raw;#N;#E;routeIndex=0;path;bodyCache={};constructor(N,E="/",f=[[]]){this.raw=N,this.path=E,this.#E=f,this.#N={}}param(N){return N?this.#f(N):this.#A()}#f(N){let E=this.#E[0][this.routeIndex][1][N],f=this.#M(E);return f&&/\%/.test(f)?$N(f):f}#A(){let N={},E=Object.keys(this.#E[0][this.routeIndex][1]);for(let f of E){let O=this.#M(this.#E[0][this.routeIndex][1][f]);if(O!==void 0)N[f]=/\%/.test(O)?$N(O):O}return N}#M(N){return this.#E[1]?this.#E[1][N]:N}query(N){return MN(this.url,N)}queries(N){return AN(this.url,N)}header(N){if(N)return this.raw.headers.get(N)??void 0;let E={};return this.raw.headers.forEach((f,O)=>{E[O]=f}),E}async parseBody(N){return this.bodyCache.parsedBody??=await e1(this,N)}#O=(N)=>{let{bodyCache:E,raw:f}=this,O=E[N];if(O)return O;let M=Object.keys(E)[0];if(M)return E[M].then((A)=>{if(M==="json")A=JSON.stringify(A);return new Response(A)[N]()});return E[N]=f[N]()};json(){return this.#O("text").then((N)=>JSON.parse(N))}text(){return this.#O("text")}arrayBuffer(){return this.#O("arrayBuffer")}blob(){return this.#O("blob")}formData(){return this.#O("formData")}addValidatedData(N,E){this.#N[N]=E}valid(N){return this.#N[N]}get url(){return this.raw.url}get method(){return this.raw.method}get[o1](){return this.#E}get matchedRoutes(){return this.#E[0].map(([[,N]])=>N)}get routePath(){return this.#E[0].map(([[,N]])=>N)[this.routeIndex].path}};var C0={Stringify:1,BeforeStream:2,Stream:3},ff=(N,E)=>{let f=new String(N);return f.isEscaped=!0,f.callbacks=E,f};var M0=async(N,E,f,O,M)=>{if(typeof N==="object"&&!(N instanceof String)){if(!(N instanceof Promise))N=N.toString();if(N instanceof Promise)N=await N}let A=N.callbacks;if(!A?.length)return Promise.resolve(N);if(M)M[0]+=N;else M=[N];let S=Promise.all(A.map(($)=>$({phase:E,buffer:M,context:O}))).then(($)=>Promise.all($.filter(Boolean).map((_)=>M0(_,E,!1,O,M))).then(()=>M[0]));if(f)return ff(await S,A);else return S};var SN="text/plain; charset=UTF-8",E1=(N,E)=>{return{"Content-Type":N,...E}},_N=class{#N;#E;env={};#f;finalized=!1;error;#A;#M;#O;#J;#_;#V;#S;#Q;#W;constructor(N,E){if(this.#N=N,E)this.#M=E.executionCtx,this.env=E.env,this.#V=E.notFoundHandler,this.#W=E.path,this.#Q=E.matchResult}get req(){return this.#E??=new Z0(this.#N,this.#W,this.#Q),this.#E}get event(){if(this.#M&&"respondWith"in this.#M)return this.#M;else throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#M)return this.#M;else throw Error("This context has no ExecutionContext")}get res(){return this.#O||=new Response(null,{headers:this.#S??=new Headers})}set res(N){if(this.#O&&N){N=new Response(N.body,N);for(let[E,f]of this.#O.headers.entries()){if(E==="content-type")continue;if(E==="set-cookie"){let O=this.#O.headers.getSetCookie();N.headers.delete("set-cookie");for(let M of O)N.headers.append("set-cookie",M)}else N.headers.set(E,f)}}this.#O=N,this.finalized=!0}render=(...N)=>{return this.#_??=(E)=>this.html(E),this.#_(...N)};setLayout=(N)=>this.#J=N;getLayout=()=>this.#J;setRenderer=(N)=>{this.#_=N};header=(N,E,f)=>{if(this.finalized)this.#O=new Response(this.#O.body,this.#O);let O=this.#O?this.#O.headers:this.#S??=new Headers;if(E===void 0)O.delete(N);else if(f?.append)O.append(N,E);else O.set(N,E)};status=(N)=>{this.#A=N};set=(N,E)=>{this.#f??=new Map,this.#f.set(N,E)};get=(N)=>{return this.#f?this.#f.get(N):void 0};get var(){if(!this.#f)return{};return Object.fromEntries(this.#f)}#$(N,E,f){let O=this.#O?new Headers(this.#O.headers):this.#S??new Headers;if(typeof E==="object"&&"headers"in E){let A=E.headers instanceof Headers?E.headers:new Headers(E.headers);for(let[S,$]of A)if(S.toLowerCase()==="set-cookie")O.append(S,$);else O.set(S,$)}if(f)for(let[A,S]of Object.entries(f))if(typeof S==="string")O.set(A,S);else{O.delete(A);for(let $ of S)O.append(A,$)}let M=typeof E==="number"?E:E?.status??this.#A;return new Response(N,{status:M,headers:O})}newResponse=(...N)=>this.#$(...N);body=(N,E,f)=>this.#$(N,E,f);text=(N,E,f)=>{return!this.#S&&!this.#A&&!E&&!f&&!this.finalized?new Response(N):this.#$(N,E,E1(SN,f))};json=(N,E,f)=>{return this.#$(JSON.stringify(N),E,E1("application/json",f))};html=(N,E,f)=>{let O=(M)=>this.#$(M,E,E1("text/html; charset=UTF-8",f));return typeof N==="object"?M0(N,C0.Stringify,!1,{}).then(O):O(N)};redirect=(N,E)=>{let f=String(N);return this.header("Location",!/[^\x00-\xFF]/.test(f)?f:encodeURI(f)),this.newResponse(null,E??302)};notFound=()=>{return this.#V??=()=>new Response,this.#V(this)}};var C="ALL",VN="all",JN=["get","post","put","delete","options","patch"],z0="Can not add a route since the matcher is already built.",G0=class extends Error{};var QN="__COMPOSED_HANDLER";var Of=(N)=>{return N.text("404 Not Found",404)},WN=(N,E)=>{if("getResponse"in N){let f=N.getResponse();return E.newResponse(f.body,f)}return console.error(N),E.text("Internal Server Error",500)},DN=class N{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#N="/";routes=[];constructor(E={}){[...JN,VN].forEach((A)=>{this[A]=(S,...$)=>{if(typeof S==="string")this.#N=S;else this.#A(A,this.#N,S);return $.forEach((_)=>{this.#A(A,this.#N,_)}),this}}),this.on=(A,S,...$)=>{for(let _ of[S].flat()){this.#N=_;for(let V of[A].flat())$.map((J)=>{this.#A(V.toUpperCase(),this.#N,J)})}return this},this.use=(A,...S)=>{if(typeof A==="string")this.#N=A;else this.#N="*",S.unshift(A);return S.forEach(($)=>{this.#A(C,this.#N,$)}),this};let{strict:O,...M}=E;Object.assign(this,M),this.getPath=O??!0?E.getPath??e0:fN}#E(){let E=new N({router:this.router,getPath:this.getPath});return E.errorHandler=this.errorHandler,E.#f=this.#f,E.routes=this.routes,E}#f=Of;errorHandler=WN;route(E,f){let O=this.basePath(E);return f.routes.map((M)=>{let A;if(f.errorHandler===WN)A=M.handler;else A=async(S,$)=>(await t0([],f.errorHandler)(S,()=>M.handler(S,$))).res,A[QN]=M.handler;O.#A(M.method,M.path,A)}),this}basePath(E){let f=this.#E();return f._basePath=h(this._basePath,E),f}onError=(E)=>{return this.errorHandler=E,this};notFound=(E)=>{return this.#f=E,this};mount(E,f,O){let M,A;if(O)if(typeof O==="function")A=O;else if(A=O.optionHandler,O.replaceRequest===!1)M=(_)=>_;else M=O.replaceRequest;let S=A?(_)=>{let V=A(_);return Array.isArray(V)?V:[V]}:(_)=>{let V=void 0;try{V=_.executionCtx}catch{}return[_.env,V]};M||=(()=>{let _=h(this._basePath,E),V=_==="/"?0:_.length;return(J)=>{let Q=new URL(J.url);return Q.pathname=Q.pathname.slice(V)||"/",new Request(Q,J)}})();let $=async(_,V)=>{let J=await f(M(_.req.raw),...S(_));if(J)return J;await V()};return this.#A(C,h(E,"*"),$),this}#A(E,f,O){E=E.toUpperCase(),f=h(this._basePath,f);let M={basePath:this._basePath,path:f,method:E,handler:O};this.router.add(E,f,[O,M]),this.routes.push(M)}#M(E,f){if(E instanceof Error)return this.errorHandler(E,f);throw E}#O(E,f,O,M){if(M==="HEAD")return(async()=>new Response(null,await this.#O(E,f,O,"GET")))();let A=this.getPath(E,{env:O}),S=this.router.match(M,A),$=new _N(E,{path:A,matchResult:S,env:O,executionCtx:f,notFoundHandler:this.#f});if(S[0].length===1){let V;try{V=S[0][0][0][0]($,async()=>{$.res=await this.#f($)})}catch(J){return this.#M(J,$)}return V instanceof Promise?V.then((J)=>J||($.finalized?$.res:this.#f($))).catch((J)=>this.#M(J,$)):V??this.#f($)}let _=t0(S[0],this.errorHandler,this.#f);return(async()=>{try{let V=await _($);if(!V.finalized)throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return V.res}catch(V){return this.#M(V,$)}})()}fetch=(E,...f)=>{return this.#O(E,f[1],f[0],E.method)};request=(E,f,O,M)=>{if(E instanceof Request)return this.fetch(f?new Request(E,f):E,O,M);return E=E.toString(),this.fetch(new Request(/^https?:\/\//.test(E)?E:`http://localhost${h("/",E)}`,f),O,M)};fire=()=>{addEventListener("fetch",(E)=>{E.respondWith(this.#O(E.request,E,void 0,E.request.method))})}};var A0=[];function F0(N,E){let f=this.buildAllMatchers(),O=(M,A)=>{let S=f[M]||f[C],$=S[2][A];if($)return $;let _=A.match(S[0]);if(!_)return[[],A0];let V=_.indexOf("",1);return[S[1][V],_]};return this.match=O,O(N,E)}var H0="[^/]+",$0=".*",S0="(?:|/.*)",c=Symbol(),Mf=new Set(".\\+*[^]$()");function Af(N,E){if(N.length===1)return E.length===1?N<E?-1:1:-1;if(E.length===1)return 1;if(N===$0||N===S0)return 1;else if(E===$0||E===S0)return-1;if(N===H0)return 1;else if(E===H0)return-1;return N.length===E.length?N<E?-1:1:E.length-N.length}var XN=class N{#N;#E;#f=Object.create(null);insert(E,f,O,M,A){if(E.length===0){if(this.#N!==void 0)throw c;if(A)return;this.#N=f;return}let[S,...$]=E,_=S==="*"?$.length===0?["","",$0]:["","",H0]:S==="/*"?["","",S0]:S.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),V;if(_){let J=_[1],Q=_[2]||H0;if(J&&_[2]){if(Q===".*")throw c;if(Q=Q.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(Q))throw c}if(V=this.#f[Q],!V){if(Object.keys(this.#f).some((W)=>W!==$0&&W!==S0))throw c;if(A)return;if(V=this.#f[Q]=new N,J!=="")V.#E=M.varIndex++}if(!A&&J!=="")O.push([J,V.#E])}else if(V=this.#f[S],!V){if(Object.keys(this.#f).some((J)=>J.length>1&&J!==$0&&J!==S0))throw c;if(A)return;V=this.#f[S]=new N}V.insert($,f,O,M,A)}buildRegExpStr(){let f=Object.keys(this.#f).sort(Af).map((O)=>{let M=this.#f[O];return(typeof M.#E==="number"?`(${O})@${M.#E}`:Mf.has(O)?`\\${O}`:O)+M.buildRegExpStr()});if(typeof this.#N==="number")f.unshift(`#${this.#N}`);if(f.length===0)return"";if(f.length===1)return f[0];return"(?:"+f.join("|")+")"}};var UN=class{#N={varIndex:0};#E=new XN;insert(N,E,f){let O=[],M=[];for(let S=0;;){let $=!1;if(N=N.replace(/\{[^}]+\}/g,(_)=>{let V=`@\\${S}`;return M[S]=[V,_],S++,$=!0,V}),!$)break}let A=N.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let S=M.length-1;S>=0;S--){let[$]=M[S];for(let _=A.length-1;_>=0;_--)if(A[_].indexOf($)!==-1){A[_]=A[_].replace($,M[S][1]);break}}return this.#E.insert(A,E,O,this.#N,f),O}buildRegExp(){let N=this.#E.buildRegExpStr();if(N==="")return[/^$/,[],[]];let E=0,f=[],O=[];return N=N.replace(/#(\d+)|@(\d+)|\.\*\$/g,(M,A,S)=>{if(A!==void 0)return f[++E]=Number(A),"$()";if(S!==void 0)return O[Number(S)]=++E,"";return""}),[new RegExp(`^${N}`),f,O]}};var $f=[/^$/,[],Object.create(null)],BN=Object.create(null);function KN(N){return BN[N]??=new RegExp(N==="*"?"":`^${N.replace(/\/\*$|([.\\+*[^\]$()])/g,(E,f)=>f?`\\${f}`:"(?:|/.*)")}$`)}function Sf(){BN=Object.create(null)}function _f(N){let E=new UN,f=[];if(N.length===0)return $f;let O=N.map((V)=>[!/\*|\/:/.test(V[0]),...V]).sort(([V,J],[Q,W])=>V?1:Q?-1:J.length-W.length),M=Object.create(null);for(let V=0,J=-1,Q=O.length;V<Q;V++){let[W,D,Z]=O[V];if(W)M[D]=[Z.map(([B])=>[B,Object.create(null)]),A0];else J++;let X;try{X=E.insert(D,J,W)}catch(B){throw B===c?new G0(D):B}if(W)continue;f[J]=Z.map(([B,Y])=>{let y=Object.create(null);Y-=1;for(;Y>=0;Y--){let[G,H]=X[Y];y[G]=H}return[B,y]})}let[A,S,$]=E.buildRegExp();for(let V=0,J=f.length;V<J;V++)for(let Q=0,W=f[V].length;Q<W;Q++){let D=f[V][Q]?.[1];if(!D)continue;let Z=Object.keys(D);for(let X=0,B=Z.length;X<B;X++)D[Z[X]]=$[D[Z[X]]]}let _=[];for(let V in S)_[V]=f[S[V]];return[A,_,M]}function a(N,E){if(!N)return;for(let f of Object.keys(N).sort((O,M)=>M.length-O.length))if(KN(f).test(E))return[...N[f]];return}var j0=class{name="RegExpRouter";#N;#E;constructor(){this.#N={[C]:Object.create(null)},this.#E={[C]:Object.create(null)}}add(N,E,f){let O=this.#N,M=this.#E;if(!O||!M)throw Error(z0);if(!O[N])[O,M].forEach(($)=>{$[N]=Object.create(null),Object.keys($[C]).forEach((_)=>{$[N][_]=[...$[C][_]]})});if(E==="/*")E="*";let A=(E.match(/\/:/g)||[]).length;if(/\*$/.test(E)){let $=KN(E);if(N===C)Object.keys(O).forEach((_)=>{O[_][E]||=a(O[_],E)||a(O[C],E)||[]});else O[N][E]||=a(O[N],E)||a(O[C],E)||[];Object.keys(O).forEach((_)=>{if(N===C||N===_)Object.keys(O[_]).forEach((V)=>{$.test(V)&&O[_][V].push([f,A])})}),Object.keys(M).forEach((_)=>{if(N===C||N===_)Object.keys(M[_]).forEach((V)=>$.test(V)&&M[_][V].push([f,A]))});return}let S=Y0(E)||[E];for(let $=0,_=S.length;$<_;$++){let V=S[$];Object.keys(M).forEach((J)=>{if(N===C||N===J)M[J][V]||=[...a(O[J],V)||a(O[C],V)||[]],M[J][V].push([f,A-_+$+1])})}}match=F0;buildAllMatchers(){let N=Object.create(null);return Object.keys(this.#E).concat(Object.keys(this.#N)).forEach((E)=>{N[E]||=this.#f(E)}),this.#N=this.#E=void 0,Sf(),N}#f(N){let E=[],f=N===C;if([this.#N,this.#E].forEach((O)=>{let M=O[N]?Object.keys(O[N]).map((A)=>[A,O[N][A]]):[];if(M.length!==0)f||=!0,E.push(...M);else if(N!==C)E.push(...Object.keys(O[C]).map((A)=>[A,O[C][A]]))}),!f)return null;else return _f(E)}};var Vf=class{name="PreparedRegExpRouter";#N;#E;constructor(N,E){this.#N=N,this.#E=E}#f(N,E){let f=this.#N[N];f[1].forEach((O)=>O&&O.push(E)),Object.values(f[2]).forEach((O)=>O[0].push(E))}#A(N,E,f,O,M){let A=this.#N[N];if(!M)A[2][E][0].push([f,{}]);else O.forEach((S)=>{if(typeof S==="number")A[1][S].push([f,M]);else A[2][S||E][0].push([f,M])})}add(N,E,f){if(!this.#N[N]){let M=this.#N[C],A={};for(let S in M[2])A[S]=[M[2][S][0].slice(),A0];this.#N[N]=[M[0],M[1].map((S)=>Array.isArray(S)?S.slice():0),A]}if(E==="/*"||E==="*"){let M=[f,{}];if(N===C)for(let A in this.#N)this.#f(A,M);else this.#f(N,M);return}let O=this.#E[E];if(!O)throw Error(`Path ${E} is not registered`);for(let[M,A]of O)if(N===C)for(let S in this.#N)this.#A(S,E,f,M,A);else this.#A(N,E,f,M,A)}buildAllMatchers(){return this.#N}match=F0};var f1=class{name="SmartRouter";#N=[];#E=[];constructor(N){this.#N=N.routers}add(N,E,f){if(!this.#E)throw Error(z0);this.#E.push([N,E,f])}match(N,E){if(!this.#E)throw Error("Fatal error");let f=this.#N,O=this.#E,M=f.length,A=0,S;for(;A<M;A++){let $=f[A];try{for(let _=0,V=O.length;_<V;_++)$.add(...O[_]);S=$.match(N,E)}catch(_){if(_ instanceof G0)continue;throw _}this.match=$.match.bind($),this.#N=[$],this.#E=void 0;break}if(A===M)throw Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,S}get activeRouter(){if(this.#E||this.#N.length!==1)throw Error("No active router has been determined yet.");return this.#N[0]}};var _0=Object.create(null),ZN=class N{#N;#E;#f;#A=0;#M=_0;constructor(E,f,O){if(this.#E=O||Object.create(null),this.#N=[],E&&f){let M=Object.create(null);M[E]={handler:f,possibleKeys:[],score:0},this.#N=[M]}this.#f=[]}insert(E,f,O){this.#A=++this.#A;let M=this,A=NN(f),S=[];for(let $=0,_=A.length;$<_;$++){let V=A[$],J=A[$+1],Q=EN(V,J),W=Array.isArray(Q)?Q[0]:V;if(W in M.#E){if(M=M.#E[W],Q)S.push(Q[1]);continue}if(M.#E[W]=new N,Q)M.#f.push(Q),S.push(Q[1]);M=M.#E[W]}return M.#N.push({[E]:{handler:O,possibleKeys:S.filter(($,_,V)=>V.indexOf($)===_),score:this.#A}}),M}#O(E,f,O,M){let A=[];for(let S=0,$=E.#N.length;S<$;S++){let _=E.#N[S],V=_[f]||_[C],J={};if(V!==void 0){if(V.params=Object.create(null),A.push(V),O!==_0||M&&M!==_0)for(let Q=0,W=V.possibleKeys.length;Q<W;Q++){let D=V.possibleKeys[Q],Z=J[V.score];V.params[D]=M?.[D]&&!Z?M[D]:O[D]??M?.[D],J[V.score]=!0}}}return A}search(E,f){let O=[];this.#M=_0;let A=[this],S=o0(f),$=[];for(let _=0,V=S.length;_<V;_++){let J=S[_],Q=_===V-1,W=[];for(let D=0,Z=A.length;D<Z;D++){let X=A[D],B=X.#E[J];if(B)if(B.#M=X.#M,Q){if(B.#E["*"])O.push(...this.#O(B.#E["*"],E,X.#M));O.push(...this.#O(B,E,X.#M))}else W.push(B);for(let Y=0,y=X.#f.length;Y<y;Y++){let G=X.#f[Y],H=X.#M===_0?{}:{...X.#M};if(G==="*"){let k=X.#E["*"];if(k)O.push(...this.#O(k,E,X.#M)),k.#M=H,W.push(k);continue}let[U0,x,T]=G;if(!J&&!(T instanceof RegExp))continue;let I=X.#E[U0],n0=S.slice(_).join("/");if(T instanceof RegExp){let k=T.exec(n0);if(k){if(H[x]=k[0],O.push(...this.#O(I,E,X.#M,H)),Object.keys(I.#E).length){I.#M=H;let B0=k[0].match(/\//)?.length??0;($[B0]||=[]).push(I)}continue}}if(T===!0||T.test(J))if(H[x]=J,Q){if(O.push(...this.#O(I,E,H,X.#M)),I.#E["*"])O.push(...this.#O(I.#E["*"],E,H,X.#M))}else I.#M=H,W.push(I)}}A=W.concat($.shift()??[])}if(O.length>1)O.sort((_,V)=>{return _.score-V.score});return[O.map(({handler:_,params:V})=>[_,V])]}};var O1=class{name="TrieRouter";#N;constructor(){this.#N=new ZN}add(N,E,f){let O=Y0(E);if(O){for(let M=0,A=O.length;M<A;M++)this.#N.insert(N,O[M],f);return}this.#N.insert(N,E,f)}match(N,E){return this.#N.search(N,E)}};var M1=class extends DN{constructor(N={}){super(N);this.router=N.router??new f1({routers:[new j0,new O1]})}};J1();import{z as U}from"zod";var t=U.enum(["decision","bugfix","feature","refactor","discovery","change"]);function K(N,E={}){return{data:N,error:null,meta:E}}function R(N,E,f){return{data:null,error:{code:N,message:E,details:f},meta:{}}}var F={find:U.object({query:U.string().min(1),scope:U.enum(["project","user","all"]).optional().default("project"),types:U.array(t).optional(),limit:U.number().int().min(1).max(50).optional().default(10),cursor:U.string().optional(),include:U.object({snippets:U.boolean().optional(),scores:U.boolean().optional(),relations:U.boolean().optional()}).optional()}),history:U.object({limit:U.number().int().min(1).max(20).optional().default(5),cursor:U.string().optional(),sessionId:U.string().optional()}),get:U.object({ids:U.array(U.string()).min(1),includeHistory:U.boolean().optional().default(!1),limit:U.number().int().min(1).max(50).optional().default(10)}),create:U.object({title:U.string(),type:t,narrative:U.string(),concepts:U.array(U.string()).optional(),files:U.array(U.string()).optional(),importance:U.number().int().min(1).max(5).optional(),scope:U.enum(["project","user"]).optional().default("project")}),revise:U.object({id:U.string(),title:U.string().optional(),narrative:U.string().optional(),type:t.optional(),concepts:U.array(U.string()).optional(),importance:U.number().int().min(1).max(5).optional(),reason:U.string().optional()}),remove:U.object({id:U.string(),reason:U.string().optional()}),transferExport:U.object({scope:U.enum(["project"]).optional().default("project"),type:t.optional(),limit:U.number().int().min(1).optional(),format:U.enum(["json"]).optional().default("json")}),transferImport:U.object({payload:U.string(),mode:U.enum(["skip","merge","replace"]).optional().default("skip")}),maintenance:U.object({action:U.enum(["folderContextDryRun","folderContextClean","folderContextRebuild","folderContextPurge"])}),help:U.object({})};var Ff=new Set(t.options);function W1(N,E,f=100){if(!N)return E;let O=Number.parseInt(N,10);if(Number.isNaN(O))return E;return Math.max(1,Math.min(O,f))}function Hf(N){if(!N)return 0;let E=Number.parseInt(N,10);if(Number.isNaN(E))return 0;return Math.max(0,E)}function yN(N){if(!N)return;if(Ff.has(N))return N;return}function I0(N){let E={};for(let[f,O]of Object.entries(N)){let M=f.toLowerCase();E[f]=typeof O==="string"&&(M.includes("key")||M.includes("api"))?"***REDACTED***":O}return E}function IN(N){let{projectPath:E,memoryEngine:f,runtimeStatusProvider:O,dashboardDir:M}=N,A=new M1;A.get("/v1/memory/observations",($)=>{let _=W1($.req.query("limit"),50),V=Hf($.req.query("offset")),J=yN($.req.query("type")),Q=$.req.query("sessionId"),W=$.req.query("state"),D=W==="current"||W==="superseded"||W==="tombstoned"?W:void 0,Z=f.listObservations({limit:_,offset:V,type:J,sessionId:Q,state:D});return $.json(K(Z,{limit:_,offset:V}))}),A.post("/v1/memory/observations",async($)=>{try{let _=await $.req.json(),V=await f.save({..._,sessionId:_.sessionId??`http-${Date.now()}`});if(!V)return $.json(R("CONFLICT","Unable to create observation"),409);return $.json(K(V),201)}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),A.get("/v1/memory/observations/:id",($)=>{let _=$.req.param("id"),V=f.getObservation(_);if(!V)return $.json(R("NOT_FOUND","Observation not found"),404);return $.json(K(V))}),A.get("/v1/memory/observations/:id/lineage",($)=>{let _=$.req.param("id"),V=f.getLineage(_);if(!V)return $.json(R("NOT_FOUND","Observation not found"),404);return $.json(K({observationId:_,lineage:V}))}),A.get("/v1/memory/observations/:id/revision-diff",($)=>{let _=$.req.param("id"),V=$.req.query("against");if(!V)return $.json(R("VALIDATION_ERROR","Query parameter 'against' is required"),400);let J=f.getRevisionDiff(_,V);if(!J)return $.json(R("NOT_FOUND","One or both observations not found"),404);if($.req.query("version")==="1")return $.json(K({baseId:J.toId,againstId:J.fromId,changes:J.changedFields}));return $.json(K(J))}),A.post("/v1/memory/observations/:id/revisions",async($)=>{let _=$.req.param("id");try{let V=await $.req.json(),J=await f.update({id:_,...V});if(!J)return $.json(R("NOT_FOUND","Observation not found"),404);return $.json(K({previousId:_,newId:J.id,observation:J}))}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),A.post("/v1/memory/observations/:id/tombstone",async($)=>{let _=$.req.param("id");if(await f.delete([_])===0)return $.json(R("NOT_FOUND","Observation not found"),404);return $.json(K({id:_,tombstoned:!0}))}),A.get("/v1/memory/sessions",($)=>{let _=W1($.req.query("limit"),20),V=$.req.query("projectPath")||E;return $.json(K(f.listSessions({limit:_,projectPath:V}),{limit:_}))}),A.get("/v1/memory/sessions/:id",($)=>{let _=$.req.param("id"),V=f.getSession(_);if(!V)return $.json(R("NOT_FOUND","Session not found"),404);return $.json(K({...V.session,observations:V.observations,summary:V.summary}))}),A.get("/v1/memory/search",async($)=>{let _=$.req.query("q");if(!_)return $.json(R("VALIDATION_ERROR","Query parameter 'q' is required"),400);let V=yN($.req.query("type")),J=W1($.req.query("limit"),20);try{let Q=await f.search(_,{type:V,limit:J});return $.json(K(Q,{limit:J}))}catch{return $.json(K([],{limit:J}))}}),A.post("/v1/memory/recall",async($)=>{try{let _=await $.req.json(),V=await f.recall(_.ids??[],_.limit??10);return $.json(K(V))}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),A.post("/v1/memory/export",async($)=>{try{let _=await $.req.json().catch(()=>({})),V=await f.export("project",{type:_.type,limit:_.limit});return $.json(K(V))}catch(_){return $.json(R("INTERNAL_ERROR",String(_)),500)}}),A.post("/v1/memory/import",async($)=>{try{let _=await $.req.json(),V=_.mode==="replace"?"overwrite":"skip-duplicates",J=await f.import(_.payload,{mode:V});return $.json(K(J))}catch{return $.json(R("VALIDATION_ERROR","Invalid import payload"),400)}}),A.get("/v1/memory/stats",($)=>{return $.json(K(f.stats()))}),A.get("/v1/health",($)=>{let _=f.getHealth(),V=f.getMetrics(),J=O?.(),Q={status:_.status,timestamp:_.timestamp,uptimeMs:process.uptime()*1000,queue:{mode:"in-process",running:!1,processing:!1,pending:0,lastBatchDurationMs:0,lastProcessedAt:null,lastFailedAt:null,lastError:null},batches:{total:0,processedItems:0,failedItems:0,avgDurationMs:0},enqueueCount:0},W=J??Q;return $.json(K({status:W.status,timestamp:W.timestamp,uptimeMs:W.uptimeMs,queue:W.queue,memory:{totalObservations:V.memory.totalObservations,totalSessions:V.memory.totalSessions}}))}),A.get("/v1/metrics",($)=>{let _=f.getHealth(),J=O?.()??{status:_.status,timestamp:_.timestamp,uptimeMs:process.uptime()*1000,queue:{mode:"in-process",running:!1,processing:!1,pending:0,lastBatchDurationMs:0,lastProcessedAt:null,lastFailedAt:null,lastError:null},batches:{total:0,processedItems:0,failedItems:0,avgDurationMs:0},enqueueCount:0};return $.json(K(J))}),A.get("/v1/platforms",($)=>{let _=f.getAdapterStatuses();return $.json(K({platforms:_.map((V)=>({name:V.name,version:V.version,enabled:V.enabled,capabilities:V.capabilities}))}))}),A.get("/v1/adapters/status",($)=>{return $.json(K(f.getAdapterStatuses()))}),A.get("/v1/config/schema",($)=>$.json(K(S1()))),A.get("/v1/config/effective",async($)=>{let _=await l(E);return $.json(K({config:I0(_.config),meta:_.meta,warnings:_.warnings}))}),A.post("/v1/config/preview",async($)=>{try{let _=await $.req.json(),V=await V1(E,_);return $.json(K({config:I0(V.config),meta:V.meta,warnings:V.warnings}))}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),A.patch("/v1/config",async($)=>{let _;try{_=await $.req.json()}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}try{let V=await b(E),J=await y0(E,_),Q={};for(let W of Object.keys(_))if(Object.hasOwn(V,W))Q[W]=V[W];return f.trackConfigAudit({id:J0(),timestamp:new Date().toISOString(),patch:_,previousValues:Q,source:"api"}),$.json(K({config:I0(J.config),meta:J.meta,warnings:J.warnings}))}catch(V){return $.json(R("INTERNAL_ERROR",String(V)),500)}}),A.get("/v1/config/audit",($)=>{return $.json(K(f.getConfigAuditTimeline()))}),A.post("/v1/config/rollback",async($)=>{let _;try{_=await $.req.json()}catch{return $.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}if(!_.eventId)return $.json(R("VALIDATION_ERROR","eventId is required"),400);try{let V=await f.rollbackConfig(_.eventId);if(!V)return $.json(R("NOT_FOUND","Audit event not found"),404);return $.json(K(V))}catch(V){return $.json(R("INTERNAL_ERROR",String(V)),500)}});let S={balanced:{minOutputLength:50,contextFullObservationCount:3,maxObservations:50,batchSize:5},focus:{minOutputLength:120,contextFullObservationCount:2,maxObservations:30,batchSize:3},chill:{minOutputLength:200,contextFullObservationCount:1,maxObservations:15,batchSize:2,compressionEnabled:!1}};if(A.get("/v1/modes",($)=>$.json(K({modes:Object.entries(S).map(([_,V])=>({id:_,patch:V}))}))),A.post("/v1/modes/:id/apply",async($)=>{let _=$.req.param("id"),V=S[_];if(!V)return $.json(R("NOT_FOUND","Unknown mode"),404);try{let J=await b(E),Q=await y0(E,V),W={};for(let D of Object.keys(V))if(Object.hasOwn(J,D))W[D]=J[D];return f.trackConfigAudit({id:J0(),timestamp:new Date().toISOString(),patch:V,previousValues:W,source:"mode"}),$.json(K({applied:_,config:I0(Q.config),meta:Q.meta,warnings:Q.warnings}))}catch(J){return $.json(R("INTERNAL_ERROR",String(J)),500)}}),A.post("/v1/maintenance/folder-context/dry-run",async($)=>{try{let V=(await $.req.json().catch(()=>({}))).action??"clean",J=await f.maintainFolderContext(V,!0);return f.trackMaintenanceResult({id:J0(),timestamp:new Date().toISOString(),action:`folder-context-${V}-dry-run`,dryRun:!0,result:J}),$.json(K(J))}catch(_){return $.json(R("INTERNAL_ERROR",String(_)),500)}}),A.post("/v1/maintenance/folder-context/clean",async($)=>{try{let _=await f.maintainFolderContext("clean",!1);return f.trackMaintenanceResult({id:J0(),timestamp:new Date().toISOString(),action:"folder-context-clean",dryRun:!1,result:_}),$.json(K(_))}catch(_){return $.json(R("INTERNAL_ERROR",String(_)),500)}}),A.post("/v1/maintenance/folder-context/rebuild",async($)=>{try{let _=await f.maintainFolderContext("rebuild",!1);return f.trackMaintenanceResult({id:J0(),timestamp:new Date().toISOString(),action:"folder-context-rebuild",dryRun:!1,result:_}),$.json(K(_))}catch(_){return $.json(R("INTERNAL_ERROR",String(_)),500)}}),A.get("/v1/maintenance/history",($)=>{return $.json(K(f.getMaintenanceHistory()))}),N.sseHandler)A.get("/v1/events",N.sseHandler);return A.get("*",async($)=>{let _=$.req.path;if(_.startsWith("/v1/"))return $.json(R("NOT_FOUND","Not found"),404);let V=M??Q1(Gf(import.meta.url),"../../dist/dashboard"),J=zf(V),Q=J.endsWith(jN)?J:`${J}${jN}`,W=_==="/"?"index.html":_.replace(/^\//,""),D=Q1(V,W);if(!D.startsWith(Q))return $.json(R("NOT_FOUND","Not found"),404);try{let X=Bun.file(D);if(await X.exists())return new Response(X)}catch{}let Z=Q1(V,"index.html");if(!Z.startsWith(Q))return $.json(R("NOT_FOUND","Not found"),404);try{let X=Bun.file(Z);if(await X.exists())return new Response(X,{headers:{"Content-Type":"text/html; charset=utf-8"}})}catch{}return $.json(R("NOT_FOUND","Dashboard not found. Run the dashboard build first."),404)}),A}var D1=class{writer;encoder;writable;abortSubscribers=[];responseReadable;aborted=!1;closed=!1;constructor(N,E){this.writable=N,this.writer=N.getWriter(),this.encoder=new TextEncoder;let f=E.getReader();this.abortSubscribers.push(async()=>{await f.cancel()}),this.responseReadable=new ReadableStream({async pull(O){let{done:M,value:A}=await f.read();M?O.close():O.enqueue(A)},cancel:()=>{this.abort()}})}async write(N){try{if(typeof N==="string")N=this.encoder.encode(N);await this.writer.write(N)}catch{}return this}async writeln(N){return await this.write(N+`
3
+ `),this}sleep(N){return new Promise((E)=>setTimeout(E,N))}async close(){try{await this.writer.close()}catch{}this.closed=!0}async pipe(N){this.writer.releaseLock(),await N.pipeTo(this.writable,{preventClose:!0}),this.writer=this.writable.getWriter()}onAbort(N){this.abortSubscribers.push(N)}abort(){if(!this.aborted)this.aborted=!0,this.abortSubscribers.forEach((N)=>N())}};var T0=()=>{let N=typeof Bun<"u"?Bun.version:void 0;if(N===void 0)return!1;let E=N.startsWith("1.1")||N.startsWith("1.0")||N.startsWith("0.");return T0=()=>E,E};var TN=class extends D1{constructor(N,E){super(N,E)}async writeSSE(N){let f=(await M0(N.data,C0.Stringify,!1,{})).split(/\r\n|\r|\n/).map((M)=>{return`data: ${M}`}).join(`
4
+ `),O=[N.event&&`event: ${N.event}`,f,N.id&&`id: ${N.id}`,N.retry&&`retry: ${N.retry}`].filter(Boolean).join(`
5
5
  `)+`
6
6
 
7
- `;await this.write(E)}},BO=async(f,N,O)=>{try{await N(f)}catch(E){if(E instanceof Error&&O)await O(E,f),await f.writeSSE({event:"error",data:E.message});else console.error(E)}finally{f.close()}},KO=new WeakMap,W1=(f,N,O)=>{let{readable:E,writable:M}=new TransformStream,A=new Cf(M,E);if(y0())f.req.raw.signal.addEventListener("abort",()=>{if(!A.closed)A.abort()});return KO.set(A.responseReadable,f),f.header("Transfer-Encoding","chunked"),f.header("Content-Type","text/event-stream"),f.header("Cache-Control","no-cache"),f.header("Connection","keep-alive"),BO(A,N,O),f.newResponse(A.responseReadable)};class D1{eventBus;clients=new Set;cleanups=[];constructor(f){this.eventBus=f;this.subscribeToAll()}addClient(f){this.clients.add(f)}removeClient(f){this.clients.delete(f)}get clientCount(){return this.clients.size}destroy(){for(let f of this.cleanups)f();this.cleanups=[],this.clients.clear()}subscribeToAll(){let f=["observation:created","observation:updated","session:started","session:ended","summary:created","pending:enqueued","pending:processed"];for(let N of f){let O=(E)=>this.broadcast(N,E);this.eventBus.on(N,O),this.cleanups.push(()=>this.eventBus.off(N,O))}}broadcast(f,N){let O=JSON.stringify(N);for(let E of this.clients)try{let M=E(f,O);if(M&&typeof M.catch==="function")M.catch(()=>this.clients.delete(E))}catch{this.clients.delete(E)}}}var ZO=30000;function zf(f){return(N)=>{return W1(N,async(O)=>{let E=(A,S)=>{O.writeSSE({event:A,data:S,id:Date.now().toString()})};f.addClient(E);let M=setInterval(()=>{O.writeSSE({event:"heartbeat",data:"",id:Date.now().toString()})},ZO);O.onAbort(()=>{f.removeClient(E),clearInterval(M)});while(!O.aborted)await O.sleep(1000)})}}function z(f){return JSON.stringify(f,null,2)}function LO(f,N){return f.filter((O)=>N==="all"?!0:N==="user"?O.source==="user":O.source!=="user").map((O)=>({id:O.observation.id,title:O.observation.title,type:O.observation.type,summary:O.observation.narrative,snippet:O.snippet,score:O.rank,source:O.source??"project",createdAt:O.observation.createdAt}))}function Ff(f){return{"mem-find":{description:"Find relevant memories by query with optional filtering.",args:j.find.shape,execute:async(N)=>{try{let O=j.find.parse(N),E=await f.search(O.query,{limit:O.limit,type:O.types?.[0]}),M=B({results:LO(E,O.scope),nextCursor:null});return z(M)}catch(O){return z(R("VALIDATION_ERROR","Invalid find arguments",String(O)))}}},"mem-history":{description:"Browse session history and summaries.",args:j.history.shape,execute:async(N)=>{try{let O=j.history.parse(N),E=await f.timeline({limit:O.limit,sessionId:O.sessionId});return z(B({items:E,nextCursor:null}))}catch(O){return z(R("VALIDATION_ERROR","Invalid history arguments",String(O)))}}},"mem-get":{description:"Get full memory records by ID.",args:j.get.shape,execute:async(N)=>{try{let O=j.get.parse(N),E=await f.recall(O.ids,O.limit);return z(B({observations:E}))}catch(O){return z(R("VALIDATION_ERROR","Invalid get arguments",String(O)))}}},"mem-create":{description:"Create a memory record.",args:j.create.shape,execute:async(N,O)=>{try{let E=j.create.parse(N),M=await f.save({...E,sessionId:O.sessionID});if(!M)return z(R("CONFLICT","Unable to create memory"));return z(B({observation:M}))}catch(E){return z(R("VALIDATION_ERROR","Invalid create arguments",String(E)))}}},"mem-revise":{description:"Create a new revision for an existing memory.",args:j.revise.shape,execute:async(N)=>{try{let O=j.revise.parse(N),E=await f.update(O);if(!E)return z(R("NOT_FOUND",`Observation ${O.id} not found`));return z(B({previousId:O.id,newId:E.id,observation:E}))}catch(O){return z(R("VALIDATION_ERROR","Invalid revise arguments",String(O)))}}},"mem-remove":{description:"Tombstone a memory record.",args:j.remove.shape,execute:async(N)=>{try{let O=j.remove.parse(N);if(await f.delete([O.id])===0)return z(R("NOT_FOUND",`Observation ${O.id} not found`));return z(B({id:O.id,tombstoned:!0}))}catch(O){return z(R("VALIDATION_ERROR","Invalid remove arguments",String(O)))}}},"mem-export":{description:"Export project memory as JSON payload.",args:j.transferExport.shape,execute:async(N)=>{try{let O=j.transferExport.parse(N),E=await f.export("project",{type:O.type,limit:O.limit});return z(B({payload:E,format:O.format}))}catch(O){return z(R("VALIDATION_ERROR","Invalid export arguments",String(O)))}}},"mem-import":{description:"Import memory payload.",args:j.transferImport.shape,execute:async(N)=>{try{let O=j.transferImport.parse(N),E=O.mode==="replace"?"overwrite":"skip-duplicates",M=await f.import(O.payload,{mode:E});return z(B({imported:M.imported,skipped:M.skipped,mode:O.mode}))}catch(O){return z(R("VALIDATION_ERROR","Invalid import arguments",String(O)))}}},"mem-maintenance":{description:"Run memory maintenance actions.",args:j.maintenance.shape,execute:async(N)=>{try{let O=j.maintenance.parse(N);if(O.action==="folderContextDryRun")return z(B(await f.maintainFolderContext("clean",!0)));if(O.action==="folderContextClean")return z(B(await f.maintainFolderContext("clean",!1)));return z(B(await f.maintainFolderContext("rebuild",!1)))}catch(O){return z(R("VALIDATION_ERROR","Invalid maintenance arguments",String(O)))}}},"mem-help":{description:"Show memory workflow guidance.",args:j.help.shape,execute:async()=>z(B({guide:f.guide()}))}}}import{generateText as HO}from"ai";var UO=new Set(["decision","bugfix","feature","refactor","discovery","change"]);function U(f,N){let O=new RegExp(`<${N}[^>]*>([\\s\\S]*?)</${N}>`,"i"),E=f.match(O);return E?E[1].trim():""}function w(f,N){let O=new RegExp(`<${N}[^>]*>([\\s\\S]*?)</${N}>`,"gi"),E=[];for(let M of f.matchAll(O)){let A=M[1].trim();if(A)E.push(A)}return E}function jf(f){let N=U(f,"observation");if(!N)return null;let O=U(N,"type").toLowerCase(),E=UO.has(O)?O:"discovery",M=U(N,"title")||"Untitled observation",A=U(N,"subtitle"),S=U(N,"narrative"),$=w(U(N,"facts"),"fact"),_=w(U(N,"concepts"),"concept"),V=w(U(N,"files_read"),"file"),J=w(U(N,"files_modified"),"file"),Q=U(N,"importance"),W=Number.parseInt(Q,10),D=Number.isNaN(W)?3:Math.max(1,Math.min(5,W));return{type:E,title:M,subtitle:A,facts:$,narrative:S,concepts:_,filesRead:V,filesModified:J,importance:D}}function Gf(f){let N=U(f,"session_summary");if(!N)return null;let O=U(N,"summary")||"No summary available",E=w(U(N,"key_decisions"),"decision"),M=w(U(N,"files_modified"),"file"),A=w(U(N,"concepts"),"concept"),S=U(N,"request")||void 0,$=U(N,"investigated")||void 0,_=U(N,"learned")||void 0,V=U(N,"completed")||void 0,J=U(N,"next_steps")||void 0;return{summary:O,keyDecisions:E,filesModified:M,concepts:A,request:S,investigated:$,learned:_,completed:V,nextSteps:J}}function Hf(f){let N=U(f,"reranked");if(!N)return null;let O=w(N,"index");if(O.length===0)return null;let E=[];for(let M of O){let A=Number.parseInt(M,10);if(Number.isNaN(A)||A<0)return null;E.push(A)}return E}var YO=new Set(["new_fact","update","duplicate"]);function yf(f){let N=U(f,"evaluation");if(!N)return null;let O=U(N,"outcome").toLowerCase().trim();if(!YO.has(O))return null;let E=O,M=U(N,"reason");if(!M)return null;let A=U(N,"supersedes"),S={outcome:E,reason:M};if(E==="update"&&A)S.supersedesId=A;if(E==="update"&&!S.supersedesId)return null;return S}var CO=new Set(["technology","library","pattern","concept","file","person","project","other"]),zO=new Set(["uses","depends_on","implements","extends","related_to","replaces","configures"]);function If(f){let N=U(f,"extraction");if(!N)return null;let O=U(N,"entities"),E=U(N,"relations"),M=w(O,"entity"),A=[];for(let _ of M){let V=U(_,"name");if(!V)continue;let J=U(_,"type").toLowerCase(),Q=CO.has(J)?J:"other";A.push({name:V,entityType:Q})}let S=w(E,"relation"),$=[];for(let _ of S){let V=U(_,"source"),J=U(_,"target"),Q=U(_,"relationship").toLowerCase();if(!V||!J||!Q)continue;if(!zO.has(Q))continue;$.push({sourceName:V,targetName:J,relationship:Q})}return{entities:A,relations:$}}function H(f){return Math.ceil(f.length/4)}function Tf(f,N,O){let E=O?`<session_context>
8
- ${O}
7
+ `;await this.write(O)}},jf=async(N,E,f)=>{try{await E(N)}catch(O){if(O instanceof Error&&f)await f(O,N),await N.writeSSE({event:"error",data:O.message});else console.error(O)}finally{N.close()}},yf=new WeakMap,X1=(N,E,f)=>{let{readable:O,writable:M}=new TransformStream,A=new TN(M,O);if(T0())N.req.raw.signal.addEventListener("abort",()=>{if(!A.closed)A.abort()});return yf.set(A.responseReadable,N),N.header("Transfer-Encoding","chunked"),N.header("Content-Type","text/event-stream"),N.header("Cache-Control","no-cache"),N.header("Connection","keep-alive"),jf(A,E,f),N.newResponse(A.responseReadable)};class U1{eventBus;clients=new Set;cleanups=[];constructor(N){this.eventBus=N;this.subscribeToAll()}addClient(N){this.clients.add(N)}removeClient(N){this.clients.delete(N)}get clientCount(){return this.clients.size}destroy(){for(let N of this.cleanups)N();this.cleanups=[],this.clients.clear()}subscribeToAll(){let N=["observation:created","observation:updated","session:started","session:ended","summary:created","pending:enqueued","pending:processed"];for(let E of N){let f=(O)=>this.broadcast(E,O);this.eventBus.on(E,f),this.cleanups.push(()=>this.eventBus.off(E,f))}}broadcast(N,E){let f=JSON.stringify(E);for(let O of this.clients)try{let M=O(N,f);if(M&&typeof M.catch==="function")M.catch(()=>this.clients.delete(O))}catch{this.clients.delete(O)}}}var Tf=30000;function kN(N){return(E)=>{return X1(E,async(f)=>{let O=(A,S)=>{f.writeSSE({event:A,data:S,id:Date.now().toString()})};N.addClient(O);let M=setInterval(()=>{f.writeSSE({event:"heartbeat",data:"",id:Date.now().toString()})},Tf);f.onAbort(()=>{N.removeClient(O),clearInterval(M)});while(!f.aborted)await f.sleep(1000)})}}function z(N){return JSON.stringify(N,null,2)}function kf(N,E){return N.filter((f)=>E==="all"?!0:E==="user"?f.source==="user":f.source!=="user").map((f)=>({id:f.observation.id,title:f.observation.title,type:f.observation.type,summary:f.observation.narrative,snippet:f.snippet,score:f.rank,source:f.source??"project",createdAt:f.observation.createdAt}))}function wN(N){return{"mem-find":{description:"Search past memories \u2014 decisions, discoveries, gotchas, and session history. Use to recall context from previous sessions before starting work.",args:F.find.shape,execute:async(E)=>{try{let f=F.find.parse(E),O=await N.search(f.query,{limit:f.limit,type:f.types?.[0]}),M=K({results:kf(O,f.scope),nextCursor:null});return z(M)}catch(f){return z(R("VALIDATION_ERROR","Invalid find arguments",String(f)))}}},"mem-history":{description:"Browse session timeline and summaries. Use to understand what happened in recent sessions or drill into a specific session.",args:F.history.shape,execute:async(E)=>{try{let f=F.history.parse(E),O=await N.timeline({limit:f.limit,sessionId:f.sessionId});return z(K({items:O,nextCursor:null}))}catch(f){return z(R("VALIDATION_ERROR","Invalid history arguments",String(f)))}}},"mem-get":{description:"Fetch full memory details by ID. Use after mem-find or mem-history to get complete narratives, facts, and file lists.",args:F.get.shape,execute:async(E)=>{try{let f=F.get.parse(E),O=await N.recall(f.ids,f.limit);return z(K({observations:O}))}catch(f){return z(R("VALIDATION_ERROR","Invalid get arguments",String(f)))}}},"mem-create":{description:"Save an important observation to memory. Use for decisions + rationale, non-obvious gotchas, user preferences, or cross-session plans that auto-capture wouldn't understand the significance of.",args:F.create.shape,execute:async(E,f)=>{try{let O=F.create.parse(E),M=await N.save({...O,sessionId:f.sessionID});if(!M)return z(R("CONFLICT","Unable to create memory"));return z(K({observation:M}))}catch(O){return z(R("VALIDATION_ERROR","Invalid create arguments",String(O)))}}},"mem-revise":{description:"Update an existing memory with a new revision. Use when a previous decision changed, a gotcha was resolved, or information became outdated.",args:F.revise.shape,execute:async(E)=>{try{let f=F.revise.parse(E),O=await N.update(f);if(!O)return z(R("NOT_FOUND",`Observation ${f.id} not found`));return z(K({previousId:f.id,newId:O.id,observation:O}))}catch(f){return z(R("VALIDATION_ERROR","Invalid revise arguments",String(f)))}}},"mem-remove":{description:"Tombstone an obsolete or incorrect memory. Use to clean up memories that are no longer accurate or relevant.",args:F.remove.shape,execute:async(E)=>{try{let f=F.remove.parse(E);if(await N.delete([f.id])===0)return z(R("NOT_FOUND",`Observation ${f.id} not found`));return z(K({id:f.id,tombstoned:!0}))}catch(f){return z(R("VALIDATION_ERROR","Invalid remove arguments",String(f)))}}},"mem-export":{description:"Export project memories as portable JSON for backup or transfer between machines.",args:F.transferExport.shape,execute:async(E)=>{try{let f=F.transferExport.parse(E),O=await N.export("project",{type:f.type,limit:f.limit});return z(K({payload:O,format:f.format}))}catch(f){return z(R("VALIDATION_ERROR","Invalid export arguments",String(f)))}}},"mem-import":{description:"Import memories from a JSON export. Skips duplicates by default.",args:F.transferImport.shape,execute:async(E)=>{try{let f=F.transferImport.parse(E),O=f.mode==="replace"?"overwrite":"skip-duplicates",M=await N.import(f.payload,{mode:O});return z(K({imported:M.imported,skipped:M.skipped,mode:f.mode}))}catch(f){return z(R("VALIDATION_ERROR","Invalid import arguments",String(f)))}}},"mem-maintenance":{description:"Run folder context maintenance \u2014 clean, rebuild, purge, or dry-run AGENTS.md files.",args:F.maintenance.shape,execute:async(E)=>{try{let f=F.maintenance.parse(E);if(f.action==="folderContextDryRun")return z(K(await N.maintainFolderContext("clean",!0)));if(f.action==="folderContextClean")return z(K(await N.maintainFolderContext("clean",!1)));if(f.action==="folderContextPurge")return z(K(await N.maintainFolderContext("purge",!1)));return z(K(await N.maintainFolderContext("rebuild",!1)))}catch(f){return z(R("VALIDATION_ERROR","Invalid maintenance arguments",String(f)))}}},"mem-help":{description:"Show detailed memory workflow guidance including when to save, what to save, and memory type reference.",args:F.help.shape,execute:async()=>z(K({guide:N.guide()}))}}}import{generateText as mf}from"ai";var wf=new Set(["decision","bugfix","feature","refactor","discovery","change"]);function L(N,E){let f=new RegExp(`<${E}[^>]*>([\\s\\S]*?)</${E}>`,"i"),O=N.match(f);return O?O[1].trim():""}function P(N,E){let f=new RegExp(`<${E}[^>]*>([\\s\\S]*?)</${E}>`,"gi"),O=[];for(let M of N.matchAll(f)){let A=M[1].trim();if(A)O.push(A)}return O}function PN(N){let E=L(N,"observation");if(!E)return null;let f=L(E,"type").toLowerCase(),O=wf.has(f)?f:"discovery",M=L(E,"title")||"Untitled observation",A=L(E,"subtitle"),S=L(E,"narrative"),$=P(L(E,"facts"),"fact"),_=P(L(E,"concepts"),"concept"),V=P(L(E,"files_read"),"file"),J=P(L(E,"files_modified"),"file"),Q=L(E,"importance"),W=Number.parseInt(Q,10),D=Number.isNaN(W)?3:Math.max(1,Math.min(5,W));return{type:O,title:M,subtitle:A,facts:$,narrative:S,concepts:_,filesRead:V,filesModified:J,importance:D}}function qN(N){let E=L(N,"session_summary");if(!E)return null;let f=L(E,"summary")||"No summary available",O=P(L(E,"key_decisions"),"decision"),M=P(L(E,"files_modified"),"file"),A=P(L(E,"concepts"),"concept"),S=L(E,"request")||void 0,$=L(E,"investigated")||void 0,_=L(E,"learned")||void 0,V=L(E,"completed")||void 0,J=L(E,"next_steps")||void 0;return{summary:f,keyDecisions:O,filesModified:M,concepts:A,request:S,investigated:$,learned:_,completed:V,nextSteps:J}}function vN(N){let E=L(N,"reranked");if(!E)return null;let f=P(E,"index");if(f.length===0)return null;let O=[];for(let M of f){let A=Number.parseInt(M,10);if(Number.isNaN(A)||A<0)return null;O.push(A)}return O}var Pf=new Set(["new_fact","update","duplicate"]);function xN(N){let E=L(N,"evaluation");if(!E)return null;let f=L(E,"outcome").toLowerCase().trim();if(!Pf.has(f))return null;let O=f,M=L(E,"reason");if(!M)return null;let A=L(E,"supersedes"),S={outcome:O,reason:M};if(O==="update"&&A)S.supersedesId=A;if(O==="update"&&!S.supersedesId)return null;return S}var qf=new Set(["technology","library","pattern","concept","file","person","project","other"]),vf=new Set(["uses","depends_on","implements","extends","related_to","replaces","configures"]);function uN(N){let E=L(N,"extraction");if(!E)return null;let f=L(E,"entities"),O=L(E,"relations"),M=P(f,"entity"),A=[];for(let _ of M){let V=L(_,"name");if(!V)continue;let J=L(_,"type").toLowerCase(),Q=qf.has(J)?J:"other";A.push({name:V,entityType:Q})}let S=P(O,"relation"),$=[];for(let _ of S){let V=L(_,"source"),J=L(_,"target"),Q=L(_,"relationship").toLowerCase();if(!V||!J||!Q)continue;if(!vf.has(Q))continue;$.push({sourceName:V,targetName:J,relationship:Q})}return{entities:A,relations:$}}function j(N){return Math.ceil(N.length/4)}function gN(N,E,f){let O=f?`<session_context>
8
+ ${f}
9
9
  </session_context>
10
10
 
11
11
  `:"";return`<task>
12
12
  Analyze the following tool output and extract a structured observation.
13
13
  </task>
14
14
 
15
- <tool_name>${f}</tool_name>
15
+ <tool_name>${N}</tool_name>
16
16
 
17
17
  <tool_output>
18
- ${N}
18
+ ${E}
19
19
  </tool_output>
20
20
 
21
- ${E}<instructions>
21
+ ${O}<instructions>
22
22
  Extract a structured observation from the tool output. Determine the most appropriate type and provide a concise but informative summary.
23
23
 
24
24
  When extracting concepts, prefer established vocabulary where appropriate:
@@ -53,18 +53,18 @@ Respond with EXACTLY this XML format:
53
53
  <file>path/to/file/modified</file>
54
54
  </files_modified>
55
55
  </observation>
56
- </instructions>`}function kf(f,N){let O=f.map((E,M)=>` <obs index="${M+1}" type="${E.type}">
57
- <title>${E.title}</title>
58
- <narrative>${E.narrative}</narrative>
56
+ </instructions>`}function mN(N,E){let f=N.map((O,M)=>` <obs index="${M+1}" type="${O.type}">
57
+ <title>${O.title}</title>
58
+ <narrative>${O.narrative}</narrative>
59
59
  </obs>`).join(`
60
60
  `);return`<task>
61
61
  Summarize the following coding session based on its observations.
62
62
  </task>
63
63
 
64
- <session_id>${N}</session_id>
64
+ <session_id>${E}</session_id>
65
65
 
66
66
  <observations>
67
- ${O}
67
+ ${f}
68
68
  </observations>
69
69
 
70
70
  <instructions>
@@ -88,21 +88,21 @@ Respond with EXACTLY this XML format:
88
88
  <concept>key-concept</concept>
89
89
  </concepts>
90
90
  </session_summary>
91
- </instructions>`}function Pf(f,N){let O=N.map((E)=>` <candidate id="${E.id}">
92
- <title>${E.title}</title>
93
- <narrative>${E.narrative}</narrative>
94
- <concepts>${E.concepts.join(", ")}</concepts>
95
- <type>${E.type}</type>
91
+ </instructions>`}function hN(N,E){let f=E.map((O)=>` <candidate id="${O.id}">
92
+ <title>${O.title}</title>
93
+ <narrative>${O.narrative}</narrative>
94
+ <concepts>${O.concepts.join(", ")}</concepts>
95
+ <type>${O.type}</type>
96
96
  </candidate>`).join(`
97
97
  `);return`<conflict_evaluation>
98
98
  <new_observation>
99
- <title>${f.title}</title>
100
- <narrative>${f.narrative}</narrative>
101
- <concepts>${f.concepts.join(", ")}</concepts>
102
- <type>${f.type}</type>
99
+ <title>${N.title}</title>
100
+ <narrative>${N.narrative}</narrative>
101
+ <concepts>${N.concepts.join(", ")}</concepts>
102
+ <type>${N.type}</type>
103
103
  </new_observation>
104
104
  <existing_candidates>
105
- ${O}
105
+ ${f}
106
106
  </existing_candidates>
107
107
  <instructions>
108
108
  Evaluate whether the new observation represents:
@@ -117,16 +117,16 @@ Respond with EXACTLY this XML format:
117
117
  <reason>Brief explanation</reason>
118
118
  </evaluation>
119
119
  </instructions>
120
- </conflict_evaluation>`}function wf(f){let N=[...f.filesRead,...f.filesModified];return`<entity_extraction>
120
+ </conflict_evaluation>`}function cN(N){let E=[...N.filesRead,...N.filesModified];return`<entity_extraction>
121
121
  <observation>
122
- <title>${f.title}</title>
123
- <type>${f.type}</type>
124
- <narrative>${f.narrative}</narrative>
125
- <facts>${f.facts.join(`
122
+ <title>${N.title}</title>
123
+ <type>${N.type}</type>
124
+ <narrative>${N.narrative}</narrative>
125
+ <facts>${N.facts.join(`
126
126
  `)}</facts>
127
- <files>${N.join(`
127
+ <files>${E.join(`
128
128
  `)}</files>
129
- <concepts>${f.concepts.join(", ")}</concepts>
129
+ <concepts>${N.concepts.join(", ")}</concepts>
130
130
  </observation>
131
131
  <instructions>
132
132
  Extract entities and relationships from this observation.
@@ -146,11 +146,11 @@ Respond with EXACTLY this XML format:
146
146
  </relations>
147
147
  </extraction>
148
148
  </instructions>
149
- </entity_extraction>`}function qf(f,N){let O=N.map((E,M)=>` <candidate index="${M}"><title>${E.title}</title><narrative>${E.narrative}</narrative></candidate>`).join(`
149
+ </entity_extraction>`}function lN(N,E){let f=E.map((O,M)=>` <candidate index="${M}"><title>${O.title}</title><narrative>${O.narrative}</narrative></candidate>`).join(`
150
150
  `);return`<rerank_request>
151
- <query>${f}</query>
151
+ <query>${N}</query>
152
152
  <candidates>
153
- ${O}
153
+ ${f}
154
154
  </candidates>
155
155
  <instructions>Reorder the candidates by relevance to the query. Return indices from most to least relevant.
156
156
 
@@ -161,120 +161,121 @@ Respond with EXACTLY this XML format:
161
161
  <index>0</index>
162
162
  </reranked>
163
163
  </instructions>
164
- </rerank_request>`}var FO={"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 jO(f){if(f.includes("."))return f;return FO[f]||`us.anthropic.${f}-v1:0`}function q(f){switch(f.provider){case"anthropic":{let{createAnthropic:N}=u("@ai-sdk/anthropic");return N({apiKey:f.apiKey})(f.model)}case"bedrock":{let{createAmazonBedrock:N}=u("@ai-sdk/amazon-bedrock");return N()(jO(f.model))}case"openai":{let{createOpenAI:N}=u("@ai-sdk/openai");return N({apiKey:f.apiKey})(f.model)}case"google":{let{createGoogleGenerativeAI:N}=u("@ai-sdk/google");return N({apiKey:f.apiKey})(f.model)}default:throw Error(`Unknown provider: ${f.provider}. Supported: anthropic, bedrock, openai, google`)}}function vf(f){try{switch(f.provider){case"google":{let{createGoogleGenerativeAI:N}=u("@ai-sdk/google");return N({apiKey:f.apiKey}).embedding("text-embedding-004")}case"openai":{let{createOpenAI:N}=u("@ai-sdk/openai");return N({apiKey:f.apiKey}).embedding("text-embedding-3-small")}case"bedrock":{let{createAmazonBedrock:N}=u("@ai-sdk/amazon-bedrock");return N().embedding("amazon.titan-embed-text-v2:0")}case"anthropic":return null;default:return null}}catch{return null}}var GO={"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},xf=0;async function v(f,N){if(!N)return;let O=GO[f]||5,E=Math.ceil(60000/O)+100,A=Date.now()-xf;if(A<E){let S=E-A;await new Promise(($)=>setTimeout($,S))}xf=Date.now()}class J0{model;config;_generate=HO;constructor(f){this.config=f,this.model=null;let N=f.provider!=="bedrock";if(f.compressionEnabled&&(!N||f.apiKey))try{this.model=q({provider:f.provider,model:f.model,apiKey:f.apiKey})}catch{}}static MAX_INPUT_LENGTH=50000;async compress(f,N,O){if(!this.config.compressionEnabled||!this.model)return null;if(N.length<this.config.minOutputLength)return null;let E=H(N),M=N.length>J0.MAX_INPUT_LENGTH?`${N.substring(0,J0.MAX_INPUT_LENGTH)}
165
-
166
- [... truncated ...]`:N,A=Tf(f,M,O),S=2;for(let $=0;$<=S;$++)try{if(this.config.provider==="google")await v(this.config.model,this.config.rateLimitingEnabled);let{text:_}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:A}),V=jf(_);if(V)V.discoveryTokens=E;return V}catch(_){if(kO(_)&&$<S){let V=2**$*1000;await gf(V);continue}return null}return null}async compressBatch(f){let N=new Map;for(let O=0;O<f.length;O++){let E=f[O],M=await this.compress(E.toolName,E.toolOutput,E.sessionContext);if(N.set(E.callId,M),O<f.length-1)await gf(200)}return N}createFallbackObservation(f,N){let O=TO(N),E=yO[f]??"discovery";return{type:E,title:`${f} execution`,subtitle:N.substring(0,100).replace(/\n/g," "),facts:[],narrative:`Tool ${f} was executed. Output length: ${N.length} chars.`,concepts:[],filesRead:E==="discovery"?O:[],filesModified:E==="change"?O:[],discoveryTokens:H(N),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 yO={Read:"discovery",Write:"change",Edit:"change",Bash:"change",Glob:"discovery",Grep:"discovery"},IO=/(?:^|\s)((?:\.\/|\/|src\/|tests\/|lib\/)\S+\.\w+)/gm;function TO(f){let N=[];for(let O of f.matchAll(IO))N.push(O[1]);return[...new Set(N)]}function kO(f){if(typeof f!=="object"||f===null)return!1;let N=f,O=N.status;if(O===429||O===500||O===503)return!0;let E=N.error;if(typeof E==="object"&&E!==null&&E.type==="overloaded_error")return!0;return!1}function gf(f){return new Promise((N)=>setTimeout(N,f))}import{generateText as PO}from"ai";class X1{model;config;_generate=PO;constructor(f){if(this.config=f,this.model=null,f.provider==="bedrock"||f.apiKey)try{this.model=q({provider:f.provider,model:f.model,apiKey:f.apiKey})}catch{}}async evaluate(f,N){if(!this.model||N.length===0)return null;let O=Pf(f,N),E=2;for(let M=0;M<=E;M++)try{if(this.config.provider==="google")await v(this.config.model,this.config.rateLimitingEnabled);let{text:A}=await this._generate({model:this.model,maxOutputTokens:512,prompt:O});return yf(A)}catch(A){if(wO(A)&&M<E){let S=2**M*1000;await qO(S);continue}return null}return null}}function wO(f){if(typeof f!=="object"||f===null)return!1;let N=f,O=N.status;if(O===429||O===500||O===503)return!0;let E=N.error;if(typeof E==="object"&&E!==null&&E.type==="overloaded_error")return!0;return!1}function qO(f){return new Promise((N)=>setTimeout(N,f))}import{generateText as vO}from"ai";class B1{model;config;_generate=vO;constructor(f){if(this.config=f,this.model=null,f.provider==="bedrock"||f.apiKey)try{this.model=q({provider:f.provider,model:f.model,apiKey:f.apiKey})}catch{}}async extract(f){if(!this.model)return null;let N=wf(f),O=2;for(let E=0;E<=O;E++)try{if(this.config.provider==="google")await v(this.config.model,this.config.rateLimitingEnabled);let{text:M}=await this._generate({model:this.model,maxOutputTokens:1024,prompt:N});return If(M)}catch(M){if(xO(M)&&E<O){let A=2**E*1000;await gO(A);continue}return null}return null}}function xO(f){if(typeof f!=="object"||f===null)return!1;let N=f,O=N.status;if(O===429||O===500||O===503)return!0;let E=N.error;if(typeof E==="object"&&E!==null&&E.type==="overloaded_error")return!0;return!1}function gO(f){return new Promise((N)=>setTimeout(N,f))}import{generateText as uO}from"ai";class K1{model;config;_generate=uO;constructor(f){this.config=f,this.model=null;let N=f.provider!=="bedrock";if(f.compressionEnabled&&(!N||f.apiKey))try{this.model=q({provider:f.provider,model:f.model,apiKey:f.apiKey})}catch{}}async summarize(f,N){if(N.length===0)return null;if(!this.config.compressionEnabled||!this.model)return this.createFallbackSummary(N);let O=kf(N.map((E)=>({type:E.type,title:E.title,narrative:E.narrative})),f);try{if(this.config.provider==="google")await v(this.config.model,this.config.rateLimitingEnabled);let{text:E}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:O}),M=Gf(E);if(!M)return this.createFallbackSummary(N);return M}catch{return this.createFallbackSummary(N)}}createFallbackSummary(f){let N=new Set,O=new Set,E=[];for(let $ of f){for(let _ of $.filesModified)N.add(_);for(let _ of $.concepts)O.add(_);if($.type==="decision")E.push($.title)}let M=new Map;for(let $ of f)M.set($.type,(M.get($.type)??0)+1);let A=Array.from(M.entries()).map(([$,_])=>`${_} ${$}${_>1?"s":""}`).join(", "),S=Array.from(O).slice(0,5).join(", ");return{summary:`Session with ${f.length} observations: ${A}. Files modified: ${N.size}. Key concepts: ${S}.`,keyDecisions:E.slice(0,5),filesModified:Array.from(N),concepts:Array.from(O)}}shouldSummarize(f){return f>=2}}M1();import{randomUUID as df}from"crypto";var mO={showTokenCosts:!0,observationTypes:"all",fullObservationCount:3,showLastSummary:!0},Q0={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"};function I0(f,N=mO){let O=[];if(O.push("## open-mem: Past Session Memory"),O.push(""),O.push("**\uD83D\uDCA1 Progressive Disclosure:** This is a compact index showing WHAT was observed and retrieval COST."),O.push("Use `mem-find` to find observations by query, then `mem-get` with IDs to fetch full details."),O.push(""),O.push("**3-Layer Memory Access:**"),O.push("- **Layer 1** `mem-find` \u2014 Find observations by query (returns IDs + summaries)"),O.push("- **Layer 2** `mem-history` \u2014 Browse session history and drill into sessions"),O.push("- **Layer 3** `mem-get` \u2014 Get full details by ID (use IDs from search results or the index below)"),N.showLastSummary&&f.recentSummaries.length>0){O.push(""),O.push("### Recent Sessions"),O.push("| Session | Summary | Decisions |"),O.push("|---------|---------|-----------|");for(let S of f.recentSummaries){let $=S.keyDecisions.length>0?S.keyDecisions.join("; "):"\u2014";O.push(`| ${S.sessionId} | ${S.summary} | ${$} |`)}}let E=N.observationTypes==="all"?f.observationIndex:f.observationIndex.filter((S)=>N.observationTypes.includes(S.type));if(E.length>0){O.push(""),O.push(`### Recent Observations (${E.length} entries)`);let S=cO(E,f.fullObservations);for(let[$,_]of S){if(O.push(""),O.push(`**${$}**`),N.showTokenCosts)O.push("| ID | Type | Title | ~Tokens |"),O.push("|----|------|-------|---------|");else O.push("| ID | Type | Title |"),O.push("|----|------|-------|");for(let V of _){let J=Q0[V.type]||"\uD83D\uDCDD";if(N.showTokenCosts)O.push(`| ${V.id} | ${J} | ${V.title} | ~${V.tokenCount} |`);else O.push(`| ${V.id} | ${J} | ${V.title} |`)}}}let M=f.fullObservations.slice(0,N.fullObservationCount);if(M.length>0){O.push(""),O.push("### Full Details (most recent)");for(let S of M){let $=Q0[S.type]||"\uD83D\uDCDD";if(O.push(""),O.push(`#### ${$} ${S.title} (${S.id})`),O.push(S.narrative),S.facts.length>0)O.push(`**Facts:** ${S.facts.map((V)=>`- ${V}`).join(" ")}`);if(S.concepts.length>0)O.push(`**Concepts:** ${S.concepts.join(", ")}`);let _=[...S.filesRead,...S.filesModified];if(_.length>0)O.push(`**Files:** ${_.join(", ")}`)}}let A=lO(f);if(A)O.push(""),O.push(A);return O.join(`
167
- `)}function lO(f){let N=0,O=0,E=new Set(f.observationIndex.map((S)=>S.id));for(let S of f.observationIndex)N+=S.tokenCount,O+=S.discoveryTokens;for(let S of f.fullObservations)if(!E.has(S.id))N+=S.tokenCount,O+=S.discoveryTokens;if(O===0)return null;let M=O-N,A=Math.max(0,Math.round(M/O*100));return`### \uD83D\uDCB0 Memory Economics
168
- **Read cost:** ~${N}t | **Discovery cost:** ~${O}t | **Savings:** ${A}% (${M}t saved)`}function cO(f,N){let O=new Map;for(let M of N){let A=M.filesModified[0]||M.filesRead[0];if(A)O.set(M.id,A)}let E=new Map;for(let M of f){let A=O.get(M.id)??"General",S=E.get(A)??[];S.push(M),E.set(A,S)}return E}function T0(f){let N=[];if(N.push("[open-mem] Memory context:"),f.recentSummaries.length>0){N.push(`
169
- Recent sessions:`);for(let O of f.recentSummaries)N.push(`- ${O.summary}`)}if(f.observationIndex.length>0){N.push(`
170
- Recent observations (${f.observationIndex.length} entries):`);for(let O of f.observationIndex)N.push(`- ${Q0[O.type]||"\uD83D\uDCDD"} ${O.title}`)}return N.join(`
171
- `)}function k0(f,N){if(f.length===0)return"";let O=N,E=[];for(let A of f){let S=A.tokenCount||H(A.title);if(O-S<0)break;E.push(A),O-=S}if(E.length===0)return"";let M=[];M.push("### Cross-Project Memory"),M.push(""),M.push("| ID | Type | Title | ~Tokens |"),M.push("|----|------|-------|---------|");for(let A of E){let S=Q0[A.type]||"\uD83D\uDCDD";M.push(`| ${A.id} | ${S} | ${A.title} | ~${A.tokenCount} |`)}return M.join(`
172
- `)}function P0(f,N){if(f.length===0)return"";let O=N,E=[];for(let A of f){let S=A.tokenCount||H(A.title);if(O-S<0)break;E.push(A),O-=S}if(E.length===0)return"";let M=[];M.push(`
173
- Cross-project observations (${E.length} entries):`);for(let A of E)M.push(`- ${Q0[A.type]||"\uD83D\uDCDD"} ${A.title}`);return M.join(`
174
- `)}var w0={recency:0.4,typeImportance:0.3,sessionAffinity:0.2,tokenEfficiency:0.1},hO={decision:1,bugfix:0.9,feature:0.8,refactor:0.6,discovery:0.5,change:0.4};function bO(f,N){let O=new Date(f),M=(N.getTime()-O.getTime())/3600000;if(M<0)return 1;if(M<24)return 1;if(M<48)return 0.8;if(M<168)return 0.5;return 0.2}function nO(f){return hO[f]??0.3}function pO(f,N){if(!N)return 0.5;return f===N?1:0.3}function iO(f){if(f<=10)return 1;if(f>=200)return 0.2;return 1-(f-10)/190*0.8}function rO(f,N){let O=bO(f.createdAt,N.now),E=nO(f.type),M=pO(f.sessionId,N.currentSessionId),A=iO(f.tokenCount);return O*w0.recency+E*w0.typeImportance+M*w0.sessionAffinity+A*w0.tokenEfficiency}function uf(f,N){let O=new Map;for(let E of f)O.set(E.id,rO(E,N));return[...f].sort((E,M)=>{let A=O.get(E.id)??0,S=O.get(M.id)??0;if(S!==A)return S-A;return new Date(M.createdAt).getTime()-new Date(E.createdAt).getTime()})}function s(f,N,O,E,M=[],A){let S=E,$=[],_=[];for(let J of N){let Q=J.tokenCount||H(J.summary);if(S-Q<0)break;$.push(J),S-=Q}let V=A?uf(O,A):O;for(let J of V){let Q=J.tokenCount||H(J.title);if(S-Q<0)break;_.push(J),S-=Q}return{recentSummaries:$,observationIndex:_,fullObservations:[...M],totalTokens:E-S}}import{existsSync as SE}from"fs";import{readdir as _E,readFile as VE,unlink as JE,writeFile as QE}from"fs/promises";import{join as WE,resolve as DE}from"path";import{existsSync as lf}from"fs";import{mkdir as dO,readFile as tO,rename as aO,unlink as sO,writeFile as oO}from"fs/promises";import{dirname as L1,isAbsolute as cf,join as q0,normalize as eO,relative as hf,resolve as Z1,sep as R1}from"path";var o="<!-- open-mem-context -->",n="<!-- /open-mem-context -->",fE={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"},mf=new Map,NE=new Set(["node_modules",".git","dist","coverage",".open-mem","build","__pycache__",".next",".nuxt"]);async function v0(f,N,O=5){if(N.length===0)return;let E=[];for(let S of N){for(let $ of S.filesModified)E.push($);for(let $ of S.filesRead)E.push($)}let M=AE(E,f,O);if(M.size===0)return;let A=$E(N,M,f);for(let[S,$]of A)try{let _=OE(S,$,f);await EE(S,_)}catch(_){console.error(`[open-mem] Failed to update AGENTS.md in ${S}:`,_)}}function OE(f,N,O){let E=[...N].sort((_,V)=>V.createdAt.localeCompare(_.createdAt)).slice(0,10),M=hf(O,f)||".",A=[];A.push(`## Recent Activity in \`${M}/\` (auto-generated by open-mem)`),A.push(""),A.push("| Type | Title | Date |"),A.push("|------|-------|------|");for(let _ of E){let V=fE[_.type]||"\uD83D\uDCDD",J=_.createdAt.split("T")[0],Q=_.title.replace(/\|/g,"\\|");A.push(`| ${V} ${_.type} | ${Q} | ${J} |`)}let S=new Set;for(let _ of E)for(let V of _.concepts)S.add(V);if(S.size>0){let _=[...S].slice(0,10).join(", ");A.push(""),A.push(`**Key concepts:** ${_}`)}let $=E.filter((_)=>_.type==="decision").map((_)=>_.title);if($.length>0)A.push(""),A.push(`**Recent decisions:** ${$.slice(0,5).join("; ")}`);return A.join(`
175
- `)}async function EE(f,N){if(!lf(f))return;let E=(mf.get(f)??Promise.resolve()).then(async()=>{let M=q0(f,"AGENTS.md"),A=q0(f,".AGENTS.md.tmp"),S="";try{S=await tO(M,"utf-8")}catch{}let $=ME(S,N);try{await dO(L1(A),{recursive:!0}),await oO(A,$,"utf-8"),await aO(A,M)}catch(_){try{await sO(A)}catch{}throw _}});return mf.set(f,E.catch(()=>{})),E}function ME(f,N){if(!f)return`${o}
176
- ${N}
177
- ${n}
178
- `;let O=f.indexOf(o),E=f.indexOf(n);if(O!==-1&&E!==-1&&E>O){let A=f.substring(0,O),S=f.substring(E+n.length);return`${A}${o}
179
- ${N}
180
- ${n}${S}`}let M=f;if(O!==-1&&E===-1)M=M.replace(o,"").trim();else if(O===-1&&E!==-1)M=M.replace(n,"").trim();else if(O!==-1&&E!==-1&&E<=O)M=M.replace(n,"").replace(o,"").trim();return`${M}
164
+ </rerank_request>`}var xf={"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 uf(N){if(N.includes("."))return N;return xf[N]||`us.anthropic.${N}-v1:0`}function q(N){switch(N.provider){case"anthropic":{let{createAnthropic:E}=g("@ai-sdk/anthropic");return E({apiKey:N.apiKey})(N.model)}case"bedrock":{let{createAmazonBedrock:E}=g("@ai-sdk/amazon-bedrock");return E()(uf(N.model))}case"openai":{let{createOpenAI:E}=g("@ai-sdk/openai");return E({apiKey:N.apiKey})(N.model)}case"google":{let{createGoogleGenerativeAI:E}=g("@ai-sdk/google");return E({apiKey:N.apiKey})(N.model)}default:throw Error(`Unknown provider: ${N.provider}. Supported: anthropic, bedrock, openai, google`)}}function bN(N){try{switch(N.provider){case"google":{let{createGoogleGenerativeAI:E}=g("@ai-sdk/google");return E({apiKey:N.apiKey}).embedding("text-embedding-004")}case"openai":{let{createOpenAI:E}=g("@ai-sdk/openai");return E({apiKey:N.apiKey}).embedding("text-embedding-3-small")}case"bedrock":{let{createAmazonBedrock:E}=g("@ai-sdk/amazon-bedrock");return E().embedding("amazon.titan-embed-text-v2:0")}case"anthropic":return null;default:return null}}catch{return null}}var gf={"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},pN=0;async function v(N,E){if(!E)return;let f=gf[N]||5,O=Math.ceil(60000/f)+100,A=Date.now()-pN;if(A<O){let S=O-A;await new Promise(($)=>setTimeout($,S))}pN=Date.now()}class Q0{model;config;_generate=mf;constructor(N){this.config=N,this.model=null;let E=N.provider!=="bedrock";if(N.compressionEnabled&&(!E||N.apiKey))try{this.model=q({provider:N.provider,model:N.model,apiKey:N.apiKey})}catch{}}static MAX_INPUT_LENGTH=50000;async compress(N,E,f){if(!this.config.compressionEnabled||!this.model)return null;if(E.length<this.config.minOutputLength)return null;let O=j(E),M=E.length>Q0.MAX_INPUT_LENGTH?`${E.substring(0,Q0.MAX_INPUT_LENGTH)}
165
+
166
+ [... truncated ...]`:E,A=gN(N,M,f),S=2;for(let $=0;$<=S;$++)try{if(this.config.provider==="google")await v(this.config.model,this.config.rateLimitingEnabled);let{text:_}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:A}),V=PN(_);if(V)V.discoveryTokens=O;return V}catch(_){if(bf(_)&&$<S){let V=2**$*1000;await nN(V);continue}return null}return null}async compressBatch(N){let E=new Map;for(let f=0;f<N.length;f++){let O=N[f],M=await this.compress(O.toolName,O.toolOutput,O.sessionContext);if(E.set(O.callId,M),f<N.length-1)await nN(200)}return E}createFallbackObservation(N,E){let f=lf(E),O=hf[N]??"discovery";return{type:O,title:`${N} execution`,subtitle:E.substring(0,100).replace(/\n/g," "),facts:[],narrative:`Tool ${N} was executed. Output length: ${E.length} chars.`,concepts:[],filesRead:O==="discovery"?f:[],filesModified:O==="change"?f:[],discoveryTokens:j(E),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 hf={Read:"discovery",Write:"change",Edit:"change",Bash:"change",Glob:"discovery",Grep:"discovery"},cf=/(?:^|\s)((?:\.\/|\/|src\/|tests\/|lib\/)\S+\.\w+)/gm;function lf(N){let E=[];for(let f of N.matchAll(cf))E.push(f[1]);return[...new Set(E)]}function bf(N){if(typeof N!=="object"||N===null)return!1;let E=N,f=E.status;if(f===429||f===500||f===503)return!0;let O=E.error;if(typeof O==="object"&&O!==null&&O.type==="overloaded_error")return!0;return!1}function nN(N){return new Promise((E)=>setTimeout(E,N))}import{generateText as pf}from"ai";class B1{model;config;_generate=pf;constructor(N){if(this.config=N,this.model=null,N.provider==="bedrock"||N.apiKey)try{this.model=q({provider:N.provider,model:N.model,apiKey:N.apiKey})}catch{}}async evaluate(N,E){if(!this.model||E.length===0)return null;let f=hN(N,E),O=2;for(let M=0;M<=O;M++)try{if(this.config.provider==="google")await v(this.config.model,this.config.rateLimitingEnabled);let{text:A}=await this._generate({model:this.model,maxOutputTokens:512,prompt:f});return xN(A)}catch(A){if(nf(A)&&M<O){let S=2**M*1000;await rf(S);continue}return null}return null}}function nf(N){if(typeof N!=="object"||N===null)return!1;let E=N,f=E.status;if(f===429||f===500||f===503)return!0;let O=E.error;if(typeof O==="object"&&O!==null&&O.type==="overloaded_error")return!0;return!1}function rf(N){return new Promise((E)=>setTimeout(E,N))}import{generateText as df}from"ai";class K1{model;config;_generate=df;constructor(N){if(this.config=N,this.model=null,N.provider==="bedrock"||N.apiKey)try{this.model=q({provider:N.provider,model:N.model,apiKey:N.apiKey})}catch{}}async extract(N){if(!this.model)return null;let E=cN(N),f=2;for(let O=0;O<=f;O++)try{if(this.config.provider==="google")await v(this.config.model,this.config.rateLimitingEnabled);let{text:M}=await this._generate({model:this.model,maxOutputTokens:1024,prompt:E});return uN(M)}catch(M){if(af(M)&&O<f){let A=2**O*1000;await tf(A);continue}return null}return null}}function af(N){if(typeof N!=="object"||N===null)return!1;let E=N,f=E.status;if(f===429||f===500||f===503)return!0;let O=E.error;if(typeof O==="object"&&O!==null&&O.type==="overloaded_error")return!0;return!1}function tf(N){return new Promise((E)=>setTimeout(E,N))}import{generateText as sf}from"ai";class Z1{model;config;_generate=sf;constructor(N){this.config=N,this.model=null;let E=N.provider!=="bedrock";if(N.compressionEnabled&&(!E||N.apiKey))try{this.model=q({provider:N.provider,model:N.model,apiKey:N.apiKey})}catch{}}async summarize(N,E){if(E.length===0)return null;if(!this.config.compressionEnabled||!this.model)return this.createFallbackSummary(E);let f=mN(E.map((O)=>({type:O.type,title:O.title,narrative:O.narrative})),N);try{if(this.config.provider==="google")await v(this.config.model,this.config.rateLimitingEnabled);let{text:O}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:f}),M=qN(O);if(!M)return this.createFallbackSummary(E);return M}catch{return this.createFallbackSummary(E)}}createFallbackSummary(N){let E=new Set,f=new Set,O=[];for(let $ of N){for(let _ of $.filesModified)E.add(_);for(let _ of $.concepts)f.add(_);if($.type==="decision")O.push($.title)}let M=new Map;for(let $ of N)M.set($.type,(M.get($.type)??0)+1);let A=Array.from(M.entries()).map(([$,_])=>`${_} ${$}${_>1?"s":""}`).join(", "),S=Array.from(f).slice(0,5).join(", ");return{summary:`Session with ${N.length} observations: ${A}. Files modified: ${E.size}. Key concepts: ${S}.`,keyDecisions:O.slice(0,5),filesModified:Array.from(E),concepts:Array.from(f)}}shouldSummarize(N){return N>=2}}$1();import{randomUUID as $E}from"crypto";var of={showTokenCosts:!0,observationTypes:"all",fullObservationCount:3,showLastSummary:!0},W0={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"};function k0(N,E=of){let f=[];if(f.push("## open-mem: Past Session Memory"),f.push(""),f.push("**\uD83D\uDCA1 Progressive Disclosure:** This is a compact index showing WHAT was observed and retrieval COST."),f.push("Use `mem-find` to find observations by query, then `mem-get` with IDs to fetch full details."),f.push(""),f.push("**3-Layer Memory Access:**"),f.push("- **Layer 1** `mem-find` \u2014 Find observations by query (returns IDs + summaries)"),f.push("- **Layer 2** `mem-history` \u2014 Browse session history and drill into sessions"),f.push("- **Layer 3** `mem-get` \u2014 Get full details by ID (use IDs from search results or the index below)"),f.push(""),f.push("**\uD83D\uDCDD When to Save (`mem-create`):** Proactively save decisions + rationale, non-obvious gotchas/workarounds, user preferences, and cross-session plans. Auto-capture handles tool executions \u2014 use `mem-create` for insights auto-capture can't understand the significance of. Wrap sensitive content in `<private>` tags to exclude from memory. Call `mem-help` for detailed guidance."),E.showLastSummary&&N.recentSummaries.length>0){f.push(""),f.push("### Recent Sessions"),f.push("| Session | Summary | Decisions |"),f.push("|---------|---------|-----------|");for(let S of N.recentSummaries){let $=S.keyDecisions.length>0?S.keyDecisions.join("; "):"\u2014";f.push(`| ${S.sessionId} | ${S.summary} | ${$} |`)}}let O=E.observationTypes==="all"?N.observationIndex:N.observationIndex.filter((S)=>E.observationTypes.includes(S.type));if(O.length>0){f.push(""),f.push(`### Recent Observations (${O.length} entries)`);let S=NO(O,N.fullObservations);for(let[$,_]of S){if(f.push(""),f.push(`**${$}**`),E.showTokenCosts)f.push("| ID | Type | Title | ~Tokens |"),f.push("|----|------|-------|---------|");else f.push("| ID | Type | Title |"),f.push("|----|------|-------|");for(let V of _){let J=W0[V.type]||"\uD83D\uDCDD";if(E.showTokenCosts)f.push(`| ${V.id} | ${J} | ${V.title} | ~${V.tokenCount} |`);else f.push(`| ${V.id} | ${J} | ${V.title} |`)}}}let M=N.fullObservations.slice(0,E.fullObservationCount);if(M.length>0){f.push(""),f.push("### Full Details (most recent)");for(let S of M){let $=W0[S.type]||"\uD83D\uDCDD";if(f.push(""),f.push(`#### ${$} ${S.title} (${S.id})`),f.push(S.narrative),S.facts.length>0)f.push(`**Facts:** ${S.facts.map((V)=>`- ${V}`).join(" ")}`);if(S.concepts.length>0)f.push(`**Concepts:** ${S.concepts.join(", ")}`);let _=[...S.filesRead,...S.filesModified];if(_.length>0)f.push(`**Files:** ${_.join(", ")}`)}}let A=ef(N);if(A)f.push(""),f.push(A);return f.join(`
167
+ `)}function ef(N){let E=0,f=0,O=new Set(N.observationIndex.map((S)=>S.id));for(let S of N.observationIndex)E+=S.tokenCount,f+=S.discoveryTokens;for(let S of N.fullObservations)if(!O.has(S.id))E+=S.tokenCount,f+=S.discoveryTokens;if(f===0)return null;let M=f-E,A=Math.max(0,Math.round(M/f*100));return`### \uD83D\uDCB0 Memory Economics
168
+ **Read cost:** ~${E}t | **Discovery cost:** ~${f}t | **Savings:** ${A}% (${M}t saved)`}function NO(N,E){let f=new Map;for(let M of E){let A=M.filesModified[0]||M.filesRead[0];if(A)f.set(M.id,A)}let O=new Map;for(let M of N){let A=f.get(M.id)??"General",S=O.get(A)??[];S.push(M),O.set(A,S)}return O}function w0(N){let E=[];if(E.push("[open-mem] Memory context:"),N.recentSummaries.length>0){E.push(`
169
+ Recent sessions:`);for(let f of N.recentSummaries)E.push(`- ${f.summary}`)}if(N.observationIndex.length>0){E.push(`
170
+ Recent observations (${N.observationIndex.length} entries):`);for(let f of N.observationIndex)E.push(`- ${W0[f.type]||"\uD83D\uDCDD"} ${f.title}`)}return E.join(`
171
+ `)}function P0(N,E){if(N.length===0)return"";let f=E,O=[];for(let A of N){let S=A.tokenCount||j(A.title);if(f-S<0)break;O.push(A),f-=S}if(O.length===0)return"";let M=[];M.push("### Cross-Project Memory"),M.push(""),M.push("| ID | Type | Title | ~Tokens |"),M.push("|----|------|-------|---------|");for(let A of O){let S=W0[A.type]||"\uD83D\uDCDD";M.push(`| ${A.id} | ${S} | ${A.title} | ~${A.tokenCount} |`)}return M.join(`
172
+ `)}function q0(N,E){if(N.length===0)return"";let f=E,O=[];for(let A of N){let S=A.tokenCount||j(A.title);if(f-S<0)break;O.push(A),f-=S}if(O.length===0)return"";let M=[];M.push(`
173
+ Cross-project observations (${O.length} entries):`);for(let A of O)M.push(`- ${W0[A.type]||"\uD83D\uDCDD"} ${A.title}`);return M.join(`
174
+ `)}var v0={recency:0.4,typeImportance:0.3,sessionAffinity:0.2,tokenEfficiency:0.1},EO={decision:1,bugfix:0.9,feature:0.8,refactor:0.6,discovery:0.5,change:0.4};function fO(N,E){let f=new Date(N),M=(E.getTime()-f.getTime())/3600000;if(M<0)return 1;if(M<24)return 1;if(M<48)return 0.8;if(M<168)return 0.5;return 0.2}function OO(N){return EO[N]??0.3}function MO(N,E){if(!E)return 0.5;return N===E?1:0.3}function AO(N){if(N<=10)return 1;if(N>=200)return 0.2;return 1-(N-10)/190*0.8}function $O(N,E){let f=fO(N.createdAt,E.now),O=OO(N.type),M=MO(N.sessionId,E.currentSessionId),A=AO(N.tokenCount);return f*v0.recency+O*v0.typeImportance+M*v0.sessionAffinity+A*v0.tokenEfficiency}function rN(N,E){let f=new Map;for(let O of N)f.set(O.id,$O(O,E));return[...N].sort((O,M)=>{let A=f.get(O.id)??0,S=f.get(M.id)??0;if(S!==A)return S-A;return new Date(M.createdAt).getTime()-new Date(O.createdAt).getTime()})}function s(N,E,f,O,M=[],A){let S=O,$=[],_=[];for(let J of E){let Q=J.tokenCount||j(J.summary);if(S-Q<0)break;$.push(J),S-=Q}let V=A?rN(f,A):f;for(let J of V){let Q=J.tokenCount||j(J.title);if(S-Q<0)break;_.push(J),S-=Q}return{recentSummaries:$,observationIndex:_,fullObservations:[...M],totalTokens:O-S}}import{existsSync as F1}from"fs";import{readdir as KO,readFile as eN,unlink as G1,writeFile as NE}from"fs/promises";import{join as H1,resolve as j1}from"path";import{existsSync as dN}from"fs";import{mkdir as SO,readFile as _O,rename as VO,unlink as JO,writeFile as QO}from"fs/promises";import{dirname as x0,isAbsolute as Y1,join as D0,normalize as WO,relative as C1,resolve as e,sep as R1}from"path";var o="<!-- open-mem-context -->",p="<!-- /open-mem-context -->",aN={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"},iN=new Map,DO=new Set(["node_modules",".git","dist","coverage",".open-mem","build","__pycache__",".next",".nuxt"]);async function u0(N,E,f){if(E.length===0)return;if(f.mode==="single")return XO(N,E,f);let{maxDepth:O,filename:M}=f,A=[];for(let _ of E){for(let V of _.filesModified)A.push(V);for(let V of _.filesRead)A.push(V)}let S=sN(A,N,O);if(S.size===0)return;let $=oN(E,S,N);for(let[_,V]of $)try{let J=UO(_,V,N);await tN(_,J,M)}catch(J){console.error(`[open-mem] Failed to update AGENTS.md in ${_}:`,J)}}async function XO(N,E,f){let{maxDepth:O,filename:M}=f,A=E.filter(L1);if(A.length===0)return;let S=[];for(let D of A){for(let Z of D.filesModified)S.push(Z);for(let Z of D.filesRead)S.push(Z)}let $=sN(S,N,O),_=oN(A,$,N),V=A.filter((D)=>{return[...D.filesModified,...D.filesRead].some((X)=>{if(!X)return!1;let B=Y1(X)?X:D0(N,X);return e(x0(B))===e(N)})});if(V.length>0)_.set(e(N),V);if(_.size===0)return;let J=[];J.push("## Project Activity (auto-generated by open-mem)"),J.push("");let Q=[..._.entries()].map(([D,Z])=>({relPath:C1(N,D)||".",observations:Z})).sort((D,Z)=>D.relPath.localeCompare(Z.relPath));for(let{relPath:D,observations:Z}of Q){let X=Z.filter(L1).sort((B,Y)=>Y.createdAt.localeCompare(B.createdAt)).slice(0,10);if(X.length===0)continue;J.push(`### ${D}/`),J.push("| Type | Title | Date |"),J.push("|------|-------|------|");for(let B of X){let Y=aN[B.type]||"\uD83D\uDCDD",y=B.createdAt.split("T")[0],G=B.title.replace(/\|/g,"\\|");J.push(`| ${Y} ${B.type} | ${G} | ${y} |`)}J.push("")}J.push("\uD83D\uDCA1 *Use `mem-find` to search full details. Use `mem-create` to save important decisions.*");let W=J.join(`
175
+ `);await tN(N,W,M)}function L1(N){return!/^\w[\w-]*\s+execution$/i.test(N.title)}function UO(N,E,f){let O=[...E].filter(L1).sort((V,J)=>J.createdAt.localeCompare(V.createdAt)).slice(0,10),M=C1(f,N)||".",A=[];A.push(`## Recent Activity in \`${M}/\` (auto-generated by open-mem)`),A.push(""),A.push("| Type | Title | Date |"),A.push("|------|-------|------|");for(let V of O){let J=aN[V.type]||"\uD83D\uDCDD",Q=V.createdAt.split("T")[0],W=V.title.replace(/\|/g,"\\|");A.push(`| ${J} ${V.type} | ${W} | ${Q} |`)}let S=new Set;for(let V of O)for(let J of V.concepts)S.add(J);if(S.size>0){let V=[...S].slice(0,10).join(", ");A.push(""),A.push(`**Key concepts:** ${V}`)}let $=O.filter((V)=>V.type==="decision").map((V)=>V.title);if($.length>0)A.push(""),A.push(`**Recent decisions:** ${$.slice(0,5).join("; ")}`);let _=O.filter((V)=>V.type==="decision"&&V.narrative).slice(0,3);if(_.length>0){A.push(""),A.push("**Decision details:**");for(let V of _){let J=V.narrative.split(/[.!?]\s/)[0],Q=J.length>120?`${J.slice(0,117)}...`:J;A.push(`- \u2696\uFE0F ${V.title}: ${Q}`)}}return A.push(""),A.push("\uD83D\uDCA1 *Use `mem-find` to search full details across all sessions. Use `mem-create` to save important decisions.*"),A.join(`
176
+ `)}async function tN(N,E,f){if(!dN(N))return;let M=(iN.get(N)??Promise.resolve()).then(async()=>{let A=D0(N,f),S=D0(N,`.${f}.tmp`),$="";try{$=await _O(A,"utf-8")}catch{}let _=BO($,E);try{await SO(x0(S),{recursive:!0}),await QO(S,_,"utf-8"),await VO(S,A)}catch(V){try{await JO(S)}catch{}throw V}});return iN.set(N,M.catch(()=>{})),M}function BO(N,E){if(!N)return`${o}
177
+ ${E}
178
+ ${p}
179
+ `;let f=N.indexOf(o),O=N.indexOf(p);if(f!==-1&&O!==-1&&O>f){let A=N.substring(0,f),S=N.substring(O+p.length);return`${A}${o}
180
+ ${E}
181
+ ${p}${S}`}let M=N;if(f!==-1&&O===-1)M=M.replace(o,"").trim();else if(f===-1&&O!==-1)M=M.replace(p,"").trim();else if(f!==-1&&O!==-1&&O<=f)M=M.replace(p,"").replace(o,"").trim();return`${M}
181
182
 
182
183
  ${o}
183
- ${N}
184
- ${n}
185
- `}function AE(f,N,O){let E=new Set,M=Z1(N);for(let A of f){if(!A||!A.trim())continue;if(A.startsWith("~")||A.startsWith("http"))continue;let S=cf(A)?A:q0(N,A),$=L1(S),_=Z1($);if(!_.startsWith(M+R1)&&_!==M)continue;if(_===M)continue;let V=hf(M,_);if(V.split(R1).length>O)continue;if(eO(V).split(R1).some((W)=>NE.has(W)))continue;if(!lf(_))continue;E.add(_)}return E}function $E(f,N,O){let E=new Map;for(let M of f){let A=[...M.filesModified,...M.filesRead],S=new Set;for(let $ of A){if(!$)continue;let _=cf($)?$:q0(O,$),V=Z1(L1(_));if(N.has(V))S.add(V)}for(let $ of S){let _=E.get($)??[];_.push(M),E.set($,_)}}return E}var U1="<!-- open-mem-context -->",x0="<!-- /open-mem-context -->";async function bf(f,N){let O;try{O=await _E(f,{withFileTypes:!0,encoding:"utf8"})}catch{return}for(let E of O){let M=String(E.name);if(M===".git"||M==="node_modules"||M===".open-mem"||M==="dist")continue;let A=WE(f,M);if(E.isDirectory())await bf(A,N);else if(E.isFile()&&M==="AGENTS.md")N.push(A)}}async function nf(f){let N=DE(f),O=[];return await bf(N,O),O}function XE(f){let N=f.indexOf(U1),O=f.indexOf(x0);if(N===-1&&O===-1)return f;if(N!==-1&&O===-1){let A=f.replace(U1,"").trim();return A?`${A}
186
- `:""}if(N===-1&&O!==-1){let A=f.replace(x0,"").trim();return A?`${A}
187
- `:""}if(O<=N){let A=f.replace(U1,"").replace(x0,"").trim();return A?`${A}
188
- `:""}let E=f.slice(0,N).trimEnd(),M=f.slice(O+x0.length).trimStart();if(!E&&!M)return"";if(!E)return`${M}
189
- `;if(!M)return`${E}
190
- `;return`${E}
184
+ ${E}
185
+ ${p}
186
+ `}function sN(N,E,f){let O=new Set,M=e(E);for(let A of N){if(!A||!A.trim())continue;if(A.startsWith("~")||A.startsWith("http"))continue;let S=Y1(A)?A:D0(E,A),$=x0(S),_=e($);if(!_.startsWith(M+R1)&&_!==M)continue;if(_===M)continue;let V=C1(M,_);if(V.split(R1).length>f)continue;if(WO(V).split(R1).some((W)=>DO.has(W)))continue;if(!dN(_))continue;O.add(_)}return O}function oN(N,E,f){let O=new Map;for(let M of N){let A=[...M.filesModified,...M.filesRead],S=new Set;for(let $ of A){if(!$)continue;let _=Y1($)?$:D0(f,$),V=e(x0(_));if(E.has(V))S.add(V)}for(let $ of S){let _=O.get($)??[];_.push(M),O.set($,_)}}return O}var z1="<!-- open-mem-context -->",g0="<!-- /open-mem-context -->";async function fE(N,E,f){let O;try{O=await KO(N,{withFileTypes:!0,encoding:"utf8"})}catch{return}for(let M of O){let A=String(M.name);if(A===".git"||A==="node_modules"||A===".open-mem"||A==="dist")continue;let S=H1(N,A);if(M.isDirectory())await fE(S,E,f);else if(M.isFile()&&A===E)f.push(S)}}async function y1(N,E){let f=j1(N),O=[];return await fE(f,E,O),O}function EE(N){let E=N.indexOf(z1),f=N.indexOf(g0);if(E===-1&&f===-1)return N;if(E!==-1&&f===-1){let A=N.replace(z1,"").trim();return A?`${A}
187
+ `:""}if(E===-1&&f!==-1){let A=N.replace(g0,"").trim();return A?`${A}
188
+ `:""}if(f<=E){let A=N.replace(z1,"").replace(g0,"").trim();return A?`${A}
189
+ `:""}let O=N.slice(0,E).trimEnd(),M=N.slice(f+g0.length).trimStart();if(!O&&!M)return"";if(!O)return`${M}
190
+ `;if(!M)return`${O}
191
+ `;return`${O}
191
192
 
192
193
  ${M}
193
- `}async function pf(f,N=!1){let O=await nf(f),E=0;for(let M of O){let A=await VE(M,"utf-8"),S=XE(A);if(S!==A){if(E+=1,!N)if(S==="")await JE(M);else await QE(M,S,"utf-8")}}return{files:O,changed:E}}async function rf(f,N,O,E,M=!1){let S=N.getAll(f).flatMap((_)=>O.getBySession(_.id));if(M){let _=new Set;for(let V of S)for(let J of[...V.filesRead,...V.filesModified])_.add(J);return{observations:S.length,filesTouched:_.size}}if(!SE(f))return{observations:0,filesTouched:0};await v0(f,S,E);let $=await nf(f);return{observations:S.length,filesTouched:$.length}}class Y1{observations;sessions;summaries;searchOrchestrator;projectPath;config;userObservationRepo;runtimeSnapshotProvider;configAuditStore;maintenanceHistoryStore;configAuditLogFallback=[];maintenanceLogFallback=[];constructor(f){this.observations=f.observations,this.sessions=f.sessions,this.summaries=f.summaries,this.searchOrchestrator=f.searchOrchestrator,this.projectPath=f.projectPath,this.config=f.config,this.userObservationRepo=f.userObservationRepo??null,this.runtimeSnapshotProvider=f.runtimeSnapshotProvider??null,this.configAuditStore=f.configAuditStore??null,this.maintenanceHistoryStore=f.maintenanceHistoryStore??null}getByIdIncludingArchived(f){let N=this.observations;return N.getByIdIncludingArchived?N.getByIdIncludingArchived(f):this.observations.getById(f)}listByProjectWithState(f){let N=this.observations;if(N.listByProject)return N.listByProject(this.projectPath,f);if(f.state!=="current")return[];return this.listObservations({limit:f.limit,offset:f.offset,type:f.type,sessionId:f.sessionId})}async ingest(f){}async processPending(f){return 0}async search(f,N={}){return this.searchOrchestrator.search(f,{type:N.type,limit:N.limit??10,projectPath:this.projectPath,importanceMin:N.importanceMin,importanceMax:N.importanceMax,createdAfter:N.after,createdBefore:N.before,concepts:N.concepts,files:N.files})}async timeline(f={}){if(f.sessionId){let O=this.sessions.getById(f.sessionId);if(!O)return[];return[{session:O,summary:this.summaries.getBySessionId(O.id),observations:this.observations.getBySession(O.id)}]}return this.sessions.getRecent(this.projectPath,f.limit??5).map((O)=>({session:O,summary:this.summaries.getBySessionId(O.id),observations:[]}))}async recall(f,N=10){let O=[];for(let E of f.slice(0,N)){let M=this.observations.getById(E);if(M){O.push(M);continue}if(!this.userObservationRepo)continue;let A=this.userObservationRepo.getById(E);if(!A)continue;O.push({...A,sessionId:"",rawToolOutput:"",discoveryTokens:0})}return O}async save(f){if(f.scope==="user"){if(!this.userObservationRepo)return null;return{...this.userObservationRepo.create({type:f.type,title:f.title,subtitle:"",facts:[],narrative:f.narrative,concepts:f.concepts??[],filesRead:[],filesModified:f.files??[],toolName:"mem-create",tokenCount:H(`${f.title} ${f.narrative}`),importance:f.importance??3,sourceProject:this.projectPath}),sessionId:"",rawToolOutput:"",discoveryTokens:0}}this.sessions.getOrCreate(f.sessionId,this.projectPath);let N=this.observations.create({sessionId:f.sessionId,type:f.type,title:f.title,subtitle:"",facts:[],narrative:f.narrative,concepts:f.concepts??[],filesRead:[],filesModified:f.files??[],rawToolOutput:`[Manual save] ${f.narrative}`,toolName:"mem-create",tokenCount:H(`${f.title} ${f.narrative}`),discoveryTokens:0,importance:f.importance??3});return this.sessions.incrementObservationCount(f.sessionId),N}async update(f){let N=this.observations.getById(f.id);if(!N)return null;let O=this.sessions.getById(N.sessionId);if(!O||O.projectPath!==this.projectPath)return null;let{id:E,...M}=f;return this.observations.update(f.id,M)??null}async delete(f){let N=0;for(let O of f){let E=this.observations.getById(O);if(!E)continue;let M=this.sessions.getById(E.sessionId);if(!M||M.projectPath!==this.projectPath)continue;if(this.observations.delete(O))N+=1}return N}async export(f,N={}){if(f!=="project")throw Error("Only project scope export is supported.");let O=this.sessions.getAll(this.projectPath),E=[];for(let $ of O)E.push(...this.observations.getBySession($.id));if(N.type)E=E.filter(($)=>$.type===N.type);if(E.sort(($,_)=>new Date($.createdAt).getTime()-new Date(_.createdAt).getTime()),N.limit&&N.limit<E.length)E=E.slice(0,N.limit);let M=E.map(({rawToolOutput:$,..._})=>_),A=O.map(($)=>this.summaries.getBySessionId($.id)).filter(($)=>$!==null);return{version:1,exportedAt:new Date().toISOString(),project:this.projectPath,observations:M,summaries:A}}async import(f,N={}){let O;try{O=JSON.parse(f)}catch{throw Error("Invalid JSON payload.")}if(typeof O!=="object"||O===null)throw Error("Invalid import payload.");let E=O;if(E.version!==1||!Array.isArray(E.observations))throw Error("Unsupported export format.");let M=N.mode??"skip-duplicates",A=0,S=0;for(let $ of E.observations){let _=this.observations.getById($.id);if(_&&M==="skip-duplicates"){S+=1;continue}if(_&&M==="overwrite")this.observations.delete($.id);this.sessions.getOrCreate($.sessionId,this.projectPath),this.observations.importObservation({id:$.id,sessionId:$.sessionId,type:$.type,title:$.title,subtitle:$.subtitle??"",facts:$.facts??[],narrative:$.narrative??"",concepts:$.concepts??[],filesRead:$.filesRead??[],filesModified:$.filesModified??[],rawToolOutput:$.rawToolOutput??"",toolName:$.toolName??"unknown",createdAt:$.createdAt,tokenCount:$.tokenCount??0,discoveryTokens:$.discoveryTokens??0,importance:$.importance??3,supersededBy:$.supersededBy??null,supersededAt:$.supersededAt??null}),this.sessions.incrementObservationCount($.sessionId),A+=1}for(let $ of E.summaries??[]){let _=this.summaries.getBySessionId($.sessionId);if(_&&M==="skip-duplicates")continue;if(_&&M==="overwrite")continue;this.sessions.getOrCreate($.sessionId,this.projectPath),this.summaries.importSummary($),this.sessions.setSummary($.sessionId,$.id)}return{imported:A,skipped:S}}async buildContext(f,N="normal"){let O=this.sessions.getRecent(this.projectPath,5),E=O.map((J)=>J.summaryId?this.summaries.getBySessionId(J.id):null).filter((J)=>J!==null),M=this.observations.getIndex(this.projectPath,this.config.maxObservations),S=M.slice(0,this.config.contextFullObservationCount).map((J)=>J.id).map((J)=>this.observations.getById(J)).filter((J)=>J!==null),$=s(O,E,M,this.config.maxContextTokens,S);if(N==="compaction"){let J=T0($);if(this.config.userMemoryEnabled&&this.userObservationRepo)J+=P0(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);return J}let _={showTokenCosts:this.config.contextShowTokenCosts,observationTypes:this.config.contextObservationTypes,fullObservationCount:this.config.contextFullObservationCount,showLastSummary:this.config.contextShowLastSummary},V=I0($,_);if(this.config.userMemoryEnabled&&this.userObservationRepo){let J=k0(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);if(J)V+=`
194
+ `}async function OE(N,E,f=!1){let O=await y1(N,E),M=0;for(let A of O){let S=await eN(A,"utf-8"),$=EE(S);if($!==S){if(M+=1,!f)if($==="")await G1(A);else await NE(A,$,"utf-8")}}if(E){let A=H1(j1(N),E);if(F1(A))try{let S=await eN(A,"utf-8"),$=EE(S);if($!==S){if(M+=1,!f)if($==="")await G1(A);else await NE(A,$,"utf-8")}if(!O.includes(A))O.push(A)}catch{}}return{files:O,changed:M}}async function ME(N,E){let f=await y1(N,E);if(E){let M=H1(j1(N),E);if(F1(M)&&!f.includes(M))f.push(M)}let O=0;for(let M of f)try{await G1(M),O++}catch{}return{deleted:O,files:f}}async function AE(N,E,f,O,M=!1){let S=E.getAll(N).flatMap((_)=>f.getBySession(_.id));if(M){let _=new Set;for(let V of S)for(let J of[...V.filesRead,...V.filesModified])_.add(J);return{observations:S.length,filesTouched:_.size}}if(!F1(N))return{observations:0,filesTouched:0};await u0(N,S,{maxDepth:O.maxDepth,mode:O.mode,filename:O.filename});let $=await y1(N,O.filename);return{observations:S.length,filesTouched:$.length}}class I1{observations;sessions;summaries;searchOrchestrator;projectPath;config;userObservationRepo;runtimeSnapshotProvider;configAuditStore;maintenanceHistoryStore;configAuditLogFallback=[];maintenanceLogFallback=[];constructor(N){this.observations=N.observations,this.sessions=N.sessions,this.summaries=N.summaries,this.searchOrchestrator=N.searchOrchestrator,this.projectPath=N.projectPath,this.config=N.config,this.userObservationRepo=N.userObservationRepo??null,this.runtimeSnapshotProvider=N.runtimeSnapshotProvider??null,this.configAuditStore=N.configAuditStore??null,this.maintenanceHistoryStore=N.maintenanceHistoryStore??null}getByIdIncludingArchived(N){let E=this.observations;return E.getByIdIncludingArchived?E.getByIdIncludingArchived(N):this.observations.getById(N)}listByProjectWithState(N){let E=this.observations;if(E.listByProject)return E.listByProject(this.projectPath,N);if(N.state!=="current")return[];return this.listObservations({limit:N.limit,offset:N.offset,type:N.type,sessionId:N.sessionId})}async ingest(N){}async processPending(N){return 0}async search(N,E={}){return this.searchOrchestrator.search(N,{type:E.type,limit:E.limit??10,projectPath:this.projectPath,importanceMin:E.importanceMin,importanceMax:E.importanceMax,createdAfter:E.after,createdBefore:E.before,concepts:E.concepts,files:E.files})}async timeline(N={}){if(N.sessionId){let f=this.sessions.getById(N.sessionId);if(!f)return[];return[{session:f,summary:this.summaries.getBySessionId(f.id),observations:this.observations.getBySession(f.id)}]}return this.sessions.getRecent(this.projectPath,N.limit??5).map((f)=>({session:f,summary:this.summaries.getBySessionId(f.id),observations:[]}))}async recall(N,E=10){let f=[];for(let O of N.slice(0,E)){let M=this.observations.getById(O);if(M){f.push(M);continue}if(!this.userObservationRepo)continue;let A=this.userObservationRepo.getById(O);if(!A)continue;f.push({...A,sessionId:"",rawToolOutput:"",discoveryTokens:0})}return f}async save(N){if(N.scope==="user"){if(!this.userObservationRepo)return null;return{...this.userObservationRepo.create({type:N.type,title:N.title,subtitle:"",facts:[],narrative:N.narrative,concepts:N.concepts??[],filesRead:[],filesModified:N.files??[],toolName:"mem-create",tokenCount:j(`${N.title} ${N.narrative}`),importance:N.importance??3,sourceProject:this.projectPath}),sessionId:"",rawToolOutput:"",discoveryTokens:0}}this.sessions.getOrCreate(N.sessionId,this.projectPath);let E=this.observations.create({sessionId:N.sessionId,type:N.type,title:N.title,subtitle:"",facts:[],narrative:N.narrative,concepts:N.concepts??[],filesRead:[],filesModified:N.files??[],rawToolOutput:`[Manual save] ${N.narrative}`,toolName:"mem-create",tokenCount:j(`${N.title} ${N.narrative}`),discoveryTokens:0,importance:N.importance??3});return this.sessions.incrementObservationCount(N.sessionId),E}async update(N){let E=this.observations.getById(N.id);if(!E)return null;let f=this.sessions.getById(E.sessionId);if(!f||f.projectPath!==this.projectPath)return null;let{id:O,...M}=N;return this.observations.update(N.id,M)??null}async delete(N){let E=0;for(let f of N){let O=this.observations.getById(f);if(!O)continue;let M=this.sessions.getById(O.sessionId);if(!M||M.projectPath!==this.projectPath)continue;if(this.observations.delete(f))E+=1}return E}async export(N,E={}){if(N!=="project")throw Error("Only project scope export is supported.");let f=this.sessions.getAll(this.projectPath),O=[];for(let $ of f)O.push(...this.observations.getBySession($.id));if(E.type)O=O.filter(($)=>$.type===E.type);if(O.sort(($,_)=>new Date($.createdAt).getTime()-new Date(_.createdAt).getTime()),E.limit&&E.limit<O.length)O=O.slice(0,E.limit);let M=O.map(({rawToolOutput:$,..._})=>_),A=f.map(($)=>this.summaries.getBySessionId($.id)).filter(($)=>$!==null);return{version:1,exportedAt:new Date().toISOString(),project:this.projectPath,observations:M,summaries:A}}async import(N,E={}){let f;try{f=JSON.parse(N)}catch{throw Error("Invalid JSON payload.")}if(typeof f!=="object"||f===null)throw Error("Invalid import payload.");let O=f;if(O.version!==1||!Array.isArray(O.observations))throw Error("Unsupported export format.");let M=E.mode??"skip-duplicates",A=0,S=0;for(let $ of O.observations){let _=this.observations.getById($.id);if(_&&M==="skip-duplicates"){S+=1;continue}if(_&&M==="overwrite")this.observations.delete($.id);this.sessions.getOrCreate($.sessionId,this.projectPath),this.observations.importObservation({id:$.id,sessionId:$.sessionId,type:$.type,title:$.title,subtitle:$.subtitle??"",facts:$.facts??[],narrative:$.narrative??"",concepts:$.concepts??[],filesRead:$.filesRead??[],filesModified:$.filesModified??[],rawToolOutput:$.rawToolOutput??"",toolName:$.toolName??"unknown",createdAt:$.createdAt,tokenCount:$.tokenCount??0,discoveryTokens:$.discoveryTokens??0,importance:$.importance??3,supersededBy:$.supersededBy??null,supersededAt:$.supersededAt??null}),this.sessions.incrementObservationCount($.sessionId),A+=1}for(let $ of O.summaries??[]){let _=this.summaries.getBySessionId($.sessionId);if(_&&M==="skip-duplicates")continue;if(_&&M==="overwrite")continue;this.sessions.getOrCreate($.sessionId,this.projectPath),this.summaries.importSummary($),this.sessions.setSummary($.sessionId,$.id)}return{imported:A,skipped:S}}async buildContext(N,E="normal"){let f=this.sessions.getRecent(this.projectPath,5),O=f.map((J)=>J.summaryId?this.summaries.getBySessionId(J.id):null).filter((J)=>J!==null),M=this.observations.getIndex(this.projectPath,this.config.maxObservations),S=M.slice(0,this.config.contextFullObservationCount).map((J)=>J.id).map((J)=>this.observations.getById(J)).filter((J)=>J!==null),$=s(f,O,M,this.config.maxContextTokens,S);if(E==="compaction"){let J=w0($);if(this.config.userMemoryEnabled&&this.userObservationRepo)J+=q0(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);return J}let _={showTokenCosts:this.config.contextShowTokenCosts,observationTypes:this.config.contextObservationTypes,fullObservationCount:this.config.contextFullObservationCount,showLastSummary:this.config.contextShowLastSummary},V=k0($,_);if(this.config.userMemoryEnabled&&this.userObservationRepo){let J=P0(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);if(J)V+=`
194
195
 
195
- ${J}`}return V}guide(){return["open-mem workflow:","1) Use mem-find to find candidate observations by query.","2) Use mem-history to inspect session-level history and summaries.","3) Use mem-get with IDs from find/history to fetch full details.","Write/edit flow: mem-create (new), mem-revise (refine), mem-remove (tombstone).","Transfer flow: mem-export for backup/portability, mem-import to restore."].join(`
196
- `)}listObservations(f){let{limit:N=50,offset:O=0,type:E,sessionId:M,state:A}=f;if(A)return this.listByProjectWithState({limit:N,offset:O,type:E,state:A,sessionId:M});if(M){let _=this.observations.getBySession(M);if(E)_=_.filter((V)=>V.type===E);return _.slice(O,O+N)}let $=this.observations.getIndex(this.projectPath,O+N).slice(O);if(E)$=$.filter((_)=>_.type===E);return $.map((_)=>this.observations.getById(_.id)).filter((_)=>_!==null)}getObservation(f){return this.observations.getById(f)}getLineage(f){let O=this.getByIdIncludingArchived(f);if(!O)return null;let E=O,M=0,A=new Set([O.id]);while(E.revisionOf&&M<256){let J=this.getByIdIncludingArchived(E.revisionOf);if(!J||A.has(J.id))break;E=J,A.add(J.id),M+=1}let S=[],$=E,_=new Set,V=0;while($&&!_.has($.id)&&V<256){_.add($.id);let J=$.deletedAt?"tombstoned":$.supersededBy?"superseded":"current";S.push({id:$.id,revisionOf:$.revisionOf??null,supersededBy:$.supersededBy??null,supersededAt:$.supersededAt??null,deletedAt:$.deletedAt??null,state:J,observation:$}),$=$.supersededBy?this.getByIdIncludingArchived($.supersededBy):null,V+=1}return S}listSessions(f){return this.sessions.getRecent(f.projectPath??this.projectPath,f.limit??20)}getSession(f){let N=this.sessions.getById(f);if(!N)return null;return{session:N,summary:this.summaries.getBySessionId(f),observations:this.observations.getBySession(f)}}stats(){let f=this.observations.getCount(),O=this.sessions.getAll(this.projectPath).length,E=this.observations.getIndex(this.projectPath,1e4),M=0,A=0,S={};for(let V of E)M+=V.tokenCount,A+=V.discoveryTokens,S[V.type]=(S[V.type]||0)+1;let $=A-M,_=E.length>0?Math.round(M/E.length):0;return{totalObservations:f,totalSessions:O,totalTokensSaved:$,averageObservationSize:_,typeBreakdown:S}}async maintainFolderContext(f,N){if(f==="rebuild"){let E=await rf(this.projectPath,this.sessions,this.observations,this.config.folderContextMaxDepth,N);return{action:f,dryRun:N,...E}}let O=await pf(this.projectPath,N);return{action:"clean",dryRun:N,...O}}getRevisionDiff(f,N){let O=this.getByIdIncludingArchived(f),E=this.getByIdIncludingArchived(N);if(!O||!E)return null;let M=[],A=($,_,V)=>{if(JSON.stringify(_)!==JSON.stringify(V))M.push({field:$,before:_,after:V})};A("title",E.title,O.title),A("subtitle",E.subtitle,O.subtitle),A("narrative",E.narrative,O.narrative),A("type",E.type,O.type),A("facts",E.facts,O.facts),A("concepts",E.concepts,O.concepts),A("filesRead",E.filesRead,O.filesRead),A("filesModified",E.filesModified,O.filesModified),A("importance",E.importance,O.importance);let S=M.length===0?"No material changes between revisions.":`Changed ${M.length} field${M.length===1?"":"s"}: ${M.map(($)=>$.field).join(", ")}.`;return{fromId:N,toId:f,summary:S,changedFields:M}}getHealth(){let f=this.runtimeSnapshotProvider?.(),N=f&&f.queue.lastError?"degraded":"ok";return{status:f?.status??"ok",timestamp:f?.timestamp??new Date().toISOString(),components:{database:{status:"ok"},search:{status:"ok"},config:{status:"ok"},queue:{status:N,detail:f?.queue.lastError??void 0}}}}getMetrics(){let f=this.stats();return{timestamp:this.runtimeSnapshotProvider?.()?.timestamp??new Date().toISOString(),memory:{totalObservations:f.totalObservations,totalSessions:f.totalSessions,totalTokensSaved:f.totalTokensSaved,averageObservationSize:f.averageObservationSize}}}getPlatforms(){return{name:"open-mem",provider:this.config.provider,dashboardEnabled:this.config.dashboardEnabled,vectorEnabled:Boolean(this.config.embeddingDimension&&this.config.embeddingDimension>0)}}getAdapterStatuses(){let f={opencode:this.config.platformOpenCodeEnabled??!0,"claude-code":this.config.platformClaudeCodeEnabled??!1,cursor:this.config.platformCursorEnabled??!1};return[{name:"opencode",version:"1.0",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!1}},{name:"claude-code",version:"0.1",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}},{name:"cursor",version:"0.1",capabilities:{nativeSessionLifecycle:!1,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}}].map((O)=>({name:O.name,version:O.version,enabled:f[O.name]??!1,capabilities:O.capabilities}))}getConfigAuditTimeline(){if(this.configAuditStore)return this.configAuditStore.list();return[...this.configAuditLogFallback].reverse()}trackConfigAudit(f){if(this.configAuditStore){this.configAuditStore.append(f);return}this.configAuditLogFallback.push(f)}async rollbackConfig(f){let N=this.configAuditStore?this.configAuditStore.getById(f):this.configAuditLogFallback.find((A)=>A.id===f)??null;if(!N)return null;if(!N.previousValues||typeof N.previousValues!=="object")return null;let{patchConfig:O}=await Promise.resolve().then(() => (_1(),Zf)),E=N.previousValues;try{await O(this.projectPath,E)}catch(A){let S={id:`rollback-failed-${df()}`,timestamp:new Date().toISOString(),patch:N.previousValues,previousValues:N.patch,source:"rollback-failed"};throw this.trackConfigAudit(S),A}let M={id:`rollback-${df()}`,timestamp:new Date().toISOString(),patch:N.previousValues,previousValues:N.patch,source:"rollback"};return this.trackConfigAudit(M),M}getMaintenanceHistory(){if(this.maintenanceHistoryStore)return this.maintenanceHistoryStore.list();return[...this.maintenanceLogFallback].reverse()}trackMaintenanceResult(f){if(this.maintenanceHistoryStore){this.maintenanceHistoryStore.append(f);return}this.maintenanceLogFallback.push(f)}}import{existsSync as CE}from"fs";import{existsSync as BE}from"fs";import{homedir as KE}from"os";import{join as tf}from"path";function RE(){let f=[],N=process.env.BUN_INSTALL;if(N)f.push(tf(N,"bin","bun"));let O=KE();return f.push(tf(O,".bun","bin","bun")),f.push("/usr/local/bin/bun"),f.push("/opt/homebrew/bin/bun"),f.push("/home/linuxbrew/.linuxbrew/bin/bun"),f}function ZE(){let f=Bun.which("bun");if(f)return f;for(let N of RE())if(BE(N))return console.debug(`[open-mem] Resolved bun path via candidate scan: ${N}`),N;return"bun"}var C1=null;function af(){if(C1===null)C1=ZE();return C1}import{existsSync as LE,mkdirSync as W$,readFileSync as UE,unlinkSync as YE,writeFileSync as D$}from"fs";function p(f){if(!LE(f))return null;let N=UE(f,"utf-8").trim(),O=Number.parseInt(N,10);if(Number.isNaN(O))return null;return O}function e(f){try{return process.kill(f,0),!0}catch(N){if(N instanceof Error&&"code"in N&&N.code==="EPERM")return!0;return!1}}function W0(f){try{YE(f)}catch{}}function g0(f){let N=f.lastIndexOf("/");if(N>=0)return`${f.substring(0,N)}/worker.pid`;return"worker.pid"}var zE=100,FE=2000;class z1{pidPath;projectPath;daemonScript;subprocess=null;constructor(f){this.pidPath=g0(f.dbPath),this.projectPath=f.projectPath,this.daemonScript=f.daemonScript}start(){if(this.isRunning())return!1;this.subprocess=Bun.spawn([af(),"run",this.daemonScript,"--project",this.projectPath],{detached:!0,stdio:["ignore","ignore","ignore"],ipc(N){}}),this.subprocess.unref();let f=Date.now()+FE;while(Date.now()<f)if(Bun.sleepSync(zE),CE(this.pidPath)){let N=p(this.pidPath);if(N!==null&&e(N))return!0}return!1}signal(f){try{this.subprocess?.send(f)}catch{}}stop(){let f=p(this.pidPath);if(f!==null)try{process.kill(f,"SIGTERM")}catch{}this.subprocess=null,W0(this.pidPath)}isRunning(){let f=p(this.pidPath);if(f===null)return!1;return e(f)}getStatus(){let f=p(this.pidPath);if(f===null)return{running:!1,pid:null};if(!e(f))return{running:!1,pid:null};return{running:!0,pid:f}}}import{existsSync as F1}from"fs";function sf(f){let N={reaped:0,errors:[]};try{let O=g0(f),E=p(O);if(E===null){try{if(F1(O))if(W0(O),!F1(O))N.reaped++,console.log("[open-mem] Reaped corrupt daemon PID file");else N.errors.push("Failed to remove corrupt PID file: file still exists after removal")}catch(M){N.errors.push(`Failed to check/remove corrupt PID file: ${M instanceof Error?M.message:String(M)}`)}return N}if(e(E))return N;if(W0(O),!F1(O))N.reaped++,console.log(`[open-mem] Reaped stale daemon PID file (pid=${E})`);else N.errors.push(`Failed to remove stale PID file (pid=${E}): file still exists after removal`)}catch(O){N.errors.push(`Reaper error: ${O instanceof Error?O.message:String(O)}`)}return N}function u0(f){try{let N=JSON.parse(f);return N&&typeof N==="object"?N:{}}catch{return{}}}class j1{db;constructor(f){this.db=f}list(){return this.db.all("SELECT id, timestamp, patch, previous_values, source FROM config_audit_events ORDER BY timestamp DESC").map((f)=>({id:f.id,timestamp:f.timestamp,patch:u0(f.patch),previousValues:u0(f.previous_values),source:f.source}))}getById(f){let N=this.db.get("SELECT id, timestamp, patch, previous_values, source FROM config_audit_events WHERE id = ?",[f]);if(!N)return null;return{id:N.id,timestamp:N.timestamp,patch:u0(N.patch),previousValues:u0(N.previous_values),source:N.source}}append(f){this.db.run("INSERT INTO config_audit_events (id, timestamp, patch, previous_values, source) VALUES (?, ?, ?, ?, ?)",[f.id,f.timestamp,JSON.stringify(f.patch??{}),JSON.stringify(f.previousValues??{}),f.source])}}import{Database as of}from"bun:sqlite";import{existsSync as G1,mkdirSync as jE,unlinkSync as ef}from"fs";import*as fN from"sqlite-vec";class m0{db;dbPath;_hasVectorExtension=!1;static enableExtensionSupport(){let f=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite/lib/libsqlite3.dylib"];for(let N of f)try{if(G1(N))return of.setCustomSQLite(N),!0}catch{return!1}return!1}constructor(f){this.dbPath=f,this.db=this.open(f),this.configure()}open(f){let N=f.lastIndexOf("/");if(N>0){let O=f.substring(0,N);jE(O,{recursive:!0})}return new of(f,{create:!0})}configure(){try{this.applyPragmas(),this.loadExtensions()}catch(f){console.warn("[open-mem] Database configure failed, attempting recovery by removing WAL/SHM files:",f.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(N){console.warn("[open-mem] WAL/SHM cleanup insufficient, recreating database from scratch:",N.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(O){throw console.warn("[open-mem] All recovery attempts failed, filesystem may be broken:",O.message),f}}}}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{fN.load(this.db),this._hasVectorExtension=!0}catch{this._hasVectorExtension=!1}}get hasVectorExtension(){return this._hasVectorExtension}deleteSidecarFiles(){for(let f of["-wal","-shm"]){let N=this.dbPath+f;try{if(G1(N))ef(N)}catch{}}}deleteDatabaseFiles(){this.deleteSidecarFiles();try{if(G1(this.dbPath))ef(this.dbPath)}catch{}}ensureMigrationTable(){this.db.exec(`
196
+ ${J}`}return V}guide(){return["# open-mem Workflow Guide","","## Reading Memories","1. `mem-find` \u2014 Search by query (returns IDs + summaries)","2. `mem-history` \u2014 Browse session timeline and summaries","3. `mem-get` \u2014 Fetch full details by ID (from find/history results)","","## When to Save (`mem-create`)","Save when the information is **stable, reusable, and non-obvious**:",'- Architectural decisions + rationale ("chose X over Y because...")',"- Non-obvious gotchas or workarounds discovered","- User preferences and conventions","- Cross-session plans or migration progress",'- Environment constraints ("Bedrock requires tool names matching [a-zA-Z0-9_-]+")',"","## When NOT to Save","Auto-capture already handles tool executions. Don't manually save:","- Ephemeral logs or one-off command outputs","- Information already visible in code or config files","- Routine file reads or edits (auto-captured)","","## Memory Types","- `decision` \u2014 Architectural choices with rationale","- `discovery` \u2014 Non-obvious findings, gotchas, constraints","- `bugfix` \u2014 Bug root causes and fixes","- `feature` \u2014 Feature implementations and design notes","- `refactor` \u2014 Refactoring rationale and approach","- `change` \u2014 General changes worth remembering","","## Editing & Cleanup","- `mem-revise` \u2014 Update outdated memories with new revisions","- `mem-remove` \u2014 Tombstone obsolete or incorrect memories","","## Privacy","Wrap sensitive content in `<private>` tags to exclude from memory.","","## Transfer","- `mem-export` \u2014 Backup/portability as JSON","- `mem-import` \u2014 Restore from JSON export"].join(`
197
+ `)}listObservations(N){let{limit:E=50,offset:f=0,type:O,sessionId:M,state:A}=N;if(A)return this.listByProjectWithState({limit:E,offset:f,type:O,state:A,sessionId:M});if(M){let _=this.observations.getBySession(M);if(O)_=_.filter((V)=>V.type===O);return _.slice(f,f+E)}let $=this.observations.getIndex(this.projectPath,f+E).slice(f);if(O)$=$.filter((_)=>_.type===O);return $.map((_)=>this.observations.getById(_.id)).filter((_)=>_!==null)}getObservation(N){return this.observations.getById(N)}getLineage(N){let f=this.getByIdIncludingArchived(N);if(!f)return null;let O=f,M=0,A=new Set([f.id]);while(O.revisionOf&&M<256){let J=this.getByIdIncludingArchived(O.revisionOf);if(!J||A.has(J.id))break;O=J,A.add(J.id),M+=1}let S=[],$=O,_=new Set,V=0;while($&&!_.has($.id)&&V<256){_.add($.id);let J=$.deletedAt?"tombstoned":$.supersededBy?"superseded":"current";S.push({id:$.id,revisionOf:$.revisionOf??null,supersededBy:$.supersededBy??null,supersededAt:$.supersededAt??null,deletedAt:$.deletedAt??null,state:J,observation:$}),$=$.supersededBy?this.getByIdIncludingArchived($.supersededBy):null,V+=1}return S}listSessions(N){return this.sessions.getRecent(N.projectPath??this.projectPath,N.limit??20)}getSession(N){let E=this.sessions.getById(N);if(!E)return null;return{session:E,summary:this.summaries.getBySessionId(N),observations:this.observations.getBySession(N)}}stats(){let N=this.observations.getCount(),f=this.sessions.getAll(this.projectPath).length,O=this.observations.getIndex(this.projectPath,1e4),M=0,A=0,S={};for(let V of O)M+=V.tokenCount,A+=V.discoveryTokens,S[V.type]=(S[V.type]||0)+1;let $=A-M,_=O.length>0?Math.round(M/O.length):0;return{totalObservations:N,totalSessions:f,totalTokensSaved:$,averageObservationSize:_,typeBreakdown:S}}async maintainFolderContext(N,E){if(N==="purge")return{action:"purge",dryRun:!1,...await ME(this.projectPath,this.config.folderContextFilename)};if(N==="rebuild"){let O=await AE(this.projectPath,this.sessions,this.observations,{maxDepth:this.config.folderContextMaxDepth,mode:this.config.folderContextMode,filename:this.config.folderContextFilename},E);return{action:N,dryRun:E,...O}}let f=await OE(this.projectPath,this.config.folderContextFilename,E);return{action:"clean",dryRun:E,...f}}getRevisionDiff(N,E){let f=this.getByIdIncludingArchived(N),O=this.getByIdIncludingArchived(E);if(!f||!O)return null;let M=[],A=($,_,V)=>{if(JSON.stringify(_)!==JSON.stringify(V))M.push({field:$,before:_,after:V})};A("title",O.title,f.title),A("subtitle",O.subtitle,f.subtitle),A("narrative",O.narrative,f.narrative),A("type",O.type,f.type),A("facts",O.facts,f.facts),A("concepts",O.concepts,f.concepts),A("filesRead",O.filesRead,f.filesRead),A("filesModified",O.filesModified,f.filesModified),A("importance",O.importance,f.importance);let S=M.length===0?"No material changes between revisions.":`Changed ${M.length} field${M.length===1?"":"s"}: ${M.map(($)=>$.field).join(", ")}.`;return{fromId:E,toId:N,summary:S,changedFields:M}}getHealth(){let N=this.runtimeSnapshotProvider?.(),E=N&&N.queue.lastError?"degraded":"ok";return{status:N?.status??"ok",timestamp:N?.timestamp??new Date().toISOString(),components:{database:{status:"ok"},search:{status:"ok"},config:{status:"ok"},queue:{status:E,detail:N?.queue.lastError??void 0}}}}getMetrics(){let N=this.stats();return{timestamp:this.runtimeSnapshotProvider?.()?.timestamp??new Date().toISOString(),memory:{totalObservations:N.totalObservations,totalSessions:N.totalSessions,totalTokensSaved:N.totalTokensSaved,averageObservationSize:N.averageObservationSize}}}getPlatforms(){return{name:"open-mem",provider:this.config.provider,dashboardEnabled:this.config.dashboardEnabled,vectorEnabled:Boolean(this.config.embeddingDimension&&this.config.embeddingDimension>0)}}getAdapterStatuses(){let N={opencode:this.config.platformOpenCodeEnabled??!0,"claude-code":this.config.platformClaudeCodeEnabled??!1,cursor:this.config.platformCursorEnabled??!1};return[{name:"opencode",version:"1.0",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!1}},{name:"claude-code",version:"0.1",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}},{name:"cursor",version:"0.1",capabilities:{nativeSessionLifecycle:!1,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}}].map((f)=>({name:f.name,version:f.version,enabled:N[f.name]??!1,capabilities:f.capabilities}))}getConfigAuditTimeline(){if(this.configAuditStore)return this.configAuditStore.list();return[...this.configAuditLogFallback].reverse()}trackConfigAudit(N){if(this.configAuditStore){this.configAuditStore.append(N);return}this.configAuditLogFallback.push(N)}async rollbackConfig(N){let E=this.configAuditStore?this.configAuditStore.getById(N):this.configAuditLogFallback.find((A)=>A.id===N)??null;if(!E)return null;if(!E.previousValues||typeof E.previousValues!=="object")return null;let{patchConfig:f}=await Promise.resolve().then(() => (J1(),HN)),O=E.previousValues;try{await f(this.projectPath,O)}catch(A){let S={id:`rollback-failed-${$E()}`,timestamp:new Date().toISOString(),patch:E.previousValues,previousValues:E.patch,source:"rollback-failed"};throw this.trackConfigAudit(S),A}let M={id:`rollback-${$E()}`,timestamp:new Date().toISOString(),patch:E.previousValues,previousValues:E.patch,source:"rollback"};return this.trackConfigAudit(M),M}getMaintenanceHistory(){if(this.maintenanceHistoryStore)return this.maintenanceHistoryStore.list();return[...this.maintenanceLogFallback].reverse()}trackMaintenanceResult(N){if(this.maintenanceHistoryStore){this.maintenanceHistoryStore.append(N);return}this.maintenanceLogFallback.push(N)}}import{existsSync as FO}from"fs";import{existsSync as ZO}from"fs";import{homedir as RO}from"os";import{join as SE}from"path";function LO(){let N=[],E=process.env.BUN_INSTALL;if(E)N.push(SE(E,"bin","bun"));let f=RO();return N.push(SE(f,".bun","bin","bun")),N.push("/usr/local/bin/bun"),N.push("/opt/homebrew/bin/bun"),N.push("/home/linuxbrew/.linuxbrew/bin/bun"),N}function YO(){let N=Bun.which("bun");if(N)return N;for(let E of LO())if(ZO(E))return console.debug(`[open-mem] Resolved bun path via candidate scan: ${E}`),E;return"bun"}var T1=null;function _E(){if(T1===null)T1=YO();return T1}import{existsSync as CO,mkdirSync as L$,readFileSync as zO,unlinkSync as GO,writeFileSync as Y$}from"fs";function n(N){if(!CO(N))return null;let E=zO(N,"utf-8").trim(),f=Number.parseInt(E,10);if(Number.isNaN(f))return null;return f}function N0(N){try{return process.kill(N,0),!0}catch(E){if(E instanceof Error&&"code"in E&&E.code==="EPERM")return!0;return!1}}function X0(N){try{GO(N)}catch{}}function m0(N){let E=N.lastIndexOf("/");if(E>=0)return`${N.substring(0,E)}/worker.pid`;return"worker.pid"}var HO=100,jO=2000;class k1{pidPath;projectPath;daemonScript;subprocess=null;constructor(N){this.pidPath=m0(N.dbPath),this.projectPath=N.projectPath,this.daemonScript=N.daemonScript}start(){if(this.isRunning())return!1;this.subprocess=Bun.spawn([_E(),"run",this.daemonScript,"--project",this.projectPath],{detached:!0,stdio:["ignore","ignore","ignore"],ipc(E){}}),this.subprocess.unref();let N=Date.now()+jO;while(Date.now()<N)if(Bun.sleepSync(HO),FO(this.pidPath)){let E=n(this.pidPath);if(E!==null&&N0(E))return!0}return!1}signal(N){try{this.subprocess?.send(N)}catch{}}stop(){let N=n(this.pidPath);if(N!==null)try{process.kill(N,"SIGTERM")}catch{}this.subprocess=null,X0(this.pidPath)}isRunning(){let N=n(this.pidPath);if(N===null)return!1;return N0(N)}getStatus(){let N=n(this.pidPath);if(N===null)return{running:!1,pid:null};if(!N0(N))return{running:!1,pid:null};return{running:!0,pid:N}}}import{existsSync as w1}from"fs";function VE(N){let E={reaped:0,errors:[]};try{let f=m0(N),O=n(f);if(O===null){try{if(w1(f))if(X0(f),!w1(f))E.reaped++,console.log("[open-mem] Reaped corrupt daemon PID file");else E.errors.push("Failed to remove corrupt PID file: file still exists after removal")}catch(M){E.errors.push(`Failed to check/remove corrupt PID file: ${M instanceof Error?M.message:String(M)}`)}return E}if(N0(O))return E;if(X0(f),!w1(f))E.reaped++,console.log(`[open-mem] Reaped stale daemon PID file (pid=${O})`);else E.errors.push(`Failed to remove stale PID file (pid=${O}): file still exists after removal`)}catch(f){E.errors.push(`Reaper error: ${f instanceof Error?f.message:String(f)}`)}return E}function h0(N){try{let E=JSON.parse(N);return E&&typeof E==="object"?E:{}}catch{return{}}}class P1{db;constructor(N){this.db=N}list(){return this.db.all("SELECT id, timestamp, patch, previous_values, source FROM config_audit_events ORDER BY timestamp DESC").map((N)=>({id:N.id,timestamp:N.timestamp,patch:h0(N.patch),previousValues:h0(N.previous_values),source:N.source}))}getById(N){let E=this.db.get("SELECT id, timestamp, patch, previous_values, source FROM config_audit_events WHERE id = ?",[N]);if(!E)return null;return{id:E.id,timestamp:E.timestamp,patch:h0(E.patch),previousValues:h0(E.previous_values),source:E.source}}append(N){this.db.run("INSERT INTO config_audit_events (id, timestamp, patch, previous_values, source) VALUES (?, ?, ?, ?, ?)",[N.id,N.timestamp,JSON.stringify(N.patch??{}),JSON.stringify(N.previousValues??{}),N.source])}}import{Database as JE}from"bun:sqlite";import{existsSync as q1,mkdirSync as yO,unlinkSync as QE}from"fs";import*as WE from"sqlite-vec";class c0{db;dbPath;_hasVectorExtension=!1;static enableExtensionSupport(){let N=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite/lib/libsqlite3.dylib"];for(let E of N)try{if(q1(E))return JE.setCustomSQLite(E),!0}catch{return!1}return!1}constructor(N){this.dbPath=N,this.db=this.open(N),this.configure()}open(N){let E=N.lastIndexOf("/");if(E>0){let f=N.substring(0,E);yO(f,{recursive:!0})}return new JE(N,{create:!0})}configure(){try{this.applyPragmas(),this.loadExtensions()}catch(N){console.warn("[open-mem] Database configure failed, attempting recovery by removing WAL/SHM files:",N.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(E){console.warn("[open-mem] WAL/SHM cleanup insufficient, recreating database from scratch:",E.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(f){throw console.warn("[open-mem] All recovery attempts failed, filesystem may be broken:",f.message),N}}}}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{WE.load(this.db),this._hasVectorExtension=!0}catch{this._hasVectorExtension=!1}}get hasVectorExtension(){return this._hasVectorExtension}deleteSidecarFiles(){for(let N of["-wal","-shm"]){let E=this.dbPath+N;try{if(q1(E))QE(E)}catch{}}}deleteDatabaseFiles(){this.deleteSidecarFiles();try{if(q1(this.dbPath))QE(this.dbPath)}catch{}}ensureMigrationTable(){this.db.exec(`
197
198
  CREATE TABLE IF NOT EXISTS _migrations (
198
199
  version INTEGER PRIMARY KEY,
199
200
  name TEXT NOT NULL,
200
201
  applied_at TEXT NOT NULL DEFAULT (datetime('now'))
201
202
  )
202
- `)}migrate(f){this.ensureMigrationTable();let N=this.db.query("SELECT version FROM _migrations ORDER BY version").all(),O=new Set(N.map((M)=>M.version)),E=f.filter((M)=>!O.has(M.version)).sort((M,A)=>M.version-A.version);for(let M of E)this.db.transaction(()=>{this.db.exec(M.up),this.db.query("INSERT INTO _migrations (version, name) VALUES ($version, $name)").run({$version:M.version,$name:M.name})})()}run(f,N){let O=this.db.query(f);if(N)O.run(...N);else O.run()}get(f,N){let O=this.db.query(f);return N?O.get(...N):O.get()}all(f,N){let O=this.db.query(f);return N?O.all(...N):O.all()}exec(f){this.db.exec(f)}transaction(f){return this.db.transaction(f)()}close(){this.db.close()}get isOpen(){try{return this.db.query("SELECT 1").get(),!0}catch{return!1}}get raw(){return this.db}}function l0(f){return new m0(f)}import{randomUUID as NN}from"crypto";class H1{db;constructor(f){this.db=f}upsertEntity(f,N){let O=NN(),E=new Date().toISOString();this.db.run(`INSERT INTO entities (id, name, entity_type, first_seen_at, last_seen_at, mention_count)
203
+ `)}migrate(N){this.ensureMigrationTable();let E=this.db.query("SELECT version FROM _migrations ORDER BY version").all(),f=new Set(E.map((M)=>M.version)),O=N.filter((M)=>!f.has(M.version)).sort((M,A)=>M.version-A.version);for(let M of O)this.db.transaction(()=>{this.db.exec(M.up),this.db.query("INSERT INTO _migrations (version, name) VALUES ($version, $name)").run({$version:M.version,$name:M.name})})()}run(N,E){let f=this.db.query(N);if(E)f.run(...E);else f.run()}get(N,E){let f=this.db.query(N);return E?f.get(...E):f.get()}all(N,E){let f=this.db.query(N);return E?f.all(...E):f.all()}exec(N){this.db.exec(N)}transaction(N){return this.db.transaction(N)()}close(){this.db.close()}get isOpen(){try{return this.db.query("SELECT 1").get(),!0}catch{return!1}}get raw(){return this.db}}function l0(N){return new c0(N)}import{randomUUID as DE}from"crypto";class v1{db;constructor(N){this.db=N}upsertEntity(N,E){let f=DE(),O=new Date().toISOString();this.db.run(`INSERT INTO entities (id, name, entity_type, first_seen_at, last_seen_at, mention_count)
203
204
  VALUES (?, ?, ?, ?, ?, 1)
204
205
  ON CONFLICT(name, entity_type) DO UPDATE SET
205
206
  mention_count = mention_count + 1,
206
- last_seen_at = ?`,[O,f,N,E,E,E]);let M=this.db.get("SELECT * FROM entities WHERE name = ? AND entity_type = ?",[f,N]);if(!M)throw Error(`Failed to upsert entity: ${f} (${N})`);return this.mapEntityRow(M)}createRelation(f,N,O,E){let M=NN(),A=new Date().toISOString();try{this.db.run(`INSERT OR IGNORE INTO entity_relations
207
+ last_seen_at = ?`,[f,N,E,O,O,O]);let M=this.db.get("SELECT * FROM entities WHERE name = ? AND entity_type = ?",[N,E]);if(!M)throw Error(`Failed to upsert entity: ${N} (${E})`);return this.mapEntityRow(M)}createRelation(N,E,f,O){let M=DE(),A=new Date().toISOString();try{this.db.run(`INSERT OR IGNORE INTO entity_relations
207
208
  (id, source_entity_id, target_entity_id, relationship, observation_id, created_at)
208
- VALUES (?, ?, ?, ?, ?, ?)`,[M,f,N,O,E,A])}catch{return null}let S=this.db.get(`SELECT * FROM entity_relations
209
- WHERE source_entity_id = ? AND target_entity_id = ? AND relationship = ?`,[f,N,O]);return S?this.mapRelationRow(S):null}linkObservation(f,N){this.db.run("INSERT OR IGNORE INTO entity_observations (entity_id, observation_id) VALUES (?, ?)",[f,N])}findByName(f){try{return this.db.all(`SELECT e.*
209
+ VALUES (?, ?, ?, ?, ?, ?)`,[M,N,E,f,O,A])}catch{return null}let S=this.db.get(`SELECT * FROM entity_relations
210
+ WHERE source_entity_id = ? AND target_entity_id = ? AND relationship = ?`,[N,E,f]);return S?this.mapRelationRow(S):null}linkObservation(N,E){this.db.run("INSERT OR IGNORE INTO entity_observations (entity_id, observation_id) VALUES (?, ?)",[N,E])}findByName(N){try{return this.db.all(`SELECT e.*
210
211
  FROM entities e
211
212
  JOIN entities_fts fts ON e._rowid = fts.rowid
212
213
  WHERE entities_fts MATCH ?
213
- ORDER BY rank`,[f]).map((O)=>this.mapEntityRow(O))}catch{return[]}}getRelationsFor(f){return this.db.all(`SELECT * FROM entity_relations
214
- WHERE source_entity_id = ? OR target_entity_id = ?`,[f,f]).map((O)=>this.mapRelationRow(O))}traverseRelations(f,N=1){let O=Math.min(N,2),E=100,M=new Set,A=[{id:f,currentDepth:0}];M.add(f);while(A.length>0){if(M.size>=100)break;let S=A.shift();if(!S)continue;if(S.currentDepth>=O)continue;let $=this.getRelationsFor(S.id);for(let _ of $){let V=_.sourceEntityId===S.id?_.targetEntityId:_.sourceEntityId;if(!M.has(V))M.add(V),A.push({id:V,currentDepth:S.currentDepth+1})}}return M}getObservationsForEntity(f){return this.db.all("SELECT observation_id FROM entity_observations WHERE entity_id = ?",[f]).map((O)=>O.observation_id)}getById(f){let N=this.db.get("SELECT * FROM entities WHERE id = ?",[f]);return N?this.mapEntityRow(N):null}mapEntityRow(f){return{id:f.id,name:f.name,entityType:f.entity_type,firstSeenAt:f.first_seen_at,lastSeenAt:f.last_seen_at,mentionCount:f.mention_count}}mapRelationRow(f){return{id:f.id,sourceEntityId:f.source_entity_id,targetEntityId:f.target_entity_id,relationship:f.relationship,observationId:f.observation_id,createdAt:f.created_at}}}function GE(f){try{let N=JSON.parse(f);return N&&typeof N==="object"?N:{}}catch{return{}}}class y1{db;constructor(f){this.db=f}list(){return this.db.all("SELECT id, timestamp, action, dry_run, result FROM maintenance_history ORDER BY timestamp DESC").map((f)=>({id:f.id,timestamp:f.timestamp,action:f.action,dryRun:f.dry_run===1,result:GE(f.result)}))}append(f){this.db.run("INSERT INTO maintenance_history (id, timestamp, action, dry_run, result) VALUES (?, ?, ?, ?, ?)",[f.id,f.timestamp,f.action,f.dryRun?1:0,JSON.stringify(f.result??{})])}}import{randomUUID as yE}from"crypto";import{embed as HE}from"ai";async function i(f,N){try{let{embedding:O}=await HE({model:f,value:N});return O}catch{return null}}function f0(f,N){if(f.length!==N.length||f.length===0)return 0;let O=0,E=0,M=0;for(let S=0;S<f.length;S++)O+=f[S]*N[S],E+=f[S]*f[S],M+=N[S]*N[S];let A=Math.sqrt(E)*Math.sqrt(M);if(A===0)return 0;return O/A}function I1(f){let N=[f.title,f.narrative];if(f.concepts.length>0)N.push(f.concepts.join(", "));return N.join(`
215
- `)}function IE(f){return f.replace(/[%_\\]/g,"\\$&")}class T1{db;constructor(f){this.db=f}create(f){let N=yE(),O=new Date().toISOString(),E=f.discoveryTokens??0,M=f.importance??3,A=f.scope??"project";return this.db.run(`INSERT INTO observations
214
+ ORDER BY rank`,[N]).map((f)=>this.mapEntityRow(f))}catch{return[]}}getRelationsFor(N){return this.db.all(`SELECT * FROM entity_relations
215
+ WHERE source_entity_id = ? OR target_entity_id = ?`,[N,N]).map((f)=>this.mapRelationRow(f))}traverseRelations(N,E=1){let f=Math.min(E,2),O=100,M=new Set,A=[{id:N,currentDepth:0}];M.add(N);while(A.length>0){if(M.size>=100)break;let S=A.shift();if(!S)continue;if(S.currentDepth>=f)continue;let $=this.getRelationsFor(S.id);for(let _ of $){let V=_.sourceEntityId===S.id?_.targetEntityId:_.sourceEntityId;if(!M.has(V))M.add(V),A.push({id:V,currentDepth:S.currentDepth+1})}}return M}getObservationsForEntity(N){return this.db.all("SELECT observation_id FROM entity_observations WHERE entity_id = ?",[N]).map((f)=>f.observation_id)}getById(N){let E=this.db.get("SELECT * FROM entities WHERE id = ?",[N]);return E?this.mapEntityRow(E):null}mapEntityRow(N){return{id:N.id,name:N.name,entityType:N.entity_type,firstSeenAt:N.first_seen_at,lastSeenAt:N.last_seen_at,mentionCount:N.mention_count}}mapRelationRow(N){return{id:N.id,sourceEntityId:N.source_entity_id,targetEntityId:N.target_entity_id,relationship:N.relationship,observationId:N.observation_id,createdAt:N.created_at}}}function IO(N){try{let E=JSON.parse(N);return E&&typeof E==="object"?E:{}}catch{return{}}}class x1{db;constructor(N){this.db=N}list(){return this.db.all("SELECT id, timestamp, action, dry_run, result FROM maintenance_history ORDER BY timestamp DESC").map((N)=>({id:N.id,timestamp:N.timestamp,action:N.action,dryRun:N.dry_run===1,result:IO(N.result)}))}append(N){this.db.run("INSERT INTO maintenance_history (id, timestamp, action, dry_run, result) VALUES (?, ?, ?, ?, ?)",[N.id,N.timestamp,N.action,N.dryRun?1:0,JSON.stringify(N.result??{})])}}import{randomUUID as kO}from"crypto";import{embed as TO}from"ai";async function r(N,E){try{let{embedding:f}=await TO({model:N,value:E});return f}catch{return null}}function E0(N,E){if(N.length!==E.length||N.length===0)return 0;let f=0,O=0,M=0;for(let S=0;S<N.length;S++)f+=N[S]*E[S],O+=N[S]*N[S],M+=E[S]*E[S];let A=Math.sqrt(O)*Math.sqrt(M);if(A===0)return 0;return f/A}function u1(N){let E=[N.title,N.narrative];if(N.concepts.length>0)E.push(N.concepts.join(", "));return E.join(`
216
+ `)}function wO(N){return N.replace(/[%_\\]/g,"\\$&")}class g1{db;constructor(N){this.db=N}create(N){let E=kO(),f=new Date().toISOString(),O=N.discoveryTokens??0,M=N.importance??3,A=N.scope??"project";return this.db.run(`INSERT INTO observations
216
217
  (id, session_id, scope, type, title, subtitle, facts, narrative,
217
218
  concepts, files_read, files_modified, raw_tool_output,
218
219
  tool_name, created_at, token_count, discovery_tokens, importance, revision_of, deleted_at)
219
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[N,f.sessionId,A,f.type,f.title,f.subtitle,JSON.stringify(f.facts),f.narrative,JSON.stringify(f.concepts),JSON.stringify(f.filesRead),JSON.stringify(f.filesModified),f.rawToolOutput,f.toolName,O,f.tokenCount,E,M,null,null]),{...f,id:N,scope:A,createdAt:O,discoveryTokens:E,importance:M,revisionOf:null,deletedAt:null,supersededBy:null,supersededAt:null}}importObservation(f){this.db.run(`INSERT INTO observations
220
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[E,N.sessionId,A,N.type,N.title,N.subtitle,JSON.stringify(N.facts),N.narrative,JSON.stringify(N.concepts),JSON.stringify(N.filesRead),JSON.stringify(N.filesModified),N.rawToolOutput,N.toolName,f,N.tokenCount,O,M,null,null]),{...N,id:E,scope:A,createdAt:f,discoveryTokens:O,importance:M,revisionOf:null,deletedAt:null,supersededBy:null,supersededAt:null}}importObservation(N){this.db.run(`INSERT INTO observations
220
221
  (id, session_id, scope, type, title, subtitle, facts, narrative,
221
222
  concepts, files_read, files_modified, raw_tool_output,
222
223
  tool_name, created_at, token_count, discovery_tokens, importance, revision_of, deleted_at)
223
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[f.id,f.sessionId,f.scope??"project",f.type,f.title,f.subtitle,JSON.stringify(f.facts),f.narrative,JSON.stringify(f.concepts),JSON.stringify(f.filesRead),JSON.stringify(f.filesModified),f.rawToolOutput,f.toolName,f.createdAt,f.tokenCount,f.discoveryTokens??0,f.importance??3,f.revisionOf??null,f.deletedAt??null])}getById(f){let N=this.db.get("SELECT * FROM observations WHERE id = ? AND superseded_by IS NULL AND deleted_at IS NULL",[f]);return N?this.mapRow(N):null}getByIdIncludingArchived(f){let N=this.db.get("SELECT * FROM observations WHERE id = ?",[f]);return N?this.mapRow(N):null}getBySession(f){return this.db.all("SELECT * FROM observations WHERE session_id = ? AND superseded_by IS NULL AND deleted_at IS NULL ORDER BY created_at ASC",[f]).map((N)=>this.mapRow(N))}getCount(f){if(f)return this.db.get("SELECT COUNT(*) as count FROM observations WHERE session_id = ?",[f])?.count??0;return this.db.get("SELECT COUNT(*) as count FROM observations")?.count??0}getIndex(f,N=20){return this.db.all(`SELECT o.id, o.session_id, o.type, o.title, o.token_count, o.discovery_tokens, o.created_at, o.importance
224
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[N.id,N.sessionId,N.scope??"project",N.type,N.title,N.subtitle,JSON.stringify(N.facts),N.narrative,JSON.stringify(N.concepts),JSON.stringify(N.filesRead),JSON.stringify(N.filesModified),N.rawToolOutput,N.toolName,N.createdAt,N.tokenCount,N.discoveryTokens??0,N.importance??3,N.revisionOf??null,N.deletedAt??null])}getById(N){let E=this.db.get("SELECT * FROM observations WHERE id = ? AND superseded_by IS NULL AND deleted_at IS NULL",[N]);return E?this.mapRow(E):null}getByIdIncludingArchived(N){let E=this.db.get("SELECT * FROM observations WHERE id = ?",[N]);return E?this.mapRow(E):null}getBySession(N){return this.db.all("SELECT * FROM observations WHERE session_id = ? AND superseded_by IS NULL AND deleted_at IS NULL ORDER BY created_at ASC",[N]).map((E)=>this.mapRow(E))}getCount(N){if(N)return this.db.get("SELECT COUNT(*) as count FROM observations WHERE session_id = ?",[N])?.count??0;return this.db.get("SELECT COUNT(*) as count FROM observations")?.count??0}getIndex(N,E=20){return this.db.all(`SELECT o.id, o.session_id, o.type, o.title, o.token_count, o.discovery_tokens, o.created_at, o.importance
224
225
  FROM observations o
225
226
  JOIN sessions s ON o.session_id = s.id
226
227
  WHERE s.project_path = ? AND o.superseded_by IS NULL AND o.deleted_at IS NULL
227
228
  ORDER BY o.created_at DESC
228
- LIMIT ?`,[f,N]).map((O)=>({id:O.id,sessionId:O.session_id,type:O.type,title:O.title,tokenCount:O.token_count,discoveryTokens:O.discovery_tokens??0,createdAt:O.created_at,importance:O.importance??3}))}listByProject(f,N={}){let{limit:O=50,offset:E=0,type:M,state:A,sessionId:S}=N,$=`SELECT o.*
229
+ LIMIT ?`,[N,E]).map((f)=>({id:f.id,sessionId:f.session_id,type:f.type,title:f.title,tokenCount:f.token_count,discoveryTokens:f.discovery_tokens??0,createdAt:f.created_at,importance:f.importance??3}))}listByProject(N,E={}){let{limit:f=50,offset:O=0,type:M,state:A,sessionId:S}=E,$=`SELECT o.*
229
230
  FROM observations o
230
231
  JOIN sessions s ON o.session_id = s.id
231
- WHERE s.project_path = ?`,_=[f];if(S)$+=" AND o.session_id = ?",_.push(S);if(M)$+=" AND o.type = ?",_.push(M);if(A==="current")$+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";else if(A==="superseded")$+=" AND o.superseded_by IS NOT NULL AND o.deleted_at IS NULL";else if(A==="tombstoned")$+=" AND o.deleted_at IS NOT NULL";else $+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";return $+=" ORDER BY o.created_at DESC LIMIT ? OFFSET ?",_.push(O,E),this.db.all($,_).map((V)=>this.mapRow(V))}search(f){let N=!!f.projectPath,O=`
232
+ WHERE s.project_path = ?`,_=[N];if(S)$+=" AND o.session_id = ?",_.push(S);if(M)$+=" AND o.type = ?",_.push(M);if(A==="current")$+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";else if(A==="superseded")$+=" AND o.superseded_by IS NOT NULL AND o.deleted_at IS NULL";else if(A==="tombstoned")$+=" AND o.deleted_at IS NOT NULL";else $+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";return $+=" ORDER BY o.created_at DESC LIMIT ? OFFSET ?",_.push(f,O),this.db.all($,_).map((V)=>this.mapRow(V))}search(N){let E=!!N.projectPath,f=`
232
233
  SELECT o.*, rank
233
234
  FROM observations o
234
235
  JOIN observations_fts fts ON o._rowid = fts.rowid
235
- ${N?"JOIN sessions s ON o.session_id = s.id":""}
236
+ ${E?"JOIN sessions s ON o.session_id = s.id":""}
236
237
  WHERE observations_fts MATCH ? AND o.superseded_by IS NULL AND o.deleted_at IS NULL
237
- `,E=[f.query];if(N&&f.projectPath)O+=" AND s.project_path = ?",E.push(f.projectPath);if(f.sessionId)O+=" AND o.session_id = ?",E.push(f.sessionId);if(f.type)O+=" AND o.type = ?",E.push(f.type);if(f.importanceMin!==void 0)O+=" AND o.importance >= ?",E.push(f.importanceMin);if(f.importanceMax!==void 0)O+=" AND o.importance <= ?",E.push(f.importanceMax);if(f.createdAfter)O+=" AND o.created_at >= ?",E.push(f.createdAfter);if(f.createdBefore)O+=" AND o.created_at <= ?",E.push(f.createdBefore);if(f.concepts&&f.concepts.length>0){let M=f.concepts.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE LOWER(value) = LOWER(?))");O+=` AND (${M.join(" OR ")})`;for(let A of f.concepts)E.push(A)}if(f.files&&f.files.length>0){let M=f.files.map(()=>`(EXISTS (SELECT 1 FROM json_each(o.files_read) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\')
238
- OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\'))`);O+=` AND (${M.join(" OR ")})`;for(let A of f.files){let S=`%${IE(A)}%`;E.push(S,S)}}return O+=" ORDER BY rank LIMIT ? OFFSET ?",E.push(f.limit??10),E.push(f.offset??0),this.db.all(O,E).map((M)=>({observation:this.mapRow(M),rank:M.rank,snippet:M.title}))}searchByConcept(f,N=10,O){let E=!!O,M=`SELECT o.*
238
+ `,O=[N.query];if(E&&N.projectPath)f+=" AND s.project_path = ?",O.push(N.projectPath);if(N.sessionId)f+=" AND o.session_id = ?",O.push(N.sessionId);if(N.type)f+=" AND o.type = ?",O.push(N.type);if(N.importanceMin!==void 0)f+=" AND o.importance >= ?",O.push(N.importanceMin);if(N.importanceMax!==void 0)f+=" AND o.importance <= ?",O.push(N.importanceMax);if(N.createdAfter)f+=" AND o.created_at >= ?",O.push(N.createdAfter);if(N.createdBefore)f+=" AND o.created_at <= ?",O.push(N.createdBefore);if(N.concepts&&N.concepts.length>0){let M=N.concepts.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE LOWER(value) = LOWER(?))");f+=` AND (${M.join(" OR ")})`;for(let A of N.concepts)O.push(A)}if(N.files&&N.files.length>0){let M=N.files.map(()=>`(EXISTS (SELECT 1 FROM json_each(o.files_read) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\')
239
+ OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\'))`);f+=` AND (${M.join(" OR ")})`;for(let A of N.files){let S=`%${wO(A)}%`;O.push(S,S)}}return f+=" ORDER BY rank LIMIT ? OFFSET ?",O.push(N.limit??10),O.push(N.offset??0),this.db.all(f,O).map((M)=>({observation:this.mapRow(M),rank:M.rank,snippet:M.title}))}searchByConcept(N,E=10,f){let O=!!f,M=`SELECT o.*
239
240
  FROM observations o
240
241
  JOIN observations_fts fts ON o._rowid = fts.rowid
241
- ${E?"JOIN sessions s ON o.session_id = s.id":""}
242
+ ${O?"JOIN sessions s ON o.session_id = s.id":""}
242
243
  WHERE observations_fts MATCH ?
243
244
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
244
- ${E?"AND s.project_path = ?":""}
245
+ ${O?"AND s.project_path = ?":""}
245
246
  ORDER BY rank
246
- LIMIT ?`,A=[`concepts:${f}`];if(E&&O)A.push(O);return A.push(N),this.db.all(M,A).map((S)=>this.mapRow(S))}searchByFile(f,N=10,O){let E=!!O,M=`SELECT o.*
247
+ LIMIT ?`,A=[`concepts:${N}`];if(O&&f)A.push(f);return A.push(E),this.db.all(M,A).map((S)=>this.mapRow(S))}searchByFile(N,E=10,f){let O=!!f,M=`SELECT o.*
247
248
  FROM observations o
248
249
  JOIN observations_fts fts ON o._rowid = fts.rowid
249
- ${E?"JOIN sessions s ON o.session_id = s.id":""}
250
+ ${O?"JOIN sessions s ON o.session_id = s.id":""}
250
251
  WHERE observations_fts MATCH ?
251
252
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
252
- ${E?"AND s.project_path = ?":""}
253
+ ${O?"AND s.project_path = ?":""}
253
254
  ORDER BY rank
254
- LIMIT ?`,A=[`files_read:"${f.replace(/"/g,'""')}" OR files_modified:"${f.replace(/"/g,'""')}"`];if(E&&O)A.push(O);return A.push(N),this.db.all(M,A).map((S)=>this.mapRow(S))}setEmbedding(f,N){this.db.run("UPDATE observations SET embedding = ? WHERE id = ?",[JSON.stringify(N),f])}getWithEmbeddings(f,N){return this.db.all(`SELECT o.id, o.embedding, o.title
255
+ LIMIT ?`,A=[`files_read:"${N.replace(/"/g,'""')}" OR files_modified:"${N.replace(/"/g,'""')}"`];if(O&&f)A.push(f);return A.push(E),this.db.all(M,A).map((S)=>this.mapRow(S))}setEmbedding(N,E){this.db.run("UPDATE observations SET embedding = ? WHERE id = ?",[JSON.stringify(E),N])}getWithEmbeddings(N,E){return this.db.all(`SELECT o.id, o.embedding, o.title
255
256
  FROM observations o
256
257
  JOIN sessions s ON o.session_id = s.id
257
258
  WHERE s.project_path = ? AND o.embedding IS NOT NULL AND o.superseded_by IS NULL AND o.deleted_at IS NULL
258
259
  ORDER BY o.created_at DESC
259
- LIMIT ?`,[f,N]).map((O)=>{try{return{id:O.id,embedding:JSON.parse(O.embedding),title:O.title}}catch{return null}}).filter((O)=>O!==null)}findSimilar(f,N,O,E){let M=this.db.all(`SELECT id, embedding FROM observations
260
+ LIMIT ?`,[N,E]).map((f)=>{try{return{id:f.id,embedding:JSON.parse(f.embedding),title:f.title}}catch{return null}}).filter((f)=>f!==null)}findSimilar(N,E,f,O){let M=this.db.all(`SELECT id, embedding FROM observations
260
261
  WHERE embedding IS NOT NULL AND type = ? AND superseded_by IS NULL AND deleted_at IS NULL
261
262
  ORDER BY created_at DESC
262
- LIMIT 200`,[N]),A=[];for(let S of M)try{let $=JSON.parse(S.embedding);if(!Array.isArray($)||$.length!==f.length)continue;let _=f0(f,$);if(_>=O)A.push({id:S.id,similarity:_})}catch{}return A.sort((S,$)=>$.similarity-S.similarity).slice(0,E)}insertVecEmbedding(f,N){let O=new Float32Array(N);this.db.run("BEGIN");try{this.db.run("DELETE FROM observation_embeddings WHERE observation_id = ?",[f]),this.db.run("INSERT INTO observation_embeddings (observation_id, embedding) VALUES (?, ?)",[f,O]),this.db.run("COMMIT")}catch(E){throw this.db.run("ROLLBACK"),E}}migrateExistingEmbeddings(f){let N=this.db.all("SELECT id, embedding FROM observations WHERE embedding IS NOT NULL"),O=0,E=0;for(let M of N)try{let A=JSON.parse(M.embedding);if(!Array.isArray(A)||A.length!==f){E++;continue}this.insertVecEmbedding(M.id,A),O++}catch{E++}return{migrated:O,skipped:E}}getVecEmbeddingMatches(f,N){try{let O=new Float32Array(f);return this.db.all(`SELECT observation_id, distance
263
+ LIMIT 200`,[E]),A=[];for(let S of M)try{let $=JSON.parse(S.embedding);if(!Array.isArray($)||$.length!==N.length)continue;let _=E0(N,$);if(_>=f)A.push({id:S.id,similarity:_})}catch{}return A.sort((S,$)=>$.similarity-S.similarity).slice(0,O)}insertVecEmbedding(N,E){let f=new Float32Array(E);this.db.run("BEGIN");try{this.db.run("DELETE FROM observation_embeddings WHERE observation_id = ?",[N]),this.db.run("INSERT INTO observation_embeddings (observation_id, embedding) VALUES (?, ?)",[N,f]),this.db.run("COMMIT")}catch(O){throw this.db.run("ROLLBACK"),O}}migrateExistingEmbeddings(N){let E=this.db.all("SELECT id, embedding FROM observations WHERE embedding IS NOT NULL"),f=0,O=0;for(let M of E)try{let A=JSON.parse(M.embedding);if(!Array.isArray(A)||A.length!==N){O++;continue}this.insertVecEmbedding(M.id,A),f++}catch{O++}return{migrated:f,skipped:O}}getVecEmbeddingMatches(N,E){try{let f=new Float32Array(N);return this.db.all(`SELECT observation_id, distance
263
264
  FROM observation_embeddings
264
- WHERE embedding MATCH ? AND k = ?`,[O,N]).map((E)=>({observationId:E.observation_id,distance:E.distance}))}catch{return[]}}searchVecSubset(f,N,O){if(N.length===0)return[];try{let E=new Float32Array(f),M=Math.max(O*5,N.length),A=this.db.all(`SELECT observation_id, distance
265
+ WHERE embedding MATCH ? AND k = ?`,[f,E]).map((O)=>({observationId:O.observation_id,distance:O.distance}))}catch{return[]}}searchVecSubset(N,E,f){if(E.length===0)return[];try{let O=new Float32Array(N),M=Math.max(f*5,E.length),A=this.db.all(`SELECT observation_id, distance
265
266
  FROM observation_embeddings
266
- WHERE embedding MATCH ? AND k = ?`,[E,M]),S=new Set(N);return A.filter(($)=>S.has($.observation_id)).slice(0,O).map(($)=>({observationId:$.observation_id,distance:$.distance}))}catch{return[]}}update(f,N){let O=this.getById(f);if(!O)return null;if(Object.keys(N).length===0)return O;let E=this.create({sessionId:O.sessionId,scope:O.scope??"project",type:N.type??O.type,title:N.title??O.title,subtitle:N.subtitle??O.subtitle,facts:N.facts??O.facts,narrative:N.narrative??O.narrative,concepts:N.concepts??O.concepts,filesRead:N.filesRead??O.filesRead,filesModified:N.filesModified??O.filesModified,rawToolOutput:O.rawToolOutput,toolName:"mem-revise",tokenCount:O.tokenCount,discoveryTokens:O.discoveryTokens,importance:N.importance??O.importance});return this.db.run("UPDATE observations SET revision_of = ? WHERE id = ?",[f,E.id]),this.supersede(f,E.id),this.getById(E.id)}supersede(f,N){let O=new Date().toISOString();this.db.run("UPDATE observations SET superseded_by = ?, superseded_at = ? WHERE id = ?",[N,O,f])}delete(f){if(this.db.all("SELECT id FROM observations WHERE id = ?",[f]).length===0)return!1;let O=new Date().toISOString();return this.db.run("UPDATE observations SET deleted_at = ? WHERE id = ?",[O,f]),this.deleteEmbeddingsForObservations([f]),!0}getLineage(f){let N=this.getByIdIncludingArchived(f);if(!N)return[];let O=new Set([N.id]),E=[N];while(E[0].revisionOf){let M=this.getByIdIncludingArchived(E[0].revisionOf);if(!M||O.has(M.id))break;E.unshift(M),O.add(M.id)}while(E[E.length-1].supersededBy){let M=E[E.length-1].supersededBy;if(!M)break;let A=this.getByIdIncludingArchived(M);if(!A||O.has(A.id))break;E.push(A),O.add(A.id)}return E}deleteOlderThan(f){return this.db.all(`DELETE FROM observations
267
+ WHERE embedding MATCH ? AND k = ?`,[O,M]),S=new Set(E);return A.filter(($)=>S.has($.observation_id)).slice(0,f).map(($)=>({observationId:$.observation_id,distance:$.distance}))}catch{return[]}}update(N,E){let f=this.getById(N);if(!f)return null;if(Object.keys(E).length===0)return f;let O=this.create({sessionId:f.sessionId,scope:f.scope??"project",type:E.type??f.type,title:E.title??f.title,subtitle:E.subtitle??f.subtitle,facts:E.facts??f.facts,narrative:E.narrative??f.narrative,concepts:E.concepts??f.concepts,filesRead:E.filesRead??f.filesRead,filesModified:E.filesModified??f.filesModified,rawToolOutput:f.rawToolOutput,toolName:"mem-revise",tokenCount:f.tokenCount,discoveryTokens:f.discoveryTokens,importance:E.importance??f.importance});return this.db.run("UPDATE observations SET revision_of = ? WHERE id = ?",[N,O.id]),this.supersede(N,O.id),this.getById(O.id)}supersede(N,E){let f=new Date().toISOString();this.db.run("UPDATE observations SET superseded_by = ?, superseded_at = ? WHERE id = ?",[E,f,N])}delete(N){if(this.db.all("SELECT id FROM observations WHERE id = ?",[N]).length===0)return!1;let f=new Date().toISOString();return this.db.run("UPDATE observations SET deleted_at = ? WHERE id = ?",[f,N]),this.deleteEmbeddingsForObservations([N]),!0}getLineage(N){let E=this.getByIdIncludingArchived(N);if(!E)return[];let f=new Set([E.id]),O=[E];while(O[0].revisionOf){let M=this.getByIdIncludingArchived(O[0].revisionOf);if(!M||f.has(M.id))break;O.unshift(M),f.add(M.id)}while(O[O.length-1].supersededBy){let M=O[O.length-1].supersededBy;if(!M)break;let A=this.getByIdIncludingArchived(M);if(!A||f.has(A.id))break;O.push(A),f.add(A.id)}return O}deleteOlderThan(N){return this.db.all(`DELETE FROM observations
267
268
  WHERE (created_at < datetime('now', '-' || ? || ' days') OR deleted_at IS NOT NULL)
268
269
  AND session_id NOT IN (SELECT id FROM sessions WHERE status != 'completed')
269
- RETURNING id`,[f]).length}deleteEmbeddingsForObservations(f){if(f.length===0)return;let N=f.map(()=>"?").join(",");try{this.db.run(`DELETE FROM observation_embeddings WHERE observation_id IN (${N})`,f)}catch{}this.db.run(`UPDATE observations SET embedding = NULL WHERE id IN (${N})`,f)}mapRow(f){return{id:f.id,sessionId:f.session_id,scope:f.scope??"project",type:f.type,title:f.title,subtitle:f.subtitle,facts:JSON.parse(f.facts),narrative:f.narrative,concepts:JSON.parse(f.concepts),filesRead:JSON.parse(f.files_read),filesModified:JSON.parse(f.files_modified),rawToolOutput:f.raw_tool_output,toolName:f.tool_name,createdAt:f.created_at,tokenCount:f.token_count,discoveryTokens:f.discovery_tokens??0,importance:f.importance??3,revisionOf:f.revision_of??null,deletedAt:f.deleted_at??null,supersededBy:f.superseded_by??null,supersededAt:f.superseded_at??null}}}import{randomUUID as TE}from"crypto";class k1{db;constructor(f){this.db=f}create(f){let N=TE(),O=new Date().toISOString();return this.db.run(`INSERT INTO pending_messages
270
+ RETURNING id`,[N]).length}deleteEmbeddingsForObservations(N){if(N.length===0)return;let E=N.map(()=>"?").join(",");try{this.db.run(`DELETE FROM observation_embeddings WHERE observation_id IN (${E})`,N)}catch{}this.db.run(`UPDATE observations SET embedding = NULL WHERE id IN (${E})`,N)}mapRow(N){return{id:N.id,sessionId:N.session_id,scope:N.scope??"project",type:N.type,title:N.title,subtitle:N.subtitle,facts:JSON.parse(N.facts),narrative:N.narrative,concepts:JSON.parse(N.concepts),filesRead:JSON.parse(N.files_read),filesModified:JSON.parse(N.files_modified),rawToolOutput:N.raw_tool_output,toolName:N.tool_name,createdAt:N.created_at,tokenCount:N.token_count,discoveryTokens:N.discovery_tokens??0,importance:N.importance??3,revisionOf:N.revision_of??null,deletedAt:N.deleted_at??null,supersededBy:N.superseded_by??null,supersededAt:N.superseded_at??null}}}import{randomUUID as PO}from"crypto";class m1{db;constructor(N){this.db=N}create(N){let E=PO(),f=new Date().toISOString();return this.db.run(`INSERT INTO pending_messages
270
271
  (id, session_id, tool_name, tool_output, call_id, created_at)
271
- VALUES (?, ?, ?, ?, ?, ?)`,[N,f.sessionId,f.toolName,f.toolOutput,f.callId,O]),{...f,id:N,createdAt:O,status:"pending",retryCount:0,error:null}}getPending(f=10){return this.db.all("SELECT * FROM pending_messages WHERE status = 'pending' ORDER BY created_at ASC LIMIT ?",[f]).map((N)=>this.mapRow(N))}getByStatus(f){return this.db.all("SELECT * FROM pending_messages WHERE status = ? ORDER BY created_at ASC",[f]).map((N)=>this.mapRow(N))}markProcessing(f){this.db.run("UPDATE pending_messages SET status = 'processing' WHERE id = ?",[f])}markCompleted(f){this.db.run("UPDATE pending_messages SET status = 'completed' WHERE id = ?",[f])}markFailed(f,N){this.db.run("UPDATE pending_messages SET status = 'failed', error = ?, retry_count = retry_count + 1 WHERE id = ?",[N,f])}resetStale(f=5){return this.db.all(`UPDATE pending_messages SET status = 'pending'
272
+ VALUES (?, ?, ?, ?, ?, ?)`,[E,N.sessionId,N.toolName,N.toolOutput,N.callId,f]),{...N,id:E,createdAt:f,status:"pending",retryCount:0,error:null}}getPending(N=10){return this.db.all("SELECT * FROM pending_messages WHERE status = 'pending' ORDER BY created_at ASC LIMIT ?",[N]).map((E)=>this.mapRow(E))}getByStatus(N){return this.db.all("SELECT * FROM pending_messages WHERE status = ? ORDER BY created_at ASC",[N]).map((E)=>this.mapRow(E))}markProcessing(N){this.db.run("UPDATE pending_messages SET status = 'processing' WHERE id = ?",[N])}markCompleted(N){this.db.run("UPDATE pending_messages SET status = 'completed' WHERE id = ?",[N])}markFailed(N,E){this.db.run("UPDATE pending_messages SET status = 'failed', error = ?, retry_count = retry_count + 1 WHERE id = ?",[E,N])}resetStale(N=5){return this.db.all(`UPDATE pending_messages SET status = 'pending'
272
273
  WHERE status = 'processing'
273
274
  AND created_at < datetime('now', ? || ' minutes')
274
- RETURNING id`,[`-${f}`]).length}deleteCompletedOlderThan(f){return this.db.all(`DELETE FROM pending_messages
275
+ RETURNING id`,[`-${N}`]).length}deleteCompletedOlderThan(N){return this.db.all(`DELETE FROM pending_messages
275
276
  WHERE status = 'completed'
276
277
  AND created_at < datetime('now', '-' || ? || ' days')
277
- RETURNING id`,[f]).length}mapRow(f){return{id:f.id,sessionId:f.session_id,toolName:f.tool_name,toolOutput:f.tool_output,callId:f.call_id,createdAt:f.created_at,status:f.status,retryCount:f.retry_count,error:f.error??null}}}var kE=[{version:1,name:"create-schema",up:`
278
+ RETURNING id`,[N]).length}mapRow(N){return{id:N.id,sessionId:N.session_id,toolName:N.tool_name,toolOutput:N.tool_output,callId:N.call_id,createdAt:N.created_at,status:N.status,retryCount:N.retry_count,error:N.error??null}}}var qO=[{version:1,name:"create-schema",up:`
278
279
  -- Sessions table
279
280
  CREATE TABLE IF NOT EXISTS sessions (
280
281
  _rowid INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -568,24 +569,24 @@ ${J}`}return V}guide(){return["open-mem workflow:","1) Use mem-find to find cand
568
569
  INSERT INTO entities_fts(rowid, name, entity_type)
569
570
  VALUES (new._rowid, new.name, new.entity_type);
570
571
  END;
571
- `}];function ON(f,N){if(f.migrate(kE),N?.hasVectorExtension&&N?.embeddingDimension&&N.embeddingDimension>0)PE(f,N.embeddingDimension)}function PE(f,N){if(f.get("SELECT name FROM sqlite_master WHERE type='table' AND name='observation_embeddings'")){let E=f.get("SELECT value FROM _embedding_meta WHERE key = 'dimension'");if(E&&Number(E.value)!==N){console.warn(`[open-mem] vec0 table exists with dimension ${E.value}, but config specifies ${N}. Drop observation_embeddings to re-create with new dimension.`);return}}else f.exec(`CREATE VIRTUAL TABLE observation_embeddings USING vec0(
572
+ `}];function XE(N,E){if(N.migrate(qO),E?.hasVectorExtension&&E?.embeddingDimension&&E.embeddingDimension>0)vO(N,E.embeddingDimension)}function vO(N,E){if(N.get("SELECT name FROM sqlite_master WHERE type='table' AND name='observation_embeddings'")){let O=N.get("SELECT value FROM _embedding_meta WHERE key = 'dimension'");if(O&&Number(O.value)!==E){console.warn(`[open-mem] vec0 table exists with dimension ${O.value}, but config specifies ${E}. Drop observation_embeddings to re-create with new dimension.`);return}}else N.exec(`CREATE VIRTUAL TABLE observation_embeddings USING vec0(
572
573
  observation_id TEXT PRIMARY KEY,
573
- embedding float[${N}] distance_metric=cosine
574
- )`);f.run("INSERT OR REPLACE INTO _embedding_meta (key, value) VALUES (?, ?)",["dimension",String(N)])}class P1{db;constructor(f){this.db=f}create(f,N){let O=new Date().toISOString();return this.db.run(`INSERT INTO sessions (id, project_path, started_at, status)
575
- VALUES (?, ?, ?, 'active')`,[f,N,O]),this.getById(f)}getOrCreate(f,N){let O=this.getById(f);if(O)return O;return this.create(f,N)}getById(f){let N=this.db.get("SELECT * FROM sessions WHERE id = ?",[f]);return N?this.mapRow(N):null}getRecent(f,N=10){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC LIMIT ?",[f,N]).map((O)=>this.mapRow(O))}getAll(f){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC",[f]).map((N)=>this.mapRow(N))}getActive(){return this.db.all("SELECT * FROM sessions WHERE status = 'active' ORDER BY started_at DESC").map((f)=>this.mapRow(f))}updateStatus(f,N){this.db.run("UPDATE sessions SET status = ? WHERE id = ?",[N,f])}markCompleted(f){this.db.run("UPDATE sessions SET status = 'completed', ended_at = datetime('now') WHERE id = ?",[f])}incrementObservationCount(f){this.db.run("UPDATE sessions SET observation_count = observation_count + 1 WHERE id = ?",[f])}setSummary(f,N){this.db.run("UPDATE sessions SET summary_id = ? WHERE id = ?",[N,f])}mapRow(f){return{id:f.id,projectPath:f.project_path,startedAt:f.started_at,endedAt:f.ended_at??null,status:f.status,observationCount:f.observation_count,summaryId:f.summary_id??null}}}import{randomUUID as wE}from"crypto";class w1{db;constructor(f){this.db=f}create(f){let N=wE(),O=new Date().toISOString();return this.db.run(`INSERT INTO session_summaries
574
+ embedding float[${E}] distance_metric=cosine
575
+ )`);N.run("INSERT OR REPLACE INTO _embedding_meta (key, value) VALUES (?, ?)",["dimension",String(E)])}class h1{db;constructor(N){this.db=N}create(N,E){let f=new Date().toISOString();return this.db.run(`INSERT INTO sessions (id, project_path, started_at, status)
576
+ VALUES (?, ?, ?, 'active')`,[N,E,f]),this.getById(N)}getOrCreate(N,E){let f=this.getById(N);if(f)return f;return this.create(N,E)}getById(N){let E=this.db.get("SELECT * FROM sessions WHERE id = ?",[N]);return E?this.mapRow(E):null}getRecent(N,E=10){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC LIMIT ?",[N,E]).map((f)=>this.mapRow(f))}getAll(N){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC",[N]).map((E)=>this.mapRow(E))}getActive(){return this.db.all("SELECT * FROM sessions WHERE status = 'active' ORDER BY started_at DESC").map((N)=>this.mapRow(N))}updateStatus(N,E){this.db.run("UPDATE sessions SET status = ? WHERE id = ?",[E,N])}markCompleted(N){this.db.run("UPDATE sessions SET status = 'completed', ended_at = datetime('now') WHERE id = ?",[N])}incrementObservationCount(N){this.db.run("UPDATE sessions SET observation_count = observation_count + 1 WHERE id = ?",[N])}setSummary(N,E){this.db.run("UPDATE sessions SET summary_id = ? WHERE id = ?",[E,N])}mapRow(N){return{id:N.id,projectPath:N.project_path,startedAt:N.started_at,endedAt:N.ended_at??null,status:N.status,observationCount:N.observation_count,summaryId:N.summary_id??null}}}import{randomUUID as xO}from"crypto";class c1{db;constructor(N){this.db=N}create(N){let E=xO(),f=new Date().toISOString();return this.db.run(`INSERT INTO session_summaries
576
577
  (id, session_id, summary, key_decisions, files_modified,
577
578
  concepts, created_at, token_count,
578
579
  request, investigated, learned, completed, next_steps)
579
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[N,f.sessionId,f.summary,JSON.stringify(f.keyDecisions),JSON.stringify(f.filesModified),JSON.stringify(f.concepts),O,f.tokenCount,f.request??"",f.investigated??"",f.learned??"",f.completed??"",f.nextSteps??""]),{...f,id:N,createdAt:O}}importSummary(f){this.db.run(`INSERT INTO session_summaries
580
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[E,N.sessionId,N.summary,JSON.stringify(N.keyDecisions),JSON.stringify(N.filesModified),JSON.stringify(N.concepts),f,N.tokenCount,N.request??"",N.investigated??"",N.learned??"",N.completed??"",N.nextSteps??""]),{...N,id:E,createdAt:f}}importSummary(N){this.db.run(`INSERT INTO session_summaries
580
581
  (id, session_id, summary, key_decisions, files_modified,
581
582
  concepts, created_at, token_count,
582
583
  request, investigated, learned, completed, next_steps)
583
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[f.id,f.sessionId,f.summary,JSON.stringify(f.keyDecisions),JSON.stringify(f.filesModified),JSON.stringify(f.concepts),f.createdAt,f.tokenCount,f.request??"",f.investigated??"",f.learned??"",f.completed??"",f.nextSteps??""])}getBySessionId(f){let N=this.db.get("SELECT * FROM session_summaries WHERE session_id = ?",[f]);return N?this.mapRow(N):null}getRecent(f=10){return this.db.all("SELECT * FROM session_summaries ORDER BY created_at DESC LIMIT ?",[f]).map((N)=>this.mapRow(N))}search(f,N=10){return this.db.all(`SELECT ss.*
584
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[N.id,N.sessionId,N.summary,JSON.stringify(N.keyDecisions),JSON.stringify(N.filesModified),JSON.stringify(N.concepts),N.createdAt,N.tokenCount,N.request??"",N.investigated??"",N.learned??"",N.completed??"",N.nextSteps??""])}getBySessionId(N){let E=this.db.get("SELECT * FROM session_summaries WHERE session_id = ?",[N]);return E?this.mapRow(E):null}getRecent(N=10){return this.db.all("SELECT * FROM session_summaries ORDER BY created_at DESC LIMIT ?",[N]).map((E)=>this.mapRow(E))}search(N,E=10){return this.db.all(`SELECT ss.*
584
585
  FROM session_summaries ss
585
586
  JOIN summaries_fts fts ON ss._rowid = fts.rowid
586
587
  WHERE summaries_fts MATCH ?
587
588
  ORDER BY rank
588
- LIMIT ?`,[f,N]).map((O)=>this.mapRow(O))}mapRow(f){return{id:f.id,sessionId:f.session_id,summary:f.summary,keyDecisions:JSON.parse(f.key_decisions),filesModified:JSON.parse(f.files_modified),concepts:JSON.parse(f.concepts),createdAt:f.created_at,tokenCount:f.token_count,request:f.request||void 0,investigated:f.investigated||void 0,learned:f.learned||void 0,completed:f.completed||void 0,nextSteps:f.next_steps||void 0}}}import{randomUUID as qE}from"crypto";var vE=[{version:1,name:"create-user-observations",up:`
589
+ LIMIT ?`,[N,E]).map((f)=>this.mapRow(f))}mapRow(N){return{id:N.id,sessionId:N.session_id,summary:N.summary,keyDecisions:JSON.parse(N.key_decisions),filesModified:JSON.parse(N.files_modified),concepts:JSON.parse(N.concepts),createdAt:N.created_at,tokenCount:N.token_count,request:N.request||void 0,investigated:N.investigated||void 0,learned:N.learned||void 0,completed:N.completed||void 0,nextSteps:N.next_steps||void 0}}}import{randomUUID as uO}from"crypto";var gO=[{version:1,name:"create-user-observations",up:`
589
590
  CREATE TABLE IF NOT EXISTS user_observations (
590
591
  _rowid INTEGER PRIMARY KEY AUTOINCREMENT,
591
592
  id TEXT UNIQUE NOT NULL,
@@ -656,17 +657,23 @@ ${J}`}return V}guide(){return["open-mem workflow:","1) Use mem-find to find cand
656
657
  new.facts, new.concepts, new.files_read, new.files_modified
657
658
  );
658
659
  END;
659
- `}];class q1{db;constructor(f){let N=xE(f);this.db=l0(N),this.initializeUserSchema()}initializeUserSchema(){this.db.migrate(vE)}get database(){return this.db}close(){this.db.close()}}class v1{db;constructor(f){this.db=f}create(f){let N=qE(),O=new Date().toISOString();return this.db.run(`INSERT INTO user_observations
660
+ `}];class l1{db;constructor(N){let E=mO(N);this.db=l0(E),this.initializeUserSchema()}initializeUserSchema(){this.db.migrate(gO)}get database(){return this.db}close(){this.db.close()}}class b1{db;constructor(N){this.db=N}create(N){let E=uO(),f=new Date().toISOString();return this.db.run(`INSERT INTO user_observations
660
661
  (id, type, title, subtitle, facts, narrative,
661
662
  concepts, files_read, files_modified, tool_name,
662
663
  created_at, token_count, importance, source_project)
663
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[N,f.type,f.title,f.subtitle,JSON.stringify(f.facts),f.narrative,JSON.stringify(f.concepts),JSON.stringify(f.filesRead),JSON.stringify(f.filesModified),f.toolName,O,f.tokenCount,f.importance??3,f.sourceProject]),{...f,id:N,createdAt:O,importance:f.importance??3}}search(f){try{let N=`
664
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[E,N.type,N.title,N.subtitle,JSON.stringify(N.facts),N.narrative,JSON.stringify(N.concepts),JSON.stringify(N.filesRead),JSON.stringify(N.filesModified),N.toolName,f,N.tokenCount,N.importance??3,N.sourceProject]),{...N,id:E,createdAt:f,importance:N.importance??3}}search(N){try{let E=`
664
665
  SELECT o.*, rank
665
666
  FROM user_observations o
666
667
  JOIN user_observations_fts fts ON o._rowid = fts.rowid
667
668
  WHERE user_observations_fts MATCH ?
668
- `,O=[f.query];if(f.sourceProject)N+=" AND o.source_project = ?",O.push(f.sourceProject);return N+=" ORDER BY rank LIMIT ?",O.push(f.limit??10),this.db.all(N,O).map((E)=>({observation:this.mapRow(E),rank:E.rank}))}catch{return[]}}getIndex(f,N){let O=`SELECT id, type, title, token_count, created_at, importance, source_project
669
- FROM user_observations`,E=[];if(N)O+=" WHERE source_project = ?",E.push(N);return O+=" ORDER BY created_at DESC LIMIT ?",E.push(f??20),this.db.all(O,E).map((M)=>({id:M.id,sessionId:"",type:M.type,title:M.title,tokenCount:M.token_count,discoveryTokens:0,createdAt:M.created_at,importance:M.importance??3}))}getById(f){let N=this.db.get("SELECT * FROM user_observations WHERE id = ?",[f]);return N?this.mapRow(N):null}delete(f){return this.db.all("DELETE FROM user_observations WHERE id = ? RETURNING id",[f]).length>0}mapRow(f){return{id:f.id,type:f.type,title:f.title,subtitle:f.subtitle,facts:JSON.parse(f.facts),narrative:f.narrative,concepts:JSON.parse(f.concepts),filesRead:JSON.parse(f.files_read),filesModified:JSON.parse(f.files_modified),toolName:f.tool_name,createdAt:f.created_at,tokenCount:f.token_count,importance:f.importance??3,sourceProject:f.source_project}}}function xE(f){if(f.startsWith("~/")){let N=process.env.HOME||process.env.USERPROFILE||"";if(!N)throw Error("Cannot resolve user DB path: HOME environment variable is not set");let O=`${N}${f.slice(1)}`,E=O.substring(0,O.lastIndexOf("/"));return u("fs").mkdirSync(E,{recursive:!0}),O}return f}import{EventEmitter as gE}from"events";function EN(){return new gE}function c0(f,N=""){if(!f)return f;return f.replace(/<private>[\s\S]*?<\/private>/gi,N)}var MN=200,uE=/(\([\s\S]*[+*]\)\s*[+*?])|(\(\.\*\)\+)|(\(\.\+\)\+)/;function h0(f,N,O="[REDACTED]"){if(!f||N.length===0)return f;let E=f;for(let M of N){if(M.length>MN){console.warn(`[open-mem] Skipping oversized redaction pattern (${M.length} chars, max ${MN})`);continue}if(uE.test(M)){console.warn("[open-mem] Skipping potentially dangerous redaction pattern (nested quantifiers detected)");continue}try{E=E.replace(new RegExp(M,"g"),O)}catch{}}return E}var mE=20,AN=2000,$N=60;function lE(f){return typeof f==="object"&&f!==null&&"text"in f&&typeof f.text==="string"}function cE(f){let N=[];for(let O of f)if(typeof O==="string")N.push(O);else if(lE(O))N.push(O.text);return N.join(`
670
- `).trim()}function hE(f){let N=f.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter((O)=>O.length>4);return[...new Set(N)].slice(0,5)}function bE(f){let{observations:N,sessions:O,projectPath:E,sessionId:M,text:A,agent:S,sensitivePatterns:$=[]}=f;if(S!==void 0&&S!=="user")return!1;let _=h0(c0(A),$);if(_.length<mE)return!1;O.getOrCreate(M,E);let J=`User request: ${_.length>$N?`${_.slice(0,$N)}...`:_}`,Q=_.length>AN?`${_.slice(0,AN)}...`:_;return N.create({sessionId:M,type:"discovery",title:J,subtitle:"",facts:[],narrative:Q,concepts:hE(_),filesRead:[],filesModified:[],rawToolOutput:"",toolName:"chat.message",tokenCount:Math.ceil(Q.length/4),discoveryTokens:0,importance:3}),!0}function SN(f,N,O,E=[]){return async(M,A)=>{try{let{sessionID:S,agent:$}=M;if($!==void 0&&$!=="user")return;let _=cE(A.parts);bE({observations:f,sessions:N,projectPath:O,sessionId:S,text:_,agent:$,sensitivePatterns:E})}catch(S){console.error("[open-mem] Chat capture error:",S)}}}function _N(f,N,O,E,M,A){return async(S,$)=>{try{if(!f.contextInjectionEnabled)return;let _=O.getRecent(M,3),V=_.map((D)=>D.summaryId?E.getBySessionId(D.id):null).filter((D)=>D!==null),J=N.getIndex(M,10);if(V.length===0&&J.length===0)return;let Q=s(_,V,J,Math.floor(f.maxContextTokens/2)),W=T0(Q);if(f.userMemoryEnabled&&A){let D=A.getIndex(10),L=P0(D,Math.floor(f.userMemoryMaxContextTokens/2));if(L)W+=L}$.context.push(W)}catch(_){console.error("[open-mem] Compaction hook error:",_)}}}function VN(f,N,O,E,M,A){return async(S,$)=>{try{if(!f.contextInjectionEnabled)return;let _=O.getRecent(M,5);if(_.length===0)return;let V=_.map((Z)=>Z.summaryId?E.getBySessionId(Z.id):null).filter((Z)=>Z!==null),J=N.getIndex(M,f.maxObservations);if(V.length===0&&J.length===0)return;let W=J.slice(0,f.contextFullObservationCount).map((Z)=>Z.id).map((Z)=>N.getById(Z)).filter((Z)=>Z!==null),D=s(_,V,J,f.maxContextTokens,W),L={showTokenCosts:f.contextShowTokenCosts,observationTypes:f.contextObservationTypes,fullObservationCount:f.contextFullObservationCount,showLastSummary:f.contextShowLastSummary},K=I0(D,L);if(f.userMemoryEnabled&&A){let Z=A.getIndex(f.maxObservations),C=k0(Z,f.userMemoryMaxContextTokens);if(C)K+=`
671
-
672
- ${C}`}$.system.push(K)}catch(_){console.error("[open-mem] Context injection error:",_)}}}function JN(f,N,O){if(f.retentionDays===0)return;try{let E=N.deleteOlderThan(f.retentionDays),M=O.deleteCompletedOlderThan(f.retentionDays);if(E>0||M>0)console.log(`[open-mem] Retention: deleted ${E} observations, ${M} pending messages`)}catch(E){console.error("[open-mem] Retention enforcement error:",E)}}async function nE(f,N,O){let{queue:E,sessions:M,projectPath:A,config:S,observations:$,pendingMessages:_}=f;switch(N){case"session.created":{if(O)M.getOrCreate(O,A);try{JN(S,$,_)}catch(V){console.error("[open-mem] Retention enforcement error:",V)}break}case"session.idle":{if(E.processBatch().catch((V)=>{console.error("[open-mem] Background processing error:",V)}),O)M.updateStatus(O,"idle"),QN(O,A,S,$).catch((V)=>{console.error("[open-mem] Folder context error:",V)});break}case"session.completed":case"session.ended":{if(O)await E.processBatch(),await E.summarizeSession(O),M.markCompleted(O),await QN(O,A,S,$);break}}}function WN(f,N,O,E,M,A){return async(S)=>{try{let{event:$}=S,_=$.properties.sessionID,V=typeof _==="string"?_:void 0;if($.type==="session.created"||$.type==="session.idle"||$.type==="session.completed"||$.type==="session.ended")await nE({queue:f,sessions:N,projectPath:O,config:E,observations:M,pendingMessages:A},$.type,V)}catch($){console.error("[open-mem] Event handler error:",$)}}}async function QN(f,N,O,E){if(!O.folderContextEnabled)return;try{let M=E.getBySession(f);if(M.length>0)await v0(N,M,O.folderContextMaxDepth)}catch(M){console.error("[open-mem] Folder context update error:",M)}}function pE(f){let{config:N,queue:O,sessions:E,projectPath:M,tool:A,sessionId:S,callId:$,toolOutput:_}=f;if(N.ignoredTools.includes(A))return!1;if(!_||_.length<N.minOutputLength)return!1;let V=h0(_,N.sensitivePatterns);return V=c0(V,"[PRIVATE]"),E.getOrCreate(S,M),O.enqueue(S,A,V,$),!0}function DN(f,N,O,E){return async(M,A)=>{try{let{tool:S,sessionID:$,callID:_}=M,{output:V}=A;pE({config:f,queue:N,sessions:O,projectPath:E,tool:S,sessionId:$,callId:_,toolOutput:V})}catch(S){console.error("[open-mem] Tool capture error:",S)}}}class x1{config;compressor;summarizer;pendingRepo;observationRepo;sessionRepo;summaryRepo;embeddingModel;conflictEvaluator;entityExtractor;entityRepo;observer;processing=!1;timer=null;mode="in-process";onEnqueue=null;constructor(f,N,O,E,M,A,S,$=null,_=null,V=null,J=null,Q=null){this.config=f;this.compressor=N;this.summarizer=O;this.pendingRepo=E;this.observationRepo=M;this.sessionRepo=A;this.summaryRepo=S;this.embeddingModel=$;this.conflictEvaluator=_;this.entityExtractor=V;this.entityRepo=J;this.observer=Q}setMode(f){if(this.mode=f,f==="enqueue-only")this.stop()}getMode(){return this.mode}setOnEnqueue(f){this.onEnqueue=f}enqueue(f,N,O,E){if(this.pendingRepo.create({sessionId:f,toolName:N,toolOutput:O,callId:E}),this.observer?.onEnqueue?.({sessionId:f,toolName:N,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 f=0,N=0,O=Date.now();try{this.pendingRepo.resetStale(5);let E=this.pendingRepo.getPending(this.config.batchSize);if(this.observer?.onBatchStart?.({pending:E.length,mode:this.mode,startedAt:new Date(O).toISOString()}),E.length===0)return 0;for(let M of E)try{this.pendingRepo.markProcessing(M.id);let S=await this.compressor.compress(M.toolName,M.toolOutput)??this.compressor.createFallbackObservation(M.toolName,M.toolOutput),$=!1,_=null;if(this.embeddingModel)try{let J=I1({title:S.title,narrative:S.narrative,concepts:S.concepts}),Q=await i(this.embeddingModel,J);if(Q){let W=this.config.conflictResolutionEnabled&&this.conflictEvaluator,D=this.config.conflictSimilarityBandLow??0.7,L=this.config.conflictSimilarityBandHigh??0.92;if(W){let K=this.observationRepo.findSimilar(Q,S.type,D,5),Z=K.find((C)=>C.similarity>L);if(Z)console.log(`[open-mem] Dedup: skipping duplicate of ${Z.id} (similarity: ${Z.similarity.toFixed(3)})`),$=!0;else{let C=K.filter((y)=>y.similarity>=D&&y.similarity<=L);if(C.length>0)try{let y=C.map((F)=>{let G=this.observationRepo.getById(F.id);return G?{id:G.id,title:G.title,narrative:G.narrative,concepts:G.concepts,type:G.type}:null}).filter((F)=>F!==null);if(y.length>0&&this.conflictEvaluator){let F=await this.conflictEvaluator.evaluate({title:S.title,narrative:S.narrative,concepts:S.concepts,type:S.type},y);if(F&&F.outcome==="duplicate")console.log(`[open-mem] Conflict eval: duplicate (${F.reason})`),$=!0;else if(F&&F.outcome==="update"&&F.supersedesId)console.log(`[open-mem] Conflict eval: update supersedes ${F.supersedesId} (${F.reason})`),_=F.supersedesId}}catch{}}}else{let K=this.observationRepo.findSimilar(Q,S.type,0.92,1);if(K.length>0)console.log(`[open-mem] Dedup: skipping duplicate of ${K[0].id} (similarity: ${K[0].similarity.toFixed(3)})`),$=!0}}}catch{}if($){this.pendingRepo.markCompleted(M.id);continue}let V=this.observationRepo.create({sessionId:M.sessionId,type:S.type,title:S.title,subtitle:S.subtitle,facts:S.facts,narrative:S.narrative,concepts:S.concepts,filesRead:S.filesRead,filesModified:S.filesModified,rawToolOutput:M.toolOutput,toolName:M.toolName,tokenCount:H(`${S.title} ${S.narrative} ${S.facts.join(" ")}`),discoveryTokens:S.discoveryTokens??H(M.toolOutput),importance:S.importance??3});if(this.embeddingModel)try{let J=I1({title:V.title,narrative:V.narrative,concepts:V.concepts}),Q=await i(this.embeddingModel,J);if(Q)this.observationRepo.setEmbedding(V.id,Q)}catch{}if(_)try{this.observationRepo.supersede(_,V.id),console.log(`[open-mem] Superseded observation ${_} with ${V.id}`)}catch(J){console.error(`[open-mem] Failed to supersede ${_}:`,J)}if(this.config.entityExtractionEnabled&&this.entityExtractor&&this.entityRepo)try{let J=await this.entityExtractor.extract({title:V.title,narrative:V.narrative,concepts:V.concepts,facts:V.facts,filesRead:V.filesRead,filesModified:V.filesModified,type:V.type});if(J){let Q=new Map;for(let W of J.entities){let D=this.entityRepo.upsertEntity(W.name,W.entityType);Q.set(W.name,D.id),this.entityRepo.linkObservation(D.id,V.id)}for(let W of J.relations){let D=Q.get(W.sourceName),L=Q.get(W.targetName);if(D&&L)this.entityRepo.createRelation(D,L,W.relationship,V.id)}}}catch{}this.sessionRepo.incrementObservationCount(M.sessionId),this.pendingRepo.markCompleted(M.id),f++}catch(A){this.pendingRepo.markFailed(M.id,String(A)),N++,this.observer?.onItemFailed?.({pendingId:M.id,error:String(A),failedAt:new Date().toISOString()})}return f}finally{this.observer?.onBatchEnd?.({processed:f,failed:N,durationMs:Date.now()-O,finishedAt:new Date().toISOString()}),this.processing=!1}}async summarizeSession(f){let N=this.observationRepo.getBySession(f);if(!this.summarizer.shouldSummarize(N.length))return;if(this.summaryRepo.getBySessionId(f))return;let E=await this.summarizer.summarize(f,N);if(!E)return;let M=this.summaryRepo.create({sessionId:f,summary:E.summary,keyDecisions:E.keyDecisions,filesModified:E.filesModified,concepts:E.concepts,tokenCount:H(E.summary)});this.sessionRepo.setSummary(f,M.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}}}class g1{startedAtMs=Date.now();enqueueCount=0;totalBatches=0;processedItems=0;failedItems=0;totalBatchDurationMs=0;lastBatchDurationMs=0;lastProcessedAt=null;lastFailedAt=null;lastError=null;createQueueObserver(){return{onEnqueue:()=>{this.enqueueCount+=1},onBatchEnd:(f)=>{if(this.totalBatches+=1,this.processedItems+=f.processed,this.failedItems+=f.failed,this.totalBatchDurationMs+=f.durationMs,this.lastBatchDurationMs=f.durationMs,f.processed>0)this.lastProcessedAt=f.finishedAt},onItemFailed:(f)=>{this.lastFailedAt=f.failedAt,this.lastError=f.error}}}snapshot(f){return{startedAt:new Date(this.startedAtMs).toISOString(),uptimeMs:Date.now()-this.startedAtMs,enqueueCount:this.enqueueCount,batches:{total:this.totalBatches,processedItems:this.processedItems,failedItems:this.failedItems,avgDurationMs:this.totalBatches>0?Math.round(this.totalBatchDurationMs/this.totalBatches):0},queue:{...f,lastBatchDurationMs:this.lastBatchDurationMs,lastProcessedAt:this.lastProcessedAt,lastFailedAt:this.lastFailedAt,lastError:this.lastError}}}}function XN(f){return{start:()=>f.start(),stop:()=>{f.setOnEnqueue(null),f.stop()},setInProcess:()=>{f.setMode("in-process"),f.start()},setEnqueueOnly:(N)=>{f.setMode("enqueue-only"),f.setOnEnqueue(N)}}}function N0(f,N){if(N.type&&f.type!==N.type)return!1;if(N.importanceMin!==void 0&&f.importance<N.importanceMin)return!1;if(N.importanceMax!==void 0&&f.importance>N.importanceMax)return!1;if(N.createdAfter&&f.createdAt<N.createdAfter)return!1;if(N.createdBefore&&f.createdAt>N.createdBefore)return!1;if(N.concepts&&N.concepts.length>0){if(!N.concepts.some((E)=>f.concepts.some((M)=>M.toLowerCase().includes(E.toLowerCase()))))return!1}if(N.files&&N.files.length>0){let O=[...f.filesRead,...f.filesModified];if(!N.files.some((M)=>O.some((A)=>A.toLowerCase().includes(M.toLowerCase()))))return!1}return!0}async function BN(f,N,O,E,M){if(!f.trim())return N;let A=iE(f),S=new Set;for(let V of A){let J=O.findByName(V);for(let Q of J){let W=O.traverseRelations(Q.id,1);for(let D of W){let L=O.getObservationsForEntity(D);for(let K of L)S.add(K)}}}if(S.size===0)return N;let $=new Set(N.map((V)=>V.observation.id)),_=[];for(let V of S){if($.has(V))continue;let J=E.getById(V);if(!J)continue;if(J.supersededBy)continue;_.push({observation:J,rank:0,snippet:J.title,source:"project",rankingSource:"graph",explain:{strategy:"hybrid",matchedBy:["graph"]}})}return[...N,..._].slice(0,M)}function iE(f){let N=f.split(/\s+/).filter((E)=>E.length>=2),O=[];for(let E of N)O.push(E);for(let E=0;E<N.length-1;E++)O.push(`${N[E]} ${N[E+1]}`);return O}var KN=60;async function RN(f,N,O,E){let M=E.limit??10,A=rE(N,f,E,M);if(!O)return A;let S=await i(O,f);if(!S)return A;let $=A.map((V)=>V.observation.id),_=dE(N,S,E.projectPath,E,M,E.hasVectorExtension??!1,$);if(_.length===0)return A;return sE(A,_,M)}function rE(f,N,O,E){try{return f.search({query:N,type:O.type,limit:E,projectPath:O.projectPath,importanceMin:O.importanceMin,importanceMax:O.importanceMax,createdAfter:O.createdAfter,createdBefore:O.createdBefore,concepts:O.concepts,files:O.files})}catch{return[]}}function dE(f,N,O,E,M,A,S){if(A)return tE(f,N,E,M,S);return aE(f,N,O,E,M)}function tE(f,N,O,E,M){try{let A;if(M.length>0){if(A=f.searchVecSubset(N,M,E*3),A.length===0)A=f.getVecEmbeddingMatches(N,E*3)}else A=f.getVecEmbeddingMatches(N,E*3);if(A.length===0)return[];let S=[];for(let{observationId:$,distance:_}of A){if(S.length>=E)break;let V=f.getById($);if(!V)continue;if(!N0(V,O))continue;S.push({observation:V,rank:_-1,snippet:V.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:_}})}return S}catch{return[]}}function aE(f,N,O,E,M){let A=f.getWithEmbeddings(O,M*10);if(A.length===0)return[];let S=A.map((_)=>({id:_.id,similarity:f0(N,_.embedding)})).filter(({similarity:_})=>_>=0.3).sort((_,V)=>V.similarity-_.similarity),$=[];for(let{id:_,similarity:V}of S){if($.length>=M)break;let J=f.getById(_);if(!J)continue;if(!N0(J,E))continue;$.push({observation:J,rank:-V,snippet:J.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorSimilarity:V}})}return $}function sE(f,N,O){let E=new Map;for(let M=0;M<f.length;M++){let A=f[M],S=1/(KN+M+1);E.set(A.observation.id,{score:S,result:{...A,rankingSource:"fts",explain:{strategy:"hybrid",matchedBy:["fts"],ftsRank:A.rank}}})}for(let M=0;M<N.length;M++){let A=N[M],S=1/(KN+M+1),$=E.get(A.observation.id);if($)$.score+=S,$.result={...$.result,explain:{strategy:"hybrid",matchedBy:["fts","vector"],ftsRank:$.result.explain?.ftsRank??$.result.rank,vectorDistance:A.explain?.vectorDistance,vectorSimilarity:A.explain?.vectorSimilarity}};else E.set(A.observation.id,{score:S,result:{...A,explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:A.explain?.vectorDistance,vectorSimilarity:A.explain?.vectorSimilarity}}})}return[...E.values()].sort((M,A)=>A.score-M.score).slice(0,O).map(({score:M,result:A})=>({...A,explain:{...A.explain??{strategy:"hybrid",matchedBy:[]},strategy:"hybrid",matchedBy:A.explain?.matchedBy??[],rrfScore:M,ftsRank:A.explain?.ftsRank,vectorDistance:A.explain?.vectorDistance,vectorSimilarity:A.explain?.vectorSimilarity}}))}class u1{observations;embeddingModel;hasVectorExtension;reranker;userObservationRepo;entityRepo;constructor(f,N,O,E=null,M=null,A=null){this.observations=f;this.embeddingModel=N;this.hasVectorExtension=O;this.reranker=E;this.userObservationRepo=M;this.entityRepo=A}async search(f,N){let O=N.strategy??"hybrid",E=N.limit??10,M;switch(O){case"filter-only":M=this.filterOnlySearch(f,N,E);break;case"semantic":M=await this.semanticSearch(f,N,E);break;case"hybrid":M=await this.hybridSearchStrategy(f,N,E);break}for(let A of M)A.source="project";if(this.entityRepo&&f.trim())M=await BN(f,M,this.entityRepo,this.observations,E);if(this.userObservationRepo){let A=this.searchUserMemory(f,N,E);M=this.mergeResults(M,A,E)}if(this.reranker&&M.length>1)return this.reranker.rerank(f,M,E);return M}filterOnlySearch(f,N,O){if(N.concept)return this.observations.searchByConcept(N.concept,O,N.projectPath).map((M)=>({observation:M,rank:0,snippet:M.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["concept-filter"]}}));if(N.file)return this.observations.searchByFile(N.file,O,N.projectPath).map((M)=>({observation:M,rank:0,snippet:M.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["file-filter"]}}));return this.observations.search({query:f,type:N.type,limit:O,projectPath:N.projectPath,importanceMin:N.importanceMin,importanceMax:N.importanceMax,createdAfter:N.createdAfter,createdBefore:N.createdBefore,concepts:N.concepts,files:N.files})}async semanticSearch(f,N,O){if(!this.embeddingModel)return this.filterOnlySearch(f,N,O);let E=await i(this.embeddingModel,f);if(!E)return this.filterOnlySearch(f,N,O);if(this.hasVectorExtension)return this.nativeVectorSearch(E,N,O);return this.jsFallbackVectorSearch(E,N,O)}async hybridSearchStrategy(f,N,O){return RN(f,this.observations,this.embeddingModel,{type:N.type,limit:O,projectPath:N.projectPath,hasVectorExtension:this.hasVectorExtension,importanceMin:N.importanceMin,importanceMax:N.importanceMax,createdAfter:N.createdAfter,createdBefore:N.createdBefore,concepts:N.concepts,files:N.files})}nativeVectorSearch(f,N,O){try{let E=this.observations.getVecEmbeddingMatches(f,O*3);if(E.length===0)return[];let M=[];for(let{observationId:A,distance:S}of E){if(M.length>=O)break;let $=this.observations.getById(A);if(!$)continue;if(!N0($,N))continue;M.push({observation:$,rank:S-1,snippet:$.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorDistance:S}})}return M}catch{return[]}}jsFallbackVectorSearch(f,N,O){let E=this.observations.getWithEmbeddings(N.projectPath,O*10);if(E.length===0)return[];let M=E.map((S)=>({id:S.id,similarity:f0(f,S.embedding)})).filter(({similarity:S})=>S>=0.3).sort((S,$)=>$.similarity-S.similarity),A=[];for(let{id:S,similarity:$}of M){if(A.length>=O)break;let _=this.observations.getById(S);if(!_)continue;if(!N0(_,N))continue;A.push({observation:_,rank:-$,snippet:_.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorSimilarity:$}})}return A}searchUserMemory(f,N,O){if(!this.userObservationRepo)return[];try{return this.userObservationRepo.search({query:f,limit:O}).map(({observation:M,rank:A})=>({observation:oE(M),rank:A,snippet:M.title,source:"user",rankingSource:"user-memory",explain:{strategy:"filter-only",matchedBy:["user-memory"]}}))}catch{return[]}}mergeResults(f,N,O){let E=new Set(f.map((S)=>S.observation.id)),M=new Set(f.map((S)=>`${S.observation.title}::${S.observation.narrative}`)),A=N.filter((S)=>{if(E.has(S.observation.id))return!1;let $=`${S.observation.title}::${S.observation.narrative}`;if(M.has($))return!1;return M.add($),!0});return[...f,...A].slice(0,O)}}function oE(f){return{id:f.id,sessionId:"",type:f.type,title:f.title,subtitle:f.subtitle,facts:f.facts,narrative:f.narrative,concepts:f.concepts,filesRead:f.filesRead,filesModified:f.filesModified,rawToolOutput:"",toolName:f.toolName,createdAt:f.createdAt,tokenCount:f.tokenCount,discoveryTokens:0,importance:f.importance}}import{generateText as eE}from"ai";class ZN{languageModel;maxCandidates;provider;modelName;rateLimitingEnabled;_generate=eE;constructor(f,N){this.languageModel=f,this.maxCandidates=N.rerankingMaxCandidates,this.provider=N.provider??"",this.modelName=N.model??"",this.rateLimitingEnabled=N.rateLimitingEnabled??!0}async rerank(f,N,O){if(N.length<=1)return N;let E=N.slice(0,this.maxCandidates),M=N.slice(this.maxCandidates),A=qf(f,E.map(($)=>({title:$.observation.title,narrative:$.observation.narrative}))),S=2;for(let $=0;$<=S;$++)try{if(this.provider==="google")await v(this.modelName,this.rateLimitingEnabled);let{text:_}=await this._generate({model:this.languageModel,maxOutputTokens:512,prompt:A}),V=Hf(_);if(!V)return N.slice(0,O);let J=this.applyReranking(E,V,O);for(let Q of M){if(J.length>=O)break;J.push(Q)}return J}catch(_){if(fM(_)&&$<S){await NM(2**$*1000);continue}return N.slice(0,O)}return N.slice(0,O)}applyReranking(f,N,O){let E=[],M=new Set;for(let A of N)if(A>=0&&A<f.length&&!M.has(A)){if(M.add(A),E.push(f[A]),E.length>=O)break}if(E.length<O){for(let A=0;A<f.length&&E.length<O;A++)if(!M.has(A))E.push(f[A])}return E}}class LN{async rerank(f,N,O){if(N.length<=1)return N.slice(0,O);let E=m1(f),M=N.map((A)=>({result:A,score:this.scoreCandidate(A,E)}));return M.sort((A,S)=>S.score-A.score),M.slice(0,O).map((A)=>A.result)}scoreCandidate(f,N){let O=f.observation,E=m1(O.title),M=m1(O.narrative),A=new Set(O.concepts.map((C)=>C.toLowerCase())),S=0,$=0,_=0;for(let C of N){if(E.has(C))S++;if(M.has(C))$++;if(A.has(C))_++}let V=N.size||1,J=S/V*0.4,Q=$/V*0.3,W=_/V*0.15,L=(Date.now()-new Date(O.createdAt).getTime())/86400000,K=L<1?0.1:L<7?0.05:0,Z=O.importance/5*0.05;return J+Q+W+K+Z}}function UN(f,N){if(!f.rerankingEnabled)return null;if(N)return new ZN(N,f);return new LN}function m1(f){return new Set(f.toLowerCase().split(/[\s\-_./\\,;:!?()[\]{}'"]+/).filter((N)=>N.length>1))}function fM(f){if(typeof f!=="object"||f===null)return!1;let N=f,O=N.status;if(O===429||O===500||O===503)return!0;let E=N.error;if(typeof E==="object"&&E!==null&&E.type==="overloaded_error")return!0;return!1}function NM(f){return new Promise((N)=>setTimeout(N,f))}function YN(f){return f}function CN(f){return f}function zN(f){return f}function FN(f){if(!f)return null;return f}import{spawnSync as jN}from"child_process";import{dirname as OM,resolve as GN}from"path";function EM(f){try{let N=jN("git",["rev-parse","--git-common-dir"],{cwd:f,encoding:"utf-8",timeout:5000});if(N.status!==0||!N.stdout)return null;let O=N.stdout.trim();if(O===".git")return null;let E=jN("git",["rev-parse","--git-dir"],{cwd:f,encoding:"utf-8",timeout:5000});if(E.status!==0||!E.stdout)return null;let M=E.stdout.trim(),A=GN(f,O),S=GN(f,M);if(A===S)return null;let $=OM(A);if($===A||$==="/")return null;return $}catch{return null}}function HN(f){return EM(f)??f}function SM(){try{let N=import.meta.url;if(N&&!N.includes("[eval]")){let O=AM($M(N));return O.endsWith("dist")||O.endsWith("dist/")||O.endsWith("dist\\")?O:r(O,"..","dist")}}catch{}let f=[r(process.env.HOME||"",".config","opencode","node_modules","open-mem","dist"),r(process.cwd(),"node_modules","open-mem","dist")];for(let N of f)if(MM(r(N,"daemon.js")))return N;return r(process.cwd(),"node_modules","open-mem","dist")}async function _M(f){let N=SM(),O=HN(f.directory),E=_0(O),M=Wf(E);for(let g of M)console.warn(`[open-mem] ${g}`);await Df(E),m0.enableExtensionSupport();let A=l0(E.dbPath);ON(A,{hasVectorExtension:A.hasVectorExtension,embeddingDimension:E.embeddingDimension});let S=new P1(A),$=new T1(A),_=new w1(A),V=new k1(A),J=new j1(A),Q=new y1(A),W=null,D=null;if(E.userMemoryEnabled)try{W=new q1(E.userMemoryDbPath),D=new v1(W.database)}catch(g){console.warn(`[open-mem] Failed to initialize user-level memory: ${g}`)}let L=new J0(E),K=new K1(E),Z=E.provider!=="bedrock",C=E.compressionEnabled&&(!Z||E.apiKey)?vf({provider:E.provider,model:E.model,apiKey:E.apiKey}):null,y=new g1,F=E.conflictResolutionEnabled&&(!Z||E.apiKey)?new X1({provider:E.provider,apiKey:E.apiKey,model:E.model,rateLimitingEnabled:E.rateLimitingEnabled}):null,G=E.entityExtractionEnabled&&(!Z||E.apiKey)?new B1({provider:E.provider,apiKey:E.apiKey,model:E.model,rateLimitingEnabled:E.rateLimitingEnabled}):null,D0=new H1(A),x=new x1(E,L,K,V,$,S,_,C,F,G,D0,y.createQueueObserver()),T=XN(x);T.start();let I=()=>{let g=x.getStats(),P=y.snapshot({mode:x.getMode(),running:x.isRunning,processing:g.processing,pending:g.pending});return{status:P.queue.lastError?"degraded":"ok",timestamp:new Date().toISOString(),uptimeMs:P.uptimeMs,queue:P.queue,batches:P.batches,enqueueCount:P.enqueueCount}},b0=UN(E,E.rerankingEnabled&&(!Z||E.apiKey)?q({provider:E.provider,model:E.model,apiKey:E.apiKey}):null),k=new u1($,C,A.hasVectorExtension,b0,D,D0),X0=new Y1({observations:YN($),sessions:CN(S),summaries:zN(_),searchOrchestrator:k,projectPath:O,config:E,userObservationRepo:FN(D),runtimeSnapshotProvider:I,configAuditStore:J,maintenanceHistoryStore:Q}),l1=Ff(X0),m=null,d=null;if(E.daemonEnabled)if(sf(E.dbPath),m=new z1({dbPath:E.dbPath,projectPath:O,daemonScript:r(N,"daemon.js")}),m.start())T.setEnqueueOnly(()=>m?.signal("PROCESS_NOW")),console.log("[open-mem] Background daemon started \u2014 processing delegated"),d=setInterval(()=>{if(m&&!m.isRunning()){if(console.warn("[open-mem] Daemon died, falling back to in-process processing"),T.setInProcess(),d)clearInterval(d),d=null}},30000);else console.warn("[open-mem] Daemon failed to start \u2014 using in-process processing"),m=null;let n0=null,p0=null,B0=null;if(E.dashboardEnabled){p0=EN(),B0=new D1(p0);let g=Yf({config:E,projectPath:O,embeddingModel:C,memoryEngine:X0,runtimeStatusProvider:I,sseHandler:zf(B0),dashboardDir:r(N,"dashboard")}),P=E.dashboardPort,i0=P,c1=!1;for(let O0=0;O0<10;O0++){i0=P+O0;try{n0=Bun.serve({port:i0,hostname:"127.0.0.1",idleTimeout:0,fetch:g.fetch}),c1=!0;break}catch{}}if(c1)console.log(`[open-mem] Dashboard available at http://127.0.0.1:${i0}`);else console.warn(`[open-mem] Could not start dashboard \u2014 ports ${P}-${P+9} all busy`);let IN=p0,TN=$.create.bind($);$.create=(...O0)=>{let h1=TN(...O0);return IN.emit("observation:created",h1),h1}}let yN=()=>{if(d)clearInterval(d);if(m)m.stop();if(T.stop(),n0)n0.stop();if(B0)B0.destroy();if(W)W.close();A.close()};return process.on("beforeExit",yN),{"tool.execute.after":DN(E,x,S,O),"chat.message":SN($,S,O,E.sensitivePatterns),event:WN(x,S,O,E,$,V),"experimental.chat.system.transform":VN(E,$,S,_,O,D),"experimental.session.compacting":_N(E,$,S,_,O,D),tool:{...l1}}}export{_M as default};
669
+ `,f=[N.query];if(N.sourceProject)E+=" AND o.source_project = ?",f.push(N.sourceProject);return E+=" ORDER BY rank LIMIT ?",f.push(N.limit??10),this.db.all(E,f).map((O)=>({observation:this.mapRow(O),rank:O.rank}))}catch{return[]}}getIndex(N,E){let f=`SELECT id, type, title, token_count, created_at, importance, source_project
670
+ FROM user_observations`,O=[];if(E)f+=" WHERE source_project = ?",O.push(E);return f+=" ORDER BY created_at DESC LIMIT ?",O.push(N??20),this.db.all(f,O).map((M)=>({id:M.id,sessionId:"",type:M.type,title:M.title,tokenCount:M.token_count,discoveryTokens:0,createdAt:M.created_at,importance:M.importance??3}))}getById(N){let E=this.db.get("SELECT * FROM user_observations WHERE id = ?",[N]);return E?this.mapRow(E):null}delete(N){return this.db.all("DELETE FROM user_observations WHERE id = ? RETURNING id",[N]).length>0}mapRow(N){return{id:N.id,type:N.type,title:N.title,subtitle:N.subtitle,facts:JSON.parse(N.facts),narrative:N.narrative,concepts:JSON.parse(N.concepts),filesRead:JSON.parse(N.files_read),filesModified:JSON.parse(N.files_modified),toolName:N.tool_name,createdAt:N.created_at,tokenCount:N.token_count,importance:N.importance??3,sourceProject:N.source_project}}}function mO(N){if(N.startsWith("~/")){let E=process.env.HOME||process.env.USERPROFILE||"";if(!E)throw Error("Cannot resolve user DB path: HOME environment variable is not set");let f=`${E}${N.slice(1)}`,O=f.substring(0,f.lastIndexOf("/"));return g("fs").mkdirSync(O,{recursive:!0}),f}return N}import{EventEmitter as hO}from"events";function UE(){return new hO}function b0(N,E=""){if(!N)return N;return N.replace(/<private>[\s\S]*?<\/private>/gi,E)}var BE=200,cO=/(\([\s\S]*[+*]\)\s*[+*?])|(\(\.\*\)\+)|(\(\.\+\)\+)/;function p0(N,E,f="[REDACTED]"){if(!N||E.length===0)return N;let O=N;for(let M of E){if(M.length>BE){console.warn(`[open-mem] Skipping oversized redaction pattern (${M.length} chars, max ${BE})`);continue}if(cO.test(M)){console.warn("[open-mem] Skipping potentially dangerous redaction pattern (nested quantifiers detected)");continue}try{O=O.replace(new RegExp(M,"g"),f)}catch{}}return O}var lO=20,KE=2000,ZE=60;function bO(N){return typeof N==="object"&&N!==null&&"text"in N&&typeof N.text==="string"}function pO(N){let E=[];for(let f of N)if(typeof f==="string")E.push(f);else if(bO(f))E.push(f.text);return E.join(`
671
+ `).trim()}function nO(N){let E=N.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter((f)=>f.length>4);return[...new Set(E)].slice(0,5)}function rO(N){let{observations:E,sessions:f,projectPath:O,sessionId:M,text:A,agent:S,sensitivePatterns:$=[]}=N;if(S!==void 0&&S!=="user")return!1;let _=p0(b0(A),$);if(_.length<lO)return!1;f.getOrCreate(M,O);let J=`User request: ${_.length>ZE?`${_.slice(0,ZE)}...`:_}`,Q=_.length>KE?`${_.slice(0,KE)}...`:_;return E.create({sessionId:M,type:"discovery",title:J,subtitle:"",facts:[],narrative:Q,concepts:nO(_),filesRead:[],filesModified:[],rawToolOutput:"",toolName:"chat.message",tokenCount:Math.ceil(Q.length/4),discoveryTokens:0,importance:3}),!0}function RE(N,E,f,O=[]){return async(M,A)=>{try{let{sessionID:S,agent:$}=M;if($!==void 0&&$!=="user")return;let _=pO(A.parts);rO({observations:N,sessions:E,projectPath:f,sessionId:S,text:_,agent:$,sensitivePatterns:O})}catch(S){console.error("[open-mem] Chat capture error:",S)}}}function LE(N,E,f,O,M,A){return async(S,$)=>{try{if(!N.contextInjectionEnabled)return;let _=f.getRecent(M,3),V=_.map((D)=>D.summaryId?O.getBySessionId(D.id):null).filter((D)=>D!==null),J=E.getIndex(M,10);if(V.length===0&&J.length===0)return;let Q=s(_,V,J,Math.floor(N.maxContextTokens/2)),W=w0(Q);if(N.userMemoryEnabled&&A){let D=A.getIndex(10),Z=q0(D,Math.floor(N.userMemoryMaxContextTokens/2));if(Z)W+=Z}$.context.push(W)}catch(_){console.error("[open-mem] Compaction hook error:",_)}}}function YE(N,E,f,O,M,A){return async(S,$)=>{try{if(!N.contextInjectionEnabled)return;let _=f.getRecent(M,5);if(_.length===0)return;let V=_.map((B)=>B.summaryId?O.getBySessionId(B.id):null).filter((B)=>B!==null),J=E.getIndex(M,N.maxObservations);if(V.length===0&&J.length===0)return;let W=J.slice(0,N.contextFullObservationCount).map((B)=>B.id).map((B)=>E.getById(B)).filter((B)=>B!==null),D=s(_,V,J,N.maxContextTokens,W),Z={showTokenCosts:N.contextShowTokenCosts,observationTypes:N.contextObservationTypes,fullObservationCount:N.contextFullObservationCount,showLastSummary:N.contextShowLastSummary},X=k0(D,Z);if(N.userMemoryEnabled&&A){let B=A.getIndex(N.maxObservations),Y=P0(B,N.userMemoryMaxContextTokens);if(Y)X+=`
672
+
673
+ ${Y}`}$.system.push(X)}catch(_){console.error("[open-mem] Context injection error:",_)}}}import{existsSync as iO}from"fs";import{readFile as dO,writeFile as aO}from"fs/promises";import{join as tO}from"path";function CE(N,E,f){if(N.retentionDays===0)return;try{let O=E.deleteOlderThan(N.retentionDays),M=f.deleteCompletedOlderThan(N.retentionDays);if(O>0||M>0)console.log(`[open-mem] Retention: deleted ${O} observations, ${M} pending messages`)}catch(O){console.error("[open-mem] Retention enforcement error:",O)}}async function sO(N,E,f){let{queue:O,sessions:M,projectPath:A,config:S,observations:$,pendingMessages:_}=N;switch(E){case"session.created":{if(f)M.getOrCreate(f,A);try{CE(S,$,_)}catch(V){console.error("[open-mem] Retention enforcement error:",V)}try{await oO(A)}catch(V){console.error("[open-mem] Gitignore entry error:",V)}break}case"session.idle":{if(O.processBatch().catch((V)=>{console.error("[open-mem] Background processing error:",V)}),f)M.updateStatus(f,"idle"),zE(f,A,S,$).catch((V)=>{console.error("[open-mem] Folder context error:",V)});break}case"session.completed":case"session.ended":{if(f)await O.processBatch(),await O.summarizeSession(f),M.markCompleted(f),await zE(f,A,S,$);break}}}function GE(N,E,f,O,M,A){return async(S)=>{try{let{event:$}=S,_=$.properties.sessionID,V=typeof _==="string"?_:void 0;if($.type==="session.created"||$.type==="session.idle"||$.type==="session.completed"||$.type==="session.ended")await sO({queue:N,sessions:E,projectPath:f,config:O,observations:M,pendingMessages:A},$.type,V)}catch($){console.error("[open-mem] Event handler error:",$)}}}async function zE(N,E,f,O){if(!f.folderContextEnabled)return;try{let M=O.getBySession(N);if(M.length>0)await u0(E,M,{mode:f.folderContextMode,filename:f.folderContextFilename,maxDepth:f.folderContextMaxDepth})}catch(M){console.error("[open-mem] Folder context update error:",M)}}async function oO(N){let E=tO(N,".gitignore");if(!iO(E))return;let f=await dO(E,"utf-8");if(f.includes("AGENTS.md"))return;let O=`
674
+ # open-mem: Auto-generated folder context files.
675
+ # Uncomment to exclude from version control (recommended for large projects):
676
+ # **/AGENTS.md
677
+ `;await aO(E,f.endsWith(`
678
+ `)?f+O:`${f}
679
+ ${O}`,"utf-8")}function eO(N){let{config:E,queue:f,sessions:O,projectPath:M,tool:A,sessionId:S,callId:$,toolOutput:_}=N;if(E.ignoredTools.includes(A))return!1;if(!_||_.length<E.minOutputLength)return!1;let V=p0(_,E.sensitivePatterns);return V=b0(V,"[PRIVATE]"),O.getOrCreate(S,M),f.enqueue(S,A,V,$),!0}function FE(N,E,f,O){return async(M,A)=>{try{let{tool:S,sessionID:$,callID:_}=M,{output:V}=A;eO({config:N,queue:E,sessions:f,projectPath:O,tool:S,sessionId:$,callId:_,toolOutput:V})}catch(S){console.error("[open-mem] Tool capture error:",S)}}}class p1{config;compressor;summarizer;pendingRepo;observationRepo;sessionRepo;summaryRepo;embeddingModel;conflictEvaluator;entityExtractor;entityRepo;observer;processing=!1;timer=null;mode="in-process";onEnqueue=null;constructor(N,E,f,O,M,A,S,$=null,_=null,V=null,J=null,Q=null){this.config=N;this.compressor=E;this.summarizer=f;this.pendingRepo=O;this.observationRepo=M;this.sessionRepo=A;this.summaryRepo=S;this.embeddingModel=$;this.conflictEvaluator=_;this.entityExtractor=V;this.entityRepo=J;this.observer=Q}setMode(N){if(this.mode=N,N==="enqueue-only")this.stop()}getMode(){return this.mode}setOnEnqueue(N){this.onEnqueue=N}enqueue(N,E,f,O){if(this.pendingRepo.create({sessionId:N,toolName:E,toolOutput:f,callId:O}),this.observer?.onEnqueue?.({sessionId:N,toolName:E,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 N=0,E=0,f=Date.now();try{this.pendingRepo.resetStale(5);let O=this.pendingRepo.getPending(this.config.batchSize);if(this.observer?.onBatchStart?.({pending:O.length,mode:this.mode,startedAt:new Date(f).toISOString()}),O.length===0)return 0;for(let M of O)try{this.pendingRepo.markProcessing(M.id);let S=await this.compressor.compress(M.toolName,M.toolOutput)??this.compressor.createFallbackObservation(M.toolName,M.toolOutput),$=!1,_=null;if(this.embeddingModel)try{let J=u1({title:S.title,narrative:S.narrative,concepts:S.concepts}),Q=await r(this.embeddingModel,J);if(Q){let W=this.config.conflictResolutionEnabled&&this.conflictEvaluator,D=this.config.conflictSimilarityBandLow??0.7,Z=this.config.conflictSimilarityBandHigh??0.92;if(W){let X=this.observationRepo.findSimilar(Q,S.type,D,5),B=X.find((Y)=>Y.similarity>Z);if(B)console.log(`[open-mem] Dedup: skipping duplicate of ${B.id} (similarity: ${B.similarity.toFixed(3)})`),$=!0;else{let Y=X.filter((y)=>y.similarity>=D&&y.similarity<=Z);if(Y.length>0)try{let y=Y.map((G)=>{let H=this.observationRepo.getById(G.id);return H?{id:H.id,title:H.title,narrative:H.narrative,concepts:H.concepts,type:H.type}:null}).filter((G)=>G!==null);if(y.length>0&&this.conflictEvaluator){let G=await this.conflictEvaluator.evaluate({title:S.title,narrative:S.narrative,concepts:S.concepts,type:S.type},y);if(G&&G.outcome==="duplicate")console.log(`[open-mem] Conflict eval: duplicate (${G.reason})`),$=!0;else if(G&&G.outcome==="update"&&G.supersedesId)console.log(`[open-mem] Conflict eval: update supersedes ${G.supersedesId} (${G.reason})`),_=G.supersedesId}}catch{}}}else{let X=this.observationRepo.findSimilar(Q,S.type,0.92,1);if(X.length>0)console.log(`[open-mem] Dedup: skipping duplicate of ${X[0].id} (similarity: ${X[0].similarity.toFixed(3)})`),$=!0}}}catch{}if($){this.pendingRepo.markCompleted(M.id);continue}let V=this.observationRepo.create({sessionId:M.sessionId,type:S.type,title:S.title,subtitle:S.subtitle,facts:S.facts,narrative:S.narrative,concepts:S.concepts,filesRead:S.filesRead,filesModified:S.filesModified,rawToolOutput:M.toolOutput,toolName:M.toolName,tokenCount:j(`${S.title} ${S.narrative} ${S.facts.join(" ")}`),discoveryTokens:S.discoveryTokens??j(M.toolOutput),importance:S.importance??3});if(this.embeddingModel)try{let J=u1({title:V.title,narrative:V.narrative,concepts:V.concepts}),Q=await r(this.embeddingModel,J);if(Q)this.observationRepo.setEmbedding(V.id,Q)}catch{}if(_)try{this.observationRepo.supersede(_,V.id),console.log(`[open-mem] Superseded observation ${_} with ${V.id}`)}catch(J){console.error(`[open-mem] Failed to supersede ${_}:`,J)}if(this.config.entityExtractionEnabled&&this.entityExtractor&&this.entityRepo)try{let J=await this.entityExtractor.extract({title:V.title,narrative:V.narrative,concepts:V.concepts,facts:V.facts,filesRead:V.filesRead,filesModified:V.filesModified,type:V.type});if(J){let Q=new Map;for(let W of J.entities){let D=this.entityRepo.upsertEntity(W.name,W.entityType);Q.set(W.name,D.id),this.entityRepo.linkObservation(D.id,V.id)}for(let W of J.relations){let D=Q.get(W.sourceName),Z=Q.get(W.targetName);if(D&&Z)this.entityRepo.createRelation(D,Z,W.relationship,V.id)}}}catch{}this.sessionRepo.incrementObservationCount(M.sessionId),this.pendingRepo.markCompleted(M.id),N++}catch(A){this.pendingRepo.markFailed(M.id,String(A)),E++,this.observer?.onItemFailed?.({pendingId:M.id,error:String(A),failedAt:new Date().toISOString()})}return N}finally{this.observer?.onBatchEnd?.({processed:N,failed:E,durationMs:Date.now()-f,finishedAt:new Date().toISOString()}),this.processing=!1}}async summarizeSession(N){let E=this.observationRepo.getBySession(N);if(!this.summarizer.shouldSummarize(E.length))return;if(this.summaryRepo.getBySessionId(N))return;let O=await this.summarizer.summarize(N,E);if(!O)return;let M=this.summaryRepo.create({sessionId:N,summary:O.summary,keyDecisions:O.keyDecisions,filesModified:O.filesModified,concepts:O.concepts,tokenCount:j(O.summary)});this.sessionRepo.setSummary(N,M.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}}}class n1{startedAtMs=Date.now();enqueueCount=0;totalBatches=0;processedItems=0;failedItems=0;totalBatchDurationMs=0;lastBatchDurationMs=0;lastProcessedAt=null;lastFailedAt=null;lastError=null;createQueueObserver(){return{onEnqueue:()=>{this.enqueueCount+=1},onBatchEnd:(N)=>{if(this.totalBatches+=1,this.processedItems+=N.processed,this.failedItems+=N.failed,this.totalBatchDurationMs+=N.durationMs,this.lastBatchDurationMs=N.durationMs,N.processed>0)this.lastProcessedAt=N.finishedAt},onItemFailed:(N)=>{this.lastFailedAt=N.failedAt,this.lastError=N.error}}}snapshot(N){return{startedAt:new Date(this.startedAtMs).toISOString(),uptimeMs:Date.now()-this.startedAtMs,enqueueCount:this.enqueueCount,batches:{total:this.totalBatches,processedItems:this.processedItems,failedItems:this.failedItems,avgDurationMs:this.totalBatches>0?Math.round(this.totalBatchDurationMs/this.totalBatches):0},queue:{...N,lastBatchDurationMs:this.lastBatchDurationMs,lastProcessedAt:this.lastProcessedAt,lastFailedAt:this.lastFailedAt,lastError:this.lastError}}}}function HE(N){return{start:()=>N.start(),stop:()=>{N.setOnEnqueue(null),N.stop()},setInProcess:()=>{N.setMode("in-process"),N.start()},setEnqueueOnly:(E)=>{N.setMode("enqueue-only"),N.setOnEnqueue(E)}}}function f0(N,E){if(E.type&&N.type!==E.type)return!1;if(E.importanceMin!==void 0&&N.importance<E.importanceMin)return!1;if(E.importanceMax!==void 0&&N.importance>E.importanceMax)return!1;if(E.createdAfter&&N.createdAt<E.createdAfter)return!1;if(E.createdBefore&&N.createdAt>E.createdBefore)return!1;if(E.concepts&&E.concepts.length>0){if(!E.concepts.some((O)=>N.concepts.some((M)=>M.toLowerCase().includes(O.toLowerCase()))))return!1}if(E.files&&E.files.length>0){let f=[...N.filesRead,...N.filesModified];if(!E.files.some((M)=>f.some((A)=>A.toLowerCase().includes(M.toLowerCase()))))return!1}return!0}async function jE(N,E,f,O,M){if(!N.trim())return E;let A=NM(N),S=new Set;for(let V of A){let J=f.findByName(V);for(let Q of J){let W=f.traverseRelations(Q.id,1);for(let D of W){let Z=f.getObservationsForEntity(D);for(let X of Z)S.add(X)}}}if(S.size===0)return E;let $=new Set(E.map((V)=>V.observation.id)),_=[];for(let V of S){if($.has(V))continue;let J=O.getById(V);if(!J)continue;if(J.supersededBy)continue;_.push({observation:J,rank:0,snippet:J.title,source:"project",rankingSource:"graph",explain:{strategy:"hybrid",matchedBy:["graph"]}})}return[...E,..._].slice(0,M)}function NM(N){let E=N.split(/\s+/).filter((O)=>O.length>=2),f=[];for(let O of E)f.push(O);for(let O=0;O<E.length-1;O++)f.push(`${E[O]} ${E[O+1]}`);return f}var yE=60;async function IE(N,E,f,O){let M=O.limit??10,A=EM(E,N,O,M);if(!f)return A;let S=await r(f,N);if(!S)return A;let $=A.map((V)=>V.observation.id),_=fM(E,S,O.projectPath,O,M,O.hasVectorExtension??!1,$);if(_.length===0)return A;return AM(A,_,M)}function EM(N,E,f,O){try{return N.search({query:E,type:f.type,limit:O,projectPath:f.projectPath,importanceMin:f.importanceMin,importanceMax:f.importanceMax,createdAfter:f.createdAfter,createdBefore:f.createdBefore,concepts:f.concepts,files:f.files})}catch{return[]}}function fM(N,E,f,O,M,A,S){if(A)return OM(N,E,O,M,S);return MM(N,E,f,O,M)}function OM(N,E,f,O,M){try{let A;if(M.length>0){if(A=N.searchVecSubset(E,M,O*3),A.length===0)A=N.getVecEmbeddingMatches(E,O*3)}else A=N.getVecEmbeddingMatches(E,O*3);if(A.length===0)return[];let S=[];for(let{observationId:$,distance:_}of A){if(S.length>=O)break;let V=N.getById($);if(!V)continue;if(!f0(V,f))continue;S.push({observation:V,rank:_-1,snippet:V.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:_}})}return S}catch{return[]}}function MM(N,E,f,O,M){let A=N.getWithEmbeddings(f,M*10);if(A.length===0)return[];let S=A.map((_)=>({id:_.id,similarity:E0(E,_.embedding)})).filter(({similarity:_})=>_>=0.3).sort((_,V)=>V.similarity-_.similarity),$=[];for(let{id:_,similarity:V}of S){if($.length>=M)break;let J=N.getById(_);if(!J)continue;if(!f0(J,O))continue;$.push({observation:J,rank:-V,snippet:J.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorSimilarity:V}})}return $}function AM(N,E,f){let O=new Map;for(let M=0;M<N.length;M++){let A=N[M],S=1/(yE+M+1);O.set(A.observation.id,{score:S,result:{...A,rankingSource:"fts",explain:{strategy:"hybrid",matchedBy:["fts"],ftsRank:A.rank}}})}for(let M=0;M<E.length;M++){let A=E[M],S=1/(yE+M+1),$=O.get(A.observation.id);if($)$.score+=S,$.result={...$.result,explain:{strategy:"hybrid",matchedBy:["fts","vector"],ftsRank:$.result.explain?.ftsRank??$.result.rank,vectorDistance:A.explain?.vectorDistance,vectorSimilarity:A.explain?.vectorSimilarity}};else O.set(A.observation.id,{score:S,result:{...A,explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:A.explain?.vectorDistance,vectorSimilarity:A.explain?.vectorSimilarity}}})}return[...O.values()].sort((M,A)=>A.score-M.score).slice(0,f).map(({score:M,result:A})=>({...A,explain:{...A.explain??{strategy:"hybrid",matchedBy:[]},strategy:"hybrid",matchedBy:A.explain?.matchedBy??[],rrfScore:M,ftsRank:A.explain?.ftsRank,vectorDistance:A.explain?.vectorDistance,vectorSimilarity:A.explain?.vectorSimilarity}}))}class r1{observations;embeddingModel;hasVectorExtension;reranker;userObservationRepo;entityRepo;constructor(N,E,f,O=null,M=null,A=null){this.observations=N;this.embeddingModel=E;this.hasVectorExtension=f;this.reranker=O;this.userObservationRepo=M;this.entityRepo=A}async search(N,E){let f=E.strategy??"hybrid",O=E.limit??10,M;switch(f){case"filter-only":M=this.filterOnlySearch(N,E,O);break;case"semantic":M=await this.semanticSearch(N,E,O);break;case"hybrid":M=await this.hybridSearchStrategy(N,E,O);break}for(let A of M)A.source="project";if(this.entityRepo&&N.trim())M=await jE(N,M,this.entityRepo,this.observations,O);if(this.userObservationRepo){let A=this.searchUserMemory(N,E,O);M=this.mergeResults(M,A,O)}if(this.reranker&&M.length>1)return this.reranker.rerank(N,M,O);return M}filterOnlySearch(N,E,f){if(E.concept)return this.observations.searchByConcept(E.concept,f,E.projectPath).map((M)=>({observation:M,rank:0,snippet:M.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["concept-filter"]}}));if(E.file)return this.observations.searchByFile(E.file,f,E.projectPath).map((M)=>({observation:M,rank:0,snippet:M.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["file-filter"]}}));return this.observations.search({query:N,type:E.type,limit:f,projectPath:E.projectPath,importanceMin:E.importanceMin,importanceMax:E.importanceMax,createdAfter:E.createdAfter,createdBefore:E.createdBefore,concepts:E.concepts,files:E.files})}async semanticSearch(N,E,f){if(!this.embeddingModel)return this.filterOnlySearch(N,E,f);let O=await r(this.embeddingModel,N);if(!O)return this.filterOnlySearch(N,E,f);if(this.hasVectorExtension)return this.nativeVectorSearch(O,E,f);return this.jsFallbackVectorSearch(O,E,f)}async hybridSearchStrategy(N,E,f){return IE(N,this.observations,this.embeddingModel,{type:E.type,limit:f,projectPath:E.projectPath,hasVectorExtension:this.hasVectorExtension,importanceMin:E.importanceMin,importanceMax:E.importanceMax,createdAfter:E.createdAfter,createdBefore:E.createdBefore,concepts:E.concepts,files:E.files})}nativeVectorSearch(N,E,f){try{let O=this.observations.getVecEmbeddingMatches(N,f*3);if(O.length===0)return[];let M=[];for(let{observationId:A,distance:S}of O){if(M.length>=f)break;let $=this.observations.getById(A);if(!$)continue;if(!f0($,E))continue;M.push({observation:$,rank:S-1,snippet:$.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorDistance:S}})}return M}catch{return[]}}jsFallbackVectorSearch(N,E,f){let O=this.observations.getWithEmbeddings(E.projectPath,f*10);if(O.length===0)return[];let M=O.map((S)=>({id:S.id,similarity:E0(N,S.embedding)})).filter(({similarity:S})=>S>=0.3).sort((S,$)=>$.similarity-S.similarity),A=[];for(let{id:S,similarity:$}of M){if(A.length>=f)break;let _=this.observations.getById(S);if(!_)continue;if(!f0(_,E))continue;A.push({observation:_,rank:-$,snippet:_.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorSimilarity:$}})}return A}searchUserMemory(N,E,f){if(!this.userObservationRepo)return[];try{return this.userObservationRepo.search({query:N,limit:f}).map(({observation:M,rank:A})=>({observation:$M(M),rank:A,snippet:M.title,source:"user",rankingSource:"user-memory",explain:{strategy:"filter-only",matchedBy:["user-memory"]}}))}catch{return[]}}mergeResults(N,E,f){let O=new Set(N.map((S)=>S.observation.id)),M=new Set(N.map((S)=>`${S.observation.title}::${S.observation.narrative}`)),A=E.filter((S)=>{if(O.has(S.observation.id))return!1;let $=`${S.observation.title}::${S.observation.narrative}`;if(M.has($))return!1;return M.add($),!0});return[...N,...A].slice(0,f)}}function $M(N){return{id:N.id,sessionId:"",type:N.type,title:N.title,subtitle:N.subtitle,facts:N.facts,narrative:N.narrative,concepts:N.concepts,filesRead:N.filesRead,filesModified:N.filesModified,rawToolOutput:"",toolName:N.toolName,createdAt:N.createdAt,tokenCount:N.tokenCount,discoveryTokens:0,importance:N.importance}}import{generateText as SM}from"ai";class TE{languageModel;maxCandidates;provider;modelName;rateLimitingEnabled;_generate=SM;constructor(N,E){this.languageModel=N,this.maxCandidates=E.rerankingMaxCandidates,this.provider=E.provider??"",this.modelName=E.model??"",this.rateLimitingEnabled=E.rateLimitingEnabled??!0}async rerank(N,E,f){if(E.length<=1)return E;let O=E.slice(0,this.maxCandidates),M=E.slice(this.maxCandidates),A=lN(N,O.map(($)=>({title:$.observation.title,narrative:$.observation.narrative}))),S=2;for(let $=0;$<=S;$++)try{if(this.provider==="google")await v(this.modelName,this.rateLimitingEnabled);let{text:_}=await this._generate({model:this.languageModel,maxOutputTokens:512,prompt:A}),V=vN(_);if(!V)return E.slice(0,f);let J=this.applyReranking(O,V,f);for(let Q of M){if(J.length>=f)break;J.push(Q)}return J}catch(_){if(_M(_)&&$<S){await VM(2**$*1000);continue}return E.slice(0,f)}return E.slice(0,f)}applyReranking(N,E,f){let O=[],M=new Set;for(let A of E)if(A>=0&&A<N.length&&!M.has(A)){if(M.add(A),O.push(N[A]),O.length>=f)break}if(O.length<f){for(let A=0;A<N.length&&O.length<f;A++)if(!M.has(A))O.push(N[A])}return O}}class kE{async rerank(N,E,f){if(E.length<=1)return E.slice(0,f);let O=i1(N),M=E.map((A)=>({result:A,score:this.scoreCandidate(A,O)}));return M.sort((A,S)=>S.score-A.score),M.slice(0,f).map((A)=>A.result)}scoreCandidate(N,E){let f=N.observation,O=i1(f.title),M=i1(f.narrative),A=new Set(f.concepts.map((Y)=>Y.toLowerCase())),S=0,$=0,_=0;for(let Y of E){if(O.has(Y))S++;if(M.has(Y))$++;if(A.has(Y))_++}let V=E.size||1,J=S/V*0.4,Q=$/V*0.3,W=_/V*0.15,Z=(Date.now()-new Date(f.createdAt).getTime())/86400000,X=Z<1?0.1:Z<7?0.05:0,B=f.importance/5*0.05;return J+Q+W+X+B}}function wE(N,E){if(!N.rerankingEnabled)return null;if(E)return new TE(E,N);return new kE}function i1(N){return new Set(N.toLowerCase().split(/[\s\-_./\\,;:!?()[\]{}'"]+/).filter((E)=>E.length>1))}function _M(N){if(typeof N!=="object"||N===null)return!1;let E=N,f=E.status;if(f===429||f===500||f===503)return!0;let O=E.error;if(typeof O==="object"&&O!==null&&O.type==="overloaded_error")return!0;return!1}function VM(N){return new Promise((E)=>setTimeout(E,N))}function PE(N){return N}function qE(N){return N}function vE(N){return N}function xE(N){if(!N)return null;return N}import{spawnSync as uE}from"child_process";import{dirname as JM,resolve as gE}from"path";function QM(N){try{let E=uE("git",["rev-parse","--git-common-dir"],{cwd:N,encoding:"utf-8",timeout:5000});if(E.status!==0||!E.stdout)return null;let f=E.stdout.trim();if(f===".git")return null;let O=uE("git",["rev-parse","--git-dir"],{cwd:N,encoding:"utf-8",timeout:5000});if(O.status!==0||!O.stdout)return null;let M=O.stdout.trim(),A=gE(N,f),S=gE(N,M);if(A===S)return null;let $=JM(A);if($===A||$==="/")return null;return $}catch{return null}}function mE(N){return QM(N)??N}function UM(){try{let E=import.meta.url;if(E&&!E.includes("[eval]")){let f=DM(XM(E));return f.endsWith("dist")||f.endsWith("dist/")||f.endsWith("dist\\")?f:i(f,"..","dist")}}catch{}let N=[i(process.env.HOME||"",".config","opencode","node_modules","open-mem","dist"),i(process.cwd(),"node_modules","open-mem","dist")];for(let E of N)if(WM(i(E,"daemon.js")))return E;return i(process.cwd(),"node_modules","open-mem","dist")}async function BM(N){let E=UM(),f=mE(N.directory),O=V0(f),M=LN(O);for(let u of M)console.warn(`[open-mem] ${u}`);await YN(O),c0.enableExtensionSupport();let A=l0(O.dbPath);XE(A,{hasVectorExtension:A.hasVectorExtension,embeddingDimension:O.embeddingDimension});let S=new h1(A),$=new g1(A),_=new c1(A),V=new m1(A),J=new P1(A),Q=new x1(A),W=null,D=null;if(O.userMemoryEnabled)try{W=new l1(O.userMemoryDbPath),D=new b1(W.database)}catch(u){console.warn(`[open-mem] Failed to initialize user-level memory: ${u}`)}let Z=new Q0(O),X=new Z1(O),B=O.provider!=="bedrock",Y=O.compressionEnabled&&(!B||O.apiKey)?bN({provider:O.provider,model:O.model,apiKey:O.apiKey}):null,y=new n1,G=O.conflictResolutionEnabled&&(!B||O.apiKey)?new B1({provider:O.provider,apiKey:O.apiKey,model:O.model,rateLimitingEnabled:O.rateLimitingEnabled}):null,H=O.entityExtractionEnabled&&(!B||O.apiKey)?new K1({provider:O.provider,apiKey:O.apiKey,model:O.model,rateLimitingEnabled:O.rateLimitingEnabled}):null,U0=new v1(A),x=new p1(O,Z,X,V,$,S,_,Y,G,H,U0,y.createQueueObserver()),T=HE(x);T.start();let I=()=>{let u=x.getStats(),w=y.snapshot({mode:x.getMode(),running:x.isRunning,processing:u.processing,pending:u.pending});return{status:w.queue.lastError?"degraded":"ok",timestamp:new Date().toISOString(),uptimeMs:w.uptimeMs,queue:w.queue,batches:w.batches,enqueueCount:w.enqueueCount}},n0=wE(O,O.rerankingEnabled&&(!B||O.apiKey)?q({provider:O.provider,model:O.model,apiKey:O.apiKey}):null),k=new r1($,Y,A.hasVectorExtension,n0,D,U0),B0=new I1({observations:PE($),sessions:qE(S),summaries:vE(_),searchOrchestrator:k,projectPath:f,config:O,userObservationRepo:xE(D),runtimeSnapshotProvider:I,configAuditStore:J,maintenanceHistoryStore:Q}),d1=wN(B0),m=null,d=null;if(O.daemonEnabled)if(VE(O.dbPath),m=new k1({dbPath:O.dbPath,projectPath:f,daemonScript:i(E,"daemon.js")}),m.start())T.setEnqueueOnly(()=>m?.signal("PROCESS_NOW")),console.log("[open-mem] Background daemon started \u2014 processing delegated"),d=setInterval(()=>{if(m&&!m.isRunning()){if(console.warn("[open-mem] Daemon died, falling back to in-process processing"),T.setInProcess(),d)clearInterval(d),d=null}},30000);else console.warn("[open-mem] Daemon failed to start \u2014 using in-process processing"),m=null;let r0=null,i0=null,K0=null;if(O.dashboardEnabled){i0=UE(),K0=new U1(i0);let u=IN({config:O,projectPath:f,embeddingModel:Y,memoryEngine:B0,runtimeStatusProvider:I,sseHandler:kN(K0),dashboardDir:i(E,"dashboard")}),w=O.dashboardPort,d0=w,a1=!1;for(let O0=0;O0<10;O0++){d0=w+O0;try{r0=Bun.serve({port:d0,hostname:"127.0.0.1",idleTimeout:0,fetch:u.fetch}),a1=!0;break}catch{}}if(a1)console.log(`[open-mem] Dashboard available at http://127.0.0.1:${d0}`);else console.warn(`[open-mem] Could not start dashboard \u2014 ports ${w}-${w+9} all busy`);let cE=i0,lE=$.create.bind($);$.create=(...O0)=>{let t1=lE(...O0);return cE.emit("observation:created",t1),t1}}let hE=()=>{if(d)clearInterval(d);if(m)m.stop();if(T.stop(),r0)r0.stop();if(K0)K0.destroy();if(W)W.close();A.close()};return process.on("beforeExit",hE),{"tool.execute.after":FE(O,x,S,f),"chat.message":RE($,S,f,O.sensitivePatterns),event:GE(x,S,f,O,$,V),"experimental.chat.system.transform":YE(O,$,S,_,f,D),"experimental.session.compacting":LE(O,$,S,_,f,D),tool:{...d1}}}export{BM as default};