open-mem 0.7.1 → 0.7.2

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,11 +1,11 @@
1
1
  // @bun
2
- var iA=Object.create;var{getPrototypeOf:tA,defineProperty:f0,getOwnPropertyNames:aA}=Object;var sA=Object.prototype.hasOwnProperty;var oA=(f,n,A)=>{A=f!=null?iA(tA(f)):{};let E=n||!f||!f.__esModule?f0(A,"default",{value:f,enumerable:!0}):A;for(let N of aA(f))if(!sA.call(E,N))f0(E,N,{get:()=>f[N],enumerable:!0});return E};var dA=(f,n)=>{for(var A in n)f0(f,A,{get:n[A],enumerable:!0,configurable:!0,set:(E)=>n[A]=()=>E})};var a0=(f,n)=>()=>(f&&(n=f(f=0)),n);var v=import.meta.require;import{existsSync as y1,readFileSync as C1}from"fs";function V1(){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 B1(f){let n=`${f}/.open-mem/config.json`;if(!y1(n))return{};try{let A=C1(n,"utf-8"),E=JSON.parse(A);if(!E||typeof E!=="object"||Array.isArray(E))return{};return E}catch{return{}}}function J1(f){switch(f){case"google":return 768;case"openai":return 1536;case"bedrock":return 1024;case"anthropic":return 0;default:return 768}}function d(f,n){let A=B1(f),E=V1(),N={...Bn,...A,...E,...n};if(!N.dbPath.startsWith("/"))N.dbPath=`${f}/${N.dbPath}`;if(!process.env.OPEN_MEM_PROVIDER&&!n?.provider){if(process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY)N.provider="google";else if(process.env.ANTHROPIC_API_KEY)N.provider="anthropic";else if(process.env.AWS_BEARER_TOKEN_BEDROCK||process.env.AWS_ACCESS_KEY_ID||process.env.AWS_PROFILE)N.provider="bedrock"}if(!N.apiKey)switch(N.provider){case"google":N.apiKey=process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;break;case"anthropic":N.apiKey=process.env.ANTHROPIC_API_KEY;break;case"openai":N.apiKey=process.env.OPENAI_API_KEY;break;case"bedrock":break}if(N.embeddingDimension===void 0)N.embeddingDimension=J1(N.provider);return N}function Jn(f){let n=[],A=f.provider!=="bedrock";if(f.compressionEnabled&&A&&!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 Ff(){return{...Bn}}async function Qn(f){let n=f.dbPath.substring(0,f.dbPath.lastIndexOf("/")),{mkdir:A}=await import("fs/promises");await A(n,{recursive:!0})}var Bn;var cf=a0(()=>{Bn={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 Kn={};dA(Kn,{writeProjectConfig:()=>Xn,validatePatch:()=>D0,readProjectConfig:()=>b,previewConfig:()=>l0,patchConfig:()=>Gf,getEffectiveConfig:()=>p,getConfigSchema:()=>R0});import{existsSync as Q1}from"fs";import{mkdir as L1,readFile as z1,writeFile as W1}from"fs/promises";import{dirname as X1,join as K1}from"path";function zn(f){return K1(f,".open-mem","config.json")}function Wn(f){return Ln.find((n)=>n.key===f)}function U1(f,n){let A=Wn(f);if(!A)return null;if(A.type==="string"&&typeof n!=="string")return`${String(f)} must be a string`;if(A.type==="number"&&typeof n!=="number")return`${String(f)} must be a number`;if(A.type==="boolean"&&typeof n!=="boolean")return`${String(f)} must be a boolean`;if(A.type==="array"&&!Array.isArray(n))return`${String(f)} must be an array`;if(A.enum&&typeof n==="string"&&!A.enum.includes(n))return`${String(f)} must be one of: ${A.enum.join(", ")}`;if(typeof n==="number"){if(A.min!==void 0&&n<A.min)return`${String(f)} must be >= ${A.min}`;if(A.max!==void 0&&n>A.max)return`${String(f)} must be <= ${A.max}`}return null}function R0(){return Ln}async function b(f){let n=zn(f);if(!Q1(n))return{};try{let A=await z1(n,"utf-8"),E=JSON.parse(A);if(!E||typeof E!=="object"||Array.isArray(E))return{};return E}catch{return{}}}async function Xn(f,n){let A=zn(f),N={...await b(f),...n};await L1(X1(A),{recursive:!0}),await W1(A,JSON.stringify(N,null,2),"utf-8")}function D0(f){let n=[];for(let[A,E]of Object.entries(f)){let O=U1(A,E);if(O)n.push(O)}return n}async function p(f){let n=Ff(),A=await b(f),E=d(f),N=[],O={};for(let[S,M]of Object.entries(n)){let _=S,$=Wn(_),D=(Z1[_]??[]).some((Q)=>typeof process.env[Q]==="string"),l=Object.hasOwn(A,_),u="default";if(l)u="file";if(D)u="env";if(O[_]={source:u,locked:D,restartRequired:$?.restartRequired??!1,liveApply:$?.liveApply??!1},u==="env"&&l)N.push(`${String(_)} is overridden by environment variable.`);if(E[_]===void 0&&M!==void 0)N.push(`${String(_)} resolved to undefined unexpectedly.`)}return{config:E,meta:O,warnings:N}}async function l0(f,n){let A=D0(n);if(A.length>0)return{...await p(f),warnings:A};let E=Ff(),N=await b(f),O={...E,...N,...n},M={...d(f,n),...O},_=(await p(f)).meta;return{config:M,meta:_,warnings:[]}}async function Gf(f,n){let A=D0(n);if(A.length>0)return{...await p(f),warnings:A};return await Xn(f,n),p(f)}var Ln,Z1;var u0=a0(()=>{cf();Ln=[{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}],Z1={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 mN}from"fs";import{dirname as YN,join as a}from"path";import{fileURLToPath as FN}from"url";import{randomUUID as Rf}from"crypto";import{normalize as m1,resolve as y0,sep as Zn}from"path";import{fileURLToPath as Y1}from"url";var n0=(f,n,A)=>{return(E,N)=>{let O=-1;return S(0);async function S(M){if(M<=O)throw Error("next() called multiple times");O=M;let _,$=!1,R;if(f[M])R=f[M][0][0],E.req.routeIndex=M;else R=M===f.length&&N||void 0;if(R)try{_=await R(E,()=>S(M+1))}catch(D){if(D instanceof Error&&n)E.error=D,_=await n(D,E),$=!0;else throw D}else if(E.finalized===!1&&A)_=await A(E);if(_&&(E.finalized===!1||$))E.res=_;return E}}};var s0=Symbol();var o0=async(f,n=Object.create(null))=>{let{all:A=!1,dot:E=!1}=n,O=(f instanceof Qf?f.raw.headers:f.headers).get("Content-Type");if(O?.startsWith("multipart/form-data")||O?.startsWith("application/x-www-form-urlencoded"))return eA(f,{all:A,dot:E});return{}};async function eA(f,n){let A=await f.formData();if(A)return f1(A,n);return{}}function f1(f,n){let A=Object.create(null);if(f.forEach((E,N)=>{if(!(n.all||N.endsWith("[]")))A[N]=E;else n1(A,N,E)}),n.dot)Object.entries(A).forEach(([E,N])=>{if(E.includes("."))A1(A,E,N),delete A[E]});return A}var n1=(f,n,A)=>{if(f[n]!==void 0)if(Array.isArray(f[n]))f[n].push(A);else f[n]=[f[n],A];else if(!n.endsWith("[]"))f[n]=A;else f[n]=[A]},A1=(f,n,A)=>{let E=f,N=n.split(".");N.forEach((O,S)=>{if(S===N.length-1)E[O]=A;else{if(!E[O]||typeof E[O]!=="object"||Array.isArray(E[O])||E[O]instanceof File)E[O]=Object.create(null);E=E[O]}})};var E0=(f)=>{let n=f.split("/");if(n[0]==="")n.shift();return n},d0=(f)=>{let{groups:n,path:A}=E1(f),E=E0(A);return N1(E,n)},E1=(f)=>{let n=[];return f=f.replace(/\{[^}]+\}/g,(A,E)=>{let N=`@${E}`;return n.push([N,A]),N}),{groups:n,path:f}},N1=(f,n)=>{for(let A=n.length-1;A>=0;A--){let[E]=n[A];for(let N=f.length-1;N>=0;N--)if(f[N].includes(E)){f[N]=f[N].replace(E,n[A][1]);break}}return f},Lf={},e0=(f,n)=>{if(f==="*")return"*";let A=f.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(A){let E=`${f}#${n}`;if(!Lf[E])if(A[2])Lf[E]=n&&n[0]!==":"&&n[0]!=="*"?[E,A[1],new RegExp(`^${A[2]}(?=/${n})`)]:[f,A[1],new RegExp(`^${A[2]}$`)];else Lf[E]=[f,A[1],!0];return Lf[E]}return null},zf=(f,n)=>{try{return n(f)}catch{return f.replace(/(?:%[0-9A-Fa-f]{2})+/g,(A)=>{try{return n(A)}catch{return A}})}},O1=(f)=>zf(f,decodeURI),N0=(f)=>{let n=f.url,A=n.indexOf("/",n.indexOf(":")+4),E=A;for(;E<n.length;E++){let N=n.charCodeAt(E);if(N===37){let O=n.indexOf("?",E),S=n.slice(A,O===-1?void 0:O);return O1(S.includes("%25")?S.replace(/%25/g,"%2525"):S)}else if(N===63)break}return n.slice(A,E)};var fn=(f)=>{let n=N0(f);return n.length>1&&n.at(-1)==="/"?n.slice(0,-1):n},r=(f,n,...A)=>{if(A.length)n=r(n,...A);return`${f?.[0]==="/"?"":"/"}${f}${n==="/"?"":`${f?.at(-1)==="/"?"":"/"}${n?.[0]==="/"?n.slice(1):n}`}`},Wf=(f)=>{if(f.charCodeAt(f.length-1)!==63||!f.includes(":"))return null;let n=f.split("/"),A=[],E="";return n.forEach((N)=>{if(N!==""&&!/\:/.test(N))E+="/"+N;else if(/\:/.test(N))if(/\?/.test(N)){if(A.length===0&&E==="")A.push("/");else A.push(E);let O=N.replace("?","");E+="/"+O,A.push(E)}else E+="/"+N}),A.filter((N,O,S)=>S.indexOf(N)===O)},A0=(f)=>{if(!/[%+]/.test(f))return f;if(f.indexOf("+")!==-1)f=f.replace(/\+/g," ");return f.indexOf("%")!==-1?zf(f,O0):f},nn=(f,n,A)=>{let E;if(!A&&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 M=f.charCodeAt(S+n.length+1);if(M===61){let _=S+n.length+2,$=f.indexOf("&",_);return A0(f.slice(_,$===-1?void 0:$))}else if(M==38||isNaN(M))return"";S=f.indexOf(`&${n}`,S+1)}if(E=/[%+]/.test(f),!E)return}let N={};E??=/[%+]/.test(f);let O=f.indexOf("?",8);while(O!==-1){let S=f.indexOf("&",O+1),M=f.indexOf("=",O);if(M>S&&S!==-1)M=-1;let _=f.slice(O+1,M===-1?S===-1?void 0:S:M);if(E)_=A0(_);if(O=S,_==="")continue;let $;if(M===-1)$="";else if($=f.slice(M+1,S===-1?void 0:S),E)$=A0($);if(A){if(!(N[_]&&Array.isArray(N[_])))N[_]=[];N[_].push($)}else N[_]??=$}return n?N[n]:N},An=nn,En=(f,n)=>{return nn(f,n,!0)},O0=decodeURIComponent;var Nn=(f)=>zf(f,O0),Qf=class{raw;#f;#n;routeIndex=0;path;bodyCache={};constructor(f,n="/",A=[[]]){this.raw=f,this.path=n,this.#n=A,this.#f={}}param(f){return f?this.#A(f):this.#O()}#A(f){let n=this.#n[0][this.routeIndex][1][f],A=this.#N(n);return A&&/\%/.test(A)?Nn(A):A}#O(){let f={},n=Object.keys(this.#n[0][this.routeIndex][1]);for(let A of n){let E=this.#N(this.#n[0][this.routeIndex][1][A]);if(E!==void 0)f[A]=/\%/.test(E)?Nn(E):E}return f}#N(f){return this.#n[1]?this.#n[1][f]:f}query(f){return An(this.url,f)}queries(f){return En(this.url,f)}header(f){if(f)return this.raw.headers.get(f)??void 0;let n={};return this.raw.headers.forEach((A,E)=>{n[E]=A}),n}async parseBody(f){return this.bodyCache.parsedBody??=await o0(this,f)}#E=(f)=>{let{bodyCache:n,raw:A}=this,E=n[f];if(E)return E;let N=Object.keys(n)[0];if(N)return n[N].then((O)=>{if(N==="json")O=JSON.stringify(O);return new Response(O)[f]()});return n[f]=A[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[s0](){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 Xf={Stringify:1,BeforeStream:2,Stream:3},M1=(f,n)=>{let A=new String(f);return A.isEscaped=!0,A.callbacks=n,A};var Of=async(f,n,A,E,N)=>{if(typeof f==="object"&&!(f instanceof String)){if(!(f instanceof Promise))f=f.toString();if(f instanceof Promise)f=await f}let O=f.callbacks;if(!O?.length)return Promise.resolve(f);if(N)N[0]+=f;else N=[f];let S=Promise.all(O.map((M)=>M({phase:n,buffer:N,context:E}))).then((M)=>Promise.all(M.filter(Boolean).map((_)=>Of(_,n,!1,E,N))).then(()=>N[0]));if(A)return M1(await S,O);else return S};var On="text/plain; charset=UTF-8",M0=(f,n)=>{return{"Content-Type":f,...n}},Mn=class{#f;#n;env={};#A;finalized=!1;error;#O;#N;#E;#R;#_;#$;#S;#D;#l;constructor(f,n){if(this.#f=f,n)this.#N=n.executionCtx,this.env=n.env,this.#$=n.notFoundHandler,this.#l=n.path,this.#D=n.matchResult}get req(){return this.#n??=new Qf(this.#f,this.#l,this.#D),this.#n}get event(){if(this.#N&&"respondWith"in this.#N)return this.#N;else throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#N)return this.#N;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,A]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 N of E)f.headers.append("set-cookie",N)}else f.headers.set(n,A)}}this.#E=f,this.finalized=!0}render=(...f)=>{return this.#_??=(n)=>this.html(n),this.#_(...f)};setLayout=(f)=>this.#R=f;getLayout=()=>this.#R;setRenderer=(f)=>{this.#_=f};header=(f,n,A)=>{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(A?.append)E.append(f,n);else E.set(f,n)};status=(f)=>{this.#O=f};set=(f,n)=>{this.#A??=new Map,this.#A.set(f,n)};get=(f)=>{return this.#A?this.#A.get(f):void 0};get var(){if(!this.#A)return{};return Object.fromEntries(this.#A)}#M(f,n,A){let E=this.#E?new Headers(this.#E.headers):this.#S??new Headers;if(typeof n==="object"&&"headers"in n){let O=n.headers instanceof Headers?n.headers:new Headers(n.headers);for(let[S,M]of O)if(S.toLowerCase()==="set-cookie")E.append(S,M);else E.set(S,M)}if(A)for(let[O,S]of Object.entries(A))if(typeof S==="string")E.set(O,S);else{E.delete(O);for(let M of S)E.append(O,M)}let N=typeof n==="number"?n:n?.status??this.#O;return new Response(f,{status:N,headers:E})}newResponse=(...f)=>this.#M(...f);body=(f,n,A)=>this.#M(f,n,A);text=(f,n,A)=>{return!this.#S&&!this.#O&&!n&&!A&&!this.finalized?new Response(f):this.#M(f,n,M0(On,A))};json=(f,n,A)=>{return this.#M(JSON.stringify(f),n,M0("application/json",A))};html=(f,n,A)=>{let E=(N)=>this.#M(N,n,M0("text/html; charset=UTF-8",A));return typeof f==="object"?Of(f,Xf.Stringify,!1,{}).then(E):E(f)};redirect=(f,n)=>{let A=String(f);return this.header("Location",!/[^\x00-\xFF]/.test(A)?A:encodeURI(A)),this.newResponse(null,n??302)};notFound=()=>{return this.#$??=()=>new Response,this.#$(this)}};var z="ALL",Sn="all",_n=["get","post","put","delete","options","patch"],Kf="Can not add a route since the matcher is already built.",Zf=class extends Error{};var $n="__COMPOSED_HANDLER";var S1=(f)=>{return f.text("404 Not Found",404)},Rn=(f,n)=>{if("getResponse"in f){let A=f.getResponse();return n.newResponse(A.body,A)}return console.error(f),n.text("Internal Server Error",500)},Dn=class f{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#f="/";routes=[];constructor(n={}){[..._n,Sn].forEach((O)=>{this[O]=(S,...M)=>{if(typeof S==="string")this.#f=S;else this.#O(O,this.#f,S);return M.forEach((_)=>{this.#O(O,this.#f,_)}),this}}),this.on=(O,S,...M)=>{for(let _ of[S].flat()){this.#f=_;for(let $ of[O].flat())M.map((R)=>{this.#O($.toUpperCase(),this.#f,R)})}return this},this.use=(O,...S)=>{if(typeof O==="string")this.#f=O;else this.#f="*",S.unshift(O);return S.forEach((M)=>{this.#O(z,this.#f,M)}),this};let{strict:E,...N}=n;Object.assign(this,N),this.getPath=E??!0?n.getPath??N0:fn}#n(){let n=new f({router:this.router,getPath:this.getPath});return n.errorHandler=this.errorHandler,n.#A=this.#A,n.routes=this.routes,n}#A=S1;errorHandler=Rn;route(n,A){let E=this.basePath(n);return A.routes.map((N)=>{let O;if(A.errorHandler===Rn)O=N.handler;else O=async(S,M)=>(await n0([],A.errorHandler)(S,()=>N.handler(S,M))).res,O[$n]=N.handler;E.#O(N.method,N.path,O)}),this}basePath(n){let A=this.#n();return A._basePath=r(this._basePath,n),A}onError=(n)=>{return this.errorHandler=n,this};notFound=(n)=>{return this.#A=n,this};mount(n,A,E){let N,O;if(E)if(typeof E==="function")O=E;else if(O=E.optionHandler,E.replaceRequest===!1)N=(_)=>_;else N=E.replaceRequest;let S=O?(_)=>{let $=O(_);return Array.isArray($)?$:[$]}:(_)=>{let $=void 0;try{$=_.executionCtx}catch{}return[_.env,$]};N||=(()=>{let _=r(this._basePath,n),$=_==="/"?0:_.length;return(R)=>{let D=new URL(R.url);return D.pathname=D.pathname.slice($)||"/",new Request(D,R)}})();let M=async(_,$)=>{let R=await A(N(_.req.raw),...S(_));if(R)return R;await $()};return this.#O(z,r(n,"*"),M),this}#O(n,A,E){n=n.toUpperCase(),A=r(this._basePath,A);let N={basePath:this._basePath,path:A,method:n,handler:E};this.router.add(n,A,[E,N]),this.routes.push(N)}#N(n,A){if(n instanceof Error)return this.errorHandler(n,A);throw n}#E(n,A,E,N){if(N==="HEAD")return(async()=>new Response(null,await this.#E(n,A,E,"GET")))();let O=this.getPath(n,{env:E}),S=this.router.match(N,O),M=new Mn(n,{path:O,matchResult:S,env:E,executionCtx:A,notFoundHandler:this.#A});if(S[0].length===1){let $;try{$=S[0][0][0][0](M,async()=>{M.res=await this.#A(M)})}catch(R){return this.#N(R,M)}return $ instanceof Promise?$.then((R)=>R||(M.finalized?M.res:this.#A(M))).catch((R)=>this.#N(R,M)):$??this.#A(M)}let _=n0(S[0],this.errorHandler,this.#A);return(async()=>{try{let $=await _(M);if(!$.finalized)throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return $.res}catch($){return this.#N($,M)}})()}fetch=(n,...A)=>{return this.#E(n,A[1],A[0],n.method)};request=(n,A,E,N)=>{if(n instanceof Request)return this.fetch(A?new Request(n,A):n,E,N);return n=n.toString(),this.fetch(new Request(/^https?:\/\//.test(n)?n:`http://localhost${r("/",n)}`,A),E,N)};fire=()=>{addEventListener("fetch",(n)=>{n.respondWith(this.#E(n.request,n,void 0,n.request.method))})}};var Mf=[];function Uf(f,n){let A=this.buildAllMatchers(),E=(N,O)=>{let S=A[N]||A[z],M=S[2][O];if(M)return M;let _=O.match(S[0]);if(!_)return[[],Mf];let $=_.indexOf("",1);return[S[1][$],_]};return this.match=E,E(f,n)}var mf="[^/]+",Sf=".*",_f="(?:|/.*)",h=Symbol(),_1=new Set(".\\+*[^]$()");function $1(f,n){if(f.length===1)return n.length===1?f<n?-1:1:-1;if(n.length===1)return 1;if(f===Sf||f===_f)return 1;else if(n===Sf||n===_f)return-1;if(f===mf)return 1;else if(n===mf)return-1;return f.length===n.length?f<n?-1:1:n.length-f.length}var ln=class f{#f;#n;#A=Object.create(null);insert(n,A,E,N,O){if(n.length===0){if(this.#f!==void 0)throw h;if(O)return;this.#f=A;return}let[S,...M]=n,_=S==="*"?M.length===0?["","",Sf]:["","",mf]:S==="/*"?["","",_f]:S.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),$;if(_){let R=_[1],D=_[2]||mf;if(R&&_[2]){if(D===".*")throw h;if(D=D.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(D))throw h}if($=this.#A[D],!$){if(Object.keys(this.#A).some((l)=>l!==Sf&&l!==_f))throw h;if(O)return;if($=this.#A[D]=new f,R!=="")$.#n=N.varIndex++}if(!O&&R!=="")E.push([R,$.#n])}else if($=this.#A[S],!$){if(Object.keys(this.#A).some((R)=>R.length>1&&R!==Sf&&R!==_f))throw h;if(O)return;$=this.#A[S]=new f}$.insert(M,A,E,N,O)}buildRegExpStr(){let A=Object.keys(this.#A).sort($1).map((E)=>{let N=this.#A[E];return(typeof N.#n==="number"?`(${E})@${N.#n}`:_1.has(E)?`\\${E}`:E)+N.buildRegExpStr()});if(typeof this.#f==="number")A.unshift(`#${this.#f}`);if(A.length===0)return"";if(A.length===1)return A[0];return"(?:"+A.join("|")+")"}};var un=class{#f={varIndex:0};#n=new ln;insert(f,n,A){let E=[],N=[];for(let S=0;;){let M=!1;if(f=f.replace(/\{[^}]+\}/g,(_)=>{let $=`@\\${S}`;return N[S]=[$,_],S++,M=!0,$}),!M)break}let O=f.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let S=N.length-1;S>=0;S--){let[M]=N[S];for(let _=O.length-1;_>=0;_--)if(O[_].indexOf(M)!==-1){O[_]=O[_].replace(M,N[S][1]);break}}return this.#n.insert(O,n,E,this.#f,A),E}buildRegExp(){let f=this.#n.buildRegExpStr();if(f==="")return[/^$/,[],[]];let n=0,A=[],E=[];return f=f.replace(/#(\d+)|@(\d+)|\.\*\$/g,(N,O,S)=>{if(O!==void 0)return A[++n]=Number(O),"$()";if(S!==void 0)return E[Number(S)]=++n,"";return""}),[new RegExp(`^${f}`),A,E]}};var R1=[/^$/,[],Object.create(null)],yn=Object.create(null);function Cn(f){return yn[f]??=new RegExp(f==="*"?"":`^${f.replace(/\/\*$|([.\\+*[^\]$()])/g,(n,A)=>A?`\\${A}`:"(?:|/.*)")}$`)}function D1(){yn=Object.create(null)}function l1(f){let n=new un,A=[];if(f.length===0)return R1;let E=f.map(($)=>[!/\*|\/:/.test($[0]),...$]).sort(([$,R],[D,l])=>$?1:D?-1:R.length-l.length),N=Object.create(null);for(let $=0,R=-1,D=E.length;$<D;$++){let[l,u,Q]=E[$];if(l)N[u]=[Q.map(([J])=>[J,Object.create(null)]),Mf];else R++;let V;try{V=n.insert(u,R,l)}catch(J){throw J===h?new Zf(u):J}if(l)continue;A[R]=Q.map(([J,W])=>{let F=Object.create(null);W-=1;for(;W>=0;W--){let[K,U]=V[W];F[K]=U}return[J,F]})}let[O,S,M]=n.buildRegExp();for(let $=0,R=A.length;$<R;$++)for(let D=0,l=A[$].length;D<l;D++){let u=A[$][D]?.[1];if(!u)continue;let Q=Object.keys(u);for(let V=0,J=Q.length;V<J;V++)u[Q[V]]=M[u[Q[V]]]}let _=[];for(let $ in S)_[$]=A[S[$]];return[O,_,N]}function o(f,n){if(!f)return;for(let A of Object.keys(f).sort((E,N)=>N.length-E.length))if(Cn(A).test(n))return[...f[A]];return}var Yf=class{name="RegExpRouter";#f;#n;constructor(){this.#f={[z]:Object.create(null)},this.#n={[z]:Object.create(null)}}add(f,n,A){let E=this.#f,N=this.#n;if(!E||!N)throw Error(Kf);if(!E[f])[E,N].forEach((M)=>{M[f]=Object.create(null),Object.keys(M[z]).forEach((_)=>{M[f][_]=[...M[z][_]]})});if(n==="/*")n="*";let O=(n.match(/\/:/g)||[]).length;if(/\*$/.test(n)){let M=Cn(n);if(f===z)Object.keys(E).forEach((_)=>{E[_][n]||=o(E[_],n)||o(E[z],n)||[]});else E[f][n]||=o(E[f],n)||o(E[z],n)||[];Object.keys(E).forEach((_)=>{if(f===z||f===_)Object.keys(E[_]).forEach(($)=>{M.test($)&&E[_][$].push([A,O])})}),Object.keys(N).forEach((_)=>{if(f===z||f===_)Object.keys(N[_]).forEach(($)=>M.test($)&&N[_][$].push([A,O]))});return}let S=Wf(n)||[n];for(let M=0,_=S.length;M<_;M++){let $=S[M];Object.keys(N).forEach((R)=>{if(f===z||f===R)N[R][$]||=[...o(E[R],$)||o(E[z],$)||[]],N[R][$].push([A,O-_+M+1])})}}match=Uf;buildAllMatchers(){let f=Object.create(null);return Object.keys(this.#n).concat(Object.keys(this.#f)).forEach((n)=>{f[n]||=this.#A(n)}),this.#f=this.#n=void 0,D1(),f}#A(f){let n=[],A=f===z;if([this.#f,this.#n].forEach((E)=>{let N=E[f]?Object.keys(E[f]).map((O)=>[O,E[f][O]]):[];if(N.length!==0)A||=!0,n.push(...N);else if(f!==z)n.push(...Object.keys(E[z]).map((O)=>[O,E[z][O]]))}),!A)return null;else return l1(n)}};var u1=class{name="PreparedRegExpRouter";#f;#n;constructor(f,n){this.#f=f,this.#n=n}#A(f,n){let A=this.#f[f];A[1].forEach((E)=>E&&E.push(n)),Object.values(A[2]).forEach((E)=>E[0].push(n))}#O(f,n,A,E,N){let O=this.#f[f];if(!N)O[2][n][0].push([A,{}]);else E.forEach((S)=>{if(typeof S==="number")O[1][S].push([A,N]);else O[2][S||n][0].push([A,N])})}add(f,n,A){if(!this.#f[f]){let N=this.#f[z],O={};for(let S in N[2])O[S]=[N[2][S][0].slice(),Mf];this.#f[f]=[N[0],N[1].map((S)=>Array.isArray(S)?S.slice():0),O]}if(n==="/*"||n==="*"){let N=[A,{}];if(f===z)for(let O in this.#f)this.#A(O,N);else this.#A(f,N);return}let E=this.#n[n];if(!E)throw Error(`Path ${n} is not registered`);for(let[N,O]of E)if(f===z)for(let S in this.#f)this.#O(S,n,A,N,O);else this.#O(f,n,A,N,O)}buildAllMatchers(){return this.#f}match=Uf};var S0=class{name="SmartRouter";#f=[];#n=[];constructor(f){this.#f=f.routers}add(f,n,A){if(!this.#n)throw Error(Kf);this.#n.push([f,n,A])}match(f,n){if(!this.#n)throw Error("Fatal error");let A=this.#f,E=this.#n,N=A.length,O=0,S;for(;O<N;O++){let M=A[O];try{for(let _=0,$=E.length;_<$;_++)M.add(...E[_]);S=M.match(f,n)}catch(_){if(_ instanceof Zf)continue;throw _}this.match=M.match.bind(M),this.#f=[M],this.#n=void 0;break}if(O===N)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 $f=Object.create(null),Vn=class f{#f;#n;#A;#O=0;#N=$f;constructor(n,A,E){if(this.#n=E||Object.create(null),this.#f=[],n&&A){let N=Object.create(null);N[n]={handler:A,possibleKeys:[],score:0},this.#f=[N]}this.#A=[]}insert(n,A,E){this.#O=++this.#O;let N=this,O=d0(A),S=[];for(let M=0,_=O.length;M<_;M++){let $=O[M],R=O[M+1],D=e0($,R),l=Array.isArray(D)?D[0]:$;if(l in N.#n){if(N=N.#n[l],D)S.push(D[1]);continue}if(N.#n[l]=new f,D)N.#A.push(D),S.push(D[1]);N=N.#n[l]}return N.#f.push({[n]:{handler:E,possibleKeys:S.filter((M,_,$)=>$.indexOf(M)===_),score:this.#O}}),N}#E(n,A,E,N){let O=[];for(let S=0,M=n.#f.length;S<M;S++){let _=n.#f[S],$=_[A]||_[z],R={};if($!==void 0){if($.params=Object.create(null),O.push($),E!==$f||N&&N!==$f)for(let D=0,l=$.possibleKeys.length;D<l;D++){let u=$.possibleKeys[D],Q=R[$.score];$.params[u]=N?.[u]&&!Q?N[u]:E[u]??N?.[u],R[$.score]=!0}}}return O}search(n,A){let E=[];this.#N=$f;let O=[this],S=E0(A),M=[];for(let _=0,$=S.length;_<$;_++){let R=S[_],D=_===$-1,l=[];for(let u=0,Q=O.length;u<Q;u++){let V=O[u],J=V.#n[R];if(J)if(J.#N=V.#N,D){if(J.#n["*"])E.push(...this.#E(J.#n["*"],n,V.#N));E.push(...this.#E(J,n,V.#N))}else l.push(J);for(let W=0,F=V.#A.length;W<F;W++){let K=V.#A[W],U=V.#N===$f?{}:{...V.#N};if(K==="*"){let H=V.#n["*"];if(H)E.push(...this.#E(H,n,V.#N)),H.#N=U,l.push(H);continue}let[Vf,w,j]=K;if(!R&&!(j instanceof RegExp))continue;let c=V.#n[Vf],sf=S.slice(_).join("/");if(j instanceof RegExp){let H=j.exec(sf);if(H){if(U[w]=H[0],E.push(...this.#E(c,n,V.#N,U)),Object.keys(c.#n).length){c.#N=U;let Bf=H[0].match(/\//)?.length??0;(M[Bf]||=[]).push(c)}continue}}if(j===!0||j.test(R))if(U[w]=R,D){if(E.push(...this.#E(c,n,U,V.#N)),c.#n["*"])E.push(...this.#E(c.#n["*"],n,U,V.#N))}else c.#N=U,l.push(c)}}O=l.concat(M.shift()??[])}if(E.length>1)E.sort((_,$)=>{return _.score-$.score});return[E.map(({handler:_,params:$})=>[_,$])]}};var _0=class{name="TrieRouter";#f;constructor(){this.#f=new Vn}add(f,n,A){let E=Wf(n);if(E){for(let N=0,O=E.length;N<O;N++)this.#f.insert(f,E[N],A);return}this.#f.insert(f,n,A)}match(f,n){return this.#f.search(f,n)}};var $0=class extends Dn{constructor(f={}){super(f);this.router=f.router??new S0({routers:[new Yf,new _0]})}};u0();import{z as y}from"zod";var e=y.enum(["decision","bugfix","feature","refactor","discovery","change"]);function C(f,n={}){return{data:f,error:null,meta:n}}function B(f,n,A){return{data:null,error:{code:f,message:n,details:A},meta:{}}}var Z={find:y.object({query:y.string().min(1),scope:y.enum(["project","user","all"]).optional().default("project"),types:y.array(e).optional(),limit:y.number().int().min(1).max(50).optional().default(10),cursor:y.string().optional(),include:y.object({snippets:y.boolean().optional(),scores:y.boolean().optional(),relations:y.boolean().optional()}).optional()}),history:y.object({limit:y.number().int().min(1).max(20).optional().default(5),cursor:y.string().optional(),sessionId:y.string().optional()}),get:y.object({ids:y.array(y.string()).min(1),includeHistory:y.boolean().optional().default(!1),limit:y.number().int().min(1).max(50).optional().default(10)}),create:y.object({title:y.string(),type:e,narrative:y.string(),concepts:y.array(y.string()).optional(),files:y.array(y.string()).optional(),importance:y.number().int().min(1).max(5).optional(),scope:y.enum(["project","user"]).optional().default("project")}),revise:y.object({id:y.string(),title:y.string().optional(),narrative:y.string().optional(),type:e.optional(),concepts:y.array(y.string()).optional(),importance:y.number().int().min(1).max(5).optional(),reason:y.string().optional()}),remove:y.object({id:y.string(),reason:y.string().optional()}),transferExport:y.object({scope:y.enum(["project"]).optional().default("project"),type:e.optional(),limit:y.number().int().min(1).optional(),format:y.enum(["json"]).optional().default("json")}),transferImport:y.object({payload:y.string(),mode:y.enum(["skip","merge","replace"]).optional().default("skip")}),maintenance:y.object({action:y.enum(["folderContextDryRun","folderContextClean","folderContextRebuild"])}),help:y.object({})};var F1=new Set(e.options);function C0(f,n,A=100){if(!f)return n;let E=Number.parseInt(f,10);if(Number.isNaN(E))return n;return Math.max(1,Math.min(E,A))}function c1(f){if(!f)return 0;let n=Number.parseInt(f,10);if(Number.isNaN(n))return 0;return Math.max(0,n)}function Un(f){if(!f)return;if(F1.has(f))return f;return}function jf(f){let n={};for(let[A,E]of Object.entries(f)){let N=A.toLowerCase();n[A]=typeof E==="string"&&(N.includes("key")||N.includes("api"))?"***REDACTED***":E}return n}function mn(f){let{projectPath:n,memoryEngine:A,runtimeStatusProvider:E,dashboardDir:N}=f,O=new $0;O.get("/v1/memory/observations",(M)=>{let _=C0(M.req.query("limit"),50),$=c1(M.req.query("offset")),R=Un(M.req.query("type")),D=M.req.query("sessionId"),l=M.req.query("state"),u=l==="current"||l==="superseded"||l==="tombstoned"?l:void 0,Q=A.listObservations({limit:_,offset:$,type:R,sessionId:D,state:u});return M.json(C(Q,{limit:_,offset:$}))}),O.post("/v1/memory/observations",async(M)=>{try{let _=await M.req.json(),$=await A.save({..._,sessionId:_.sessionId??`http-${Date.now()}`});if(!$)return M.json(B("CONFLICT","Unable to create observation"),409);return M.json(C($),201)}catch{return M.json(B("VALIDATION_ERROR","Invalid JSON body"),400)}}),O.get("/v1/memory/observations/:id",(M)=>{let _=M.req.param("id"),$=A.getObservation(_);if(!$)return M.json(B("NOT_FOUND","Observation not found"),404);return M.json(C($))}),O.get("/v1/memory/observations/:id/lineage",(M)=>{let _=M.req.param("id"),$=A.getLineage(_);if(!$)return M.json(B("NOT_FOUND","Observation not found"),404);return M.json(C({observationId:_,lineage:$}))}),O.get("/v1/memory/observations/:id/revision-diff",(M)=>{let _=M.req.param("id"),$=M.req.query("against");if(!$)return M.json(B("VALIDATION_ERROR","Query parameter 'against' is required"),400);let R=A.getRevisionDiff(_,$);if(!R)return M.json(B("NOT_FOUND","One or both observations not found"),404);if(M.req.query("version")==="1")return M.json(C({baseId:R.toId,againstId:R.fromId,changes:R.changedFields}));return M.json(C(R))}),O.post("/v1/memory/observations/:id/revisions",async(M)=>{let _=M.req.param("id");try{let $=await M.req.json(),R=await A.update({id:_,...$});if(!R)return M.json(B("NOT_FOUND","Observation not found"),404);return M.json(C({previousId:_,newId:R.id,observation:R}))}catch{return M.json(B("VALIDATION_ERROR","Invalid JSON body"),400)}}),O.post("/v1/memory/observations/:id/tombstone",async(M)=>{let _=M.req.param("id");if(await A.delete([_])===0)return M.json(B("NOT_FOUND","Observation not found"),404);return M.json(C({id:_,tombstoned:!0}))}),O.get("/v1/memory/sessions",(M)=>{let _=C0(M.req.query("limit"),20),$=M.req.query("projectPath")||n;return M.json(C(A.listSessions({limit:_,projectPath:$}),{limit:_}))}),O.get("/v1/memory/sessions/:id",(M)=>{let _=M.req.param("id"),$=A.getSession(_);if(!$)return M.json(B("NOT_FOUND","Session not found"),404);return M.json(C({...$.session,observations:$.observations,summary:$.summary}))}),O.get("/v1/memory/search",async(M)=>{let _=M.req.query("q");if(!_)return M.json(B("VALIDATION_ERROR","Query parameter 'q' is required"),400);let $=Un(M.req.query("type")),R=C0(M.req.query("limit"),20);try{let D=await A.search(_,{type:$,limit:R});return M.json(C(D,{limit:R}))}catch{return M.json(C([],{limit:R}))}}),O.post("/v1/memory/recall",async(M)=>{try{let _=await M.req.json(),$=await A.recall(_.ids??[],_.limit??10);return M.json(C($))}catch{return M.json(B("VALIDATION_ERROR","Invalid JSON body"),400)}}),O.post("/v1/memory/export",async(M)=>{try{let _=await M.req.json().catch(()=>({})),$=await A.export("project",{type:_.type,limit:_.limit});return M.json(C($))}catch(_){return M.json(B("INTERNAL_ERROR",String(_)),500)}}),O.post("/v1/memory/import",async(M)=>{try{let _=await M.req.json(),$=_.mode==="replace"?"overwrite":"skip-duplicates",R=await A.import(_.payload,{mode:$});return M.json(C(R))}catch{return M.json(B("VALIDATION_ERROR","Invalid import payload"),400)}}),O.get("/v1/memory/stats",(M)=>{return M.json(C(A.stats()))}),O.get("/v1/health",(M)=>{let _=A.getHealth(),$=A.getMetrics(),R=E?.(),D={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},l=R??D;return M.json(C({status:l.status,timestamp:l.timestamp,uptimeMs:l.uptimeMs,queue:l.queue,memory:{totalObservations:$.memory.totalObservations,totalSessions:$.memory.totalSessions}}))}),O.get("/v1/metrics",(M)=>{let _=A.getHealth(),R=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 M.json(C(R))}),O.get("/v1/platforms",(M)=>{let _=A.getAdapterStatuses();return M.json(C({platforms:_.map(($)=>({name:$.name,version:$.version,enabled:$.enabled,capabilities:$.capabilities}))}))}),O.get("/v1/adapters/status",(M)=>{return M.json(C(A.getAdapterStatuses()))}),O.get("/v1/config/schema",(M)=>M.json(C(R0()))),O.get("/v1/config/effective",async(M)=>{let _=await p(n);return M.json(C({config:jf(_.config),meta:_.meta,warnings:_.warnings}))}),O.post("/v1/config/preview",async(M)=>{try{let _=await M.req.json(),$=await l0(n,_);return M.json(C({config:jf($.config),meta:$.meta,warnings:$.warnings}))}catch{return M.json(B("VALIDATION_ERROR","Invalid JSON body"),400)}}),O.patch("/v1/config",async(M)=>{let _;try{_=await M.req.json()}catch{return M.json(B("VALIDATION_ERROR","Invalid JSON body"),400)}try{let $=await b(n),R=await Gf(n,_),D={};for(let l of Object.keys(_))if(Object.hasOwn($,l))D[l]=$[l];return A.trackConfigAudit({id:Rf(),timestamp:new Date().toISOString(),patch:_,previousValues:D,source:"api"}),M.json(C({config:jf(R.config),meta:R.meta,warnings:R.warnings}))}catch($){return M.json(B("INTERNAL_ERROR",String($)),500)}}),O.get("/v1/config/audit",(M)=>{return M.json(C(A.getConfigAuditTimeline()))}),O.post("/v1/config/rollback",async(M)=>{let _;try{_=await M.req.json()}catch{return M.json(B("VALIDATION_ERROR","Invalid JSON body"),400)}if(!_.eventId)return M.json(B("VALIDATION_ERROR","eventId is required"),400);try{let $=await A.rollbackConfig(_.eventId);if(!$)return M.json(B("NOT_FOUND","Audit event not found"),404);return M.json(C($))}catch($){return M.json(B("INTERNAL_ERROR",String($)),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(O.get("/v1/modes",(M)=>M.json(C({modes:Object.entries(S).map(([_,$])=>({id:_,patch:$}))}))),O.post("/v1/modes/:id/apply",async(M)=>{let _=M.req.param("id"),$=S[_];if(!$)return M.json(B("NOT_FOUND","Unknown mode"),404);try{let R=await b(n),D=await Gf(n,$),l={};for(let u of Object.keys($))if(Object.hasOwn(R,u))l[u]=R[u];return A.trackConfigAudit({id:Rf(),timestamp:new Date().toISOString(),patch:$,previousValues:l,source:"mode"}),M.json(C({applied:_,config:jf(D.config),meta:D.meta,warnings:D.warnings}))}catch(R){return M.json(B("INTERNAL_ERROR",String(R)),500)}}),O.post("/v1/maintenance/folder-context/dry-run",async(M)=>{try{let $=(await M.req.json().catch(()=>({}))).action??"clean",R=await A.maintainFolderContext($,!0);return A.trackMaintenanceResult({id:Rf(),timestamp:new Date().toISOString(),action:`folder-context-${$}-dry-run`,dryRun:!0,result:R}),M.json(C(R))}catch(_){return M.json(B("INTERNAL_ERROR",String(_)),500)}}),O.post("/v1/maintenance/folder-context/clean",async(M)=>{try{let _=await A.maintainFolderContext("clean",!1);return A.trackMaintenanceResult({id:Rf(),timestamp:new Date().toISOString(),action:"folder-context-clean",dryRun:!1,result:_}),M.json(C(_))}catch(_){return M.json(B("INTERNAL_ERROR",String(_)),500)}}),O.post("/v1/maintenance/folder-context/rebuild",async(M)=>{try{let _=await A.maintainFolderContext("rebuild",!1);return A.trackMaintenanceResult({id:Rf(),timestamp:new Date().toISOString(),action:"folder-context-rebuild",dryRun:!1,result:_}),M.json(C(_))}catch(_){return M.json(B("INTERNAL_ERROR",String(_)),500)}}),O.get("/v1/maintenance/history",(M)=>{return M.json(C(A.getMaintenanceHistory()))}),f.sseHandler)O.get("/v1/events",f.sseHandler);return O.get("*",async(M)=>{let _=M.req.path;if(_.startsWith("/v1/"))return M.json(B("NOT_FOUND","Not found"),404);let $=N??y0(Y1(import.meta.url),"../../dist/dashboard"),R=m1($),D=R.endsWith(Zn)?R:`${R}${Zn}`,l=_==="/"?"index.html":_.replace(/^\//,""),u=y0($,l);if(!u.startsWith(D))return M.json(B("NOT_FOUND","Not found"),404);try{let V=Bun.file(u);if(await V.exists())return new Response(V)}catch{}let Q=y0($,"index.html");if(!Q.startsWith(D))return M.json(B("NOT_FOUND","Not found"),404);try{let V=Bun.file(Q);if(await V.exists())return new Response(V,{headers:{"Content-Type":"text/html; charset=utf-8"}})}catch{}return M.json(B("NOT_FOUND","Dashboard not found. Run the dashboard build first."),404)}),O}var V0=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 A=n.getReader();this.abortSubscribers.push(async()=>{await A.cancel()}),this.responseReadable=new ReadableStream({async pull(E){let{done:N,value:O}=await A.read();N?E.close():E.enqueue(O)},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 Hf=()=>{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 Hf=()=>n,n};var Yn=class extends V0{constructor(f,n){super(f,n)}async writeSSE(f){let A=(await Of(f.data,Xf.Stringify,!1,{})).split(/\r\n|\r|\n/).map((N)=>{return`data: ${N}`}).join(`
4
- `),E=[f.event&&`event: ${f.event}`,A,f.id&&`id: ${f.id}`,f.retry&&`retry: ${f.retry}`].filter(Boolean).join(`
2
+ var iA=Object.create;var{getPrototypeOf:tA,defineProperty:A0,getOwnPropertyNames:aA}=Object;var dA=Object.prototype.hasOwnProperty;var sA=(f,A,E)=>{E=f!=null?iA(tA(f)):{};let N=A||!f||!f.__esModule?A0(E,"default",{value:f,enumerable:!0}):E;for(let O of aA(f))if(!dA.call(N,O))A0(N,O,{get:()=>f[O],enumerable:!0});return N};var oA=(f,A)=>{for(var E in A)A0(f,E,{get:A[E],enumerable:!0,configurable:!0,set:(N)=>A[E]=()=>N})};var s0=(f,A)=>()=>(f&&(A=f(f=0)),A);var x=import.meta.require;import{existsSync as JE,readFileSync as BE}from"fs";function QE(){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((A)=>A.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((A)=>A.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((A)=>A.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 A=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_LOW);if(!Number.isNaN(A))f.conflictSimilarityBandLow=A}if(process.env.OPEN_MEM_CONFLICT_BAND_HIGH){let A=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_HIGH);if(!Number.isNaN(A))f.conflictSimilarityBandHigh=A}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 LE(f){let A=`${f}/.open-mem/config.json`;if(!JE(A))return{};try{let E=BE(A,"utf-8"),N=JSON.parse(E);if(!N||typeof N!=="object"||Array.isArray(N))return{};return N}catch{return{}}}function zE(f){switch(f){case"google":return 768;case"openai":return 1536;case"bedrock":return 1024;case"anthropic":return 0;default:return 768}}function e(f,A){let E=LE(f),N=QE(),O={...W1,...E,...N,...A};if(!O.dbPath.startsWith("/"))O.dbPath=`${f}/${O.dbPath}`;if(!process.env.OPEN_MEM_PROVIDER&&!A?.provider){if(process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY)O.provider="google";else if(process.env.ANTHROPIC_API_KEY)O.provider="anthropic";else if(process.env.AWS_BEARER_TOKEN_BEDROCK||process.env.AWS_ACCESS_KEY_ID||process.env.AWS_PROFILE)O.provider="bedrock"}if(!O.apiKey)switch(O.provider){case"google":O.apiKey=process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;break;case"anthropic":O.apiKey=process.env.ANTHROPIC_API_KEY;break;case"openai":O.apiKey=process.env.OPENAI_API_KEY;break;case"bedrock":break}if(O.embeddingDimension===void 0)O.embeddingDimension=zE(O.provider);return O}function X1(f){let A=[],E=f.provider!=="bedrock";if(f.compressionEnabled&&E&&!f.apiKey)A.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)A.push("maxContextTokens must be at least 500");if(f.batchSize<1)A.push("batchSize must be at least 1");if(f.minOutputLength<0)A.push("minOutputLength must be non-negative");return A}function lf(){return{...W1}}async function K1(f){let A=f.dbPath.substring(0,f.dbPath.lastIndexOf("/")),{mkdir:E}=await import("fs/promises");await E(A,{recursive:!0})}var W1;var mf=s0(()=>{W1={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 n1={};oA(n1,{writeProjectConfig:()=>Y1,validatePatch:()=>V0,readProjectConfig:()=>r,previewConfig:()=>y0,patchConfig:()=>jf,getEffectiveConfig:()=>b,getConfigSchema:()=>C0});import{existsSync as WE}from"fs";import{mkdir as XE,readFile as KE,writeFile as ZE}from"fs/promises";import{dirname as UE,join as uE}from"path";function U1(f){return uE(f,".open-mem","config.json")}function u1(f){return Z1.find((A)=>A.key===f)}function nE(f,A){let E=u1(f);if(!E)return null;if(E.type==="string"&&typeof A!=="string")return`${String(f)} must be a string`;if(E.type==="number"&&typeof A!=="number")return`${String(f)} must be a number`;if(E.type==="boolean"&&typeof A!=="boolean")return`${String(f)} must be a boolean`;if(E.type==="array"&&!Array.isArray(A))return`${String(f)} must be an array`;if(E.enum&&typeof A==="string"&&!E.enum.includes(A))return`${String(f)} must be one of: ${E.enum.join(", ")}`;if(typeof A==="number"){if(E.min!==void 0&&A<E.min)return`${String(f)} must be >= ${E.min}`;if(E.max!==void 0&&A>E.max)return`${String(f)} must be <= ${E.max}`}return null}function C0(){return Z1}async function r(f){let A=U1(f);if(!WE(A))return{};try{let E=await KE(A,"utf-8"),N=JSON.parse(E);if(!N||typeof N!=="object"||Array.isArray(N))return{};return N}catch{return{}}}async function Y1(f,A){let E=U1(f),O={...await r(f),...A};await XE(UE(E),{recursive:!0}),await ZE(E,JSON.stringify(O,null,2),"utf-8")}function V0(f){let A=[];for(let[E,N]of Object.entries(f)){let M=nE(E,N);if(M)A.push(M)}return A}async function b(f){let A=lf(),E=await r(f),N=e(f),O=[],M={};for(let[$,_]of Object.entries(A)){let S=$,R=u1(S),C=(YE[S]??[]).some((W)=>typeof process.env[W]==="string"),V=Object.hasOwn(E,S),y="default";if(V)y="file";if(C)y="env";if(M[S]={source:y,locked:C,restartRequired:R?.restartRequired??!1,liveApply:R?.liveApply??!1},y==="env"&&V)O.push(`${String(S)} is overridden by environment variable.`);if(N[S]===void 0&&_!==void 0)O.push(`${String(S)} resolved to undefined unexpectedly.`)}return{config:N,meta:M,warnings:O}}async function y0(f,A){let E=V0(A);if(E.length>0)return{...await b(f),warnings:E};let N=lf(),O=await r(f),M={...N,...O,...A},_={...e(f,A),...M},S=(await b(f)).meta;return{config:_,meta:S,warnings:[]}}async function jf(f,A){let E=V0(A);if(E.length>0)return{...await b(f),warnings:E};return await Y1(f,A),b(f)}var Z1,YE;var J0=s0(()=>{mf();Z1=[{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}],YE={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 FO}from"fs";import{dirname as GO,join as d}from"path";import{fileURLToPath as HO}from"url";import{randomUUID as Vf}from"crypto";import{normalize as FE,resolve as B0,sep as F1}from"path";import{fileURLToPath as GE}from"url";var E0=(f,A,E)=>{return(N,O)=>{let M=-1;return $(0);async function $(_){if(_<=M)throw Error("next() called multiple times");M=_;let S,R=!1,D;if(f[_])D=f[_][0][0],N.req.routeIndex=_;else D=_===f.length&&O||void 0;if(D)try{S=await D(N,()=>$(_+1))}catch(C){if(C instanceof Error&&A)N.error=C,S=await A(C,N),R=!0;else throw C}else if(N.finalized===!1&&E)S=await E(N);if(S&&(N.finalized===!1||R))N.res=S;return N}}};var o0=Symbol();var e0=async(f,A=Object.create(null))=>{let{all:E=!1,dot:N=!1}=A,M=(f instanceof Xf?f.raw.headers:f.headers).get("Content-Type");if(M?.startsWith("multipart/form-data")||M?.startsWith("application/x-www-form-urlencoded"))return eA(f,{all:E,dot:N});return{}};async function eA(f,A){let E=await f.formData();if(E)return fE(E,A);return{}}function fE(f,A){let E=Object.create(null);if(f.forEach((N,O)=>{if(!(A.all||O.endsWith("[]")))E[O]=N;else AE(E,O,N)}),A.dot)Object.entries(E).forEach(([N,O])=>{if(N.includes("."))EE(E,N,O),delete E[N]});return E}var AE=(f,A,E)=>{if(f[A]!==void 0)if(Array.isArray(f[A]))f[A].push(E);else f[A]=[f[A],E];else if(!A.endsWith("[]"))f[A]=E;else f[A]=[E]},EE=(f,A,E)=>{let N=f,O=A.split(".");O.forEach((M,$)=>{if($===O.length-1)N[M]=E;else{if(!N[M]||typeof N[M]!=="object"||Array.isArray(N[M])||N[M]instanceof File)N[M]=Object.create(null);N=N[M]}})};var O0=(f)=>{let A=f.split("/");if(A[0]==="")A.shift();return A},f1=(f)=>{let{groups:A,path:E}=NE(f),N=O0(E);return OE(N,A)},NE=(f)=>{let A=[];return f=f.replace(/\{[^}]+\}/g,(E,N)=>{let O=`@${N}`;return A.push([O,E]),O}),{groups:A,path:f}},OE=(f,A)=>{for(let E=A.length-1;E>=0;E--){let[N]=A[E];for(let O=f.length-1;O>=0;O--)if(f[O].includes(N)){f[O]=f[O].replace(N,A[E][1]);break}}return f},Kf={},A1=(f,A)=>{if(f==="*")return"*";let E=f.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(E){let N=`${f}#${A}`;if(!Kf[N])if(E[2])Kf[N]=A&&A[0]!==":"&&A[0]!=="*"?[N,E[1],new RegExp(`^${E[2]}(?=/${A})`)]:[f,E[1],new RegExp(`^${E[2]}$`)];else Kf[N]=[f,E[1],!0];return Kf[N]}return null},Zf=(f,A)=>{try{return A(f)}catch{return f.replace(/(?:%[0-9A-Fa-f]{2})+/g,(E)=>{try{return A(E)}catch{return E}})}},ME=(f)=>Zf(f,decodeURI),M0=(f)=>{let A=f.url,E=A.indexOf("/",A.indexOf(":")+4),N=E;for(;N<A.length;N++){let O=A.charCodeAt(N);if(O===37){let M=A.indexOf("?",N),$=A.slice(E,M===-1?void 0:M);return ME($.includes("%25")?$.replace(/%25/g,"%2525"):$)}else if(O===63)break}return A.slice(E,N)};var E1=(f)=>{let A=M0(f);return A.length>1&&A.at(-1)==="/"?A.slice(0,-1):A},h=(f,A,...E)=>{if(E.length)A=h(A,...E);return`${f?.[0]==="/"?"":"/"}${f}${A==="/"?"":`${f?.at(-1)==="/"?"":"/"}${A?.[0]==="/"?A.slice(1):A}`}`},Uf=(f)=>{if(f.charCodeAt(f.length-1)!==63||!f.includes(":"))return null;let A=f.split("/"),E=[],N="";return A.forEach((O)=>{if(O!==""&&!/\:/.test(O))N+="/"+O;else if(/\:/.test(O))if(/\?/.test(O)){if(E.length===0&&N==="")E.push("/");else E.push(N);let M=O.replace("?","");N+="/"+M,E.push(N)}else N+="/"+O}),E.filter((O,M,$)=>$.indexOf(O)===M)},N0=(f)=>{if(!/[%+]/.test(f))return f;if(f.indexOf("+")!==-1)f=f.replace(/\+/g," ");return f.indexOf("%")!==-1?Zf(f,_0):f},N1=(f,A,E)=>{let N;if(!E&&A&&!/[%+]/.test(A)){let $=f.indexOf("?",8);if($===-1)return;if(!f.startsWith(A,$+1))$=f.indexOf(`&${A}`,$+1);while($!==-1){let _=f.charCodeAt($+A.length+1);if(_===61){let S=$+A.length+2,R=f.indexOf("&",S);return N0(f.slice(S,R===-1?void 0:R))}else if(_==38||isNaN(_))return"";$=f.indexOf(`&${A}`,$+1)}if(N=/[%+]/.test(f),!N)return}let O={};N??=/[%+]/.test(f);let M=f.indexOf("?",8);while(M!==-1){let $=f.indexOf("&",M+1),_=f.indexOf("=",M);if(_>$&&$!==-1)_=-1;let S=f.slice(M+1,_===-1?$===-1?void 0:$:_);if(N)S=N0(S);if(M=$,S==="")continue;let R;if(_===-1)R="";else if(R=f.slice(_+1,$===-1?void 0:$),N)R=N0(R);if(E){if(!(O[S]&&Array.isArray(O[S])))O[S]=[];O[S].push(R)}else O[S]??=R}return A?O[A]:O},O1=N1,M1=(f,A)=>{return N1(f,A,!0)},_0=decodeURIComponent;var _1=(f)=>Zf(f,_0),Xf=class{raw;#f;#A;routeIndex=0;path;bodyCache={};constructor(f,A="/",E=[[]]){this.raw=f,this.path=A,this.#A=E,this.#f={}}param(f){return f?this.#E(f):this.#M()}#E(f){let A=this.#A[0][this.routeIndex][1][f],E=this.#O(A);return E&&/\%/.test(E)?_1(E):E}#M(){let f={},A=Object.keys(this.#A[0][this.routeIndex][1]);for(let E of A){let N=this.#O(this.#A[0][this.routeIndex][1][E]);if(N!==void 0)f[E]=/\%/.test(N)?_1(N):N}return f}#O(f){return this.#A[1]?this.#A[1][f]:f}query(f){return O1(this.url,f)}queries(f){return M1(this.url,f)}header(f){if(f)return this.raw.headers.get(f)??void 0;let A={};return this.raw.headers.forEach((E,N)=>{A[N]=E}),A}async parseBody(f){return this.bodyCache.parsedBody??=await e0(this,f)}#N=(f)=>{let{bodyCache:A,raw:E}=this,N=A[f];if(N)return N;let O=Object.keys(A)[0];if(O)return A[O].then((M)=>{if(O==="json")M=JSON.stringify(M);return new Response(M)[f]()});return A[f]=E[f]()};json(){return this.#N("text").then((f)=>JSON.parse(f))}text(){return this.#N("text")}arrayBuffer(){return this.#N("arrayBuffer")}blob(){return this.#N("blob")}formData(){return this.#N("formData")}addValidatedData(f,A){this.#f[f]=A}valid(f){return this.#f[f]}get url(){return this.raw.url}get method(){return this.raw.method}get[o0](){return this.#A}get matchedRoutes(){return this.#A[0].map(([[,f]])=>f)}get routePath(){return this.#A[0].map(([[,f]])=>f)[this.routeIndex].path}};var uf={Stringify:1,BeforeStream:2,Stream:3},_E=(f,A)=>{let E=new String(f);return E.isEscaped=!0,E.callbacks=A,E};var $f=async(f,A,E,N,O)=>{if(typeof f==="object"&&!(f instanceof String)){if(!(f instanceof Promise))f=f.toString();if(f instanceof Promise)f=await f}let M=f.callbacks;if(!M?.length)return Promise.resolve(f);if(O)O[0]+=f;else O=[f];let $=Promise.all(M.map((_)=>_({phase:A,buffer:O,context:N}))).then((_)=>Promise.all(_.filter(Boolean).map((S)=>$f(S,A,!1,N,O))).then(()=>O[0]));if(E)return _E(await $,M);else return $};var $1="text/plain; charset=UTF-8",$0=(f,A)=>{return{"Content-Type":f,...A}},S1=class{#f;#A;env={};#E;finalized=!1;error;#M;#O;#N;#D;#S;#R;#$;#C;#V;constructor(f,A){if(this.#f=f,A)this.#O=A.executionCtx,this.env=A.env,this.#R=A.notFoundHandler,this.#V=A.path,this.#C=A.matchResult}get req(){return this.#A??=new Xf(this.#f,this.#V,this.#C),this.#A}get event(){if(this.#O&&"respondWith"in this.#O)return this.#O;else throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#O)return this.#O;else throw Error("This context has no ExecutionContext")}get res(){return this.#N||=new Response(null,{headers:this.#$??=new Headers})}set res(f){if(this.#N&&f){f=new Response(f.body,f);for(let[A,E]of this.#N.headers.entries()){if(A==="content-type")continue;if(A==="set-cookie"){let N=this.#N.headers.getSetCookie();f.headers.delete("set-cookie");for(let O of N)f.headers.append("set-cookie",O)}else f.headers.set(A,E)}}this.#N=f,this.finalized=!0}render=(...f)=>{return this.#S??=(A)=>this.html(A),this.#S(...f)};setLayout=(f)=>this.#D=f;getLayout=()=>this.#D;setRenderer=(f)=>{this.#S=f};header=(f,A,E)=>{if(this.finalized)this.#N=new Response(this.#N.body,this.#N);let N=this.#N?this.#N.headers:this.#$??=new Headers;if(A===void 0)N.delete(f);else if(E?.append)N.append(f,A);else N.set(f,A)};status=(f)=>{this.#M=f};set=(f,A)=>{this.#E??=new Map,this.#E.set(f,A)};get=(f)=>{return this.#E?this.#E.get(f):void 0};get var(){if(!this.#E)return{};return Object.fromEntries(this.#E)}#_(f,A,E){let N=this.#N?new Headers(this.#N.headers):this.#$??new Headers;if(typeof A==="object"&&"headers"in A){let M=A.headers instanceof Headers?A.headers:new Headers(A.headers);for(let[$,_]of M)if($.toLowerCase()==="set-cookie")N.append($,_);else N.set($,_)}if(E)for(let[M,$]of Object.entries(E))if(typeof $==="string")N.set(M,$);else{N.delete(M);for(let _ of $)N.append(M,_)}let O=typeof A==="number"?A:A?.status??this.#M;return new Response(f,{status:O,headers:N})}newResponse=(...f)=>this.#_(...f);body=(f,A,E)=>this.#_(f,A,E);text=(f,A,E)=>{return!this.#$&&!this.#M&&!A&&!E&&!this.finalized?new Response(f):this.#_(f,A,$0($1,E))};json=(f,A,E)=>{return this.#_(JSON.stringify(f),A,$0("application/json",E))};html=(f,A,E)=>{let N=(O)=>this.#_(O,A,$0("text/html; charset=UTF-8",E));return typeof f==="object"?$f(f,uf.Stringify,!1,{}).then(N):N(f)};redirect=(f,A)=>{let E=String(f);return this.header("Location",!/[^\x00-\xFF]/.test(E)?E:encodeURI(E)),this.newResponse(null,A??302)};notFound=()=>{return this.#R??=()=>new Response,this.#R(this)}};var K="ALL",R1="all",D1=["get","post","put","delete","options","patch"],Yf="Can not add a route since the matcher is already built.",nf=class extends Error{};var C1="__COMPOSED_HANDLER";var $E=(f)=>{return f.text("404 Not Found",404)},V1=(f,A)=>{if("getResponse"in f){let E=f.getResponse();return A.newResponse(E.body,E)}return console.error(f),A.text("Internal Server Error",500)},y1=class f{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#f="/";routes=[];constructor(A={}){[...D1,R1].forEach((M)=>{this[M]=($,..._)=>{if(typeof $==="string")this.#f=$;else this.#M(M,this.#f,$);return _.forEach((S)=>{this.#M(M,this.#f,S)}),this}}),this.on=(M,$,..._)=>{for(let S of[$].flat()){this.#f=S;for(let R of[M].flat())_.map((D)=>{this.#M(R.toUpperCase(),this.#f,D)})}return this},this.use=(M,...$)=>{if(typeof M==="string")this.#f=M;else this.#f="*",$.unshift(M);return $.forEach((_)=>{this.#M(K,this.#f,_)}),this};let{strict:N,...O}=A;Object.assign(this,O),this.getPath=N??!0?A.getPath??M0:E1}#A(){let A=new f({router:this.router,getPath:this.getPath});return A.errorHandler=this.errorHandler,A.#E=this.#E,A.routes=this.routes,A}#E=$E;errorHandler=V1;route(A,E){let N=this.basePath(A);return E.routes.map((O)=>{let M;if(E.errorHandler===V1)M=O.handler;else M=async($,_)=>(await E0([],E.errorHandler)($,()=>O.handler($,_))).res,M[C1]=O.handler;N.#M(O.method,O.path,M)}),this}basePath(A){let E=this.#A();return E._basePath=h(this._basePath,A),E}onError=(A)=>{return this.errorHandler=A,this};notFound=(A)=>{return this.#E=A,this};mount(A,E,N){let O,M;if(N)if(typeof N==="function")M=N;else if(M=N.optionHandler,N.replaceRequest===!1)O=(S)=>S;else O=N.replaceRequest;let $=M?(S)=>{let R=M(S);return Array.isArray(R)?R:[R]}:(S)=>{let R=void 0;try{R=S.executionCtx}catch{}return[S.env,R]};O||=(()=>{let S=h(this._basePath,A),R=S==="/"?0:S.length;return(D)=>{let C=new URL(D.url);return C.pathname=C.pathname.slice(R)||"/",new Request(C,D)}})();let _=async(S,R)=>{let D=await E(O(S.req.raw),...$(S));if(D)return D;await R()};return this.#M(K,h(A,"*"),_),this}#M(A,E,N){A=A.toUpperCase(),E=h(this._basePath,E);let O={basePath:this._basePath,path:E,method:A,handler:N};this.router.add(A,E,[N,O]),this.routes.push(O)}#O(A,E){if(A instanceof Error)return this.errorHandler(A,E);throw A}#N(A,E,N,O){if(O==="HEAD")return(async()=>new Response(null,await this.#N(A,E,N,"GET")))();let M=this.getPath(A,{env:N}),$=this.router.match(O,M),_=new S1(A,{path:M,matchResult:$,env:N,executionCtx:E,notFoundHandler:this.#E});if($[0].length===1){let R;try{R=$[0][0][0][0](_,async()=>{_.res=await this.#E(_)})}catch(D){return this.#O(D,_)}return R instanceof Promise?R.then((D)=>D||(_.finalized?_.res:this.#E(_))).catch((D)=>this.#O(D,_)):R??this.#E(_)}let S=E0($[0],this.errorHandler,this.#E);return(async()=>{try{let R=await S(_);if(!R.finalized)throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return R.res}catch(R){return this.#O(R,_)}})()}fetch=(A,...E)=>{return this.#N(A,E[1],E[0],A.method)};request=(A,E,N,O)=>{if(A instanceof Request)return this.fetch(E?new Request(A,E):A,N,O);return A=A.toString(),this.fetch(new Request(/^https?:\/\//.test(A)?A:`http://localhost${h("/",A)}`,E),N,O)};fire=()=>{addEventListener("fetch",(A)=>{A.respondWith(this.#N(A.request,A,void 0,A.request.method))})}};var Sf=[];function Ff(f,A){let E=this.buildAllMatchers(),N=(O,M)=>{let $=E[O]||E[K],_=$[2][M];if(_)return _;let S=M.match($[0]);if(!S)return[[],Sf];let R=S.indexOf("",1);return[$[1][R],S]};return this.match=N,N(f,A)}var Gf="[^/]+",Rf=".*",Df="(?:|/.*)",p=Symbol(),SE=new Set(".\\+*[^]$()");function RE(f,A){if(f.length===1)return A.length===1?f<A?-1:1:-1;if(A.length===1)return 1;if(f===Rf||f===Df)return 1;else if(A===Rf||A===Df)return-1;if(f===Gf)return 1;else if(A===Gf)return-1;return f.length===A.length?f<A?-1:1:A.length-f.length}var J1=class f{#f;#A;#E=Object.create(null);insert(A,E,N,O,M){if(A.length===0){if(this.#f!==void 0)throw p;if(M)return;this.#f=E;return}let[$,..._]=A,S=$==="*"?_.length===0?["","",Rf]:["","",Gf]:$==="/*"?["","",Df]:$.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),R;if(S){let D=S[1],C=S[2]||Gf;if(D&&S[2]){if(C===".*")throw p;if(C=C.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(C))throw p}if(R=this.#E[C],!R){if(Object.keys(this.#E).some((V)=>V!==Rf&&V!==Df))throw p;if(M)return;if(R=this.#E[C]=new f,D!=="")R.#A=O.varIndex++}if(!M&&D!=="")N.push([D,R.#A])}else if(R=this.#E[$],!R){if(Object.keys(this.#E).some((D)=>D.length>1&&D!==Rf&&D!==Df))throw p;if(M)return;R=this.#E[$]=new f}R.insert(_,E,N,O,M)}buildRegExpStr(){let E=Object.keys(this.#E).sort(RE).map((N)=>{let O=this.#E[N];return(typeof O.#A==="number"?`(${N})@${O.#A}`:SE.has(N)?`\\${N}`:N)+O.buildRegExpStr()});if(typeof this.#f==="number")E.unshift(`#${this.#f}`);if(E.length===0)return"";if(E.length===1)return E[0];return"(?:"+E.join("|")+")"}};var B1=class{#f={varIndex:0};#A=new J1;insert(f,A,E){let N=[],O=[];for(let $=0;;){let _=!1;if(f=f.replace(/\{[^}]+\}/g,(S)=>{let R=`@\\${$}`;return O[$]=[R,S],$++,_=!0,R}),!_)break}let M=f.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let $=O.length-1;$>=0;$--){let[_]=O[$];for(let S=M.length-1;S>=0;S--)if(M[S].indexOf(_)!==-1){M[S]=M[S].replace(_,O[$][1]);break}}return this.#A.insert(M,A,N,this.#f,E),N}buildRegExp(){let f=this.#A.buildRegExpStr();if(f==="")return[/^$/,[],[]];let A=0,E=[],N=[];return f=f.replace(/#(\d+)|@(\d+)|\.\*\$/g,(O,M,$)=>{if(M!==void 0)return E[++A]=Number(M),"$()";if($!==void 0)return N[Number($)]=++A,"";return""}),[new RegExp(`^${f}`),E,N]}};var DE=[/^$/,[],Object.create(null)],Q1=Object.create(null);function L1(f){return Q1[f]??=new RegExp(f==="*"?"":`^${f.replace(/\/\*$|([.\\+*[^\]$()])/g,(A,E)=>E?`\\${E}`:"(?:|/.*)")}$`)}function CE(){Q1=Object.create(null)}function VE(f){let A=new B1,E=[];if(f.length===0)return DE;let N=f.map((R)=>[!/\*|\/:/.test(R[0]),...R]).sort(([R,D],[C,V])=>R?1:C?-1:D.length-V.length),O=Object.create(null);for(let R=0,D=-1,C=N.length;R<C;R++){let[V,y,W]=N[R];if(V)O[y]=[W.map(([z])=>[z,Object.create(null)]),Sf];else D++;let Q;try{Q=A.insert(y,D,V)}catch(z){throw z===p?new nf(y):z}if(V)continue;E[D]=W.map(([z,Z])=>{let H=Object.create(null);Z-=1;for(;Z>=0;Z--){let[u,n]=Q[Z];H[u]=n}return[z,H]})}let[M,$,_]=A.buildRegExp();for(let R=0,D=E.length;R<D;R++)for(let C=0,V=E[R].length;C<V;C++){let y=E[R][C]?.[1];if(!y)continue;let W=Object.keys(y);for(let Q=0,z=W.length;Q<z;Q++)y[W[Q]]=_[y[W[Q]]]}let S=[];for(let R in $)S[R]=E[$[R]];return[M,S,O]}function o(f,A){if(!f)return;for(let E of Object.keys(f).sort((N,O)=>O.length-N.length))if(L1(E).test(A))return[...f[E]];return}var Hf=class{name="RegExpRouter";#f;#A;constructor(){this.#f={[K]:Object.create(null)},this.#A={[K]:Object.create(null)}}add(f,A,E){let N=this.#f,O=this.#A;if(!N||!O)throw Error(Yf);if(!N[f])[N,O].forEach((_)=>{_[f]=Object.create(null),Object.keys(_[K]).forEach((S)=>{_[f][S]=[..._[K][S]]})});if(A==="/*")A="*";let M=(A.match(/\/:/g)||[]).length;if(/\*$/.test(A)){let _=L1(A);if(f===K)Object.keys(N).forEach((S)=>{N[S][A]||=o(N[S],A)||o(N[K],A)||[]});else N[f][A]||=o(N[f],A)||o(N[K],A)||[];Object.keys(N).forEach((S)=>{if(f===K||f===S)Object.keys(N[S]).forEach((R)=>{_.test(R)&&N[S][R].push([E,M])})}),Object.keys(O).forEach((S)=>{if(f===K||f===S)Object.keys(O[S]).forEach((R)=>_.test(R)&&O[S][R].push([E,M]))});return}let $=Uf(A)||[A];for(let _=0,S=$.length;_<S;_++){let R=$[_];Object.keys(O).forEach((D)=>{if(f===K||f===D)O[D][R]||=[...o(N[D],R)||o(N[K],R)||[]],O[D][R].push([E,M-S+_+1])})}}match=Ff;buildAllMatchers(){let f=Object.create(null);return Object.keys(this.#A).concat(Object.keys(this.#f)).forEach((A)=>{f[A]||=this.#E(A)}),this.#f=this.#A=void 0,CE(),f}#E(f){let A=[],E=f===K;if([this.#f,this.#A].forEach((N)=>{let O=N[f]?Object.keys(N[f]).map((M)=>[M,N[f][M]]):[];if(O.length!==0)E||=!0,A.push(...O);else if(f!==K)A.push(...Object.keys(N[K]).map((M)=>[M,N[K][M]]))}),!E)return null;else return VE(A)}};var yE=class{name="PreparedRegExpRouter";#f;#A;constructor(f,A){this.#f=f,this.#A=A}#E(f,A){let E=this.#f[f];E[1].forEach((N)=>N&&N.push(A)),Object.values(E[2]).forEach((N)=>N[0].push(A))}#M(f,A,E,N,O){let M=this.#f[f];if(!O)M[2][A][0].push([E,{}]);else N.forEach(($)=>{if(typeof $==="number")M[1][$].push([E,O]);else M[2][$||A][0].push([E,O])})}add(f,A,E){if(!this.#f[f]){let O=this.#f[K],M={};for(let $ in O[2])M[$]=[O[2][$][0].slice(),Sf];this.#f[f]=[O[0],O[1].map(($)=>Array.isArray($)?$.slice():0),M]}if(A==="/*"||A==="*"){let O=[E,{}];if(f===K)for(let M in this.#f)this.#E(M,O);else this.#E(f,O);return}let N=this.#A[A];if(!N)throw Error(`Path ${A} is not registered`);for(let[O,M]of N)if(f===K)for(let $ in this.#f)this.#M($,A,E,O,M);else this.#M(f,A,E,O,M)}buildAllMatchers(){return this.#f}match=Ff};var S0=class{name="SmartRouter";#f=[];#A=[];constructor(f){this.#f=f.routers}add(f,A,E){if(!this.#A)throw Error(Yf);this.#A.push([f,A,E])}match(f,A){if(!this.#A)throw Error("Fatal error");let E=this.#f,N=this.#A,O=E.length,M=0,$;for(;M<O;M++){let _=E[M];try{for(let S=0,R=N.length;S<R;S++)_.add(...N[S]);$=_.match(f,A)}catch(S){if(S instanceof nf)continue;throw S}this.match=_.match.bind(_),this.#f=[_],this.#A=void 0;break}if(M===O)throw Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,$}get activeRouter(){if(this.#A||this.#f.length!==1)throw Error("No active router has been determined yet.");return this.#f[0]}};var Cf=Object.create(null),z1=class f{#f;#A;#E;#M=0;#O=Cf;constructor(A,E,N){if(this.#A=N||Object.create(null),this.#f=[],A&&E){let O=Object.create(null);O[A]={handler:E,possibleKeys:[],score:0},this.#f=[O]}this.#E=[]}insert(A,E,N){this.#M=++this.#M;let O=this,M=f1(E),$=[];for(let _=0,S=M.length;_<S;_++){let R=M[_],D=M[_+1],C=A1(R,D),V=Array.isArray(C)?C[0]:R;if(V in O.#A){if(O=O.#A[V],C)$.push(C[1]);continue}if(O.#A[V]=new f,C)O.#E.push(C),$.push(C[1]);O=O.#A[V]}return O.#f.push({[A]:{handler:N,possibleKeys:$.filter((_,S,R)=>R.indexOf(_)===S),score:this.#M}}),O}#N(A,E,N,O){let M=[];for(let $=0,_=A.#f.length;$<_;$++){let S=A.#f[$],R=S[E]||S[K],D={};if(R!==void 0){if(R.params=Object.create(null),M.push(R),N!==Cf||O&&O!==Cf)for(let C=0,V=R.possibleKeys.length;C<V;C++){let y=R.possibleKeys[C],W=D[R.score];R.params[y]=O?.[y]&&!W?O[y]:N[y]??O?.[y],D[R.score]=!0}}}return M}search(A,E){let N=[];this.#O=Cf;let M=[this],$=O0(E),_=[];for(let S=0,R=$.length;S<R;S++){let D=$[S],C=S===R-1,V=[];for(let y=0,W=M.length;y<W;y++){let Q=M[y],z=Q.#A[D];if(z)if(z.#O=Q.#O,C){if(z.#A["*"])N.push(...this.#N(z.#A["*"],A,Q.#O));N.push(...this.#N(z,A,Q.#O))}else V.push(z);for(let Z=0,H=Q.#E.length;Z<H;Z++){let u=Q.#E[Z],n=Q.#O===Cf?{}:{...Q.#O};if(u==="*"){let P=Q.#A["*"];if(P)N.push(...this.#N(P,A,Q.#O)),P.#O=n,V.push(P);continue}let[Lf,w,j]=u;if(!D&&!(j instanceof RegExp))continue;let l=Q.#A[Lf],sf=$.slice(S).join("/");if(j instanceof RegExp){let P=j.exec(sf);if(P){if(n[w]=P[0],N.push(...this.#N(l,A,Q.#O,n)),Object.keys(l.#A).length){l.#O=n;let zf=P[0].match(/\//)?.length??0;(_[zf]||=[]).push(l)}continue}}if(j===!0||j.test(D))if(n[w]=D,C){if(N.push(...this.#N(l,A,n,Q.#O)),l.#A["*"])N.push(...this.#N(l.#A["*"],A,n,Q.#O))}else l.#O=n,V.push(l)}}M=V.concat(_.shift()??[])}if(N.length>1)N.sort((S,R)=>{return S.score-R.score});return[N.map(({handler:S,params:R})=>[S,R])]}};var R0=class{name="TrieRouter";#f;constructor(){this.#f=new z1}add(f,A,E){let N=Uf(A);if(N){for(let O=0,M=N.length;O<M;O++)this.#f.insert(f,N[O],E);return}this.#f.insert(f,A,E)}match(f,A){return this.#f.search(f,A)}};var D0=class extends y1{constructor(f={}){super(f);this.router=f.router??new S0({routers:[new Hf,new R0]})}};J0();import{z as J}from"zod";var ff=J.enum(["decision","bugfix","feature","refactor","discovery","change"]);function B(f,A={}){return{data:f,error:null,meta:A}}function L(f,A,E){return{data:null,error:{code:f,message:A,details:E},meta:{}}}var Y={find:J.object({query:J.string().min(1),scope:J.enum(["project","user","all"]).optional().default("project"),types:J.array(ff).optional(),limit:J.number().int().min(1).max(50).optional().default(10),cursor:J.string().optional(),include:J.object({snippets:J.boolean().optional(),scores:J.boolean().optional(),relations:J.boolean().optional()}).optional()}),history:J.object({limit:J.number().int().min(1).max(20).optional().default(5),cursor:J.string().optional(),sessionId:J.string().optional()}),get:J.object({ids:J.array(J.string()).min(1),includeHistory:J.boolean().optional().default(!1),limit:J.number().int().min(1).max(50).optional().default(10)}),create:J.object({title:J.string(),type:ff,narrative:J.string(),concepts:J.array(J.string()).optional(),files:J.array(J.string()).optional(),importance:J.number().int().min(1).max(5).optional(),scope:J.enum(["project","user"]).optional().default("project")}),revise:J.object({id:J.string(),title:J.string().optional(),narrative:J.string().optional(),type:ff.optional(),concepts:J.array(J.string()).optional(),importance:J.number().int().min(1).max(5).optional(),reason:J.string().optional()}),remove:J.object({id:J.string(),reason:J.string().optional()}),transferExport:J.object({scope:J.enum(["project"]).optional().default("project"),type:ff.optional(),limit:J.number().int().min(1).optional(),format:J.enum(["json"]).optional().default("json")}),transferImport:J.object({payload:J.string(),mode:J.enum(["skip","merge","replace"]).optional().default("skip")}),maintenance:J.object({action:J.enum(["folderContextDryRun","folderContextClean","folderContextRebuild"])}),help:J.object({})};var HE=new Set(ff.options);function Q0(f,A,E=100){if(!f)return A;let N=Number.parseInt(f,10);if(Number.isNaN(N))return A;return Math.max(1,Math.min(N,E))}function lE(f){if(!f)return 0;let A=Number.parseInt(f,10);if(Number.isNaN(A))return 0;return Math.max(0,A)}function G1(f){if(!f)return;if(HE.has(f))return f;return}function Pf(f){let A={};for(let[E,N]of Object.entries(f)){let O=E.toLowerCase();A[E]=typeof N==="string"&&(O.includes("key")||O.includes("api"))?"***REDACTED***":N}return A}function H1(f){let{projectPath:A,memoryEngine:E,runtimeStatusProvider:N,dashboardDir:O}=f,M=new D0;M.get("/v1/memory/observations",(_)=>{let S=Q0(_.req.query("limit"),50),R=lE(_.req.query("offset")),D=G1(_.req.query("type")),C=_.req.query("sessionId"),V=_.req.query("state"),y=V==="current"||V==="superseded"||V==="tombstoned"?V:void 0,W=E.listObservations({limit:S,offset:R,type:D,sessionId:C,state:y});return _.json(B(W,{limit:S,offset:R}))}),M.post("/v1/memory/observations",async(_)=>{try{let S=await _.req.json(),R=await E.save({...S,sessionId:S.sessionId??`http-${Date.now()}`});if(!R)return _.json(L("CONFLICT","Unable to create observation"),409);return _.json(B(R),201)}catch{return _.json(L("VALIDATION_ERROR","Invalid JSON body"),400)}}),M.get("/v1/memory/observations/:id",(_)=>{let S=_.req.param("id"),R=E.getObservation(S);if(!R)return _.json(L("NOT_FOUND","Observation not found"),404);return _.json(B(R))}),M.get("/v1/memory/observations/:id/lineage",(_)=>{let S=_.req.param("id"),R=E.getLineage(S);if(!R)return _.json(L("NOT_FOUND","Observation not found"),404);return _.json(B({observationId:S,lineage:R}))}),M.get("/v1/memory/observations/:id/revision-diff",(_)=>{let S=_.req.param("id"),R=_.req.query("against");if(!R)return _.json(L("VALIDATION_ERROR","Query parameter 'against' is required"),400);let D=E.getRevisionDiff(S,R);if(!D)return _.json(L("NOT_FOUND","One or both observations not found"),404);if(_.req.query("version")==="1")return _.json(B({baseId:D.toId,againstId:D.fromId,changes:D.changedFields}));return _.json(B(D))}),M.post("/v1/memory/observations/:id/revisions",async(_)=>{let S=_.req.param("id");try{let R=await _.req.json(),D=await E.update({id:S,...R});if(!D)return _.json(L("NOT_FOUND","Observation not found"),404);return _.json(B({previousId:S,newId:D.id,observation:D}))}catch{return _.json(L("VALIDATION_ERROR","Invalid JSON body"),400)}}),M.post("/v1/memory/observations/:id/tombstone",async(_)=>{let S=_.req.param("id");if(await E.delete([S])===0)return _.json(L("NOT_FOUND","Observation not found"),404);return _.json(B({id:S,tombstoned:!0}))}),M.get("/v1/memory/sessions",(_)=>{let S=Q0(_.req.query("limit"),20),R=_.req.query("projectPath")||A;return _.json(B(E.listSessions({limit:S,projectPath:R}),{limit:S}))}),M.get("/v1/memory/sessions/:id",(_)=>{let S=_.req.param("id"),R=E.getSession(S);if(!R)return _.json(L("NOT_FOUND","Session not found"),404);return _.json(B({...R.session,observations:R.observations,summary:R.summary}))}),M.get("/v1/memory/search",async(_)=>{let S=_.req.query("q");if(!S)return _.json(L("VALIDATION_ERROR","Query parameter 'q' is required"),400);let R=G1(_.req.query("type")),D=Q0(_.req.query("limit"),20);try{let C=await E.search(S,{type:R,limit:D});return _.json(B(C,{limit:D}))}catch{return _.json(B([],{limit:D}))}}),M.post("/v1/memory/recall",async(_)=>{try{let S=await _.req.json(),R=await E.recall(S.ids??[],S.limit??10);return _.json(B(R))}catch{return _.json(L("VALIDATION_ERROR","Invalid JSON body"),400)}}),M.post("/v1/memory/export",async(_)=>{try{let S=await _.req.json().catch(()=>({})),R=await E.export("project",{type:S.type,limit:S.limit});return _.json(B(R))}catch(S){return _.json(L("INTERNAL_ERROR",String(S)),500)}}),M.post("/v1/memory/import",async(_)=>{try{let S=await _.req.json(),R=S.mode==="replace"?"overwrite":"skip-duplicates",D=await E.import(S.payload,{mode:R});return _.json(B(D))}catch{return _.json(L("VALIDATION_ERROR","Invalid import payload"),400)}}),M.get("/v1/memory/stats",(_)=>{return _.json(B(E.stats()))}),M.get("/v1/health",(_)=>{let S=E.getHealth(),R=E.getMetrics(),D=N?.(),C={status:S.status,timestamp:S.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},V=D??C;return _.json(B({status:V.status,timestamp:V.timestamp,uptimeMs:V.uptimeMs,queue:V.queue,memory:{totalObservations:R.memory.totalObservations,totalSessions:R.memory.totalSessions}}))}),M.get("/v1/metrics",(_)=>{let S=E.getHealth(),D=N?.()??{status:S.status,timestamp:S.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(D))}),M.get("/v1/platforms",(_)=>{let S=E.getAdapterStatuses();return _.json(B({platforms:S.map((R)=>({name:R.name,version:R.version,enabled:R.enabled,capabilities:R.capabilities}))}))}),M.get("/v1/adapters/status",(_)=>{return _.json(B(E.getAdapterStatuses()))}),M.get("/v1/config/schema",(_)=>_.json(B(C0()))),M.get("/v1/config/effective",async(_)=>{let S=await b(A);return _.json(B({config:Pf(S.config),meta:S.meta,warnings:S.warnings}))}),M.post("/v1/config/preview",async(_)=>{try{let S=await _.req.json(),R=await y0(A,S);return _.json(B({config:Pf(R.config),meta:R.meta,warnings:R.warnings}))}catch{return _.json(L("VALIDATION_ERROR","Invalid JSON body"),400)}}),M.patch("/v1/config",async(_)=>{let S;try{S=await _.req.json()}catch{return _.json(L("VALIDATION_ERROR","Invalid JSON body"),400)}try{let R=await r(A),D=await jf(A,S),C={};for(let V of Object.keys(S))if(Object.hasOwn(R,V))C[V]=R[V];return E.trackConfigAudit({id:Vf(),timestamp:new Date().toISOString(),patch:S,previousValues:C,source:"api"}),_.json(B({config:Pf(D.config),meta:D.meta,warnings:D.warnings}))}catch(R){return _.json(L("INTERNAL_ERROR",String(R)),500)}}),M.get("/v1/config/audit",(_)=>{return _.json(B(E.getConfigAuditTimeline()))}),M.post("/v1/config/rollback",async(_)=>{let S;try{S=await _.req.json()}catch{return _.json(L("VALIDATION_ERROR","Invalid JSON body"),400)}if(!S.eventId)return _.json(L("VALIDATION_ERROR","eventId is required"),400);try{let R=await E.rollbackConfig(S.eventId);if(!R)return _.json(L("NOT_FOUND","Audit event not found"),404);return _.json(B(R))}catch(R){return _.json(L("INTERNAL_ERROR",String(R)),500)}});let $={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(M.get("/v1/modes",(_)=>_.json(B({modes:Object.entries($).map(([S,R])=>({id:S,patch:R}))}))),M.post("/v1/modes/:id/apply",async(_)=>{let S=_.req.param("id"),R=$[S];if(!R)return _.json(L("NOT_FOUND","Unknown mode"),404);try{let D=await r(A),C=await jf(A,R),V={};for(let y of Object.keys(R))if(Object.hasOwn(D,y))V[y]=D[y];return E.trackConfigAudit({id:Vf(),timestamp:new Date().toISOString(),patch:R,previousValues:V,source:"mode"}),_.json(B({applied:S,config:Pf(C.config),meta:C.meta,warnings:C.warnings}))}catch(D){return _.json(L("INTERNAL_ERROR",String(D)),500)}}),M.post("/v1/maintenance/folder-context/dry-run",async(_)=>{try{let R=(await _.req.json().catch(()=>({}))).action??"clean",D=await E.maintainFolderContext(R,!0);return E.trackMaintenanceResult({id:Vf(),timestamp:new Date().toISOString(),action:`folder-context-${R}-dry-run`,dryRun:!0,result:D}),_.json(B(D))}catch(S){return _.json(L("INTERNAL_ERROR",String(S)),500)}}),M.post("/v1/maintenance/folder-context/clean",async(_)=>{try{let S=await E.maintainFolderContext("clean",!1);return E.trackMaintenanceResult({id:Vf(),timestamp:new Date().toISOString(),action:"folder-context-clean",dryRun:!1,result:S}),_.json(B(S))}catch(S){return _.json(L("INTERNAL_ERROR",String(S)),500)}}),M.post("/v1/maintenance/folder-context/rebuild",async(_)=>{try{let S=await E.maintainFolderContext("rebuild",!1);return E.trackMaintenanceResult({id:Vf(),timestamp:new Date().toISOString(),action:"folder-context-rebuild",dryRun:!1,result:S}),_.json(B(S))}catch(S){return _.json(L("INTERNAL_ERROR",String(S)),500)}}),M.get("/v1/maintenance/history",(_)=>{return _.json(B(E.getMaintenanceHistory()))}),f.sseHandler)M.get("/v1/events",f.sseHandler);return M.get("*",async(_)=>{let S=_.req.path;if(S.startsWith("/v1/"))return _.json(L("NOT_FOUND","Not found"),404);let R=O??B0(GE(import.meta.url),"../../dist/dashboard"),D=FE(R),C=D.endsWith(F1)?D:`${D}${F1}`,V=S==="/"?"index.html":S.replace(/^\//,""),y=B0(R,V);if(!y.startsWith(C))return _.json(L("NOT_FOUND","Not found"),404);try{let Q=Bun.file(y);if(await Q.exists())return new Response(Q)}catch{}let W=B0(R,"index.html");if(!W.startsWith(C))return _.json(L("NOT_FOUND","Not found"),404);try{let Q=Bun.file(W);if(await Q.exists())return new Response(Q,{headers:{"Content-Type":"text/html; charset=utf-8"}})}catch{}return _.json(L("NOT_FOUND","Dashboard not found. Run the dashboard build first."),404)}),M}var L0=class{writer;encoder;writable;abortSubscribers=[];responseReadable;aborted=!1;closed=!1;constructor(f,A){this.writable=f,this.writer=f.getWriter(),this.encoder=new TextEncoder;let E=A.getReader();this.abortSubscribers.push(async()=>{await E.cancel()}),this.responseReadable=new ReadableStream({async pull(N){let{done:O,value:M}=await E.read();O?N.close():N.enqueue(M)},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((A)=>setTimeout(A,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 gf=()=>{let f=typeof Bun<"u"?Bun.version:void 0;if(f===void 0)return!1;let A=f.startsWith("1.1")||f.startsWith("1.0")||f.startsWith("0.");return gf=()=>A,A};var l1=class extends L0{constructor(f,A){super(f,A)}async writeSSE(f){let E=(await $f(f.data,uf.Stringify,!1,{})).split(/\r\n|\r|\n/).map((O)=>{return`data: ${O}`}).join(`
4
+ `),N=[f.event&&`event: ${f.event}`,E,f.id&&`id: ${f.id}`,f.retry&&`retry: ${f.retry}`].filter(Boolean).join(`
5
5
  `)+`
6
6
 
7
- `;await this.write(E)}},G1=async(f,n,A)=>{try{await n(f)}catch(E){if(E instanceof Error&&A)await A(E,f),await f.writeSSE({event:"error",data:E.message});else console.error(E)}finally{f.close()}},j1=new WeakMap,B0=(f,n,A)=>{let{readable:E,writable:N}=new TransformStream,O=new Yn(N,E);if(Hf())f.req.raw.signal.addEventListener("abort",()=>{if(!O.closed)O.abort()});return j1.set(O.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"),G1(O,n,A),f.newResponse(O.responseReadable)};class J0{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 A=(E)=>this.broadcast(n,E);this.eventBus.on(n,A),this.cleanups.push(()=>this.eventBus.off(n,A))}}broadcast(f,n){let A=JSON.stringify(n);for(let E of this.clients)try{let N=E(f,A);if(N&&typeof N.catch==="function")N.catch(()=>this.clients.delete(E))}catch{this.clients.delete(E)}}}var g1=30000;function Fn(f){return(n)=>{return B0(n,async(A)=>{let E=(O,S)=>{A.writeSSE({event:O,data:S,id:Date.now().toString()})};f.addClient(E);let N=setInterval(()=>{A.writeSSE({event:"heartbeat",data:"",id:Date.now().toString()})},g1);A.onAbort(()=>{f.removeClient(E),clearInterval(N)});while(!A.aborted)await A.sleep(1000)})}}function X(f){return JSON.stringify(f,null,2)}function T1(f,n){return f.filter((A)=>n==="all"?!0:n==="user"?A.source==="user":A.source!=="user").map((A)=>({id:A.observation.id,title:A.observation.title,type:A.observation.type,summary:A.observation.narrative,snippet:A.snippet,score:A.rank,source:A.source??"project",createdAt:A.observation.createdAt}))}function cn(f){return{"memory.find":{description:"Find relevant memories by query with optional filtering.",args:Z.find.shape,execute:async(n)=>{try{let A=Z.find.parse(n),E=await f.search(A.query,{limit:A.limit,type:A.types?.[0]}),N=C({results:T1(E,A.scope),nextCursor:null});return X(N)}catch(A){return X(B("VALIDATION_ERROR","Invalid find arguments",String(A)))}}},"memory.history":{description:"Browse session history and summaries.",args:Z.history.shape,execute:async(n)=>{try{let A=Z.history.parse(n),E=await f.timeline({limit:A.limit,sessionId:A.sessionId});return X(C({items:E,nextCursor:null}))}catch(A){return X(B("VALIDATION_ERROR","Invalid history arguments",String(A)))}}},"memory.get":{description:"Get full memory records by ID.",args:Z.get.shape,execute:async(n)=>{try{let A=Z.get.parse(n),E=await f.recall(A.ids,A.limit);return X(C({observations:E}))}catch(A){return X(B("VALIDATION_ERROR","Invalid get arguments",String(A)))}}},"memory.create":{description:"Create a memory record.",args:Z.create.shape,execute:async(n,A)=>{try{let E=Z.create.parse(n),N=await f.save({...E,sessionId:A.sessionID});if(!N)return X(B("CONFLICT","Unable to create memory"));return X(C({observation:N}))}catch(E){return X(B("VALIDATION_ERROR","Invalid create arguments",String(E)))}}},"memory.revise":{description:"Create a new revision for an existing memory.",args:Z.revise.shape,execute:async(n)=>{try{let A=Z.revise.parse(n),E=await f.update(A);if(!E)return X(B("NOT_FOUND",`Observation ${A.id} not found`));return X(C({previousId:A.id,newId:E.id,observation:E}))}catch(A){return X(B("VALIDATION_ERROR","Invalid revise arguments",String(A)))}}},"memory.remove":{description:"Tombstone a memory record.",args:Z.remove.shape,execute:async(n)=>{try{let A=Z.remove.parse(n);if(await f.delete([A.id])===0)return X(B("NOT_FOUND",`Observation ${A.id} not found`));return X(C({id:A.id,tombstoned:!0}))}catch(A){return X(B("VALIDATION_ERROR","Invalid remove arguments",String(A)))}}},"memory.transfer.export":{description:"Export project memory as JSON payload.",args:Z.transferExport.shape,execute:async(n)=>{try{let A=Z.transferExport.parse(n),E=await f.export("project",{type:A.type,limit:A.limit});return X(C({payload:E,format:A.format}))}catch(A){return X(B("VALIDATION_ERROR","Invalid export arguments",String(A)))}}},"memory.transfer.import":{description:"Import memory payload.",args:Z.transferImport.shape,execute:async(n)=>{try{let A=Z.transferImport.parse(n),E=A.mode==="replace"?"overwrite":"skip-duplicates",N=await f.import(A.payload,{mode:E});return X(C({imported:N.imported,skipped:N.skipped,mode:A.mode}))}catch(A){return X(B("VALIDATION_ERROR","Invalid import arguments",String(A)))}}},"memory.maintenance":{description:"Run memory maintenance actions.",args:Z.maintenance.shape,execute:async(n)=>{try{let A=Z.maintenance.parse(n);if(A.action==="folderContextDryRun")return X(C(await f.maintainFolderContext("clean",!0)));if(A.action==="folderContextClean")return X(C(await f.maintainFolderContext("clean",!1)));return X(C(await f.maintainFolderContext("rebuild",!1)))}catch(A){return X(B("VALIDATION_ERROR","Invalid maintenance arguments",String(A)))}}},"memory.help":{description:"Show memory workflow guidance.",args:Z.help.shape,execute:async()=>X(C({guide:f.guide()}))}}}import{generateText as r1}from"ai";var P1=new Set(["decision","bugfix","feature","refactor","discovery","change"]);function L(f,n){let A=new RegExp(`<${n}[^>]*>([\\s\\S]*?)</${n}>`,"i"),E=f.match(A);return E?E[1].trim():""}function T(f,n){let A=new RegExp(`<${n}[^>]*>([\\s\\S]*?)</${n}>`,"gi"),E=[];for(let N of f.matchAll(A)){let O=N[1].trim();if(O)E.push(O)}return E}function Gn(f){let n=L(f,"observation");if(!n)return null;let A=L(n,"type").toLowerCase(),E=P1.has(A)?A:"discovery",N=L(n,"title")||"Untitled observation",O=L(n,"subtitle"),S=L(n,"narrative"),M=T(L(n,"facts"),"fact"),_=T(L(n,"concepts"),"concept"),$=T(L(n,"files_read"),"file"),R=T(L(n,"files_modified"),"file"),D=L(n,"importance"),l=Number.parseInt(D,10),u=Number.isNaN(l)?3:Math.max(1,Math.min(5,l));return{type:E,title:N,subtitle:O,facts:M,narrative:S,concepts:_,filesRead:$,filesModified:R,importance:u}}function jn(f){let n=L(f,"session_summary");if(!n)return null;let A=L(n,"summary")||"No summary available",E=T(L(n,"key_decisions"),"decision"),N=T(L(n,"files_modified"),"file"),O=T(L(n,"concepts"),"concept"),S=L(n,"request")||void 0,M=L(n,"investigated")||void 0,_=L(n,"learned")||void 0,$=L(n,"completed")||void 0,R=L(n,"next_steps")||void 0;return{summary:A,keyDecisions:E,filesModified:N,concepts:O,request:S,investigated:M,learned:_,completed:$,nextSteps:R}}function Hn(f){let n=L(f,"reranked");if(!n)return null;let A=T(n,"index");if(A.length===0)return null;let E=[];for(let N of A){let O=Number.parseInt(N,10);if(Number.isNaN(O)||O<0)return null;E.push(O)}return E}var k1=new Set(["new_fact","update","duplicate"]);function gn(f){let n=L(f,"evaluation");if(!n)return null;let A=L(n,"outcome").toLowerCase().trim();if(!k1.has(A))return null;let E=A,N=L(n,"reason");if(!N)return null;let O=L(n,"supersedes"),S={outcome:E,reason:N};if(E==="update"&&O)S.supersedesId=O;if(E==="update"&&!S.supersedesId)return null;return S}var I1=new Set(["technology","library","pattern","concept","file","person","project","other"]),w1=new Set(["uses","depends_on","implements","extends","related_to","replaces","configures"]);function Tn(f){let n=L(f,"extraction");if(!n)return null;let A=L(n,"entities"),E=L(n,"relations"),N=T(A,"entity"),O=[];for(let _ of N){let $=L(_,"name");if(!$)continue;let R=L(_,"type").toLowerCase(),D=I1.has(R)?R:"other";O.push({name:$,entityType:D})}let S=T(E,"relation"),M=[];for(let _ of S){let $=L(_,"source"),R=L(_,"target"),D=L(_,"relationship").toLowerCase();if(!$||!R||!D)continue;if(!w1.has(D))continue;M.push({sourceName:$,targetName:R,relationship:D})}return{entities:O,relations:M}}function Y(f){return Math.ceil(f.length/4)}function Pn(f,n,A){let E=A?`<session_context>
8
- ${A}
7
+ `;await this.write(N)}},mE=async(f,A,E)=>{try{await A(f)}catch(N){if(N instanceof Error&&E)await E(N,f),await f.writeSSE({event:"error",data:N.message});else console.error(N)}finally{f.close()}},jE=new WeakMap,z0=(f,A,E)=>{let{readable:N,writable:O}=new TransformStream,M=new l1(O,N);if(gf())f.req.raw.signal.addEventListener("abort",()=>{if(!M.closed)M.abort()});return jE.set(M.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"),mE(M,A,E),f.newResponse(M.responseReadable)};class W0{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 A of f){let E=(N)=>this.broadcast(A,N);this.eventBus.on(A,E),this.cleanups.push(()=>this.eventBus.off(A,E))}}broadcast(f,A){let E=JSON.stringify(A);for(let N of this.clients)try{let O=N(f,E);if(O&&typeof O.catch==="function")O.catch(()=>this.clients.delete(N))}catch{this.clients.delete(N)}}}var gE=30000;function m1(f){return(A)=>{return z0(A,async(E)=>{let N=(M,$)=>{E.writeSSE({event:M,data:$,id:Date.now().toString()})};f.addClient(N);let O=setInterval(()=>{E.writeSSE({event:"heartbeat",data:"",id:Date.now().toString()})},gE);E.onAbort(()=>{f.removeClient(N),clearInterval(O)});while(!E.aborted)await E.sleep(1000)})}}function U(f){return JSON.stringify(f,null,2)}function kE(f,A){return f.filter((E)=>A==="all"?!0:A==="user"?E.source==="user":E.source!=="user").map((E)=>({id:E.observation.id,title:E.observation.title,type:E.observation.type,summary:E.observation.narrative,snippet:E.snippet,score:E.rank,source:E.source??"project",createdAt:E.observation.createdAt}))}function j1(f){return{"memory.find":{description:"Find relevant memories by query with optional filtering.",args:Y.find.shape,execute:async(A)=>{try{let E=Y.find.parse(A),N=await f.search(E.query,{limit:E.limit,type:E.types?.[0]}),O=B({results:kE(N,E.scope),nextCursor:null});return U(O)}catch(E){return U(L("VALIDATION_ERROR","Invalid find arguments",String(E)))}}},"memory.history":{description:"Browse session history and summaries.",args:Y.history.shape,execute:async(A)=>{try{let E=Y.history.parse(A),N=await f.timeline({limit:E.limit,sessionId:E.sessionId});return U(B({items:N,nextCursor:null}))}catch(E){return U(L("VALIDATION_ERROR","Invalid history arguments",String(E)))}}},"memory.get":{description:"Get full memory records by ID.",args:Y.get.shape,execute:async(A)=>{try{let E=Y.get.parse(A),N=await f.recall(E.ids,E.limit);return U(B({observations:N}))}catch(E){return U(L("VALIDATION_ERROR","Invalid get arguments",String(E)))}}},"memory.create":{description:"Create a memory record.",args:Y.create.shape,execute:async(A,E)=>{try{let N=Y.create.parse(A),O=await f.save({...N,sessionId:E.sessionID});if(!O)return U(L("CONFLICT","Unable to create memory"));return U(B({observation:O}))}catch(N){return U(L("VALIDATION_ERROR","Invalid create arguments",String(N)))}}},"memory.revise":{description:"Create a new revision for an existing memory.",args:Y.revise.shape,execute:async(A)=>{try{let E=Y.revise.parse(A),N=await f.update(E);if(!N)return U(L("NOT_FOUND",`Observation ${E.id} not found`));return U(B({previousId:E.id,newId:N.id,observation:N}))}catch(E){return U(L("VALIDATION_ERROR","Invalid revise arguments",String(E)))}}},"memory.remove":{description:"Tombstone a memory record.",args:Y.remove.shape,execute:async(A)=>{try{let E=Y.remove.parse(A);if(await f.delete([E.id])===0)return U(L("NOT_FOUND",`Observation ${E.id} not found`));return U(B({id:E.id,tombstoned:!0}))}catch(E){return U(L("VALIDATION_ERROR","Invalid remove arguments",String(E)))}}},"memory.transfer.export":{description:"Export project memory as JSON payload.",args:Y.transferExport.shape,execute:async(A)=>{try{let E=Y.transferExport.parse(A),N=await f.export("project",{type:E.type,limit:E.limit});return U(B({payload:N,format:E.format}))}catch(E){return U(L("VALIDATION_ERROR","Invalid export arguments",String(E)))}}},"memory.transfer.import":{description:"Import memory payload.",args:Y.transferImport.shape,execute:async(A)=>{try{let E=Y.transferImport.parse(A),N=E.mode==="replace"?"overwrite":"skip-duplicates",O=await f.import(E.payload,{mode:N});return U(B({imported:O.imported,skipped:O.skipped,mode:E.mode}))}catch(E){return U(L("VALIDATION_ERROR","Invalid import arguments",String(E)))}}},"memory.maintenance":{description:"Run memory maintenance actions.",args:Y.maintenance.shape,execute:async(A)=>{try{let E=Y.maintenance.parse(A);if(E.action==="folderContextDryRun")return U(B(await f.maintainFolderContext("clean",!0)));if(E.action==="folderContextClean")return U(B(await f.maintainFolderContext("clean",!1)));return U(B(await f.maintainFolderContext("rebuild",!1)))}catch(E){return U(L("VALIDATION_ERROR","Invalid maintenance arguments",String(E)))}}},"memory.help":{description:"Show memory workflow guidance.",args:Y.help.shape,execute:async()=>U(B({guide:f.guide()}))}}}import{generateText as hE}from"ai";var TE=new Set(["decision","bugfix","feature","refactor","discovery","change"]);function X(f,A){let E=new RegExp(`<${A}[^>]*>([\\s\\S]*?)</${A}>`,"i"),N=f.match(E);return N?N[1].trim():""}function k(f,A){let E=new RegExp(`<${A}[^>]*>([\\s\\S]*?)</${A}>`,"gi"),N=[];for(let O of f.matchAll(E)){let M=O[1].trim();if(M)N.push(M)}return N}function P1(f){let A=X(f,"observation");if(!A)return null;let E=X(A,"type").toLowerCase(),N=TE.has(E)?E:"discovery",O=X(A,"title")||"Untitled observation",M=X(A,"subtitle"),$=X(A,"narrative"),_=k(X(A,"facts"),"fact"),S=k(X(A,"concepts"),"concept"),R=k(X(A,"files_read"),"file"),D=k(X(A,"files_modified"),"file"),C=X(A,"importance"),V=Number.parseInt(C,10),y=Number.isNaN(V)?3:Math.max(1,Math.min(5,V));return{type:N,title:O,subtitle:M,facts:_,narrative:$,concepts:S,filesRead:R,filesModified:D,importance:y}}function g1(f){let A=X(f,"session_summary");if(!A)return null;let E=X(A,"summary")||"No summary available",N=k(X(A,"key_decisions"),"decision"),O=k(X(A,"files_modified"),"file"),M=k(X(A,"concepts"),"concept"),$=X(A,"request")||void 0,_=X(A,"investigated")||void 0,S=X(A,"learned")||void 0,R=X(A,"completed")||void 0,D=X(A,"next_steps")||void 0;return{summary:E,keyDecisions:N,filesModified:O,concepts:M,request:$,investigated:_,learned:S,completed:R,nextSteps:D}}function k1(f){let A=X(f,"reranked");if(!A)return null;let E=k(A,"index");if(E.length===0)return null;let N=[];for(let O of E){let M=Number.parseInt(O,10);if(Number.isNaN(M)||M<0)return null;N.push(M)}return N}var cE=new Set(["new_fact","update","duplicate"]);function T1(f){let A=X(f,"evaluation");if(!A)return null;let E=X(A,"outcome").toLowerCase().trim();if(!cE.has(E))return null;let N=E,O=X(A,"reason");if(!O)return null;let M=X(A,"supersedes"),$={outcome:N,reason:O};if(N==="update"&&M)$.supersedesId=M;if(N==="update"&&!$.supersedesId)return null;return $}var IE=new Set(["technology","library","pattern","concept","file","person","project","other"]),wE=new Set(["uses","depends_on","implements","extends","related_to","replaces","configures"]);function c1(f){let A=X(f,"extraction");if(!A)return null;let E=X(A,"entities"),N=X(A,"relations"),O=k(E,"entity"),M=[];for(let S of O){let R=X(S,"name");if(!R)continue;let D=X(S,"type").toLowerCase(),C=IE.has(D)?D:"other";M.push({name:R,entityType:C})}let $=k(N,"relation"),_=[];for(let S of $){let R=X(S,"source"),D=X(S,"target"),C=X(S,"relationship").toLowerCase();if(!R||!D||!C)continue;if(!wE.has(C))continue;_.push({sourceName:R,targetName:D,relationship:C})}return{entities:M,relations:_}}function G(f){return Math.ceil(f.length/4)}function I1(f,A,E){let N=E?`<session_context>
8
+ ${E}
9
9
  </session_context>
10
10
 
11
11
  `:"";return`<task>
@@ -15,10 +15,10 @@ Analyze the following tool output and extract a structured observation.
15
15
  <tool_name>${f}</tool_name>
16
16
 
17
17
  <tool_output>
18
- ${n}
18
+ ${A}
19
19
  </tool_output>
20
20
 
21
- ${E}<instructions>
21
+ ${N}<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 kn(f,n){let A=f.map((E,N)=>` <obs index="${N+1}" type="${E.type}">
57
- <title>${E.title}</title>
58
- <narrative>${E.narrative}</narrative>
56
+ </instructions>`}function w1(f,A){let E=f.map((N,O)=>` <obs index="${O+1}" type="${N.type}">
57
+ <title>${N.title}</title>
58
+ <narrative>${N.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>${A}</session_id>
65
65
 
66
66
  <observations>
67
- ${A}
67
+ ${E}
68
68
  </observations>
69
69
 
70
70
  <instructions>
@@ -88,11 +88,11 @@ Respond with EXACTLY this XML format:
88
88
  <concept>key-concept</concept>
89
89
  </concepts>
90
90
  </session_summary>
91
- </instructions>`}function In(f,n){let A=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 v1(f,A){let E=A.map((N)=>` <candidate id="${N.id}">
92
+ <title>${N.title}</title>
93
+ <narrative>${N.narrative}</narrative>
94
+ <concepts>${N.concepts.join(", ")}</concepts>
95
+ <type>${N.type}</type>
96
96
  </candidate>`).join(`
97
97
  `);return`<conflict_evaluation>
98
98
  <new_observation>
@@ -102,7 +102,7 @@ Respond with EXACTLY this XML format:
102
102
  <type>${f.type}</type>
103
103
  </new_observation>
104
104
  <existing_candidates>
105
- ${A}
105
+ ${E}
106
106
  </existing_candidates>
107
107
  <instructions>
108
108
  Evaluate whether the new observation represents:
@@ -117,14 +117,14 @@ Respond with EXACTLY this XML format:
117
117
  <reason>Brief explanation</reason>
118
118
  </evaluation>
119
119
  </instructions>
120
- </conflict_evaluation>`}function wn(f){let n=[...f.filesRead,...f.filesModified];return`<entity_extraction>
120
+ </conflict_evaluation>`}function x1(f){let A=[...f.filesRead,...f.filesModified];return`<entity_extraction>
121
121
  <observation>
122
122
  <title>${f.title}</title>
123
123
  <type>${f.type}</type>
124
124
  <narrative>${f.narrative}</narrative>
125
125
  <facts>${f.facts.join(`
126
126
  `)}</facts>
127
- <files>${n.join(`
127
+ <files>${A.join(`
128
128
  `)}</files>
129
129
  <concepts>${f.concepts.join(", ")}</concepts>
130
130
  </observation>
@@ -146,11 +146,11 @@ Respond with EXACTLY this XML format:
146
146
  </relations>
147
147
  </extraction>
148
148
  </instructions>
149
- </entity_extraction>`}function xn(f,n){let A=n.map((E,N)=>` <candidate index="${N}"><title>${E.title}</title><narrative>${E.narrative}</narrative></candidate>`).join(`
149
+ </entity_extraction>`}function q1(f,A){let E=A.map((N,O)=>` <candidate index="${O}"><title>${N.title}</title><narrative>${N.narrative}</narrative></candidate>`).join(`
150
150
  `);return`<rerank_request>
151
151
  <query>${f}</query>
152
152
  <candidates>
153
- ${A}
153
+ ${E}
154
154
  </candidates>
155
155
  <instructions>Reorder the candidates by relevance to the query. Return indices from most to least relevant.
156
156
 
@@ -161,117 +161,120 @@ Respond with EXACTLY this XML format:
161
161
  <index>0</index>
162
162
  </reranked>
163
163
  </instructions>
164
- </rerank_request>`}var x1={"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 v1(f){if(f.includes("."))return f;return x1[f]||`us.anthropic.${f}-v1:0`}function P(f){switch(f.provider){case"anthropic":{let{createAnthropic:n}=v("@ai-sdk/anthropic");return n({apiKey:f.apiKey})(f.model)}case"bedrock":{let{createAmazonBedrock:n}=v("@ai-sdk/amazon-bedrock");return n()(v1(f.model))}case"openai":{let{createOpenAI:n}=v("@ai-sdk/openai");return n({apiKey:f.apiKey})(f.model)}case"google":{let{createGoogleGenerativeAI:n}=v("@ai-sdk/google");return n({apiKey:f.apiKey})(f.model)}default:throw Error(`Unknown provider: ${f.provider}. Supported: anthropic, bedrock, openai, google`)}}function vn(f){try{switch(f.provider){case"google":{let{createGoogleGenerativeAI:n}=v("@ai-sdk/google");return n({apiKey:f.apiKey}).embedding("text-embedding-004")}case"openai":{let{createOpenAI:n}=v("@ai-sdk/openai");return n({apiKey:f.apiKey}).embedding("text-embedding-3-small")}case"bedrock":{let{createAmazonBedrock:n}=v("@ai-sdk/amazon-bedrock");return n().embedding("amazon.titan-embed-text-v2:0")}case"anthropic":return null;default:return null}}catch{return null}}var q1={"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},qn=0;async function k(f,n){if(!n)return;let A=q1[f]||5,E=Math.ceil(60000/A)+100,O=Date.now()-qn;if(O<E){let S=E-O;await new Promise((M)=>setTimeout(M,S))}qn=Date.now()}class Df{model;config;_generate=r1;constructor(f){this.config=f,this.model=null;let n=f.provider!=="bedrock";if(f.compressionEnabled&&(!n||f.apiKey))try{this.model=P({provider:f.provider,model:f.model,apiKey:f.apiKey})}catch{}}static MAX_INPUT_LENGTH=50000;async compress(f,n,A){if(!this.config.compressionEnabled||!this.model)return null;if(n.length<this.config.minOutputLength)return null;let E=Y(n),N=n.length>Df.MAX_INPUT_LENGTH?`${n.substring(0,Df.MAX_INPUT_LENGTH)}
165
-
166
- [... truncated ...]`:n,O=Pn(f,N,A),S=2;for(let M=0;M<=S;M++)try{if(this.config.provider==="google")await k(this.config.model,this.config.rateLimitingEnabled);let{text:_}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:O}),$=Gn(_);if($)$.discoveryTokens=E;return $}catch(_){if(i1(_)&&M<S){let $=2**M*1000;await rn($);continue}return null}return null}async compressBatch(f){let n=new Map;for(let A=0;A<f.length;A++){let E=f[A],N=await this.compress(E.toolName,E.toolOutput,E.sessionContext);if(n.set(E.callId,N),A<f.length-1)await rn(200)}return n}createFallbackObservation(f,n){let A=b1(n),E=h1[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"?A:[],filesModified:E==="change"?A:[],discoveryTokens:Y(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 h1={Read:"discovery",Write:"change",Edit:"change",Bash:"change",Glob:"discovery",Grep:"discovery"},p1=/(?:^|\s)((?:\.\/|\/|src\/|tests\/|lib\/)\S+\.\w+)/gm;function b1(f){let n=[];for(let A of f.matchAll(p1))n.push(A[1]);return[...new Set(n)]}function i1(f){if(typeof f!=="object"||f===null)return!1;let n=f,A=n.status;if(A===429||A===500||A===503)return!0;let E=n.error;if(typeof E==="object"&&E!==null&&E.type==="overloaded_error")return!0;return!1}function rn(f){return new Promise((n)=>setTimeout(n,f))}import{generateText as t1}from"ai";class Q0{model;config;_generate=t1;constructor(f){if(this.config=f,this.model=null,f.provider==="bedrock"||f.apiKey)try{this.model=P({provider:f.provider,model:f.model,apiKey:f.apiKey})}catch{}}async evaluate(f,n){if(!this.model||n.length===0)return null;let A=In(f,n),E=2;for(let N=0;N<=E;N++)try{if(this.config.provider==="google")await k(this.config.model,this.config.rateLimitingEnabled);let{text:O}=await this._generate({model:this.model,maxOutputTokens:512,prompt:A});return gn(O)}catch(O){if(a1(O)&&N<E){let S=2**N*1000;await s1(S);continue}return null}return null}}function a1(f){if(typeof f!=="object"||f===null)return!1;let n=f,A=n.status;if(A===429||A===500||A===503)return!0;let E=n.error;if(typeof E==="object"&&E!==null&&E.type==="overloaded_error")return!0;return!1}function s1(f){return new Promise((n)=>setTimeout(n,f))}import{generateText as o1}from"ai";class L0{model;config;_generate=o1;constructor(f){if(this.config=f,this.model=null,f.provider==="bedrock"||f.apiKey)try{this.model=P({provider:f.provider,model:f.model,apiKey:f.apiKey})}catch{}}async extract(f){if(!this.model)return null;let n=wn(f),A=2;for(let E=0;E<=A;E++)try{if(this.config.provider==="google")await k(this.config.model,this.config.rateLimitingEnabled);let{text:N}=await this._generate({model:this.model,maxOutputTokens:1024,prompt:n});return Tn(N)}catch(N){if(d1(N)&&E<A){let O=2**E*1000;await e1(O);continue}return null}return null}}function d1(f){if(typeof f!=="object"||f===null)return!1;let n=f,A=n.status;if(A===429||A===500||A===503)return!0;let E=n.error;if(typeof E==="object"&&E!==null&&E.type==="overloaded_error")return!0;return!1}function e1(f){return new Promise((n)=>setTimeout(n,f))}import{generateText as fE}from"ai";class z0{model;config;_generate=fE;constructor(f){this.config=f,this.model=null;let n=f.provider!=="bedrock";if(f.compressionEnabled&&(!n||f.apiKey))try{this.model=P({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 A=kn(n.map((E)=>({type:E.type,title:E.title,narrative:E.narrative})),f);try{if(this.config.provider==="google")await k(this.config.model,this.config.rateLimitingEnabled);let{text:E}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:A}),N=jn(E);if(!N)return this.createFallbackSummary(n);return N}catch{return this.createFallbackSummary(n)}}createFallbackSummary(f){let n=new Set,A=new Set,E=[];for(let M of f){for(let _ of M.filesModified)n.add(_);for(let _ of M.concepts)A.add(_);if(M.type==="decision")E.push(M.title)}let N=new Map;for(let M of f)N.set(M.type,(N.get(M.type)??0)+1);let O=Array.from(N.entries()).map(([M,_])=>`${_} ${M}${_>1?"s":""}`).join(", "),S=Array.from(A).slice(0,5).join(", ");return{summary:`Session with ${f.length} observations: ${O}. Files modified: ${n.size}. Key concepts: ${S}.`,keyDecisions:E.slice(0,5),filesModified:Array.from(n),concepts:Array.from(A)}}shouldSummarize(f){return f>=2}}cf();import{randomUUID as nA}from"crypto";var nE={showTokenCosts:!0,observationTypes:"all",fullObservationCount:3,showLastSummary:!0},lf={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"};function gf(f,n=nE){let A=[];if(A.push("## open-mem: Past Session Memory"),A.push(""),A.push("**\uD83D\uDCA1 Progressive Disclosure:** This is a compact index showing WHAT was observed and retrieval COST."),A.push("Use `memory.find` to find observations by query, then `memory.get` with IDs to fetch full details."),A.push(""),A.push("**3-Layer Memory Access:**"),A.push("- **Layer 1** `memory.find` \u2014 Find observations by query (returns IDs + summaries)"),A.push("- **Layer 2** `memory.history` \u2014 Browse session history and drill into sessions"),A.push("- **Layer 3** `memory.get` \u2014 Get full details by ID (use IDs from search results or the index below)"),n.showLastSummary&&f.recentSummaries.length>0){A.push(""),A.push("### Recent Sessions"),A.push("| Session | Summary | Decisions |"),A.push("|---------|---------|-----------|");for(let S of f.recentSummaries){let M=S.keyDecisions.length>0?S.keyDecisions.join("; "):"\u2014";A.push(`| ${S.sessionId} | ${S.summary} | ${M} |`)}}let E=n.observationTypes==="all"?f.observationIndex:f.observationIndex.filter((S)=>n.observationTypes.includes(S.type));if(E.length>0){A.push(""),A.push(`### Recent Observations (${E.length} entries)`);let S=EE(E,f.fullObservations);for(let[M,_]of S){if(A.push(""),A.push(`**${M}**`),n.showTokenCosts)A.push("| ID | Type | Title | ~Tokens |"),A.push("|----|------|-------|---------|");else A.push("| ID | Type | Title |"),A.push("|----|------|-------|");for(let $ of _){let R=lf[$.type]||"\uD83D\uDCDD";if(n.showTokenCosts)A.push(`| ${$.id} | ${R} | ${$.title} | ~${$.tokenCount} |`);else A.push(`| ${$.id} | ${R} | ${$.title} |`)}}}let N=f.fullObservations.slice(0,n.fullObservationCount);if(N.length>0){A.push(""),A.push("### Full Details (most recent)");for(let S of N){let M=lf[S.type]||"\uD83D\uDCDD";if(A.push(""),A.push(`#### ${M} ${S.title} (${S.id})`),A.push(S.narrative),S.facts.length>0)A.push(`**Facts:** ${S.facts.map(($)=>`- ${$}`).join(" ")}`);if(S.concepts.length>0)A.push(`**Concepts:** ${S.concepts.join(", ")}`);let _=[...S.filesRead,...S.filesModified];if(_.length>0)A.push(`**Files:** ${_.join(", ")}`)}}let O=AE(f);if(O)A.push(""),A.push(O);return A.join(`
167
- `)}function AE(f){let n=0,A=0,E=new Set(f.observationIndex.map((S)=>S.id));for(let S of f.observationIndex)n+=S.tokenCount,A+=S.discoveryTokens;for(let S of f.fullObservations)if(!E.has(S.id))n+=S.tokenCount,A+=S.discoveryTokens;if(A===0)return null;let N=A-n,O=Math.max(0,Math.round(N/A*100));return`### \uD83D\uDCB0 Memory Economics
168
- **Read cost:** ~${n}t | **Discovery cost:** ~${A}t | **Savings:** ${O}% (${N}t saved)`}function EE(f,n){let A=new Map;for(let N of n){let O=N.filesModified[0]||N.filesRead[0];if(O)A.set(N.id,O)}let E=new Map;for(let N of f){let O=A.get(N.id)??"General",S=E.get(O)??[];S.push(N),E.set(O,S)}return E}function Tf(f){let n=[];if(n.push("[open-mem] Memory context:"),f.recentSummaries.length>0){n.push(`
169
- Recent sessions:`);for(let A of f.recentSummaries)n.push(`- ${A.summary}`)}if(f.observationIndex.length>0){n.push(`
170
- Recent observations (${f.observationIndex.length} entries):`);for(let A of f.observationIndex)n.push(`- ${lf[A.type]||"\uD83D\uDCDD"} ${A.title}`)}return n.join(`
171
- `)}function Pf(f,n){if(f.length===0)return"";let A=n,E=[];for(let O of f){let S=O.tokenCount||Y(O.title);if(A-S<0)break;E.push(O),A-=S}if(E.length===0)return"";let N=[];N.push("### Cross-Project Memory"),N.push(""),N.push("| ID | Type | Title | ~Tokens |"),N.push("|----|------|-------|---------|");for(let O of E){let S=lf[O.type]||"\uD83D\uDCDD";N.push(`| ${O.id} | ${S} | ${O.title} | ~${O.tokenCount} |`)}return N.join(`
172
- `)}function kf(f,n){if(f.length===0)return"";let A=n,E=[];for(let O of f){let S=O.tokenCount||Y(O.title);if(A-S<0)break;E.push(O),A-=S}if(E.length===0)return"";let N=[];N.push(`
173
- Cross-project observations (${E.length} entries):`);for(let O of E)N.push(`- ${lf[O.type]||"\uD83D\uDCDD"} ${O.title}`);return N.join(`
174
- `)}var If={recency:0.4,typeImportance:0.3,sessionAffinity:0.2,tokenEfficiency:0.1},NE={decision:1,bugfix:0.9,feature:0.8,refactor:0.6,discovery:0.5,change:0.4};function OE(f,n){let A=new Date(f),N=(n.getTime()-A.getTime())/3600000;if(N<0)return 1;if(N<24)return 1;if(N<48)return 0.8;if(N<168)return 0.5;return 0.2}function ME(f){return NE[f]??0.3}function SE(f,n){if(!n)return 0.5;return f===n?1:0.3}function _E(f){if(f<=10)return 1;if(f>=200)return 0.2;return 1-(f-10)/190*0.8}function $E(f,n){let A=OE(f.createdAt,n.now),E=ME(f.type),N=SE(f.sessionId,n.currentSessionId),O=_E(f.tokenCount);return A*If.recency+E*If.typeImportance+N*If.sessionAffinity+O*If.tokenEfficiency}function hn(f,n){let A=new Map;for(let E of f)A.set(E.id,$E(E,n));return[...f].sort((E,N)=>{let O=A.get(E.id)??0,S=A.get(N.id)??0;if(S!==O)return S-O;return new Date(N.createdAt).getTime()-new Date(E.createdAt).getTime()})}function ff(f,n,A,E,N=[],O){let S=E,M=[],_=[];for(let R of n){let D=R.tokenCount||Y(R.summary);if(S-D<0)break;M.push(R),S-=D}let $=O?hn(A,O):A;for(let R of $){let D=R.tokenCount||Y(R.title);if(S-D<0)break;_.push(R),S-=D}return{recentSummaries:M,observationIndex:_,fullObservations:[...N],totalTokens:E-S}}import{existsSync as XE}from"fs";import{readdir as KE,readFile as ZE,writeFile as UE}from"fs/promises";import{join as mE,resolve as YE}from"path";import{existsSync as bn}from"fs";import{mkdir as RE,readFile as DE,rename as lE,unlink as uE,writeFile as yE}from"fs/promises";import{dirname as K0,isAbsolute as tn,join as xf,normalize as CE,relative as an,resolve as X0,sep as W0}from"path";var wf="<!-- open-mem-context -->",uf="<!-- /open-mem-context -->",VE={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"},pn=new Map,BE=new Set(["node_modules",".git","dist","coverage",".open-mem","build","__pycache__",".next",".nuxt"]);async function vf(f,n,A=5){if(n.length===0)return;let E=[];for(let S of n){for(let M of S.filesModified)E.push(M);for(let M of S.filesRead)E.push(M)}let N=zE(E,f,A);if(N.size===0)return;let O=WE(n,N,f);for(let[S,M]of O)try{let _=JE(S,M,f);await QE(S,_)}catch(_){console.error(`[open-mem] Failed to update AGENTS.md in ${S}:`,_)}}function JE(f,n,A){let E=[...n].sort((_,$)=>$.createdAt.localeCompare(_.createdAt)).slice(0,10),N=an(A,f)||".",O=[];O.push(`## Recent Activity in \`${N}/\` (auto-generated by open-mem)`),O.push(""),O.push("| Type | Title | Date |"),O.push("|------|-------|------|");for(let _ of E){let $=VE[_.type]||"\uD83D\uDCDD",R=_.createdAt.split("T")[0],D=_.title.replace(/\|/g,"\\|");O.push(`| ${$} ${_.type} | ${D} | ${R} |`)}let S=new Set;for(let _ of E)for(let $ of _.concepts)S.add($);if(S.size>0){let _=[...S].slice(0,10).join(", ");O.push(""),O.push(`**Key concepts:** ${_}`)}let M=E.filter((_)=>_.type==="decision").map((_)=>_.title);if(M.length>0)O.push(""),O.push(`**Recent decisions:** ${M.slice(0,5).join("; ")}`);return O.join(`
175
- `)}async function QE(f,n){if(!bn(f))return;let E=(pn.get(f)??Promise.resolve()).then(async()=>{let N=xf(f,"AGENTS.md"),O=xf(f,".AGENTS.md.tmp"),S="";try{S=await DE(N,"utf-8")}catch{}let M=LE(S,n);try{await RE(K0(O),{recursive:!0}),await yE(O,M,"utf-8"),await lE(O,N)}catch(_){try{await uE(O)}catch{}throw _}});return pn.set(f,E.catch(()=>{})),E}function LE(f,n){if(!f)return`${wf}
176
- ${n}
177
- ${uf}
178
- `;let A=f.indexOf(wf),E=f.indexOf(uf);if(A!==-1&&E!==-1&&E>A){let N=f.substring(0,A),O=f.substring(E+uf.length);return`${N}${wf}
179
- ${n}
180
- ${uf}${O}`}return`${f}
181
-
182
- ${wf}
183
- ${n}
184
- ${uf}
185
- `}function zE(f,n,A){let E=new Set,N=X0(n);for(let O of f){if(!O||!O.trim())continue;if(O.startsWith("~")||O.startsWith("http"))continue;let S=tn(O)?O:xf(n,O),M=K0(S),_=X0(M);if(!_.startsWith(N+W0)&&_!==N)continue;if(_===N)continue;let $=an(N,_);if($.split(W0).length>A)continue;if(CE($).split(W0).some((l)=>BE.has(l)))continue;if(!bn(_))continue;E.add(_)}return E}function WE(f,n,A){let E=new Map;for(let N of f){let O=[...N.filesModified,...N.filesRead],S=new Set;for(let M of O){if(!M)continue;let _=tn(M)?M:xf(A,M),$=X0(K0(_));if(n.has($))S.add($)}for(let M of S){let _=E.get(M)??[];_.push(N),E.set(M,_)}}return E}var FE="<!-- open-mem-context -->",sn="<!-- /open-mem-context -->";async function on(f,n){let A;try{A=await KE(f,{withFileTypes:!0,encoding:"utf8"})}catch{return}for(let E of A){let N=String(E.name);if(N===".git"||N==="node_modules"||N===".open-mem"||N==="dist")continue;let O=mE(f,N);if(E.isDirectory())await on(O,n);else if(E.isFile()&&N==="AGENTS.md")n.push(O)}}async function dn(f){let n=YE(f),A=[];return await on(n,A),A}function cE(f){let n=f.indexOf(FE),A=f.indexOf(sn);if(n===-1||A===-1||A<=n)return f;let E=f.slice(0,n).trimEnd(),N=f.slice(A+sn.length).trimStart();if(!E&&!N)return"";if(!E)return`${N}
186
- `;if(!N)return`${E}
187
- `;return`${E}
188
-
189
- ${N}
190
- `}async function en(f,n=!1){let A=await dn(f),E=0;for(let N of A){let O=await ZE(N,"utf-8"),S=cE(O);if(S!==O){if(E+=1,!n)await UE(N,S,"utf-8")}}return{files:A,changed:E}}async function fA(f,n,A,E,N=!1){let S=n.getAll(f).flatMap((_)=>A.getBySession(_.id));if(N){let _=new Set;for(let $ of S)for(let R of[...$.filesRead,...$.filesModified])_.add(R);return{observations:S.length,filesTouched:_.size}}if(!XE(f))return{observations:0,filesTouched:0};await vf(f,S,E);let M=await dn(f);return{observations:S.length,filesTouched:M.length}}class Z0{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 A=this.sessions.getById(f.sessionId);if(!A)return[];return[{session:A,summary:this.summaries.getBySessionId(A.id),observations:this.observations.getBySession(A.id)}]}return this.sessions.getRecent(this.projectPath,f.limit??5).map((A)=>({session:A,summary:this.summaries.getBySessionId(A.id),observations:[]}))}async recall(f,n=10){let A=[];for(let E of f.slice(0,n)){let N=this.observations.getById(E);if(N){A.push(N);continue}if(!this.userObservationRepo)continue;let O=this.userObservationRepo.getById(E);if(!O)continue;A.push({...O,sessionId:"",rawToolOutput:"",discoveryTokens:0})}return A}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:"memory.create",tokenCount:Y(`${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:"memory.create",tokenCount:Y(`${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 A=this.sessions.getById(n.sessionId);if(!A||A.projectPath!==this.projectPath)return null;let{id:E,...N}=f;return this.observations.update(f.id,N)??null}async delete(f){let n=0;for(let A of f){let E=this.observations.getById(A);if(!E)continue;let N=this.sessions.getById(E.sessionId);if(!N||N.projectPath!==this.projectPath)continue;if(this.observations.delete(A))n+=1}return n}async export(f,n={}){if(f!=="project")throw Error("Only project scope export is supported.");let A=this.sessions.getAll(this.projectPath),E=[];for(let M of A)E.push(...this.observations.getBySession(M.id));if(n.type)E=E.filter((M)=>M.type===n.type);if(E.sort((M,_)=>new Date(M.createdAt).getTime()-new Date(_.createdAt).getTime()),n.limit&&n.limit<E.length)E=E.slice(0,n.limit);let N=E.map(({rawToolOutput:M,..._})=>_),O=A.map((M)=>this.summaries.getBySessionId(M.id)).filter((M)=>M!==null);return{version:1,exportedAt:new Date().toISOString(),project:this.projectPath,observations:N,summaries:O}}async import(f,n={}){let A;try{A=JSON.parse(f)}catch{throw Error("Invalid JSON payload.")}if(typeof A!=="object"||A===null)throw Error("Invalid import payload.");let E=A;if(E.version!==1||!Array.isArray(E.observations))throw Error("Unsupported export format.");let N=n.mode??"skip-duplicates",O=0,S=0;for(let M of E.observations){let _=this.observations.getById(M.id);if(_&&N==="skip-duplicates"){S+=1;continue}if(_&&N==="overwrite")this.observations.delete(M.id);this.sessions.getOrCreate(M.sessionId,this.projectPath),this.observations.importObservation({id:M.id,sessionId:M.sessionId,type:M.type,title:M.title,subtitle:M.subtitle??"",facts:M.facts??[],narrative:M.narrative??"",concepts:M.concepts??[],filesRead:M.filesRead??[],filesModified:M.filesModified??[],rawToolOutput:M.rawToolOutput??"",toolName:M.toolName??"unknown",createdAt:M.createdAt,tokenCount:M.tokenCount??0,discoveryTokens:M.discoveryTokens??0,importance:M.importance??3,supersededBy:M.supersededBy??null,supersededAt:M.supersededAt??null}),this.sessions.incrementObservationCount(M.sessionId),O+=1}for(let M of E.summaries??[]){let _=this.summaries.getBySessionId(M.sessionId);if(_&&N==="skip-duplicates")continue;if(_&&N==="overwrite")continue;this.sessions.getOrCreate(M.sessionId,this.projectPath),this.summaries.importSummary(M),this.sessions.setSummary(M.sessionId,M.id)}return{imported:O,skipped:S}}async buildContext(f,n="normal"){let A=this.sessions.getRecent(this.projectPath,5),E=A.map((R)=>R.summaryId?this.summaries.getBySessionId(R.id):null).filter((R)=>R!==null),N=this.observations.getIndex(this.projectPath,this.config.maxObservations),S=N.slice(0,this.config.contextFullObservationCount).map((R)=>R.id).map((R)=>this.observations.getById(R)).filter((R)=>R!==null),M=ff(A,E,N,this.config.maxContextTokens,S);if(n==="compaction"){let R=Tf(M);if(this.config.userMemoryEnabled&&this.userObservationRepo)R+=kf(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);return R}let _={showTokenCosts:this.config.contextShowTokenCosts,observationTypes:this.config.contextObservationTypes,fullObservationCount:this.config.contextFullObservationCount,showLastSummary:this.config.contextShowLastSummary},$=gf(M,_);if(this.config.userMemoryEnabled&&this.userObservationRepo){let R=Pf(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);if(R)$+=`
191
-
192
- ${R}`}return $}guide(){return["open-mem workflow:","1) Use memory.find to find candidate observations by query.","2) Use memory.history to inspect session-level history and summaries.","3) Use memory.get with IDs from find/history to fetch full details.","Write/edit flow: memory.create (new), memory.revise (refine), memory.remove (tombstone).","Transfer flow: memory.transfer.export for backup/portability, memory.transfer.import to restore."].join(`
193
- `)}listObservations(f){let{limit:n=50,offset:A=0,type:E,sessionId:N,state:O}=f;if(O)return this.listByProjectWithState({limit:n,offset:A,type:E,state:O,sessionId:N});if(N){let _=this.observations.getBySession(N);if(E)_=_.filter(($)=>$.type===E);return _.slice(A,A+n)}let M=this.observations.getIndex(this.projectPath,A+n).slice(A);if(E)M=M.filter((_)=>_.type===E);return M.map((_)=>this.observations.getById(_.id)).filter((_)=>_!==null)}getObservation(f){return this.observations.getById(f)}getLineage(f){let A=this.getByIdIncludingArchived(f);if(!A)return null;let E=A,N=0,O=new Set([A.id]);while(E.revisionOf&&N<256){let R=this.getByIdIncludingArchived(E.revisionOf);if(!R||O.has(R.id))break;E=R,O.add(R.id),N+=1}let S=[],M=E,_=new Set,$=0;while(M&&!_.has(M.id)&&$<256){_.add(M.id);let R=M.deletedAt?"tombstoned":M.supersededBy?"superseded":"current";S.push({id:M.id,revisionOf:M.revisionOf??null,supersededBy:M.supersededBy??null,supersededAt:M.supersededAt??null,deletedAt:M.deletedAt??null,state:R,observation:M}),M=M.supersededBy?this.getByIdIncludingArchived(M.supersededBy):null,$+=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(),A=this.sessions.getAll(this.projectPath).length,E=this.observations.getIndex(this.projectPath,1e4),N=0,O=0,S={};for(let $ of E)N+=$.tokenCount,O+=$.discoveryTokens,S[$.type]=(S[$.type]||0)+1;let M=O-N,_=E.length>0?Math.round(N/E.length):0;return{totalObservations:f,totalSessions:A,totalTokensSaved:M,averageObservationSize:_,typeBreakdown:S}}async maintainFolderContext(f,n){if(f==="rebuild"){let E=await fA(this.projectPath,this.sessions,this.observations,this.config.folderContextMaxDepth,n);return{action:f,dryRun:n,...E}}let A=await en(this.projectPath,n);return{action:"clean",dryRun:n,...A}}getRevisionDiff(f,n){let A=this.getByIdIncludingArchived(f),E=this.getByIdIncludingArchived(n);if(!A||!E)return null;let N=[],O=(M,_,$)=>{if(JSON.stringify(_)!==JSON.stringify($))N.push({field:M,before:_,after:$})};O("title",E.title,A.title),O("subtitle",E.subtitle,A.subtitle),O("narrative",E.narrative,A.narrative),O("type",E.type,A.type),O("facts",E.facts,A.facts),O("concepts",E.concepts,A.concepts),O("filesRead",E.filesRead,A.filesRead),O("filesModified",E.filesModified,A.filesModified),O("importance",E.importance,A.importance);let S=N.length===0?"No material changes between revisions.":`Changed ${N.length} field${N.length===1?"":"s"}: ${N.map((M)=>M.field).join(", ")}.`;return{fromId:n,toId:f,summary:S,changedFields:N}}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((A)=>({name:A.name,version:A.version,enabled:f[A.name]??!1,capabilities:A.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((O)=>O.id===f)??null;if(!n)return null;if(!n.previousValues||typeof n.previousValues!=="object")return null;let{patchConfig:A}=await Promise.resolve().then(() => (u0(),Kn)),E=n.previousValues;try{await A(this.projectPath,E)}catch(O){let S={id:`rollback-failed-${nA()}`,timestamp:new Date().toISOString(),patch:n.previousValues,previousValues:n.patch,source:"rollback-failed"};throw this.trackConfigAudit(S),O}let N={id:`rollback-${nA()}`,timestamp:new Date().toISOString(),patch:n.previousValues,previousValues:n.patch,source:"rollback"};return this.trackConfigAudit(N),N}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 IE}from"fs";import{existsSync as GE}from"fs";import{homedir as jE}from"os";import{join as AA}from"path";function HE(){let f=[],n=process.env.BUN_INSTALL;if(n)f.push(AA(n,"bin","bun"));let A=jE();return f.push(AA(A,".bun","bin","bun")),f.push("/usr/local/bin/bun"),f.push("/opt/homebrew/bin/bun"),f.push("/home/linuxbrew/.linuxbrew/bin/bun"),f}function gE(){let f=Bun.which("bun");if(f)return f;for(let n of HE())if(GE(n))return console.debug(`[open-mem] Resolved bun path via candidate scan: ${n}`),n;return"bun"}var U0=null;function EA(){if(U0===null)U0=gE();return U0}import{existsSync as TE,mkdirSync as TS,readFileSync as PE,unlinkSync as kE,writeFileSync as PS}from"fs";function i(f){if(!TE(f))return null;let n=PE(f,"utf-8").trim(),A=Number.parseInt(n,10);if(Number.isNaN(A))return null;return A}function nf(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 yf(f){try{kE(f)}catch{}}function qf(f){let n=f.lastIndexOf("/");if(n>=0)return`${f.substring(0,n)}/worker.pid`;return"worker.pid"}var wE=100,xE=2000;class m0{pidPath;projectPath;daemonScript;subprocess=null;constructor(f){this.pidPath=qf(f.dbPath),this.projectPath=f.projectPath,this.daemonScript=f.daemonScript}start(){if(this.isRunning())return!1;this.subprocess=Bun.spawn([EA(),"run",this.daemonScript,"--project",this.projectPath],{detached:!0,stdio:["ignore","ignore","ignore"],ipc(n){}}),this.subprocess.unref();let f=Date.now()+xE;while(Date.now()<f)if(Bun.sleepSync(wE),IE(this.pidPath)){let n=i(this.pidPath);if(n!==null&&nf(n))return!0}return!1}signal(f){try{this.subprocess?.send(f)}catch{}}stop(){let f=i(this.pidPath);if(f!==null)try{process.kill(f,"SIGTERM")}catch{}this.subprocess=null,yf(this.pidPath)}isRunning(){let f=i(this.pidPath);if(f===null)return!1;return nf(f)}getStatus(){let f=i(this.pidPath);if(f===null)return{running:!1,pid:null};if(!nf(f))return{running:!1,pid:null};return{running:!0,pid:f}}}import{existsSync as Y0}from"fs";function NA(f){let n={reaped:0,errors:[]};try{let A=qf(f),E=i(A);if(E===null){try{if(Y0(A))if(yf(A),!Y0(A))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(N){n.errors.push(`Failed to check/remove corrupt PID file: ${N instanceof Error?N.message:String(N)}`)}return n}if(nf(E))return n;if(yf(A),!Y0(A))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(A){n.errors.push(`Reaper error: ${A instanceof Error?A.message:String(A)}`)}return n}import{Database as OA}from"bun:sqlite";import{existsSync as F0,mkdirSync as vE,unlinkSync as MA}from"fs";import*as SA from"sqlite-vec";class rf{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(F0(n))return OA.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 A=f.substring(0,n);vE(A,{recursive:!0})}return new OA(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(A){throw console.warn("[open-mem] All recovery attempts failed, filesystem may be broken:",A.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{SA.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(F0(n))MA(n)}catch{}}}deleteDatabaseFiles(){this.deleteSidecarFiles();try{if(F0(this.dbPath))MA(this.dbPath)}catch{}}ensureMigrationTable(){this.db.exec(`
164
+ </rerank_request>`}var vE={"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 xE(f){if(f.includes("."))return f;return vE[f]||`us.anthropic.${f}-v1:0`}function T(f){switch(f.provider){case"anthropic":{let{createAnthropic:A}=x("@ai-sdk/anthropic");return A({apiKey:f.apiKey})(f.model)}case"bedrock":{let{createAmazonBedrock:A}=x("@ai-sdk/amazon-bedrock");return A()(xE(f.model))}case"openai":{let{createOpenAI:A}=x("@ai-sdk/openai");return A({apiKey:f.apiKey})(f.model)}case"google":{let{createGoogleGenerativeAI:A}=x("@ai-sdk/google");return A({apiKey:f.apiKey})(f.model)}default:throw Error(`Unknown provider: ${f.provider}. Supported: anthropic, bedrock, openai, google`)}}function h1(f){try{switch(f.provider){case"google":{let{createGoogleGenerativeAI:A}=x("@ai-sdk/google");return A({apiKey:f.apiKey}).embedding("text-embedding-004")}case"openai":{let{createOpenAI:A}=x("@ai-sdk/openai");return A({apiKey:f.apiKey}).embedding("text-embedding-3-small")}case"bedrock":{let{createAmazonBedrock:A}=x("@ai-sdk/amazon-bedrock");return A().embedding("amazon.titan-embed-text-v2:0")}case"anthropic":return null;default:return null}}catch{return null}}var qE={"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},p1=0;async function c(f,A){if(!A)return;let E=qE[f]||5,N=Math.ceil(60000/E)+100,M=Date.now()-p1;if(M<N){let $=N-M;await new Promise((_)=>setTimeout(_,$))}p1=Date.now()}class yf{model;config;_generate=hE;constructor(f){this.config=f,this.model=null;let A=f.provider!=="bedrock";if(f.compressionEnabled&&(!A||f.apiKey))try{this.model=T({provider:f.provider,model:f.model,apiKey:f.apiKey})}catch{}}static MAX_INPUT_LENGTH=50000;async compress(f,A,E){if(!this.config.compressionEnabled||!this.model)return null;if(A.length<this.config.minOutputLength)return null;let N=G(A),O=A.length>yf.MAX_INPUT_LENGTH?`${A.substring(0,yf.MAX_INPUT_LENGTH)}
165
+
166
+ [... truncated ...]`:A,M=I1(f,O,E),$=2;for(let _=0;_<=$;_++)try{if(this.config.provider==="google")await c(this.config.model,this.config.rateLimitingEnabled);let{text:S}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:M}),R=P1(S);if(R)R.discoveryTokens=N;return R}catch(S){if(iE(S)&&_<$){let R=2**_*1000;await b1(R);continue}return null}return null}async compressBatch(f){let A=new Map;for(let E=0;E<f.length;E++){let N=f[E],O=await this.compress(N.toolName,N.toolOutput,N.sessionContext);if(A.set(N.callId,O),E<f.length-1)await b1(200)}return A}createFallbackObservation(f,A){let E=rE(A),N=pE[f]??"discovery";return{type:N,title:`${f} execution`,subtitle:A.substring(0,100).replace(/\n/g," "),facts:[],narrative:`Tool ${f} was executed. Output length: ${A.length} chars.`,concepts:[],filesRead:N==="discovery"?E:[],filesModified:N==="change"?E:[],discoveryTokens:G(A),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 pE={Read:"discovery",Write:"change",Edit:"change",Bash:"change",Glob:"discovery",Grep:"discovery"},bE=/(?:^|\s)((?:\.\/|\/|src\/|tests\/|lib\/)\S+\.\w+)/gm;function rE(f){let A=[];for(let E of f.matchAll(bE))A.push(E[1]);return[...new Set(A)]}function iE(f){if(typeof f!=="object"||f===null)return!1;let A=f,E=A.status;if(E===429||E===500||E===503)return!0;let N=A.error;if(typeof N==="object"&&N!==null&&N.type==="overloaded_error")return!0;return!1}function b1(f){return new Promise((A)=>setTimeout(A,f))}import{generateText as tE}from"ai";class X0{model;config;_generate=tE;constructor(f){if(this.config=f,this.model=null,f.provider==="bedrock"||f.apiKey)try{this.model=T({provider:f.provider,model:f.model,apiKey:f.apiKey})}catch{}}async evaluate(f,A){if(!this.model||A.length===0)return null;let E=v1(f,A),N=2;for(let O=0;O<=N;O++)try{if(this.config.provider==="google")await c(this.config.model,this.config.rateLimitingEnabled);let{text:M}=await this._generate({model:this.model,maxOutputTokens:512,prompt:E});return T1(M)}catch(M){if(aE(M)&&O<N){let $=2**O*1000;await dE($);continue}return null}return null}}function aE(f){if(typeof f!=="object"||f===null)return!1;let A=f,E=A.status;if(E===429||E===500||E===503)return!0;let N=A.error;if(typeof N==="object"&&N!==null&&N.type==="overloaded_error")return!0;return!1}function dE(f){return new Promise((A)=>setTimeout(A,f))}import{generateText as sE}from"ai";class K0{model;config;_generate=sE;constructor(f){if(this.config=f,this.model=null,f.provider==="bedrock"||f.apiKey)try{this.model=T({provider:f.provider,model:f.model,apiKey:f.apiKey})}catch{}}async extract(f){if(!this.model)return null;let A=x1(f),E=2;for(let N=0;N<=E;N++)try{if(this.config.provider==="google")await c(this.config.model,this.config.rateLimitingEnabled);let{text:O}=await this._generate({model:this.model,maxOutputTokens:1024,prompt:A});return c1(O)}catch(O){if(oE(O)&&N<E){let M=2**N*1000;await eE(M);continue}return null}return null}}function oE(f){if(typeof f!=="object"||f===null)return!1;let A=f,E=A.status;if(E===429||E===500||E===503)return!0;let N=A.error;if(typeof N==="object"&&N!==null&&N.type==="overloaded_error")return!0;return!1}function eE(f){return new Promise((A)=>setTimeout(A,f))}import{generateText as fN}from"ai";class Z0{model;config;_generate=fN;constructor(f){this.config=f,this.model=null;let A=f.provider!=="bedrock";if(f.compressionEnabled&&(!A||f.apiKey))try{this.model=T({provider:f.provider,model:f.model,apiKey:f.apiKey})}catch{}}async summarize(f,A){if(A.length===0)return null;if(!this.config.compressionEnabled||!this.model)return this.createFallbackSummary(A);let E=w1(A.map((N)=>({type:N.type,title:N.title,narrative:N.narrative})),f);try{if(this.config.provider==="google")await c(this.config.model,this.config.rateLimitingEnabled);let{text:N}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:E}),O=g1(N);if(!O)return this.createFallbackSummary(A);return O}catch{return this.createFallbackSummary(A)}}createFallbackSummary(f){let A=new Set,E=new Set,N=[];for(let _ of f){for(let S of _.filesModified)A.add(S);for(let S of _.concepts)E.add(S);if(_.type==="decision")N.push(_.title)}let O=new Map;for(let _ of f)O.set(_.type,(O.get(_.type)??0)+1);let M=Array.from(O.entries()).map(([_,S])=>`${S} ${_}${S>1?"s":""}`).join(", "),$=Array.from(E).slice(0,5).join(", ");return{summary:`Session with ${f.length} observations: ${M}. Files modified: ${A.size}. Key concepts: ${$}.`,keyDecisions:N.slice(0,5),filesModified:Array.from(A),concepts:Array.from(E)}}shouldSummarize(f){return f>=2}}mf();import{randomUUID as AA}from"crypto";var AN={showTokenCosts:!0,observationTypes:"all",fullObservationCount:3,showLastSummary:!0},Jf={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"};function kf(f,A=AN){let E=[];if(E.push("## open-mem: Past Session Memory"),E.push(""),E.push("**\uD83D\uDCA1 Progressive Disclosure:** This is a compact index showing WHAT was observed and retrieval COST."),E.push("Use `memory.find` to find observations by query, then `memory.get` with IDs to fetch full details."),E.push(""),E.push("**3-Layer Memory Access:**"),E.push("- **Layer 1** `memory.find` \u2014 Find observations by query (returns IDs + summaries)"),E.push("- **Layer 2** `memory.history` \u2014 Browse session history and drill into sessions"),E.push("- **Layer 3** `memory.get` \u2014 Get full details by ID (use IDs from search results or the index below)"),A.showLastSummary&&f.recentSummaries.length>0){E.push(""),E.push("### Recent Sessions"),E.push("| Session | Summary | Decisions |"),E.push("|---------|---------|-----------|");for(let $ of f.recentSummaries){let _=$.keyDecisions.length>0?$.keyDecisions.join("; "):"\u2014";E.push(`| ${$.sessionId} | ${$.summary} | ${_} |`)}}let N=A.observationTypes==="all"?f.observationIndex:f.observationIndex.filter(($)=>A.observationTypes.includes($.type));if(N.length>0){E.push(""),E.push(`### Recent Observations (${N.length} entries)`);let $=NN(N,f.fullObservations);for(let[_,S]of $){if(E.push(""),E.push(`**${_}**`),A.showTokenCosts)E.push("| ID | Type | Title | ~Tokens |"),E.push("|----|------|-------|---------|");else E.push("| ID | Type | Title |"),E.push("|----|------|-------|");for(let R of S){let D=Jf[R.type]||"\uD83D\uDCDD";if(A.showTokenCosts)E.push(`| ${R.id} | ${D} | ${R.title} | ~${R.tokenCount} |`);else E.push(`| ${R.id} | ${D} | ${R.title} |`)}}}let O=f.fullObservations.slice(0,A.fullObservationCount);if(O.length>0){E.push(""),E.push("### Full Details (most recent)");for(let $ of O){let _=Jf[$.type]||"\uD83D\uDCDD";if(E.push(""),E.push(`#### ${_} ${$.title} (${$.id})`),E.push($.narrative),$.facts.length>0)E.push(`**Facts:** ${$.facts.map((R)=>`- ${R}`).join(" ")}`);if($.concepts.length>0)E.push(`**Concepts:** ${$.concepts.join(", ")}`);let S=[...$.filesRead,...$.filesModified];if(S.length>0)E.push(`**Files:** ${S.join(", ")}`)}}let M=EN(f);if(M)E.push(""),E.push(M);return E.join(`
167
+ `)}function EN(f){let A=0,E=0,N=new Set(f.observationIndex.map(($)=>$.id));for(let $ of f.observationIndex)A+=$.tokenCount,E+=$.discoveryTokens;for(let $ of f.fullObservations)if(!N.has($.id))A+=$.tokenCount,E+=$.discoveryTokens;if(E===0)return null;let O=E-A,M=Math.max(0,Math.round(O/E*100));return`### \uD83D\uDCB0 Memory Economics
168
+ **Read cost:** ~${A}t | **Discovery cost:** ~${E}t | **Savings:** ${M}% (${O}t saved)`}function NN(f,A){let E=new Map;for(let O of A){let M=O.filesModified[0]||O.filesRead[0];if(M)E.set(O.id,M)}let N=new Map;for(let O of f){let M=E.get(O.id)??"General",$=N.get(M)??[];$.push(O),N.set(M,$)}return N}function Tf(f){let A=[];if(A.push("[open-mem] Memory context:"),f.recentSummaries.length>0){A.push(`
169
+ Recent sessions:`);for(let E of f.recentSummaries)A.push(`- ${E.summary}`)}if(f.observationIndex.length>0){A.push(`
170
+ Recent observations (${f.observationIndex.length} entries):`);for(let E of f.observationIndex)A.push(`- ${Jf[E.type]||"\uD83D\uDCDD"} ${E.title}`)}return A.join(`
171
+ `)}function cf(f,A){if(f.length===0)return"";let E=A,N=[];for(let M of f){let $=M.tokenCount||G(M.title);if(E-$<0)break;N.push(M),E-=$}if(N.length===0)return"";let O=[];O.push("### Cross-Project Memory"),O.push(""),O.push("| ID | Type | Title | ~Tokens |"),O.push("|----|------|-------|---------|");for(let M of N){let $=Jf[M.type]||"\uD83D\uDCDD";O.push(`| ${M.id} | ${$} | ${M.title} | ~${M.tokenCount} |`)}return O.join(`
172
+ `)}function If(f,A){if(f.length===0)return"";let E=A,N=[];for(let M of f){let $=M.tokenCount||G(M.title);if(E-$<0)break;N.push(M),E-=$}if(N.length===0)return"";let O=[];O.push(`
173
+ Cross-project observations (${N.length} entries):`);for(let M of N)O.push(`- ${Jf[M.type]||"\uD83D\uDCDD"} ${M.title}`);return O.join(`
174
+ `)}var wf={recency:0.4,typeImportance:0.3,sessionAffinity:0.2,tokenEfficiency:0.1},ON={decision:1,bugfix:0.9,feature:0.8,refactor:0.6,discovery:0.5,change:0.4};function MN(f,A){let E=new Date(f),O=(A.getTime()-E.getTime())/3600000;if(O<0)return 1;if(O<24)return 1;if(O<48)return 0.8;if(O<168)return 0.5;return 0.2}function _N(f){return ON[f]??0.3}function $N(f,A){if(!A)return 0.5;return f===A?1:0.3}function SN(f){if(f<=10)return 1;if(f>=200)return 0.2;return 1-(f-10)/190*0.8}function RN(f,A){let E=MN(f.createdAt,A.now),N=_N(f.type),O=$N(f.sessionId,A.currentSessionId),M=SN(f.tokenCount);return E*wf.recency+N*wf.typeImportance+O*wf.sessionAffinity+M*wf.tokenEfficiency}function r1(f,A){let E=new Map;for(let N of f)E.set(N.id,RN(N,A));return[...f].sort((N,O)=>{let M=E.get(N.id)??0,$=E.get(O.id)??0;if($!==M)return $-M;return new Date(O.createdAt).getTime()-new Date(N.createdAt).getTime()})}function Af(f,A,E,N,O=[],M){let $=N,_=[],S=[];for(let D of A){let C=D.tokenCount||G(D.summary);if($-C<0)break;_.push(D),$-=C}let R=M?r1(E,M):E;for(let D of R){let C=D.tokenCount||G(D.title);if($-C<0)break;S.push(D),$-=C}return{recentSummaries:_,observationIndex:S,fullObservations:[...O],totalTokens:N-$}}import{existsSync as UN}from"fs";import{readdir as uN,readFile as YN,unlink as nN,writeFile as FN}from"fs/promises";import{join as GN,resolve as HN}from"path";import{existsSync as t1}from"fs";import{mkdir as DN,readFile as CN,rename as VN,unlink as yN,writeFile as JN}from"fs/promises";import{dirname as Y0,isAbsolute as a1,join as vf,normalize as BN,relative as d1,resolve as u0,sep as U0}from"path";var Ef="<!-- open-mem-context -->",i="<!-- /open-mem-context -->",QN={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"},i1=new Map,LN=new Set(["node_modules",".git","dist","coverage",".open-mem","build","__pycache__",".next",".nuxt"]);async function xf(f,A,E=5){if(A.length===0)return;let N=[];for(let $ of A){for(let _ of $.filesModified)N.push(_);for(let _ of $.filesRead)N.push(_)}let O=KN(N,f,E);if(O.size===0)return;let M=ZN(A,O,f);for(let[$,_]of M)try{let S=zN($,_,f);await WN($,S)}catch(S){console.error(`[open-mem] Failed to update AGENTS.md in ${$}:`,S)}}function zN(f,A,E){let N=[...A].sort((S,R)=>R.createdAt.localeCompare(S.createdAt)).slice(0,10),O=d1(E,f)||".",M=[];M.push(`## Recent Activity in \`${O}/\` (auto-generated by open-mem)`),M.push(""),M.push("| Type | Title | Date |"),M.push("|------|-------|------|");for(let S of N){let R=QN[S.type]||"\uD83D\uDCDD",D=S.createdAt.split("T")[0],C=S.title.replace(/\|/g,"\\|");M.push(`| ${R} ${S.type} | ${C} | ${D} |`)}let $=new Set;for(let S of N)for(let R of S.concepts)$.add(R);if($.size>0){let S=[...$].slice(0,10).join(", ");M.push(""),M.push(`**Key concepts:** ${S}`)}let _=N.filter((S)=>S.type==="decision").map((S)=>S.title);if(_.length>0)M.push(""),M.push(`**Recent decisions:** ${_.slice(0,5).join("; ")}`);return M.join(`
175
+ `)}async function WN(f,A){if(!t1(f))return;let N=(i1.get(f)??Promise.resolve()).then(async()=>{let O=vf(f,"AGENTS.md"),M=vf(f,".AGENTS.md.tmp"),$="";try{$=await CN(O,"utf-8")}catch{}let _=XN($,A);try{await DN(Y0(M),{recursive:!0}),await JN(M,_,"utf-8"),await VN(M,O)}catch(S){try{await yN(M)}catch{}throw S}});return i1.set(f,N.catch(()=>{})),N}function XN(f,A){if(!f)return`${Ef}
176
+ ${A}
177
+ ${i}
178
+ `;let E=f.indexOf(Ef),N=f.indexOf(i);if(E!==-1&&N!==-1&&N>E){let M=f.substring(0,E),$=f.substring(N+i.length);return`${M}${Ef}
179
+ ${A}
180
+ ${i}${$}`}let O=f;if(E!==-1&&N===-1)O=O.replace(Ef,"").trim();else if(E===-1&&N!==-1)O=O.replace(i,"").trim();else if(E!==-1&&N!==-1&&N<=E)O=O.replace(i,"").replace(Ef,"").trim();return`${O}
181
+
182
+ ${Ef}
183
+ ${A}
184
+ ${i}
185
+ `}function KN(f,A,E){let N=new Set,O=u0(A);for(let M of f){if(!M||!M.trim())continue;if(M.startsWith("~")||M.startsWith("http"))continue;let $=a1(M)?M:vf(A,M),_=Y0($),S=u0(_);if(!S.startsWith(O+U0)&&S!==O)continue;if(S===O)continue;let R=d1(O,S);if(R.split(U0).length>E)continue;if(BN(R).split(U0).some((V)=>LN.has(V)))continue;if(!t1(S))continue;N.add(S)}return N}function ZN(f,A,E){let N=new Map;for(let O of f){let M=[...O.filesModified,...O.filesRead],$=new Set;for(let _ of M){if(!_)continue;let S=a1(_)?_:vf(E,_),R=u0(Y0(S));if(A.has(R))$.add(R)}for(let _ of $){let S=N.get(_)??[];S.push(O),N.set(_,S)}}return N}var n0="<!-- open-mem-context -->",qf="<!-- /open-mem-context -->";async function s1(f,A){let E;try{E=await uN(f,{withFileTypes:!0,encoding:"utf8"})}catch{return}for(let N of E){let O=String(N.name);if(O===".git"||O==="node_modules"||O===".open-mem"||O==="dist")continue;let M=GN(f,O);if(N.isDirectory())await s1(M,A);else if(N.isFile()&&O==="AGENTS.md")A.push(M)}}async function o1(f){let A=HN(f),E=[];return await s1(A,E),E}function lN(f){let A=f.indexOf(n0),E=f.indexOf(qf);if(A===-1&&E===-1)return f;if(A!==-1&&E===-1){let M=f.replace(n0,"").trim();return M?`${M}
186
+ `:""}if(A===-1&&E!==-1){let M=f.replace(qf,"").trim();return M?`${M}
187
+ `:""}if(E<=A){let M=f.replace(n0,"").replace(qf,"").trim();return M?`${M}
188
+ `:""}let N=f.slice(0,A).trimEnd(),O=f.slice(E+qf.length).trimStart();if(!N&&!O)return"";if(!N)return`${O}
189
+ `;if(!O)return`${N}
190
+ `;return`${N}
191
+
192
+ ${O}
193
+ `}async function e1(f,A=!1){let E=await o1(f),N=0;for(let O of E){let M=await YN(O,"utf-8"),$=lN(M);if($!==M){if(N+=1,!A)if($==="")await nN(O);else await FN(O,$,"utf-8")}}return{files:E,changed:N}}async function fA(f,A,E,N,O=!1){let $=A.getAll(f).flatMap((S)=>E.getBySession(S.id));if(O){let S=new Set;for(let R of $)for(let D of[...R.filesRead,...R.filesModified])S.add(D);return{observations:$.length,filesTouched:S.size}}if(!UN(f))return{observations:0,filesTouched:0};await xf(f,$,N);let _=await o1(f);return{observations:$.length,filesTouched:_.length}}class F0{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 A=this.observations;return A.getByIdIncludingArchived?A.getByIdIncludingArchived(f):this.observations.getById(f)}listByProjectWithState(f){let A=this.observations;if(A.listByProject)return A.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,A={}){return this.searchOrchestrator.search(f,{type:A.type,limit:A.limit??10,projectPath:this.projectPath,importanceMin:A.importanceMin,importanceMax:A.importanceMax,createdAfter:A.after,createdBefore:A.before,concepts:A.concepts,files:A.files})}async timeline(f={}){if(f.sessionId){let E=this.sessions.getById(f.sessionId);if(!E)return[];return[{session:E,summary:this.summaries.getBySessionId(E.id),observations:this.observations.getBySession(E.id)}]}return this.sessions.getRecent(this.projectPath,f.limit??5).map((E)=>({session:E,summary:this.summaries.getBySessionId(E.id),observations:[]}))}async recall(f,A=10){let E=[];for(let N of f.slice(0,A)){let O=this.observations.getById(N);if(O){E.push(O);continue}if(!this.userObservationRepo)continue;let M=this.userObservationRepo.getById(N);if(!M)continue;E.push({...M,sessionId:"",rawToolOutput:"",discoveryTokens:0})}return E}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:"memory.create",tokenCount:G(`${f.title} ${f.narrative}`),importance:f.importance??3,sourceProject:this.projectPath}),sessionId:"",rawToolOutput:"",discoveryTokens:0}}this.sessions.getOrCreate(f.sessionId,this.projectPath);let A=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:"memory.create",tokenCount:G(`${f.title} ${f.narrative}`),discoveryTokens:0,importance:f.importance??3});return this.sessions.incrementObservationCount(f.sessionId),A}async update(f){let A=this.observations.getById(f.id);if(!A)return null;let E=this.sessions.getById(A.sessionId);if(!E||E.projectPath!==this.projectPath)return null;let{id:N,...O}=f;return this.observations.update(f.id,O)??null}async delete(f){let A=0;for(let E of f){let N=this.observations.getById(E);if(!N)continue;let O=this.sessions.getById(N.sessionId);if(!O||O.projectPath!==this.projectPath)continue;if(this.observations.delete(E))A+=1}return A}async export(f,A={}){if(f!=="project")throw Error("Only project scope export is supported.");let E=this.sessions.getAll(this.projectPath),N=[];for(let _ of E)N.push(...this.observations.getBySession(_.id));if(A.type)N=N.filter((_)=>_.type===A.type);if(N.sort((_,S)=>new Date(_.createdAt).getTime()-new Date(S.createdAt).getTime()),A.limit&&A.limit<N.length)N=N.slice(0,A.limit);let O=N.map(({rawToolOutput:_,...S})=>S),M=E.map((_)=>this.summaries.getBySessionId(_.id)).filter((_)=>_!==null);return{version:1,exportedAt:new Date().toISOString(),project:this.projectPath,observations:O,summaries:M}}async import(f,A={}){let E;try{E=JSON.parse(f)}catch{throw Error("Invalid JSON payload.")}if(typeof E!=="object"||E===null)throw Error("Invalid import payload.");let N=E;if(N.version!==1||!Array.isArray(N.observations))throw Error("Unsupported export format.");let O=A.mode??"skip-duplicates",M=0,$=0;for(let _ of N.observations){let S=this.observations.getById(_.id);if(S&&O==="skip-duplicates"){$+=1;continue}if(S&&O==="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),M+=1}for(let _ of N.summaries??[]){let S=this.summaries.getBySessionId(_.sessionId);if(S&&O==="skip-duplicates")continue;if(S&&O==="overwrite")continue;this.sessions.getOrCreate(_.sessionId,this.projectPath),this.summaries.importSummary(_),this.sessions.setSummary(_.sessionId,_.id)}return{imported:M,skipped:$}}async buildContext(f,A="normal"){let E=this.sessions.getRecent(this.projectPath,5),N=E.map((D)=>D.summaryId?this.summaries.getBySessionId(D.id):null).filter((D)=>D!==null),O=this.observations.getIndex(this.projectPath,this.config.maxObservations),$=O.slice(0,this.config.contextFullObservationCount).map((D)=>D.id).map((D)=>this.observations.getById(D)).filter((D)=>D!==null),_=Af(E,N,O,this.config.maxContextTokens,$);if(A==="compaction"){let D=Tf(_);if(this.config.userMemoryEnabled&&this.userObservationRepo)D+=If(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);return D}let S={showTokenCosts:this.config.contextShowTokenCosts,observationTypes:this.config.contextObservationTypes,fullObservationCount:this.config.contextFullObservationCount,showLastSummary:this.config.contextShowLastSummary},R=kf(_,S);if(this.config.userMemoryEnabled&&this.userObservationRepo){let D=cf(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);if(D)R+=`
194
+
195
+ ${D}`}return R}guide(){return["open-mem workflow:","1) Use memory.find to find candidate observations by query.","2) Use memory.history to inspect session-level history and summaries.","3) Use memory.get with IDs from find/history to fetch full details.","Write/edit flow: memory.create (new), memory.revise (refine), memory.remove (tombstone).","Transfer flow: memory.transfer.export for backup/portability, memory.transfer.import to restore."].join(`
196
+ `)}listObservations(f){let{limit:A=50,offset:E=0,type:N,sessionId:O,state:M}=f;if(M)return this.listByProjectWithState({limit:A,offset:E,type:N,state:M,sessionId:O});if(O){let S=this.observations.getBySession(O);if(N)S=S.filter((R)=>R.type===N);return S.slice(E,E+A)}let _=this.observations.getIndex(this.projectPath,E+A).slice(E);if(N)_=_.filter((S)=>S.type===N);return _.map((S)=>this.observations.getById(S.id)).filter((S)=>S!==null)}getObservation(f){return this.observations.getById(f)}getLineage(f){let E=this.getByIdIncludingArchived(f);if(!E)return null;let N=E,O=0,M=new Set([E.id]);while(N.revisionOf&&O<256){let D=this.getByIdIncludingArchived(N.revisionOf);if(!D||M.has(D.id))break;N=D,M.add(D.id),O+=1}let $=[],_=N,S=new Set,R=0;while(_&&!S.has(_.id)&&R<256){S.add(_.id);let D=_.deletedAt?"tombstoned":_.supersededBy?"superseded":"current";$.push({id:_.id,revisionOf:_.revisionOf??null,supersededBy:_.supersededBy??null,supersededAt:_.supersededAt??null,deletedAt:_.deletedAt??null,state:D,observation:_}),_=_.supersededBy?this.getByIdIncludingArchived(_.supersededBy):null,R+=1}return $}listSessions(f){return this.sessions.getRecent(f.projectPath??this.projectPath,f.limit??20)}getSession(f){let A=this.sessions.getById(f);if(!A)return null;return{session:A,summary:this.summaries.getBySessionId(f),observations:this.observations.getBySession(f)}}stats(){let f=this.observations.getCount(),E=this.sessions.getAll(this.projectPath).length,N=this.observations.getIndex(this.projectPath,1e4),O=0,M=0,$={};for(let R of N)O+=R.tokenCount,M+=R.discoveryTokens,$[R.type]=($[R.type]||0)+1;let _=M-O,S=N.length>0?Math.round(O/N.length):0;return{totalObservations:f,totalSessions:E,totalTokensSaved:_,averageObservationSize:S,typeBreakdown:$}}async maintainFolderContext(f,A){if(f==="rebuild"){let N=await fA(this.projectPath,this.sessions,this.observations,this.config.folderContextMaxDepth,A);return{action:f,dryRun:A,...N}}let E=await e1(this.projectPath,A);return{action:"clean",dryRun:A,...E}}getRevisionDiff(f,A){let E=this.getByIdIncludingArchived(f),N=this.getByIdIncludingArchived(A);if(!E||!N)return null;let O=[],M=(_,S,R)=>{if(JSON.stringify(S)!==JSON.stringify(R))O.push({field:_,before:S,after:R})};M("title",N.title,E.title),M("subtitle",N.subtitle,E.subtitle),M("narrative",N.narrative,E.narrative),M("type",N.type,E.type),M("facts",N.facts,E.facts),M("concepts",N.concepts,E.concepts),M("filesRead",N.filesRead,E.filesRead),M("filesModified",N.filesModified,E.filesModified),M("importance",N.importance,E.importance);let $=O.length===0?"No material changes between revisions.":`Changed ${O.length} field${O.length===1?"":"s"}: ${O.map((_)=>_.field).join(", ")}.`;return{fromId:A,toId:f,summary:$,changedFields:O}}getHealth(){let f=this.runtimeSnapshotProvider?.(),A=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:A,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((E)=>({name:E.name,version:E.version,enabled:f[E.name]??!1,capabilities:E.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 A=this.configAuditStore?this.configAuditStore.getById(f):this.configAuditLogFallback.find((M)=>M.id===f)??null;if(!A)return null;if(!A.previousValues||typeof A.previousValues!=="object")return null;let{patchConfig:E}=await Promise.resolve().then(() => (J0(),n1)),N=A.previousValues;try{await E(this.projectPath,N)}catch(M){let $={id:`rollback-failed-${AA()}`,timestamp:new Date().toISOString(),patch:A.previousValues,previousValues:A.patch,source:"rollback-failed"};throw this.trackConfigAudit($),M}let O={id:`rollback-${AA()}`,timestamp:new Date().toISOString(),patch:A.previousValues,previousValues:A.patch,source:"rollback"};return this.trackConfigAudit(O),O}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 IN}from"fs";import{existsSync as mN}from"fs";import{homedir as jN}from"os";import{join as EA}from"path";function PN(){let f=[],A=process.env.BUN_INSTALL;if(A)f.push(EA(A,"bin","bun"));let E=jN();return f.push(EA(E,".bun","bin","bun")),f.push("/usr/local/bin/bun"),f.push("/opt/homebrew/bin/bun"),f.push("/home/linuxbrew/.linuxbrew/bin/bun"),f}function gN(){let f=Bun.which("bun");if(f)return f;for(let A of PN())if(mN(A))return console.debug(`[open-mem] Resolved bun path via candidate scan: ${A}`),A;return"bun"}var G0=null;function NA(){if(G0===null)G0=gN();return G0}import{existsSync as kN,mkdirSync as k_,readFileSync as TN,unlinkSync as cN,writeFileSync as T_}from"fs";function t(f){if(!kN(f))return null;let A=TN(f,"utf-8").trim(),E=Number.parseInt(A,10);if(Number.isNaN(E))return null;return E}function Nf(f){try{return process.kill(f,0),!0}catch(A){if(A instanceof Error&&"code"in A&&A.code==="EPERM")return!0;return!1}}function Bf(f){try{cN(f)}catch{}}function hf(f){let A=f.lastIndexOf("/");if(A>=0)return`${f.substring(0,A)}/worker.pid`;return"worker.pid"}var wN=100,vN=2000;class H0{pidPath;projectPath;daemonScript;subprocess=null;constructor(f){this.pidPath=hf(f.dbPath),this.projectPath=f.projectPath,this.daemonScript=f.daemonScript}start(){if(this.isRunning())return!1;this.subprocess=Bun.spawn([NA(),"run",this.daemonScript,"--project",this.projectPath],{detached:!0,stdio:["ignore","ignore","ignore"],ipc(A){}}),this.subprocess.unref();let f=Date.now()+vN;while(Date.now()<f)if(Bun.sleepSync(wN),IN(this.pidPath)){let A=t(this.pidPath);if(A!==null&&Nf(A))return!0}return!1}signal(f){try{this.subprocess?.send(f)}catch{}}stop(){let f=t(this.pidPath);if(f!==null)try{process.kill(f,"SIGTERM")}catch{}this.subprocess=null,Bf(this.pidPath)}isRunning(){let f=t(this.pidPath);if(f===null)return!1;return Nf(f)}getStatus(){let f=t(this.pidPath);if(f===null)return{running:!1,pid:null};if(!Nf(f))return{running:!1,pid:null};return{running:!0,pid:f}}}import{existsSync as l0}from"fs";function OA(f){let A={reaped:0,errors:[]};try{let E=hf(f),N=t(E);if(N===null){try{if(l0(E))if(Bf(E),!l0(E))A.reaped++,console.log("[open-mem] Reaped corrupt daemon PID file");else A.errors.push("Failed to remove corrupt PID file: file still exists after removal")}catch(O){A.errors.push(`Failed to check/remove corrupt PID file: ${O instanceof Error?O.message:String(O)}`)}return A}if(Nf(N))return A;if(Bf(E),!l0(E))A.reaped++,console.log(`[open-mem] Reaped stale daemon PID file (pid=${N})`);else A.errors.push(`Failed to remove stale PID file (pid=${N}): file still exists after removal`)}catch(E){A.errors.push(`Reaper error: ${E instanceof Error?E.message:String(E)}`)}return A}import{Database as MA}from"bun:sqlite";import{existsSync as m0,mkdirSync as xN,unlinkSync as _A}from"fs";import*as $A from"sqlite-vec";class pf{db;dbPath;_hasVectorExtension=!1;static enableExtensionSupport(){let f=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite/lib/libsqlite3.dylib"];for(let A of f)try{if(m0(A))return MA.setCustomSQLite(A),!0}catch{return!1}return!1}constructor(f){this.dbPath=f,this.db=this.open(f),this.configure()}open(f){let A=f.lastIndexOf("/");if(A>0){let E=f.substring(0,A);xN(E,{recursive:!0})}return new MA(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(A){console.warn("[open-mem] WAL/SHM cleanup insufficient, recreating database from scratch:",A.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(E){throw console.warn("[open-mem] All recovery attempts failed, filesystem may be broken:",E.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{$A.load(this.db),this._hasVectorExtension=!0}catch{this._hasVectorExtension=!1}}get hasVectorExtension(){return this._hasVectorExtension}deleteSidecarFiles(){for(let f of["-wal","-shm"]){let A=this.dbPath+f;try{if(m0(A))_A(A)}catch{}}}deleteDatabaseFiles(){this.deleteSidecarFiles();try{if(m0(this.dbPath))_A(this.dbPath)}catch{}}ensureMigrationTable(){this.db.exec(`
194
197
  CREATE TABLE IF NOT EXISTS _migrations (
195
198
  version INTEGER PRIMARY KEY,
196
199
  name TEXT NOT NULL,
197
200
  applied_at TEXT NOT NULL DEFAULT (datetime('now'))
198
201
  )
199
- `)}migrate(f){this.ensureMigrationTable();let n=this.db.query("SELECT version FROM _migrations ORDER BY version").all(),A=new Set(n.map((N)=>N.version)),E=f.filter((N)=>!A.has(N.version)).sort((N,O)=>N.version-O.version);for(let N of E)this.db.transaction(()=>{this.db.exec(N.up),this.db.query("INSERT INTO _migrations (version, name) VALUES ($version, $name)").run({$version:N.version,$name:N.name})})()}run(f,n){let A=this.db.query(f);if(n)A.run(...n);else A.run()}get(f,n){let A=this.db.query(f);return n?A.get(...n):A.get()}all(f,n){let A=this.db.query(f);return n?A.all(...n):A.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 hf(f){return new rf(f)}function pf(f){try{let n=JSON.parse(f);return n&&typeof n==="object"?n:{}}catch{return{}}}class c0{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:pf(f.patch),previousValues:pf(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:pf(n.patch),previousValues:pf(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{randomUUID as _A}from"crypto";class G0{db;constructor(f){this.db=f}upsertEntity(f,n){let A=_A(),E=new Date().toISOString();this.db.run(`INSERT INTO entities (id, name, entity_type, first_seen_at, last_seen_at, mention_count)
202
+ `)}migrate(f){this.ensureMigrationTable();let A=this.db.query("SELECT version FROM _migrations ORDER BY version").all(),E=new Set(A.map((O)=>O.version)),N=f.filter((O)=>!E.has(O.version)).sort((O,M)=>O.version-M.version);for(let O of N)this.db.transaction(()=>{this.db.exec(O.up),this.db.query("INSERT INTO _migrations (version, name) VALUES ($version, $name)").run({$version:O.version,$name:O.name})})()}run(f,A){let E=this.db.query(f);if(A)E.run(...A);else E.run()}get(f,A){let E=this.db.query(f);return A?E.get(...A):E.get()}all(f,A){let E=this.db.query(f);return A?E.all(...A):E.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 bf(f){return new pf(f)}function rf(f){try{let A=JSON.parse(f);return A&&typeof A==="object"?A:{}}catch{return{}}}class j0{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:rf(f.patch),previousValues:rf(f.previous_values),source:f.source}))}getById(f){let A=this.db.get("SELECT id, timestamp, patch, previous_values, source FROM config_audit_events WHERE id = ?",[f]);if(!A)return null;return{id:A.id,timestamp:A.timestamp,patch:rf(A.patch),previousValues:rf(A.previous_values),source:A.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{randomUUID as SA}from"crypto";class P0{db;constructor(f){this.db=f}upsertEntity(f,A){let E=SA(),N=new Date().toISOString();this.db.run(`INSERT INTO entities (id, name, entity_type, first_seen_at, last_seen_at, mention_count)
200
203
  VALUES (?, ?, ?, ?, ?, 1)
201
204
  ON CONFLICT(name, entity_type) DO UPDATE SET
202
205
  mention_count = mention_count + 1,
203
- last_seen_at = ?`,[A,f,n,E,E,E]);let N=this.db.get("SELECT * FROM entities WHERE name = ? AND entity_type = ?",[f,n]);if(!N)throw Error(`Failed to upsert entity: ${f} (${n})`);return this.mapEntityRow(N)}createRelation(f,n,A,E){let N=_A(),O=new Date().toISOString();try{this.db.run(`INSERT OR IGNORE INTO entity_relations
206
+ last_seen_at = ?`,[E,f,A,N,N,N]);let O=this.db.get("SELECT * FROM entities WHERE name = ? AND entity_type = ?",[f,A]);if(!O)throw Error(`Failed to upsert entity: ${f} (${A})`);return this.mapEntityRow(O)}createRelation(f,A,E,N){let O=SA(),M=new Date().toISOString();try{this.db.run(`INSERT OR IGNORE INTO entity_relations
204
207
  (id, source_entity_id, target_entity_id, relationship, observation_id, created_at)
205
- VALUES (?, ?, ?, ?, ?, ?)`,[N,f,n,A,E,O])}catch{return null}let S=this.db.get(`SELECT * FROM entity_relations
206
- WHERE source_entity_id = ? AND target_entity_id = ? AND relationship = ?`,[f,n,A]);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.*
208
+ VALUES (?, ?, ?, ?, ?, ?)`,[O,f,A,E,N,M])}catch{return null}let $=this.db.get(`SELECT * FROM entity_relations
209
+ WHERE source_entity_id = ? AND target_entity_id = ? AND relationship = ?`,[f,A,E]);return $?this.mapRelationRow($):null}linkObservation(f,A){this.db.run("INSERT OR IGNORE INTO entity_observations (entity_id, observation_id) VALUES (?, ?)",[f,A])}findByName(f){try{return this.db.all(`SELECT e.*
207
210
  FROM entities e
208
211
  JOIN entities_fts fts ON e._rowid = fts.rowid
209
212
  WHERE entities_fts MATCH ?
210
- ORDER BY rank`,[f]).map((A)=>this.mapEntityRow(A))}catch{return[]}}getRelationsFor(f){return this.db.all(`SELECT * FROM entity_relations
211
- WHERE source_entity_id = ? OR target_entity_id = ?`,[f,f]).map((A)=>this.mapRelationRow(A))}traverseRelations(f,n=1){let A=Math.min(n,2),E=100,N=new Set,O=[{id:f,currentDepth:0}];N.add(f);while(O.length>0){if(N.size>=100)break;let S=O.shift();if(!S)continue;if(S.currentDepth>=A)continue;let M=this.getRelationsFor(S.id);for(let _ of M){let $=_.sourceEntityId===S.id?_.targetEntityId:_.sourceEntityId;if(!N.has($))N.add($),O.push({id:$,currentDepth:S.currentDepth+1})}}return N}getObservationsForEntity(f){return this.db.all("SELECT observation_id FROM entity_observations WHERE entity_id = ?",[f]).map((A)=>A.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 qE(f){try{let n=JSON.parse(f);return n&&typeof n==="object"?n:{}}catch{return{}}}class j0{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:qE(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 hE}from"crypto";import{embed as rE}from"ai";async function t(f,n){try{let{embedding:A}=await rE({model:f,value:n});return A}catch{return null}}function Af(f,n){if(f.length!==n.length||f.length===0)return 0;let A=0,E=0,N=0;for(let S=0;S<f.length;S++)A+=f[S]*n[S],E+=f[S]*f[S],N+=n[S]*n[S];let O=Math.sqrt(E)*Math.sqrt(N);if(O===0)return 0;return A/O}function H0(f){let n=[f.title,f.narrative];if(f.concepts.length>0)n.push(f.concepts.join(", "));return n.join(`
212
- `)}function pE(f){return f.replace(/[%_\\]/g,"\\$&")}class g0{db;constructor(f){this.db=f}create(f){let n=hE(),A=new Date().toISOString(),E=f.discoveryTokens??0,N=f.importance??3,O=f.scope??"project";return this.db.run(`INSERT INTO observations
213
+ ORDER BY rank`,[f]).map((E)=>this.mapEntityRow(E))}catch{return[]}}getRelationsFor(f){return this.db.all(`SELECT * FROM entity_relations
214
+ WHERE source_entity_id = ? OR target_entity_id = ?`,[f,f]).map((E)=>this.mapRelationRow(E))}traverseRelations(f,A=1){let E=Math.min(A,2),N=100,O=new Set,M=[{id:f,currentDepth:0}];O.add(f);while(M.length>0){if(O.size>=100)break;let $=M.shift();if(!$)continue;if($.currentDepth>=E)continue;let _=this.getRelationsFor($.id);for(let S of _){let R=S.sourceEntityId===$.id?S.targetEntityId:S.sourceEntityId;if(!O.has(R))O.add(R),M.push({id:R,currentDepth:$.currentDepth+1})}}return O}getObservationsForEntity(f){return this.db.all("SELECT observation_id FROM entity_observations WHERE entity_id = ?",[f]).map((E)=>E.observation_id)}getById(f){let A=this.db.get("SELECT * FROM entities WHERE id = ?",[f]);return A?this.mapEntityRow(A):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 qN(f){try{let A=JSON.parse(f);return A&&typeof A==="object"?A:{}}catch{return{}}}class g0{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:qN(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 pN}from"crypto";import{embed as hN}from"ai";async function a(f,A){try{let{embedding:E}=await hN({model:f,value:A});return E}catch{return null}}function Of(f,A){if(f.length!==A.length||f.length===0)return 0;let E=0,N=0,O=0;for(let $=0;$<f.length;$++)E+=f[$]*A[$],N+=f[$]*f[$],O+=A[$]*A[$];let M=Math.sqrt(N)*Math.sqrt(O);if(M===0)return 0;return E/M}function k0(f){let A=[f.title,f.narrative];if(f.concepts.length>0)A.push(f.concepts.join(", "));return A.join(`
215
+ `)}function bN(f){return f.replace(/[%_\\]/g,"\\$&")}class T0{db;constructor(f){this.db=f}create(f){let A=pN(),E=new Date().toISOString(),N=f.discoveryTokens??0,O=f.importance??3,M=f.scope??"project";return this.db.run(`INSERT INTO observations
213
216
  (id, session_id, scope, type, title, subtitle, facts, narrative,
214
217
  concepts, files_read, files_modified, raw_tool_output,
215
218
  tool_name, created_at, token_count, discovery_tokens, importance, revision_of, deleted_at)
216
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[n,f.sessionId,O,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,A,f.tokenCount,E,N,null,null]),{...f,id:n,scope:O,createdAt:A,discoveryTokens:E,importance:N,revisionOf:null,deletedAt:null,supersededBy:null,supersededAt:null}}importObservation(f){this.db.run(`INSERT INTO observations
219
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[A,f.sessionId,M,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,E,f.tokenCount,N,O,null,null]),{...f,id:A,scope:M,createdAt:E,discoveryTokens:N,importance:O,revisionOf:null,deletedAt:null,supersededBy:null,supersededAt:null}}importObservation(f){this.db.run(`INSERT INTO observations
217
220
  (id, session_id, scope, type, title, subtitle, facts, narrative,
218
221
  concepts, files_read, files_modified, raw_tool_output,
219
222
  tool_name, created_at, token_count, discovery_tokens, importance, revision_of, deleted_at)
220
- 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
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 A=this.db.get("SELECT * FROM observations WHERE id = ? AND superseded_by IS NULL AND deleted_at IS NULL",[f]);return A?this.mapRow(A):null}getByIdIncludingArchived(f){let A=this.db.get("SELECT * FROM observations WHERE id = ?",[f]);return A?this.mapRow(A):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((A)=>this.mapRow(A))}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,A=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
221
224
  FROM observations o
222
225
  JOIN sessions s ON o.session_id = s.id
223
226
  WHERE s.project_path = ? AND o.superseded_by IS NULL AND o.deleted_at IS NULL
224
227
  ORDER BY o.created_at DESC
225
- LIMIT ?`,[f,n]).map((A)=>({id:A.id,sessionId:A.session_id,type:A.type,title:A.title,tokenCount:A.token_count,discoveryTokens:A.discovery_tokens??0,createdAt:A.created_at,importance:A.importance??3}))}listByProject(f,n={}){let{limit:A=50,offset:E=0,type:N,state:O,sessionId:S}=n,M=`SELECT o.*
228
+ LIMIT ?`,[f,A]).map((E)=>({id:E.id,sessionId:E.session_id,type:E.type,title:E.title,tokenCount:E.token_count,discoveryTokens:E.discovery_tokens??0,createdAt:E.created_at,importance:E.importance??3}))}listByProject(f,A={}){let{limit:E=50,offset:N=0,type:O,state:M,sessionId:$}=A,_=`SELECT o.*
226
229
  FROM observations o
227
230
  JOIN sessions s ON o.session_id = s.id
228
- WHERE s.project_path = ?`,_=[f];if(S)M+=" AND o.session_id = ?",_.push(S);if(N)M+=" AND o.type = ?",_.push(N);if(O==="current")M+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";else if(O==="superseded")M+=" AND o.superseded_by IS NOT NULL AND o.deleted_at IS NULL";else if(O==="tombstoned")M+=" AND o.deleted_at IS NOT NULL";else M+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";return M+=" ORDER BY o.created_at DESC LIMIT ? OFFSET ?",_.push(A,E),this.db.all(M,_).map(($)=>this.mapRow($))}search(f){let n=!!f.projectPath,A=`
231
+ WHERE s.project_path = ?`,S=[f];if($)_+=" AND o.session_id = ?",S.push($);if(O)_+=" AND o.type = ?",S.push(O);if(M==="current")_+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";else if(M==="superseded")_+=" AND o.superseded_by IS NOT NULL AND o.deleted_at IS NULL";else if(M==="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 ?",S.push(E,N),this.db.all(_,S).map((R)=>this.mapRow(R))}search(f){let A=!!f.projectPath,E=`
229
232
  SELECT o.*, rank
230
233
  FROM observations o
231
234
  JOIN observations_fts fts ON o._rowid = fts.rowid
232
- ${n?"JOIN sessions s ON o.session_id = s.id":""}
235
+ ${A?"JOIN sessions s ON o.session_id = s.id":""}
233
236
  WHERE observations_fts MATCH ? AND o.superseded_by IS NULL AND o.deleted_at IS NULL
234
- `,E=[f.query];if(n&&f.projectPath)A+=" AND s.project_path = ?",E.push(f.projectPath);if(f.sessionId)A+=" AND o.session_id = ?",E.push(f.sessionId);if(f.type)A+=" AND o.type = ?",E.push(f.type);if(f.importanceMin!==void 0)A+=" AND o.importance >= ?",E.push(f.importanceMin);if(f.importanceMax!==void 0)A+=" AND o.importance <= ?",E.push(f.importanceMax);if(f.createdAfter)A+=" AND o.created_at >= ?",E.push(f.createdAfter);if(f.createdBefore)A+=" AND o.created_at <= ?",E.push(f.createdBefore);if(f.concepts&&f.concepts.length>0){let N=f.concepts.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE LOWER(value) = LOWER(?))");A+=` AND (${N.join(" OR ")})`;for(let O of f.concepts)E.push(O)}if(f.files&&f.files.length>0){let N=f.files.map(()=>`(EXISTS (SELECT 1 FROM json_each(o.files_read) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\')
235
- OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\'))`);A+=` AND (${N.join(" OR ")})`;for(let O of f.files){let S=`%${pE(O)}%`;E.push(S,S)}}return A+=" ORDER BY rank LIMIT ? OFFSET ?",E.push(f.limit??10),E.push(f.offset??0),this.db.all(A,E).map((N)=>({observation:this.mapRow(N),rank:N.rank,snippet:N.title}))}searchByConcept(f,n=10,A){let E=!!A,N=`SELECT o.*
237
+ `,N=[f.query];if(A&&f.projectPath)E+=" AND s.project_path = ?",N.push(f.projectPath);if(f.sessionId)E+=" AND o.session_id = ?",N.push(f.sessionId);if(f.type)E+=" AND o.type = ?",N.push(f.type);if(f.importanceMin!==void 0)E+=" AND o.importance >= ?",N.push(f.importanceMin);if(f.importanceMax!==void 0)E+=" AND o.importance <= ?",N.push(f.importanceMax);if(f.createdAfter)E+=" AND o.created_at >= ?",N.push(f.createdAfter);if(f.createdBefore)E+=" AND o.created_at <= ?",N.push(f.createdBefore);if(f.concepts&&f.concepts.length>0){let O=f.concepts.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE LOWER(value) = LOWER(?))");E+=` AND (${O.join(" OR ")})`;for(let M of f.concepts)N.push(M)}if(f.files&&f.files.length>0){let O=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 '\\'))`);E+=` AND (${O.join(" OR ")})`;for(let M of f.files){let $=`%${bN(M)}%`;N.push($,$)}}return E+=" ORDER BY rank LIMIT ? OFFSET ?",N.push(f.limit??10),N.push(f.offset??0),this.db.all(E,N).map((O)=>({observation:this.mapRow(O),rank:O.rank,snippet:O.title}))}searchByConcept(f,A=10,E){let N=!!E,O=`SELECT o.*
236
239
  FROM observations o
237
240
  JOIN observations_fts fts ON o._rowid = fts.rowid
238
- ${E?"JOIN sessions s ON o.session_id = s.id":""}
241
+ ${N?"JOIN sessions s ON o.session_id = s.id":""}
239
242
  WHERE observations_fts MATCH ?
240
243
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
241
- ${E?"AND s.project_path = ?":""}
244
+ ${N?"AND s.project_path = ?":""}
242
245
  ORDER BY rank
243
- LIMIT ?`,O=[`concepts:${f}`];if(E&&A)O.push(A);return O.push(n),this.db.all(N,O).map((S)=>this.mapRow(S))}searchByFile(f,n=10,A){let E=!!A,N=`SELECT o.*
246
+ LIMIT ?`,M=[`concepts:${f}`];if(N&&E)M.push(E);return M.push(A),this.db.all(O,M).map(($)=>this.mapRow($))}searchByFile(f,A=10,E){let N=!!E,O=`SELECT o.*
244
247
  FROM observations o
245
248
  JOIN observations_fts fts ON o._rowid = fts.rowid
246
- ${E?"JOIN sessions s ON o.session_id = s.id":""}
249
+ ${N?"JOIN sessions s ON o.session_id = s.id":""}
247
250
  WHERE observations_fts MATCH ?
248
251
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
249
- ${E?"AND s.project_path = ?":""}
252
+ ${N?"AND s.project_path = ?":""}
250
253
  ORDER BY rank
251
- LIMIT ?`,O=[`files_read:"${f.replace(/"/g,'""')}" OR files_modified:"${f.replace(/"/g,'""')}"`];if(E&&A)O.push(A);return O.push(n),this.db.all(N,O).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
254
+ LIMIT ?`,M=[`files_read:"${f.replace(/"/g,'""')}" OR files_modified:"${f.replace(/"/g,'""')}"`];if(N&&E)M.push(E);return M.push(A),this.db.all(O,M).map(($)=>this.mapRow($))}setEmbedding(f,A){this.db.run("UPDATE observations SET embedding = ? WHERE id = ?",[JSON.stringify(A),f])}getWithEmbeddings(f,A){return this.db.all(`SELECT o.id, o.embedding, o.title
252
255
  FROM observations o
253
256
  JOIN sessions s ON o.session_id = s.id
254
257
  WHERE s.project_path = ? AND o.embedding IS NOT NULL AND o.superseded_by IS NULL AND o.deleted_at IS NULL
255
258
  ORDER BY o.created_at DESC
256
- LIMIT ?`,[f,n]).map((A)=>{try{return{id:A.id,embedding:JSON.parse(A.embedding),title:A.title}}catch{return null}}).filter((A)=>A!==null)}findSimilar(f,n,A,E){let N=this.db.all(`SELECT id, embedding FROM observations
259
+ LIMIT ?`,[f,A]).map((E)=>{try{return{id:E.id,embedding:JSON.parse(E.embedding),title:E.title}}catch{return null}}).filter((E)=>E!==null)}findSimilar(f,A,E,N){let O=this.db.all(`SELECT id, embedding FROM observations
257
260
  WHERE embedding IS NOT NULL AND type = ? AND superseded_by IS NULL AND deleted_at IS NULL
258
261
  ORDER BY created_at DESC
259
- LIMIT 200`,[n]),O=[];for(let S of N)try{let M=JSON.parse(S.embedding);if(!Array.isArray(M)||M.length!==f.length)continue;let _=Af(f,M);if(_>=A)O.push({id:S.id,similarity:_})}catch{}return O.sort((S,M)=>M.similarity-S.similarity).slice(0,E)}insertVecEmbedding(f,n){let A=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,A]),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"),A=0,E=0;for(let N of n)try{let O=JSON.parse(N.embedding);if(!Array.isArray(O)||O.length!==f){E++;continue}this.insertVecEmbedding(N.id,O),A++}catch{E++}return{migrated:A,skipped:E}}getVecEmbeddingMatches(f,n){try{let A=new Float32Array(f);return this.db.all(`SELECT observation_id, distance
262
+ LIMIT 200`,[A]),M=[];for(let $ of O)try{let _=JSON.parse($.embedding);if(!Array.isArray(_)||_.length!==f.length)continue;let S=Of(f,_);if(S>=E)M.push({id:$.id,similarity:S})}catch{}return M.sort(($,_)=>_.similarity-$.similarity).slice(0,N)}insertVecEmbedding(f,A){let E=new Float32Array(A);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,E]),this.db.run("COMMIT")}catch(N){throw this.db.run("ROLLBACK"),N}}migrateExistingEmbeddings(f){let A=this.db.all("SELECT id, embedding FROM observations WHERE embedding IS NOT NULL"),E=0,N=0;for(let O of A)try{let M=JSON.parse(O.embedding);if(!Array.isArray(M)||M.length!==f){N++;continue}this.insertVecEmbedding(O.id,M),E++}catch{N++}return{migrated:E,skipped:N}}getVecEmbeddingMatches(f,A){try{let E=new Float32Array(f);return this.db.all(`SELECT observation_id, distance
260
263
  FROM observation_embeddings
261
- WHERE embedding MATCH ? AND k = ?`,[A,n]).map((E)=>({observationId:E.observation_id,distance:E.distance}))}catch{return[]}}searchVecSubset(f,n,A){if(n.length===0)return[];try{let E=new Float32Array(f),N=Math.max(A*5,n.length),O=this.db.all(`SELECT observation_id, distance
264
+ WHERE embedding MATCH ? AND k = ?`,[E,A]).map((N)=>({observationId:N.observation_id,distance:N.distance}))}catch{return[]}}searchVecSubset(f,A,E){if(A.length===0)return[];try{let N=new Float32Array(f),O=Math.max(E*5,A.length),M=this.db.all(`SELECT observation_id, distance
262
265
  FROM observation_embeddings
263
- WHERE embedding MATCH ? AND k = ?`,[E,N]),S=new Set(n);return O.filter((M)=>S.has(M.observation_id)).slice(0,A).map((M)=>({observationId:M.observation_id,distance:M.distance}))}catch{return[]}}update(f,n){let A=this.getById(f);if(!A)return null;if(Object.keys(n).length===0)return A;let E=this.create({sessionId:A.sessionId,scope:A.scope??"project",type:n.type??A.type,title:n.title??A.title,subtitle:n.subtitle??A.subtitle,facts:n.facts??A.facts,narrative:n.narrative??A.narrative,concepts:n.concepts??A.concepts,filesRead:n.filesRead??A.filesRead,filesModified:n.filesModified??A.filesModified,rawToolOutput:A.rawToolOutput,toolName:"memory.revise",tokenCount:A.tokenCount,discoveryTokens:A.discoveryTokens,importance:n.importance??A.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 A=new Date().toISOString();this.db.run("UPDATE observations SET superseded_by = ?, superseded_at = ? WHERE id = ?",[n,A,f])}delete(f){if(this.db.all("SELECT id FROM observations WHERE id = ?",[f]).length===0)return!1;let A=new Date().toISOString();return this.db.run("UPDATE observations SET deleted_at = ? WHERE id = ?",[A,f]),this.deleteEmbeddingsForObservations([f]),!0}getLineage(f){let n=this.getByIdIncludingArchived(f);if(!n)return[];let A=new Set([n.id]),E=[n];while(E[0].revisionOf){let N=this.getByIdIncludingArchived(E[0].revisionOf);if(!N||A.has(N.id))break;E.unshift(N),A.add(N.id)}while(E[E.length-1].supersededBy){let N=E[E.length-1].supersededBy;if(!N)break;let O=this.getByIdIncludingArchived(N);if(!O||A.has(O.id))break;E.push(O),A.add(O.id)}return E}deleteOlderThan(f){return this.db.all(`DELETE FROM observations
266
+ WHERE embedding MATCH ? AND k = ?`,[N,O]),$=new Set(A);return M.filter((_)=>$.has(_.observation_id)).slice(0,E).map((_)=>({observationId:_.observation_id,distance:_.distance}))}catch{return[]}}update(f,A){let E=this.getById(f);if(!E)return null;if(Object.keys(A).length===0)return E;let N=this.create({sessionId:E.sessionId,scope:E.scope??"project",type:A.type??E.type,title:A.title??E.title,subtitle:A.subtitle??E.subtitle,facts:A.facts??E.facts,narrative:A.narrative??E.narrative,concepts:A.concepts??E.concepts,filesRead:A.filesRead??E.filesRead,filesModified:A.filesModified??E.filesModified,rawToolOutput:E.rawToolOutput,toolName:"memory.revise",tokenCount:E.tokenCount,discoveryTokens:E.discoveryTokens,importance:A.importance??E.importance});return this.db.run("UPDATE observations SET revision_of = ? WHERE id = ?",[f,N.id]),this.supersede(f,N.id),this.getById(N.id)}supersede(f,A){let E=new Date().toISOString();this.db.run("UPDATE observations SET superseded_by = ?, superseded_at = ? WHERE id = ?",[A,E,f])}delete(f){if(this.db.all("SELECT id FROM observations WHERE id = ?",[f]).length===0)return!1;let E=new Date().toISOString();return this.db.run("UPDATE observations SET deleted_at = ? WHERE id = ?",[E,f]),this.deleteEmbeddingsForObservations([f]),!0}getLineage(f){let A=this.getByIdIncludingArchived(f);if(!A)return[];let E=new Set([A.id]),N=[A];while(N[0].revisionOf){let O=this.getByIdIncludingArchived(N[0].revisionOf);if(!O||E.has(O.id))break;N.unshift(O),E.add(O.id)}while(N[N.length-1].supersededBy){let O=N[N.length-1].supersededBy;if(!O)break;let M=this.getByIdIncludingArchived(O);if(!M||E.has(M.id))break;N.push(M),E.add(M.id)}return N}deleteOlderThan(f){return this.db.all(`DELETE FROM observations
264
267
  WHERE (created_at < datetime('now', '-' || ? || ' days') OR deleted_at IS NOT NULL)
265
268
  AND session_id NOT IN (SELECT id FROM sessions WHERE status != 'completed')
266
- 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 bE}from"crypto";class T0{db;constructor(f){this.db=f}create(f){let n=bE(),A=new Date().toISOString();return this.db.run(`INSERT INTO pending_messages
269
+ RETURNING id`,[f]).length}deleteEmbeddingsForObservations(f){if(f.length===0)return;let A=f.map(()=>"?").join(",");try{this.db.run(`DELETE FROM observation_embeddings WHERE observation_id IN (${A})`,f)}catch{}this.db.run(`UPDATE observations SET embedding = NULL WHERE id IN (${A})`,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 rN}from"crypto";class c0{db;constructor(f){this.db=f}create(f){let A=rN(),E=new Date().toISOString();return this.db.run(`INSERT INTO pending_messages
267
270
  (id, session_id, tool_name, tool_output, call_id, created_at)
268
- VALUES (?, ?, ?, ?, ?, ?)`,[n,f.sessionId,f.toolName,f.toolOutput,f.callId,A]),{...f,id:n,createdAt:A,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'
271
+ VALUES (?, ?, ?, ?, ?, ?)`,[A,f.sessionId,f.toolName,f.toolOutput,f.callId,E]),{...f,id:A,createdAt:E,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((A)=>this.mapRow(A))}getByStatus(f){return this.db.all("SELECT * FROM pending_messages WHERE status = ? ORDER BY created_at ASC",[f]).map((A)=>this.mapRow(A))}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,A){this.db.run("UPDATE pending_messages SET status = 'failed', error = ?, retry_count = retry_count + 1 WHERE id = ?",[A,f])}resetStale(f=5){return this.db.all(`UPDATE pending_messages SET status = 'pending'
269
272
  WHERE status = 'processing'
270
273
  AND created_at < datetime('now', ? || ' minutes')
271
274
  RETURNING id`,[`-${f}`]).length}deleteCompletedOlderThan(f){return this.db.all(`DELETE FROM pending_messages
272
275
  WHERE status = 'completed'
273
276
  AND created_at < datetime('now', '-' || ? || ' days')
274
- 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 iE=[{version:1,name:"create-schema",up:`
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 iN=[{version:1,name:"create-schema",up:`
275
278
  -- Sessions table
276
279
  CREATE TABLE IF NOT EXISTS sessions (
277
280
  _rowid INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -565,24 +568,24 @@ ${R}`}return $}guide(){return["open-mem workflow:","1) Use memory.find to find c
565
568
  INSERT INTO entities_fts(rowid, name, entity_type)
566
569
  VALUES (new._rowid, new.name, new.entity_type);
567
570
  END;
568
- `}];function $A(f,n){if(f.migrate(iE),n?.hasVectorExtension&&n?.embeddingDimension&&n.embeddingDimension>0)tE(f,n.embeddingDimension)}function tE(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(
571
+ `}];function RA(f,A){if(f.migrate(iN),A?.hasVectorExtension&&A?.embeddingDimension&&A.embeddingDimension>0)tN(f,A.embeddingDimension)}function tN(f,A){if(f.get("SELECT name FROM sqlite_master WHERE type='table' AND name='observation_embeddings'")){let N=f.get("SELECT value FROM _embedding_meta WHERE key = 'dimension'");if(N&&Number(N.value)!==A){console.warn(`[open-mem] vec0 table exists with dimension ${N.value}, but config specifies ${A}. Drop observation_embeddings to re-create with new dimension.`);return}}else f.exec(`CREATE VIRTUAL TABLE observation_embeddings USING vec0(
569
572
  observation_id TEXT PRIMARY KEY,
570
- embedding float[${n}] distance_metric=cosine
571
- )`);f.run("INSERT OR REPLACE INTO _embedding_meta (key, value) VALUES (?, ?)",["dimension",String(n)])}class P0{db;constructor(f){this.db=f}create(f,n){let A=new Date().toISOString();return this.db.run(`INSERT INTO sessions (id, project_path, started_at, status)
572
- VALUES (?, ?, ?, 'active')`,[f,n,A]),this.getById(f)}getOrCreate(f,n){let A=this.getById(f);if(A)return A;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((A)=>this.mapRow(A))}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 aE}from"crypto";class k0{db;constructor(f){this.db=f}create(f){let n=aE(),A=new Date().toISOString();return this.db.run(`INSERT INTO session_summaries
573
+ embedding float[${A}] distance_metric=cosine
574
+ )`);f.run("INSERT OR REPLACE INTO _embedding_meta (key, value) VALUES (?, ?)",["dimension",String(A)])}class I0{db;constructor(f){this.db=f}create(f,A){let E=new Date().toISOString();return this.db.run(`INSERT INTO sessions (id, project_path, started_at, status)
575
+ VALUES (?, ?, ?, 'active')`,[f,A,E]),this.getById(f)}getOrCreate(f,A){let E=this.getById(f);if(E)return E;return this.create(f,A)}getById(f){let A=this.db.get("SELECT * FROM sessions WHERE id = ?",[f]);return A?this.mapRow(A):null}getRecent(f,A=10){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC LIMIT ?",[f,A]).map((E)=>this.mapRow(E))}getAll(f){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC",[f]).map((A)=>this.mapRow(A))}getActive(){return this.db.all("SELECT * FROM sessions WHERE status = 'active' ORDER BY started_at DESC").map((f)=>this.mapRow(f))}updateStatus(f,A){this.db.run("UPDATE sessions SET status = ? WHERE id = ?",[A,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,A){this.db.run("UPDATE sessions SET summary_id = ? WHERE id = ?",[A,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 aN}from"crypto";class w0{db;constructor(f){this.db=f}create(f){let A=aN(),E=new Date().toISOString();return this.db.run(`INSERT INTO session_summaries
573
576
  (id, session_id, summary, key_decisions, files_modified,
574
577
  concepts, created_at, token_count,
575
578
  request, investigated, learned, completed, next_steps)
576
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[n,f.sessionId,f.summary,JSON.stringify(f.keyDecisions),JSON.stringify(f.filesModified),JSON.stringify(f.concepts),A,f.tokenCount,f.request??"",f.investigated??"",f.learned??"",f.completed??"",f.nextSteps??""]),{...f,id:n,createdAt:A}}importSummary(f){this.db.run(`INSERT INTO session_summaries
579
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[A,f.sessionId,f.summary,JSON.stringify(f.keyDecisions),JSON.stringify(f.filesModified),JSON.stringify(f.concepts),E,f.tokenCount,f.request??"",f.investigated??"",f.learned??"",f.completed??"",f.nextSteps??""]),{...f,id:A,createdAt:E}}importSummary(f){this.db.run(`INSERT INTO session_summaries
577
580
  (id, session_id, summary, key_decisions, files_modified,
578
581
  concepts, created_at, token_count,
579
582
  request, investigated, learned, completed, next_steps)
580
- 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.*
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 A=this.db.get("SELECT * FROM session_summaries WHERE session_id = ?",[f]);return A?this.mapRow(A):null}getRecent(f=10){return this.db.all("SELECT * FROM session_summaries ORDER BY created_at DESC LIMIT ?",[f]).map((A)=>this.mapRow(A))}search(f,A=10){return this.db.all(`SELECT ss.*
581
584
  FROM session_summaries ss
582
585
  JOIN summaries_fts fts ON ss._rowid = fts.rowid
583
586
  WHERE summaries_fts MATCH ?
584
587
  ORDER BY rank
585
- LIMIT ?`,[f,n]).map((A)=>this.mapRow(A))}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 sE}from"crypto";var oE=[{version:1,name:"create-user-observations",up:`
588
+ LIMIT ?`,[f,A]).map((E)=>this.mapRow(E))}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 dN}from"crypto";var sN=[{version:1,name:"create-user-observations",up:`
586
589
  CREATE TABLE IF NOT EXISTS user_observations (
587
590
  _rowid INTEGER PRIMARY KEY AUTOINCREMENT,
588
591
  id TEXT UNIQUE NOT NULL,
@@ -653,17 +656,17 @@ ${R}`}return $}guide(){return["open-mem workflow:","1) Use memory.find to find c
653
656
  new.facts, new.concepts, new.files_read, new.files_modified
654
657
  );
655
658
  END;
656
- `}];class I0{db;constructor(f){let n=dE(f);this.db=hf(n),this.initializeUserSchema()}initializeUserSchema(){this.db.migrate(oE)}get database(){return this.db}close(){this.db.close()}}class w0{db;constructor(f){this.db=f}create(f){let n=sE(),A=new Date().toISOString();return this.db.run(`INSERT INTO user_observations
659
+ `}];class v0{db;constructor(f){let A=oN(f);this.db=bf(A),this.initializeUserSchema()}initializeUserSchema(){this.db.migrate(sN)}get database(){return this.db}close(){this.db.close()}}class x0{db;constructor(f){this.db=f}create(f){let A=dN(),E=new Date().toISOString();return this.db.run(`INSERT INTO user_observations
657
660
  (id, type, title, subtitle, facts, narrative,
658
661
  concepts, files_read, files_modified, tool_name,
659
662
  created_at, token_count, importance, source_project)
660
- 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,A,f.tokenCount,f.importance??3,f.sourceProject]),{...f,id:n,createdAt:A,importance:f.importance??3}}search(f){try{let n=`
663
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[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.toolName,E,f.tokenCount,f.importance??3,f.sourceProject]),{...f,id:A,createdAt:E,importance:f.importance??3}}search(f){try{let A=`
661
664
  SELECT o.*, rank
662
665
  FROM user_observations o
663
666
  JOIN user_observations_fts fts ON o._rowid = fts.rowid
664
667
  WHERE user_observations_fts MATCH ?
665
- `,A=[f.query];if(f.sourceProject)n+=" AND o.source_project = ?",A.push(f.sourceProject);return n+=" ORDER BY rank LIMIT ?",A.push(f.limit??10),this.db.all(n,A).map((E)=>({observation:this.mapRow(E),rank:E.rank}))}catch{return[]}}getIndex(f,n){let A=`SELECT id, type, title, token_count, created_at, importance, source_project
666
- FROM user_observations`,E=[];if(n)A+=" WHERE source_project = ?",E.push(n);return A+=" ORDER BY created_at DESC LIMIT ?",E.push(f??20),this.db.all(A,E).map((N)=>({id:N.id,sessionId:"",type:N.type,title:N.title,tokenCount:N.token_count,discoveryTokens:0,createdAt:N.created_at,importance:N.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 dE(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 A=`${n}${f.slice(1)}`,E=A.substring(0,A.lastIndexOf("/"));return v("fs").mkdirSync(E,{recursive:!0}),A}return f}import{EventEmitter as eE}from"events";function RA(){return new eE}function bf(f,n=""){if(!f)return f;return f.replace(/<private>[\s\S]*?<\/private>/gi,n)}var DA=200,fN=/(\([\s\S]*[+*]\)\s*[+*?])|(\(\.\*\)\+)|(\(\.\+\)\+)/;function tf(f,n,A="[REDACTED]"){if(!f||n.length===0)return f;let E=f;for(let N of n){if(N.length>DA){console.warn(`[open-mem] Skipping oversized redaction pattern (${N.length} chars, max ${DA})`);continue}if(fN.test(N)){console.warn("[open-mem] Skipping potentially dangerous redaction pattern (nested quantifiers detected)");continue}try{E=E.replace(new RegExp(N,"g"),A)}catch{}}return E}var nN=20,lA=2000,uA=60;function AN(f){return typeof f==="object"&&f!==null&&"text"in f&&typeof f.text==="string"}function EN(f){let n=[];for(let A of f)if(typeof A==="string")n.push(A);else if(AN(A))n.push(A.text);return n.join(`
667
- `).trim()}function NN(f){let n=f.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter((A)=>A.length>4);return[...new Set(n)].slice(0,5)}function x0(f){let{observations:n,sessions:A,projectPath:E,sessionId:N,text:O,agent:S,sensitivePatterns:M=[]}=f;if(S!==void 0&&S!=="user")return!1;let _=tf(bf(O),M);if(_.length<nN)return!1;A.getOrCreate(N,E);let R=`User request: ${_.length>uA?`${_.slice(0,uA)}...`:_}`,D=_.length>lA?`${_.slice(0,lA)}...`:_;return n.create({sessionId:N,type:"discovery",title:R,subtitle:"",facts:[],narrative:D,concepts:NN(_),filesRead:[],filesModified:[],rawToolOutput:"",toolName:"chat.message",tokenCount:Math.ceil(D.length/4),discoveryTokens:0,importance:3}),!0}function yA(f,n,A,E=[]){return async(N,O)=>{try{let{sessionID:S,agent:M}=N;if(M!==void 0&&M!=="user")return;let _=EN(O.parts);x0({observations:f,sessions:n,projectPath:A,sessionId:S,text:_,agent:M,sensitivePatterns:E})}catch(S){console.error("[open-mem] Chat capture error:",S)}}}function CA(f,n,A,E,N,O){return async(S,M)=>{try{if(!f.contextInjectionEnabled)return;let _=A.getRecent(N,3),$=_.map((u)=>u.summaryId?E.getBySessionId(u.id):null).filter((u)=>u!==null),R=n.getIndex(N,10);if($.length===0&&R.length===0)return;let D=ff(_,$,R,Math.floor(f.maxContextTokens/2)),l=Tf(D);if(f.userMemoryEnabled&&O){let u=O.getIndex(10),Q=kf(u,Math.floor(f.userMemoryMaxContextTokens/2));if(Q)l+=Q}M.context.push(l)}catch(_){console.error("[open-mem] Compaction hook error:",_)}}}function VA(f,n,A,E,N,O){return async(S,M)=>{try{if(!f.contextInjectionEnabled)return;let _=A.getRecent(N,5);if(_.length===0)return;let $=_.map((J)=>J.summaryId?E.getBySessionId(J.id):null).filter((J)=>J!==null),R=n.getIndex(N,f.maxObservations);if($.length===0&&R.length===0)return;let l=R.slice(0,f.contextFullObservationCount).map((J)=>J.id).map((J)=>n.getById(J)).filter((J)=>J!==null),u=ff(_,$,R,f.maxContextTokens,l),Q={showTokenCosts:f.contextShowTokenCosts,observationTypes:f.contextObservationTypes,fullObservationCount:f.contextFullObservationCount,showLastSummary:f.contextShowLastSummary},V=gf(u,Q);if(f.userMemoryEnabled&&O){let J=O.getIndex(f.maxObservations),W=Pf(J,f.userMemoryMaxContextTokens);if(W)V+=`
668
+ `,E=[f.query];if(f.sourceProject)A+=" AND o.source_project = ?",E.push(f.sourceProject);return A+=" ORDER BY rank LIMIT ?",E.push(f.limit??10),this.db.all(A,E).map((N)=>({observation:this.mapRow(N),rank:N.rank}))}catch{return[]}}getIndex(f,A){let E=`SELECT id, type, title, token_count, created_at, importance, source_project
669
+ FROM user_observations`,N=[];if(A)E+=" WHERE source_project = ?",N.push(A);return E+=" ORDER BY created_at DESC LIMIT ?",N.push(f??20),this.db.all(E,N).map((O)=>({id:O.id,sessionId:"",type:O.type,title:O.title,tokenCount:O.token_count,discoveryTokens:0,createdAt:O.created_at,importance:O.importance??3}))}getById(f){let A=this.db.get("SELECT * FROM user_observations WHERE id = ?",[f]);return A?this.mapRow(A):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 oN(f){if(f.startsWith("~/")){let A=process.env.HOME||process.env.USERPROFILE||"";if(!A)throw Error("Cannot resolve user DB path: HOME environment variable is not set");let E=`${A}${f.slice(1)}`,N=E.substring(0,E.lastIndexOf("/"));return x("fs").mkdirSync(N,{recursive:!0}),E}return f}import{EventEmitter as eN}from"events";function DA(){return new eN}function tf(f,A=""){if(!f)return f;return f.replace(/<private>[\s\S]*?<\/private>/gi,A)}var CA=200,fO=/(\([\s\S]*[+*]\)\s*[+*?])|(\(\.\*\)\+)|(\(\.\+\)\+)/;function af(f,A,E="[REDACTED]"){if(!f||A.length===0)return f;let N=f;for(let O of A){if(O.length>CA){console.warn(`[open-mem] Skipping oversized redaction pattern (${O.length} chars, max ${CA})`);continue}if(fO.test(O)){console.warn("[open-mem] Skipping potentially dangerous redaction pattern (nested quantifiers detected)");continue}try{N=N.replace(new RegExp(O,"g"),E)}catch{}}return N}var AO=20,VA=2000,yA=60;function EO(f){return typeof f==="object"&&f!==null&&"text"in f&&typeof f.text==="string"}function NO(f){let A=[];for(let E of f)if(typeof E==="string")A.push(E);else if(EO(E))A.push(E.text);return A.join(`
670
+ `).trim()}function OO(f){let A=f.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter((E)=>E.length>4);return[...new Set(A)].slice(0,5)}function q0(f){let{observations:A,sessions:E,projectPath:N,sessionId:O,text:M,agent:$,sensitivePatterns:_=[]}=f;if($!==void 0&&$!=="user")return!1;let S=af(tf(M),_);if(S.length<AO)return!1;E.getOrCreate(O,N);let D=`User request: ${S.length>yA?`${S.slice(0,yA)}...`:S}`,C=S.length>VA?`${S.slice(0,VA)}...`:S;return A.create({sessionId:O,type:"discovery",title:D,subtitle:"",facts:[],narrative:C,concepts:OO(S),filesRead:[],filesModified:[],rawToolOutput:"",toolName:"chat.message",tokenCount:Math.ceil(C.length/4),discoveryTokens:0,importance:3}),!0}function JA(f,A,E,N=[]){return async(O,M)=>{try{let{sessionID:$,agent:_}=O;if(_!==void 0&&_!=="user")return;let S=NO(M.parts);q0({observations:f,sessions:A,projectPath:E,sessionId:$,text:S,agent:_,sensitivePatterns:N})}catch($){console.error("[open-mem] Chat capture error:",$)}}}function BA(f,A,E,N,O,M){return async($,_)=>{try{if(!f.contextInjectionEnabled)return;let S=E.getRecent(O,3),R=S.map((y)=>y.summaryId?N.getBySessionId(y.id):null).filter((y)=>y!==null),D=A.getIndex(O,10);if(R.length===0&&D.length===0)return;let C=Af(S,R,D,Math.floor(f.maxContextTokens/2)),V=Tf(C);if(f.userMemoryEnabled&&M){let y=M.getIndex(10),W=If(y,Math.floor(f.userMemoryMaxContextTokens/2));if(W)V+=W}_.context.push(V)}catch(S){console.error("[open-mem] Compaction hook error:",S)}}}function QA(f,A,E,N,O,M){return async($,_)=>{try{if(!f.contextInjectionEnabled)return;let S=E.getRecent(O,5);if(S.length===0)return;let R=S.map((z)=>z.summaryId?N.getBySessionId(z.id):null).filter((z)=>z!==null),D=A.getIndex(O,f.maxObservations);if(R.length===0&&D.length===0)return;let V=D.slice(0,f.contextFullObservationCount).map((z)=>z.id).map((z)=>A.getById(z)).filter((z)=>z!==null),y=Af(S,R,D,f.maxContextTokens,V),W={showTokenCosts:f.contextShowTokenCosts,observationTypes:f.contextObservationTypes,fullObservationCount:f.contextFullObservationCount,showLastSummary:f.contextShowLastSummary},Q=kf(y,W);if(f.userMemoryEnabled&&M){let z=M.getIndex(f.maxObservations),Z=cf(z,f.userMemoryMaxContextTokens);if(Z)Q+=`
668
671
 
669
- ${W}`}M.system.push(V)}catch(_){console.error("[open-mem] Context injection error:",_)}}}function BA(f,n,A){if(f.retentionDays===0)return;try{let E=n.deleteOlderThan(f.retentionDays),N=A.deleteCompletedOlderThan(f.retentionDays);if(E>0||N>0)console.log(`[open-mem] Retention: deleted ${E} observations, ${N} pending messages`)}catch(E){console.error("[open-mem] Retention enforcement error:",E)}}async function Cf(f,n,A){let{queue:E,sessions:N,projectPath:O,config:S,observations:M,pendingMessages:_}=f;switch(n){case"session.created":{if(A)N.getOrCreate(A,O);try{BA(S,M,_)}catch($){console.error("[open-mem] Retention enforcement error:",$)}break}case"session.idle":{if(E.processBatch().catch(($)=>{console.error("[open-mem] Background processing error:",$)}),A)N.updateStatus(A,"idle"),JA(A,O,S,M).catch(($)=>{console.error("[open-mem] Folder context error:",$)});break}case"session.completed":case"session.ended":{if(A)await E.processBatch(),await E.summarizeSession(A),N.markCompleted(A),await JA(A,O,S,M);break}}}function QA(f,n,A,E,N,O){return async(S)=>{try{let{event:M}=S,_=M.properties.sessionID,$=typeof _==="string"?_:void 0;if(M.type==="session.created"||M.type==="session.idle"||M.type==="session.completed"||M.type==="session.ended")await Cf({queue:f,sessions:n,projectPath:A,config:E,observations:N,pendingMessages:O},M.type,$)}catch(M){console.error("[open-mem] Event handler error:",M)}}}async function JA(f,n,A,E){if(!A.folderContextEnabled)return;try{let N=E.getBySession(f);if(N.length>0)await vf(n,N,A.folderContextMaxDepth)}catch(N){console.error("[open-mem] Folder context update error:",N)}}function v0(f){let{config:n,queue:A,sessions:E,projectPath:N,tool:O,sessionId:S,callId:M,toolOutput:_}=f;if(n.ignoredTools.includes(O))return!1;if(!_||_.length<n.minOutputLength)return!1;let $=tf(_,n.sensitivePatterns);return $=bf($,"[PRIVATE]"),E.getOrCreate(S,N),A.enqueue(S,O,$,M),!0}function LA(f,n,A,E){return async(N,O)=>{try{let{tool:S,sessionID:M,callID:_}=N,{output:$}=O;v0({config:f,queue:n,sessions:A,projectPath:E,tool:S,sessionId:M,callId:_,toolOutput:$})}catch(S){console.error("[open-mem] Tool capture error:",S)}}}class q0{config;compressor;summarizer;pendingRepo;observationRepo;sessionRepo;summaryRepo;embeddingModel;conflictEvaluator;entityExtractor;entityRepo;observer;processing=!1;timer=null;mode="in-process";onEnqueue=null;constructor(f,n,A,E,N,O,S,M=null,_=null,$=null,R=null,D=null){this.config=f;this.compressor=n;this.summarizer=A;this.pendingRepo=E;this.observationRepo=N;this.sessionRepo=O;this.summaryRepo=S;this.embeddingModel=M;this.conflictEvaluator=_;this.entityExtractor=$;this.entityRepo=R;this.observer=D}setMode(f){if(this.mode=f,f==="enqueue-only")this.stop()}getMode(){return this.mode}setOnEnqueue(f){this.onEnqueue=f}enqueue(f,n,A,E){if(this.pendingRepo.create({sessionId:f,toolName:n,toolOutput:A,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,A=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(A).toISOString()}),E.length===0)return 0;for(let N of E)try{this.pendingRepo.markProcessing(N.id);let S=await this.compressor.compress(N.toolName,N.toolOutput)??this.compressor.createFallbackObservation(N.toolName,N.toolOutput),M=!1,_=null;if(this.embeddingModel)try{let R=H0({title:S.title,narrative:S.narrative,concepts:S.concepts}),D=await t(this.embeddingModel,R);if(D){let l=this.config.conflictResolutionEnabled&&this.conflictEvaluator,u=this.config.conflictSimilarityBandLow??0.7,Q=this.config.conflictSimilarityBandHigh??0.92;if(l){let V=this.observationRepo.findSimilar(D,S.type,u,5),J=V.find((W)=>W.similarity>Q);if(J)console.log(`[open-mem] Dedup: skipping duplicate of ${J.id} (similarity: ${J.similarity.toFixed(3)})`),M=!0;else{let W=V.filter((F)=>F.similarity>=u&&F.similarity<=Q);if(W.length>0)try{let F=W.map((K)=>{let U=this.observationRepo.getById(K.id);return U?{id:U.id,title:U.title,narrative:U.narrative,concepts:U.concepts,type:U.type}:null}).filter((K)=>K!==null);if(F.length>0&&this.conflictEvaluator){let K=await this.conflictEvaluator.evaluate({title:S.title,narrative:S.narrative,concepts:S.concepts,type:S.type},F);if(K&&K.outcome==="duplicate")console.log(`[open-mem] Conflict eval: duplicate (${K.reason})`),M=!0;else if(K&&K.outcome==="update"&&K.supersedesId)console.log(`[open-mem] Conflict eval: update supersedes ${K.supersedesId} (${K.reason})`),_=K.supersedesId}}catch{}}}else{let V=this.observationRepo.findSimilar(D,S.type,0.92,1);if(V.length>0)console.log(`[open-mem] Dedup: skipping duplicate of ${V[0].id} (similarity: ${V[0].similarity.toFixed(3)})`),M=!0}}}catch{}if(M){this.pendingRepo.markCompleted(N.id);continue}let $=this.observationRepo.create({sessionId:N.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:N.toolOutput,toolName:N.toolName,tokenCount:Y(`${S.title} ${S.narrative} ${S.facts.join(" ")}`),discoveryTokens:S.discoveryTokens??Y(N.toolOutput),importance:S.importance??3});if(this.embeddingModel)try{let R=H0({title:$.title,narrative:$.narrative,concepts:$.concepts}),D=await t(this.embeddingModel,R);if(D)this.observationRepo.setEmbedding($.id,D)}catch{}if(_)try{this.observationRepo.supersede(_,$.id),console.log(`[open-mem] Superseded observation ${_} with ${$.id}`)}catch(R){console.error(`[open-mem] Failed to supersede ${_}:`,R)}if(this.config.entityExtractionEnabled&&this.entityExtractor&&this.entityRepo)try{let R=await this.entityExtractor.extract({title:$.title,narrative:$.narrative,concepts:$.concepts,facts:$.facts,filesRead:$.filesRead,filesModified:$.filesModified,type:$.type});if(R){let D=new Map;for(let l of R.entities){let u=this.entityRepo.upsertEntity(l.name,l.entityType);D.set(l.name,u.id),this.entityRepo.linkObservation(u.id,$.id)}for(let l of R.relations){let u=D.get(l.sourceName),Q=D.get(l.targetName);if(u&&Q)this.entityRepo.createRelation(u,Q,l.relationship,$.id)}}}catch{}this.sessionRepo.incrementObservationCount(N.sessionId),this.pendingRepo.markCompleted(N.id),f++}catch(O){this.pendingRepo.markFailed(N.id,String(O)),n++,this.observer?.onItemFailed?.({pendingId:N.id,error:String(O),failedAt:new Date().toISOString()})}return f}finally{this.observer?.onBatchEnd?.({processed:f,failed:n,durationMs:Date.now()-A,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 N=this.summaryRepo.create({sessionId:f,summary:E.summary,keyDecisions:E.keyDecisions,filesModified:E.filesModified,concepts:E.concepts,tokenCount:Y(E.summary)});this.sessionRepo.setSummary(f,N.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 r0{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 zA(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 Ef(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((N)=>N.toLowerCase().includes(E.toLowerCase()))))return!1}if(n.files&&n.files.length>0){let A=[...f.filesRead,...f.filesModified];if(!n.files.some((N)=>A.some((O)=>O.toLowerCase().includes(N.toLowerCase()))))return!1}return!0}async function WA(f,n,A,E,N){if(!f.trim())return n;let O=ON(f),S=new Set;for(let $ of O){let R=A.findByName($);for(let D of R){let l=A.traverseRelations(D.id,1);for(let u of l){let Q=A.getObservationsForEntity(u);for(let V of Q)S.add(V)}}}if(S.size===0)return n;let M=new Set(n.map(($)=>$.observation.id)),_=[];for(let $ of S){if(M.has($))continue;let R=E.getById($);if(!R)continue;if(R.supersededBy)continue;_.push({observation:R,rank:0,snippet:R.title,source:"project",rankingSource:"graph",explain:{strategy:"hybrid",matchedBy:["graph"]}})}return[...n,..._].slice(0,N)}function ON(f){let n=f.split(/\s+/).filter((E)=>E.length>=2),A=[];for(let E of n)A.push(E);for(let E=0;E<n.length-1;E++)A.push(`${n[E]} ${n[E+1]}`);return A}var XA=60;async function KA(f,n,A,E){let N=E.limit??10,O=MN(n,f,E,N);if(!A)return O;let S=await t(A,f);if(!S)return O;let M=O.map(($)=>$.observation.id),_=SN(n,S,E.projectPath,E,N,E.hasVectorExtension??!1,M);if(_.length===0)return O;return RN(O,_,N)}function MN(f,n,A,E){try{return f.search({query:n,type:A.type,limit:E,projectPath:A.projectPath,importanceMin:A.importanceMin,importanceMax:A.importanceMax,createdAfter:A.createdAfter,createdBefore:A.createdBefore,concepts:A.concepts,files:A.files})}catch{return[]}}function SN(f,n,A,E,N,O,S){if(O)return _N(f,n,E,N,S);return $N(f,n,A,E,N)}function _N(f,n,A,E,N){try{let O;if(N.length>0){if(O=f.searchVecSubset(n,N,E*3),O.length===0)O=f.getVecEmbeddingMatches(n,E*3)}else O=f.getVecEmbeddingMatches(n,E*3);if(O.length===0)return[];let S=[];for(let{observationId:M,distance:_}of O){if(S.length>=E)break;let $=f.getById(M);if(!$)continue;if(!Ef($,A))continue;S.push({observation:$,rank:_-1,snippet:$.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:_}})}return S}catch{return[]}}function $N(f,n,A,E,N){let O=f.getWithEmbeddings(A,N*10);if(O.length===0)return[];let S=O.map((_)=>({id:_.id,similarity:Af(n,_.embedding)})).filter(({similarity:_})=>_>=0.3).sort((_,$)=>$.similarity-_.similarity),M=[];for(let{id:_,similarity:$}of S){if(M.length>=N)break;let R=f.getById(_);if(!R)continue;if(!Ef(R,E))continue;M.push({observation:R,rank:-$,snippet:R.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorSimilarity:$}})}return M}function RN(f,n,A){let E=new Map;for(let N=0;N<f.length;N++){let O=f[N],S=1/(XA+N+1);E.set(O.observation.id,{score:S,result:{...O,rankingSource:"fts",explain:{strategy:"hybrid",matchedBy:["fts"],ftsRank:O.rank}}})}for(let N=0;N<n.length;N++){let O=n[N],S=1/(XA+N+1),M=E.get(O.observation.id);if(M)M.score+=S,M.result={...M.result,explain:{strategy:"hybrid",matchedBy:["fts","vector"],ftsRank:M.result.explain?.ftsRank??M.result.rank,vectorDistance:O.explain?.vectorDistance,vectorSimilarity:O.explain?.vectorSimilarity}};else E.set(O.observation.id,{score:S,result:{...O,explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:O.explain?.vectorDistance,vectorSimilarity:O.explain?.vectorSimilarity}}})}return[...E.values()].sort((N,O)=>O.score-N.score).slice(0,A).map(({score:N,result:O})=>({...O,explain:{...O.explain??{strategy:"hybrid",matchedBy:[]},strategy:"hybrid",matchedBy:O.explain?.matchedBy??[],rrfScore:N,ftsRank:O.explain?.ftsRank,vectorDistance:O.explain?.vectorDistance,vectorSimilarity:O.explain?.vectorSimilarity}}))}class h0{observations;embeddingModel;hasVectorExtension;reranker;userObservationRepo;entityRepo;constructor(f,n,A,E=null,N=null,O=null){this.observations=f;this.embeddingModel=n;this.hasVectorExtension=A;this.reranker=E;this.userObservationRepo=N;this.entityRepo=O}async search(f,n){let A=n.strategy??"hybrid",E=n.limit??10,N;switch(A){case"filter-only":N=this.filterOnlySearch(f,n,E);break;case"semantic":N=await this.semanticSearch(f,n,E);break;case"hybrid":N=await this.hybridSearchStrategy(f,n,E);break}for(let O of N)O.source="project";if(this.entityRepo&&f.trim())N=await WA(f,N,this.entityRepo,this.observations,E);if(this.userObservationRepo){let O=this.searchUserMemory(f,n,E);N=this.mergeResults(N,O,E)}if(this.reranker&&N.length>1)return this.reranker.rerank(f,N,E);return N}filterOnlySearch(f,n,A){if(n.concept)return this.observations.searchByConcept(n.concept,A,n.projectPath).map((N)=>({observation:N,rank:0,snippet:N.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["concept-filter"]}}));if(n.file)return this.observations.searchByFile(n.file,A,n.projectPath).map((N)=>({observation:N,rank:0,snippet:N.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["file-filter"]}}));return this.observations.search({query:f,type:n.type,limit:A,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,A){if(!this.embeddingModel)return this.filterOnlySearch(f,n,A);let E=await t(this.embeddingModel,f);if(!E)return this.filterOnlySearch(f,n,A);if(this.hasVectorExtension)return this.nativeVectorSearch(E,n,A);return this.jsFallbackVectorSearch(E,n,A)}async hybridSearchStrategy(f,n,A){return KA(f,this.observations,this.embeddingModel,{type:n.type,limit:A,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,A){try{let E=this.observations.getVecEmbeddingMatches(f,A*3);if(E.length===0)return[];let N=[];for(let{observationId:O,distance:S}of E){if(N.length>=A)break;let M=this.observations.getById(O);if(!M)continue;if(!Ef(M,n))continue;N.push({observation:M,rank:S-1,snippet:M.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorDistance:S}})}return N}catch{return[]}}jsFallbackVectorSearch(f,n,A){let E=this.observations.getWithEmbeddings(n.projectPath,A*10);if(E.length===0)return[];let N=E.map((S)=>({id:S.id,similarity:Af(f,S.embedding)})).filter(({similarity:S})=>S>=0.3).sort((S,M)=>M.similarity-S.similarity),O=[];for(let{id:S,similarity:M}of N){if(O.length>=A)break;let _=this.observations.getById(S);if(!_)continue;if(!Ef(_,n))continue;O.push({observation:_,rank:-M,snippet:_.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorSimilarity:M}})}return O}searchUserMemory(f,n,A){if(!this.userObservationRepo)return[];try{return this.userObservationRepo.search({query:f,limit:A}).map(({observation:N,rank:O})=>({observation:DN(N),rank:O,snippet:N.title,source:"user",rankingSource:"user-memory",explain:{strategy:"filter-only",matchedBy:["user-memory"]}}))}catch{return[]}}mergeResults(f,n,A){let E=new Set(f.map((S)=>S.observation.id)),N=new Set(f.map((S)=>`${S.observation.title}::${S.observation.narrative}`)),O=n.filter((S)=>{if(E.has(S.observation.id))return!1;let M=`${S.observation.title}::${S.observation.narrative}`;if(N.has(M))return!1;return N.add(M),!0});return[...f,...O].slice(0,A)}}function DN(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 lN}from"ai";class ZA{languageModel;maxCandidates;provider;modelName;rateLimitingEnabled;_generate=lN;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,A){if(n.length<=1)return n;let E=n.slice(0,this.maxCandidates),N=n.slice(this.maxCandidates),O=xn(f,E.map((M)=>({title:M.observation.title,narrative:M.observation.narrative}))),S=2;for(let M=0;M<=S;M++)try{if(this.provider==="google")await k(this.modelName,this.rateLimitingEnabled);let{text:_}=await this._generate({model:this.languageModel,maxOutputTokens:512,prompt:O}),$=Hn(_);if(!$)return n.slice(0,A);let R=this.applyReranking(E,$,A);for(let D of N){if(R.length>=A)break;R.push(D)}return R}catch(_){if(uN(_)&&M<S){await yN(2**M*1000);continue}return n.slice(0,A)}return n.slice(0,A)}applyReranking(f,n,A){let E=[],N=new Set;for(let O of n)if(O>=0&&O<f.length&&!N.has(O)){if(N.add(O),E.push(f[O]),E.length>=A)break}if(E.length<A){for(let O=0;O<f.length&&E.length<A;O++)if(!N.has(O))E.push(f[O])}return E}}class UA{async rerank(f,n,A){if(n.length<=1)return n.slice(0,A);let E=p0(f),N=n.map((O)=>({result:O,score:this.scoreCandidate(O,E)}));return N.sort((O,S)=>S.score-O.score),N.slice(0,A).map((O)=>O.result)}scoreCandidate(f,n){let A=f.observation,E=p0(A.title),N=p0(A.narrative),O=new Set(A.concepts.map((W)=>W.toLowerCase())),S=0,M=0,_=0;for(let W of n){if(E.has(W))S++;if(N.has(W))M++;if(O.has(W))_++}let $=n.size||1,R=S/$*0.4,D=M/$*0.3,l=_/$*0.15,Q=(Date.now()-new Date(A.createdAt).getTime())/86400000,V=Q<1?0.1:Q<7?0.05:0,J=A.importance/5*0.05;return R+D+l+V+J}}function mA(f,n){if(!f.rerankingEnabled)return null;if(n)return new ZA(n,f);return new UA}function p0(f){return new Set(f.toLowerCase().split(/[\s\-_./\\,;:!?()[\]{}'"]+/).filter((n)=>n.length>1))}function uN(f){if(typeof f!=="object"||f===null)return!1;let n=f,A=n.status;if(A===429||A===500||A===503)return!0;let E=n.error;if(typeof E==="object"&&E!==null&&E.type==="overloaded_error")return!0;return!1}function yN(f){return new Promise((n)=>setTimeout(n,f))}function YA(f){return f}function FA(f){return f}function cA(f){return f}function GA(f){if(!f)return null;return f}import{spawnSync as jA}from"child_process";import{dirname as CN,resolve as HA}from"path";function VN(f){try{let n=jA("git",["rev-parse","--git-common-dir"],{cwd:f,encoding:"utf-8",timeout:5000});if(n.status!==0||!n.stdout)return null;let A=n.stdout.trim();if(A===".git")return null;let E=jA("git",["rev-parse","--git-dir"],{cwd:f,encoding:"utf-8",timeout:5000});if(E.status!==0||!E.stdout)return null;let N=E.stdout.trim(),O=HA(f,A),S=HA(f,N);if(O===S)return null;let M=CN(O);if(M===O||M==="/")return null;return M}catch{return null}}function gA(f){return VN(f)??f}function BN(f,n){return{id:n,command:"event",payload:f}}function JN(f,n,A){return{id:n,command:f,payload:A}}function TA(f){let n=typeof f==="string"?JSON.parse(f):f;if(!n||typeof n!=="object"||Array.isArray(n))throw Error("Invalid bridge response: expected object");let A=n;if(typeof A.ok!=="boolean")throw Error("Invalid bridge response: missing boolean 'ok'");if(typeof A.code!=="string")throw Error("Invalid bridge response: missing string 'code'");return{id:typeof A.id==="string"||typeof A.id==="number"?A.id:void 0,ok:A.ok,code:A.code,message:typeof A.message==="string"?A.message:void 0,ingested:typeof A.ingested==="boolean"?A.ingested:void 0,processed:typeof A.processed==="number"?A.processed:void 0,status:A.status&&typeof A.status==="object"&&!Array.isArray(A.status)?A.status:void 0}}function QN(f,n=["OK"]){return f.ok&&n.includes(f.code)}async function LN(f,n,A=fetch){let E=`${f.replace(/\/$/,"")}/v1/events`,N=await A(E,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)}),O=await N.text(),S;try{S=TA(O)}catch{throw Error(`Bridge HTTP response was not parseable JSON (status ${N.status})`)}if(!N.ok&&S.ok)return{...S,ok:!1,code:"HTTP_ERROR",message:`HTTP status ${N.status}`};return S}async function zN(f,n=fetch){let A=`${f.replace(/\/$/,"")}/v1/health`,E=await n(A,{method:"GET"}),N=await E.text(),O=TA(N);if(!E.ok&&O.ok)return{...O,ok:!1,code:"HTTP_ERROR",message:`HTTP status ${E.status}`};return O}var PA={name:"opencode",version:"1.0",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!1}},kA={name:"claude-code",version:"0.1",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}},IA={name:"cursor",version:"0.1",capabilities:{nativeSessionLifecycle:!1,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}};function I(){return new Date().toISOString()}function G(f){if(!f||typeof f!=="object"||Array.isArray(f))return null;return f}function m(f){return typeof f==="string"&&f.trim().length>0?f:null}function wA(f){if(f.eventType==="tool.execute.after"){let S=G(f.payload),M=G(f.output);if(!S||!M)return null;let _=m(S.sessionID),$=m(S.callID),R=m(S.tool),D=m(M.output);if(!_||!$||!R||!D)return null;return{kind:"tool.execute",platform:"opencode",sessionId:_,callId:$,toolName:R,output:D,occurredAt:I(),metadata:{title:M.title}}}if(f.eventType==="chat.message"){let S=G(f.payload),M=G(f.output);if(!S||!M)return null;let _=m(S.sessionID),$=G(M.message),R=m($?.role)??"user",D=m($?.content);if(!_||!D)return null;return{kind:"chat.message",platform:"opencode",sessionId:_,role:R==="assistant"||R==="system"?R:"user",text:D,occurredAt:I()}}let n=G(f.payload);if(!n)return null;let A=G(n.event),E=m(A?.type),N=G(A?.properties),O=m(N?.sessionID);if(!E||!O)return null;if(E==="session.idle")return{kind:"idle.flush",platform:"opencode",sessionId:O,occurredAt:I()};if(E==="session.started")return{kind:"session.start",platform:"opencode",sessionId:O,occurredAt:I(),metadata:N??void 0};if(E==="session.created")return{kind:"session.start",platform:"opencode",sessionId:O,occurredAt:I(),metadata:N??void 0};if(E==="session.ended")return{kind:"session.end",platform:"opencode",sessionId:O,occurredAt:I(),metadata:N??void 0};if(E==="session.completed")return{kind:"session.end",platform:"opencode",sessionId:O,occurredAt:I(),metadata:N??void 0};return null}function af(f,n){let A=G(n);if(!A)return null;let E=m(A.kind),N=m(A.sessionId);if(!E||!N)return null;if(E==="session.start"||E==="session.end"||E==="idle.flush")return{kind:E,platform:f,sessionId:N,occurredAt:m(A.occurredAt)??I(),metadata:G(A.metadata)??void 0};if(E==="chat.message"){let O=m(A.text);if(!O)return null;let S=m(A.role);return{kind:E,platform:f,sessionId:N,text:O,role:S==="assistant"||S==="system"?S:"user",occurredAt:m(A.occurredAt)??I(),metadata:G(A.metadata)??void 0}}if(E==="tool.execute"){let O=m(A.toolName),S=m(A.output);if(!O||!S)return null;return{kind:E,platform:f,sessionId:N,callId:m(A.callId)??`${f}-${Date.now()}`,toolName:O,output:S,occurredAt:m(A.occurredAt)??I(),metadata:G(A.metadata)??void 0}}return null}function WN(f){let n=f.type??f.event;if(!n)return null;if(n==="session.start")return"session.start";if(n==="session.end")return"session.end";if(n==="idle.flush")return"idle.flush";if(n==="tool.execute")return"tool.execute";if(n==="chat.message")return"chat.message";return null}class xA{descriptor=kA;normalize(f){if(!f||typeof f!=="object"||Array.isArray(f))return null;let n=f,A=WN(n);if(!A||!n.sessionId)return null;return af("claude-code",{kind:A,sessionId:n.sessionId,callId:n.callId,toolName:n.toolName,output:n.output,role:n.role,text:n.text,occurredAt:n.occurredAt,metadata:n.metadata})}}function XN(){return new xA}function KN(f){let n=f.eventName??f.event;if(!n)return null;if(n==="sessionStart")return"session.start";if(n==="sessionEnd")return"session.end";if(n==="idleFlush")return"idle.flush";if(n==="toolExecute")return"tool.execute";if(n==="chatMessage")return"chat.message";return null}class vA{descriptor=IA;normalize(f){if(!f||typeof f!=="object"||Array.isArray(f))return null;let n=f,A=KN(n),E=n.sessionId??n.session;if(!A||!E)return null;return af("cursor",{kind:A,sessionId:E,callId:n.callId??n.invocationId,toolName:n.toolName??n.tool,output:n.output,role:n.role,text:n.text??n.message,occurredAt:n.occurredAt??n.timestamp,metadata:n.metadata??n.meta})}}function ZN(){return new vA}class qA{descriptor=PA;normalize(f){if(!f||typeof f!=="object"||Array.isArray(f))return null;let n=f;if(!n.eventType)return null;return wA({eventType:n.eventType,payload:n.payload,output:n.output})}}function UN(){return new qA}class rA{adapter;lifecycleDeps;queue;sessions;observations;projectPath;config;constructor(f){this.adapter=f.adapter,this.queue=f.queue,this.sessions=f.sessions,this.observations=f.observations,this.projectPath=f.projectPath,this.config=f.config,this.lifecycleDeps={queue:f.queue,sessions:f.sessions,projectPath:f.projectPath,config:f.config,observations:f.observations,pendingMessages:f.pendingMessages}}platform(){return this.adapter.descriptor.name}normalize(f){return this.adapter.normalize(f)}async ingestRaw(f){let n=this.normalize(f);if(!n)return!1;return await this.ingestNormalized(n),!0}async ingestNormalized(f){switch(f.kind){case"session.start":await Cf(this.lifecycleDeps,"session.created",f.sessionId);return;case"session.end":await Cf(this.lifecycleDeps,"session.ended",f.sessionId);return;case"idle.flush":await Cf(this.lifecycleDeps,"session.idle",f.sessionId);return;case"tool.execute":v0({config:this.config,queue:this.queue,sessions:this.sessions,projectPath:this.projectPath,tool:f.toolName,sessionId:f.sessionId,callId:f.callId,toolOutput:f.output});return;case"chat.message":x0({observations:this.observations,sessions:this.sessions,projectPath:this.projectPath,sessionId:f.sessionId,text:f.text,agent:f.role==="user"?"user":f.role,sensitivePatterns:this.config.sensitivePatterns});return}}}cf();function cN(){try{let n=import.meta.url;if(n&&!n.includes("[eval]")){let A=YN(FN(n));return A.endsWith("dist")||A.endsWith("dist/")||A.endsWith("dist\\")?A:a(A,"..","dist")}}catch{}let f=[a(process.env.HOME||"",".config","opencode","node_modules","open-mem","dist"),a(process.cwd(),"node_modules","open-mem","dist")];for(let n of f)if(mN(a(n,"daemon.js")))return n;return a(process.cwd(),"node_modules","open-mem","dist")}async function GN(f){let n=cN(),A=gA(f.directory),E=d(A),N=Jn(E);for(let x of N)console.warn(`[open-mem] ${x}`);await Qn(E),rf.enableExtensionSupport();let O=hf(E.dbPath);$A(O,{hasVectorExtension:O.hasVectorExtension,embeddingDimension:E.embeddingDimension});let S=new P0(O),M=new g0(O),_=new k0(O),$=new T0(O),R=new c0(O),D=new j0(O),l=null,u=null;if(E.userMemoryEnabled)try{l=new I0(E.userMemoryDbPath),u=new w0(l.database)}catch(x){console.warn(`[open-mem] Failed to initialize user-level memory: ${x}`)}let Q=new Df(E),V=new z0(E),J=E.provider!=="bedrock",W=E.compressionEnabled&&(!J||E.apiKey)?vn({provider:E.provider,model:E.model,apiKey:E.apiKey}):null,F=new r0,K=E.conflictResolutionEnabled&&(!J||E.apiKey)?new Q0({provider:E.provider,apiKey:E.apiKey,model:E.model,rateLimitingEnabled:E.rateLimitingEnabled}):null,U=E.entityExtractionEnabled&&(!J||E.apiKey)?new L0({provider:E.provider,apiKey:E.apiKey,model:E.model,rateLimitingEnabled:E.rateLimitingEnabled}):null,Vf=new G0(O),w=new q0(E,Q,V,$,M,S,_,W,K,U,Vf,F.createQueueObserver()),j=zA(w);j.start();let c=()=>{let x=w.getStats(),g=F.snapshot({mode:w.getMode(),running:w.isRunning,processing:x.processing,pending:x.pending});return{status:g.queue.lastError?"degraded":"ok",timestamp:new Date().toISOString(),uptimeMs:g.uptimeMs,queue:g.queue,batches:g.batches,enqueueCount:g.enqueueCount}},sf=mA(E,E.rerankingEnabled&&(!J||E.apiKey)?P({provider:E.provider,model:E.model,apiKey:E.apiKey}):null),H=new h0(M,W,O.hasVectorExtension,sf,u,Vf),Bf=new Z0({observations:YA(M),sessions:FA(S),summaries:cA(_),searchOrchestrator:H,projectPath:A,config:E,userObservationRepo:GA(u),runtimeSnapshotProvider:c,configAuditStore:R,maintenanceHistoryStore:D}),b0=cn(Bf),q=null,s=null;if(E.daemonEnabled)if(NA(E.dbPath),q=new m0({dbPath:E.dbPath,projectPath:A,daemonScript:a(n,"daemon.js")}),q.start())j.setEnqueueOnly(()=>q?.signal("PROCESS_NOW")),console.log("[open-mem] Background daemon started \u2014 processing delegated"),s=setInterval(()=>{if(q&&!q.isRunning()){if(console.warn("[open-mem] Daemon died, falling back to in-process processing"),j.setInProcess(),s)clearInterval(s),s=null}},30000);else console.warn("[open-mem] Daemon failed to start \u2014 using in-process processing"),q=null;let of=null,df=null,Jf=null;if(E.dashboardEnabled){df=RA(),Jf=new J0(df);let x=mn({config:E,projectPath:A,embeddingModel:W,memoryEngine:Bf,runtimeStatusProvider:c,sseHandler:Fn(Jf),dashboardDir:a(n,"dashboard")}),g=E.dashboardPort,ef=g,i0=!1;for(let Nf=0;Nf<10;Nf++){ef=g+Nf;try{of=Bun.serve({port:ef,hostname:"127.0.0.1",idleTimeout:0,fetch:x.fetch}),i0=!0;break}catch{}}if(i0)console.log(`[open-mem] Dashboard available at http://127.0.0.1:${ef}`);else console.warn(`[open-mem] Could not start dashboard \u2014 ports ${g}-${g+9} all busy`);let pA=df,bA=M.create.bind(M);M.create=(...Nf)=>{let t0=bA(...Nf);return pA.emit("observation:created",t0),t0}}let hA=()=>{if(s)clearInterval(s);if(q)q.stop();if(j.stop(),of)of.stop();if(Jf)Jf.destroy();if(l)l.close();O.close()};return process.on("beforeExit",hA),{"tool.execute.after":LA(E,w,S,A),"chat.message":yA(M,S,A,E.sensitivePatterns),event:QA(w,S,A,E,M,$),"experimental.chat.system.transform":VA(E,M,S,_,A,u),"experimental.session.compacting":CA(E,M,S,_,A,u),tool:{...b0}}}export{LN as sendBridgeHttpEvent,d as resolveConfig,QN as isBridgeSuccess,Ff as getDefaultConfig,zN as getBridgeHealth,GN as default,UN as createOpenCodePlatformAdapter,BN as createEventEnvelope,ZN as createCursorAdapter,JN as createCommandEnvelope,XN as createClaudeCodeAdapter,rA as PlatformIngestionRuntime};
672
+ ${Z}`}_.system.push(Q)}catch(S){console.error("[open-mem] Context injection error:",S)}}}function LA(f,A,E){if(f.retentionDays===0)return;try{let N=A.deleteOlderThan(f.retentionDays),O=E.deleteCompletedOlderThan(f.retentionDays);if(N>0||O>0)console.log(`[open-mem] Retention: deleted ${N} observations, ${O} pending messages`)}catch(N){console.error("[open-mem] Retention enforcement error:",N)}}async function Qf(f,A,E){let{queue:N,sessions:O,projectPath:M,config:$,observations:_,pendingMessages:S}=f;switch(A){case"session.created":{if(E)O.getOrCreate(E,M);try{LA($,_,S)}catch(R){console.error("[open-mem] Retention enforcement error:",R)}break}case"session.idle":{if(N.processBatch().catch((R)=>{console.error("[open-mem] Background processing error:",R)}),E)O.updateStatus(E,"idle"),zA(E,M,$,_).catch((R)=>{console.error("[open-mem] Folder context error:",R)});break}case"session.completed":case"session.ended":{if(E)await N.processBatch(),await N.summarizeSession(E),O.markCompleted(E),await zA(E,M,$,_);break}}}function WA(f,A,E,N,O,M){return async($)=>{try{let{event:_}=$,S=_.properties.sessionID,R=typeof S==="string"?S:void 0;if(_.type==="session.created"||_.type==="session.idle"||_.type==="session.completed"||_.type==="session.ended")await Qf({queue:f,sessions:A,projectPath:E,config:N,observations:O,pendingMessages:M},_.type,R)}catch(_){console.error("[open-mem] Event handler error:",_)}}}async function zA(f,A,E,N){if(!E.folderContextEnabled)return;try{let O=N.getBySession(f);if(O.length>0)await xf(A,O,E.folderContextMaxDepth)}catch(O){console.error("[open-mem] Folder context update error:",O)}}function h0(f){let{config:A,queue:E,sessions:N,projectPath:O,tool:M,sessionId:$,callId:_,toolOutput:S}=f;if(A.ignoredTools.includes(M))return!1;if(!S||S.length<A.minOutputLength)return!1;let R=af(S,A.sensitivePatterns);return R=tf(R,"[PRIVATE]"),N.getOrCreate($,O),E.enqueue($,M,R,_),!0}function XA(f,A,E,N){return async(O,M)=>{try{let{tool:$,sessionID:_,callID:S}=O,{output:R}=M;h0({config:f,queue:A,sessions:E,projectPath:N,tool:$,sessionId:_,callId:S,toolOutput:R})}catch($){console.error("[open-mem] Tool capture error:",$)}}}class p0{config;compressor;summarizer;pendingRepo;observationRepo;sessionRepo;summaryRepo;embeddingModel;conflictEvaluator;entityExtractor;entityRepo;observer;processing=!1;timer=null;mode="in-process";onEnqueue=null;constructor(f,A,E,N,O,M,$,_=null,S=null,R=null,D=null,C=null){this.config=f;this.compressor=A;this.summarizer=E;this.pendingRepo=N;this.observationRepo=O;this.sessionRepo=M;this.summaryRepo=$;this.embeddingModel=_;this.conflictEvaluator=S;this.entityExtractor=R;this.entityRepo=D;this.observer=C}setMode(f){if(this.mode=f,f==="enqueue-only")this.stop()}getMode(){return this.mode}setOnEnqueue(f){this.onEnqueue=f}enqueue(f,A,E,N){if(this.pendingRepo.create({sessionId:f,toolName:A,toolOutput:E,callId:N}),this.observer?.onEnqueue?.({sessionId:f,toolName:A,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,A=0,E=Date.now();try{this.pendingRepo.resetStale(5);let N=this.pendingRepo.getPending(this.config.batchSize);if(this.observer?.onBatchStart?.({pending:N.length,mode:this.mode,startedAt:new Date(E).toISOString()}),N.length===0)return 0;for(let O of N)try{this.pendingRepo.markProcessing(O.id);let $=await this.compressor.compress(O.toolName,O.toolOutput)??this.compressor.createFallbackObservation(O.toolName,O.toolOutput),_=!1,S=null;if(this.embeddingModel)try{let D=k0({title:$.title,narrative:$.narrative,concepts:$.concepts}),C=await a(this.embeddingModel,D);if(C){let V=this.config.conflictResolutionEnabled&&this.conflictEvaluator,y=this.config.conflictSimilarityBandLow??0.7,W=this.config.conflictSimilarityBandHigh??0.92;if(V){let Q=this.observationRepo.findSimilar(C,$.type,y,5),z=Q.find((Z)=>Z.similarity>W);if(z)console.log(`[open-mem] Dedup: skipping duplicate of ${z.id} (similarity: ${z.similarity.toFixed(3)})`),_=!0;else{let Z=Q.filter((H)=>H.similarity>=y&&H.similarity<=W);if(Z.length>0)try{let H=Z.map((u)=>{let n=this.observationRepo.getById(u.id);return n?{id:n.id,title:n.title,narrative:n.narrative,concepts:n.concepts,type:n.type}:null}).filter((u)=>u!==null);if(H.length>0&&this.conflictEvaluator){let u=await this.conflictEvaluator.evaluate({title:$.title,narrative:$.narrative,concepts:$.concepts,type:$.type},H);if(u&&u.outcome==="duplicate")console.log(`[open-mem] Conflict eval: duplicate (${u.reason})`),_=!0;else if(u&&u.outcome==="update"&&u.supersedesId)console.log(`[open-mem] Conflict eval: update supersedes ${u.supersedesId} (${u.reason})`),S=u.supersedesId}}catch{}}}else{let Q=this.observationRepo.findSimilar(C,$.type,0.92,1);if(Q.length>0)console.log(`[open-mem] Dedup: skipping duplicate of ${Q[0].id} (similarity: ${Q[0].similarity.toFixed(3)})`),_=!0}}}catch{}if(_){this.pendingRepo.markCompleted(O.id);continue}let R=this.observationRepo.create({sessionId:O.sessionId,type:$.type,title:$.title,subtitle:$.subtitle,facts:$.facts,narrative:$.narrative,concepts:$.concepts,filesRead:$.filesRead,filesModified:$.filesModified,rawToolOutput:O.toolOutput,toolName:O.toolName,tokenCount:G(`${$.title} ${$.narrative} ${$.facts.join(" ")}`),discoveryTokens:$.discoveryTokens??G(O.toolOutput),importance:$.importance??3});if(this.embeddingModel)try{let D=k0({title:R.title,narrative:R.narrative,concepts:R.concepts}),C=await a(this.embeddingModel,D);if(C)this.observationRepo.setEmbedding(R.id,C)}catch{}if(S)try{this.observationRepo.supersede(S,R.id),console.log(`[open-mem] Superseded observation ${S} with ${R.id}`)}catch(D){console.error(`[open-mem] Failed to supersede ${S}:`,D)}if(this.config.entityExtractionEnabled&&this.entityExtractor&&this.entityRepo)try{let D=await this.entityExtractor.extract({title:R.title,narrative:R.narrative,concepts:R.concepts,facts:R.facts,filesRead:R.filesRead,filesModified:R.filesModified,type:R.type});if(D){let C=new Map;for(let V of D.entities){let y=this.entityRepo.upsertEntity(V.name,V.entityType);C.set(V.name,y.id),this.entityRepo.linkObservation(y.id,R.id)}for(let V of D.relations){let y=C.get(V.sourceName),W=C.get(V.targetName);if(y&&W)this.entityRepo.createRelation(y,W,V.relationship,R.id)}}}catch{}this.sessionRepo.incrementObservationCount(O.sessionId),this.pendingRepo.markCompleted(O.id),f++}catch(M){this.pendingRepo.markFailed(O.id,String(M)),A++,this.observer?.onItemFailed?.({pendingId:O.id,error:String(M),failedAt:new Date().toISOString()})}return f}finally{this.observer?.onBatchEnd?.({processed:f,failed:A,durationMs:Date.now()-E,finishedAt:new Date().toISOString()}),this.processing=!1}}async summarizeSession(f){let A=this.observationRepo.getBySession(f);if(!this.summarizer.shouldSummarize(A.length))return;if(this.summaryRepo.getBySessionId(f))return;let N=await this.summarizer.summarize(f,A);if(!N)return;let O=this.summaryRepo.create({sessionId:f,summary:N.summary,keyDecisions:N.keyDecisions,filesModified:N.filesModified,concepts:N.concepts,tokenCount:G(N.summary)});this.sessionRepo.setSummary(f,O.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 b0{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 KA(f){return{start:()=>f.start(),stop:()=>{f.setOnEnqueue(null),f.stop()},setInProcess:()=>{f.setMode("in-process"),f.start()},setEnqueueOnly:(A)=>{f.setMode("enqueue-only"),f.setOnEnqueue(A)}}}function Mf(f,A){if(A.type&&f.type!==A.type)return!1;if(A.importanceMin!==void 0&&f.importance<A.importanceMin)return!1;if(A.importanceMax!==void 0&&f.importance>A.importanceMax)return!1;if(A.createdAfter&&f.createdAt<A.createdAfter)return!1;if(A.createdBefore&&f.createdAt>A.createdBefore)return!1;if(A.concepts&&A.concepts.length>0){if(!A.concepts.some((N)=>f.concepts.some((O)=>O.toLowerCase().includes(N.toLowerCase()))))return!1}if(A.files&&A.files.length>0){let E=[...f.filesRead,...f.filesModified];if(!A.files.some((O)=>E.some((M)=>M.toLowerCase().includes(O.toLowerCase()))))return!1}return!0}async function ZA(f,A,E,N,O){if(!f.trim())return A;let M=MO(f),$=new Set;for(let R of M){let D=E.findByName(R);for(let C of D){let V=E.traverseRelations(C.id,1);for(let y of V){let W=E.getObservationsForEntity(y);for(let Q of W)$.add(Q)}}}if($.size===0)return A;let _=new Set(A.map((R)=>R.observation.id)),S=[];for(let R of $){if(_.has(R))continue;let D=N.getById(R);if(!D)continue;if(D.supersededBy)continue;S.push({observation:D,rank:0,snippet:D.title,source:"project",rankingSource:"graph",explain:{strategy:"hybrid",matchedBy:["graph"]}})}return[...A,...S].slice(0,O)}function MO(f){let A=f.split(/\s+/).filter((N)=>N.length>=2),E=[];for(let N of A)E.push(N);for(let N=0;N<A.length-1;N++)E.push(`${A[N]} ${A[N+1]}`);return E}var UA=60;async function uA(f,A,E,N){let O=N.limit??10,M=_O(A,f,N,O);if(!E)return M;let $=await a(E,f);if(!$)return M;let _=M.map((R)=>R.observation.id),S=$O(A,$,N.projectPath,N,O,N.hasVectorExtension??!1,_);if(S.length===0)return M;return DO(M,S,O)}function _O(f,A,E,N){try{return f.search({query:A,type:E.type,limit:N,projectPath:E.projectPath,importanceMin:E.importanceMin,importanceMax:E.importanceMax,createdAfter:E.createdAfter,createdBefore:E.createdBefore,concepts:E.concepts,files:E.files})}catch{return[]}}function $O(f,A,E,N,O,M,$){if(M)return SO(f,A,N,O,$);return RO(f,A,E,N,O)}function SO(f,A,E,N,O){try{let M;if(O.length>0){if(M=f.searchVecSubset(A,O,N*3),M.length===0)M=f.getVecEmbeddingMatches(A,N*3)}else M=f.getVecEmbeddingMatches(A,N*3);if(M.length===0)return[];let $=[];for(let{observationId:_,distance:S}of M){if($.length>=N)break;let R=f.getById(_);if(!R)continue;if(!Mf(R,E))continue;$.push({observation:R,rank:S-1,snippet:R.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:S}})}return $}catch{return[]}}function RO(f,A,E,N,O){let M=f.getWithEmbeddings(E,O*10);if(M.length===0)return[];let $=M.map((S)=>({id:S.id,similarity:Of(A,S.embedding)})).filter(({similarity:S})=>S>=0.3).sort((S,R)=>R.similarity-S.similarity),_=[];for(let{id:S,similarity:R}of $){if(_.length>=O)break;let D=f.getById(S);if(!D)continue;if(!Mf(D,N))continue;_.push({observation:D,rank:-R,snippet:D.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorSimilarity:R}})}return _}function DO(f,A,E){let N=new Map;for(let O=0;O<f.length;O++){let M=f[O],$=1/(UA+O+1);N.set(M.observation.id,{score:$,result:{...M,rankingSource:"fts",explain:{strategy:"hybrid",matchedBy:["fts"],ftsRank:M.rank}}})}for(let O=0;O<A.length;O++){let M=A[O],$=1/(UA+O+1),_=N.get(M.observation.id);if(_)_.score+=$,_.result={..._.result,explain:{strategy:"hybrid",matchedBy:["fts","vector"],ftsRank:_.result.explain?.ftsRank??_.result.rank,vectorDistance:M.explain?.vectorDistance,vectorSimilarity:M.explain?.vectorSimilarity}};else N.set(M.observation.id,{score:$,result:{...M,explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:M.explain?.vectorDistance,vectorSimilarity:M.explain?.vectorSimilarity}}})}return[...N.values()].sort((O,M)=>M.score-O.score).slice(0,E).map(({score:O,result:M})=>({...M,explain:{...M.explain??{strategy:"hybrid",matchedBy:[]},strategy:"hybrid",matchedBy:M.explain?.matchedBy??[],rrfScore:O,ftsRank:M.explain?.ftsRank,vectorDistance:M.explain?.vectorDistance,vectorSimilarity:M.explain?.vectorSimilarity}}))}class r0{observations;embeddingModel;hasVectorExtension;reranker;userObservationRepo;entityRepo;constructor(f,A,E,N=null,O=null,M=null){this.observations=f;this.embeddingModel=A;this.hasVectorExtension=E;this.reranker=N;this.userObservationRepo=O;this.entityRepo=M}async search(f,A){let E=A.strategy??"hybrid",N=A.limit??10,O;switch(E){case"filter-only":O=this.filterOnlySearch(f,A,N);break;case"semantic":O=await this.semanticSearch(f,A,N);break;case"hybrid":O=await this.hybridSearchStrategy(f,A,N);break}for(let M of O)M.source="project";if(this.entityRepo&&f.trim())O=await ZA(f,O,this.entityRepo,this.observations,N);if(this.userObservationRepo){let M=this.searchUserMemory(f,A,N);O=this.mergeResults(O,M,N)}if(this.reranker&&O.length>1)return this.reranker.rerank(f,O,N);return O}filterOnlySearch(f,A,E){if(A.concept)return this.observations.searchByConcept(A.concept,E,A.projectPath).map((O)=>({observation:O,rank:0,snippet:O.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["concept-filter"]}}));if(A.file)return this.observations.searchByFile(A.file,E,A.projectPath).map((O)=>({observation:O,rank:0,snippet:O.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["file-filter"]}}));return this.observations.search({query:f,type:A.type,limit:E,projectPath:A.projectPath,importanceMin:A.importanceMin,importanceMax:A.importanceMax,createdAfter:A.createdAfter,createdBefore:A.createdBefore,concepts:A.concepts,files:A.files})}async semanticSearch(f,A,E){if(!this.embeddingModel)return this.filterOnlySearch(f,A,E);let N=await a(this.embeddingModel,f);if(!N)return this.filterOnlySearch(f,A,E);if(this.hasVectorExtension)return this.nativeVectorSearch(N,A,E);return this.jsFallbackVectorSearch(N,A,E)}async hybridSearchStrategy(f,A,E){return uA(f,this.observations,this.embeddingModel,{type:A.type,limit:E,projectPath:A.projectPath,hasVectorExtension:this.hasVectorExtension,importanceMin:A.importanceMin,importanceMax:A.importanceMax,createdAfter:A.createdAfter,createdBefore:A.createdBefore,concepts:A.concepts,files:A.files})}nativeVectorSearch(f,A,E){try{let N=this.observations.getVecEmbeddingMatches(f,E*3);if(N.length===0)return[];let O=[];for(let{observationId:M,distance:$}of N){if(O.length>=E)break;let _=this.observations.getById(M);if(!_)continue;if(!Mf(_,A))continue;O.push({observation:_,rank:$-1,snippet:_.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorDistance:$}})}return O}catch{return[]}}jsFallbackVectorSearch(f,A,E){let N=this.observations.getWithEmbeddings(A.projectPath,E*10);if(N.length===0)return[];let O=N.map(($)=>({id:$.id,similarity:Of(f,$.embedding)})).filter(({similarity:$})=>$>=0.3).sort(($,_)=>_.similarity-$.similarity),M=[];for(let{id:$,similarity:_}of O){if(M.length>=E)break;let S=this.observations.getById($);if(!S)continue;if(!Mf(S,A))continue;M.push({observation:S,rank:-_,snippet:S.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorSimilarity:_}})}return M}searchUserMemory(f,A,E){if(!this.userObservationRepo)return[];try{return this.userObservationRepo.search({query:f,limit:E}).map(({observation:O,rank:M})=>({observation:CO(O),rank:M,snippet:O.title,source:"user",rankingSource:"user-memory",explain:{strategy:"filter-only",matchedBy:["user-memory"]}}))}catch{return[]}}mergeResults(f,A,E){let N=new Set(f.map(($)=>$.observation.id)),O=new Set(f.map(($)=>`${$.observation.title}::${$.observation.narrative}`)),M=A.filter(($)=>{if(N.has($.observation.id))return!1;let _=`${$.observation.title}::${$.observation.narrative}`;if(O.has(_))return!1;return O.add(_),!0});return[...f,...M].slice(0,E)}}function CO(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 VO}from"ai";class YA{languageModel;maxCandidates;provider;modelName;rateLimitingEnabled;_generate=VO;constructor(f,A){this.languageModel=f,this.maxCandidates=A.rerankingMaxCandidates,this.provider=A.provider??"",this.modelName=A.model??"",this.rateLimitingEnabled=A.rateLimitingEnabled??!0}async rerank(f,A,E){if(A.length<=1)return A;let N=A.slice(0,this.maxCandidates),O=A.slice(this.maxCandidates),M=q1(f,N.map((_)=>({title:_.observation.title,narrative:_.observation.narrative}))),$=2;for(let _=0;_<=$;_++)try{if(this.provider==="google")await c(this.modelName,this.rateLimitingEnabled);let{text:S}=await this._generate({model:this.languageModel,maxOutputTokens:512,prompt:M}),R=k1(S);if(!R)return A.slice(0,E);let D=this.applyReranking(N,R,E);for(let C of O){if(D.length>=E)break;D.push(C)}return D}catch(S){if(yO(S)&&_<$){await JO(2**_*1000);continue}return A.slice(0,E)}return A.slice(0,E)}applyReranking(f,A,E){let N=[],O=new Set;for(let M of A)if(M>=0&&M<f.length&&!O.has(M)){if(O.add(M),N.push(f[M]),N.length>=E)break}if(N.length<E){for(let M=0;M<f.length&&N.length<E;M++)if(!O.has(M))N.push(f[M])}return N}}class nA{async rerank(f,A,E){if(A.length<=1)return A.slice(0,E);let N=i0(f),O=A.map((M)=>({result:M,score:this.scoreCandidate(M,N)}));return O.sort((M,$)=>$.score-M.score),O.slice(0,E).map((M)=>M.result)}scoreCandidate(f,A){let E=f.observation,N=i0(E.title),O=i0(E.narrative),M=new Set(E.concepts.map((Z)=>Z.toLowerCase())),$=0,_=0,S=0;for(let Z of A){if(N.has(Z))$++;if(O.has(Z))_++;if(M.has(Z))S++}let R=A.size||1,D=$/R*0.4,C=_/R*0.3,V=S/R*0.15,W=(Date.now()-new Date(E.createdAt).getTime())/86400000,Q=W<1?0.1:W<7?0.05:0,z=E.importance/5*0.05;return D+C+V+Q+z}}function FA(f,A){if(!f.rerankingEnabled)return null;if(A)return new YA(A,f);return new nA}function i0(f){return new Set(f.toLowerCase().split(/[\s\-_./\\,;:!?()[\]{}'"]+/).filter((A)=>A.length>1))}function yO(f){if(typeof f!=="object"||f===null)return!1;let A=f,E=A.status;if(E===429||E===500||E===503)return!0;let N=A.error;if(typeof N==="object"&&N!==null&&N.type==="overloaded_error")return!0;return!1}function JO(f){return new Promise((A)=>setTimeout(A,f))}function GA(f){return f}function HA(f){return f}function lA(f){return f}function mA(f){if(!f)return null;return f}import{spawnSync as jA}from"child_process";import{dirname as BO,resolve as PA}from"path";function QO(f){try{let A=jA("git",["rev-parse","--git-common-dir"],{cwd:f,encoding:"utf-8",timeout:5000});if(A.status!==0||!A.stdout)return null;let E=A.stdout.trim();if(E===".git")return null;let N=jA("git",["rev-parse","--git-dir"],{cwd:f,encoding:"utf-8",timeout:5000});if(N.status!==0||!N.stdout)return null;let O=N.stdout.trim(),M=PA(f,E),$=PA(f,O);if(M===$)return null;let _=BO(M);if(_===M||_==="/")return null;return _}catch{return null}}function gA(f){return QO(f)??f}function LO(f,A){return{id:A,command:"event",payload:f}}function zO(f,A,E){return{id:A,command:f,payload:E}}function kA(f){let A=typeof f==="string"?JSON.parse(f):f;if(!A||typeof A!=="object"||Array.isArray(A))throw Error("Invalid bridge response: expected object");let E=A;if(typeof E.ok!=="boolean")throw Error("Invalid bridge response: missing boolean 'ok'");if(typeof E.code!=="string")throw Error("Invalid bridge response: missing string 'code'");return{id:typeof E.id==="string"||typeof E.id==="number"?E.id:void 0,ok:E.ok,code:E.code,message:typeof E.message==="string"?E.message:void 0,ingested:typeof E.ingested==="boolean"?E.ingested:void 0,processed:typeof E.processed==="number"?E.processed:void 0,status:E.status&&typeof E.status==="object"&&!Array.isArray(E.status)?E.status:void 0}}function WO(f,A=["OK"]){return f.ok&&A.includes(f.code)}async function XO(f,A,E=fetch){let N=`${f.replace(/\/$/,"")}/v1/events`,O=await E(N,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(A)}),M=await O.text(),$;try{$=kA(M)}catch{throw Error(`Bridge HTTP response was not parseable JSON (status ${O.status})`)}if(!O.ok&&$.ok)return{...$,ok:!1,code:"HTTP_ERROR",message:`HTTP status ${O.status}`};return $}async function KO(f,A=fetch){let E=`${f.replace(/\/$/,"")}/v1/health`,N=await A(E,{method:"GET"}),O=await N.text(),M=kA(O);if(!N.ok&&M.ok)return{...M,ok:!1,code:"HTTP_ERROR",message:`HTTP status ${N.status}`};return M}var TA={name:"opencode",version:"1.0",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!1}},cA={name:"claude-code",version:"0.1",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}},IA={name:"cursor",version:"0.1",capabilities:{nativeSessionLifecycle:!1,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}};function I(){return new Date().toISOString()}function m(f){if(!f||typeof f!=="object"||Array.isArray(f))return null;return f}function F(f){return typeof f==="string"&&f.trim().length>0?f:null}function wA(f){if(f.eventType==="tool.execute.after"){let $=m(f.payload),_=m(f.output);if(!$||!_)return null;let S=F($.sessionID),R=F($.callID),D=F($.tool),C=F(_.output);if(!S||!R||!D||!C)return null;return{kind:"tool.execute",platform:"opencode",sessionId:S,callId:R,toolName:D,output:C,occurredAt:I(),metadata:{title:_.title}}}if(f.eventType==="chat.message"){let $=m(f.payload),_=m(f.output);if(!$||!_)return null;let S=F($.sessionID),R=m(_.message),D=F(R?.role)??"user",C=F(R?.content);if(!S||!C)return null;return{kind:"chat.message",platform:"opencode",sessionId:S,role:D==="assistant"||D==="system"?D:"user",text:C,occurredAt:I()}}let A=m(f.payload);if(!A)return null;let E=m(A.event),N=F(E?.type),O=m(E?.properties),M=F(O?.sessionID);if(!N||!M)return null;if(N==="session.idle")return{kind:"idle.flush",platform:"opencode",sessionId:M,occurredAt:I()};if(N==="session.started")return{kind:"session.start",platform:"opencode",sessionId:M,occurredAt:I(),metadata:O??void 0};if(N==="session.created")return{kind:"session.start",platform:"opencode",sessionId:M,occurredAt:I(),metadata:O??void 0};if(N==="session.ended")return{kind:"session.end",platform:"opencode",sessionId:M,occurredAt:I(),metadata:O??void 0};if(N==="session.completed")return{kind:"session.end",platform:"opencode",sessionId:M,occurredAt:I(),metadata:O??void 0};return null}function df(f,A){let E=m(A);if(!E)return null;let N=F(E.kind),O=F(E.sessionId);if(!N||!O)return null;if(N==="session.start"||N==="session.end"||N==="idle.flush")return{kind:N,platform:f,sessionId:O,occurredAt:F(E.occurredAt)??I(),metadata:m(E.metadata)??void 0};if(N==="chat.message"){let M=F(E.text);if(!M)return null;let $=F(E.role);return{kind:N,platform:f,sessionId:O,text:M,role:$==="assistant"||$==="system"?$:"user",occurredAt:F(E.occurredAt)??I(),metadata:m(E.metadata)??void 0}}if(N==="tool.execute"){let M=F(E.toolName),$=F(E.output);if(!M||!$)return null;return{kind:N,platform:f,sessionId:O,callId:F(E.callId)??`${f}-${Date.now()}`,toolName:M,output:$,occurredAt:F(E.occurredAt)??I(),metadata:m(E.metadata)??void 0}}return null}function ZO(f){let A=f.type??f.event;if(!A)return null;if(A==="session.start")return"session.start";if(A==="session.end")return"session.end";if(A==="idle.flush")return"idle.flush";if(A==="tool.execute")return"tool.execute";if(A==="chat.message")return"chat.message";return null}class vA{descriptor=cA;normalize(f){if(!f||typeof f!=="object"||Array.isArray(f))return null;let A=f,E=ZO(A);if(!E||!A.sessionId)return null;return df("claude-code",{kind:E,sessionId:A.sessionId,callId:A.callId,toolName:A.toolName,output:A.output,role:A.role,text:A.text,occurredAt:A.occurredAt,metadata:A.metadata})}}function UO(){return new vA}function uO(f){let A=f.eventName??f.event;if(!A)return null;if(A==="sessionStart")return"session.start";if(A==="sessionEnd")return"session.end";if(A==="idleFlush")return"idle.flush";if(A==="toolExecute")return"tool.execute";if(A==="chatMessage")return"chat.message";return null}class xA{descriptor=IA;normalize(f){if(!f||typeof f!=="object"||Array.isArray(f))return null;let A=f,E=uO(A),N=A.sessionId??A.session;if(!E||!N)return null;return df("cursor",{kind:E,sessionId:N,callId:A.callId??A.invocationId,toolName:A.toolName??A.tool,output:A.output,role:A.role,text:A.text??A.message,occurredAt:A.occurredAt??A.timestamp,metadata:A.metadata??A.meta})}}function YO(){return new xA}class qA{descriptor=TA;normalize(f){if(!f||typeof f!=="object"||Array.isArray(f))return null;let A=f;if(!A.eventType)return null;return wA({eventType:A.eventType,payload:A.payload,output:A.output})}}function nO(){return new qA}class hA{adapter;lifecycleDeps;queue;sessions;observations;projectPath;config;constructor(f){this.adapter=f.adapter,this.queue=f.queue,this.sessions=f.sessions,this.observations=f.observations,this.projectPath=f.projectPath,this.config=f.config,this.lifecycleDeps={queue:f.queue,sessions:f.sessions,projectPath:f.projectPath,config:f.config,observations:f.observations,pendingMessages:f.pendingMessages}}platform(){return this.adapter.descriptor.name}normalize(f){return this.adapter.normalize(f)}async ingestRaw(f){let A=this.normalize(f);if(!A)return!1;return await this.ingestNormalized(A),!0}async ingestNormalized(f){switch(f.kind){case"session.start":await Qf(this.lifecycleDeps,"session.created",f.sessionId);return;case"session.end":await Qf(this.lifecycleDeps,"session.ended",f.sessionId);return;case"idle.flush":await Qf(this.lifecycleDeps,"session.idle",f.sessionId);return;case"tool.execute":h0({config:this.config,queue:this.queue,sessions:this.sessions,projectPath:this.projectPath,tool:f.toolName,sessionId:f.sessionId,callId:f.callId,toolOutput:f.output});return;case"chat.message":q0({observations:this.observations,sessions:this.sessions,projectPath:this.projectPath,sessionId:f.sessionId,text:f.text,agent:f.role==="user"?"user":f.role,sensitivePatterns:this.config.sensitivePatterns});return}}}mf();function lO(){try{let A=import.meta.url;if(A&&!A.includes("[eval]")){let E=GO(HO(A));return E.endsWith("dist")||E.endsWith("dist/")||E.endsWith("dist\\")?E:d(E,"..","dist")}}catch{}let f=[d(process.env.HOME||"",".config","opencode","node_modules","open-mem","dist"),d(process.cwd(),"node_modules","open-mem","dist")];for(let A of f)if(FO(d(A,"daemon.js")))return A;return d(process.cwd(),"node_modules","open-mem","dist")}async function mO(f){let A=lO(),E=gA(f.directory),N=e(E),O=X1(N);for(let v of O)console.warn(`[open-mem] ${v}`);await K1(N),pf.enableExtensionSupport();let M=bf(N.dbPath);RA(M,{hasVectorExtension:M.hasVectorExtension,embeddingDimension:N.embeddingDimension});let $=new I0(M),_=new T0(M),S=new w0(M),R=new c0(M),D=new j0(M),C=new g0(M),V=null,y=null;if(N.userMemoryEnabled)try{V=new v0(N.userMemoryDbPath),y=new x0(V.database)}catch(v){console.warn(`[open-mem] Failed to initialize user-level memory: ${v}`)}let W=new yf(N),Q=new Z0(N),z=N.provider!=="bedrock",Z=N.compressionEnabled&&(!z||N.apiKey)?h1({provider:N.provider,model:N.model,apiKey:N.apiKey}):null,H=new b0,u=N.conflictResolutionEnabled&&(!z||N.apiKey)?new X0({provider:N.provider,apiKey:N.apiKey,model:N.model,rateLimitingEnabled:N.rateLimitingEnabled}):null,n=N.entityExtractionEnabled&&(!z||N.apiKey)?new K0({provider:N.provider,apiKey:N.apiKey,model:N.model,rateLimitingEnabled:N.rateLimitingEnabled}):null,Lf=new P0(M),w=new p0(N,W,Q,R,_,$,S,Z,u,n,Lf,H.createQueueObserver()),j=KA(w);j.start();let l=()=>{let v=w.getStats(),g=H.snapshot({mode:w.getMode(),running:w.isRunning,processing:v.processing,pending:v.pending});return{status:g.queue.lastError?"degraded":"ok",timestamp:new Date().toISOString(),uptimeMs:g.uptimeMs,queue:g.queue,batches:g.batches,enqueueCount:g.enqueueCount}},sf=FA(N,N.rerankingEnabled&&(!z||N.apiKey)?T({provider:N.provider,model:N.model,apiKey:N.apiKey}):null),P=new r0(_,Z,M.hasVectorExtension,sf,y,Lf),zf=new F0({observations:GA(_),sessions:HA($),summaries:lA(S),searchOrchestrator:P,projectPath:E,config:N,userObservationRepo:mA(y),runtimeSnapshotProvider:l,configAuditStore:D,maintenanceHistoryStore:C}),t0=j1(zf),q=null,s=null;if(N.daemonEnabled)if(OA(N.dbPath),q=new H0({dbPath:N.dbPath,projectPath:E,daemonScript:d(A,"daemon.js")}),q.start())j.setEnqueueOnly(()=>q?.signal("PROCESS_NOW")),console.log("[open-mem] Background daemon started \u2014 processing delegated"),s=setInterval(()=>{if(q&&!q.isRunning()){if(console.warn("[open-mem] Daemon died, falling back to in-process processing"),j.setInProcess(),s)clearInterval(s),s=null}},30000);else console.warn("[open-mem] Daemon failed to start \u2014 using in-process processing"),q=null;let of=null,ef=null,Wf=null;if(N.dashboardEnabled){ef=DA(),Wf=new W0(ef);let v=H1({config:N,projectPath:E,embeddingModel:Z,memoryEngine:zf,runtimeStatusProvider:l,sseHandler:m1(Wf),dashboardDir:d(A,"dashboard")}),g=N.dashboardPort,f0=g,a0=!1;for(let _f=0;_f<10;_f++){f0=g+_f;try{of=Bun.serve({port:f0,hostname:"127.0.0.1",idleTimeout:0,fetch:v.fetch}),a0=!0;break}catch{}}if(a0)console.log(`[open-mem] Dashboard available at http://127.0.0.1:${f0}`);else console.warn(`[open-mem] Could not start dashboard \u2014 ports ${g}-${g+9} all busy`);let bA=ef,rA=_.create.bind(_);_.create=(..._f)=>{let d0=rA(..._f);return bA.emit("observation:created",d0),d0}}let pA=()=>{if(s)clearInterval(s);if(q)q.stop();if(j.stop(),of)of.stop();if(Wf)Wf.destroy();if(V)V.close();M.close()};return process.on("beforeExit",pA),{"tool.execute.after":XA(N,w,$,E),"chat.message":JA(_,$,E,N.sensitivePatterns),event:WA(w,$,E,N,_,R),"experimental.chat.system.transform":QA(N,_,$,S,E,y),"experimental.session.compacting":BA(N,_,$,S,E,y),tool:{...t0}}}export{XO as sendBridgeHttpEvent,e as resolveConfig,WO as isBridgeSuccess,lf as getDefaultConfig,KO as getBridgeHealth,mO as default,nO as createOpenCodePlatformAdapter,LO as createEventEnvelope,YO as createCursorAdapter,zO as createCommandEnvelope,UO as createClaudeCodeAdapter,hA as PlatformIngestionRuntime};