open-mem 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,14 +1,15 @@
1
1
  // @bun
2
- var dE=Object.create;var{getPrototypeOf:tE,defineProperty:o0,getOwnPropertyNames:aE}=Object;var sE=Object.prototype.hasOwnProperty;var oE=(N,E,O)=>{O=N!=null?dE(tE(N)):{};let M=E||!N||!N.__esModule?o0(O,"default",{value:N,enumerable:!0}):O;for(let A of aE(N))if(!sE.call(M,A))o0(M,A,{get:()=>N[A],enumerable:!0});return M};var eE=(N,E)=>{for(var O in E)o0(N,O,{get:E[O],enumerable:!0,configurable:!0,set:(M)=>E[O]=()=>M})};var ON=(N,E)=>()=>(N&&(E=N(N=0)),E);var q=import.meta.require;import{existsSync as B2,readFileSync as U2}from"fs";function Z2(){let N={};if(process.env.OPEN_MEM_DB_PATH)N.dbPath=process.env.OPEN_MEM_DB_PATH;if(process.env.OPEN_MEM_PROVIDER)N.provider=process.env.OPEN_MEM_PROVIDER;if(process.env.OPEN_MEM_MODEL)N.model=process.env.OPEN_MEM_MODEL;if(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS)N.maxContextTokens=Number.parseInt(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS,10);if(process.env.OPEN_MEM_COMPRESSION==="false")N.compressionEnabled=!1;if(process.env.OPEN_MEM_CONTEXT_INJECTION==="false")N.contextInjectionEnabled=!1;if(process.env.OPEN_MEM_IGNORED_TOOLS)N.ignoredTools=process.env.OPEN_MEM_IGNORED_TOOLS.split(",").map((E)=>E.trim());if(process.env.OPEN_MEM_BATCH_SIZE)N.batchSize=Number.parseInt(process.env.OPEN_MEM_BATCH_SIZE,10);if(process.env.OPEN_MEM_RETENTION_DAYS)N.retentionDays=Number.parseInt(process.env.OPEN_MEM_RETENTION_DAYS,10);if(process.env.OPEN_MEM_LOG_LEVEL)N.logLevel=process.env.OPEN_MEM_LOG_LEVEL;if(process.env.OPEN_MEM_CONTEXT_SHOW_TOKEN_COSTS==="false")N.contextShowTokenCosts=!1;if(process.env.OPEN_MEM_CONTEXT_TYPES)N.contextObservationTypes=process.env.OPEN_MEM_CONTEXT_TYPES==="all"?"all":process.env.OPEN_MEM_CONTEXT_TYPES.split(",").map((E)=>E.trim());if(process.env.OPEN_MEM_CONTEXT_FULL_COUNT)N.contextFullObservationCount=Number.parseInt(process.env.OPEN_MEM_CONTEXT_FULL_COUNT,10);if(process.env.OPEN_MEM_MAX_OBSERVATIONS)N.maxObservations=Number.parseInt(process.env.OPEN_MEM_MAX_OBSERVATIONS,10);if(process.env.OPEN_MEM_CONTEXT_SHOW_LAST_SUMMARY==="false")N.contextShowLastSummary=!1;if(process.env.OPEN_MEM_RATE_LIMITING==="false")N.rateLimitingEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT==="false")N.folderContextEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH)N.folderContextMaxDepth=Number.parseInt(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH,10);if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="single")N.folderContextMode="single";if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="dispersed")N.folderContextMode="dispersed";if(process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME)N.folderContextFilename=process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME;if(process.env.OPEN_MEM_DAEMON==="true")N.daemonEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD==="true")N.dashboardEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD_PORT)N.dashboardPort=Number.parseInt(process.env.OPEN_MEM_DASHBOARD_PORT,10);if(process.env.OPEN_MEM_PLATFORM_OPENCODE==="false")N.platformOpenCodeEnabled=!1;if(process.env.OPEN_MEM_PLATFORM_CLAUDE_CODE==="true")N.platformClaudeCodeEnabled=!0;if(process.env.OPEN_MEM_PLATFORM_CURSOR==="true")N.platformCursorEnabled=!0;if(process.env.OPEN_MEM_MCP_COMPAT_MODE)N.mcpCompatibilityMode=process.env.OPEN_MEM_MCP_COMPAT_MODE;if(process.env.OPEN_MEM_MCP_PROTOCOL_VERSION)N.mcpProtocolVersion=process.env.OPEN_MEM_MCP_PROTOCOL_VERSION;if(process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS)N.mcpSupportedProtocolVersions=process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS.split(",").map((E)=>E.trim()).filter(Boolean);if(process.env.OPEN_MEM_EMBEDDING_DIMENSION)N.embeddingDimension=Number.parseInt(process.env.OPEN_MEM_EMBEDDING_DIMENSION,10);if(process.env.OPEN_MEM_CONFLICT_RESOLUTION==="true")N.conflictResolutionEnabled=!0;if(process.env.OPEN_MEM_CONFLICT_BAND_LOW){let E=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_LOW);if(!Number.isNaN(E))N.conflictSimilarityBandLow=E}if(process.env.OPEN_MEM_CONFLICT_BAND_HIGH){let E=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_HIGH);if(!Number.isNaN(E))N.conflictSimilarityBandHigh=E}if(process.env.OPEN_MEM_USER_MEMORY==="true")N.userMemoryEnabled=!0;if(process.env.OPEN_MEM_USER_MEMORY_DB_PATH)N.userMemoryDbPath=process.env.OPEN_MEM_USER_MEMORY_DB_PATH;if(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS)N.userMemoryMaxContextTokens=Number.parseInt(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS,10);if(process.env.OPEN_MEM_RERANKING==="true")N.rerankingEnabled=!0;if(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES)N.rerankingMaxCandidates=Number.parseInt(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES,10);if(process.env.OPEN_MEM_ENTITY_EXTRACTION==="true")N.entityExtractionEnabled=!0;if(process.env.OPEN_MEM_FALLBACK_PROVIDERS)N.fallbackProviders=process.env.OPEN_MEM_FALLBACK_PROVIDERS.split(",").map((E)=>E.trim()).filter(Boolean);return N}function K2(N){let E=`${N}/.open-mem/config.json`;if(!B2(E))return{};try{let O=U2(E,"utf-8"),M=JSON.parse(O);if(!M||typeof M!=="object"||Array.isArray(M))return{};return M}catch{return{}}}function R2(N){switch(N){case"google":return 768;case"openai":return 1536;case"bedrock":return 1024;case"anthropic":return 0;case"openrouter":return 0;default:return 768}}function X0(N,E){let O=K2(N),M=Z2(),A={...GN,...O,...M,...E};if(!A.dbPath.startsWith("/"))A.dbPath=`${N}/${A.dbPath}`;if(!process.env.OPEN_MEM_PROVIDER&&!E?.provider){if(process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY)A.provider="google";else if(process.env.ANTHROPIC_API_KEY)A.provider="anthropic";else if(process.env.AWS_BEARER_TOKEN_BEDROCK||process.env.AWS_ACCESS_KEY_ID||process.env.AWS_PROFILE)A.provider="bedrock";else if(process.env.OPENROUTER_API_KEY)A.provider="openrouter"}if(!A.apiKey)switch(A.provider){case"google":A.apiKey=process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;break;case"anthropic":A.apiKey=process.env.ANTHROPIC_API_KEY;break;case"openai":A.apiKey=process.env.OPENAI_API_KEY;break;case"openrouter":A.apiKey=process.env.OPENROUTER_API_KEY;break;case"bedrock":break}if(A.provider==="openrouter"&&A.model==="gemini-2.5-flash-lite")A.model="google/gemini-2.5-flash-lite";if(A.embeddingDimension===void 0)A.embeddingDimension=R2(A.provider);return A}function HN(N){let E=[],O=N.provider!=="bedrock";if(N.compressionEnabled&&O&&!N.apiKey)E.push("AI compression enabled but no API key found. Get a free Gemini API key at https://aistudio.google.com/apikey and set GOOGLE_GENERATIVE_AI_API_KEY, or set OPEN_MEM_PROVIDER and the appropriate API key for your provider.");if(N.maxContextTokens<500)E.push("maxContextTokens must be at least 500");if(N.batchSize<1)E.push("batchSize must be at least 1");if(N.minOutputLength<0)E.push("minOutputLength must be non-negative");return E}function V1(){return{...GN}}async function FN(N){let E=N.dbPath.substring(0,N.dbPath.lastIndexOf("/")),{mkdir:O}=await import("fs/promises");await O(E,{recursive:!0})}var GN;var f1=ON(()=>{GN={dbPath:".open-mem/memory.db",provider:"google",apiKey:void 0,model:"gemini-2.5-flash-lite",maxTokensPerCompression:1024,compressionEnabled:!0,contextInjectionEnabled:!0,maxContextTokens:4000,batchSize:5,batchIntervalMs:30000,ignoredTools:[],minOutputLength:50,maxIndexEntries:20,sensitivePatterns:[],retentionDays:90,maxDatabaseSizeMb:500,logLevel:"warn",contextShowTokenCosts:!0,contextObservationTypes:"all",contextFullObservationCount:3,maxObservations:50,contextShowLastSummary:!0,rateLimitingEnabled:!0,folderContextEnabled:!0,folderContextMaxDepth:5,folderContextMode:"dispersed",folderContextFilename:"AGENTS.md",daemonEnabled:!1,dashboardEnabled:!1,dashboardPort:3737,platformOpenCodeEnabled:!0,platformClaudeCodeEnabled:!1,platformCursorEnabled:!1,mcpCompatibilityMode:"strict",mcpProtocolVersion:"2024-11-05",mcpSupportedProtocolVersions:["2024-11-05"],embeddingDimension:void 0,conflictResolutionEnabled:!1,conflictSimilarityBandLow:0.7,conflictSimilarityBandHigh:0.92,userMemoryEnabled:!1,userMemoryDbPath:"~/.config/open-mem/user-memory.db",userMemoryMaxContextTokens:1000,rerankingEnabled:!1,rerankingMaxCandidates:20,entityExtractionEnabled:!1,fallbackProviders:void 0}});var kN={};eE(kN,{writeProjectConfig:()=>TN,validatePatch:()=>Q1,readProjectConfig:()=>n,previewConfig:()=>W1,patchConfig:()=>k0,getEffectiveConfig:()=>p,getConfigSchema:()=>J1});import{existsSync as Y2}from"fs";import{mkdir as L2,readFile as z2,writeFile as C2}from"fs/promises";import{dirname as G2,join as H2}from"path";function yN(N){return H2(N,".open-mem","config.json")}function IN(N){return jN.find((E)=>E.key===N)}function j2(N,E){let O=IN(N);if(!O)return null;if(O.type==="string"&&typeof E!=="string")return`${String(N)} must be a string`;if(O.type==="number"&&typeof E!=="number")return`${String(N)} must be a number`;if(O.type==="boolean"&&typeof E!=="boolean")return`${String(N)} must be a boolean`;if(O.type==="array"&&!Array.isArray(E))return`${String(N)} must be an array`;if(O.enum&&typeof E==="string"&&!O.enum.includes(E))return`${String(N)} must be one of: ${O.enum.join(", ")}`;if(typeof E==="number"){if(O.min!==void 0&&E<O.min)return`${String(N)} must be >= ${O.min}`;if(O.max!==void 0&&E>O.max)return`${String(N)} must be <= ${O.max}`}return null}function J1(){return jN}async function n(N){let E=yN(N);if(!Y2(E))return{};try{let O=await z2(E,"utf-8"),M=JSON.parse(O);if(!M||typeof M!=="object"||Array.isArray(M))return{};return M}catch{return{}}}async function TN(N,E){let O=yN(N),A={...await n(N),...E};await L2(G2(O),{recursive:!0}),await C2(O,JSON.stringify(A,null,2),"utf-8")}function Q1(N){let E=[];for(let[O,M]of Object.entries(N)){let $=j2(O,M);if($)E.push($)}return E}async function p(N){let E=V1(),O=await n(N),M=X0(N),A=[],$={};for(let[_,S]of Object.entries(E)){let V=_,f=IN(V),Q=(F2[V]??[]).some((Z)=>typeof process.env[Z]==="string"),W=Object.hasOwn(O,V),X="default";if(W)X="file";if(Q)X="env";if($[V]={source:X,locked:Q,restartRequired:f?.restartRequired??!1,liveApply:f?.liveApply??!1},X==="env"&&W)A.push(`${String(V)} is overridden by environment variable.`);if(M[V]===void 0&&S!==void 0)A.push(`${String(V)} resolved to undefined unexpectedly.`)}return{config:M,meta:$,warnings:A}}async function W1(N,E){let O=Q1(E);if(O.length>0)return{...await p(N),warnings:O};let M=V1(),A=await n(N),$={...M,...A,...E},S={...X0(N,E),...$},V=(await p(N)).meta;return{config:S,meta:V,warnings:[]}}async function k0(N,E){let O=Q1(E);if(O.length>0)return{...await p(N),warnings:O};return await TN(N,E),p(N)}var jN,F2;var X1=ON(()=>{f1();jN=[{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}],F2={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 XM}from"fs";import{dirname as DM,join as a}from"path";import{fileURLToPath as BM}from"url";import{randomUUID as D0}from"crypto";import{normalize as y2,resolve as D1,sep as wN}from"path";import{fileURLToPath as I2}from"url";var e0=(N,E,O)=>{return(M,A)=>{let $=-1;return _(0);async function _(S){if(S<=$)throw Error("next() called multiple times");$=S;let V,f=!1,J;if(N[S])J=N[S][0][0],M.req.routeIndex=S;else J=S===N.length&&A||void 0;if(J)try{V=await J(M,()=>_(S+1))}catch(Q){if(Q instanceof Error&&E)M.error=Q,V=await E(Q,M),f=!0;else throw Q}else if(M.finalized===!1&&O)V=await O(M);if(V&&(M.finalized===!1||f))M.res=V;return M}}};var MN=Symbol();var AN=async(N,E=Object.create(null))=>{let{all:O=!1,dot:M=!1}=E,$=(N instanceof L0?N.raw.headers:N.headers).get("Content-Type");if($?.startsWith("multipart/form-data")||$?.startsWith("application/x-www-form-urlencoded"))return N2(N,{all:O,dot:M});return{}};async function N2(N,E){let O=await N.formData();if(O)return E2(O,E);return{}}function E2(N,E){let O=Object.create(null);if(N.forEach((M,A)=>{if(!(E.all||A.endsWith("[]")))O[A]=M;else O2(O,A,M)}),E.dot)Object.entries(O).forEach(([M,A])=>{if(M.includes("."))M2(O,M,A),delete O[M]});return O}var O2=(N,E,O)=>{if(N[E]!==void 0)if(Array.isArray(N[E]))N[E].push(O);else N[E]=[N[E],O];else if(!E.endsWith("[]"))N[E]=O;else N[E]=[O]},M2=(N,E,O)=>{let M=N,A=E.split(".");A.forEach(($,_)=>{if(_===A.length-1)M[$]=O;else{if(!M[$]||typeof M[$]!=="object"||Array.isArray(M[$])||M[$]instanceof File)M[$]=Object.create(null);M=M[$]}})};var E1=(N)=>{let E=N.split("/");if(E[0]==="")E.shift();return E},$N=(N)=>{let{groups:E,path:O}=A2(N),M=E1(O);return $2(M,E)},A2=(N)=>{let E=[];return N=N.replace(/\{[^}]+\}/g,(O,M)=>{let A=`@${M}`;return E.push([A,O]),A}),{groups:E,path:N}},$2=(N,E)=>{for(let O=E.length-1;O>=0;O--){let[M]=E[O];for(let A=N.length-1;A>=0;A--)if(N[A].includes(M)){N[A]=N[A].replace(M,E[O][1]);break}}return N},z0={},SN=(N,E)=>{if(N==="*")return"*";let O=N.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(O){let M=`${N}#${E}`;if(!z0[M])if(O[2])z0[M]=E&&E[0]!==":"&&E[0]!=="*"?[M,O[1],new RegExp(`^${O[2]}(?=/${E})`)]:[N,O[1],new RegExp(`^${O[2]}$`)];else z0[M]=[N,O[1],!0];return z0[M]}return null},C0=(N,E)=>{try{return E(N)}catch{return N.replace(/(?:%[0-9A-Fa-f]{2})+/g,(O)=>{try{return E(O)}catch{return O}})}},S2=(N)=>C0(N,decodeURI),O1=(N)=>{let E=N.url,O=E.indexOf("/",E.indexOf(":")+4),M=O;for(;M<E.length;M++){let A=E.charCodeAt(M);if(A===37){let $=E.indexOf("?",M),_=E.slice(O,$===-1?void 0:$);return S2(_.includes("%25")?_.replace(/%25/g,"%2525"):_)}else if(A===63)break}return E.slice(O,M)};var _N=(N)=>{let E=O1(N);return E.length>1&&E.at(-1)==="/"?E.slice(0,-1):E},l=(N,E,...O)=>{if(O.length)E=l(E,...O);return`${N?.[0]==="/"?"":"/"}${N}${E==="/"?"":`${N?.at(-1)==="/"?"":"/"}${E?.[0]==="/"?E.slice(1):E}`}`},G0=(N)=>{if(N.charCodeAt(N.length-1)!==63||!N.includes(":"))return null;let E=N.split("/"),O=[],M="";return E.forEach((A)=>{if(A!==""&&!/\:/.test(A))M+="/"+A;else if(/\:/.test(A))if(/\?/.test(A)){if(O.length===0&&M==="")O.push("/");else O.push(M);let $=A.replace("?","");M+="/"+$,O.push(M)}else M+="/"+A}),O.filter((A,$,_)=>_.indexOf(A)===$)},N1=(N)=>{if(!/[%+]/.test(N))return N;if(N.indexOf("+")!==-1)N=N.replace(/\+/g," ");return N.indexOf("%")!==-1?C0(N,M1):N},VN=(N,E,O)=>{let M;if(!O&&E&&!/[%+]/.test(E)){let _=N.indexOf("?",8);if(_===-1)return;if(!N.startsWith(E,_+1))_=N.indexOf(`&${E}`,_+1);while(_!==-1){let S=N.charCodeAt(_+E.length+1);if(S===61){let V=_+E.length+2,f=N.indexOf("&",V);return N1(N.slice(V,f===-1?void 0:f))}else if(S==38||isNaN(S))return"";_=N.indexOf(`&${E}`,_+1)}if(M=/[%+]/.test(N),!M)return}let A={};M??=/[%+]/.test(N);let $=N.indexOf("?",8);while($!==-1){let _=N.indexOf("&",$+1),S=N.indexOf("=",$);if(S>_&&_!==-1)S=-1;let V=N.slice($+1,S===-1?_===-1?void 0:_:S);if(M)V=N1(V);if($=_,V==="")continue;let f;if(S===-1)f="";else if(f=N.slice(S+1,_===-1?void 0:_),M)f=N1(f);if(O){if(!(A[V]&&Array.isArray(A[V])))A[V]=[];A[V].push(f)}else A[V]??=f}return E?A[E]:A},fN=VN,JN=(N,E)=>{return VN(N,E,!0)},M1=decodeURIComponent;var QN=(N)=>C0(N,M1),L0=class{raw;#N;#E;routeIndex=0;path;bodyCache={};constructor(N,E="/",O=[[]]){this.raw=N,this.path=E,this.#E=O,this.#N={}}param(N){return N?this.#O(N):this.#$()}#O(N){let E=this.#E[0][this.routeIndex][1][N],O=this.#A(E);return O&&/\%/.test(O)?QN(O):O}#$(){let N={},E=Object.keys(this.#E[0][this.routeIndex][1]);for(let O of E){let M=this.#A(this.#E[0][this.routeIndex][1][O]);if(M!==void 0)N[O]=/\%/.test(M)?QN(M):M}return N}#A(N){return this.#E[1]?this.#E[1][N]:N}query(N){return fN(this.url,N)}queries(N){return JN(this.url,N)}header(N){if(N)return this.raw.headers.get(N)??void 0;let E={};return this.raw.headers.forEach((O,M)=>{E[M]=O}),E}async parseBody(N){return this.bodyCache.parsedBody??=await AN(this,N)}#M=(N)=>{let{bodyCache:E,raw:O}=this,M=E[N];if(M)return M;let A=Object.keys(E)[0];if(A)return E[A].then(($)=>{if(A==="json")$=JSON.stringify($);return new Response($)[N]()});return E[N]=O[N]()};json(){return this.#M("text").then((N)=>JSON.parse(N))}text(){return this.#M("text")}arrayBuffer(){return this.#M("arrayBuffer")}blob(){return this.#M("blob")}formData(){return this.#M("formData")}addValidatedData(N,E){this.#N[N]=E}valid(N){return this.#N[N]}get url(){return this.raw.url}get method(){return this.raw.method}get[MN](){return this.#E}get matchedRoutes(){return this.#E[0].map(([[,N]])=>N)}get routePath(){return this.#E[0].map(([[,N]])=>N)[this.routeIndex].path}};var H0={Stringify:1,BeforeStream:2,Stream:3},_2=(N,E)=>{let O=new String(N);return O.isEscaped=!0,O.callbacks=E,O};var V0=async(N,E,O,M,A)=>{if(typeof N==="object"&&!(N instanceof String)){if(!(N instanceof Promise))N=N.toString();if(N instanceof Promise)N=await N}let $=N.callbacks;if(!$?.length)return Promise.resolve(N);if(A)A[0]+=N;else A=[N];let _=Promise.all($.map((S)=>S({phase:E,buffer:A,context:M}))).then((S)=>Promise.all(S.filter(Boolean).map((V)=>V0(V,E,!1,M,A))).then(()=>A[0]));if(O)return _2(await _,$);else return _};var WN="text/plain; charset=UTF-8",A1=(N,E)=>{return{"Content-Type":N,...E}},XN=class{#N;#E;env={};#O;finalized=!1;error;#$;#A;#M;#J;#V;#f;#_;#Q;#W;constructor(N,E){if(this.#N=N,E)this.#A=E.executionCtx,this.env=E.env,this.#f=E.notFoundHandler,this.#W=E.path,this.#Q=E.matchResult}get req(){return this.#E??=new L0(this.#N,this.#W,this.#Q),this.#E}get event(){if(this.#A&&"respondWith"in this.#A)return this.#A;else throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#A)return this.#A;else throw Error("This context has no ExecutionContext")}get res(){return this.#M||=new Response(null,{headers:this.#_??=new Headers})}set res(N){if(this.#M&&N){N=new Response(N.body,N);for(let[E,O]of this.#M.headers.entries()){if(E==="content-type")continue;if(E==="set-cookie"){let M=this.#M.headers.getSetCookie();N.headers.delete("set-cookie");for(let A of M)N.headers.append("set-cookie",A)}else N.headers.set(E,O)}}this.#M=N,this.finalized=!0}render=(...N)=>{return this.#V??=(E)=>this.html(E),this.#V(...N)};setLayout=(N)=>this.#J=N;getLayout=()=>this.#J;setRenderer=(N)=>{this.#V=N};header=(N,E,O)=>{if(this.finalized)this.#M=new Response(this.#M.body,this.#M);let M=this.#M?this.#M.headers:this.#_??=new Headers;if(E===void 0)M.delete(N);else if(O?.append)M.append(N,E);else M.set(N,E)};status=(N)=>{this.#$=N};set=(N,E)=>{this.#O??=new Map,this.#O.set(N,E)};get=(N)=>{return this.#O?this.#O.get(N):void 0};get var(){if(!this.#O)return{};return Object.fromEntries(this.#O)}#S(N,E,O){let M=this.#M?new Headers(this.#M.headers):this.#_??new Headers;if(typeof E==="object"&&"headers"in E){let $=E.headers instanceof Headers?E.headers:new Headers(E.headers);for(let[_,S]of $)if(_.toLowerCase()==="set-cookie")M.append(_,S);else M.set(_,S)}if(O)for(let[$,_]of Object.entries(O))if(typeof _==="string")M.set($,_);else{M.delete($);for(let S of _)M.append($,S)}let A=typeof E==="number"?E:E?.status??this.#$;return new Response(N,{status:A,headers:M})}newResponse=(...N)=>this.#S(...N);body=(N,E,O)=>this.#S(N,E,O);text=(N,E,O)=>{return!this.#_&&!this.#$&&!E&&!O&&!this.finalized?new Response(N):this.#S(N,E,A1(WN,O))};json=(N,E,O)=>{return this.#S(JSON.stringify(N),E,A1("application/json",O))};html=(N,E,O)=>{let M=(A)=>this.#S(A,E,A1("text/html; charset=UTF-8",O));return typeof N==="object"?V0(N,H0.Stringify,!1,{}).then(M):M(N)};redirect=(N,E)=>{let O=String(N);return this.header("Location",!/[^\x00-\xFF]/.test(O)?O:encodeURI(O)),this.newResponse(null,E??302)};notFound=()=>{return this.#f??=()=>new Response,this.#f(this)}};var C="ALL",DN="all",BN=["get","post","put","delete","options","patch"],F0="Can not add a route since the matcher is already built.",j0=class extends Error{};var UN="__COMPOSED_HANDLER";var V2=(N)=>{return N.text("404 Not Found",404)},ZN=(N,E)=>{if("getResponse"in N){let O=N.getResponse();return E.newResponse(O.body,O)}return console.error(N),E.text("Internal Server Error",500)},KN=class N{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#N="/";routes=[];constructor(E={}){[...BN,DN].forEach(($)=>{this[$]=(_,...S)=>{if(typeof _==="string")this.#N=_;else this.#$($,this.#N,_);return S.forEach((V)=>{this.#$($,this.#N,V)}),this}}),this.on=($,_,...S)=>{for(let V of[_].flat()){this.#N=V;for(let f of[$].flat())S.map((J)=>{this.#$(f.toUpperCase(),this.#N,J)})}return this},this.use=($,..._)=>{if(typeof $==="string")this.#N=$;else this.#N="*",_.unshift($);return _.forEach((S)=>{this.#$(C,this.#N,S)}),this};let{strict:M,...A}=E;Object.assign(this,A),this.getPath=M??!0?E.getPath??O1:_N}#E(){let E=new N({router:this.router,getPath:this.getPath});return E.errorHandler=this.errorHandler,E.#O=this.#O,E.routes=this.routes,E}#O=V2;errorHandler=ZN;route(E,O){let M=this.basePath(E);return O.routes.map((A)=>{let $;if(O.errorHandler===ZN)$=A.handler;else $=async(_,S)=>(await e0([],O.errorHandler)(_,()=>A.handler(_,S))).res,$[UN]=A.handler;M.#$(A.method,A.path,$)}),this}basePath(E){let O=this.#E();return O._basePath=l(this._basePath,E),O}onError=(E)=>{return this.errorHandler=E,this};notFound=(E)=>{return this.#O=E,this};mount(E,O,M){let A,$;if(M)if(typeof M==="function")$=M;else if($=M.optionHandler,M.replaceRequest===!1)A=(V)=>V;else A=M.replaceRequest;let _=$?(V)=>{let f=$(V);return Array.isArray(f)?f:[f]}:(V)=>{let f=void 0;try{f=V.executionCtx}catch{}return[V.env,f]};A||=(()=>{let V=l(this._basePath,E),f=V==="/"?0:V.length;return(J)=>{let Q=new URL(J.url);return Q.pathname=Q.pathname.slice(f)||"/",new Request(Q,J)}})();let S=async(V,f)=>{let J=await O(A(V.req.raw),..._(V));if(J)return J;await f()};return this.#$(C,l(E,"*"),S),this}#$(E,O,M){E=E.toUpperCase(),O=l(this._basePath,O);let A={basePath:this._basePath,path:O,method:E,handler:M};this.router.add(E,O,[M,A]),this.routes.push(A)}#A(E,O){if(E instanceof Error)return this.errorHandler(E,O);throw E}#M(E,O,M,A){if(A==="HEAD")return(async()=>new Response(null,await this.#M(E,O,M,"GET")))();let $=this.getPath(E,{env:M}),_=this.router.match(A,$),S=new XN(E,{path:$,matchResult:_,env:M,executionCtx:O,notFoundHandler:this.#O});if(_[0].length===1){let f;try{f=_[0][0][0][0](S,async()=>{S.res=await this.#O(S)})}catch(J){return this.#A(J,S)}return f instanceof Promise?f.then((J)=>J||(S.finalized?S.res:this.#O(S))).catch((J)=>this.#A(J,S)):f??this.#O(S)}let V=e0(_[0],this.errorHandler,this.#O);return(async()=>{try{let f=await V(S);if(!f.finalized)throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return f.res}catch(f){return this.#A(f,S)}})()}fetch=(E,...O)=>{return this.#M(E,O[1],O[0],E.method)};request=(E,O,M,A)=>{if(E instanceof Request)return this.fetch(O?new Request(E,O):E,M,A);return E=E.toString(),this.fetch(new Request(/^https?:\/\//.test(E)?E:`http://localhost${l("/",E)}`,O),M,A)};fire=()=>{addEventListener("fetch",(E)=>{E.respondWith(this.#M(E.request,E,void 0,E.request.method))})}};var f0=[];function y0(N,E){let O=this.buildAllMatchers(),M=(A,$)=>{let _=O[A]||O[C],S=_[2][$];if(S)return S;let V=$.match(_[0]);if(!V)return[[],f0];let f=V.indexOf("",1);return[_[1][f],V]};return this.match=M,M(N,E)}var I0="[^/]+",J0=".*",Q0="(?:|/.*)",b=Symbol(),f2=new Set(".\\+*[^]$()");function J2(N,E){if(N.length===1)return E.length===1?N<E?-1:1:-1;if(E.length===1)return 1;if(N===J0||N===Q0)return 1;else if(E===J0||E===Q0)return-1;if(N===I0)return 1;else if(E===I0)return-1;return N.length===E.length?N<E?-1:1:E.length-N.length}var RN=class N{#N;#E;#O=Object.create(null);insert(E,O,M,A,$){if(E.length===0){if(this.#N!==void 0)throw b;if($)return;this.#N=O;return}let[_,...S]=E,V=_==="*"?S.length===0?["","",J0]:["","",I0]:_==="/*"?["","",Q0]:_.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),f;if(V){let J=V[1],Q=V[2]||I0;if(J&&V[2]){if(Q===".*")throw b;if(Q=Q.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(Q))throw b}if(f=this.#O[Q],!f){if(Object.keys(this.#O).some((W)=>W!==J0&&W!==Q0))throw b;if($)return;if(f=this.#O[Q]=new N,J!=="")f.#E=A.varIndex++}if(!$&&J!=="")M.push([J,f.#E])}else if(f=this.#O[_],!f){if(Object.keys(this.#O).some((J)=>J.length>1&&J!==J0&&J!==Q0))throw b;if($)return;f=this.#O[_]=new N}f.insert(S,O,M,A,$)}buildRegExpStr(){let O=Object.keys(this.#O).sort(J2).map((M)=>{let A=this.#O[M];return(typeof A.#E==="number"?`(${M})@${A.#E}`:f2.has(M)?`\\${M}`:M)+A.buildRegExpStr()});if(typeof this.#N==="number")O.unshift(`#${this.#N}`);if(O.length===0)return"";if(O.length===1)return O[0];return"(?:"+O.join("|")+")"}};var YN=class{#N={varIndex:0};#E=new RN;insert(N,E,O){let M=[],A=[];for(let _=0;;){let S=!1;if(N=N.replace(/\{[^}]+\}/g,(V)=>{let f=`@\\${_}`;return A[_]=[f,V],_++,S=!0,f}),!S)break}let $=N.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let _=A.length-1;_>=0;_--){let[S]=A[_];for(let V=$.length-1;V>=0;V--)if($[V].indexOf(S)!==-1){$[V]=$[V].replace(S,A[_][1]);break}}return this.#E.insert($,E,M,this.#N,O),M}buildRegExp(){let N=this.#E.buildRegExpStr();if(N==="")return[/^$/,[],[]];let E=0,O=[],M=[];return N=N.replace(/#(\d+)|@(\d+)|\.\*\$/g,(A,$,_)=>{if($!==void 0)return O[++E]=Number($),"$()";if(_!==void 0)return M[Number(_)]=++E,"";return""}),[new RegExp(`^${N}`),O,M]}};var Q2=[/^$/,[],Object.create(null)],LN=Object.create(null);function zN(N){return LN[N]??=new RegExp(N==="*"?"":`^${N.replace(/\/\*$|([.\\+*[^\]$()])/g,(E,O)=>O?`\\${O}`:"(?:|/.*)")}$`)}function W2(){LN=Object.create(null)}function X2(N){let E=new YN,O=[];if(N.length===0)return Q2;let M=N.map((f)=>[!/\*|\/:/.test(f[0]),...f]).sort(([f,J],[Q,W])=>f?1:Q?-1:J.length-W.length),A=Object.create(null);for(let f=0,J=-1,Q=M.length;f<Q;f++){let[W,X,Z]=M[f];if(W)A[X]=[Z.map(([K])=>[K,Object.create(null)]),f0];else J++;let D;try{D=E.insert(X,J,W)}catch(K){throw K===b?new j0(X):K}if(W)continue;O[J]=Z.map(([K,L])=>{let z=Object.create(null);L-=1;for(;L>=0;L--){let[G,F]=D[L];z[G]=F}return[K,z]})}let[$,_,S]=E.buildRegExp();for(let f=0,J=O.length;f<J;f++)for(let Q=0,W=O[f].length;Q<W;Q++){let X=O[f][Q]?.[1];if(!X)continue;let Z=Object.keys(X);for(let D=0,K=Z.length;D<K;D++)X[Z[D]]=S[X[Z[D]]]}let V=[];for(let f in _)V[f]=O[_[f]];return[$,V,A]}function e(N,E){if(!N)return;for(let O of Object.keys(N).sort((M,A)=>A.length-M.length))if(zN(O).test(E))return[...N[O]];return}var T0=class{name="RegExpRouter";#N;#E;constructor(){this.#N={[C]:Object.create(null)},this.#E={[C]:Object.create(null)}}add(N,E,O){let M=this.#N,A=this.#E;if(!M||!A)throw Error(F0);if(!M[N])[M,A].forEach((S)=>{S[N]=Object.create(null),Object.keys(S[C]).forEach((V)=>{S[N][V]=[...S[C][V]]})});if(E==="/*")E="*";let $=(E.match(/\/:/g)||[]).length;if(/\*$/.test(E)){let S=zN(E);if(N===C)Object.keys(M).forEach((V)=>{M[V][E]||=e(M[V],E)||e(M[C],E)||[]});else M[N][E]||=e(M[N],E)||e(M[C],E)||[];Object.keys(M).forEach((V)=>{if(N===C||N===V)Object.keys(M[V]).forEach((f)=>{S.test(f)&&M[V][f].push([O,$])})}),Object.keys(A).forEach((V)=>{if(N===C||N===V)Object.keys(A[V]).forEach((f)=>S.test(f)&&A[V][f].push([O,$]))});return}let _=G0(E)||[E];for(let S=0,V=_.length;S<V;S++){let f=_[S];Object.keys(A).forEach((J)=>{if(N===C||N===J)A[J][f]||=[...e(M[J],f)||e(M[C],f)||[]],A[J][f].push([O,$-V+S+1])})}}match=y0;buildAllMatchers(){let N=Object.create(null);return Object.keys(this.#E).concat(Object.keys(this.#N)).forEach((E)=>{N[E]||=this.#O(E)}),this.#N=this.#E=void 0,W2(),N}#O(N){let E=[],O=N===C;if([this.#N,this.#E].forEach((M)=>{let A=M[N]?Object.keys(M[N]).map(($)=>[$,M[N][$]]):[];if(A.length!==0)O||=!0,E.push(...A);else if(N!==C)E.push(...Object.keys(M[C]).map(($)=>[$,M[C][$]]))}),!O)return null;else return X2(E)}};var D2=class{name="PreparedRegExpRouter";#N;#E;constructor(N,E){this.#N=N,this.#E=E}#O(N,E){let O=this.#N[N];O[1].forEach((M)=>M&&M.push(E)),Object.values(O[2]).forEach((M)=>M[0].push(E))}#$(N,E,O,M,A){let $=this.#N[N];if(!A)$[2][E][0].push([O,{}]);else M.forEach((_)=>{if(typeof _==="number")$[1][_].push([O,A]);else $[2][_||E][0].push([O,A])})}add(N,E,O){if(!this.#N[N]){let A=this.#N[C],$={};for(let _ in A[2])$[_]=[A[2][_][0].slice(),f0];this.#N[N]=[A[0],A[1].map((_)=>Array.isArray(_)?_.slice():0),$]}if(E==="/*"||E==="*"){let A=[O,{}];if(N===C)for(let $ in this.#N)this.#O($,A);else this.#O(N,A);return}let M=this.#E[E];if(!M)throw Error(`Path ${E} is not registered`);for(let[A,$]of M)if(N===C)for(let _ in this.#N)this.#$(_,E,O,A,$);else this.#$(N,E,O,A,$)}buildAllMatchers(){return this.#N}match=y0};var $1=class{name="SmartRouter";#N=[];#E=[];constructor(N){this.#N=N.routers}add(N,E,O){if(!this.#E)throw Error(F0);this.#E.push([N,E,O])}match(N,E){if(!this.#E)throw Error("Fatal error");let O=this.#N,M=this.#E,A=O.length,$=0,_;for(;$<A;$++){let S=O[$];try{for(let V=0,f=M.length;V<f;V++)S.add(...M[V]);_=S.match(N,E)}catch(V){if(V instanceof j0)continue;throw V}this.match=S.match.bind(S),this.#N=[S],this.#E=void 0;break}if($===A)throw Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,_}get activeRouter(){if(this.#E||this.#N.length!==1)throw Error("No active router has been determined yet.");return this.#N[0]}};var W0=Object.create(null),CN=class N{#N;#E;#O;#$=0;#A=W0;constructor(E,O,M){if(this.#E=M||Object.create(null),this.#N=[],E&&O){let A=Object.create(null);A[E]={handler:O,possibleKeys:[],score:0},this.#N=[A]}this.#O=[]}insert(E,O,M){this.#$=++this.#$;let A=this,$=$N(O),_=[];for(let S=0,V=$.length;S<V;S++){let f=$[S],J=$[S+1],Q=SN(f,J),W=Array.isArray(Q)?Q[0]:f;if(W in A.#E){if(A=A.#E[W],Q)_.push(Q[1]);continue}if(A.#E[W]=new N,Q)A.#O.push(Q),_.push(Q[1]);A=A.#E[W]}return A.#N.push({[E]:{handler:M,possibleKeys:_.filter((S,V,f)=>f.indexOf(S)===V),score:this.#$}}),A}#M(E,O,M,A){let $=[];for(let _=0,S=E.#N.length;_<S;_++){let V=E.#N[_],f=V[O]||V[C],J={};if(f!==void 0){if(f.params=Object.create(null),$.push(f),M!==W0||A&&A!==W0)for(let Q=0,W=f.possibleKeys.length;Q<W;Q++){let X=f.possibleKeys[Q],Z=J[f.score];f.params[X]=A?.[X]&&!Z?A[X]:M[X]??A?.[X],J[f.score]=!0}}}return $}search(E,O){let M=[];this.#A=W0;let $=[this],_=E1(O),S=[];for(let V=0,f=_.length;V<f;V++){let J=_[V],Q=V===f-1,W=[];for(let X=0,Z=$.length;X<Z;X++){let D=$[X],K=D.#E[J];if(K)if(K.#A=D.#A,Q){if(K.#E["*"])M.push(...this.#M(K.#E["*"],E,D.#A));M.push(...this.#M(K,E,D.#A))}else W.push(K);for(let L=0,z=D.#O.length;L<z;L++){let G=D.#O[L],F=D.#A===W0?{}:{...D.#A};if(G==="*"){let k=D.#E["*"];if(k)M.push(...this.#M(k,E,D.#A)),k.#A=F,W.push(k);continue}let[s,m,T]=G;if(!J&&!(T instanceof RegExp))continue;let I=D.#E[s],d0=_.slice(V).join("/");if(T instanceof RegExp){let k=T.exec(d0);if(k){if(F[m]=k[0],M.push(...this.#M(I,E,D.#A,F)),Object.keys(I.#E).length){I.#A=F;let R0=k[0].match(/\//)?.length??0;(S[R0]||=[]).push(I)}continue}}if(T===!0||T.test(J))if(F[m]=J,Q){if(M.push(...this.#M(I,E,F,D.#A)),I.#E["*"])M.push(...this.#M(I.#E["*"],E,F,D.#A))}else I.#A=F,W.push(I)}}$=W.concat(S.shift()??[])}if(M.length>1)M.sort((V,f)=>{return V.score-f.score});return[M.map(({handler:V,params:f})=>[V,f])]}};var S1=class{name="TrieRouter";#N;constructor(){this.#N=new CN}add(N,E,O){let M=G0(E);if(M){for(let A=0,$=M.length;A<$;A++)this.#N.insert(N,M[A],O);return}this.#N.insert(N,E,O)}match(N,E){return this.#N.search(N,E)}};var _1=class extends KN{constructor(N={}){super(N);this.router=N.router??new $1({routers:[new T0,new S1]})}};X1();import{z as B}from"zod";var N0=B.enum(["decision","bugfix","feature","refactor","discovery","change"]);function U(N,E={}){return{data:N,error:null,meta:E}}function R(N,E,O){return{data:null,error:{code:N,message:E,details:O},meta:{}}}var j={find:B.object({query:B.string().min(1),scope:B.enum(["project","user","all"]).optional().default("project"),types:B.array(N0).optional(),limit:B.number().int().min(1).max(50).optional().default(10),cursor:B.string().optional(),include:B.object({snippets:B.boolean().optional(),scores:B.boolean().optional(),relations:B.boolean().optional()}).optional()}),history:B.object({limit:B.number().int().min(1).max(20).optional().default(5),cursor:B.string().optional(),sessionId:B.string().optional(),anchor:B.string().optional().describe("Observation ID to center the timeline around"),depthBefore:B.number().int().min(0).max(20).optional().default(5).describe("Number of observations to show before the anchor"),depthAfter:B.number().int().min(0).max(20).optional().default(5).describe("Number of observations to show after the anchor")}),get:B.object({ids:B.array(B.string()).min(1),includeHistory:B.boolean().optional().default(!1),limit:B.number().int().min(1).max(50).optional().default(10)}),create:B.object({title:B.string(),type:N0,narrative:B.string(),concepts:B.array(B.string()).optional(),files:B.array(B.string()).optional(),importance:B.number().int().min(1).max(5).optional(),scope:B.enum(["project","user"]).optional().default("project")}),revise:B.object({id:B.string(),title:B.string().optional(),narrative:B.string().optional(),type:N0.optional(),concepts:B.array(B.string()).optional(),importance:B.number().int().min(1).max(5).optional(),reason:B.string().optional()}),remove:B.object({id:B.string(),reason:B.string().optional()}),transferExport:B.object({scope:B.enum(["project"]).optional().default("project"),type:N0.optional(),limit:B.number().int().min(1).optional(),format:B.enum(["json"]).optional().default("json")}),transferImport:B.object({payload:B.string(),mode:B.enum(["skip","merge","replace"]).optional().default("skip")}),maintenance:B.object({action:B.enum(["folderContextDryRun","folderContextClean","folderContextRebuild","folderContextPurge"])}),help:B.object({})};var T2=new Set(N0.options);function B1(N,E,O=100){if(!N)return E;let M=Number.parseInt(N,10);if(Number.isNaN(M))return E;return Math.max(1,Math.min(M,O))}function k2(N){if(!N)return 0;let E=Number.parseInt(N,10);if(Number.isNaN(E))return 0;return Math.max(0,E)}function qN(N){if(!N)return;if(T2.has(N))return N;return}function w0(N){let E={};for(let[O,M]of Object.entries(N)){let A=O.toLowerCase();E[O]=typeof M==="string"&&(A.includes("key")||A.includes("api"))?"***REDACTED***":M}return E}function PN(N){let{projectPath:E,memoryEngine:O,runtimeStatusProvider:M,dashboardDir:A}=N,$=new _1;$.get("/v1/memory/observations",(S)=>{let V=B1(S.req.query("limit"),50),f=k2(S.req.query("offset")),J=qN(S.req.query("type")),Q=S.req.query("sessionId"),W=S.req.query("state"),X=W==="current"||W==="superseded"||W==="tombstoned"?W:void 0,Z=O.listObservations({limit:V,offset:f,type:J,sessionId:Q,state:X});return S.json(U(Z,{limit:V,offset:f}))}),$.post("/v1/memory/observations",async(S)=>{try{let V=await S.req.json(),f=await O.save({...V,sessionId:V.sessionId??`http-${Date.now()}`});if(!f)return S.json(R("CONFLICT","Unable to create observation"),409);return S.json(U(f),201)}catch{return S.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),$.get("/v1/memory/observations/:id",(S)=>{let V=S.req.param("id"),f=O.getObservation(V);if(!f)return S.json(R("NOT_FOUND","Observation not found"),404);return S.json(U(f))}),$.get("/v1/memory/observations/:id/lineage",(S)=>{let V=S.req.param("id"),f=O.getLineage(V);if(!f)return S.json(R("NOT_FOUND","Observation not found"),404);return S.json(U({observationId:V,lineage:f}))}),$.get("/v1/memory/observations/:id/revision-diff",(S)=>{let V=S.req.param("id"),f=S.req.query("against");if(!f)return S.json(R("VALIDATION_ERROR","Query parameter 'against' is required"),400);let J=O.getRevisionDiff(V,f);if(!J)return S.json(R("NOT_FOUND","One or both observations not found"),404);if(S.req.query("version")==="1")return S.json(U({baseId:J.toId,againstId:J.fromId,changes:J.changedFields}));return S.json(U(J))}),$.post("/v1/memory/observations/:id/revisions",async(S)=>{let V=S.req.param("id");try{let f=await S.req.json(),J=await O.update({id:V,...f});if(!J)return S.json(R("NOT_FOUND","Observation not found"),404);return S.json(U({previousId:V,newId:J.id,observation:J}))}catch{return S.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),$.post("/v1/memory/observations/:id/tombstone",async(S)=>{let V=S.req.param("id");if(await O.delete([V])===0)return S.json(R("NOT_FOUND","Observation not found"),404);return S.json(U({id:V,tombstoned:!0}))}),$.get("/v1/memory/sessions",(S)=>{let V=B1(S.req.query("limit"),20),f=S.req.query("projectPath")||E;return S.json(U(O.listSessions({limit:V,projectPath:f}),{limit:V}))}),$.get("/v1/memory/sessions/:id",(S)=>{let V=S.req.param("id"),f=O.getSession(V);if(!f)return S.json(R("NOT_FOUND","Session not found"),404);return S.json(U({...f.session,observations:f.observations,summary:f.summary}))}),$.get("/v1/memory/search",async(S)=>{let V=S.req.query("q");if(!V)return S.json(R("VALIDATION_ERROR","Query parameter 'q' is required"),400);let f=qN(S.req.query("type")),J=B1(S.req.query("limit"),20);try{let Q=await O.search(V,{type:f,limit:J});return S.json(U(Q,{limit:J}))}catch{return S.json(U([],{limit:J}))}}),$.post("/v1/memory/recall",async(S)=>{try{let V=await S.req.json(),f=await O.recall(V.ids??[],V.limit??10);return S.json(U(f))}catch{return S.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),$.post("/v1/memory/export",async(S)=>{try{let V=await S.req.json().catch(()=>({})),f=await O.export("project",{type:V.type,limit:V.limit});return S.json(U(f))}catch(V){return S.json(R("INTERNAL_ERROR",String(V)),500)}}),$.post("/v1/memory/import",async(S)=>{try{let V=await S.req.json(),f=V.mode==="replace"?"overwrite":"skip-duplicates",J=await O.import(V.payload,{mode:f});return S.json(U(J))}catch{return S.json(R("VALIDATION_ERROR","Invalid import payload"),400)}}),$.get("/v1/memory/stats",(S)=>{return S.json(U(O.stats()))}),$.get("/v1/health",(S)=>{let V=O.getHealth(),f=O.getMetrics(),J=M?.(),Q={status:V.status,timestamp:V.timestamp,uptimeMs:process.uptime()*1000,queue:{mode:"in-process",running:!1,processing:!1,pending:0,lastBatchDurationMs:0,lastProcessedAt:null,lastFailedAt:null,lastError:null},batches:{total:0,processedItems:0,failedItems:0,avgDurationMs:0},enqueueCount:0},W=J??Q;return S.json(U({status:W.status,timestamp:W.timestamp,uptimeMs:W.uptimeMs,queue:W.queue,memory:{totalObservations:f.memory.totalObservations,totalSessions:f.memory.totalSessions}}))}),$.get("/v1/metrics",(S)=>{let V=O.getHealth(),J=M?.()??{status:V.status,timestamp:V.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 S.json(U(J))}),$.get("/v1/platforms",(S)=>{let V=O.getAdapterStatuses();return S.json(U({platforms:V.map((f)=>({name:f.name,version:f.version,enabled:f.enabled,capabilities:f.capabilities}))}))}),$.get("/v1/adapters/status",(S)=>{return S.json(U(O.getAdapterStatuses()))}),$.get("/v1/config/schema",(S)=>S.json(U(J1()))),$.get("/v1/config/effective",async(S)=>{let V=await p(E);return S.json(U({config:w0(V.config),meta:V.meta,warnings:V.warnings}))}),$.post("/v1/config/preview",async(S)=>{try{let V=await S.req.json(),f=await W1(E,V);return S.json(U({config:w0(f.config),meta:f.meta,warnings:f.warnings}))}catch{return S.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}}),$.patch("/v1/config",async(S)=>{let V;try{V=await S.req.json()}catch{return S.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}try{let f=await n(E),J=await k0(E,V),Q={};for(let W of Object.keys(V))if(Object.hasOwn(f,W))Q[W]=f[W];return O.trackConfigAudit({id:D0(),timestamp:new Date().toISOString(),patch:V,previousValues:Q,source:"api"}),S.json(U({config:w0(J.config),meta:J.meta,warnings:J.warnings}))}catch(f){return S.json(R("INTERNAL_ERROR",String(f)),500)}}),$.get("/v1/config/audit",(S)=>{return S.json(U(O.getConfigAuditTimeline()))}),$.post("/v1/config/rollback",async(S)=>{let V;try{V=await S.req.json()}catch{return S.json(R("VALIDATION_ERROR","Invalid JSON body"),400)}if(!V.eventId)return S.json(R("VALIDATION_ERROR","eventId is required"),400);try{let f=await O.rollbackConfig(V.eventId);if(!f)return S.json(R("NOT_FOUND","Audit event not found"),404);return S.json(U(f))}catch(f){return S.json(R("INTERNAL_ERROR",String(f)),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($.get("/v1/modes",(S)=>S.json(U({modes:Object.entries(_).map(([V,f])=>({id:V,patch:f}))}))),$.post("/v1/modes/:id/apply",async(S)=>{let V=S.req.param("id"),f=_[V];if(!f)return S.json(R("NOT_FOUND","Unknown mode"),404);try{let J=await n(E),Q=await k0(E,f),W={};for(let X of Object.keys(f))if(Object.hasOwn(J,X))W[X]=J[X];return O.trackConfigAudit({id:D0(),timestamp:new Date().toISOString(),patch:f,previousValues:W,source:"mode"}),S.json(U({applied:V,config:w0(Q.config),meta:Q.meta,warnings:Q.warnings}))}catch(J){return S.json(R("INTERNAL_ERROR",String(J)),500)}}),$.post("/v1/maintenance/folder-context/dry-run",async(S)=>{try{let f=(await S.req.json().catch(()=>({}))).action??"clean",J=await O.maintainFolderContext(f,!0);return O.trackMaintenanceResult({id:D0(),timestamp:new Date().toISOString(),action:`folder-context-${f}-dry-run`,dryRun:!0,result:J}),S.json(U(J))}catch(V){return S.json(R("INTERNAL_ERROR",String(V)),500)}}),$.post("/v1/maintenance/folder-context/clean",async(S)=>{try{let V=await O.maintainFolderContext("clean",!1);return O.trackMaintenanceResult({id:D0(),timestamp:new Date().toISOString(),action:"folder-context-clean",dryRun:!1,result:V}),S.json(U(V))}catch(V){return S.json(R("INTERNAL_ERROR",String(V)),500)}}),$.post("/v1/maintenance/folder-context/rebuild",async(S)=>{try{let V=await O.maintainFolderContext("rebuild",!1);return O.trackMaintenanceResult({id:D0(),timestamp:new Date().toISOString(),action:"folder-context-rebuild",dryRun:!1,result:V}),S.json(U(V))}catch(V){return S.json(R("INTERNAL_ERROR",String(V)),500)}}),$.get("/v1/maintenance/history",(S)=>{return S.json(U(O.getMaintenanceHistory()))}),N.sseHandler)$.get("/v1/events",N.sseHandler);return $.get("*",async(S)=>{let V=S.req.path;if(V.startsWith("/v1/"))return S.json(R("NOT_FOUND","Not found"),404);let f=A??D1(I2(import.meta.url),"../../dist/dashboard"),J=y2(f),Q=J.endsWith(wN)?J:`${J}${wN}`,W=V==="/"?"index.html":V.replace(/^\//,""),X=D1(f,W);if(!X.startsWith(Q))return S.json(R("NOT_FOUND","Not found"),404);try{let D=Bun.file(X);if(await D.exists())return new Response(D)}catch{}let Z=D1(f,"index.html");if(!Z.startsWith(Q))return S.json(R("NOT_FOUND","Not found"),404);try{let D=Bun.file(Z);if(await D.exists())return new Response(D,{headers:{"Content-Type":"text/html; charset=utf-8"}})}catch{}return S.json(R("NOT_FOUND","Dashboard not found. Run the dashboard build first."),404)}),$}var U1=class{writer;encoder;writable;abortSubscribers=[];responseReadable;aborted=!1;closed=!1;constructor(N,E){this.writable=N,this.writer=N.getWriter(),this.encoder=new TextEncoder;let O=E.getReader();this.abortSubscribers.push(async()=>{await O.cancel()}),this.responseReadable=new ReadableStream({async pull(M){let{done:A,value:$}=await O.read();A?M.close():M.enqueue($)},cancel:()=>{this.abort()}})}async write(N){try{if(typeof N==="string")N=this.encoder.encode(N);await this.writer.write(N)}catch{}return this}async writeln(N){return await this.write(N+`
3
- `),this}sleep(N){return new Promise((E)=>setTimeout(E,N))}async close(){try{await this.writer.close()}catch{}this.closed=!0}async pipe(N){this.writer.releaseLock(),await N.pipeTo(this.writable,{preventClose:!0}),this.writer=this.writable.getWriter()}onAbort(N){this.abortSubscribers.push(N)}abort(){if(!this.aborted)this.aborted=!0,this.abortSubscribers.forEach((N)=>N())}};var q0=()=>{let N=typeof Bun<"u"?Bun.version:void 0;if(N===void 0)return!1;let E=N.startsWith("1.1")||N.startsWith("1.0")||N.startsWith("0.");return q0=()=>E,E};var xN=class extends U1{constructor(N,E){super(N,E)}async writeSSE(N){let O=(await V0(N.data,H0.Stringify,!1,{})).split(/\r\n|\r|\n/).map((A)=>{return`data: ${A}`}).join(`
4
- `),M=[N.event&&`event: ${N.event}`,O,N.id&&`id: ${N.id}`,N.retry&&`retry: ${N.retry}`].filter(Boolean).join(`
2
+ var ME=Object.create;var{getPrototypeOf:OE,defineProperty:N1,getOwnPropertyNames:$E}=Object;var _E=Object.prototype.hasOwnProperty;var VE=(N,E,A)=>{A=N!=null?ME(OE(N)):{};let M=E||!N||!N.__esModule?N1(A,"default",{value:N,enumerable:!0}):A;for(let O of $E(N))if(!_E.call(M,O))N1(M,O,{get:()=>N[O],enumerable:!0});return M};var SE=(N,E)=>{for(var A in E)N1(N,A,{get:E[A],enumerable:!0,configurable:!0,set:(M)=>E[A]=()=>M})};var E1=(N,E)=>()=>(N&&(E=N(N=0)),E);var x=import.meta.require;import{existsSync as HE,readdirSync as CE,readFileSync as FE}from"fs";import{join as IN}from"path";function TN(){if(N0)return N0;if(N0=new Map,!HE(f1))return N0;for(let N of CE(f1)){if(!N.endsWith(".json"))continue;try{let E=FE(IN(f1,N),"utf-8"),A=JSON.parse(E);if(A.id&&A.observationTypes&&A.conceptVocabulary)N0.set(A.id,A)}catch{}}return N0}function kN(N){let E=TN(),A=E.get(N);if(A)return A;let M=E.get("code");if(M)return M;return{id:"code",name:"Code",description:"Default coding workflow mode",observationTypes:["decision","bugfix","feature","refactor","discovery","change"],conceptVocabulary:["how-it-works","why-it-exists","what-changed","problem-solution","gotcha","pattern","trade-off"],entityTypes:["technology","library","pattern","concept","file","person","project","other"],relationshipTypes:["uses","depends_on","implements","extends","related_to","replaces","configures"]}}function w0(){return[...TN().keys()].sort()}var f1,N0=null;var W1=E1(()=>{f1=IN(import.meta.dir,".")});import{existsSync as jE,readFileSync as yE}from"fs";function IE(){let N={};if(process.env.OPEN_MEM_DB_PATH)N.dbPath=process.env.OPEN_MEM_DB_PATH;if(process.env.OPEN_MEM_PROVIDER)N.provider=process.env.OPEN_MEM_PROVIDER;if(process.env.OPEN_MEM_MODEL)N.model=process.env.OPEN_MEM_MODEL;if(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS)N.maxContextTokens=Number.parseInt(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS,10);if(process.env.OPEN_MEM_COMPRESSION==="false")N.compressionEnabled=!1;if(process.env.OPEN_MEM_CONTEXT_INJECTION==="false")N.contextInjectionEnabled=!1;if(process.env.OPEN_MEM_IGNORED_TOOLS)N.ignoredTools=process.env.OPEN_MEM_IGNORED_TOOLS.split(",").map((E)=>E.trim());if(process.env.OPEN_MEM_BATCH_SIZE)N.batchSize=Number.parseInt(process.env.OPEN_MEM_BATCH_SIZE,10);if(process.env.OPEN_MEM_RETENTION_DAYS)N.retentionDays=Number.parseInt(process.env.OPEN_MEM_RETENTION_DAYS,10);if(process.env.OPEN_MEM_LOG_LEVEL)N.logLevel=process.env.OPEN_MEM_LOG_LEVEL;if(process.env.OPEN_MEM_CONTEXT_SHOW_TOKEN_COSTS==="false")N.contextShowTokenCosts=!1;if(process.env.OPEN_MEM_CONTEXT_TYPES)N.contextObservationTypes=process.env.OPEN_MEM_CONTEXT_TYPES==="all"?"all":process.env.OPEN_MEM_CONTEXT_TYPES.split(",").map((E)=>E.trim());if(process.env.OPEN_MEM_CONTEXT_FULL_COUNT)N.contextFullObservationCount=Number.parseInt(process.env.OPEN_MEM_CONTEXT_FULL_COUNT,10);if(process.env.OPEN_MEM_MAX_OBSERVATIONS)N.maxObservations=Number.parseInt(process.env.OPEN_MEM_MAX_OBSERVATIONS,10);if(process.env.OPEN_MEM_CONTEXT_SHOW_LAST_SUMMARY==="false")N.contextShowLastSummary=!1;if(process.env.OPEN_MEM_RATE_LIMITING==="false")N.rateLimitingEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT==="false")N.folderContextEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH)N.folderContextMaxDepth=Number.parseInt(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH,10);if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="single")N.folderContextMode="single";if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="dispersed")N.folderContextMode="dispersed";if(process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME)N.folderContextFilename=process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME;if(process.env.OPEN_MEM_DAEMON==="true")N.daemonEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD==="true")N.dashboardEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD_PORT)N.dashboardPort=Number.parseInt(process.env.OPEN_MEM_DASHBOARD_PORT,10);if(process.env.OPEN_MEM_PLATFORM_OPENCODE==="false")N.platformOpenCodeEnabled=!1;if(process.env.OPEN_MEM_PLATFORM_CLAUDE_CODE==="true")N.platformClaudeCodeEnabled=!0;if(process.env.OPEN_MEM_PLATFORM_CURSOR==="true")N.platformCursorEnabled=!0;if(process.env.OPEN_MEM_MCP_COMPAT_MODE)N.mcpCompatibilityMode=process.env.OPEN_MEM_MCP_COMPAT_MODE;if(process.env.OPEN_MEM_MCP_PROTOCOL_VERSION)N.mcpProtocolVersion=process.env.OPEN_MEM_MCP_PROTOCOL_VERSION;if(process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS)N.mcpSupportedProtocolVersions=process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS.split(",").map((E)=>E.trim()).filter(Boolean);if(process.env.OPEN_MEM_EMBEDDING_DIMENSION)N.embeddingDimension=Number.parseInt(process.env.OPEN_MEM_EMBEDDING_DIMENSION,10);if(process.env.OPEN_MEM_CONFLICT_RESOLUTION==="true")N.conflictResolutionEnabled=!0;if(process.env.OPEN_MEM_CONFLICT_BAND_LOW){let E=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_LOW);if(!Number.isNaN(E))N.conflictSimilarityBandLow=E}if(process.env.OPEN_MEM_CONFLICT_BAND_HIGH){let E=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_HIGH);if(!Number.isNaN(E))N.conflictSimilarityBandHigh=E}if(process.env.OPEN_MEM_USER_MEMORY==="true")N.userMemoryEnabled=!0;if(process.env.OPEN_MEM_USER_MEMORY_DB_PATH)N.userMemoryDbPath=process.env.OPEN_MEM_USER_MEMORY_DB_PATH;if(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS)N.userMemoryMaxContextTokens=Number.parseInt(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS,10);if(process.env.OPEN_MEM_RERANKING==="true")N.rerankingEnabled=!0;if(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES)N.rerankingMaxCandidates=Number.parseInt(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES,10);if(process.env.OPEN_MEM_ENTITY_EXTRACTION==="true")N.entityExtractionEnabled=!0;if(process.env.OPEN_MEM_FALLBACK_PROVIDERS)N.fallbackProviders=process.env.OPEN_MEM_FALLBACK_PROVIDERS.split(",").map((E)=>E.trim()).filter(Boolean);if(process.env.OPEN_MEM_MODE)N.mode=process.env.OPEN_MEM_MODE;return N}function TE(N){let E=`${N}/.open-mem/config.json`;if(!jE(E))return{};try{let A=yE(E,"utf-8"),M=JSON.parse(A);if(!M||typeof M!=="object"||Array.isArray(M))return{};return M}catch{return{}}}function kE(N){switch(N){case"google":return 768;case"openai":return 1536;case"bedrock":return 1024;case"anthropic":return 0;case"openrouter":return 0;default:return 768}}function U0(N,E){let A=TE(N),M=IE(),O={...wN,...A,...M,...E};if(!O.dbPath.startsWith("/"))O.dbPath=`${N}/${O.dbPath}`;if(!process.env.OPEN_MEM_PROVIDER&&!E?.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";else if(process.env.OPENROUTER_API_KEY)O.provider="openrouter"}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"openrouter":O.apiKey=process.env.OPENROUTER_API_KEY;break;case"bedrock":break}if(O.provider==="openrouter"&&O.model==="gemini-2.5-flash-lite")O.model="google/gemini-2.5-flash-lite";if(O.embeddingDimension===void 0)O.embeddingDimension=kE(O.provider);if(O.mode&&!w0().includes(O.mode))O.mode="code";return O}function qN(N){let E=[],A=N.provider!=="bedrock";if(N.compressionEnabled&&A&&!N.apiKey)E.push("AI compression enabled but no API key found. Get a free Gemini API key at https://aistudio.google.com/apikey and set GOOGLE_GENERATIVE_AI_API_KEY, or set OPEN_MEM_PROVIDER and the appropriate API key for your provider.");if(N.maxContextTokens<500)E.push("maxContextTokens must be at least 500");if(N.batchSize<1)E.push("batchSize must be at least 1");if(N.minOutputLength<0)E.push("minOutputLength must be non-negative");return E}function X1(){return{...wN}}async function PN(N){let E=N.dbPath.substring(0,N.dbPath.lastIndexOf("/")),{mkdir:A}=await import("fs/promises");await A(E,{recursive:!0})}var wN;var U1=E1(()=>{W1();wN={dbPath:".open-mem/memory.db",provider:"google",apiKey:void 0,model:"gemini-2.5-flash-lite",maxTokensPerCompression:1024,compressionEnabled:!0,contextInjectionEnabled:!0,maxContextTokens:4000,batchSize:5,batchIntervalMs:30000,ignoredTools:[],minOutputLength:50,maxIndexEntries:20,sensitivePatterns:[],retentionDays:90,maxDatabaseSizeMb:500,logLevel:"warn",contextShowTokenCosts:!0,contextObservationTypes:"all",contextFullObservationCount:3,maxObservations:50,contextShowLastSummary:!0,rateLimitingEnabled:!0,folderContextEnabled:!0,folderContextMaxDepth:5,folderContextMode:"dispersed",folderContextFilename:"AGENTS.md",daemonEnabled:!1,dashboardEnabled:!1,dashboardPort:3737,platformOpenCodeEnabled:!0,platformClaudeCodeEnabled:!1,platformCursorEnabled:!1,mcpCompatibilityMode:"strict",mcpProtocolVersion:"2024-11-05",mcpSupportedProtocolVersions:["2024-11-05"],embeddingDimension:void 0,conflictResolutionEnabled:!1,conflictSimilarityBandLow:0.7,conflictSimilarityBandHigh:0.92,userMemoryEnabled:!1,userMemoryDbPath:"~/.config/open-mem/user-memory.db",userMemoryMaxContextTokens:1000,rerankingEnabled:!1,rerankingMaxCandidates:20,entityExtractionEnabled:!1,fallbackProviders:void 0,mode:"code"}});var gN={};SE(gN,{writeProjectConfig:()=>mN,validatePatch:()=>K1,readProjectConfig:()=>r,previewConfig:()=>B1,patchConfig:()=>q0,getEffectiveConfig:()=>n,getConfigSchema:()=>Z1});import{existsSync as wE}from"fs";import{mkdir as qE,readFile as PE,writeFile as xE}from"fs/promises";import{dirname as vE,join as uE}from"path";function vN(N){return uE(N,".open-mem","config.json")}function uN(N){return xN.find((E)=>E.key===N)}function gE(N,E){let A=uN(N);if(!A)return null;if(A.type==="string"&&typeof E!=="string")return`${String(N)} must be a string`;if(A.type==="number"&&typeof E!=="number")return`${String(N)} must be a number`;if(A.type==="boolean"&&typeof E!=="boolean")return`${String(N)} must be a boolean`;if(A.type==="array"&&!Array.isArray(E))return`${String(N)} must be an array`;if(A.enum&&typeof E==="string"&&!A.enum.includes(E))return`${String(N)} must be one of: ${A.enum.join(", ")}`;if(typeof E==="number"){if(A.min!==void 0&&E<A.min)return`${String(N)} must be >= ${A.min}`;if(A.max!==void 0&&E>A.max)return`${String(N)} must be <= ${A.max}`}return null}function Z1(){return xN}async function r(N){let E=vN(N);if(!wE(E))return{};try{let A=await PE(E,"utf-8"),M=JSON.parse(A);if(!M||typeof M!=="object"||Array.isArray(M))return{};return M}catch{return{}}}async function mN(N,E){let A=vN(N),O={...await r(N),...E};await qE(vE(A),{recursive:!0}),await xE(A,JSON.stringify(O,null,2),"utf-8")}function K1(N){let E=[];for(let[A,M]of Object.entries(N)){let $=gE(A,M);if($)E.push($)}return E}async function n(N){let E=X1(),A=await r(N),M=U0(N),O=[],$={};for(let[V,_]of Object.entries(E)){let S=V,J=uN(S),f=(mE[S]??[]).some((D)=>typeof process.env[D]==="string"),W=Object.hasOwn(A,S),X="default";if(W)X="file";if(f)X="env";if($[S]={source:X,locked:f,restartRequired:J?.restartRequired??!1,liveApply:J?.liveApply??!1},X==="env"&&W)O.push(`${String(S)} is overridden by environment variable.`);if(M[S]===void 0&&_!==void 0)O.push(`${String(S)} resolved to undefined unexpectedly.`)}return{config:M,meta:$,warnings:O}}async function B1(N,E){let A=K1(E);if(A.length>0)return{...await n(N),warnings:A};let M=X1(),O=await r(N),$={...M,...O,...E},_={...U0(N,E),...$},S=(await n(N)).meta;return{config:_,meta:S,warnings:[]}}async function q0(N,E){let A=K1(E);if(A.length>0)return{...await n(N),warnings:A};return await mN(N,E),n(N)}var xN,mE;var D1=E1(()=>{U1();xN=[{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}],mE={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 FM}from"fs";import{dirname as jM,join as s}from"path";import{fileURLToPath as yM}from"url";import{randomUUID as Z0}from"crypto";import{normalize as hE,resolve as Y1,sep as hN}from"path";import{fileURLToPath as cE}from"url";var A1=(N,E,A)=>{return(M,O)=>{let $=-1;return V(0);async function V(_){if(_<=$)throw Error("next() called multiple times");$=_;let S,J=!1,Q;if(N[_])Q=N[_][0][0],M.req.routeIndex=_;else Q=_===N.length&&O||void 0;if(Q)try{S=await Q(M,()=>V(_+1))}catch(f){if(f instanceof Error&&E)M.error=f,S=await E(f,M),J=!0;else throw f}else if(M.finalized===!1&&A)S=await A(M);if(S&&(M.finalized===!1||J))M.res=S;return M}}};var SN=Symbol();var JN=async(N,E=Object.create(null))=>{let{all:A=!1,dot:M=!1}=E,$=(N instanceof L0?N.raw.headers:N.headers).get("Content-Type");if($?.startsWith("multipart/form-data")||$?.startsWith("application/x-www-form-urlencoded"))return JE(N,{all:A,dot:M});return{}};async function JE(N,E){let A=await N.formData();if(A)return QE(A,E);return{}}function QE(N,E){let A=Object.create(null);if(N.forEach((M,O)=>{if(!(E.all||O.endsWith("[]")))A[O]=M;else fE(A,O,M)}),E.dot)Object.entries(A).forEach(([M,O])=>{if(M.includes("."))WE(A,M,O),delete A[M]});return A}var fE=(N,E,A)=>{if(N[E]!==void 0)if(Array.isArray(N[E]))N[E].push(A);else N[E]=[N[E],A];else if(!E.endsWith("[]"))N[E]=A;else N[E]=[A]},WE=(N,E,A)=>{let M=N,O=E.split(".");O.forEach(($,V)=>{if(V===O.length-1)M[$]=A;else{if(!M[$]||typeof M[$]!=="object"||Array.isArray(M[$])||M[$]instanceof File)M[$]=Object.create(null);M=M[$]}})};var O1=(N)=>{let E=N.split("/");if(E[0]==="")E.shift();return E},QN=(N)=>{let{groups:E,path:A}=XE(N),M=O1(A);return UE(M,E)},XE=(N)=>{let E=[];return N=N.replace(/\{[^}]+\}/g,(A,M)=>{let O=`@${M}`;return E.push([O,A]),O}),{groups:E,path:N}},UE=(N,E)=>{for(let A=E.length-1;A>=0;A--){let[M]=E[A];for(let O=N.length-1;O>=0;O--)if(N[O].includes(M)){N[O]=N[O].replace(M,E[A][1]);break}}return N},G0={},fN=(N,E)=>{if(N==="*")return"*";let A=N.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(A){let M=`${N}#${E}`;if(!G0[M])if(A[2])G0[M]=E&&E[0]!==":"&&E[0]!=="*"?[M,A[1],new RegExp(`^${A[2]}(?=/${E})`)]:[N,A[1],new RegExp(`^${A[2]}$`)];else G0[M]=[N,A[1],!0];return G0[M]}return null},H0=(N,E)=>{try{return E(N)}catch{return N.replace(/(?:%[0-9A-Fa-f]{2})+/g,(A)=>{try{return E(A)}catch{return A}})}},ZE=(N)=>H0(N,decodeURI),$1=(N)=>{let E=N.url,A=E.indexOf("/",E.indexOf(":")+4),M=A;for(;M<E.length;M++){let O=E.charCodeAt(M);if(O===37){let $=E.indexOf("?",M),V=E.slice(A,$===-1?void 0:$);return ZE(V.includes("%25")?V.replace(/%25/g,"%2525"):V)}else if(O===63)break}return E.slice(A,M)};var WN=(N)=>{let E=$1(N);return E.length>1&&E.at(-1)==="/"?E.slice(0,-1):E},b=(N,E,...A)=>{if(A.length)E=b(E,...A);return`${N?.[0]==="/"?"":"/"}${N}${E==="/"?"":`${N?.at(-1)==="/"?"":"/"}${E?.[0]==="/"?E.slice(1):E}`}`},C0=(N)=>{if(N.charCodeAt(N.length-1)!==63||!N.includes(":"))return null;let E=N.split("/"),A=[],M="";return E.forEach((O)=>{if(O!==""&&!/\:/.test(O))M+="/"+O;else if(/\:/.test(O))if(/\?/.test(O)){if(A.length===0&&M==="")A.push("/");else A.push(M);let $=O.replace("?","");M+="/"+$,A.push(M)}else M+="/"+O}),A.filter((O,$,V)=>V.indexOf(O)===$)},M1=(N)=>{if(!/[%+]/.test(N))return N;if(N.indexOf("+")!==-1)N=N.replace(/\+/g," ");return N.indexOf("%")!==-1?H0(N,_1):N},XN=(N,E,A)=>{let M;if(!A&&E&&!/[%+]/.test(E)){let V=N.indexOf("?",8);if(V===-1)return;if(!N.startsWith(E,V+1))V=N.indexOf(`&${E}`,V+1);while(V!==-1){let _=N.charCodeAt(V+E.length+1);if(_===61){let S=V+E.length+2,J=N.indexOf("&",S);return M1(N.slice(S,J===-1?void 0:J))}else if(_==38||isNaN(_))return"";V=N.indexOf(`&${E}`,V+1)}if(M=/[%+]/.test(N),!M)return}let O={};M??=/[%+]/.test(N);let $=N.indexOf("?",8);while($!==-1){let V=N.indexOf("&",$+1),_=N.indexOf("=",$);if(_>V&&V!==-1)_=-1;let S=N.slice($+1,_===-1?V===-1?void 0:V:_);if(M)S=M1(S);if($=V,S==="")continue;let J;if(_===-1)J="";else if(J=N.slice(_+1,V===-1?void 0:V),M)J=M1(J);if(A){if(!(O[S]&&Array.isArray(O[S])))O[S]=[];O[S].push(J)}else O[S]??=J}return E?O[E]:O},UN=XN,ZN=(N,E)=>{return XN(N,E,!0)},_1=decodeURIComponent;var KN=(N)=>H0(N,_1),L0=class{raw;#N;#E;routeIndex=0;path;bodyCache={};constructor(N,E="/",A=[[]]){this.raw=N,this.path=E,this.#E=A,this.#N={}}param(N){return N?this.#A(N):this.#$()}#A(N){let E=this.#E[0][this.routeIndex][1][N],A=this.#O(E);return A&&/\%/.test(A)?KN(A):A}#$(){let N={},E=Object.keys(this.#E[0][this.routeIndex][1]);for(let A of E){let M=this.#O(this.#E[0][this.routeIndex][1][A]);if(M!==void 0)N[A]=/\%/.test(M)?KN(M):M}return N}#O(N){return this.#E[1]?this.#E[1][N]:N}query(N){return UN(this.url,N)}queries(N){return ZN(this.url,N)}header(N){if(N)return this.raw.headers.get(N)??void 0;let E={};return this.raw.headers.forEach((A,M)=>{E[M]=A}),E}async parseBody(N){return this.bodyCache.parsedBody??=await JN(this,N)}#M=(N)=>{let{bodyCache:E,raw:A}=this,M=E[N];if(M)return M;let O=Object.keys(E)[0];if(O)return E[O].then(($)=>{if(O==="json")$=JSON.stringify($);return new Response($)[N]()});return E[N]=A[N]()};json(){return this.#M("text").then((N)=>JSON.parse(N))}text(){return this.#M("text")}arrayBuffer(){return this.#M("arrayBuffer")}blob(){return this.#M("blob")}formData(){return this.#M("formData")}addValidatedData(N,E){this.#N[N]=E}valid(N){return this.#N[N]}get url(){return this.raw.url}get method(){return this.raw.method}get[SN](){return this.#E}get matchedRoutes(){return this.#E[0].map(([[,N]])=>N)}get routePath(){return this.#E[0].map(([[,N]])=>N)[this.routeIndex].path}};var F0={Stringify:1,BeforeStream:2,Stream:3},KE=(N,E)=>{let A=new String(N);return A.isEscaped=!0,A.callbacks=E,A};var J0=async(N,E,A,M,O)=>{if(typeof N==="object"&&!(N instanceof String)){if(!(N instanceof Promise))N=N.toString();if(N instanceof Promise)N=await N}let $=N.callbacks;if(!$?.length)return Promise.resolve(N);if(O)O[0]+=N;else O=[N];let V=Promise.all($.map((_)=>_({phase:E,buffer:O,context:M}))).then((_)=>Promise.all(_.filter(Boolean).map((S)=>J0(S,E,!1,M,O))).then(()=>O[0]));if(A)return KE(await V,$);else return V};var BN="text/plain; charset=UTF-8",V1=(N,E)=>{return{"Content-Type":N,...E}},DN=class{#N;#E;env={};#A;finalized=!1;error;#$;#O;#M;#Q;#S;#J;#V;#f;#W;constructor(N,E){if(this.#N=N,E)this.#O=E.executionCtx,this.env=E.env,this.#J=E.notFoundHandler,this.#W=E.path,this.#f=E.matchResult}get req(){return this.#E??=new L0(this.#N,this.#W,this.#f),this.#E}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.#M||=new Response(null,{headers:this.#V??=new Headers})}set res(N){if(this.#M&&N){N=new Response(N.body,N);for(let[E,A]of this.#M.headers.entries()){if(E==="content-type")continue;if(E==="set-cookie"){let M=this.#M.headers.getSetCookie();N.headers.delete("set-cookie");for(let O of M)N.headers.append("set-cookie",O)}else N.headers.set(E,A)}}this.#M=N,this.finalized=!0}render=(...N)=>{return this.#S??=(E)=>this.html(E),this.#S(...N)};setLayout=(N)=>this.#Q=N;getLayout=()=>this.#Q;setRenderer=(N)=>{this.#S=N};header=(N,E,A)=>{if(this.finalized)this.#M=new Response(this.#M.body,this.#M);let M=this.#M?this.#M.headers:this.#V??=new Headers;if(E===void 0)M.delete(N);else if(A?.append)M.append(N,E);else M.set(N,E)};status=(N)=>{this.#$=N};set=(N,E)=>{this.#A??=new Map,this.#A.set(N,E)};get=(N)=>{return this.#A?this.#A.get(N):void 0};get var(){if(!this.#A)return{};return Object.fromEntries(this.#A)}#_(N,E,A){let M=this.#M?new Headers(this.#M.headers):this.#V??new Headers;if(typeof E==="object"&&"headers"in E){let $=E.headers instanceof Headers?E.headers:new Headers(E.headers);for(let[V,_]of $)if(V.toLowerCase()==="set-cookie")M.append(V,_);else M.set(V,_)}if(A)for(let[$,V]of Object.entries(A))if(typeof V==="string")M.set($,V);else{M.delete($);for(let _ of V)M.append($,_)}let O=typeof E==="number"?E:E?.status??this.#$;return new Response(N,{status:O,headers:M})}newResponse=(...N)=>this.#_(...N);body=(N,E,A)=>this.#_(N,E,A);text=(N,E,A)=>{return!this.#V&&!this.#$&&!E&&!A&&!this.finalized?new Response(N):this.#_(N,E,V1(BN,A))};json=(N,E,A)=>{return this.#_(JSON.stringify(N),E,V1("application/json",A))};html=(N,E,A)=>{let M=(O)=>this.#_(O,E,V1("text/html; charset=UTF-8",A));return typeof N==="object"?J0(N,F0.Stringify,!1,{}).then(M):M(N)};redirect=(N,E)=>{let A=String(N);return this.header("Location",!/[^\x00-\xFF]/.test(A)?A:encodeURI(A)),this.newResponse(null,E??302)};notFound=()=>{return this.#J??=()=>new Response,this.#J(this)}};var C="ALL",YN="all",RN=["get","post","put","delete","options","patch"],j0="Can not add a route since the matcher is already built.",y0=class extends Error{};var zN="__COMPOSED_HANDLER";var BE=(N)=>{return N.text("404 Not Found",404)},LN=(N,E)=>{if("getResponse"in N){let A=N.getResponse();return E.newResponse(A.body,A)}return console.error(N),E.text("Internal Server Error",500)},GN=class N{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#N="/";routes=[];constructor(E={}){[...RN,YN].forEach(($)=>{this[$]=(V,..._)=>{if(typeof V==="string")this.#N=V;else this.#$($,this.#N,V);return _.forEach((S)=>{this.#$($,this.#N,S)}),this}}),this.on=($,V,..._)=>{for(let S of[V].flat()){this.#N=S;for(let J of[$].flat())_.map((Q)=>{this.#$(J.toUpperCase(),this.#N,Q)})}return this},this.use=($,...V)=>{if(typeof $==="string")this.#N=$;else this.#N="*",V.unshift($);return V.forEach((_)=>{this.#$(C,this.#N,_)}),this};let{strict:M,...O}=E;Object.assign(this,O),this.getPath=M??!0?E.getPath??$1:WN}#E(){let E=new N({router:this.router,getPath:this.getPath});return E.errorHandler=this.errorHandler,E.#A=this.#A,E.routes=this.routes,E}#A=BE;errorHandler=LN;route(E,A){let M=this.basePath(E);return A.routes.map((O)=>{let $;if(A.errorHandler===LN)$=O.handler;else $=async(V,_)=>(await A1([],A.errorHandler)(V,()=>O.handler(V,_))).res,$[zN]=O.handler;M.#$(O.method,O.path,$)}),this}basePath(E){let A=this.#E();return A._basePath=b(this._basePath,E),A}onError=(E)=>{return this.errorHandler=E,this};notFound=(E)=>{return this.#A=E,this};mount(E,A,M){let O,$;if(M)if(typeof M==="function")$=M;else if($=M.optionHandler,M.replaceRequest===!1)O=(S)=>S;else O=M.replaceRequest;let V=$?(S)=>{let J=$(S);return Array.isArray(J)?J:[J]}:(S)=>{let J=void 0;try{J=S.executionCtx}catch{}return[S.env,J]};O||=(()=>{let S=b(this._basePath,E),J=S==="/"?0:S.length;return(Q)=>{let f=new URL(Q.url);return f.pathname=f.pathname.slice(J)||"/",new Request(f,Q)}})();let _=async(S,J)=>{let Q=await A(O(S.req.raw),...V(S));if(Q)return Q;await J()};return this.#$(C,b(E,"*"),_),this}#$(E,A,M){E=E.toUpperCase(),A=b(this._basePath,A);let O={basePath:this._basePath,path:A,method:E,handler:M};this.router.add(E,A,[M,O]),this.routes.push(O)}#O(E,A){if(E instanceof Error)return this.errorHandler(E,A);throw E}#M(E,A,M,O){if(O==="HEAD")return(async()=>new Response(null,await this.#M(E,A,M,"GET")))();let $=this.getPath(E,{env:M}),V=this.router.match(O,$),_=new DN(E,{path:$,matchResult:V,env:M,executionCtx:A,notFoundHandler:this.#A});if(V[0].length===1){let J;try{J=V[0][0][0][0](_,async()=>{_.res=await this.#A(_)})}catch(Q){return this.#O(Q,_)}return J instanceof Promise?J.then((Q)=>Q||(_.finalized?_.res:this.#A(_))).catch((Q)=>this.#O(Q,_)):J??this.#A(_)}let S=A1(V[0],this.errorHandler,this.#A);return(async()=>{try{let J=await S(_);if(!J.finalized)throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return J.res}catch(J){return this.#O(J,_)}})()}fetch=(E,...A)=>{return this.#M(E,A[1],A[0],E.method)};request=(E,A,M,O)=>{if(E instanceof Request)return this.fetch(A?new Request(E,A):E,M,O);return E=E.toString(),this.fetch(new Request(/^https?:\/\//.test(E)?E:`http://localhost${b("/",E)}`,A),M,O)};fire=()=>{addEventListener("fetch",(E)=>{E.respondWith(this.#M(E.request,E,void 0,E.request.method))})}};var Q0=[];function I0(N,E){let A=this.buildAllMatchers(),M=(O,$)=>{let V=A[O]||A[C],_=V[2][$];if(_)return _;let S=$.match(V[0]);if(!S)return[[],Q0];let J=S.indexOf("",1);return[V[1][J],S]};return this.match=M,M(N,E)}var T0="[^/]+",f0=".*",W0="(?:|/.*)",p=Symbol(),DE=new Set(".\\+*[^]$()");function YE(N,E){if(N.length===1)return E.length===1?N<E?-1:1:-1;if(E.length===1)return 1;if(N===f0||N===W0)return 1;else if(E===f0||E===W0)return-1;if(N===T0)return 1;else if(E===T0)return-1;return N.length===E.length?N<E?-1:1:E.length-N.length}var HN=class N{#N;#E;#A=Object.create(null);insert(E,A,M,O,$){if(E.length===0){if(this.#N!==void 0)throw p;if($)return;this.#N=A;return}let[V,..._]=E,S=V==="*"?_.length===0?["","",f0]:["","",T0]:V==="/*"?["","",W0]:V.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),J;if(S){let Q=S[1],f=S[2]||T0;if(Q&&S[2]){if(f===".*")throw p;if(f=f.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(f))throw p}if(J=this.#A[f],!J){if(Object.keys(this.#A).some((W)=>W!==f0&&W!==W0))throw p;if($)return;if(J=this.#A[f]=new N,Q!=="")J.#E=O.varIndex++}if(!$&&Q!=="")M.push([Q,J.#E])}else if(J=this.#A[V],!J){if(Object.keys(this.#A).some((Q)=>Q.length>1&&Q!==f0&&Q!==W0))throw p;if($)return;J=this.#A[V]=new N}J.insert(_,A,M,O,$)}buildRegExpStr(){let A=Object.keys(this.#A).sort(YE).map((M)=>{let O=this.#A[M];return(typeof O.#E==="number"?`(${M})@${O.#E}`:DE.has(M)?`\\${M}`:M)+O.buildRegExpStr()});if(typeof this.#N==="number")A.unshift(`#${this.#N}`);if(A.length===0)return"";if(A.length===1)return A[0];return"(?:"+A.join("|")+")"}};var CN=class{#N={varIndex:0};#E=new HN;insert(N,E,A){let M=[],O=[];for(let V=0;;){let _=!1;if(N=N.replace(/\{[^}]+\}/g,(S)=>{let J=`@\\${V}`;return O[V]=[J,S],V++,_=!0,J}),!_)break}let $=N.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let V=O.length-1;V>=0;V--){let[_]=O[V];for(let S=$.length-1;S>=0;S--)if($[S].indexOf(_)!==-1){$[S]=$[S].replace(_,O[V][1]);break}}return this.#E.insert($,E,M,this.#N,A),M}buildRegExp(){let N=this.#E.buildRegExpStr();if(N==="")return[/^$/,[],[]];let E=0,A=[],M=[];return N=N.replace(/#(\d+)|@(\d+)|\.\*\$/g,(O,$,V)=>{if($!==void 0)return A[++E]=Number($),"$()";if(V!==void 0)return M[Number(V)]=++E,"";return""}),[new RegExp(`^${N}`),A,M]}};var RE=[/^$/,[],Object.create(null)],FN=Object.create(null);function jN(N){return FN[N]??=new RegExp(N==="*"?"":`^${N.replace(/\/\*$|([.\\+*[^\]$()])/g,(E,A)=>A?`\\${A}`:"(?:|/.*)")}$`)}function zE(){FN=Object.create(null)}function LE(N){let E=new CN,A=[];if(N.length===0)return RE;let M=N.map((J)=>[!/\*|\/:/.test(J[0]),...J]).sort(([J,Q],[f,W])=>J?1:f?-1:Q.length-W.length),O=Object.create(null);for(let J=0,Q=-1,f=M.length;J<f;J++){let[W,X,D]=M[J];if(W)O[X]=[D.map(([K])=>[K,Object.create(null)]),Q0];else Q++;let U;try{U=E.insert(X,Q,W)}catch(K){throw K===p?new y0(X):K}if(W)continue;A[Q]=D.map(([K,z])=>{let G=Object.create(null);z-=1;for(;z>=0;z--){let[H,R]=U[z];G[H]=R}return[K,G]})}let[$,V,_]=E.buildRegExp();for(let J=0,Q=A.length;J<Q;J++)for(let f=0,W=A[J].length;f<W;f++){let X=A[J][f]?.[1];if(!X)continue;let D=Object.keys(X);for(let U=0,K=D.length;U<K;U++)X[D[U]]=_[X[D[U]]]}let S=[];for(let J in V)S[J]=A[V[J]];return[$,S,O]}function e(N,E){if(!N)return;for(let A of Object.keys(N).sort((M,O)=>O.length-M.length))if(jN(A).test(E))return[...N[A]];return}var k0=class{name="RegExpRouter";#N;#E;constructor(){this.#N={[C]:Object.create(null)},this.#E={[C]:Object.create(null)}}add(N,E,A){let M=this.#N,O=this.#E;if(!M||!O)throw Error(j0);if(!M[N])[M,O].forEach((_)=>{_[N]=Object.create(null),Object.keys(_[C]).forEach((S)=>{_[N][S]=[..._[C][S]]})});if(E==="/*")E="*";let $=(E.match(/\/:/g)||[]).length;if(/\*$/.test(E)){let _=jN(E);if(N===C)Object.keys(M).forEach((S)=>{M[S][E]||=e(M[S],E)||e(M[C],E)||[]});else M[N][E]||=e(M[N],E)||e(M[C],E)||[];Object.keys(M).forEach((S)=>{if(N===C||N===S)Object.keys(M[S]).forEach((J)=>{_.test(J)&&M[S][J].push([A,$])})}),Object.keys(O).forEach((S)=>{if(N===C||N===S)Object.keys(O[S]).forEach((J)=>_.test(J)&&O[S][J].push([A,$]))});return}let V=C0(E)||[E];for(let _=0,S=V.length;_<S;_++){let J=V[_];Object.keys(O).forEach((Q)=>{if(N===C||N===Q)O[Q][J]||=[...e(M[Q],J)||e(M[C],J)||[]],O[Q][J].push([A,$-S+_+1])})}}match=I0;buildAllMatchers(){let N=Object.create(null);return Object.keys(this.#E).concat(Object.keys(this.#N)).forEach((E)=>{N[E]||=this.#A(E)}),this.#N=this.#E=void 0,zE(),N}#A(N){let E=[],A=N===C;if([this.#N,this.#E].forEach((M)=>{let O=M[N]?Object.keys(M[N]).map(($)=>[$,M[N][$]]):[];if(O.length!==0)A||=!0,E.push(...O);else if(N!==C)E.push(...Object.keys(M[C]).map(($)=>[$,M[C][$]]))}),!A)return null;else return LE(E)}};var GE=class{name="PreparedRegExpRouter";#N;#E;constructor(N,E){this.#N=N,this.#E=E}#A(N,E){let A=this.#N[N];A[1].forEach((M)=>M&&M.push(E)),Object.values(A[2]).forEach((M)=>M[0].push(E))}#$(N,E,A,M,O){let $=this.#N[N];if(!O)$[2][E][0].push([A,{}]);else M.forEach((V)=>{if(typeof V==="number")$[1][V].push([A,O]);else $[2][V||E][0].push([A,O])})}add(N,E,A){if(!this.#N[N]){let O=this.#N[C],$={};for(let V in O[2])$[V]=[O[2][V][0].slice(),Q0];this.#N[N]=[O[0],O[1].map((V)=>Array.isArray(V)?V.slice():0),$]}if(E==="/*"||E==="*"){let O=[A,{}];if(N===C)for(let $ in this.#N)this.#A($,O);else this.#A(N,O);return}let M=this.#E[E];if(!M)throw Error(`Path ${E} is not registered`);for(let[O,$]of M)if(N===C)for(let V in this.#N)this.#$(V,E,A,O,$);else this.#$(N,E,A,O,$)}buildAllMatchers(){return this.#N}match=I0};var S1=class{name="SmartRouter";#N=[];#E=[];constructor(N){this.#N=N.routers}add(N,E,A){if(!this.#E)throw Error(j0);this.#E.push([N,E,A])}match(N,E){if(!this.#E)throw Error("Fatal error");let A=this.#N,M=this.#E,O=A.length,$=0,V;for(;$<O;$++){let _=A[$];try{for(let S=0,J=M.length;S<J;S++)_.add(...M[S]);V=_.match(N,E)}catch(S){if(S instanceof y0)continue;throw S}this.match=_.match.bind(_),this.#N=[_],this.#E=void 0;break}if($===O)throw Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,V}get activeRouter(){if(this.#E||this.#N.length!==1)throw Error("No active router has been determined yet.");return this.#N[0]}};var X0=Object.create(null),yN=class N{#N;#E;#A;#$=0;#O=X0;constructor(E,A,M){if(this.#E=M||Object.create(null),this.#N=[],E&&A){let O=Object.create(null);O[E]={handler:A,possibleKeys:[],score:0},this.#N=[O]}this.#A=[]}insert(E,A,M){this.#$=++this.#$;let O=this,$=QN(A),V=[];for(let _=0,S=$.length;_<S;_++){let J=$[_],Q=$[_+1],f=fN(J,Q),W=Array.isArray(f)?f[0]:J;if(W in O.#E){if(O=O.#E[W],f)V.push(f[1]);continue}if(O.#E[W]=new N,f)O.#A.push(f),V.push(f[1]);O=O.#E[W]}return O.#N.push({[E]:{handler:M,possibleKeys:V.filter((_,S,J)=>J.indexOf(_)===S),score:this.#$}}),O}#M(E,A,M,O){let $=[];for(let V=0,_=E.#N.length;V<_;V++){let S=E.#N[V],J=S[A]||S[C],Q={};if(J!==void 0){if(J.params=Object.create(null),$.push(J),M!==X0||O&&O!==X0)for(let f=0,W=J.possibleKeys.length;f<W;f++){let X=J.possibleKeys[f],D=Q[J.score];J.params[X]=O?.[X]&&!D?O[X]:M[X]??O?.[X],Q[J.score]=!0}}}return $}search(E,A){let M=[];this.#O=X0;let $=[this],V=O1(A),_=[];for(let S=0,J=V.length;S<J;S++){let Q=V[S],f=S===J-1,W=[];for(let X=0,D=$.length;X<D;X++){let U=$[X],K=U.#E[Q];if(K)if(K.#O=U.#O,f){if(K.#E["*"])M.push(...this.#M(K.#E["*"],E,U.#O));M.push(...this.#M(K,E,U.#O))}else W.push(K);for(let z=0,G=U.#A.length;z<G;z++){let H=U.#A[z],R=U.#O===X0?{}:{...U.#O};if(H==="*"){let q=U.#E["*"];if(q)M.push(...this.#M(q,E,U.#O)),q.#O=R,W.push(q);continue}let[k,T,w]=H;if(!Q&&!(w instanceof RegExp))continue;let I=U.#E[k],a0=V.slice(S).join("/");if(w instanceof RegExp){let q=w.exec(a0);if(q){if(R[T]=q[0],M.push(...this.#M(I,E,U.#O,R)),Object.keys(I.#E).length){I.#O=R;let R0=q[0].match(/\//)?.length??0;(_[R0]||=[]).push(I)}continue}}if(w===!0||w.test(Q))if(R[T]=Q,f){if(M.push(...this.#M(I,E,R,U.#O)),I.#E["*"])M.push(...this.#M(I.#E["*"],E,R,U.#O))}else I.#O=R,W.push(I)}}$=W.concat(_.shift()??[])}if(M.length>1)M.sort((S,J)=>{return S.score-J.score});return[M.map(({handler:S,params:J})=>[S,J])]}};var J1=class{name="TrieRouter";#N;constructor(){this.#N=new yN}add(N,E,A){let M=C0(E);if(M){for(let O=0,$=M.length;O<$;O++)this.#N.insert(N,M[O],A);return}this.#N.insert(N,E,A)}match(N,E){return this.#N.search(N,E)}};var Q1=class extends GN{constructor(N={}){super(N);this.router=N.router??new S1({routers:[new k0,new J1]})}};D1();import{z as Z}from"zod";var E0=Z.enum(["decision","bugfix","feature","refactor","discovery","change"]);function B(N,E={}){return{data:N,error:null,meta:E}}function Y(N,E,A){return{data:null,error:{code:N,message:E,details:A},meta:{}}}var j={find:Z.object({query:Z.string().min(1),scope:Z.enum(["project","user","all"]).optional().default("project"),types:Z.array(E0).optional(),limit:Z.number().int().min(1).max(50).optional().default(10),cursor:Z.string().optional(),include:Z.object({snippets:Z.boolean().optional(),scores:Z.boolean().optional(),relations:Z.boolean().optional()}).optional()}),history:Z.object({limit:Z.number().int().min(1).max(20).optional().default(5),cursor:Z.string().optional(),sessionId:Z.string().optional(),anchor:Z.string().optional().describe("Observation ID to center the timeline around"),depthBefore:Z.number().int().min(0).max(20).optional().default(5).describe("Number of observations to show before the anchor"),depthAfter:Z.number().int().min(0).max(20).optional().default(5).describe("Number of observations to show after the anchor")}),get:Z.object({ids:Z.array(Z.string()).min(1),includeHistory:Z.boolean().optional().default(!1),limit:Z.number().int().min(1).max(50).optional().default(10)}),create:Z.object({title:Z.string(),type:E0,narrative:Z.string(),concepts:Z.array(Z.string()).optional(),files:Z.array(Z.string()).optional(),importance:Z.number().int().min(1).max(5).optional(),scope:Z.enum(["project","user"]).optional().default("project")}),revise:Z.object({id:Z.string(),title:Z.string().optional(),narrative:Z.string().optional(),type:E0.optional(),concepts:Z.array(Z.string()).optional(),importance:Z.number().int().min(1).max(5).optional(),reason:Z.string().optional()}),remove:Z.object({id:Z.string(),reason:Z.string().optional()}),transferExport:Z.object({scope:Z.enum(["project"]).optional().default("project"),type:E0.optional(),limit:Z.number().int().min(1).optional(),format:Z.enum(["json"]).optional().default("json")}),transferImport:Z.object({payload:Z.string(),mode:Z.enum(["skip","merge","replace"]).optional().default("skip")}),maintenance:Z.object({action:Z.enum(["folderContextDryRun","folderContextClean","folderContextRebuild","folderContextPurge"])}),help:Z.object({})};W1();var lE=new Set(E0.options);function R1(N,E,A=100){if(!N)return E;let M=Number.parseInt(N,10);if(Number.isNaN(M))return E;return Math.max(1,Math.min(M,A))}function bE(N){if(!N)return 0;let E=Number.parseInt(N,10);if(Number.isNaN(E))return 0;return Math.max(0,E)}function cN(N){if(!N)return;if(lE.has(N))return N;return}function P0(N){let E={};for(let[A,M]of Object.entries(N)){let O=A.toLowerCase();E[A]=typeof M==="string"&&(O.includes("key")||O.includes("api"))?"***REDACTED***":M}return E}function lN(N){let{projectPath:E,memoryEngine:A,runtimeStatusProvider:M,dashboardDir:O}=N,$=new Q1;$.get("/v1/memory/observations",(_)=>{let S=R1(_.req.query("limit"),50),J=bE(_.req.query("offset")),Q=cN(_.req.query("type")),f=_.req.query("sessionId"),W=_.req.query("state"),X=W==="current"||W==="superseded"||W==="tombstoned"?W:void 0,D=A.listObservations({limit:S,offset:J,type:Q,sessionId:f,state:X});return _.json(B(D,{limit:S,offset:J}))}),$.post("/v1/memory/observations",async(_)=>{try{let S=await _.req.json(),J=await A.save({...S,sessionId:S.sessionId??`http-${Date.now()}`});if(!J)return _.json(Y("CONFLICT","Unable to create observation"),409);return _.json(B(J),201)}catch{return _.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}}),$.get("/v1/memory/observations/:id",(_)=>{let S=_.req.param("id"),J=A.getObservation(S);if(!J)return _.json(Y("NOT_FOUND","Observation not found"),404);return _.json(B(J))}),$.get("/v1/memory/observations/:id/lineage",(_)=>{let S=_.req.param("id"),J=A.getLineage(S);if(!J)return _.json(Y("NOT_FOUND","Observation not found"),404);return _.json(B({observationId:S,lineage:J}))}),$.get("/v1/memory/observations/:id/revision-diff",(_)=>{let S=_.req.param("id"),J=_.req.query("against");if(!J)return _.json(Y("VALIDATION_ERROR","Query parameter 'against' is required"),400);let Q=A.getRevisionDiff(S,J);if(!Q)return _.json(Y("NOT_FOUND","One or both observations not found"),404);if(_.req.query("version")==="1")return _.json(B({baseId:Q.toId,againstId:Q.fromId,changes:Q.changedFields}));return _.json(B(Q))}),$.post("/v1/memory/observations/:id/revisions",async(_)=>{let S=_.req.param("id");try{let J=await _.req.json(),Q=await A.update({id:S,...J});if(!Q)return _.json(Y("NOT_FOUND","Observation not found"),404);return _.json(B({previousId:S,newId:Q.id,observation:Q}))}catch{return _.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}}),$.post("/v1/memory/observations/:id/tombstone",async(_)=>{let S=_.req.param("id");if(await A.delete([S])===0)return _.json(Y("NOT_FOUND","Observation not found"),404);return _.json(B({id:S,tombstoned:!0}))}),$.get("/v1/memory/sessions",(_)=>{let S=R1(_.req.query("limit"),20),J=_.req.query("projectPath")||E;return _.json(B(A.listSessions({limit:S,projectPath:J}),{limit:S}))}),$.get("/v1/memory/sessions/:id",(_)=>{let S=_.req.param("id"),J=A.getSession(S);if(!J)return _.json(Y("NOT_FOUND","Session not found"),404);return _.json(B({...J.session,observations:J.observations,summary:J.summary}))}),$.get("/v1/memory/search",async(_)=>{let S=_.req.query("q");if(!S)return _.json(Y("VALIDATION_ERROR","Query parameter 'q' is required"),400);let J=cN(_.req.query("type")),Q=R1(_.req.query("limit"),20);try{let f=await A.search(S,{type:J,limit:Q});return _.json(B(f,{limit:Q}))}catch{return _.json(B([],{limit:Q}))}}),$.post("/v1/memory/recall",async(_)=>{try{let S=await _.req.json(),J=await A.recall(S.ids??[],S.limit??10);return _.json(B(J))}catch{return _.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}}),$.post("/v1/memory/export",async(_)=>{try{let S=await _.req.json().catch(()=>({})),J=await A.export("project",{type:S.type,limit:S.limit});return _.json(B(J))}catch(S){return _.json(Y("INTERNAL_ERROR",String(S)),500)}}),$.post("/v1/memory/import",async(_)=>{try{let S=await _.req.json(),J=S.mode==="replace"?"overwrite":"skip-duplicates",Q=await A.import(S.payload,{mode:J});return _.json(B(Q))}catch{return _.json(Y("VALIDATION_ERROR","Invalid import payload"),400)}}),$.get("/v1/memory/stats",(_)=>{return _.json(B(A.stats()))}),$.get("/v1/health",(_)=>{let S=A.getHealth(),J=A.getMetrics(),Q=M?.(),f={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},W=Q??f;return _.json(B({status:W.status,timestamp:W.timestamp,uptimeMs:W.uptimeMs,queue:W.queue,memory:{totalObservations:J.memory.totalObservations,totalSessions:J.memory.totalSessions}}))}),$.get("/v1/metrics",(_)=>{let S=A.getHealth(),Q=M?.()??{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(Q))}),$.get("/v1/platforms",(_)=>{let S=A.getAdapterStatuses();return _.json(B({platforms:S.map((J)=>({name:J.name,version:J.version,enabled:J.enabled,capabilities:J.capabilities}))}))}),$.get("/v1/adapters/status",(_)=>{return _.json(B(A.getAdapterStatuses()))}),$.get("/v1/config/schema",(_)=>_.json(B(Z1()))),$.get("/v1/config/effective",async(_)=>{let S=await n(E);return _.json(B({config:P0(S.config),meta:S.meta,warnings:S.warnings}))}),$.post("/v1/config/preview",async(_)=>{try{let S=await _.req.json(),J=await B1(E,S);return _.json(B({config:P0(J.config),meta:J.meta,warnings:J.warnings}))}catch{return _.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}}),$.patch("/v1/config",async(_)=>{let S;try{S=await _.req.json()}catch{return _.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}try{let J=await r(E),Q=await q0(E,S),f={};for(let W of Object.keys(S))if(Object.hasOwn(J,W))f[W]=J[W];return A.trackConfigAudit({id:Z0(),timestamp:new Date().toISOString(),patch:S,previousValues:f,source:"api"}),_.json(B({config:P0(Q.config),meta:Q.meta,warnings:Q.warnings}))}catch(J){return _.json(Y("INTERNAL_ERROR",String(J)),500)}}),$.get("/v1/config/audit",(_)=>{return _.json(B(A.getConfigAuditTimeline()))}),$.post("/v1/config/rollback",async(_)=>{let S;try{S=await _.req.json()}catch{return _.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}if(!S.eventId)return _.json(Y("VALIDATION_ERROR","eventId is required"),400);try{let J=await A.rollbackConfig(S.eventId);if(!J)return _.json(Y("NOT_FOUND","Audit event not found"),404);return _.json(B(J))}catch(J){return _.json(Y("INTERNAL_ERROR",String(J)),500)}});let V={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($.get("/v1/modes",(_)=>_.json(B({modes:Object.entries(V).map(([S,J])=>({id:S,patch:J}))}))),$.post("/v1/modes/:id/apply",async(_)=>{let S=_.req.param("id"),J=V[S];if(!J)return _.json(Y("NOT_FOUND","Unknown mode"),404);try{let Q=await r(E),f=await q0(E,J),W={};for(let X of Object.keys(J))if(Object.hasOwn(Q,X))W[X]=Q[X];return A.trackConfigAudit({id:Z0(),timestamp:new Date().toISOString(),patch:J,previousValues:W,source:"mode"}),_.json(B({applied:S,config:P0(f.config),meta:f.meta,warnings:f.warnings}))}catch(Q){return _.json(Y("INTERNAL_ERROR",String(Q)),500)}}),$.get("/v1/workflow-modes",(_)=>_.json(B({modes:w0().map((S)=>kN(S))}))),$.post("/v1/maintenance/folder-context/dry-run",async(_)=>{try{let J=(await _.req.json().catch(()=>({}))).action??"clean",Q=await A.maintainFolderContext(J,!0);return A.trackMaintenanceResult({id:Z0(),timestamp:new Date().toISOString(),action:`folder-context-${J}-dry-run`,dryRun:!0,result:Q}),_.json(B(Q))}catch(S){return _.json(Y("INTERNAL_ERROR",String(S)),500)}}),$.post("/v1/maintenance/folder-context/clean",async(_)=>{try{let S=await A.maintainFolderContext("clean",!1);return A.trackMaintenanceResult({id:Z0(),timestamp:new Date().toISOString(),action:"folder-context-clean",dryRun:!1,result:S}),_.json(B(S))}catch(S){return _.json(Y("INTERNAL_ERROR",String(S)),500)}}),$.post("/v1/maintenance/folder-context/rebuild",async(_)=>{try{let S=await A.maintainFolderContext("rebuild",!1);return A.trackMaintenanceResult({id:Z0(),timestamp:new Date().toISOString(),action:"folder-context-rebuild",dryRun:!1,result:S}),_.json(B(S))}catch(S){return _.json(Y("INTERNAL_ERROR",String(S)),500)}}),$.get("/v1/maintenance/history",(_)=>{return _.json(B(A.getMaintenanceHistory()))}),N.sseHandler)$.get("/v1/events",N.sseHandler);return $.get("*",async(_)=>{let S=_.req.path;if(S.startsWith("/v1/"))return _.json(Y("NOT_FOUND","Not found"),404);let J=O??Y1(cE(import.meta.url),"../../dist/dashboard"),Q=hE(J),f=Q.endsWith(hN)?Q:`${Q}${hN}`,W=S==="/"?"index.html":S.replace(/^\//,""),X=Y1(J,W);if(!X.startsWith(f))return _.json(Y("NOT_FOUND","Not found"),404);try{let U=Bun.file(X);if(await U.exists())return new Response(U)}catch{}let D=Y1(J,"index.html");if(!D.startsWith(f))return _.json(Y("NOT_FOUND","Not found"),404);try{let U=Bun.file(D);if(await U.exists())return new Response(U,{headers:{"Content-Type":"text/html; charset=utf-8"}})}catch{}return _.json(Y("NOT_FOUND","Dashboard not found. Run the dashboard build first."),404)}),$}var z1=class{writer;encoder;writable;abortSubscribers=[];responseReadable;aborted=!1;closed=!1;constructor(N,E){this.writable=N,this.writer=N.getWriter(),this.encoder=new TextEncoder;let A=E.getReader();this.abortSubscribers.push(async()=>{await A.cancel()}),this.responseReadable=new ReadableStream({async pull(M){let{done:O,value:$}=await A.read();O?M.close():M.enqueue($)},cancel:()=>{this.abort()}})}async write(N){try{if(typeof N==="string")N=this.encoder.encode(N);await this.writer.write(N)}catch{}return this}async writeln(N){return await this.write(N+`
3
+ `),this}sleep(N){return new Promise((E)=>setTimeout(E,N))}async close(){try{await this.writer.close()}catch{}this.closed=!0}async pipe(N){this.writer.releaseLock(),await N.pipeTo(this.writable,{preventClose:!0}),this.writer=this.writable.getWriter()}onAbort(N){this.abortSubscribers.push(N)}abort(){if(!this.aborted)this.aborted=!0,this.abortSubscribers.forEach((N)=>N())}};var x0=()=>{let N=typeof Bun<"u"?Bun.version:void 0;if(N===void 0)return!1;let E=N.startsWith("1.1")||N.startsWith("1.0")||N.startsWith("0.");return x0=()=>E,E};var bN=class extends z1{constructor(N,E){super(N,E)}async writeSSE(N){let A=(await J0(N.data,F0.Stringify,!1,{})).split(/\r\n|\r|\n/).map((O)=>{return`data: ${O}`}).join(`
4
+ `),M=[N.event&&`event: ${N.event}`,A,N.id&&`id: ${N.id}`,N.retry&&`retry: ${N.retry}`].filter(Boolean).join(`
5
5
  `)+`
6
6
 
7
- `;await this.write(M)}},w2=async(N,E,O)=>{try{await E(N)}catch(M){if(M instanceof Error&&O)await O(M,N),await N.writeSSE({event:"error",data:M.message});else console.error(M)}finally{N.close()}},q2=new WeakMap,Z1=(N,E,O)=>{let{readable:M,writable:A}=new TransformStream,$=new xN(A,M);if(q0())N.req.raw.signal.addEventListener("abort",()=>{if(!$.closed)$.abort()});return q2.set($.responseReadable,N),N.header("Transfer-Encoding","chunked"),N.header("Content-Type","text/event-stream"),N.header("Cache-Control","no-cache"),N.header("Connection","keep-alive"),w2($,E,O),N.newResponse($.responseReadable)};class K1{eventBus;clients=new Set;cleanups=[];constructor(N){this.eventBus=N;this.subscribeToAll()}addClient(N){this.clients.add(N)}removeClient(N){this.clients.delete(N)}get clientCount(){return this.clients.size}destroy(){for(let N of this.cleanups)N();this.cleanups=[],this.clients.clear()}subscribeToAll(){let N=["observation:created","observation:updated","session:started","session:ended","summary:created","pending:enqueued","pending:processed"];for(let E of N){let O=(M)=>this.broadcast(E,M);this.eventBus.on(E,O),this.cleanups.push(()=>this.eventBus.off(E,O))}}broadcast(N,E){let O=JSON.stringify(E);for(let M of this.clients)try{let A=M(N,O);if(A&&typeof A.catch==="function")A.catch(()=>this.clients.delete(M))}catch{this.clients.delete(M)}}}var x2=30000;function vN(N){return(E)=>{return Z1(E,async(O)=>{let M=($,_)=>{O.writeSSE({event:$,data:_,id:Date.now().toString()})};N.addClient(M);let A=setInterval(()=>{O.writeSSE({event:"heartbeat",data:"",id:Date.now().toString()})},x2);O.onAbort(()=>{N.removeClient(M),clearInterval(A)});while(!O.aborted)await O.sleep(1000)})}}function H(N){return JSON.stringify(N,null,2)}function v2(N,E){return N.filter((O)=>E==="all"?!0:E==="user"?O.source==="user":O.source!=="user").map((O)=>({id:O.observation.id,title:O.observation.title,type:O.observation.type,summary:O.observation.narrative,snippet:O.snippet,score:O.rank,source:O.source??"project",createdAt:O.observation.createdAt}))}function uN(N){return{"mem-find":{description:"Search past memories \u2014 decisions, discoveries, gotchas, and session history. Use to recall context from previous sessions before starting work.",args:j.find.shape,execute:async(E)=>{try{let O=j.find.parse(E),M=await N.search(O.query,{limit:O.limit,type:O.types?.[0]}),A=U({results:v2(M,O.scope),nextCursor:null});return H(A)}catch(O){return H(R("VALIDATION_ERROR","Invalid find arguments",String(O)))}}},"mem-history":{description:"Browse session timeline and summaries. Use to understand what happened in recent sessions or drill into a specific session.",args:j.history.shape,execute:async(E)=>{try{let O=j.history.parse(E),M=await N.timeline({limit:O.limit,sessionId:O.sessionId,anchor:O.anchor,depthBefore:O.depthBefore,depthAfter:O.depthAfter});return H(U({items:M,nextCursor:null}))}catch(O){return H(R("VALIDATION_ERROR","Invalid history arguments",String(O)))}}},"mem-get":{description:"Fetch full memory details by ID. Use after mem-find or mem-history to get complete narratives, facts, and file lists.",args:j.get.shape,execute:async(E)=>{try{let O=j.get.parse(E),M=await N.recall(O.ids,O.limit);return H(U({observations:M}))}catch(O){return H(R("VALIDATION_ERROR","Invalid get arguments",String(O)))}}},"mem-create":{description:"Save an important observation to memory. Use for decisions + rationale, non-obvious gotchas, user preferences, or cross-session plans that auto-capture wouldn't understand the significance of.",args:j.create.shape,execute:async(E,O)=>{try{let M=j.create.parse(E),A=await N.save({...M,sessionId:O.sessionID});if(!A)return H(R("CONFLICT","Unable to create memory"));return H(U({observation:A}))}catch(M){return H(R("VALIDATION_ERROR","Invalid create arguments",String(M)))}}},"mem-revise":{description:"Update an existing memory with a new revision. Use when a previous decision changed, a gotcha was resolved, or information became outdated.",args:j.revise.shape,execute:async(E)=>{try{let O=j.revise.parse(E),M=await N.update(O);if(!M)return H(R("NOT_FOUND",`Observation ${O.id} not found`));return H(U({previousId:O.id,newId:M.id,observation:M}))}catch(O){return H(R("VALIDATION_ERROR","Invalid revise arguments",String(O)))}}},"mem-remove":{description:"Tombstone an obsolete or incorrect memory. Use to clean up memories that are no longer accurate or relevant.",args:j.remove.shape,execute:async(E)=>{try{let O=j.remove.parse(E);if(await N.delete([O.id])===0)return H(R("NOT_FOUND",`Observation ${O.id} not found`));return H(U({id:O.id,tombstoned:!0}))}catch(O){return H(R("VALIDATION_ERROR","Invalid remove arguments",String(O)))}}},"mem-export":{description:"Export project memories as portable JSON for backup or transfer between machines.",args:j.transferExport.shape,execute:async(E)=>{try{let O=j.transferExport.parse(E),M=await N.export("project",{type:O.type,limit:O.limit});return H(U({payload:M,format:O.format}))}catch(O){return H(R("VALIDATION_ERROR","Invalid export arguments",String(O)))}}},"mem-import":{description:"Import memories from a JSON export. Skips duplicates by default.",args:j.transferImport.shape,execute:async(E)=>{try{let O=j.transferImport.parse(E),M=O.mode==="replace"?"overwrite":"skip-duplicates",A=await N.import(O.payload,{mode:M});return H(U({imported:A.imported,skipped:A.skipped,mode:O.mode}))}catch(O){return H(R("VALIDATION_ERROR","Invalid import arguments",String(O)))}}},"mem-maintenance":{description:"Run folder context maintenance \u2014 clean, rebuild, purge, or dry-run AGENTS.md files.",args:j.maintenance.shape,execute:async(E)=>{try{let O=j.maintenance.parse(E);if(O.action==="folderContextDryRun")return H(U(await N.maintainFolderContext("clean",!0)));if(O.action==="folderContextClean")return H(U(await N.maintainFolderContext("clean",!1)));if(O.action==="folderContextPurge")return H(U(await N.maintainFolderContext("purge",!1)));return H(U(await N.maintainFolderContext("rebuild",!1)))}catch(O){return H(R("VALIDATION_ERROR","Invalid maintenance arguments",String(O)))}}},"mem-help":{description:"Show detailed memory workflow guidance including when to save, what to save, and memory type reference.",args:j.help.shape,execute:async()=>H(U({guide:N.guide()}))}}}import{generateText as r2}from"ai";function h(N){if(typeof N!=="object"||N===null)return!1;let E=N,O=E.status;if(O===429||O===500||O===503)return!0;let M=E.error;if(typeof M==="object"&&M!==null&&M.type==="overloaded_error")return!0;return!1}function R1(N){if(N&&typeof N==="object"){let E=N.status;if(typeof E==="number")return E===400||E===401||E===403}return!1}function r(N){return new Promise((E)=>setTimeout(E,N))}var u2=new Set(["decision","bugfix","feature","refactor","discovery","change"]);function Y(N,E){let O=new RegExp(`<${E}[^>]*>([\\s\\S]*?)</${E}>`,"i"),M=N.match(O);return M?M[1].trim():""}function P(N,E){let O=new RegExp(`<${E}[^>]*>([\\s\\S]*?)</${E}>`,"gi"),M=[];for(let A of N.matchAll(O)){let $=A[1].trim();if($)M.push($)}return M}function mN(N){let E=Y(N,"observation");if(!E)return null;let O=Y(E,"type").toLowerCase(),M=u2.has(O)?O:"discovery",A=Y(E,"title")||"Untitled observation",$=Y(E,"subtitle"),_=Y(E,"narrative"),S=P(Y(E,"facts"),"fact"),V=P(Y(E,"concepts"),"concept"),f=P(Y(E,"files_read"),"file"),J=P(Y(E,"files_modified"),"file"),Q=Y(E,"importance"),W=Number.parseInt(Q,10),X=Number.isNaN(W)?3:Math.max(1,Math.min(5,W));return{type:M,title:A,subtitle:$,facts:S,narrative:_,concepts:V,filesRead:f,filesModified:J,importance:X}}function gN(N){let E=Y(N,"session_summary");if(!E)return null;let O=Y(E,"summary")||"No summary available",M=P(Y(E,"key_decisions"),"decision"),A=P(Y(E,"files_modified"),"file"),$=P(Y(E,"concepts"),"concept"),_=Y(E,"request")||void 0,S=Y(E,"investigated")||void 0,V=Y(E,"learned")||void 0,f=Y(E,"completed")||void 0,J=Y(E,"next_steps")||void 0;return{summary:O,keyDecisions:M,filesModified:A,concepts:$,request:_,investigated:S,learned:V,completed:f,nextSteps:J}}function hN(N){let E=Y(N,"reranked");if(!E)return null;let O=P(E,"index");if(O.length===0)return null;let M=[];for(let A of O){let $=Number.parseInt(A,10);if(Number.isNaN($)||$<0)return null;M.push($)}return M}var m2=new Set(["new_fact","update","duplicate"]);function cN(N){let E=Y(N,"evaluation");if(!E)return null;let O=Y(E,"outcome").toLowerCase().trim();if(!m2.has(O))return null;let M=O,A=Y(E,"reason");if(!A)return null;let $=Y(E,"supersedes"),_={outcome:M,reason:A};if(M==="update"&&$)_.supersedesId=$;if(M==="update"&&!_.supersedesId)return null;return _}var g2=new Set(["technology","library","pattern","concept","file","person","project","other"]),h2=new Set(["uses","depends_on","implements","extends","related_to","replaces","configures"]);function lN(N){let E=Y(N,"extraction");if(!E)return null;let O=Y(E,"entities"),M=Y(E,"relations"),A=P(O,"entity"),$=[];for(let V of A){let f=Y(V,"name");if(!f)continue;let J=Y(V,"type").toLowerCase(),Q=g2.has(J)?J:"other";$.push({name:f,entityType:Q})}let _=P(M,"relation"),S=[];for(let V of _){let f=Y(V,"source"),J=Y(V,"target"),Q=Y(V,"relationship").toLowerCase();if(!f||!J||!Q)continue;if(!h2.has(Q))continue;S.push({sourceName:f,targetName:J,relationship:Q})}return{entities:$,relations:S}}function y(N){return Math.ceil(N.length/4)}function bN(N,E,O){let M=O?`<session_context>
8
- ${O}
7
+ `;await this.write(M)}},pE=async(N,E,A)=>{try{await E(N)}catch(M){if(M instanceof Error&&A)await A(M,N),await N.writeSSE({event:"error",data:M.message});else console.error(M)}finally{N.close()}},nE=new WeakMap,L1=(N,E,A)=>{let{readable:M,writable:O}=new TransformStream,$=new bN(O,M);if(x0())N.req.raw.signal.addEventListener("abort",()=>{if(!$.closed)$.abort()});return nE.set($.responseReadable,N),N.header("Transfer-Encoding","chunked"),N.header("Content-Type","text/event-stream"),N.header("Cache-Control","no-cache"),N.header("Connection","keep-alive"),pE($,E,A),N.newResponse($.responseReadable)};class G1{eventBus;clients=new Set;cleanups=[];constructor(N){this.eventBus=N;this.subscribeToAll()}addClient(N){this.clients.add(N)}removeClient(N){this.clients.delete(N)}get clientCount(){return this.clients.size}destroy(){for(let N of this.cleanups)N();this.cleanups=[],this.clients.clear()}subscribeToAll(){let N=["observation:created","observation:updated","session:started","session:ended","summary:created","pending:enqueued","pending:processed"];for(let E of N){let A=(M)=>this.broadcast(E,M);this.eventBus.on(E,A),this.cleanups.push(()=>this.eventBus.off(E,A))}}broadcast(N,E){let A=JSON.stringify(E);for(let M of this.clients)try{let O=M(N,A);if(O&&typeof O.catch==="function")O.catch(()=>this.clients.delete(M))}catch{this.clients.delete(M)}}}var iE=30000;function pN(N){return(E)=>{return L1(E,async(A)=>{let M=($,V)=>{A.writeSSE({event:$,data:V,id:Date.now().toString()})};N.addClient(M);let O=setInterval(()=>{A.writeSSE({event:"heartbeat",data:"",id:Date.now().toString()})},iE);A.onAbort(()=>{N.removeClient(M),clearInterval(O)});while(!A.aborted)await A.sleep(1000)})}}function F(N){return JSON.stringify(N,null,2)}function dE(N,E){return N.filter((A)=>E==="all"?!0:E==="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 nN(N){return{"mem-find":{description:"Search past memories \u2014 decisions, discoveries, gotchas, and session history. Use to recall context from previous sessions before starting work.",args:j.find.shape,execute:async(E)=>{try{let A=j.find.parse(E),M=await N.search(A.query,{limit:A.limit,type:A.types?.[0]}),O=B({results:dE(M,A.scope),nextCursor:null});return F(O)}catch(A){return F(Y("VALIDATION_ERROR","Invalid find arguments",String(A)))}}},"mem-history":{description:"Browse session timeline and summaries. Use to understand what happened in recent sessions or drill into a specific session.",args:j.history.shape,execute:async(E)=>{try{let A=j.history.parse(E),M=await N.timeline({limit:A.limit,sessionId:A.sessionId,anchor:A.anchor,depthBefore:A.depthBefore,depthAfter:A.depthAfter});return F(B({items:M,nextCursor:null}))}catch(A){return F(Y("VALIDATION_ERROR","Invalid history arguments",String(A)))}}},"mem-get":{description:"Fetch full memory details by ID. Use after mem-find or mem-history to get complete narratives, facts, and file lists.",args:j.get.shape,execute:async(E)=>{try{let A=j.get.parse(E),M=await N.recall(A.ids,A.limit);return F(B({observations:M}))}catch(A){return F(Y("VALIDATION_ERROR","Invalid get arguments",String(A)))}}},"mem-create":{description:"Save an important observation to memory. Use for decisions + rationale, non-obvious gotchas, user preferences, or cross-session plans that auto-capture wouldn't understand the significance of.",args:j.create.shape,execute:async(E,A)=>{try{let M=j.create.parse(E),O=await N.save({...M,sessionId:A.sessionID});if(!O)return F(Y("CONFLICT","Unable to create memory"));return F(B({observation:O}))}catch(M){return F(Y("VALIDATION_ERROR","Invalid create arguments",String(M)))}}},"mem-revise":{description:"Update an existing memory with a new revision. Use when a previous decision changed, a gotcha was resolved, or information became outdated.",args:j.revise.shape,execute:async(E)=>{try{let A=j.revise.parse(E),M=await N.update(A);if(!M)return F(Y("NOT_FOUND",`Observation ${A.id} not found`));return F(B({previousId:A.id,newId:M.id,observation:M}))}catch(A){return F(Y("VALIDATION_ERROR","Invalid revise arguments",String(A)))}}},"mem-remove":{description:"Tombstone an obsolete or incorrect memory. Use to clean up memories that are no longer accurate or relevant.",args:j.remove.shape,execute:async(E)=>{try{let A=j.remove.parse(E);if(await N.delete([A.id])===0)return F(Y("NOT_FOUND",`Observation ${A.id} not found`));return F(B({id:A.id,tombstoned:!0}))}catch(A){return F(Y("VALIDATION_ERROR","Invalid remove arguments",String(A)))}}},"mem-export":{description:"Export project memories as portable JSON for backup or transfer between machines.",args:j.transferExport.shape,execute:async(E)=>{try{let A=j.transferExport.parse(E),M=await N.export("project",{type:A.type,limit:A.limit});return F(B({payload:M,format:A.format}))}catch(A){return F(Y("VALIDATION_ERROR","Invalid export arguments",String(A)))}}},"mem-import":{description:"Import memories from a JSON export. Skips duplicates by default.",args:j.transferImport.shape,execute:async(E)=>{try{let A=j.transferImport.parse(E),M=A.mode==="replace"?"overwrite":"skip-duplicates",O=await N.import(A.payload,{mode:M});return F(B({imported:O.imported,skipped:O.skipped,mode:A.mode}))}catch(A){return F(Y("VALIDATION_ERROR","Invalid import arguments",String(A)))}}},"mem-maintenance":{description:"Run folder context maintenance \u2014 clean, rebuild, purge, or dry-run AGENTS.md files.",args:j.maintenance.shape,execute:async(E)=>{try{let A=j.maintenance.parse(E);if(A.action==="folderContextDryRun")return F(B(await N.maintainFolderContext("clean",!0)));if(A.action==="folderContextClean")return F(B(await N.maintainFolderContext("clean",!1)));if(A.action==="folderContextPurge")return F(B(await N.maintainFolderContext("purge",!1)));return F(B(await N.maintainFolderContext("rebuild",!1)))}catch(A){return F(Y("VALIDATION_ERROR","Invalid maintenance arguments",String(A)))}}},"mem-help":{description:"Show detailed memory workflow guidance including when to save, what to save, and memory type reference.",args:j.help.shape,execute:async()=>F(B({guide:N.guide()}))}}}import{generateText as OA}from"ai";function c(N){if(typeof N!=="object"||N===null)return!1;let E=N,A=E.status;if(A===429||A===500||A===503)return!0;let M=E.error;if(typeof M==="object"&&M!==null&&M.type==="overloaded_error")return!0;return!1}function H1(N){if(N&&typeof N==="object"){let E=N.status;if(typeof E==="number")return E===400||E===401||E===403}return!1}function i(N){return new Promise((E)=>setTimeout(E,N))}var tE=new Set(["decision","bugfix","feature","refactor","discovery","change"]);function L(N,E){let A=new RegExp(`<${E}[^>]*>([\\s\\S]*?)</${E}>`,"i"),M=N.match(A);return M?M[1].trim():""}function v(N,E){let A=new RegExp(`<${E}[^>]*>([\\s\\S]*?)</${E}>`,"gi"),M=[];for(let O of N.matchAll(A)){let $=O[1].trim();if($)M.push($)}return M}function rN(N){let E=L(N,"observation");if(!E)return null;let A=L(E,"type").toLowerCase(),M=tE.has(A)?A:"discovery",O=L(E,"title")||"Untitled observation",$=L(E,"subtitle"),V=L(E,"narrative"),_=v(L(E,"facts"),"fact"),S=v(L(E,"concepts"),"concept"),J=v(L(E,"files_read"),"file"),Q=v(L(E,"files_modified"),"file"),f=L(E,"importance"),W=Number.parseInt(f,10),X=Number.isNaN(W)?3:Math.max(1,Math.min(5,W));return{type:M,title:O,subtitle:$,facts:_,narrative:V,concepts:S,filesRead:J,filesModified:Q,importance:X}}function iN(N){let E=L(N,"session_summary");if(!E)return null;let A=L(E,"summary")||"No summary available",M=v(L(E,"key_decisions"),"decision"),O=v(L(E,"files_modified"),"file"),$=v(L(E,"concepts"),"concept"),V=L(E,"request")||void 0,_=L(E,"investigated")||void 0,S=L(E,"learned")||void 0,J=L(E,"completed")||void 0,Q=L(E,"next_steps")||void 0;return{summary:A,keyDecisions:M,filesModified:O,concepts:$,request:V,investigated:_,learned:S,completed:J,nextSteps:Q}}function dN(N){let E=L(N,"reranked");if(!E)return null;let A=v(E,"index");if(A.length===0)return null;let M=[];for(let O of A){let $=Number.parseInt(O,10);if(Number.isNaN($)||$<0)return null;M.push($)}return M}var aE=new Set(["new_fact","update","duplicate"]);function tN(N){let E=L(N,"evaluation");if(!E)return null;let A=L(E,"outcome").toLowerCase().trim();if(!aE.has(A))return null;let M=A,O=L(E,"reason");if(!O)return null;let $=L(E,"supersedes"),V={outcome:M,reason:O};if(M==="update"&&$)V.supersedesId=$;if(M==="update"&&!V.supersedesId)return null;return V}var sE=new Set(["technology","library","pattern","concept","file","person","project","other"]),oE=new Set(["uses","depends_on","implements","extends","related_to","replaces","configures"]);function aN(N){let E=L(N,"extraction");if(!E)return null;let A=L(E,"entities"),M=L(E,"relations"),O=v(A,"entity"),$=[];for(let S of O){let J=L(S,"name");if(!J)continue;let Q=L(S,"type").toLowerCase(),f=sE.has(Q)?Q:"other";$.push({name:J,entityType:f})}let V=v(M,"relation"),_=[];for(let S of V){let J=L(S,"source"),Q=L(S,"target"),f=L(S,"relationship").toLowerCase();if(!J||!Q||!f)continue;if(!oE.has(f))continue;_.push({sourceName:J,targetName:Q,relationship:f})}return{entities:$,relations:_}}function y(N){return Math.ceil(N.length/4)}function sN(N,E,A,M){let O=A?`<session_context>
8
+ ${A}
9
9
  </session_context>
10
10
 
11
- `:"";return`<task>
11
+ `:"",$=M?M.observationTypes.join("|"):"decision|bugfix|feature|refactor|discovery|change",_=(M?M.conceptVocabulary:["how-it-works","why-it-exists","what-changed","problem-solution","gotcha","pattern","trade-off"]).map((S)=>{let Q={"how-it-works":"Technical mechanisms and behaviors","why-it-exists":"Rationale and motivations","what-changed":"Modifications and their effects","problem-solution":"Issues encountered and how they were resolved",gotcha:"Surprising behaviors, edge cases, or pitfalls",pattern:"Recurring design patterns or approaches","trade-off":"Deliberate compromises between competing concerns",hypothesis:"Proposed explanations or predictions",finding:"Key results or discoveries",methodology:"Research methods and approaches",evidence:"Supporting data or observations",limitation:"Known constraints or boundaries",implication:"Consequences or downstream effects",comparison:"Similarities and differences between approaches"}[S];return Q?`- ${S}: ${Q}`:`- ${S}`}).join(`
12
+ `);return`<task>
12
13
  Analyze the following tool output and extract a structured observation.
13
14
  </task>
14
15
 
@@ -18,22 +19,16 @@ Analyze the following tool output and extract a structured observation.
18
19
  ${E}
19
20
  </tool_output>
20
21
 
21
- ${M}<instructions>
22
+ ${O}<instructions>
22
23
  Extract a structured observation from the tool output. Determine the most appropriate type and provide a concise but informative summary.
23
24
 
24
25
  When extracting concepts, prefer established vocabulary where appropriate:
25
- - how-it-works: Technical mechanisms and behaviors
26
- - why-it-exists: Rationale and motivations
27
- - what-changed: Modifications and their effects
28
- - problem-solution: Issues encountered and how they were resolved
29
- - gotcha: Surprising behaviors, edge cases, or pitfalls
30
- - pattern: Recurring design patterns or approaches
31
- - trade-off: Deliberate compromises between competing concerns
26
+ ${_}
32
27
  You may also use any domain-specific concepts relevant to the observation.
33
28
 
34
29
  Respond with EXACTLY this XML format:
35
30
  <observation>
36
- <type>decision|bugfix|feature|refactor|discovery|change</type>
31
+ <type>${$}</type>
37
32
  <title>Brief descriptive title (max 80 chars)</title>
38
33
  <subtitle>One-line elaboration</subtitle>
39
34
  <importance>1-5 (1=trivial/routine, 2=low, 3=normal, 4=significant, 5=critical decision or discovery)</importance>
@@ -53,7 +48,7 @@ Respond with EXACTLY this XML format:
53
48
  <file>path/to/file/modified</file>
54
49
  </files_modified>
55
50
  </observation>
56
- </instructions>`}function pN(N,E){let O=N.map((M,A)=>` <obs index="${A+1}" type="${M.type}">
51
+ </instructions>`}function oN(N,E){let A=N.map((M,O)=>` <obs index="${O+1}" type="${M.type}">
57
52
  <title>${M.title}</title>
58
53
  <narrative>${M.narrative}</narrative>
59
54
  </obs>`).join(`
@@ -64,7 +59,7 @@ Summarize the following coding session based on its observations.
64
59
  <session_id>${E}</session_id>
65
60
 
66
61
  <observations>
67
- ${O}
62
+ ${A}
68
63
  </observations>
69
64
 
70
65
  <instructions>
@@ -88,7 +83,7 @@ Respond with EXACTLY this XML format:
88
83
  <concept>key-concept</concept>
89
84
  </concepts>
90
85
  </session_summary>
91
- </instructions>`}function nN(N,E){let O=E.map((M)=>` <candidate id="${M.id}">
86
+ </instructions>`}function eN(N,E){let A=E.map((M)=>` <candidate id="${M.id}">
92
87
  <title>${M.title}</title>
93
88
  <narrative>${M.narrative}</narrative>
94
89
  <concepts>${M.concepts.join(", ")}</concepts>
@@ -102,7 +97,7 @@ Respond with EXACTLY this XML format:
102
97
  <type>${N.type}</type>
103
98
  </new_observation>
104
99
  <existing_candidates>
105
- ${O}
100
+ ${A}
106
101
  </existing_candidates>
107
102
  <instructions>
108
103
  Evaluate whether the new observation represents:
@@ -117,22 +112,22 @@ Respond with EXACTLY this XML format:
117
112
  <reason>Brief explanation</reason>
118
113
  </evaluation>
119
114
  </instructions>
120
- </conflict_evaluation>`}function rN(N){let E=[...N.filesRead,...N.filesModified];return`<entity_extraction>
115
+ </conflict_evaluation>`}function N2(N,E){let A=[...N.filesRead,...N.filesModified],M=E?E.entityTypes.join(", "):"technology, library, pattern, concept, file, person, project, other",O=E?E.relationshipTypes.join(", "):"uses, depends_on, implements, extends, related_to, replaces, configures";return`<entity_extraction>
121
116
  <observation>
122
117
  <title>${N.title}</title>
123
118
  <type>${N.type}</type>
124
119
  <narrative>${N.narrative}</narrative>
125
120
  <facts>${N.facts.join(`
126
121
  `)}</facts>
127
- <files>${E.join(`
122
+ <files>${A.join(`
128
123
  `)}</files>
129
124
  <concepts>${N.concepts.join(", ")}</concepts>
130
125
  </observation>
131
126
  <instructions>
132
127
  Extract entities and relationships from this observation.
133
128
 
134
- Entity types: technology, library, pattern, concept, file, person, project, other
135
- Relationship types: uses, depends_on, implements, extends, related_to, replaces, configures
129
+ Entity types: ${M}
130
+ Relationship types: ${O}
136
131
 
137
132
  Extract entities that are clearly mentioned or strongly implied. For example, "React hooks" implies a relationship between React and hooks. Do not extract speculative relationships.
138
133
  Respond with EXACTLY this XML format:
@@ -146,11 +141,11 @@ Respond with EXACTLY this XML format:
146
141
  </relations>
147
142
  </extraction>
148
143
  </instructions>
149
- </entity_extraction>`}function iN(N,E){let O=E.map((M,A)=>` <candidate index="${A}"><title>${M.title}</title><narrative>${M.narrative}</narrative></candidate>`).join(`
144
+ </entity_extraction>`}function E2(N,E){let A=E.map((M,O)=>` <candidate index="${O}"><title>${M.title}</title><narrative>${M.narrative}</narrative></candidate>`).join(`
150
145
  `);return`<rerank_request>
151
146
  <query>${N}</query>
152
147
  <candidates>
153
- ${O}
148
+ ${A}
154
149
  </candidates>
155
150
  <instructions>Reorder the candidates by relevance to the query. Return indices from most to least relevant.
156
151
 
@@ -161,63 +156,63 @@ Respond with EXACTLY this XML format:
161
156
  <index>0</index>
162
157
  </reranked>
163
158
  </instructions>
164
- </rerank_request>`}class Y1{specificationVersion;provider;modelId;supportedUrls;providers;constructor(N){if(N.length===0)throw Error("At least one provider required");let E=N[0].model;this.specificationVersion=E.specificationVersion,this.provider=E.provider,this.modelId=E.modelId,this.supportedUrls=E.supportedUrls,this.providers=N}async doGenerate(N){let E;for(let O=0;O<this.providers.length;O++){let M=this.providers[O];try{return await M.model.doGenerate(N)}catch(A){if(E=A,R1(A))throw A;if(h(A)&&O<this.providers.length-1){let $=this.providers[O+1],_=A.status??"unknown";console.error(`[open-mem] Provider ${M.name} failed (${_}), falling over to ${$.name}`);continue}throw A}}throw E}async doStream(N){let E;for(let O=0;O<this.providers.length;O++){let M=this.providers[O];try{return await M.model.doStream(N)}catch(A){if(E=A,R1(A))throw A;if(h(A)&&O<this.providers.length-1){let $=this.providers[O+1],_=A.status??"unknown";console.error(`[open-mem] Provider ${M.name} failed (${_}), falling over to ${$.name}`);continue}throw A}}throw E}}var c2={"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 l2(N){if(N.includes("."))return N;return c2[N]||`us.anthropic.${N}-v1:0`}function dN(N){switch(N.provider){case"anthropic":{let{createAnthropic:E}=q("@ai-sdk/anthropic");return E({apiKey:N.apiKey})(N.model)}case"bedrock":{let{createAmazonBedrock:E}=q("@ai-sdk/amazon-bedrock");return E()(l2(N.model))}case"openai":{let{createOpenAI:E}=q("@ai-sdk/openai");return E({apiKey:N.apiKey})(N.model)}case"google":{let{createGoogleGenerativeAI:E}=q("@ai-sdk/google");return E({apiKey:N.apiKey})(N.model)}case"openrouter":{let{createOpenRouter:E}=q("@openrouter/ai-sdk-provider");return E({apiKey:N.apiKey})(N.model)}default:throw Error(`Unknown provider: ${N.provider}. Supported: anthropic, bedrock, openai, google, openrouter`)}}function tN(N){try{switch(N.provider){case"google":{let{createGoogleGenerativeAI:E}=q("@ai-sdk/google");return E({apiKey:N.apiKey}).embedding("text-embedding-004")}case"openai":{let{createOpenAI:E}=q("@ai-sdk/openai");return E({apiKey:N.apiKey}).embedding("text-embedding-3-small")}case"bedrock":{let{createAmazonBedrock:E}=q("@ai-sdk/amazon-bedrock");return E().embedding("amazon.titan-embed-text-v2:0")}case"anthropic":return null;case"openrouter":return null;default:return null}}catch{return null}}var b2={google:"gemini-2.5-flash-lite",anthropic:"claude-sonnet-4-20250514",openai:"gpt-4o-mini",bedrock:"us.anthropic.claude-3-5-haiku-20241022-v1:0",openrouter:"google/gemini-2.5-flash-lite"};function p2(N){switch(N){case"google":return process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;case"anthropic":return process.env.ANTHROPIC_API_KEY;case"openai":return process.env.OPENAI_API_KEY;case"openrouter":return process.env.OPENROUTER_API_KEY;case"bedrock":return;default:return}}function x(N){if(!N.fallbackProviders||N.fallbackProviders.length===0)return[];return N.fallbackProviders.map((E)=>({provider:E,model:b2[E]??"gemini-2.5-flash-lite",apiKey:p2(E)}))}function v(N,E=[]){let O=dN(N);if(E.length===0)return O;let M=[{name:N.provider,model:O},...E.map((A)=>({name:A.provider,model:dN(A)}))];return new Y1(M)}var n2={"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},aN=0;async function u(N,E){if(!E)return;let O=n2[N]||5,M=Math.ceil(60000/O)+100,$=Date.now()-aN;if($<M){let _=M-$;await new Promise((S)=>setTimeout(S,_))}aN=Date.now()}class B0{model;config;_generate=r2;constructor(N){this.config=N,this.model=null;let E=N.provider!=="bedrock";if(N.compressionEnabled&&(!E||N.apiKey))try{this.model=v({provider:N.provider,model:N.model,apiKey:N.apiKey},x(N))}catch{}}static MAX_INPUT_LENGTH=50000;async compress(N,E,O){if(!this.config.compressionEnabled||!this.model)return null;if(E.length<this.config.minOutputLength)return null;let M=y(E),A=E.length>B0.MAX_INPUT_LENGTH?`${E.substring(0,B0.MAX_INPUT_LENGTH)}
165
-
166
- [... truncated ...]`:E,$=bN(N,A,O),_=2;for(let S=0;S<=_;S++)try{if(this.config.provider==="google")await u(this.config.model,this.config.rateLimitingEnabled);let{text:V}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:$}),f=mN(V);if(f)f.discoveryTokens=M;return f}catch(V){if(h(V)&&S<_){let f=2**S*1000;await r(f);continue}return null}return null}async compressBatch(N){let E=new Map;for(let O=0;O<N.length;O++){let M=N[O],A=await this.compress(M.toolName,M.toolOutput,M.sessionContext);if(E.set(M.callId,A),O<N.length-1)await r(200)}return E}createFallbackObservation(N,E){let O=t2(E),M=i2[N]??"discovery";return{type:M,title:`${N} execution`,subtitle:E.substring(0,100).replace(/\n/g," "),facts:[],narrative:`Tool ${N} was executed. Output length: ${E.length} chars.`,concepts:[],filesRead:M==="discovery"?O:[],filesModified:M==="change"?O:[],discoveryTokens:y(E),importance:2}}async isAvailable(){if(!this.model)return!1;try{return await this._generate({model:this.model,maxOutputTokens:10,prompt:"ping"}),!0}catch{return!1}}}var i2={Read:"discovery",Write:"change",Edit:"change",Bash:"change",Glob:"discovery",Grep:"discovery"},d2=/(?:^|\s)((?:\.\/|\/|src\/|tests\/|lib\/)\S+\.\w+)/gm;function t2(N){let E=[];for(let O of N.matchAll(d2))E.push(O[1]);return[...new Set(E)]}import{generateText as a2}from"ai";class L1{model;config;_generate=a2;constructor(N){if(this.config=N,this.model=null,N.provider==="bedrock"||N.apiKey)try{this.model=v({provider:N.provider,model:N.model,apiKey:N.apiKey},x(N))}catch{}}async evaluate(N,E){if(!this.model||E.length===0)return null;let O=nN(N,E),M=2;for(let A=0;A<=M;A++)try{if(this.config.provider==="google")await u(this.config.model,this.config.rateLimitingEnabled);let{text:$}=await this._generate({model:this.model,maxOutputTokens:512,prompt:O});return cN($)}catch($){if(h($)&&A<M){let _=2**A*1000;await r(_);continue}return null}return null}}import{generateText as s2}from"ai";class z1{model;config;_generate=s2;constructor(N){if(this.config=N,this.model=null,N.provider==="bedrock"||N.apiKey)try{this.model=v({provider:N.provider,model:N.model,apiKey:N.apiKey},x(N))}catch{}}async extract(N){if(!this.model)return null;let E=rN(N),O=2;for(let M=0;M<=O;M++)try{if(this.config.provider==="google")await u(this.config.model,this.config.rateLimitingEnabled);let{text:A}=await this._generate({model:this.model,maxOutputTokens:1024,prompt:E});return lN(A)}catch(A){if(h(A)&&M<O){let $=2**M*1000;await r($);continue}return null}return null}}import{generateText as o2}from"ai";class C1{model;config;_generate=o2;constructor(N){this.config=N,this.model=null;let E=N.provider!=="bedrock";if(N.compressionEnabled&&(!E||N.apiKey))try{this.model=v({provider:N.provider,model:N.model,apiKey:N.apiKey},x(N))}catch{}}async summarize(N,E){if(E.length===0)return null;if(!this.config.compressionEnabled||!this.model)return this.createFallbackSummary(E);let O=pN(E.map((M)=>({type:M.type,title:M.title,narrative:M.narrative})),N);try{if(this.config.provider==="google")await u(this.config.model,this.config.rateLimitingEnabled);let{text:M}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:O}),A=gN(M);if(!A)return this.createFallbackSummary(E);return A}catch{return this.createFallbackSummary(E)}}createFallbackSummary(N){let E=new Set,O=new Set,M=[];for(let S of N){for(let V of S.filesModified)E.add(V);for(let V of S.concepts)O.add(V);if(S.type==="decision")M.push(S.title)}let A=new Map;for(let S of N)A.set(S.type,(A.get(S.type)??0)+1);let $=Array.from(A.entries()).map(([S,V])=>`${V} ${S}${V>1?"s":""}`).join(", "),_=Array.from(O).slice(0,5).join(", ");return{summary:`Session with ${N.length} observations: ${$}. Files modified: ${E.size}. Key concepts: ${_}.`,keyDecisions:M.slice(0,5),filesModified:Array.from(E),concepts:Array.from(O)}}shouldSummarize(N){return N>=2}}f1();import{randomUUID as QE}from"crypto";var e2={showTokenCosts:!0,observationTypes:"all",fullObservationCount:3,showLastSummary:!0},U0={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"};function P0(N,E=e2){let O=[];if(O.push("## open-mem: Past Session Memory"),O.push(""),O.push("**\uD83D\uDCA1 Progressive Disclosure:** This is a compact index showing WHAT was observed and retrieval COST."),O.push("Use `mem-find` to find observations by query, then `mem-get` with IDs to fetch full details."),O.push(""),O.push("**3-Layer Memory Access:**"),O.push("- **Layer 1** `mem-find` \u2014 Find observations by query (returns IDs + summaries)"),O.push("- **Layer 2** `mem-history` \u2014 Browse session history and drill into sessions"),O.push("- **Layer 3** `mem-get` \u2014 Get full details by ID (use IDs from search results or the index below)"),O.push(""),O.push("**\uD83D\uDCDD When to Save (`mem-create`):** Proactively save decisions + rationale, non-obvious gotchas/workarounds, user preferences, and cross-session plans. Auto-capture handles tool executions \u2014 use `mem-create` for insights auto-capture can't understand the significance of. Wrap sensitive content in `<private>` tags to exclude from memory. Call `mem-help` for detailed guidance."),E.showLastSummary&&N.recentSummaries.length>0){O.push(""),O.push("### Recent Sessions"),O.push("| Session | Summary | Decisions |"),O.push("|---------|---------|-----------|");for(let _ of N.recentSummaries){let S=_.keyDecisions.length>0?_.keyDecisions.join("; "):"\u2014";O.push(`| ${_.sessionId} | ${_.summary} | ${S} |`)}}let M=E.observationTypes==="all"?N.observationIndex:N.observationIndex.filter((_)=>E.observationTypes.includes(_.type));if(M.length>0){O.push(""),O.push(`### Recent Observations (${M.length} entries)`);let _=EO(M,N.fullObservations);for(let[S,V]of _){if(O.push(""),O.push(`**${S}**`),E.showTokenCosts)O.push("| ID | Type | Title | ~Tokens |"),O.push("|----|------|-------|---------|");else O.push("| ID | Type | Title |"),O.push("|----|------|-------|");for(let f of V){let J=U0[f.type]||"\uD83D\uDCDD";if(E.showTokenCosts)O.push(`| ${f.id} | ${J} | ${f.title} | ~${f.tokenCount} |`);else O.push(`| ${f.id} | ${J} | ${f.title} |`)}}}let A=N.fullObservations.slice(0,E.fullObservationCount);if(A.length>0){O.push(""),O.push("### Full Details (most recent)");for(let _ of A){let S=U0[_.type]||"\uD83D\uDCDD";if(O.push(""),O.push(`#### ${S} ${_.title} (${_.id})`),O.push(_.narrative),_.facts.length>0)O.push(`**Facts:** ${_.facts.map((f)=>`- ${f}`).join(" ")}`);if(_.concepts.length>0)O.push(`**Concepts:** ${_.concepts.join(", ")}`);let V=[..._.filesRead,..._.filesModified];if(V.length>0)O.push(`**Files:** ${V.join(", ")}`)}}let $=NO(N);if($)O.push(""),O.push($);return O.join(`
167
- `)}function NO(N){let E=0,O=0,M=new Set(N.observationIndex.map((_)=>_.id));for(let _ of N.observationIndex)E+=_.tokenCount,O+=_.discoveryTokens;for(let _ of N.fullObservations)if(!M.has(_.id))E+=_.tokenCount,O+=_.discoveryTokens;if(O===0)return null;let A=O-E,$=Math.max(0,Math.round(A/O*100));return`### \uD83D\uDCB0 Memory Economics
168
- **Read cost:** ~${E}t | **Discovery cost:** ~${O}t | **Savings:** ${$}% (${A}t saved)`}function EO(N,E){let O=new Map;for(let A of E){let $=A.filesModified[0]||A.filesRead[0];if($)O.set(A.id,$)}let M=new Map;for(let A of N){let $=O.get(A.id)??"General",_=M.get($)??[];_.push(A),M.set($,_)}return M}function x0(N){let E=[];if(E.push("[open-mem] Memory context:"),N.recentSummaries.length>0){E.push(`
169
- Recent sessions:`);for(let O of N.recentSummaries)E.push(`- ${O.summary}`)}if(N.observationIndex.length>0){E.push(`
170
- Recent observations (${N.observationIndex.length} entries):`);for(let O of N.observationIndex)E.push(`- ${U0[O.type]||"\uD83D\uDCDD"} ${O.title}`)}return E.join(`
171
- `)}function v0(N,E){if(N.length===0)return"";let O=E,M=[];for(let $ of N){let _=$.tokenCount||y($.title);if(O-_<0)break;M.push($),O-=_}if(M.length===0)return"";let A=[];A.push("### Cross-Project Memory"),A.push(""),A.push("| ID | Type | Title | ~Tokens |"),A.push("|----|------|-------|---------|");for(let $ of M){let _=U0[$.type]||"\uD83D\uDCDD";A.push(`| ${$.id} | ${_} | ${$.title} | ~${$.tokenCount} |`)}return A.join(`
172
- `)}function u0(N,E){if(N.length===0)return"";let O=E,M=[];for(let $ of N){let _=$.tokenCount||y($.title);if(O-_<0)break;M.push($),O-=_}if(M.length===0)return"";let A=[];A.push(`
173
- Cross-project observations (${M.length} entries):`);for(let $ of M)A.push(`- ${U0[$.type]||"\uD83D\uDCDD"} ${$.title}`);return A.join(`
174
- `)}var m0={recency:0.4,typeImportance:0.3,sessionAffinity:0.2,tokenEfficiency:0.1},OO={decision:1,bugfix:0.9,feature:0.8,refactor:0.6,discovery:0.5,change:0.4};function MO(N,E){let O=new Date(N),A=(E.getTime()-O.getTime())/3600000;if(A<0)return 1;if(A<24)return 1;if(A<48)return 0.8;if(A<168)return 0.5;return 0.2}function AO(N){return OO[N]??0.3}function $O(N,E){if(!E)return 0.5;return N===E?1:0.3}function SO(N){if(N<=10)return 1;if(N>=200)return 0.2;return 1-(N-10)/190*0.8}function _O(N,E){let O=MO(N.createdAt,E.now),M=AO(N.type),A=$O(N.sessionId,E.currentSessionId),$=SO(N.tokenCount);return O*m0.recency+M*m0.typeImportance+A*m0.sessionAffinity+$*m0.tokenEfficiency}function sN(N,E){let O=new Map;for(let M of N)O.set(M.id,_O(M,E));return[...N].sort((M,A)=>{let $=O.get(M.id)??0,_=O.get(A.id)??0;if(_!==$)return _-$;return new Date(A.createdAt).getTime()-new Date(M.createdAt).getTime()})}function E0(N,E,O,M,A=[],$){let _=M,S=[],V=[];for(let J of E){let Q=J.tokenCount||y(J.summary);if(_-Q<0)break;S.push(J),_-=Q}let f=$?sN(O,$):O;for(let J of f){let Q=J.tokenCount||y(J.title);if(_-Q<0)break;V.push(J),_-=Q}return{recentSummaries:S,observationIndex:V,fullObservations:[...A],totalTokens:M-_}}import{existsSync as T1}from"fs";import{readdir as KO,readFile as AE,unlink as I1,writeFile as $E}from"fs/promises";import{join as k1,resolve as w1}from"path";import{existsSync as eN}from"fs";import{mkdir as VO,readFile as fO,rename as JO,unlink as QO,writeFile as WO}from"fs/promises";import{dirname as g0,isAbsolute as F1,join as Z0,normalize as XO,relative as j1,resolve as M0,sep as G1}from"path";var O0="<!-- open-mem-context -->",i="<!-- /open-mem-context -->",NE={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"},oN=new Map,DO=new Set(["node_modules",".git","dist","coverage",".open-mem","build","__pycache__",".next",".nuxt"]);async function h0(N,E,O){if(E.length===0)return;if(O.mode==="single")return BO(N,E,O);let{maxDepth:M,filename:A}=O,$=[];for(let V of E){for(let f of V.filesModified)$.push(f);for(let f of V.filesRead)$.push(f)}let _=OE($,N,M);if(_.size===0)return;let S=ME(E,_,N);for(let[V,f]of S)try{let J=UO(V,f,N);await EE(V,J,A)}catch(J){console.error(`[open-mem] Failed to update AGENTS.md in ${V}:`,J)}}async function BO(N,E,O){let{maxDepth:M,filename:A}=O,$=E.filter(H1);if($.length===0)return;let _=[];for(let X of $){for(let Z of X.filesModified)_.push(Z);for(let Z of X.filesRead)_.push(Z)}let S=OE(_,N,M),V=ME($,S,N),f=$.filter((X)=>{return[...X.filesModified,...X.filesRead].some((D)=>{if(!D)return!1;let K=F1(D)?D:Z0(N,D);return M0(g0(K))===M0(N)})});if(f.length>0)V.set(M0(N),f);if(V.size===0)return;let J=[];J.push("## Project Activity (auto-generated by open-mem)"),J.push("");let Q=[...V.entries()].map(([X,Z])=>({relPath:j1(N,X)||".",observations:Z})).sort((X,Z)=>X.relPath.localeCompare(Z.relPath));for(let{relPath:X,observations:Z}of Q){let D=Z.filter(H1).sort((z,G)=>G.createdAt.localeCompare(z.createdAt)).slice(0,10);if(D.length===0)continue;J.push(`### ${X}/`),J.push("| ID | Type | Title | Date |"),J.push("|----|------|-------|------|");for(let z of D){let G=NE[z.type]||"\uD83D\uDCDD",F=z.createdAt.split("T")[0],s=z.title.replace(/\|/g,"\\|");J.push(`| ${z.id} | ${G} ${z.type} | ${s} | ${F} |`)}let K=new Set;for(let z of D)for(let G of z.concepts)K.add(G);if(K.size>0){let z=[...K].slice(0,10).join(", ");J.push(""),J.push(`**Key concepts:** ${z}`)}let L=D.filter((z)=>z.type==="decision").map((z)=>z.title);if(L.length>0)J.push(""),J.push(`**Recent decisions:** ${L.slice(0,5).join("; ")}`);J.push("")}J.push("\uD83D\uDCA1 *Use `mem-find` to search full details. Use `mem-create` to save important decisions.*");let W=J.join(`
175
- `);await EE(N,W,A)}function H1(N){return!/^\w[\w-]*\s+execution$/i.test(N.title)}function UO(N,E,O){let M=[...E].filter(H1).sort((f,J)=>J.createdAt.localeCompare(f.createdAt)).slice(0,10),A=j1(O,N)||".",$=[];$.push(`## Recent Activity in \`${A}/\` (auto-generated by open-mem)`),$.push(""),$.push("| ID | Type | Title | Date |"),$.push("|----|------|-------|------|");for(let f of M){let J=NE[f.type]||"\uD83D\uDCDD",Q=f.createdAt.split("T")[0],W=f.title.replace(/\|/g,"\\|");$.push(`| ${f.id} | ${J} ${f.type} | ${W} | ${Q} |`)}let _=new Set;for(let f of M)for(let J of f.concepts)_.add(J);if(_.size>0){let f=[..._].slice(0,10).join(", ");$.push(""),$.push(`**Key concepts:** ${f}`)}let S=M.filter((f)=>f.type==="decision").map((f)=>f.title);if(S.length>0)$.push(""),$.push(`**Recent decisions:** ${S.slice(0,5).join("; ")}`);let V=M.filter((f)=>f.type==="decision"&&f.narrative).slice(0,3);if(V.length>0){$.push(""),$.push("**Decision details:**");for(let f of V){let J=f.narrative.split(/[.!?]\s/)[0],Q=J.length>120?`${J.slice(0,117)}...`:J;$.push(`- \u2696\uFE0F ${f.title}: ${Q}`)}}return $.push(""),$.push("\uD83D\uDCA1 *Use `mem-find` to search full details across all sessions. Use `mem-create` to save important decisions.*"),$.join(`
176
- `)}async function EE(N,E,O){if(!eN(N))return;let A=(oN.get(N)??Promise.resolve()).then(async()=>{let $=Z0(N,O),_=Z0(N,`.${O}.tmp`),S="";try{S=await fO($,"utf-8")}catch{}let V=ZO(S,E);try{await VO(g0(_),{recursive:!0}),await WO(_,V,"utf-8"),await JO(_,$)}catch(f){try{await QO(_)}catch{}throw f}});return oN.set(N,A.catch(()=>{})),A}function ZO(N,E){if(!N)return`${O0}
159
+ </rerank_request>`}class C1{specificationVersion;provider;modelId;supportedUrls;providers;constructor(N){if(N.length===0)throw Error("At least one provider required");let E=N[0].model;this.specificationVersion=E.specificationVersion,this.provider=E.provider,this.modelId=E.modelId,this.supportedUrls=E.supportedUrls,this.providers=N}async doGenerate(N){let E;for(let A=0;A<this.providers.length;A++){let M=this.providers[A];try{return await M.model.doGenerate(N)}catch(O){if(E=O,H1(O))throw O;if(c(O)&&A<this.providers.length-1){let $=this.providers[A+1],V=O.status??"unknown";console.error(`[open-mem] Provider ${M.name} failed (${V}), falling over to ${$.name}`);continue}throw O}}throw E}async doStream(N){let E;for(let A=0;A<this.providers.length;A++){let M=this.providers[A];try{return await M.model.doStream(N)}catch(O){if(E=O,H1(O))throw O;if(c(O)&&A<this.providers.length-1){let $=this.providers[A+1],V=O.status??"unknown";console.error(`[open-mem] Provider ${M.name} failed (${V}), falling over to ${$.name}`);continue}throw O}}throw E}}var eE={"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 NA(N){if(N.includes("."))return N;return eE[N]||`us.anthropic.${N}-v1:0`}function A2(N){switch(N.provider){case"anthropic":{let{createAnthropic:E}=x("@ai-sdk/anthropic");return E({apiKey:N.apiKey})(N.model)}case"bedrock":{let{createAmazonBedrock:E}=x("@ai-sdk/amazon-bedrock");return E()(NA(N.model))}case"openai":{let{createOpenAI:E}=x("@ai-sdk/openai");return E({apiKey:N.apiKey})(N.model)}case"google":{let{createGoogleGenerativeAI:E}=x("@ai-sdk/google");return E({apiKey:N.apiKey})(N.model)}case"openrouter":{let{createOpenRouter:E}=x("@openrouter/ai-sdk-provider");return E({apiKey:N.apiKey})(N.model)}default:throw Error(`Unknown provider: ${N.provider}. Supported: anthropic, bedrock, openai, google, openrouter`)}}function M2(N){try{switch(N.provider){case"google":{let{createGoogleGenerativeAI:E}=x("@ai-sdk/google");return E({apiKey:N.apiKey}).embedding("text-embedding-004")}case"openai":{let{createOpenAI:E}=x("@ai-sdk/openai");return E({apiKey:N.apiKey}).embedding("text-embedding-3-small")}case"bedrock":{let{createAmazonBedrock:E}=x("@ai-sdk/amazon-bedrock");return E().embedding("amazon.titan-embed-text-v2:0")}case"anthropic":return null;case"openrouter":return null;default:return null}}catch{return null}}var EA={google:"gemini-2.5-flash-lite",anthropic:"claude-sonnet-4-20250514",openai:"gpt-4o-mini",bedrock:"us.anthropic.claude-3-5-haiku-20241022-v1:0",openrouter:"google/gemini-2.5-flash-lite"};function AA(N){switch(N){case"google":return process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;case"anthropic":return process.env.ANTHROPIC_API_KEY;case"openai":return process.env.OPENAI_API_KEY;case"openrouter":return process.env.OPENROUTER_API_KEY;case"bedrock":return;default:return}}function u(N){if(!N.fallbackProviders||N.fallbackProviders.length===0)return[];return N.fallbackProviders.map((E)=>({provider:E,model:EA[E]??"gemini-2.5-flash-lite",apiKey:AA(E)}))}function m(N,E=[]){let A=A2(N);if(E.length===0)return A;let M=[{name:N.provider,model:A},...E.map((O)=>({name:O.provider,model:A2(O)}))];return new C1(M)}var MA={"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},O2=0;async function g(N,E){if(!E)return;let A=MA[N]||5,M=Math.ceil(60000/A)+100,$=Date.now()-O2;if($<M){let V=M-$;await new Promise((_)=>setTimeout(_,V))}O2=Date.now()}class K0{model;config;_generate=OA;constructor(N){this.config=N,this.model=null;let E=N.provider!=="bedrock";if(N.compressionEnabled&&(!E||N.apiKey))try{this.model=m({provider:N.provider,model:N.model,apiKey:N.apiKey},u(N))}catch{}}static MAX_INPUT_LENGTH=50000;async compress(N,E,A){if(!this.config.compressionEnabled||!this.model)return null;if(E.length<this.config.minOutputLength)return null;let M=y(E),O=E.length>K0.MAX_INPUT_LENGTH?`${E.substring(0,K0.MAX_INPUT_LENGTH)}
160
+
161
+ [... truncated ...]`:E,$=sN(N,O,A),V=2;for(let _=0;_<=V;_++)try{if(this.config.provider==="google")await g(this.config.model,this.config.rateLimitingEnabled);let{text:S}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:$}),J=rN(S);if(J)J.discoveryTokens=M;return J}catch(S){if(c(S)&&_<V){let J=2**_*1000;await i(J);continue}return null}return null}async compressBatch(N){let E=new Map;for(let A=0;A<N.length;A++){let M=N[A],O=await this.compress(M.toolName,M.toolOutput,M.sessionContext);if(E.set(M.callId,O),A<N.length-1)await i(200)}return E}createFallbackObservation(N,E){let A=VA(E),M=$A[N]??"discovery";return{type:M,title:`${N} execution`,subtitle:E.substring(0,100).replace(/\n/g," "),facts:[],narrative:`Tool ${N} was executed. Output length: ${E.length} chars.`,concepts:[],filesRead:M==="discovery"?A:[],filesModified:M==="change"?A:[],discoveryTokens:y(E),importance:2}}async isAvailable(){if(!this.model)return!1;try{return await this._generate({model:this.model,maxOutputTokens:10,prompt:"ping"}),!0}catch{return!1}}}var $A={Read:"discovery",Write:"change",Edit:"change",Bash:"change",Glob:"discovery",Grep:"discovery"},_A=/(?:^|\s)((?:\.\/|\/|src\/|tests\/|lib\/)\S+\.\w+)/gm;function VA(N){let E=[];for(let A of N.matchAll(_A))E.push(A[1]);return[...new Set(E)]}import{generateText as SA}from"ai";class F1{model;config;_generate=SA;constructor(N){if(this.config=N,this.model=null,N.provider==="bedrock"||N.apiKey)try{this.model=m({provider:N.provider,model:N.model,apiKey:N.apiKey},u(N))}catch{}}async evaluate(N,E){if(!this.model||E.length===0)return null;let A=eN(N,E),M=2;for(let O=0;O<=M;O++)try{if(this.config.provider==="google")await g(this.config.model,this.config.rateLimitingEnabled);let{text:$}=await this._generate({model:this.model,maxOutputTokens:512,prompt:A});return tN($)}catch($){if(c($)&&O<M){let V=2**O*1000;await i(V);continue}return null}return null}}import{generateText as JA}from"ai";class j1{model;config;_generate=JA;constructor(N){if(this.config=N,this.model=null,N.provider==="bedrock"||N.apiKey)try{this.model=m({provider:N.provider,model:N.model,apiKey:N.apiKey},u(N))}catch{}}async extract(N){if(!this.model)return null;let E=N2(N),A=2;for(let M=0;M<=A;M++)try{if(this.config.provider==="google")await g(this.config.model,this.config.rateLimitingEnabled);let{text:O}=await this._generate({model:this.model,maxOutputTokens:1024,prompt:E});return aN(O)}catch(O){if(c(O)&&M<A){let $=2**M*1000;await i($);continue}return null}return null}}import{generateText as QA}from"ai";class y1{model;config;_generate=QA;constructor(N){this.config=N,this.model=null;let E=N.provider!=="bedrock";if(N.compressionEnabled&&(!E||N.apiKey))try{this.model=m({provider:N.provider,model:N.model,apiKey:N.apiKey},u(N))}catch{}}async summarize(N,E){if(E.length===0)return null;if(!this.config.compressionEnabled||!this.model)return this.createFallbackSummary(E);let A=oN(E.map((M)=>({type:M.type,title:M.title,narrative:M.narrative})),N);try{if(this.config.provider==="google")await g(this.config.model,this.config.rateLimitingEnabled);let{text:M}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:A}),O=iN(M);if(!O)return this.createFallbackSummary(E);return O}catch{return this.createFallbackSummary(E)}}createFallbackSummary(N){let E=new Set,A=new Set,M=[];for(let _ of N){for(let S of _.filesModified)E.add(S);for(let S of _.concepts)A.add(S);if(_.type==="decision")M.push(_.title)}let O=new Map;for(let _ of N)O.set(_.type,(O.get(_.type)??0)+1);let $=Array.from(O.entries()).map(([_,S])=>`${S} ${_}${S>1?"s":""}`).join(", "),V=Array.from(A).slice(0,5).join(", ");return{summary:`Session with ${N.length} observations: ${$}. Files modified: ${E.size}. Key concepts: ${V}.`,keyDecisions:M.slice(0,5),filesModified:Array.from(E),concepts:Array.from(A)}}shouldSummarize(N){return N>=2}}U1();import{randomUUID as Y2}from"crypto";var fA={showTokenCosts:!0,observationTypes:"all",fullObservationCount:3,showLastSummary:!0},B0={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"};function v0(N,E=fA){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 `mem-find` to find observations by query, then `mem-get` with IDs to fetch full details."),A.push(""),A.push("**3-Layer Memory Access:**"),A.push("- **Layer 1** `mem-find` \u2014 Find observations by query (returns IDs + summaries)"),A.push("- **Layer 2** `mem-history` \u2014 Browse session history and drill into sessions"),A.push("- **Layer 3** `mem-get` \u2014 Get full details by ID (use IDs from search results or the index below)"),A.push(""),A.push("**\uD83D\uDCDD When to Save (`mem-create`):** Proactively save decisions + rationale, non-obvious gotchas/workarounds, user preferences, and cross-session plans. Auto-capture handles tool executions \u2014 use `mem-create` for insights auto-capture can't understand the significance of. Wrap sensitive content in `<private>` tags to exclude from memory. Call `mem-help` for detailed guidance."),E.showLastSummary&&N.recentSummaries.length>0){A.push(""),A.push("### Recent Sessions"),A.push("| Session | Summary | Decisions |"),A.push("|---------|---------|-----------|");for(let V of N.recentSummaries){let _=V.keyDecisions.length>0?V.keyDecisions.join("; "):"\u2014";A.push(`| ${V.sessionId} | ${V.summary} | ${_} |`)}}let M=E.observationTypes==="all"?N.observationIndex:N.observationIndex.filter((V)=>E.observationTypes.includes(V.type));if(M.length>0){A.push(""),A.push(`### Recent Observations (${M.length} entries)`);let V=XA(M,N.fullObservations);for(let[_,S]of V){if(A.push(""),A.push(`**${_}**`),E.showTokenCosts)A.push("| ID | Type | Title | ~Tokens |"),A.push("|----|------|-------|---------|");else A.push("| ID | Type | Title |"),A.push("|----|------|-------|");for(let J of S){let Q=B0[J.type]||"\uD83D\uDCDD";if(E.showTokenCosts)A.push(`| ${J.id} | ${Q} | ${J.title} | ~${J.tokenCount} |`);else A.push(`| ${J.id} | ${Q} | ${J.title} |`)}}}let O=N.fullObservations.slice(0,E.fullObservationCount);if(O.length>0){A.push(""),A.push("### Full Details (most recent)");for(let V of O){let _=B0[V.type]||"\uD83D\uDCDD";if(A.push(""),A.push(`#### ${_} ${V.title} (${V.id})`),A.push(V.narrative),V.facts.length>0)A.push(`**Facts:** ${V.facts.map((J)=>`- ${J}`).join(" ")}`);if(V.concepts.length>0)A.push(`**Concepts:** ${V.concepts.join(", ")}`);let S=[...V.filesRead,...V.filesModified];if(S.length>0)A.push(`**Files:** ${S.join(", ")}`)}}let $=WA(N);if($)A.push(""),A.push($);return A.join(`
162
+ `)}function WA(N){let E=0,A=0,M=new Set(N.observationIndex.map((V)=>V.id));for(let V of N.observationIndex)E+=V.tokenCount,A+=V.discoveryTokens;for(let V of N.fullObservations)if(!M.has(V.id))E+=V.tokenCount,A+=V.discoveryTokens;if(A===0)return null;let O=A-E,$=Math.max(0,Math.round(O/A*100));return`### \uD83D\uDCB0 Memory Economics
163
+ **Read cost:** ~${E}t | **Discovery cost:** ~${A}t | **Savings:** ${$}% (${O}t saved)`}function XA(N,E){let A=new Map;for(let O of E){let $=O.filesModified[0]||O.filesRead[0];if($)A.set(O.id,$)}let M=new Map;for(let O of N){let $=A.get(O.id)??"General",V=M.get($)??[];V.push(O),M.set($,V)}return M}function u0(N){let E=[];if(E.push("[open-mem] Memory context:"),N.recentSummaries.length>0){E.push(`
164
+ Recent sessions:`);for(let A of N.recentSummaries)E.push(`- ${A.summary}`)}if(N.observationIndex.length>0){E.push(`
165
+ Recent observations (${N.observationIndex.length} entries):`);for(let A of N.observationIndex)E.push(`- ${B0[A.type]||"\uD83D\uDCDD"} ${A.title}`)}return E.join(`
166
+ `)}function m0(N,E){if(N.length===0)return"";let A=E,M=[];for(let $ of N){let V=$.tokenCount||y($.title);if(A-V<0)break;M.push($),A-=V}if(M.length===0)return"";let O=[];O.push("### Cross-Project Memory"),O.push(""),O.push("| ID | Type | Title | ~Tokens |"),O.push("|----|------|-------|---------|");for(let $ of M){let V=B0[$.type]||"\uD83D\uDCDD";O.push(`| ${$.id} | ${V} | ${$.title} | ~${$.tokenCount} |`)}return O.join(`
167
+ `)}function g0(N,E){if(N.length===0)return"";let A=E,M=[];for(let $ of N){let V=$.tokenCount||y($.title);if(A-V<0)break;M.push($),A-=V}if(M.length===0)return"";let O=[];O.push(`
168
+ Cross-project observations (${M.length} entries):`);for(let $ of M)O.push(`- ${B0[$.type]||"\uD83D\uDCDD"} ${$.title}`);return O.join(`
169
+ `)}var h0={recency:0.4,typeImportance:0.3,sessionAffinity:0.2,tokenEfficiency:0.1},UA={decision:1,bugfix:0.9,feature:0.8,refactor:0.6,discovery:0.5,change:0.4};function ZA(N,E){let A=new Date(N),O=(E.getTime()-A.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 KA(N){return UA[N]??0.3}function BA(N,E){if(!E)return 0.5;return N===E?1:0.3}function DA(N){if(N<=10)return 1;if(N>=200)return 0.2;return 1-(N-10)/190*0.8}function YA(N,E){let A=ZA(N.createdAt,E.now),M=KA(N.type),O=BA(N.sessionId,E.currentSessionId),$=DA(N.tokenCount);return A*h0.recency+M*h0.typeImportance+O*h0.sessionAffinity+$*h0.tokenEfficiency}function $2(N,E){let A=new Map;for(let M of N)A.set(M.id,YA(M,E));return[...N].sort((M,O)=>{let $=A.get(M.id)??0,V=A.get(O.id)??0;if(V!==$)return V-$;return new Date(O.createdAt).getTime()-new Date(M.createdAt).getTime()})}function A0(N,E,A,M,O=[],$){let V=M,_=[],S=[];for(let Q of E){let f=Q.tokenCount||y(Q.summary);if(V-f<0)break;_.push(Q),V-=f}let J=$?$2(A,$):A;for(let Q of J){let f=Q.tokenCount||y(Q.title);if(V-f<0)break;S.push(Q),V-=f}return{recentSummaries:_,observationIndex:S,fullObservations:[...O],totalTokens:M-V}}import{existsSync as x1}from"fs";import{readdir as TA,readFile as W2,unlink as P1,writeFile as X2}from"fs/promises";import{join as v1,resolve as u1}from"path";import{existsSync as V2}from"fs";import{mkdir as RA,readFile as zA,rename as LA,unlink as GA,writeFile as HA}from"fs/promises";import{dirname as c0,isAbsolute as k1,join as D0,normalize as CA,relative as w1,resolve as O0,sep as I1}from"path";var M0="<!-- open-mem-context -->",d="<!-- /open-mem-context -->",S2={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"},_2=new Map,FA=new Set(["node_modules",".git","dist","coverage",".open-mem","build","__pycache__",".next",".nuxt"]);async function l0(N,E,A){if(E.length===0)return;if(A.mode==="single")return jA(N,E,A);let{maxDepth:M,filename:O}=A,$=[];for(let S of E){for(let J of S.filesModified)$.push(J);for(let J of S.filesRead)$.push(J)}let V=Q2($,N,M);if(V.size===0)return;let _=f2(E,V,N);for(let[S,J]of _)try{let Q=yA(S,J,N);await J2(S,Q,O)}catch(Q){console.error(`[open-mem] Failed to update AGENTS.md in ${S}:`,Q)}}async function jA(N,E,A){let{maxDepth:M,filename:O}=A,$=E.filter(T1);if($.length===0)return;let V=[];for(let X of $){for(let D of X.filesModified)V.push(D);for(let D of X.filesRead)V.push(D)}let _=Q2(V,N,M),S=f2($,_,N),J=$.filter((X)=>{return[...X.filesModified,...X.filesRead].some((U)=>{if(!U)return!1;let K=k1(U)?U:D0(N,U);return O0(c0(K))===O0(N)})});if(J.length>0)S.set(O0(N),J);if(S.size===0)return;let Q=[];Q.push("## Project Activity (auto-generated by open-mem)"),Q.push("");let f=[...S.entries()].map(([X,D])=>({relPath:w1(N,X)||".",observations:D})).sort((X,D)=>X.relPath.localeCompare(D.relPath));for(let{relPath:X,observations:D}of f){let U=D.filter(T1).sort((G,H)=>H.createdAt.localeCompare(G.createdAt)).slice(0,10);if(U.length===0)continue;Q.push(`### ${X}/`),Q.push("| ID | Type | Title | Date |"),Q.push("|----|------|-------|------|");for(let G of U){let H=S2[G.type]||"\uD83D\uDCDD",R=G.createdAt.split("T")[0],k=G.title.replace(/\|/g,"\\|");Q.push(`| ${G.id} | ${H} ${G.type} | ${k} | ${R} |`)}let K=new Set;for(let G of U)for(let H of G.concepts)K.add(H);if(K.size>0){let G=[...K].slice(0,10).join(", ");Q.push(""),Q.push(`**Key concepts:** ${G}`)}let z=U.filter((G)=>G.type==="decision").map((G)=>G.title);if(z.length>0)Q.push(""),Q.push(`**Recent decisions:** ${z.slice(0,5).join("; ")}`);Q.push("")}Q.push("\uD83D\uDCA1 *Use `mem-find` to search full details. Use `mem-create` to save important decisions.*");let W=Q.join(`
170
+ `);await J2(N,W,O)}function T1(N){return!/^\w[\w-]*\s+execution$/i.test(N.title)}function yA(N,E,A){let M=[...E].filter(T1).sort((J,Q)=>Q.createdAt.localeCompare(J.createdAt)).slice(0,10),O=w1(A,N)||".",$=[];$.push(`## Recent Activity in \`${O}/\` (auto-generated by open-mem)`),$.push(""),$.push("| ID | Type | Title | Date |"),$.push("|----|------|-------|------|");for(let J of M){let Q=S2[J.type]||"\uD83D\uDCDD",f=J.createdAt.split("T")[0],W=J.title.replace(/\|/g,"\\|");$.push(`| ${J.id} | ${Q} ${J.type} | ${W} | ${f} |`)}let V=new Set;for(let J of M)for(let Q of J.concepts)V.add(Q);if(V.size>0){let J=[...V].slice(0,10).join(", ");$.push(""),$.push(`**Key concepts:** ${J}`)}let _=M.filter((J)=>J.type==="decision").map((J)=>J.title);if(_.length>0)$.push(""),$.push(`**Recent decisions:** ${_.slice(0,5).join("; ")}`);let S=M.filter((J)=>J.type==="decision"&&J.narrative).slice(0,3);if(S.length>0){$.push(""),$.push("**Decision details:**");for(let J of S){let Q=J.narrative.split(/[.!?]\s/)[0],f=Q.length>120?`${Q.slice(0,117)}...`:Q;$.push(`- \u2696\uFE0F ${J.title}: ${f}`)}}return $.push(""),$.push("\uD83D\uDCA1 *Use `mem-find` to search full details across all sessions. Use `mem-create` to save important decisions.*"),$.join(`
171
+ `)}async function J2(N,E,A){if(!V2(N))return;let O=(_2.get(N)??Promise.resolve()).then(async()=>{let $=D0(N,A),V=D0(N,`.${A}.tmp`),_="";try{_=await zA($,"utf-8")}catch{}let S=IA(_,E);try{await RA(c0(V),{recursive:!0}),await HA(V,S,"utf-8"),await LA(V,$)}catch(J){try{await GA(V)}catch{}throw J}});return _2.set(N,O.catch(()=>{})),O}function IA(N,E){if(!N)return`${M0}
177
172
  ${E}
178
- ${i}
179
- `;let O=N.indexOf(O0),M=N.indexOf(i);if(O!==-1&&M!==-1&&M>O){let $=N.substring(0,O),_=N.substring(M+i.length);return`${$}${O0}
173
+ ${d}
174
+ `;let A=N.indexOf(M0),M=N.indexOf(d);if(A!==-1&&M!==-1&&M>A){let $=N.substring(0,A),V=N.substring(M+d.length);return`${$}${M0}
180
175
  ${E}
181
- ${i}${_}`}let A=N;if(O!==-1&&M===-1)A=A.replace(O0,"").trim();else if(O===-1&&M!==-1)A=A.replace(i,"").trim();else if(O!==-1&&M!==-1&&M<=O)A=A.replace(i,"").replace(O0,"").trim();return`${A}
176
+ ${d}${V}`}let O=N;if(A!==-1&&M===-1)O=O.replace(M0,"").trim();else if(A===-1&&M!==-1)O=O.replace(d,"").trim();else if(A!==-1&&M!==-1&&M<=A)O=O.replace(d,"").replace(M0,"").trim();return`${O}
182
177
 
183
- ${O0}
178
+ ${M0}
184
179
  ${E}
185
- ${i}
186
- `}function OE(N,E,O){let M=new Set,A=M0(E);for(let $ of N){if(!$||!$.trim())continue;if($.startsWith("~")||$.startsWith("http"))continue;let _=F1($)?$:Z0(E,$),S=g0(_),V=M0(S);if(!V.startsWith(A+G1)&&V!==A)continue;if(V===A)continue;let f=j1(A,V);if(f.split(G1).length>O)continue;if(XO(f).split(G1).some((W)=>DO.has(W)))continue;if(!eN(V))continue;M.add(V)}return M}function ME(N,E,O){let M=new Map;for(let A of N){let $=[...A.filesModified,...A.filesRead],_=new Set;for(let S of $){if(!S)continue;let V=F1(S)?S:Z0(O,S),f=M0(g0(V));if(E.has(f))_.add(f)}for(let S of _){let V=M.get(S)??[];V.push(A),M.set(S,V)}}return M}var y1="<!-- open-mem-context -->",c0="<!-- /open-mem-context -->";async function _E(N,E,O){let M;try{M=await KO(N,{withFileTypes:!0,encoding:"utf8"})}catch{return}for(let A of M){let $=String(A.name);if($===".git"||$==="node_modules"||$===".open-mem"||$==="dist")continue;let _=k1(N,$);if(A.isDirectory())await _E(_,E,O);else if(A.isFile()&&$===E)O.push(_)}}async function q1(N,E){let O=w1(N),M=[];return await _E(O,E,M),M}function SE(N){let E=N.indexOf(y1),O=N.indexOf(c0);if(E===-1&&O===-1)return N;if(E!==-1&&O===-1){let $=N.replace(y1,"").trim();return $?`${$}
187
- `:""}if(E===-1&&O!==-1){let $=N.replace(c0,"").trim();return $?`${$}
188
- `:""}if(O<=E){let $=N.replace(y1,"").replace(c0,"").trim();return $?`${$}
189
- `:""}let M=N.slice(0,E).trimEnd(),A=N.slice(O+c0.length).trimStart();if(!M&&!A)return"";if(!M)return`${A}
190
- `;if(!A)return`${M}
180
+ ${d}
181
+ `}function Q2(N,E,A){let M=new Set,O=O0(E);for(let $ of N){if(!$||!$.trim())continue;if($.startsWith("~")||$.startsWith("http"))continue;let V=k1($)?$:D0(E,$),_=c0(V),S=O0(_);if(!S.startsWith(O+I1)&&S!==O)continue;if(S===O)continue;let J=w1(O,S);if(J.split(I1).length>A)continue;if(CA(J).split(I1).some((W)=>FA.has(W)))continue;if(!V2(S))continue;M.add(S)}return M}function f2(N,E,A){let M=new Map;for(let O of N){let $=[...O.filesModified,...O.filesRead],V=new Set;for(let _ of $){if(!_)continue;let S=k1(_)?_:D0(A,_),J=O0(c0(S));if(E.has(J))V.add(J)}for(let _ of V){let S=M.get(_)??[];S.push(O),M.set(_,S)}}return M}var q1="<!-- open-mem-context -->",b0="<!-- /open-mem-context -->";async function Z2(N,E,A){let M;try{M=await TA(N,{withFileTypes:!0,encoding:"utf8"})}catch{return}for(let O of M){let $=String(O.name);if($===".git"||$==="node_modules"||$===".open-mem"||$==="dist")continue;let V=v1(N,$);if(O.isDirectory())await Z2(V,E,A);else if(O.isFile()&&$===E)A.push(V)}}async function m1(N,E){let A=u1(N),M=[];return await Z2(A,E,M),M}function U2(N){let E=N.indexOf(q1),A=N.indexOf(b0);if(E===-1&&A===-1)return N;if(E!==-1&&A===-1){let $=N.replace(q1,"").trim();return $?`${$}
182
+ `:""}if(E===-1&&A!==-1){let $=N.replace(b0,"").trim();return $?`${$}
183
+ `:""}if(A<=E){let $=N.replace(q1,"").replace(b0,"").trim();return $?`${$}
184
+ `:""}let M=N.slice(0,E).trimEnd(),O=N.slice(A+b0.length).trimStart();if(!M&&!O)return"";if(!M)return`${O}
185
+ `;if(!O)return`${M}
191
186
  `;return`${M}
192
187
 
193
- ${A}
194
- `}async function VE(N,E,O=!1){let M=await q1(N,E),A=0;for(let $ of M){let _=await AE($,"utf-8"),S=SE(_);if(S!==_){if(A+=1,!O)if(S==="")await I1($);else await $E($,S,"utf-8")}}if(E){let $=k1(w1(N),E);if(T1($))try{let _=await AE($,"utf-8"),S=SE(_);if(S!==_){if(A+=1,!O)if(S==="")await I1($);else await $E($,S,"utf-8")}if(!M.includes($))M.push($)}catch{}}return{files:M,changed:A}}async function fE(N,E){let O=await q1(N,E);if(E){let A=k1(w1(N),E);if(T1(A)&&!O.includes(A))O.push(A)}let M=0;for(let A of O)try{await I1(A),M++}catch{}return{deleted:M,files:O}}async function JE(N,E,O,M,A=!1){let _=E.getAll(N).flatMap((V)=>O.getBySession(V.id));if(A){let V=new Set;for(let f of _)for(let J of[...f.filesRead,...f.filesModified])V.add(J);return{observations:_.length,filesTouched:V.size}}if(!T1(N))return{observations:0,filesTouched:0};await h0(N,_,{maxDepth:M.maxDepth,mode:M.mode,filename:M.filename});let S=await q1(N,M.filename);return{observations:_.length,filesTouched:S.length}}class P1{observations;sessions;summaries;searchOrchestrator;projectPath;config;userObservationRepo;runtimeSnapshotProvider;configAuditStore;maintenanceHistoryStore;configAuditLogFallback=[];maintenanceLogFallback=[];constructor(N){this.observations=N.observations,this.sessions=N.sessions,this.summaries=N.summaries,this.searchOrchestrator=N.searchOrchestrator,this.projectPath=N.projectPath,this.config=N.config,this.userObservationRepo=N.userObservationRepo??null,this.runtimeSnapshotProvider=N.runtimeSnapshotProvider??null,this.configAuditStore=N.configAuditStore??null,this.maintenanceHistoryStore=N.maintenanceHistoryStore??null}getByIdIncludingArchived(N){let E=this.observations;return E.getByIdIncludingArchived?E.getByIdIncludingArchived(N):this.observations.getById(N)}listByProjectWithState(N){let E=this.observations;if(E.listByProject)return E.listByProject(this.projectPath,N);if(N.state!=="current")return[];return this.listObservations({limit:N.limit,offset:N.offset,type:N.type,sessionId:N.sessionId})}async ingest(N){}async processPending(N){return 0}async search(N,E={}){return this.searchOrchestrator.search(N,{type:E.type,limit:E.limit??10,projectPath:this.projectPath,importanceMin:E.importanceMin,importanceMax:E.importanceMax,createdAfter:E.after,createdBefore:E.before,concepts:E.concepts,files:E.files})}async timeline(N={}){if(N.anchor){let O=this.observations.getById(N.anchor);if(!O)return[];let M=N.depthBefore??5,A=N.depthAfter??5,$=this.observations.getAroundTimestamp(O.createdAt,M,A,this.projectPath),_=[...$.filter((V)=>V.createdAt<O.createdAt),O,...$.filter((V)=>V.createdAt>O.createdAt)];return[{session:this.sessions.getById(O.sessionId)??{id:O.sessionId,projectPath:this.projectPath,startedAt:O.createdAt,endedAt:null,status:"completed",observationCount:0,summaryId:null},summary:null,observations:_}]}if(N.sessionId){let O=this.sessions.getById(N.sessionId);if(!O)return[];return[{session:O,summary:this.summaries.getBySessionId(O.id),observations:this.observations.getBySession(O.id)}]}return this.sessions.getRecent(this.projectPath,N.limit??5).map((O)=>({session:O,summary:this.summaries.getBySessionId(O.id),observations:[]}))}async recall(N,E=10){let O=[];for(let M of N.slice(0,E)){let A=this.observations.getById(M);if(A){O.push(A);continue}if(!this.userObservationRepo)continue;let $=this.userObservationRepo.getById(M);if(!$)continue;O.push({...$,sessionId:"",rawToolOutput:"",discoveryTokens:0})}return O}async save(N){if(N.scope==="user"){if(!this.userObservationRepo)return null;return{...this.userObservationRepo.create({type:N.type,title:N.title,subtitle:"",facts:[],narrative:N.narrative,concepts:N.concepts??[],filesRead:[],filesModified:N.files??[],toolName:"mem-create",tokenCount:y(`${N.title} ${N.narrative}`),importance:N.importance??3,sourceProject:this.projectPath}),sessionId:"",rawToolOutput:"",discoveryTokens:0}}this.sessions.getOrCreate(N.sessionId,this.projectPath);let E=this.observations.create({sessionId:N.sessionId,type:N.type,title:N.title,subtitle:"",facts:[],narrative:N.narrative,concepts:N.concepts??[],filesRead:[],filesModified:N.files??[],rawToolOutput:`[Manual save] ${N.narrative}`,toolName:"mem-create",tokenCount:y(`${N.title} ${N.narrative}`),discoveryTokens:0,importance:N.importance??3});return this.sessions.incrementObservationCount(N.sessionId),E}async update(N){let E=this.observations.getById(N.id);if(!E)return null;let O=this.sessions.getById(E.sessionId);if(!O||O.projectPath!==this.projectPath)return null;let{id:M,...A}=N;return this.observations.update(N.id,A)??null}async delete(N){let E=0;for(let O of N){let M=this.observations.getById(O);if(!M)continue;let A=this.sessions.getById(M.sessionId);if(!A||A.projectPath!==this.projectPath)continue;if(this.observations.delete(O))E+=1}return E}async export(N,E={}){if(N!=="project")throw Error("Only project scope export is supported.");let O=this.sessions.getAll(this.projectPath),M=[];for(let S of O)M.push(...this.observations.getBySession(S.id));if(E.type)M=M.filter((S)=>S.type===E.type);if(M.sort((S,V)=>new Date(S.createdAt).getTime()-new Date(V.createdAt).getTime()),E.limit&&E.limit<M.length)M=M.slice(0,E.limit);let A=M.map(({rawToolOutput:S,...V})=>V),$=O.map((S)=>this.summaries.getBySessionId(S.id)).filter((S)=>S!==null);return{version:1,exportedAt:new Date().toISOString(),project:this.projectPath,observations:A,summaries:$}}async import(N,E={}){let O;try{O=JSON.parse(N)}catch{throw Error("Invalid JSON payload.")}if(typeof O!=="object"||O===null)throw Error("Invalid import payload.");let M=O;if(M.version!==1||!Array.isArray(M.observations))throw Error("Unsupported export format.");let A=E.mode??"skip-duplicates",$=0,_=0;for(let S of M.observations){let V=this.observations.getById(S.id);if(V&&A==="skip-duplicates"){_+=1;continue}if(V&&A==="overwrite")this.observations.delete(S.id);this.sessions.getOrCreate(S.sessionId,this.projectPath),this.observations.importObservation({id:S.id,sessionId:S.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:S.rawToolOutput??"",toolName:S.toolName??"unknown",createdAt:S.createdAt,tokenCount:S.tokenCount??0,discoveryTokens:S.discoveryTokens??0,importance:S.importance??3,supersededBy:S.supersededBy??null,supersededAt:S.supersededAt??null}),this.sessions.incrementObservationCount(S.sessionId),$+=1}for(let S of M.summaries??[]){let V=this.summaries.getBySessionId(S.sessionId);if(V&&A==="skip-duplicates")continue;if(V&&A==="overwrite")continue;this.sessions.getOrCreate(S.sessionId,this.projectPath),this.summaries.importSummary(S),this.sessions.setSummary(S.sessionId,S.id)}return{imported:$,skipped:_}}async buildContext(N,E="normal"){let O=this.sessions.getRecent(this.projectPath,5),M=O.map((J)=>J.summaryId?this.summaries.getBySessionId(J.id):null).filter((J)=>J!==null),A=this.observations.getIndex(this.projectPath,this.config.maxObservations),_=A.slice(0,this.config.contextFullObservationCount).map((J)=>J.id).map((J)=>this.observations.getById(J)).filter((J)=>J!==null),S=E0(O,M,A,this.config.maxContextTokens,_);if(E==="compaction"){let J=x0(S);if(this.config.userMemoryEnabled&&this.userObservationRepo)J+=u0(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);return J}let V={showTokenCosts:this.config.contextShowTokenCosts,observationTypes:this.config.contextObservationTypes,fullObservationCount:this.config.contextFullObservationCount,showLastSummary:this.config.contextShowLastSummary},f=P0(S,V);if(this.config.userMemoryEnabled&&this.userObservationRepo){let J=v0(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);if(J)f+=`
188
+ ${O}
189
+ `}async function K2(N,E,A=!1){let M=await m1(N,E),O=0;for(let $ of M){let V=await W2($,"utf-8"),_=U2(V);if(_!==V){if(O+=1,!A)if(_==="")await P1($);else await X2($,_,"utf-8")}}if(E){let $=v1(u1(N),E);if(x1($))try{let V=await W2($,"utf-8"),_=U2(V);if(_!==V){if(O+=1,!A)if(_==="")await P1($);else await X2($,_,"utf-8")}if(!M.includes($))M.push($)}catch{}}return{files:M,changed:O}}async function B2(N,E){let A=await m1(N,E);if(E){let O=v1(u1(N),E);if(x1(O)&&!A.includes(O))A.push(O)}let M=0;for(let O of A)try{await P1(O),M++}catch{}return{deleted:M,files:A}}async function D2(N,E,A,M,O=!1){let V=E.getAll(N).flatMap((S)=>A.getBySession(S.id));if(O){let S=new Set;for(let J of V)for(let Q of[...J.filesRead,...J.filesModified])S.add(Q);return{observations:V.length,filesTouched:S.size}}if(!x1(N))return{observations:0,filesTouched:0};await l0(N,V,{maxDepth:M.maxDepth,mode:M.mode,filename:M.filename});let _=await m1(N,M.filename);return{observations:V.length,filesTouched:_.length}}class g1{observations;sessions;summaries;searchOrchestrator;projectPath;config;userObservationRepo;runtimeSnapshotProvider;configAuditStore;maintenanceHistoryStore;configAuditLogFallback=[];maintenanceLogFallback=[];constructor(N){this.observations=N.observations,this.sessions=N.sessions,this.summaries=N.summaries,this.searchOrchestrator=N.searchOrchestrator,this.projectPath=N.projectPath,this.config=N.config,this.userObservationRepo=N.userObservationRepo??null,this.runtimeSnapshotProvider=N.runtimeSnapshotProvider??null,this.configAuditStore=N.configAuditStore??null,this.maintenanceHistoryStore=N.maintenanceHistoryStore??null}getByIdIncludingArchived(N){let E=this.observations;return E.getByIdIncludingArchived?E.getByIdIncludingArchived(N):this.observations.getById(N)}listByProjectWithState(N){let E=this.observations;if(E.listByProject)return E.listByProject(this.projectPath,N);if(N.state!=="current")return[];return this.listObservations({limit:N.limit,offset:N.offset,type:N.type,sessionId:N.sessionId})}async ingest(N){}async processPending(N){return 0}async search(N,E={}){return this.searchOrchestrator.search(N,{type:E.type,limit:E.limit??10,projectPath:this.projectPath,importanceMin:E.importanceMin,importanceMax:E.importanceMax,createdAfter:E.after,createdBefore:E.before,concepts:E.concepts,files:E.files})}async timeline(N={}){if(N.anchor){let A=this.observations.getById(N.anchor);if(!A)return[];let M=N.depthBefore??5,O=N.depthAfter??5,$=this.observations.getAroundTimestamp(A.createdAt,M,O,this.projectPath),V=[...$.filter((S)=>S.createdAt<A.createdAt),A,...$.filter((S)=>S.createdAt>A.createdAt)];return[{session:this.sessions.getById(A.sessionId)??{id:A.sessionId,projectPath:this.projectPath,startedAt:A.createdAt,endedAt:null,status:"completed",observationCount:0,summaryId:null},summary:null,observations:V}]}if(N.sessionId){let A=this.sessions.getById(N.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,N.limit??5).map((A)=>({session:A,summary:this.summaries.getBySessionId(A.id),observations:[]}))}async recall(N,E=10){let A=[];for(let M of N.slice(0,E)){let O=this.observations.getById(M);if(O){A.push(O);continue}if(!this.userObservationRepo)continue;let $=this.userObservationRepo.getById(M);if(!$)continue;A.push({...$,sessionId:"",rawToolOutput:"",discoveryTokens:0})}return A}async save(N){if(N.scope==="user"){if(!this.userObservationRepo)return null;return{...this.userObservationRepo.create({type:N.type,title:N.title,subtitle:"",facts:[],narrative:N.narrative,concepts:N.concepts??[],filesRead:[],filesModified:N.files??[],toolName:"mem-create",tokenCount:y(`${N.title} ${N.narrative}`),importance:N.importance??3,sourceProject:this.projectPath}),sessionId:"",rawToolOutput:"",discoveryTokens:0}}this.sessions.getOrCreate(N.sessionId,this.projectPath);let E=this.observations.create({sessionId:N.sessionId,type:N.type,title:N.title,subtitle:"",facts:[],narrative:N.narrative,concepts:N.concepts??[],filesRead:[],filesModified:N.files??[],rawToolOutput:`[Manual save] ${N.narrative}`,toolName:"mem-create",tokenCount:y(`${N.title} ${N.narrative}`),discoveryTokens:0,importance:N.importance??3});return this.sessions.incrementObservationCount(N.sessionId),E}async update(N){let E=this.observations.getById(N.id);if(!E)return null;let A=this.sessions.getById(E.sessionId);if(!A||A.projectPath!==this.projectPath)return null;let{id:M,...O}=N;return this.observations.update(N.id,O)??null}async delete(N){let E=0;for(let A of N){let M=this.observations.getById(A);if(!M)continue;let O=this.sessions.getById(M.sessionId);if(!O||O.projectPath!==this.projectPath)continue;if(this.observations.delete(A))E+=1}return E}async export(N,E={}){if(N!=="project")throw Error("Only project scope export is supported.");let A=this.sessions.getAll(this.projectPath),M=[];for(let _ of A)M.push(...this.observations.getBySession(_.id));if(E.type)M=M.filter((_)=>_.type===E.type);if(M.sort((_,S)=>new Date(_.createdAt).getTime()-new Date(S.createdAt).getTime()),E.limit&&E.limit<M.length)M=M.slice(0,E.limit);let O=M.map(({rawToolOutput:_,...S})=>S),$=A.map((_)=>this.summaries.getBySessionId(_.id)).filter((_)=>_!==null);return{version:1,exportedAt:new Date().toISOString(),project:this.projectPath,observations:O,summaries:$}}async import(N,E={}){let A;try{A=JSON.parse(N)}catch{throw Error("Invalid JSON payload.")}if(typeof A!=="object"||A===null)throw Error("Invalid import payload.");let M=A;if(M.version!==1||!Array.isArray(M.observations))throw Error("Unsupported export format.");let O=E.mode??"skip-duplicates",$=0,V=0;for(let _ of M.observations){let S=this.observations.getById(_.id);if(S&&O==="skip-duplicates"){V+=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),$+=1}for(let _ of M.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:$,skipped:V}}async buildContext(N,E="normal"){let A=this.sessions.getRecent(this.projectPath,5),M=A.map((Q)=>Q.summaryId?this.summaries.getBySessionId(Q.id):null).filter((Q)=>Q!==null),O=this.observations.getIndex(this.projectPath,this.config.maxObservations),V=O.slice(0,this.config.contextFullObservationCount).map((Q)=>Q.id).map((Q)=>this.observations.getById(Q)).filter((Q)=>Q!==null),_=A0(A,M,O,this.config.maxContextTokens,V);if(E==="compaction"){let Q=u0(_);if(this.config.userMemoryEnabled&&this.userObservationRepo)Q+=g0(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);return Q}let S={showTokenCosts:this.config.contextShowTokenCosts,observationTypes:this.config.contextObservationTypes,fullObservationCount:this.config.contextFullObservationCount,showLastSummary:this.config.contextShowLastSummary},J=v0(_,S);if(this.config.userMemoryEnabled&&this.userObservationRepo){let Q=m0(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);if(Q)J+=`
195
190
 
196
- ${J}`}return f}guide(){return["# open-mem Workflow Guide","","## Reading Memories","1. `mem-find` \u2014 Search by query (returns IDs + summaries)","2. `mem-history` \u2014 Browse session timeline and summaries","3. `mem-get` \u2014 Fetch full details by ID (from find/history results)","","## When to Save (`mem-create`)","Save when the information is **stable, reusable, and non-obvious**:",'- Architectural decisions + rationale ("chose X over Y because...")',"- Non-obvious gotchas or workarounds discovered","- User preferences and conventions","- Cross-session plans or migration progress",'- Environment constraints ("Bedrock requires tool names matching [a-zA-Z0-9_-]+")',"","## When NOT to Save","Auto-capture already handles tool executions. Don't manually save:","- Ephemeral logs or one-off command outputs","- Information already visible in code or config files","- Routine file reads or edits (auto-captured)","","## Memory Types","- `decision` \u2014 Architectural choices with rationale","- `discovery` \u2014 Non-obvious findings, gotchas, constraints","- `bugfix` \u2014 Bug root causes and fixes","- `feature` \u2014 Feature implementations and design notes","- `refactor` \u2014 Refactoring rationale and approach","- `change` \u2014 General changes worth remembering","","## Editing & Cleanup","- `mem-revise` \u2014 Update outdated memories with new revisions","- `mem-remove` \u2014 Tombstone obsolete or incorrect memories","","## Privacy","Wrap sensitive content in `<private>` tags to exclude from memory.","","## Transfer","- `mem-export` \u2014 Backup/portability as JSON","- `mem-import` \u2014 Restore from JSON export"].join(`
197
- `)}listObservations(N){let{limit:E=50,offset:O=0,type:M,sessionId:A,state:$}=N;if($)return this.listByProjectWithState({limit:E,offset:O,type:M,state:$,sessionId:A});if(A){let V=this.observations.getBySession(A);if(M)V=V.filter((f)=>f.type===M);return V.slice(O,O+E)}let S=this.observations.getIndex(this.projectPath,O+E).slice(O);if(M)S=S.filter((V)=>V.type===M);return S.map((V)=>this.observations.getById(V.id)).filter((V)=>V!==null)}getObservation(N){return this.observations.getById(N)}getLineage(N){let O=this.getByIdIncludingArchived(N);if(!O)return null;let M=O,A=0,$=new Set([O.id]);while(M.revisionOf&&A<256){let J=this.getByIdIncludingArchived(M.revisionOf);if(!J||$.has(J.id))break;M=J,$.add(J.id),A+=1}let _=[],S=M,V=new Set,f=0;while(S&&!V.has(S.id)&&f<256){V.add(S.id);let J=S.deletedAt?"tombstoned":S.supersededBy?"superseded":"current";_.push({id:S.id,revisionOf:S.revisionOf??null,supersededBy:S.supersededBy??null,supersededAt:S.supersededAt??null,deletedAt:S.deletedAt??null,state:J,observation:S}),S=S.supersededBy?this.getByIdIncludingArchived(S.supersededBy):null,f+=1}return _}listSessions(N){return this.sessions.getRecent(N.projectPath??this.projectPath,N.limit??20)}getSession(N){let E=this.sessions.getById(N);if(!E)return null;return{session:E,summary:this.summaries.getBySessionId(N),observations:this.observations.getBySession(N)}}stats(){let N=this.observations.getCount(),O=this.sessions.getAll(this.projectPath).length,M=this.observations.getIndex(this.projectPath,1e4),A=0,$=0,_={};for(let f of M)A+=f.tokenCount,$+=f.discoveryTokens,_[f.type]=(_[f.type]||0)+1;let S=$-A,V=M.length>0?Math.round(A/M.length):0;return{totalObservations:N,totalSessions:O,totalTokensSaved:S,averageObservationSize:V,typeBreakdown:_}}async maintainFolderContext(N,E){if(N==="purge")return{action:"purge",dryRun:!1,...await fE(this.projectPath,this.config.folderContextFilename)};if(N==="rebuild"){let M=await JE(this.projectPath,this.sessions,this.observations,{maxDepth:this.config.folderContextMaxDepth,mode:this.config.folderContextMode,filename:this.config.folderContextFilename},E);return{action:N,dryRun:E,...M}}let O=await VE(this.projectPath,this.config.folderContextFilename,E);return{action:"clean",dryRun:E,...O}}getRevisionDiff(N,E){let O=this.getByIdIncludingArchived(N),M=this.getByIdIncludingArchived(E);if(!O||!M)return null;let A=[],$=(S,V,f)=>{if(JSON.stringify(V)!==JSON.stringify(f))A.push({field:S,before:V,after:f})};$("title",M.title,O.title),$("subtitle",M.subtitle,O.subtitle),$("narrative",M.narrative,O.narrative),$("type",M.type,O.type),$("facts",M.facts,O.facts),$("concepts",M.concepts,O.concepts),$("filesRead",M.filesRead,O.filesRead),$("filesModified",M.filesModified,O.filesModified),$("importance",M.importance,O.importance);let _=A.length===0?"No material changes between revisions.":`Changed ${A.length} field${A.length===1?"":"s"}: ${A.map((S)=>S.field).join(", ")}.`;return{fromId:E,toId:N,summary:_,changedFields:A}}getHealth(){let N=this.runtimeSnapshotProvider?.(),E=N&&N.queue.lastError?"degraded":"ok";return{status:N?.status??"ok",timestamp:N?.timestamp??new Date().toISOString(),components:{database:{status:"ok"},search:{status:"ok"},config:{status:"ok"},queue:{status:E,detail:N?.queue.lastError??void 0}}}}getMetrics(){let N=this.stats();return{timestamp:this.runtimeSnapshotProvider?.()?.timestamp??new Date().toISOString(),memory:{totalObservations:N.totalObservations,totalSessions:N.totalSessions,totalTokensSaved:N.totalTokensSaved,averageObservationSize:N.averageObservationSize}}}getPlatforms(){return{name:"open-mem",provider:this.config.provider,dashboardEnabled:this.config.dashboardEnabled,vectorEnabled:Boolean(this.config.embeddingDimension&&this.config.embeddingDimension>0)}}getAdapterStatuses(){let N={opencode:this.config.platformOpenCodeEnabled??!0,"claude-code":this.config.platformClaudeCodeEnabled??!1,cursor:this.config.platformCursorEnabled??!1};return[{name:"opencode",version:"1.0",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!1}},{name:"claude-code",version:"0.1",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}},{name:"cursor",version:"0.1",capabilities:{nativeSessionLifecycle:!1,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}}].map((O)=>({name:O.name,version:O.version,enabled:N[O.name]??!1,capabilities:O.capabilities}))}getConfigAuditTimeline(){if(this.configAuditStore)return this.configAuditStore.list();return[...this.configAuditLogFallback].reverse()}trackConfigAudit(N){if(this.configAuditStore){this.configAuditStore.append(N);return}this.configAuditLogFallback.push(N)}async rollbackConfig(N){let E=this.configAuditStore?this.configAuditStore.getById(N):this.configAuditLogFallback.find(($)=>$.id===N)??null;if(!E)return null;if(!E.previousValues||typeof E.previousValues!=="object")return null;let{patchConfig:O}=await Promise.resolve().then(() => (X1(),kN)),M=E.previousValues;try{await O(this.projectPath,M)}catch($){let _={id:`rollback-failed-${QE()}`,timestamp:new Date().toISOString(),patch:E.previousValues,previousValues:E.patch,source:"rollback-failed"};throw this.trackConfigAudit(_),$}let A={id:`rollback-${QE()}`,timestamp:new Date().toISOString(),patch:E.previousValues,previousValues:E.patch,source:"rollback"};return this.trackConfigAudit(A),A}getMaintenanceHistory(){if(this.maintenanceHistoryStore)return this.maintenanceHistoryStore.list();return[...this.maintenanceLogFallback].reverse()}trackMaintenanceResult(N){if(this.maintenanceHistoryStore){this.maintenanceHistoryStore.append(N);return}this.maintenanceLogFallback.push(N)}}import{existsSync as FO}from"fs";import{existsSync as RO}from"fs";import{homedir as YO}from"os";import{join as WE}from"path";function LO(){let N=[],E=process.env.BUN_INSTALL;if(E)N.push(WE(E,"bin","bun"));let O=YO();return N.push(WE(O,".bun","bin","bun")),N.push("/usr/local/bin/bun"),N.push("/opt/homebrew/bin/bun"),N.push("/home/linuxbrew/.linuxbrew/bin/bun"),N}function zO(){let N=Bun.which("bun");if(N)return N;for(let E of LO())if(RO(E))return console.debug(`[open-mem] Resolved bun path via candidate scan: ${E}`),E;return"bun"}var x1=null;function XE(){if(x1===null)x1=zO();return x1}import{existsSync as CO,mkdirSync as yS,readFileSync as GO,unlinkSync as HO,writeFileSync as IS}from"fs";function d(N){if(!CO(N))return null;let E=GO(N,"utf-8").trim(),O=Number.parseInt(E,10);if(Number.isNaN(O))return null;return O}function A0(N){try{return process.kill(N,0),!0}catch(E){if(E instanceof Error&&"code"in E&&E.code==="EPERM")return!0;return!1}}function K0(N){try{HO(N)}catch{}}function l0(N){let E=N.lastIndexOf("/");if(E>=0)return`${N.substring(0,E)}/worker.pid`;return"worker.pid"}var jO=100,yO=2000;class v1{pidPath;projectPath;daemonScript;subprocess=null;constructor(N){this.pidPath=l0(N.dbPath),this.projectPath=N.projectPath,this.daemonScript=N.daemonScript}start(){if(this.isRunning())return!1;this.subprocess=Bun.spawn([XE(),"run",this.daemonScript,"--project",this.projectPath],{detached:!0,stdio:["ignore","ignore","ignore"],ipc(E){}}),this.subprocess.unref();let N=Date.now()+yO;while(Date.now()<N)if(Bun.sleepSync(jO),FO(this.pidPath)){let E=d(this.pidPath);if(E!==null&&A0(E))return!0}return!1}signal(N){try{this.subprocess?.send(N)}catch{}}stop(){let N=d(this.pidPath);if(N!==null)try{process.kill(N,"SIGTERM")}catch{}this.subprocess=null,K0(this.pidPath)}isRunning(){let N=d(this.pidPath);if(N===null)return!1;return A0(N)}getStatus(){let N=d(this.pidPath);if(N===null)return{running:!1,pid:null};if(!A0(N))return{running:!1,pid:null};return{running:!0,pid:N}}}import{existsSync as u1}from"fs";function DE(N){let E={reaped:0,errors:[]};try{let O=l0(N),M=d(O);if(M===null){try{if(u1(O))if(K0(O),!u1(O))E.reaped++,console.log("[open-mem] Reaped corrupt daemon PID file");else E.errors.push("Failed to remove corrupt PID file: file still exists after removal")}catch(A){E.errors.push(`Failed to check/remove corrupt PID file: ${A instanceof Error?A.message:String(A)}`)}return E}if(A0(M))return E;if(K0(O),!u1(O))E.reaped++,console.log(`[open-mem] Reaped stale daemon PID file (pid=${M})`);else E.errors.push(`Failed to remove stale PID file (pid=${M}): file still exists after removal`)}catch(O){E.errors.push(`Reaper error: ${O instanceof Error?O.message:String(O)}`)}return E}function b0(N){try{let E=JSON.parse(N);return E&&typeof E==="object"?E:{}}catch{return{}}}class m1{db;constructor(N){this.db=N}list(){return this.db.all("SELECT id, timestamp, patch, previous_values, source FROM config_audit_events ORDER BY timestamp DESC").map((N)=>({id:N.id,timestamp:N.timestamp,patch:b0(N.patch),previousValues:b0(N.previous_values),source:N.source}))}getById(N){let E=this.db.get("SELECT id, timestamp, patch, previous_values, source FROM config_audit_events WHERE id = ?",[N]);if(!E)return null;return{id:E.id,timestamp:E.timestamp,patch:b0(E.patch),previousValues:b0(E.previous_values),source:E.source}}append(N){this.db.run("INSERT INTO config_audit_events (id, timestamp, patch, previous_values, source) VALUES (?, ?, ?, ?, ?)",[N.id,N.timestamp,JSON.stringify(N.patch??{}),JSON.stringify(N.previousValues??{}),N.source])}}import{Database as BE}from"bun:sqlite";import{existsSync as g1,mkdirSync as IO,unlinkSync as UE}from"fs";import*as ZE from"sqlite-vec";class p0{db;dbPath;_hasVectorExtension=!1;static enableExtensionSupport(){let N=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite/lib/libsqlite3.dylib"];for(let E of N)try{if(g1(E))return BE.setCustomSQLite(E),!0}catch{return!1}return!1}constructor(N){this.dbPath=N,this.db=this.open(N),this.configure()}open(N){let E=N.lastIndexOf("/");if(E>0){let O=N.substring(0,E);IO(O,{recursive:!0})}return new BE(N,{create:!0})}configure(){try{this.applyPragmas(),this.loadExtensions()}catch(N){console.warn("[open-mem] Database configure failed, attempting recovery by removing WAL/SHM files:",N.message);try{this.db.close()}catch{}this.deleteSidecarFiles();try{this.db=this.open(this.dbPath),this.applyPragmas(),this.loadExtensions(),console.warn("[open-mem] Recovery successful after removing WAL/SHM files");return}catch(E){console.warn("[open-mem] WAL/SHM cleanup insufficient, recreating database from scratch:",E.message);try{this.db.close()}catch{}this.deleteDatabaseFiles();try{this.db=this.open(this.dbPath),this.applyPragmas(),this.loadExtensions(),console.warn("[open-mem] Recovery successful after full database recreation");return}catch(O){throw console.warn("[open-mem] All recovery attempts failed, filesystem may be broken:",O.message),N}}}}applyPragmas(){this.db.exec("PRAGMA journal_mode = WAL"),this.db.exec("PRAGMA synchronous = NORMAL"),this.db.exec("PRAGMA foreign_keys = ON"),this.db.exec("PRAGMA busy_timeout = 5000")}loadExtensions(){try{ZE.load(this.db),this._hasVectorExtension=!0}catch{this._hasVectorExtension=!1}}get hasVectorExtension(){return this._hasVectorExtension}deleteSidecarFiles(){for(let N of["-wal","-shm"]){let E=this.dbPath+N;try{if(g1(E))UE(E)}catch{}}}deleteDatabaseFiles(){this.deleteSidecarFiles();try{if(g1(this.dbPath))UE(this.dbPath)}catch{}}ensureMigrationTable(){this.db.exec(`
191
+ ${Q}`}return J}guide(){return["# open-mem Workflow Guide","","## Reading Memories","1. `mem-find` \u2014 Search by query (returns IDs + summaries)","2. `mem-history` \u2014 Browse session timeline and summaries","3. `mem-get` \u2014 Fetch full details by ID (from find/history results)","","## When to Save (`mem-create`)","Save when the information is **stable, reusable, and non-obvious**:",'- Architectural decisions + rationale ("chose X over Y because...")',"- Non-obvious gotchas or workarounds discovered","- User preferences and conventions","- Cross-session plans or migration progress",'- Environment constraints ("Bedrock requires tool names matching [a-zA-Z0-9_-]+")',"","## When NOT to Save","Auto-capture already handles tool executions. Don't manually save:","- Ephemeral logs or one-off command outputs","- Information already visible in code or config files","- Routine file reads or edits (auto-captured)","","## Memory Types","- `decision` \u2014 Architectural choices with rationale","- `discovery` \u2014 Non-obvious findings, gotchas, constraints","- `bugfix` \u2014 Bug root causes and fixes","- `feature` \u2014 Feature implementations and design notes","- `refactor` \u2014 Refactoring rationale and approach","- `change` \u2014 General changes worth remembering","","## Editing & Cleanup","- `mem-revise` \u2014 Update outdated memories with new revisions","- `mem-remove` \u2014 Tombstone obsolete or incorrect memories","","## Privacy","Wrap sensitive content in `<private>` tags to exclude from memory.","","## Transfer","- `mem-export` \u2014 Backup/portability as JSON","- `mem-import` \u2014 Restore from JSON export"].join(`
192
+ `)}listObservations(N){let{limit:E=50,offset:A=0,type:M,sessionId:O,state:$}=N;if($)return this.listByProjectWithState({limit:E,offset:A,type:M,state:$,sessionId:O});if(O){let S=this.observations.getBySession(O);if(M)S=S.filter((J)=>J.type===M);return S.slice(A,A+E)}let _=this.observations.getIndex(this.projectPath,A+E).slice(A);if(M)_=_.filter((S)=>S.type===M);return _.map((S)=>this.observations.getById(S.id)).filter((S)=>S!==null)}getObservation(N){return this.observations.getById(N)}getLineage(N){let A=this.getByIdIncludingArchived(N);if(!A)return null;let M=A,O=0,$=new Set([A.id]);while(M.revisionOf&&O<256){let Q=this.getByIdIncludingArchived(M.revisionOf);if(!Q||$.has(Q.id))break;M=Q,$.add(Q.id),O+=1}let V=[],_=M,S=new Set,J=0;while(_&&!S.has(_.id)&&J<256){S.add(_.id);let Q=_.deletedAt?"tombstoned":_.supersededBy?"superseded":"current";V.push({id:_.id,revisionOf:_.revisionOf??null,supersededBy:_.supersededBy??null,supersededAt:_.supersededAt??null,deletedAt:_.deletedAt??null,state:Q,observation:_}),_=_.supersededBy?this.getByIdIncludingArchived(_.supersededBy):null,J+=1}return V}listSessions(N){return this.sessions.getRecent(N.projectPath??this.projectPath,N.limit??20)}getSession(N){let E=this.sessions.getById(N);if(!E)return null;return{session:E,summary:this.summaries.getBySessionId(N),observations:this.observations.getBySession(N)}}stats(){let N=this.observations.getCount(),A=this.sessions.getAll(this.projectPath).length,M=this.observations.getIndex(this.projectPath,1e4),O=0,$=0,V={};for(let J of M)O+=J.tokenCount,$+=J.discoveryTokens,V[J.type]=(V[J.type]||0)+1;let _=$-O,S=M.length>0?Math.round(O/M.length):0;return{totalObservations:N,totalSessions:A,totalTokensSaved:_,averageObservationSize:S,typeBreakdown:V}}async maintainFolderContext(N,E){if(N==="purge")return{action:"purge",dryRun:!1,...await B2(this.projectPath,this.config.folderContextFilename)};if(N==="rebuild"){let M=await D2(this.projectPath,this.sessions,this.observations,{maxDepth:this.config.folderContextMaxDepth,mode:this.config.folderContextMode,filename:this.config.folderContextFilename},E);return{action:N,dryRun:E,...M}}let A=await K2(this.projectPath,this.config.folderContextFilename,E);return{action:"clean",dryRun:E,...A}}getRevisionDiff(N,E){let A=this.getByIdIncludingArchived(N),M=this.getByIdIncludingArchived(E);if(!A||!M)return null;let O=[],$=(_,S,J)=>{if(JSON.stringify(S)!==JSON.stringify(J))O.push({field:_,before:S,after:J})};$("title",M.title,A.title),$("subtitle",M.subtitle,A.subtitle),$("narrative",M.narrative,A.narrative),$("type",M.type,A.type),$("facts",M.facts,A.facts),$("concepts",M.concepts,A.concepts),$("filesRead",M.filesRead,A.filesRead),$("filesModified",M.filesModified,A.filesModified),$("importance",M.importance,A.importance);let V=O.length===0?"No material changes between revisions.":`Changed ${O.length} field${O.length===1?"":"s"}: ${O.map((_)=>_.field).join(", ")}.`;return{fromId:E,toId:N,summary:V,changedFields:O}}getHealth(){let N=this.runtimeSnapshotProvider?.(),E=N&&N.queue.lastError?"degraded":"ok";return{status:N?.status??"ok",timestamp:N?.timestamp??new Date().toISOString(),components:{database:{status:"ok"},search:{status:"ok"},config:{status:"ok"},queue:{status:E,detail:N?.queue.lastError??void 0}}}}getMetrics(){let N=this.stats();return{timestamp:this.runtimeSnapshotProvider?.()?.timestamp??new Date().toISOString(),memory:{totalObservations:N.totalObservations,totalSessions:N.totalSessions,totalTokensSaved:N.totalTokensSaved,averageObservationSize:N.averageObservationSize}}}getPlatforms(){return{name:"open-mem",provider:this.config.provider,dashboardEnabled:this.config.dashboardEnabled,vectorEnabled:Boolean(this.config.embeddingDimension&&this.config.embeddingDimension>0)}}getAdapterStatuses(){let N={opencode:this.config.platformOpenCodeEnabled??!0,"claude-code":this.config.platformClaudeCodeEnabled??!1,cursor:this.config.platformCursorEnabled??!1};return[{name:"opencode",version:"1.0",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!1}},{name:"claude-code",version:"0.1",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}},{name:"cursor",version:"0.1",capabilities:{nativeSessionLifecycle:!1,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}}].map((A)=>({name:A.name,version:A.version,enabled:N[A.name]??!1,capabilities:A.capabilities}))}getConfigAuditTimeline(){if(this.configAuditStore)return this.configAuditStore.list();return[...this.configAuditLogFallback].reverse()}trackConfigAudit(N){if(this.configAuditStore){this.configAuditStore.append(N);return}this.configAuditLogFallback.push(N)}async rollbackConfig(N){let E=this.configAuditStore?this.configAuditStore.getById(N):this.configAuditLogFallback.find(($)=>$.id===N)??null;if(!E)return null;if(!E.previousValues||typeof E.previousValues!=="object")return null;let{patchConfig:A}=await Promise.resolve().then(() => (D1(),gN)),M=E.previousValues;try{await A(this.projectPath,M)}catch($){let V={id:`rollback-failed-${Y2()}`,timestamp:new Date().toISOString(),patch:E.previousValues,previousValues:E.patch,source:"rollback-failed"};throw this.trackConfigAudit(V),$}let O={id:`rollback-${Y2()}`,timestamp:new Date().toISOString(),patch:E.previousValues,previousValues:E.patch,source:"rollback"};return this.trackConfigAudit(O),O}getMaintenanceHistory(){if(this.maintenanceHistoryStore)return this.maintenanceHistoryStore.list();return[...this.maintenanceLogFallback].reverse()}trackMaintenanceResult(N){if(this.maintenanceHistoryStore){this.maintenanceHistoryStore.append(N);return}this.maintenanceLogFallback.push(N)}}import{existsSync as mA}from"fs";import{existsSync as kA}from"fs";import{homedir as wA}from"os";import{join as R2}from"path";function qA(){let N=[],E=process.env.BUN_INSTALL;if(E)N.push(R2(E,"bin","bun"));let A=wA();return N.push(R2(A,".bun","bin","bun")),N.push("/usr/local/bin/bun"),N.push("/opt/homebrew/bin/bun"),N.push("/home/linuxbrew/.linuxbrew/bin/bun"),N}function PA(){let N=Bun.which("bun");if(N)return N;for(let E of qA())if(kA(E))return console.debug(`[open-mem] Resolved bun path via candidate scan: ${E}`),E;return"bun"}var h1=null;function z2(){if(h1===null)h1=PA();return h1}import{existsSync as xA,mkdirSync as r_,readFileSync as vA,unlinkSync as uA,writeFileSync as i_}from"fs";function t(N){if(!xA(N))return null;let E=vA(N,"utf-8").trim(),A=Number.parseInt(E,10);if(Number.isNaN(A))return null;return A}function $0(N){try{return process.kill(N,0),!0}catch(E){if(E instanceof Error&&"code"in E&&E.code==="EPERM")return!0;return!1}}function Y0(N){try{uA(N)}catch{}}function p0(N){let E=N.lastIndexOf("/");if(E>=0)return`${N.substring(0,E)}/worker.pid`;return"worker.pid"}var gA=100,hA=2000;class c1{pidPath;projectPath;daemonScript;subprocess=null;constructor(N){this.pidPath=p0(N.dbPath),this.projectPath=N.projectPath,this.daemonScript=N.daemonScript}start(){if(this.isRunning())return!1;this.subprocess=Bun.spawn([z2(),"run",this.daemonScript,"--project",this.projectPath],{detached:!0,stdio:["ignore","ignore","ignore"],ipc(E){}}),this.subprocess.unref();let N=Date.now()+hA;while(Date.now()<N)if(Bun.sleepSync(gA),mA(this.pidPath)){let E=t(this.pidPath);if(E!==null&&$0(E))return!0}return!1}signal(N){try{this.subprocess?.send(N)}catch{}}stop(){let N=t(this.pidPath);if(N!==null)try{process.kill(N,"SIGTERM")}catch{}this.subprocess=null,Y0(this.pidPath)}isRunning(){let N=t(this.pidPath);if(N===null)return!1;return $0(N)}getStatus(){let N=t(this.pidPath);if(N===null)return{running:!1,pid:null};if(!$0(N))return{running:!1,pid:null};return{running:!0,pid:N}}}import{existsSync as l1}from"fs";function L2(N){let E={reaped:0,errors:[]};try{let A=p0(N),M=t(A);if(M===null){try{if(l1(A))if(Y0(A),!l1(A))E.reaped++,console.log("[open-mem] Reaped corrupt daemon PID file");else E.errors.push("Failed to remove corrupt PID file: file still exists after removal")}catch(O){E.errors.push(`Failed to check/remove corrupt PID file: ${O instanceof Error?O.message:String(O)}`)}return E}if($0(M))return E;if(Y0(A),!l1(A))E.reaped++,console.log(`[open-mem] Reaped stale daemon PID file (pid=${M})`);else E.errors.push(`Failed to remove stale PID file (pid=${M}): file still exists after removal`)}catch(A){E.errors.push(`Reaper error: ${A instanceof Error?A.message:String(A)}`)}return E}function n0(N){try{let E=JSON.parse(N);return E&&typeof E==="object"?E:{}}catch{return{}}}class b1{db;constructor(N){this.db=N}list(){return this.db.all("SELECT id, timestamp, patch, previous_values, source FROM config_audit_events ORDER BY timestamp DESC").map((N)=>({id:N.id,timestamp:N.timestamp,patch:n0(N.patch),previousValues:n0(N.previous_values),source:N.source}))}getById(N){let E=this.db.get("SELECT id, timestamp, patch, previous_values, source FROM config_audit_events WHERE id = ?",[N]);if(!E)return null;return{id:E.id,timestamp:E.timestamp,patch:n0(E.patch),previousValues:n0(E.previous_values),source:E.source}}append(N){this.db.run("INSERT INTO config_audit_events (id, timestamp, patch, previous_values, source) VALUES (?, ?, ?, ?, ?)",[N.id,N.timestamp,JSON.stringify(N.patch??{}),JSON.stringify(N.previousValues??{}),N.source])}}import{Database as G2}from"bun:sqlite";import{existsSync as p1,mkdirSync as cA,unlinkSync as H2}from"fs";import*as C2 from"sqlite-vec";class r0{db;dbPath;_hasVectorExtension=!1;static enableExtensionSupport(){let N=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite/lib/libsqlite3.dylib"];for(let E of N)try{if(p1(E))return G2.setCustomSQLite(E),!0}catch{return!1}return!1}constructor(N){this.dbPath=N,this.db=this.open(N),this.configure()}open(N){let E=N.lastIndexOf("/");if(E>0){let A=N.substring(0,E);cA(A,{recursive:!0})}return new G2(N,{create:!0})}configure(){try{this.applyPragmas(),this.loadExtensions()}catch(N){console.warn("[open-mem] Database configure failed, attempting recovery by removing WAL/SHM files:",N.message);try{this.db.close()}catch{}this.deleteSidecarFiles();try{this.db=this.open(this.dbPath),this.applyPragmas(),this.loadExtensions(),console.warn("[open-mem] Recovery successful after removing WAL/SHM files");return}catch(E){console.warn("[open-mem] WAL/SHM cleanup insufficient, recreating database from scratch:",E.message);try{this.db.close()}catch{}this.deleteDatabaseFiles();try{this.db=this.open(this.dbPath),this.applyPragmas(),this.loadExtensions(),console.warn("[open-mem] Recovery successful after full database recreation");return}catch(A){throw console.warn("[open-mem] All recovery attempts failed, filesystem may be broken:",A.message),N}}}}applyPragmas(){this.db.exec("PRAGMA journal_mode = WAL"),this.db.exec("PRAGMA synchronous = NORMAL"),this.db.exec("PRAGMA foreign_keys = ON"),this.db.exec("PRAGMA busy_timeout = 5000")}loadExtensions(){try{C2.load(this.db),this._hasVectorExtension=!0}catch{this._hasVectorExtension=!1}}get hasVectorExtension(){return this._hasVectorExtension}deleteSidecarFiles(){for(let N of["-wal","-shm"]){let E=this.dbPath+N;try{if(p1(E))H2(E)}catch{}}}deleteDatabaseFiles(){this.deleteSidecarFiles();try{if(p1(this.dbPath))H2(this.dbPath)}catch{}}ensureMigrationTable(){this.db.exec(`
198
193
  CREATE TABLE IF NOT EXISTS _migrations (
199
194
  version INTEGER PRIMARY KEY,
200
195
  name TEXT NOT NULL,
201
196
  applied_at TEXT NOT NULL DEFAULT (datetime('now'))
202
197
  )
203
- `)}migrate(N){this.ensureMigrationTable();let E=this.db.query("SELECT version FROM _migrations ORDER BY version").all(),O=new Set(E.map((A)=>A.version)),M=N.filter((A)=>!O.has(A.version)).sort((A,$)=>A.version-$.version);for(let A of M)this.db.transaction(()=>{this.db.exec(A.up),this.db.query("INSERT INTO _migrations (version, name) VALUES ($version, $name)").run({$version:A.version,$name:A.name})})()}run(N,E){let O=this.db.query(N);if(E)O.run(...E);else O.run()}get(N,E){let O=this.db.query(N);return E?O.get(...E):O.get()}all(N,E){let O=this.db.query(N);return E?O.all(...E):O.all()}exec(N){this.db.exec(N)}transaction(N){return this.db.transaction(N)()}close(){this.db.close()}get isOpen(){try{return this.db.query("SELECT 1").get(),!0}catch{return!1}}get raw(){return this.db}}function n0(N){return new p0(N)}import{randomUUID as KE}from"crypto";class h1{db;constructor(N){this.db=N}upsertEntity(N,E){let O=KE(),M=new Date().toISOString();this.db.run(`INSERT INTO entities (id, name, entity_type, first_seen_at, last_seen_at, mention_count)
198
+ `)}migrate(N){this.ensureMigrationTable();let E=this.db.query("SELECT version FROM _migrations ORDER BY version").all(),A=new Set(E.map((O)=>O.version)),M=N.filter((O)=>!A.has(O.version)).sort((O,$)=>O.version-$.version);for(let O of M)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(N,E){let A=this.db.query(N);if(E)A.run(...E);else A.run()}get(N,E){let A=this.db.query(N);return E?A.get(...E):A.get()}all(N,E){let A=this.db.query(N);return E?A.all(...E):A.all()}exec(N){this.db.exec(N)}transaction(N){return this.db.transaction(N)()}close(){this.db.close()}get isOpen(){try{return this.db.query("SELECT 1").get(),!0}catch{return!1}}get raw(){return this.db}}function i0(N){return new r0(N)}import{randomUUID as F2}from"crypto";class n1{db;constructor(N){this.db=N}upsertEntity(N,E){let A=F2(),M=new Date().toISOString();this.db.run(`INSERT INTO entities (id, name, entity_type, first_seen_at, last_seen_at, mention_count)
204
199
  VALUES (?, ?, ?, ?, ?, 1)
205
200
  ON CONFLICT(name, entity_type) DO UPDATE SET
206
201
  mention_count = mention_count + 1,
207
- last_seen_at = ?`,[O,N,E,M,M,M]);let A=this.db.get("SELECT * FROM entities WHERE name = ? AND entity_type = ?",[N,E]);if(!A)throw Error(`Failed to upsert entity: ${N} (${E})`);return this.mapEntityRow(A)}createRelation(N,E,O,M){let A=KE(),$=new Date().toISOString();try{this.db.run(`INSERT OR IGNORE INTO entity_relations
202
+ last_seen_at = ?`,[A,N,E,M,M,M]);let O=this.db.get("SELECT * FROM entities WHERE name = ? AND entity_type = ?",[N,E]);if(!O)throw Error(`Failed to upsert entity: ${N} (${E})`);return this.mapEntityRow(O)}createRelation(N,E,A,M){let O=F2(),$=new Date().toISOString();try{this.db.run(`INSERT OR IGNORE INTO entity_relations
208
203
  (id, source_entity_id, target_entity_id, relationship, observation_id, created_at)
209
- VALUES (?, ?, ?, ?, ?, ?)`,[A,N,E,O,M,$])}catch{return null}let _=this.db.get(`SELECT * FROM entity_relations
210
- WHERE source_entity_id = ? AND target_entity_id = ? AND relationship = ?`,[N,E,O]);return _?this.mapRelationRow(_):null}linkObservation(N,E){this.db.run("INSERT OR IGNORE INTO entity_observations (entity_id, observation_id) VALUES (?, ?)",[N,E])}findByName(N){try{return this.db.all(`SELECT e.*
204
+ VALUES (?, ?, ?, ?, ?, ?)`,[O,N,E,A,M,$])}catch{return null}let V=this.db.get(`SELECT * FROM entity_relations
205
+ WHERE source_entity_id = ? AND target_entity_id = ? AND relationship = ?`,[N,E,A]);return V?this.mapRelationRow(V):null}linkObservation(N,E){this.db.run("INSERT OR IGNORE INTO entity_observations (entity_id, observation_id) VALUES (?, ?)",[N,E])}findByName(N){try{return this.db.all(`SELECT e.*
211
206
  FROM entities e
212
207
  JOIN entities_fts fts ON e._rowid = fts.rowid
213
208
  WHERE entities_fts MATCH ?
214
- ORDER BY rank`,[N]).map((O)=>this.mapEntityRow(O))}catch{return[]}}getRelationsFor(N){return this.db.all(`SELECT * FROM entity_relations
215
- WHERE source_entity_id = ? OR target_entity_id = ?`,[N,N]).map((O)=>this.mapRelationRow(O))}traverseRelations(N,E=1){let O=Math.min(E,2),M=100,A=new Set,$=[{id:N,currentDepth:0}];A.add(N);while($.length>0){if(A.size>=100)break;let _=$.shift();if(!_)continue;if(_.currentDepth>=O)continue;let S=this.getRelationsFor(_.id);for(let V of S){let f=V.sourceEntityId===_.id?V.targetEntityId:V.sourceEntityId;if(!A.has(f))A.add(f),$.push({id:f,currentDepth:_.currentDepth+1})}}return A}getObservationsForEntity(N){return this.db.all("SELECT observation_id FROM entity_observations WHERE entity_id = ?",[N]).map((O)=>O.observation_id)}getById(N){let E=this.db.get("SELECT * FROM entities WHERE id = ?",[N]);return E?this.mapEntityRow(E):null}mapEntityRow(N){return{id:N.id,name:N.name,entityType:N.entity_type,firstSeenAt:N.first_seen_at,lastSeenAt:N.last_seen_at,mentionCount:N.mention_count}}mapRelationRow(N){return{id:N.id,sourceEntityId:N.source_entity_id,targetEntityId:N.target_entity_id,relationship:N.relationship,observationId:N.observation_id,createdAt:N.created_at}}}function TO(N){try{let E=JSON.parse(N);return E&&typeof E==="object"?E:{}}catch{return{}}}class c1{db;constructor(N){this.db=N}list(){return this.db.all("SELECT id, timestamp, action, dry_run, result FROM maintenance_history ORDER BY timestamp DESC").map((N)=>({id:N.id,timestamp:N.timestamp,action:N.action,dryRun:N.dry_run===1,result:TO(N.result)}))}append(N){this.db.run("INSERT INTO maintenance_history (id, timestamp, action, dry_run, result) VALUES (?, ?, ?, ?, ?)",[N.id,N.timestamp,N.action,N.dryRun?1:0,JSON.stringify(N.result??{})])}}import{randomUUID as wO}from"crypto";import{embed as kO}from"ai";async function t(N,E){try{let{embedding:O}=await kO({model:N,value:E});return O}catch{return null}}function $0(N,E){if(N.length!==E.length||N.length===0)return 0;let O=0,M=0,A=0;for(let _=0;_<N.length;_++)O+=N[_]*E[_],M+=N[_]*N[_],A+=E[_]*E[_];let $=Math.sqrt(M)*Math.sqrt(A);if($===0)return 0;return O/$}function l1(N){let E=[N.title,N.narrative];if(N.concepts.length>0)E.push(N.concepts.join(", "));return E.join(`
216
- `)}function qO(N){return N.replace(/[%_\\]/g,"\\$&")}class b1{db;constructor(N){this.db=N}create(N){let E=wO(),O=new Date().toISOString(),M=N.discoveryTokens??0,A=N.importance??3,$=N.scope??"project";return this.db.run(`INSERT INTO observations
209
+ ORDER BY rank`,[N]).map((A)=>this.mapEntityRow(A))}catch{return[]}}getRelationsFor(N){return this.db.all(`SELECT * FROM entity_relations
210
+ WHERE source_entity_id = ? OR target_entity_id = ?`,[N,N]).map((A)=>this.mapRelationRow(A))}traverseRelations(N,E=1){let A=Math.min(E,2),M=100,O=new Set,$=[{id:N,currentDepth:0}];O.add(N);while($.length>0){if(O.size>=100)break;let V=$.shift();if(!V)continue;if(V.currentDepth>=A)continue;let _=this.getRelationsFor(V.id);for(let S of _){let J=S.sourceEntityId===V.id?S.targetEntityId:S.sourceEntityId;if(!O.has(J))O.add(J),$.push({id:J,currentDepth:V.currentDepth+1})}}return O}getObservationsForEntity(N){return this.db.all("SELECT observation_id FROM entity_observations WHERE entity_id = ?",[N]).map((A)=>A.observation_id)}getById(N){let E=this.db.get("SELECT * FROM entities WHERE id = ?",[N]);return E?this.mapEntityRow(E):null}mapEntityRow(N){return{id:N.id,name:N.name,entityType:N.entity_type,firstSeenAt:N.first_seen_at,lastSeenAt:N.last_seen_at,mentionCount:N.mention_count}}mapRelationRow(N){return{id:N.id,sourceEntityId:N.source_entity_id,targetEntityId:N.target_entity_id,relationship:N.relationship,observationId:N.observation_id,createdAt:N.created_at}}}function lA(N){try{let E=JSON.parse(N);return E&&typeof E==="object"?E:{}}catch{return{}}}class r1{db;constructor(N){this.db=N}list(){return this.db.all("SELECT id, timestamp, action, dry_run, result FROM maintenance_history ORDER BY timestamp DESC").map((N)=>({id:N.id,timestamp:N.timestamp,action:N.action,dryRun:N.dry_run===1,result:lA(N.result)}))}append(N){this.db.run("INSERT INTO maintenance_history (id, timestamp, action, dry_run, result) VALUES (?, ?, ?, ?, ?)",[N.id,N.timestamp,N.action,N.dryRun?1:0,JSON.stringify(N.result??{})])}}import{randomUUID as pA}from"crypto";import{embed as bA}from"ai";async function a(N,E){try{let{embedding:A}=await bA({model:N,value:E});return A}catch{return null}}function _0(N,E){if(N.length!==E.length||N.length===0)return 0;let A=0,M=0,O=0;for(let V=0;V<N.length;V++)A+=N[V]*E[V],M+=N[V]*N[V],O+=E[V]*E[V];let $=Math.sqrt(M)*Math.sqrt(O);if($===0)return 0;return A/$}function i1(N){let E=[N.title,N.narrative];if(N.concepts.length>0)E.push(N.concepts.join(", "));return E.join(`
211
+ `)}function nA(N){return N.replace(/[%_\\]/g,"\\$&")}class d1{db;constructor(N){this.db=N}create(N){let E=pA(),A=new Date().toISOString(),M=N.discoveryTokens??0,O=N.importance??3,$=N.scope??"project";return this.db.run(`INSERT INTO observations
217
212
  (id, session_id, scope, type, title, subtitle, facts, narrative,
218
213
  concepts, files_read, files_modified, raw_tool_output,
219
214
  tool_name, created_at, token_count, discovery_tokens, importance, revision_of, deleted_at)
220
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[E,N.sessionId,$,N.type,N.title,N.subtitle,JSON.stringify(N.facts),N.narrative,JSON.stringify(N.concepts),JSON.stringify(N.filesRead),JSON.stringify(N.filesModified),N.rawToolOutput,N.toolName,O,N.tokenCount,M,A,null,null]),{...N,id:E,scope:$,createdAt:O,discoveryTokens:M,importance:A,revisionOf:null,deletedAt:null,supersededBy:null,supersededAt:null}}importObservation(N){this.db.run(`INSERT INTO observations
215
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[E,N.sessionId,$,N.type,N.title,N.subtitle,JSON.stringify(N.facts),N.narrative,JSON.stringify(N.concepts),JSON.stringify(N.filesRead),JSON.stringify(N.filesModified),N.rawToolOutput,N.toolName,A,N.tokenCount,M,O,null,null]),{...N,id:E,scope:$,createdAt:A,discoveryTokens:M,importance:O,revisionOf:null,deletedAt:null,supersededBy:null,supersededAt:null}}importObservation(N){this.db.run(`INSERT INTO observations
221
216
  (id, session_id, scope, type, title, subtitle, facts, narrative,
222
217
  concepts, files_read, files_modified, raw_tool_output,
223
218
  tool_name, created_at, token_count, discovery_tokens, importance, revision_of, deleted_at)
@@ -226,29 +221,29 @@ ${J}`}return f}guide(){return["# open-mem Workflow Guide","","## Reading Memorie
226
221
  JOIN sessions s ON o.session_id = s.id
227
222
  WHERE s.project_path = ? AND o.superseded_by IS NULL AND o.deleted_at IS NULL
228
223
  ORDER BY o.created_at DESC
229
- LIMIT ?`,[N,E]).map((O)=>({id:O.id,sessionId:O.session_id,type:O.type,title:O.title,tokenCount:O.token_count,discoveryTokens:O.discovery_tokens??0,createdAt:O.created_at,importance:O.importance??3}))}getAroundTimestamp(N,E,O,M){let A=E>0?this.db.all(`SELECT o.*
224
+ LIMIT ?`,[N,E]).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}))}getAroundTimestamp(N,E,A,M){let O=E>0?this.db.all(`SELECT o.*
230
225
  FROM observations o
231
226
  JOIN sessions s ON o.session_id = s.id
232
227
  WHERE s.project_path = ? AND o.created_at < ?
233
228
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
234
229
  ORDER BY o.created_at DESC
235
- LIMIT ?`,[M,N,E]).reverse():[],$=O>0?this.db.all(`SELECT o.*
230
+ LIMIT ?`,[M,N,E]).reverse():[],$=A>0?this.db.all(`SELECT o.*
236
231
  FROM observations o
237
232
  JOIN sessions s ON o.session_id = s.id
238
233
  WHERE s.project_path = ? AND o.created_at > ?
239
234
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
240
235
  ORDER BY o.created_at ASC
241
- LIMIT ?`,[M,N,O]):[];return[...A,...$].map((_)=>this.mapRow(_))}listByProject(N,E={}){let{limit:O=50,offset:M=0,type:A,state:$,sessionId:_}=E,S=`SELECT o.*
236
+ LIMIT ?`,[M,N,A]):[];return[...O,...$].map((V)=>this.mapRow(V))}listByProject(N,E={}){let{limit:A=50,offset:M=0,type:O,state:$,sessionId:V}=E,_=`SELECT o.*
242
237
  FROM observations o
243
238
  JOIN sessions s ON o.session_id = s.id
244
- WHERE s.project_path = ?`,V=[N];if(_)S+=" AND o.session_id = ?",V.push(_);if(A)S+=" AND o.type = ?",V.push(A);if($==="current")S+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";else if($==="superseded")S+=" AND o.superseded_by IS NOT NULL AND o.deleted_at IS NULL";else if($==="tombstoned")S+=" AND o.deleted_at IS NOT NULL";else S+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";return S+=" ORDER BY o.created_at DESC LIMIT ? OFFSET ?",V.push(O,M),this.db.all(S,V).map((f)=>this.mapRow(f))}search(N){let E=!!N.projectPath,O=`
239
+ WHERE s.project_path = ?`,S=[N];if(V)_+=" AND o.session_id = ?",S.push(V);if(O)_+=" AND o.type = ?",S.push(O);if($==="current")_+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";else if($==="superseded")_+=" AND o.superseded_by IS NOT NULL AND o.deleted_at IS NULL";else if($==="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(A,M),this.db.all(_,S).map((J)=>this.mapRow(J))}search(N){let E=!!N.projectPath,A=`
245
240
  SELECT o.*, rank
246
241
  FROM observations o
247
242
  JOIN observations_fts fts ON o._rowid = fts.rowid
248
243
  ${E?"JOIN sessions s ON o.session_id = s.id":""}
249
244
  WHERE observations_fts MATCH ? AND o.superseded_by IS NULL AND o.deleted_at IS NULL
250
- `,M=[N.query];if(E&&N.projectPath)O+=" AND s.project_path = ?",M.push(N.projectPath);if(N.sessionId)O+=" AND o.session_id = ?",M.push(N.sessionId);if(N.type)O+=" AND o.type = ?",M.push(N.type);if(N.importanceMin!==void 0)O+=" AND o.importance >= ?",M.push(N.importanceMin);if(N.importanceMax!==void 0)O+=" AND o.importance <= ?",M.push(N.importanceMax);if(N.createdAfter)O+=" AND o.created_at >= ?",M.push(N.createdAfter);if(N.createdBefore)O+=" AND o.created_at <= ?",M.push(N.createdBefore);if(N.concepts&&N.concepts.length>0){let A=N.concepts.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE LOWER(value) = LOWER(?))");O+=` AND (${A.join(" OR ")})`;for(let $ of N.concepts)M.push($)}if(N.files&&N.files.length>0){let A=N.files.map(()=>`(EXISTS (SELECT 1 FROM json_each(o.files_read) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\')
251
- OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\'))`);O+=` AND (${A.join(" OR ")})`;for(let $ of N.files){let _=`%${qO($)}%`;M.push(_,_)}}return O+=" ORDER BY rank LIMIT ? OFFSET ?",M.push(N.limit??10),M.push(N.offset??0),this.db.all(O,M).map((A)=>({observation:this.mapRow(A),rank:A.rank,snippet:A.title}))}searchByConcept(N,E=10,O){let M=!!O,A=`SELECT o.*
245
+ `,M=[N.query];if(E&&N.projectPath)A+=" AND s.project_path = ?",M.push(N.projectPath);if(N.sessionId)A+=" AND o.session_id = ?",M.push(N.sessionId);if(N.type)A+=" AND o.type = ?",M.push(N.type);if(N.importanceMin!==void 0)A+=" AND o.importance >= ?",M.push(N.importanceMin);if(N.importanceMax!==void 0)A+=" AND o.importance <= ?",M.push(N.importanceMax);if(N.createdAfter)A+=" AND o.created_at >= ?",M.push(N.createdAfter);if(N.createdBefore)A+=" AND o.created_at <= ?",M.push(N.createdBefore);if(N.concepts&&N.concepts.length>0){let O=N.concepts.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE LOWER(value) = LOWER(?))");A+=` AND (${O.join(" OR ")})`;for(let $ of N.concepts)M.push($)}if(N.files&&N.files.length>0){let O=N.files.map(()=>`(EXISTS (SELECT 1 FROM json_each(o.files_read) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\')
246
+ OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE LOWER(value) LIKE LOWER(?) ESCAPE '\\'))`);A+=` AND (${O.join(" OR ")})`;for(let $ of N.files){let V=`%${nA($)}%`;M.push(V,V)}}return A+=" ORDER BY rank LIMIT ? OFFSET ?",M.push(N.limit??10),M.push(N.offset??0),this.db.all(A,M).map((O)=>({observation:this.mapRow(O),rank:O.rank,snippet:O.title}))}searchByConcept(N,E=10,A){let M=!!A,O=`SELECT o.*
252
247
  FROM observations o
253
248
  JOIN observations_fts fts ON o._rowid = fts.rowid
254
249
  ${M?"JOIN sessions s ON o.session_id = s.id":""}
@@ -256,7 +251,7 @@ ${J}`}return f}guide(){return["# open-mem Workflow Guide","","## Reading Memorie
256
251
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
257
252
  ${M?"AND s.project_path = ?":""}
258
253
  ORDER BY rank
259
- LIMIT ?`,$=[`concepts:${N}`];if(M&&O)$.push(O);return $.push(E),this.db.all(A,$).map((_)=>this.mapRow(_))}searchByFile(N,E=10,O){let M=!!O,A=`SELECT o.*
254
+ LIMIT ?`,$=[`concepts:${N}`];if(M&&A)$.push(A);return $.push(E),this.db.all(O,$).map((V)=>this.mapRow(V))}searchByFile(N,E=10,A){let M=!!A,O=`SELECT o.*
260
255
  FROM observations o
261
256
  JOIN observations_fts fts ON o._rowid = fts.rowid
262
257
  ${M?"JOIN sessions s ON o.session_id = s.id":""}
@@ -264,30 +259,30 @@ ${J}`}return f}guide(){return["# open-mem Workflow Guide","","## Reading Memorie
264
259
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
265
260
  ${M?"AND s.project_path = ?":""}
266
261
  ORDER BY rank
267
- LIMIT ?`,$=[`files_read:"${N.replace(/"/g,'""')}" OR files_modified:"${N.replace(/"/g,'""')}"`];if(M&&O)$.push(O);return $.push(E),this.db.all(A,$).map((_)=>this.mapRow(_))}setEmbedding(N,E){this.db.run("UPDATE observations SET embedding = ? WHERE id = ?",[JSON.stringify(E),N])}getWithEmbeddings(N,E){return this.db.all(`SELECT o.id, o.embedding, o.title
262
+ LIMIT ?`,$=[`files_read:"${N.replace(/"/g,'""')}" OR files_modified:"${N.replace(/"/g,'""')}"`];if(M&&A)$.push(A);return $.push(E),this.db.all(O,$).map((V)=>this.mapRow(V))}setEmbedding(N,E){this.db.run("UPDATE observations SET embedding = ? WHERE id = ?",[JSON.stringify(E),N])}getWithEmbeddings(N,E){return this.db.all(`SELECT o.id, o.embedding, o.title
268
263
  FROM observations o
269
264
  JOIN sessions s ON o.session_id = s.id
270
265
  WHERE s.project_path = ? AND o.embedding IS NOT NULL AND o.superseded_by IS NULL AND o.deleted_at IS NULL
271
266
  ORDER BY o.created_at DESC
272
- LIMIT ?`,[N,E]).map((O)=>{try{return{id:O.id,embedding:JSON.parse(O.embedding),title:O.title}}catch{return null}}).filter((O)=>O!==null)}findSimilar(N,E,O,M){let A=this.db.all(`SELECT id, embedding FROM observations
267
+ LIMIT ?`,[N,E]).map((A)=>{try{return{id:A.id,embedding:JSON.parse(A.embedding),title:A.title}}catch{return null}}).filter((A)=>A!==null)}findSimilar(N,E,A,M){let O=this.db.all(`SELECT id, embedding FROM observations
273
268
  WHERE embedding IS NOT NULL AND type = ? AND superseded_by IS NULL AND deleted_at IS NULL
274
269
  ORDER BY created_at DESC
275
- LIMIT 200`,[E]),$=[];for(let _ of A)try{let S=JSON.parse(_.embedding);if(!Array.isArray(S)||S.length!==N.length)continue;let V=$0(N,S);if(V>=O)$.push({id:_.id,similarity:V})}catch{}return $.sort((_,S)=>S.similarity-_.similarity).slice(0,M)}insertVecEmbedding(N,E){let O=new Float32Array(E);this.db.run("BEGIN");try{this.db.run("DELETE FROM observation_embeddings WHERE observation_id = ?",[N]),this.db.run("INSERT INTO observation_embeddings (observation_id, embedding) VALUES (?, ?)",[N,O]),this.db.run("COMMIT")}catch(M){throw this.db.run("ROLLBACK"),M}}migrateExistingEmbeddings(N){let E=this.db.all("SELECT id, embedding FROM observations WHERE embedding IS NOT NULL"),O=0,M=0;for(let A of E)try{let $=JSON.parse(A.embedding);if(!Array.isArray($)||$.length!==N){M++;continue}this.insertVecEmbedding(A.id,$),O++}catch{M++}return{migrated:O,skipped:M}}getVecEmbeddingMatches(N,E){try{let O=new Float32Array(N);return this.db.all(`SELECT observation_id, distance
270
+ LIMIT 200`,[E]),$=[];for(let V of O)try{let _=JSON.parse(V.embedding);if(!Array.isArray(_)||_.length!==N.length)continue;let S=_0(N,_);if(S>=A)$.push({id:V.id,similarity:S})}catch{}return $.sort((V,_)=>_.similarity-V.similarity).slice(0,M)}insertVecEmbedding(N,E){let A=new Float32Array(E);this.db.run("BEGIN");try{this.db.run("DELETE FROM observation_embeddings WHERE observation_id = ?",[N]),this.db.run("INSERT INTO observation_embeddings (observation_id, embedding) VALUES (?, ?)",[N,A]),this.db.run("COMMIT")}catch(M){throw this.db.run("ROLLBACK"),M}}migrateExistingEmbeddings(N){let E=this.db.all("SELECT id, embedding FROM observations WHERE embedding IS NOT NULL"),A=0,M=0;for(let O of E)try{let $=JSON.parse(O.embedding);if(!Array.isArray($)||$.length!==N){M++;continue}this.insertVecEmbedding(O.id,$),A++}catch{M++}return{migrated:A,skipped:M}}getVecEmbeddingMatches(N,E){try{let A=new Float32Array(N);return this.db.all(`SELECT observation_id, distance
276
271
  FROM observation_embeddings
277
- WHERE embedding MATCH ? AND k = ?`,[O,E]).map((M)=>({observationId:M.observation_id,distance:M.distance}))}catch{return[]}}searchVecSubset(N,E,O){if(E.length===0)return[];try{let M=new Float32Array(N),A=Math.max(O*5,E.length),$=this.db.all(`SELECT observation_id, distance
272
+ WHERE embedding MATCH ? AND k = ?`,[A,E]).map((M)=>({observationId:M.observation_id,distance:M.distance}))}catch{return[]}}searchVecSubset(N,E,A){if(E.length===0)return[];try{let M=new Float32Array(N),O=Math.max(A*5,E.length),$=this.db.all(`SELECT observation_id, distance
278
273
  FROM observation_embeddings
279
- WHERE embedding MATCH ? AND k = ?`,[M,A]),_=new Set(E);return $.filter((S)=>_.has(S.observation_id)).slice(0,O).map((S)=>({observationId:S.observation_id,distance:S.distance}))}catch{return[]}}update(N,E){let O=this.getById(N);if(!O)return null;if(Object.keys(E).length===0)return O;let M=this.create({sessionId:O.sessionId,scope:O.scope??"project",type:E.type??O.type,title:E.title??O.title,subtitle:E.subtitle??O.subtitle,facts:E.facts??O.facts,narrative:E.narrative??O.narrative,concepts:E.concepts??O.concepts,filesRead:E.filesRead??O.filesRead,filesModified:E.filesModified??O.filesModified,rawToolOutput:O.rawToolOutput,toolName:"mem-revise",tokenCount:O.tokenCount,discoveryTokens:O.discoveryTokens,importance:E.importance??O.importance});return this.db.run("UPDATE observations SET revision_of = ? WHERE id = ?",[N,M.id]),this.supersede(N,M.id),this.getById(M.id)}supersede(N,E){let O=new Date().toISOString();this.db.run("UPDATE observations SET superseded_by = ?, superseded_at = ? WHERE id = ?",[E,O,N])}delete(N){if(this.db.all("SELECT id FROM observations WHERE id = ?",[N]).length===0)return!1;let O=new Date().toISOString();return this.db.run("UPDATE observations SET deleted_at = ? WHERE id = ?",[O,N]),this.deleteEmbeddingsForObservations([N]),!0}getLineage(N){let E=this.getByIdIncludingArchived(N);if(!E)return[];let O=new Set([E.id]),M=[E];while(M[0].revisionOf){let A=this.getByIdIncludingArchived(M[0].revisionOf);if(!A||O.has(A.id))break;M.unshift(A),O.add(A.id)}while(M[M.length-1].supersededBy){let A=M[M.length-1].supersededBy;if(!A)break;let $=this.getByIdIncludingArchived(A);if(!$||O.has($.id))break;M.push($),O.add($.id)}return M}deleteOlderThan(N){return this.db.all(`DELETE FROM observations
274
+ WHERE embedding MATCH ? AND k = ?`,[M,O]),V=new Set(E);return $.filter((_)=>V.has(_.observation_id)).slice(0,A).map((_)=>({observationId:_.observation_id,distance:_.distance}))}catch{return[]}}update(N,E){let A=this.getById(N);if(!A)return null;if(Object.keys(E).length===0)return A;let M=this.create({sessionId:A.sessionId,scope:A.scope??"project",type:E.type??A.type,title:E.title??A.title,subtitle:E.subtitle??A.subtitle,facts:E.facts??A.facts,narrative:E.narrative??A.narrative,concepts:E.concepts??A.concepts,filesRead:E.filesRead??A.filesRead,filesModified:E.filesModified??A.filesModified,rawToolOutput:A.rawToolOutput,toolName:"mem-revise",tokenCount:A.tokenCount,discoveryTokens:A.discoveryTokens,importance:E.importance??A.importance});return this.db.run("UPDATE observations SET revision_of = ? WHERE id = ?",[N,M.id]),this.supersede(N,M.id),this.getById(M.id)}supersede(N,E){let A=new Date().toISOString();this.db.run("UPDATE observations SET superseded_by = ?, superseded_at = ? WHERE id = ?",[E,A,N])}delete(N){if(this.db.all("SELECT id FROM observations WHERE id = ?",[N]).length===0)return!1;let A=new Date().toISOString();return this.db.run("UPDATE observations SET deleted_at = ? WHERE id = ?",[A,N]),this.deleteEmbeddingsForObservations([N]),!0}getLineage(N){let E=this.getByIdIncludingArchived(N);if(!E)return[];let A=new Set([E.id]),M=[E];while(M[0].revisionOf){let O=this.getByIdIncludingArchived(M[0].revisionOf);if(!O||A.has(O.id))break;M.unshift(O),A.add(O.id)}while(M[M.length-1].supersededBy){let O=M[M.length-1].supersededBy;if(!O)break;let $=this.getByIdIncludingArchived(O);if(!$||A.has($.id))break;M.push($),A.add($.id)}return M}deleteOlderThan(N){return this.db.all(`DELETE FROM observations
280
275
  WHERE (created_at < datetime('now', '-' || ? || ' days') OR deleted_at IS NOT NULL)
281
276
  AND session_id NOT IN (SELECT id FROM sessions WHERE status != 'completed')
282
- RETURNING id`,[N]).length}deleteEmbeddingsForObservations(N){if(N.length===0)return;let E=N.map(()=>"?").join(",");try{this.db.run(`DELETE FROM observation_embeddings WHERE observation_id IN (${E})`,N)}catch{}this.db.run(`UPDATE observations SET embedding = NULL WHERE id IN (${E})`,N)}mapRow(N){return{id:N.id,sessionId:N.session_id,scope:N.scope??"project",type:N.type,title:N.title,subtitle:N.subtitle,facts:JSON.parse(N.facts),narrative:N.narrative,concepts:JSON.parse(N.concepts),filesRead:JSON.parse(N.files_read),filesModified:JSON.parse(N.files_modified),rawToolOutput:N.raw_tool_output,toolName:N.tool_name,createdAt:N.created_at,tokenCount:N.token_count,discoveryTokens:N.discovery_tokens??0,importance:N.importance??3,revisionOf:N.revision_of??null,deletedAt:N.deleted_at??null,supersededBy:N.superseded_by??null,supersededAt:N.superseded_at??null}}}import{randomUUID as PO}from"crypto";class p1{db;constructor(N){this.db=N}create(N){let E=PO(),O=new Date().toISOString();return this.db.run(`INSERT INTO pending_messages
277
+ RETURNING id`,[N]).length}deleteEmbeddingsForObservations(N){if(N.length===0)return;let E=N.map(()=>"?").join(",");try{this.db.run(`DELETE FROM observation_embeddings WHERE observation_id IN (${E})`,N)}catch{}this.db.run(`UPDATE observations SET embedding = NULL WHERE id IN (${E})`,N)}mapRow(N){return{id:N.id,sessionId:N.session_id,scope:N.scope??"project",type:N.type,title:N.title,subtitle:N.subtitle,facts:JSON.parse(N.facts),narrative:N.narrative,concepts:JSON.parse(N.concepts),filesRead:JSON.parse(N.files_read),filesModified:JSON.parse(N.files_modified),rawToolOutput:N.raw_tool_output,toolName:N.tool_name,createdAt:N.created_at,tokenCount:N.token_count,discoveryTokens:N.discovery_tokens??0,importance:N.importance??3,revisionOf:N.revision_of??null,deletedAt:N.deleted_at??null,supersededBy:N.superseded_by??null,supersededAt:N.superseded_at??null}}}import{randomUUID as rA}from"crypto";class t1{db;constructor(N){this.db=N}create(N){let E=rA(),A=new Date().toISOString();return this.db.run(`INSERT INTO pending_messages
283
278
  (id, session_id, tool_name, tool_output, call_id, created_at)
284
- VALUES (?, ?, ?, ?, ?, ?)`,[E,N.sessionId,N.toolName,N.toolOutput,N.callId,O]),{...N,id:E,createdAt:O,status:"pending",retryCount:0,error:null}}getPending(N=10){return this.db.all("SELECT * FROM pending_messages WHERE status = 'pending' ORDER BY created_at ASC LIMIT ?",[N]).map((E)=>this.mapRow(E))}getByStatus(N){return this.db.all("SELECT * FROM pending_messages WHERE status = ? ORDER BY created_at ASC",[N]).map((E)=>this.mapRow(E))}markProcessing(N){this.db.run("UPDATE pending_messages SET status = 'processing' WHERE id = ?",[N])}markCompleted(N){this.db.run("UPDATE pending_messages SET status = 'completed' WHERE id = ?",[N])}markFailed(N,E){this.db.run("UPDATE pending_messages SET status = 'failed', error = ?, retry_count = retry_count + 1 WHERE id = ?",[E,N])}resetStale(N=5){return this.db.all(`UPDATE pending_messages SET status = 'pending'
279
+ VALUES (?, ?, ?, ?, ?, ?)`,[E,N.sessionId,N.toolName,N.toolOutput,N.callId,A]),{...N,id:E,createdAt:A,status:"pending",retryCount:0,error:null}}getPending(N=10){return this.db.all("SELECT * FROM pending_messages WHERE status = 'pending' ORDER BY created_at ASC LIMIT ?",[N]).map((E)=>this.mapRow(E))}getByStatus(N){return this.db.all("SELECT * FROM pending_messages WHERE status = ? ORDER BY created_at ASC",[N]).map((E)=>this.mapRow(E))}markProcessing(N){this.db.run("UPDATE pending_messages SET status = 'processing' WHERE id = ?",[N])}markCompleted(N){this.db.run("UPDATE pending_messages SET status = 'completed' WHERE id = ?",[N])}markFailed(N,E){this.db.run("UPDATE pending_messages SET status = 'failed', error = ?, retry_count = retry_count + 1 WHERE id = ?",[E,N])}resetStale(N=5){return this.db.all(`UPDATE pending_messages SET status = 'pending'
285
280
  WHERE status = 'processing'
286
281
  AND created_at < datetime('now', ? || ' minutes')
287
282
  RETURNING id`,[`-${N}`]).length}deleteCompletedOlderThan(N){return this.db.all(`DELETE FROM pending_messages
288
283
  WHERE status = 'completed'
289
284
  AND created_at < datetime('now', '-' || ? || ' days')
290
- RETURNING id`,[N]).length}mapRow(N){return{id:N.id,sessionId:N.session_id,toolName:N.tool_name,toolOutput:N.tool_output,callId:N.call_id,createdAt:N.created_at,status:N.status,retryCount:N.retry_count,error:N.error??null}}}var xO=[{version:1,name:"create-schema",up:`
285
+ RETURNING id`,[N]).length}mapRow(N){return{id:N.id,sessionId:N.session_id,toolName:N.tool_name,toolOutput:N.tool_output,callId:N.call_id,createdAt:N.created_at,status:N.status,retryCount:N.retry_count,error:N.error??null}}}var iA=[{version:1,name:"create-schema",up:`
291
286
  -- Sessions table
292
287
  CREATE TABLE IF NOT EXISTS sessions (
293
288
  _rowid INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -581,15 +576,15 @@ ${J}`}return f}guide(){return["# open-mem Workflow Guide","","## Reading Memorie
581
576
  INSERT INTO entities_fts(rowid, name, entity_type)
582
577
  VALUES (new._rowid, new.name, new.entity_type);
583
578
  END;
584
- `}];function RE(N,E){if(N.migrate(xO),E?.hasVectorExtension&&E?.embeddingDimension&&E.embeddingDimension>0)vO(N,E.embeddingDimension)}function vO(N,E){if(N.get("SELECT name FROM sqlite_master WHERE type='table' AND name='observation_embeddings'")){let M=N.get("SELECT value FROM _embedding_meta WHERE key = 'dimension'");if(M&&Number(M.value)!==E){console.warn(`[open-mem] vec0 table exists with dimension ${M.value}, but config specifies ${E}. Drop observation_embeddings to re-create with new dimension.`);return}}else N.exec(`CREATE VIRTUAL TABLE observation_embeddings USING vec0(
579
+ `}];function j2(N,E){if(N.migrate(iA),E?.hasVectorExtension&&E?.embeddingDimension&&E.embeddingDimension>0)dA(N,E.embeddingDimension)}function dA(N,E){if(N.get("SELECT name FROM sqlite_master WHERE type='table' AND name='observation_embeddings'")){let M=N.get("SELECT value FROM _embedding_meta WHERE key = 'dimension'");if(M&&Number(M.value)!==E){console.warn(`[open-mem] vec0 table exists with dimension ${M.value}, but config specifies ${E}. Drop observation_embeddings to re-create with new dimension.`);return}}else N.exec(`CREATE VIRTUAL TABLE observation_embeddings USING vec0(
585
580
  observation_id TEXT PRIMARY KEY,
586
581
  embedding float[${E}] distance_metric=cosine
587
- )`);N.run("INSERT OR REPLACE INTO _embedding_meta (key, value) VALUES (?, ?)",["dimension",String(E)])}class n1{db;constructor(N){this.db=N}create(N,E){let O=new Date().toISOString();return this.db.run(`INSERT INTO sessions (id, project_path, started_at, status)
588
- VALUES (?, ?, ?, 'active')`,[N,E,O]),this.getById(N)}getOrCreate(N,E){let O=this.getById(N);if(O)return O;return this.create(N,E)}getById(N){let E=this.db.get("SELECT * FROM sessions WHERE id = ?",[N]);return E?this.mapRow(E):null}getRecent(N,E=10){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC LIMIT ?",[N,E]).map((O)=>this.mapRow(O))}getAll(N){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC",[N]).map((E)=>this.mapRow(E))}getActive(){return this.db.all("SELECT * FROM sessions WHERE status = 'active' ORDER BY started_at DESC").map((N)=>this.mapRow(N))}updateStatus(N,E){this.db.run("UPDATE sessions SET status = ? WHERE id = ?",[E,N])}markCompleted(N){this.db.run("UPDATE sessions SET status = 'completed', ended_at = datetime('now') WHERE id = ?",[N])}incrementObservationCount(N){this.db.run("UPDATE sessions SET observation_count = observation_count + 1 WHERE id = ?",[N])}setSummary(N,E){this.db.run("UPDATE sessions SET summary_id = ? WHERE id = ?",[E,N])}mapRow(N){return{id:N.id,projectPath:N.project_path,startedAt:N.started_at,endedAt:N.ended_at??null,status:N.status,observationCount:N.observation_count,summaryId:N.summary_id??null}}}import{randomUUID as uO}from"crypto";class r1{db;constructor(N){this.db=N}create(N){let E=uO(),O=new Date().toISOString();return this.db.run(`INSERT INTO session_summaries
582
+ )`);N.run("INSERT OR REPLACE INTO _embedding_meta (key, value) VALUES (?, ?)",["dimension",String(E)])}class a1{db;constructor(N){this.db=N}create(N,E){let A=new Date().toISOString();return this.db.run(`INSERT INTO sessions (id, project_path, started_at, status)
583
+ VALUES (?, ?, ?, 'active')`,[N,E,A]),this.getById(N)}getOrCreate(N,E){let A=this.getById(N);if(A)return A;return this.create(N,E)}getById(N){let E=this.db.get("SELECT * FROM sessions WHERE id = ?",[N]);return E?this.mapRow(E):null}getRecent(N,E=10){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC LIMIT ?",[N,E]).map((A)=>this.mapRow(A))}getAll(N){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC",[N]).map((E)=>this.mapRow(E))}getActive(){return this.db.all("SELECT * FROM sessions WHERE status = 'active' ORDER BY started_at DESC").map((N)=>this.mapRow(N))}updateStatus(N,E){this.db.run("UPDATE sessions SET status = ? WHERE id = ?",[E,N])}markCompleted(N){this.db.run("UPDATE sessions SET status = 'completed', ended_at = datetime('now') WHERE id = ?",[N])}incrementObservationCount(N){this.db.run("UPDATE sessions SET observation_count = observation_count + 1 WHERE id = ?",[N])}setSummary(N,E){this.db.run("UPDATE sessions SET summary_id = ? WHERE id = ?",[E,N])}mapRow(N){return{id:N.id,projectPath:N.project_path,startedAt:N.started_at,endedAt:N.ended_at??null,status:N.status,observationCount:N.observation_count,summaryId:N.summary_id??null}}}import{randomUUID as tA}from"crypto";class s1{db;constructor(N){this.db=N}create(N){let E=tA(),A=new Date().toISOString();return this.db.run(`INSERT INTO session_summaries
589
584
  (id, session_id, summary, key_decisions, files_modified,
590
585
  concepts, created_at, token_count,
591
586
  request, investigated, learned, completed, next_steps)
592
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[E,N.sessionId,N.summary,JSON.stringify(N.keyDecisions),JSON.stringify(N.filesModified),JSON.stringify(N.concepts),O,N.tokenCount,N.request??"",N.investigated??"",N.learned??"",N.completed??"",N.nextSteps??""]),{...N,id:E,createdAt:O}}importSummary(N){this.db.run(`INSERT INTO session_summaries
587
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[E,N.sessionId,N.summary,JSON.stringify(N.keyDecisions),JSON.stringify(N.filesModified),JSON.stringify(N.concepts),A,N.tokenCount,N.request??"",N.investigated??"",N.learned??"",N.completed??"",N.nextSteps??""]),{...N,id:E,createdAt:A}}importSummary(N){this.db.run(`INSERT INTO session_summaries
593
588
  (id, session_id, summary, key_decisions, files_modified,
594
589
  concepts, created_at, token_count,
595
590
  request, investigated, learned, completed, next_steps)
@@ -598,7 +593,7 @@ ${J}`}return f}guide(){return["# open-mem Workflow Guide","","## Reading Memorie
598
593
  JOIN summaries_fts fts ON ss._rowid = fts.rowid
599
594
  WHERE summaries_fts MATCH ?
600
595
  ORDER BY rank
601
- LIMIT ?`,[N,E]).map((O)=>this.mapRow(O))}mapRow(N){return{id:N.id,sessionId:N.session_id,summary:N.summary,keyDecisions:JSON.parse(N.key_decisions),filesModified:JSON.parse(N.files_modified),concepts:JSON.parse(N.concepts),createdAt:N.created_at,tokenCount:N.token_count,request:N.request||void 0,investigated:N.investigated||void 0,learned:N.learned||void 0,completed:N.completed||void 0,nextSteps:N.next_steps||void 0}}}import{randomUUID as mO}from"crypto";var gO=[{version:1,name:"create-user-observations",up:`
596
+ LIMIT ?`,[N,E]).map((A)=>this.mapRow(A))}mapRow(N){return{id:N.id,sessionId:N.session_id,summary:N.summary,keyDecisions:JSON.parse(N.key_decisions),filesModified:JSON.parse(N.files_modified),concepts:JSON.parse(N.concepts),createdAt:N.created_at,tokenCount:N.token_count,request:N.request||void 0,investigated:N.investigated||void 0,learned:N.learned||void 0,completed:N.completed||void 0,nextSteps:N.next_steps||void 0}}}import{randomUUID as aA}from"crypto";var sA=[{version:1,name:"create-user-observations",up:`
602
597
  CREATE TABLE IF NOT EXISTS user_observations (
603
598
  _rowid INTEGER PRIMARY KEY AUTOINCREMENT,
604
599
  id TEXT UNIQUE NOT NULL,
@@ -669,23 +664,27 @@ ${J}`}return f}guide(){return["# open-mem Workflow Guide","","## Reading Memorie
669
664
  new.facts, new.concepts, new.files_read, new.files_modified
670
665
  );
671
666
  END;
672
- `}];class i1{db;constructor(N){let E=hO(N);this.db=n0(E),this.initializeUserSchema()}initializeUserSchema(){this.db.migrate(gO)}get database(){return this.db}close(){this.db.close()}}class d1{db;constructor(N){this.db=N}create(N){let E=mO(),O=new Date().toISOString();return this.db.run(`INSERT INTO user_observations
667
+ `}];class o1{db;constructor(N){let E=oA(N);this.db=i0(E),this.initializeUserSchema()}initializeUserSchema(){this.db.migrate(sA)}get database(){return this.db}close(){this.db.close()}}class e1{db;constructor(N){this.db=N}create(N){let E=aA(),A=new Date().toISOString();return this.db.run(`INSERT INTO user_observations
673
668
  (id, type, title, subtitle, facts, narrative,
674
669
  concepts, files_read, files_modified, tool_name,
675
670
  created_at, token_count, importance, source_project)
676
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[E,N.type,N.title,N.subtitle,JSON.stringify(N.facts),N.narrative,JSON.stringify(N.concepts),JSON.stringify(N.filesRead),JSON.stringify(N.filesModified),N.toolName,O,N.tokenCount,N.importance??3,N.sourceProject]),{...N,id:E,createdAt:O,importance:N.importance??3}}search(N){try{let E=`
671
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[E,N.type,N.title,N.subtitle,JSON.stringify(N.facts),N.narrative,JSON.stringify(N.concepts),JSON.stringify(N.filesRead),JSON.stringify(N.filesModified),N.toolName,A,N.tokenCount,N.importance??3,N.sourceProject]),{...N,id:E,createdAt:A,importance:N.importance??3}}search(N){try{let E=`
677
672
  SELECT o.*, rank
678
673
  FROM user_observations o
679
674
  JOIN user_observations_fts fts ON o._rowid = fts.rowid
680
675
  WHERE user_observations_fts MATCH ?
681
- `,O=[N.query];if(N.sourceProject)E+=" AND o.source_project = ?",O.push(N.sourceProject);return E+=" ORDER BY rank LIMIT ?",O.push(N.limit??10),this.db.all(E,O).map((M)=>({observation:this.mapRow(M),rank:M.rank}))}catch{return[]}}getIndex(N,E){let O=`SELECT id, type, title, token_count, created_at, importance, source_project
682
- FROM user_observations`,M=[];if(E)O+=" WHERE source_project = ?",M.push(E);return O+=" ORDER BY created_at DESC LIMIT ?",M.push(N??20),this.db.all(O,M).map((A)=>({id:A.id,sessionId:"",type:A.type,title:A.title,tokenCount:A.token_count,discoveryTokens:0,createdAt:A.created_at,importance:A.importance??3}))}getById(N){let E=this.db.get("SELECT * FROM user_observations WHERE id = ?",[N]);return E?this.mapRow(E):null}delete(N){return this.db.all("DELETE FROM user_observations WHERE id = ? RETURNING id",[N]).length>0}mapRow(N){return{id:N.id,type:N.type,title:N.title,subtitle:N.subtitle,facts:JSON.parse(N.facts),narrative:N.narrative,concepts:JSON.parse(N.concepts),filesRead:JSON.parse(N.files_read),filesModified:JSON.parse(N.files_modified),toolName:N.tool_name,createdAt:N.created_at,tokenCount:N.token_count,importance:N.importance??3,sourceProject:N.source_project}}}function hO(N){if(N.startsWith("~/")){let E=process.env.HOME||process.env.USERPROFILE||"";if(!E)throw Error("Cannot resolve user DB path: HOME environment variable is not set");let O=`${E}${N.slice(1)}`,M=O.substring(0,O.lastIndexOf("/"));return q("fs").mkdirSync(M,{recursive:!0}),O}return N}import{EventEmitter as cO}from"events";function YE(){return new cO}function r0(N,E=""){if(!N)return N;return N.replace(/<private>[\s\S]*?<\/private>/gi,E)}var LE=200,lO=/(\([\s\S]*[+*]\)\s*[+*?])|(\(\.\*\)\+)|(\(\.\+\)\+)/;function i0(N,E,O="[REDACTED]"){if(!N||E.length===0)return N;let M=N;for(let A of E){if(A.length>LE){console.warn(`[open-mem] Skipping oversized redaction pattern (${A.length} chars, max ${LE})`);continue}if(lO.test(A)){console.warn("[open-mem] Skipping potentially dangerous redaction pattern (nested quantifiers detected)");continue}try{M=M.replace(new RegExp(A,"g"),O)}catch{}}return M}var bO=20,zE=2000,CE=60;function pO(N){return typeof N==="object"&&N!==null&&"text"in N&&typeof N.text==="string"}function nO(N){let E=[];for(let O of N)if(typeof O==="string")E.push(O);else if(pO(O))E.push(O.text);return E.join(`
683
- `).trim()}function rO(N){let E=N.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter((O)=>O.length>4);return[...new Set(E)].slice(0,5)}function iO(N){let{observations:E,sessions:O,projectPath:M,sessionId:A,text:$,agent:_,sensitivePatterns:S=[]}=N;if(_!==void 0&&_!=="user")return!1;let V=i0(r0($),S);if(V.length<bO)return!1;O.getOrCreate(A,M);let J=`User request: ${V.length>CE?`${V.slice(0,CE)}...`:V}`,Q=V.length>zE?`${V.slice(0,zE)}...`:V;return E.create({sessionId:A,type:"discovery",title:J,subtitle:"",facts:[],narrative:Q,concepts:rO(V),filesRead:[],filesModified:[],rawToolOutput:"",toolName:"chat.message",tokenCount:Math.ceil(Q.length/4),discoveryTokens:0,importance:3}),!0}function GE(N,E,O,M=[]){return async(A,$)=>{try{let{sessionID:_,agent:S}=A;if(S!==void 0&&S!=="user")return;let V=nO($.parts);iO({observations:N,sessions:E,projectPath:O,sessionId:_,text:V,agent:S,sensitivePatterns:M})}catch(_){console.error("[open-mem] Chat capture error:",_)}}}function HE(N,E,O,M,A,$){return async(_,S)=>{try{if(!N.contextInjectionEnabled)return;let V=O.getRecent(A,3),f=V.map((X)=>X.summaryId?M.getBySessionId(X.id):null).filter((X)=>X!==null),J=E.getIndex(A,10);if(f.length===0&&J.length===0)return;let Q=E0(V,f,J,Math.floor(N.maxContextTokens/2)),W=x0(Q);if(N.userMemoryEnabled&&$){let X=$.getIndex(10),Z=u0(X,Math.floor(N.userMemoryMaxContextTokens/2));if(Z)W+=Z}S.context.push(W)}catch(V){console.error("[open-mem] Compaction hook error:",V)}}}function FE(N,E,O,M,A,$){return async(_,S)=>{try{if(!N.contextInjectionEnabled)return;let V=O.getRecent(A,5);if(V.length===0)return;let f=V.map((K)=>K.summaryId?M.getBySessionId(K.id):null).filter((K)=>K!==null),J=E.getIndex(A,N.maxObservations);if(f.length===0&&J.length===0)return;let W=J.slice(0,N.contextFullObservationCount).map((K)=>K.id).map((K)=>E.getById(K)).filter((K)=>K!==null),X=E0(V,f,J,N.maxContextTokens,W),Z={showTokenCosts:N.contextShowTokenCosts,observationTypes:N.contextObservationTypes,fullObservationCount:N.contextFullObservationCount,showLastSummary:N.contextShowLastSummary},D=P0(X,Z);if(N.userMemoryEnabled&&$){let K=$.getIndex(N.maxObservations),L=v0(K,N.userMemoryMaxContextTokens);if(L)D+=`
684
-
685
- ${L}`}S.system.push(D)}catch(V){console.error("[open-mem] Context injection error:",V)}}}import{existsSync as dO}from"fs";import{readFile as tO,writeFile as aO}from"fs/promises";import{join as sO}from"path";function jE(N,E,O){if(N.retentionDays===0)return;try{let M=E.deleteOlderThan(N.retentionDays),A=O.deleteCompletedOlderThan(N.retentionDays);if(M>0||A>0)console.log(`[open-mem] Retention: deleted ${M} observations, ${A} pending messages`)}catch(M){console.error("[open-mem] Retention enforcement error:",M)}}async function oO(N,E,O){let{queue:M,sessions:A,projectPath:$,config:_,observations:S,pendingMessages:V}=N;switch(E){case"session.created":{if(O)A.getOrCreate(O,$);try{jE(_,S,V)}catch(f){console.error("[open-mem] Retention enforcement error:",f)}try{await eO($)}catch(f){console.error("[open-mem] Gitignore entry error:",f)}break}case"session.idle":{if(M.processBatch().catch((f)=>{console.error("[open-mem] Background processing error:",f)}),O)A.updateStatus(O,"idle"),yE(O,$,_,S).catch((f)=>{console.error("[open-mem] Folder context error:",f)});break}case"session.completed":case"session.ended":{if(O)await M.processBatch(),await M.summarizeSession(O),A.markCompleted(O),await yE(O,$,_,S);break}}}function IE(N,E,O,M,A,$){return async(_)=>{try{let{event:S}=_,V=S.properties.sessionID,f=typeof V==="string"?V:void 0;if(S.type==="session.created"||S.type==="session.idle"||S.type==="session.completed"||S.type==="session.ended")await oO({queue:N,sessions:E,projectPath:O,config:M,observations:A,pendingMessages:$},S.type,f)}catch(S){console.error("[open-mem] Event handler error:",S)}}}async function yE(N,E,O,M){if(!O.folderContextEnabled)return;try{let A=M.getBySession(N);if(A.length>0)await h0(E,A,{mode:O.folderContextMode,filename:O.folderContextFilename,maxDepth:O.folderContextMaxDepth})}catch(A){console.error("[open-mem] Folder context update error:",A)}}async function eO(N){let E=sO(N,".gitignore");if(!dO(E))return;let O=await tO(E,"utf-8");if(O.includes("AGENTS.md"))return;let M=`
676
+ `,A=[N.query];if(N.sourceProject)E+=" AND o.source_project = ?",A.push(N.sourceProject);return E+=" ORDER BY rank LIMIT ?",A.push(N.limit??10),this.db.all(E,A).map((M)=>({observation:this.mapRow(M),rank:M.rank}))}catch{return[]}}getIndex(N,E){let A=`SELECT id, type, title, token_count, created_at, importance, source_project
677
+ FROM user_observations`,M=[];if(E)A+=" WHERE source_project = ?",M.push(E);return A+=" ORDER BY created_at DESC LIMIT ?",M.push(N??20),this.db.all(A,M).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(N){let E=this.db.get("SELECT * FROM user_observations WHERE id = ?",[N]);return E?this.mapRow(E):null}delete(N){return this.db.all("DELETE FROM user_observations WHERE id = ? RETURNING id",[N]).length>0}mapRow(N){return{id:N.id,type:N.type,title:N.title,subtitle:N.subtitle,facts:JSON.parse(N.facts),narrative:N.narrative,concepts:JSON.parse(N.concepts),filesRead:JSON.parse(N.files_read),filesModified:JSON.parse(N.files_modified),toolName:N.tool_name,createdAt:N.created_at,tokenCount:N.token_count,importance:N.importance??3,sourceProject:N.source_project}}}function oA(N){if(N.startsWith("~/")){let E=process.env.HOME||process.env.USERPROFILE||"";if(!E)throw Error("Cannot resolve user DB path: HOME environment variable is not set");let A=`${E}${N.slice(1)}`,M=A.substring(0,A.lastIndexOf("/"));return x("fs").mkdirSync(M,{recursive:!0}),A}return N}import{EventEmitter as eA}from"events";function y2(){return new eA}function d0(N,E=""){if(!N)return N;return N.replace(/<private>[\s\S]*?<\/private>/gi,E)}var I2=200,NM=/(\([\s\S]*[+*]\)\s*[+*?])|(\(\.\*\)\+)|(\(\.\+\)\+)/;function t0(N,E,A="[REDACTED]"){if(!N||E.length===0)return N;let M=N;for(let O of E){if(O.length>I2){console.warn(`[open-mem] Skipping oversized redaction pattern (${O.length} chars, max ${I2})`);continue}if(NM.test(O)){console.warn("[open-mem] Skipping potentially dangerous redaction pattern (nested quantifiers detected)");continue}try{M=M.replace(new RegExp(O,"g"),A)}catch{}}return M}var EM=20,T2=2000,k2=60;function AM(N){return typeof N==="object"&&N!==null&&"text"in N&&typeof N.text==="string"}function MM(N){let E=[];for(let A of N)if(typeof A==="string")E.push(A);else if(AM(A))E.push(A.text);return E.join(`
678
+ `).trim()}function OM(N){let E=N.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter((A)=>A.length>4);return[...new Set(E)].slice(0,5)}function $M(N){let{observations:E,sessions:A,projectPath:M,sessionId:O,text:$,agent:V,sensitivePatterns:_=[]}=N;if(V!==void 0&&V!=="user")return!1;let S=t0(d0($),_);if(S.length<EM)return!1;A.getOrCreate(O,M);let Q=`User request: ${S.length>k2?`${S.slice(0,k2)}...`:S}`,f=S.length>T2?`${S.slice(0,T2)}...`:S;return E.create({sessionId:O,type:"discovery",title:Q,subtitle:"",facts:[],narrative:f,concepts:OM(S),filesRead:[],filesModified:[],rawToolOutput:"",toolName:"chat.message",tokenCount:Math.ceil(f.length/4),discoveryTokens:0,importance:3}),!0}function w2(N,E,A,M=[]){return async(O,$)=>{try{let{sessionID:V,agent:_}=O;if(_!==void 0&&_!=="user")return;let S=MM($.parts);$M({observations:N,sessions:E,projectPath:A,sessionId:V,text:S,agent:_,sensitivePatterns:M})}catch(V){console.error("[open-mem] Chat capture error:",V)}}}var NN={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"};function _M(N){if(N.length===0)return"";let E=[];E.push(`
679
+ Key decisions:`);for(let A of N)E.push(`- ${NN[A.type]||"\uD83D\uDCDD"} ${A.title}: ${A.narrative}`);return E.join(`
680
+ `)}function q2(N){if(N.length===0)return"";let E=[];E.push(`
681
+ Recent observation details:`);for(let A of N){let M=NN[A.type]||"\uD83D\uDCDD";if(E.push(`- ${M} ${A.title}: ${A.narrative}`),A.facts.length>0)E.push(` Facts: ${A.facts.join("; ")}`)}return E.join(`
682
+ `)}function P2(N,E,A,M,O,$){return async(V,_)=>{try{if(!N.contextInjectionEnabled)return;let S=Math.floor(N.maxContextTokens/2),J=A.getRecent(O,3),Q=J.map((R)=>R.summaryId?M.getBySessionId(R.id):null).filter((R)=>R!==null),f=E.getIndex(O,20),W=[];try{W=E.listByProject(O,{limit:5,state:"current"})}catch{}if(Q.length===0&&f.length===0&&W.length===0)return;let X=Math.floor(S*0.4),D=A0(J,Q,f,X,W),U=u0(D),K=Math.floor(S*0.4),z=q2(W);if(z&&y(z)<=K)U+=z;else if(z){let R=[],k=0;for(let T of W){let w=`- ${NN[T.type]||"\uD83D\uDCDD"} ${T.title}: ${T.narrative}`,I=y(w);if(k+I>K)break;R.push(T),k+=I}if(R.length>0)U+=q2(R)}let G=Math.floor(S*0.2),H=W.filter((R)=>R.type==="decision");if(H.length>0){let R=_M(H);if(y(R)<=G)U+=R}if(N.userMemoryEnabled&&$){let R=$.getIndex(10),k=g0(R,Math.floor(N.userMemoryMaxContextTokens/2));if(k)U+=k}_.context.push(U)}catch(S){console.error("[open-mem] Compaction hook error:",S)}}}function x2(N,E,A,M,O,$){return async(V,_)=>{try{if(!N.contextInjectionEnabled)return;let S=A.getRecent(O,5);if(S.length===0)return;let J=S.map((K)=>K.summaryId?M.getBySessionId(K.id):null).filter((K)=>K!==null),Q=E.getIndex(O,N.maxObservations);if(J.length===0&&Q.length===0)return;let W=Q.slice(0,N.contextFullObservationCount).map((K)=>K.id).map((K)=>E.getById(K)).filter((K)=>K!==null),X=A0(S,J,Q,N.maxContextTokens,W),D={showTokenCosts:N.contextShowTokenCosts,observationTypes:N.contextObservationTypes,fullObservationCount:N.contextFullObservationCount,showLastSummary:N.contextShowLastSummary},U=v0(X,D);if(N.userMemoryEnabled&&$){let K=$.getIndex(N.maxObservations),z=m0(K,N.userMemoryMaxContextTokens);if(z)U+=`
683
+
684
+ ${z}`}_.system.push(U)}catch(S){console.error("[open-mem] Context injection error:",S)}}}import{existsSync as VM}from"fs";import{readFile as SM,writeFile as JM}from"fs/promises";import{join as QM}from"path";function v2(N,E,A){if(N.retentionDays===0)return;try{let M=E.deleteOlderThan(N.retentionDays),O=A.deleteCompletedOlderThan(N.retentionDays);if(M>0||O>0)console.log(`[open-mem] Retention: deleted ${M} observations, ${O} pending messages`)}catch(M){console.error("[open-mem] Retention enforcement error:",M)}}async function fM(N,E,A){let{queue:M,sessions:O,projectPath:$,config:V,observations:_,pendingMessages:S}=N;switch(E){case"session.created":{if(A)O.getOrCreate(A,$);try{v2(V,_,S)}catch(J){console.error("[open-mem] Retention enforcement error:",J)}try{await WM($)}catch(J){console.error("[open-mem] Gitignore entry error:",J)}break}case"session.idle":{if(M.processBatch().catch((J)=>{console.error("[open-mem] Background processing error:",J)}),A)O.updateStatus(A,"idle"),u2(A,$,V,_).catch((J)=>{console.error("[open-mem] Folder context error:",J)});break}case"session.completed":case"session.ended":{if(A)await M.processBatch(),await M.summarizeSession(A),O.markCompleted(A),await u2(A,$,V,_);break}}}function m2(N,E,A,M,O,$){return async(V)=>{try{let{event:_}=V,S=_.properties.sessionID,J=typeof S==="string"?S:void 0;if(_.type==="session.created"||_.type==="session.idle"||_.type==="session.completed"||_.type==="session.ended")await fM({queue:N,sessions:E,projectPath:A,config:M,observations:O,pendingMessages:$},_.type,J)}catch(_){console.error("[open-mem] Event handler error:",_)}}}async function u2(N,E,A,M){if(!A.folderContextEnabled)return;try{let O=M.getBySession(N);if(O.length>0)await l0(E,O,{mode:A.folderContextMode,filename:A.folderContextFilename,maxDepth:A.folderContextMaxDepth})}catch(O){console.error("[open-mem] Folder context update error:",O)}}async function WM(N){let E=QM(N,".gitignore");if(!VM(E))return;let A=await SM(E,"utf-8");if(A.includes("AGENTS.md"))return;let M=`
686
685
  # open-mem: Auto-generated folder context files.
687
686
  # Uncomment to exclude from version control (recommended for large projects):
688
687
  # **/AGENTS.md
689
- `;await aO(E,O.endsWith(`
690
- `)?O+M:`${O}
691
- ${M}`,"utf-8")}function NM(N){let{config:E,queue:O,sessions:M,projectPath:A,tool:$,sessionId:_,callId:S,toolOutput:V}=N;if(E.ignoredTools.includes($))return!1;if(!V||V.length<E.minOutputLength)return!1;let f=i0(V,E.sensitivePatterns);return f=r0(f,"[PRIVATE]"),M.getOrCreate(_,A),O.enqueue(_,$,f,S),!0}function TE(N,E,O,M){return async(A,$)=>{try{let{tool:_,sessionID:S,callID:V}=A,{output:f}=$;NM({config:N,queue:E,sessions:O,projectPath:M,tool:_,sessionId:S,callId:V,toolOutput:f})}catch(_){console.error("[open-mem] Tool capture error:",_)}}}class t1{config;compressor;summarizer;pendingRepo;observationRepo;sessionRepo;summaryRepo;embeddingModel;conflictEvaluator;entityExtractor;entityRepo;observer;processing=!1;timer=null;mode="in-process";onEnqueue=null;constructor(N,E,O,M,A,$,_,S=null,V=null,f=null,J=null,Q=null){this.config=N;this.compressor=E;this.summarizer=O;this.pendingRepo=M;this.observationRepo=A;this.sessionRepo=$;this.summaryRepo=_;this.embeddingModel=S;this.conflictEvaluator=V;this.entityExtractor=f;this.entityRepo=J;this.observer=Q}setMode(N){if(this.mode=N,N==="enqueue-only")this.stop()}getMode(){return this.mode}setOnEnqueue(N){this.onEnqueue=N}enqueue(N,E,O,M){if(this.pendingRepo.create({sessionId:N,toolName:E,toolOutput:O,callId:M}),this.observer?.onEnqueue?.({sessionId:N,toolName:E,createdAt:new Date().toISOString()}),this.mode==="enqueue-only")this.onEnqueue?.()}async processBatch(){if(this.mode==="enqueue-only")return 0;if(this.processing)return 0;this.processing=!0;let N=0,E=0,O=Date.now();try{this.pendingRepo.resetStale(5);let M=this.pendingRepo.getPending(this.config.batchSize);if(this.observer?.onBatchStart?.({pending:M.length,mode:this.mode,startedAt:new Date(O).toISOString()}),M.length===0)return 0;for(let A of M)try{this.pendingRepo.markProcessing(A.id);let _=await this.compressor.compress(A.toolName,A.toolOutput)??this.compressor.createFallbackObservation(A.toolName,A.toolOutput),S=!1,V=null;if(this.embeddingModel)try{let J=l1({title:_.title,narrative:_.narrative,concepts:_.concepts}),Q=await t(this.embeddingModel,J);if(Q){let W=this.config.conflictResolutionEnabled&&this.conflictEvaluator,X=this.config.conflictSimilarityBandLow??0.7,Z=this.config.conflictSimilarityBandHigh??0.92;if(W){let D=this.observationRepo.findSimilar(Q,_.type,X,5),K=D.find((L)=>L.similarity>Z);if(K)console.log(`[open-mem] Dedup: skipping duplicate of ${K.id} (similarity: ${K.similarity.toFixed(3)})`),S=!0;else{let L=D.filter((z)=>z.similarity>=X&&z.similarity<=Z);if(L.length>0)try{let z=L.map((G)=>{let F=this.observationRepo.getById(G.id);return F?{id:F.id,title:F.title,narrative:F.narrative,concepts:F.concepts,type:F.type}:null}).filter((G)=>G!==null);if(z.length>0&&this.conflictEvaluator){let G=await this.conflictEvaluator.evaluate({title:_.title,narrative:_.narrative,concepts:_.concepts,type:_.type},z);if(G&&G.outcome==="duplicate")console.log(`[open-mem] Conflict eval: duplicate (${G.reason})`),S=!0;else if(G&&G.outcome==="update"&&G.supersedesId)console.log(`[open-mem] Conflict eval: update supersedes ${G.supersedesId} (${G.reason})`),V=G.supersedesId}}catch{}}}else{let D=this.observationRepo.findSimilar(Q,_.type,0.92,1);if(D.length>0)console.log(`[open-mem] Dedup: skipping duplicate of ${D[0].id} (similarity: ${D[0].similarity.toFixed(3)})`),S=!0}}}catch{}if(S){this.pendingRepo.markCompleted(A.id);continue}let f=this.observationRepo.create({sessionId:A.sessionId,type:_.type,title:_.title,subtitle:_.subtitle,facts:_.facts,narrative:_.narrative,concepts:_.concepts,filesRead:_.filesRead,filesModified:_.filesModified,rawToolOutput:A.toolOutput,toolName:A.toolName,tokenCount:y(`${_.title} ${_.narrative} ${_.facts.join(" ")}`),discoveryTokens:_.discoveryTokens??y(A.toolOutput),importance:_.importance??3});if(this.embeddingModel)try{let J=l1({title:f.title,narrative:f.narrative,concepts:f.concepts}),Q=await t(this.embeddingModel,J);if(Q)this.observationRepo.setEmbedding(f.id,Q)}catch{}if(V)try{this.observationRepo.supersede(V,f.id),console.log(`[open-mem] Superseded observation ${V} with ${f.id}`)}catch(J){console.error(`[open-mem] Failed to supersede ${V}:`,J)}if(this.config.entityExtractionEnabled&&this.entityExtractor&&this.entityRepo)try{let J=await this.entityExtractor.extract({title:f.title,narrative:f.narrative,concepts:f.concepts,facts:f.facts,filesRead:f.filesRead,filesModified:f.filesModified,type:f.type});if(J){let Q=new Map;for(let W of J.entities){let X=this.entityRepo.upsertEntity(W.name,W.entityType);Q.set(W.name,X.id),this.entityRepo.linkObservation(X.id,f.id)}for(let W of J.relations){let X=Q.get(W.sourceName),Z=Q.get(W.targetName);if(X&&Z)this.entityRepo.createRelation(X,Z,W.relationship,f.id)}}}catch{}this.sessionRepo.incrementObservationCount(A.sessionId),this.pendingRepo.markCompleted(A.id),N++}catch($){this.pendingRepo.markFailed(A.id,String($)),E++,this.observer?.onItemFailed?.({pendingId:A.id,error:String($),failedAt:new Date().toISOString()})}return N}finally{this.observer?.onBatchEnd?.({processed:N,failed:E,durationMs:Date.now()-O,finishedAt:new Date().toISOString()}),this.processing=!1}}async summarizeSession(N){let E=this.observationRepo.getBySession(N);if(!this.summarizer.shouldSummarize(E.length))return;if(this.summaryRepo.getBySessionId(N))return;let M=await this.summarizer.summarize(N,E);if(!M)return;let A=this.summaryRepo.create({sessionId:N,summary:M.summary,keyDecisions:M.keyDecisions,filesModified:M.filesModified,concepts:M.concepts,tokenCount:y(M.summary)});this.sessionRepo.setSummary(N,A.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 a1{startedAtMs=Date.now();enqueueCount=0;totalBatches=0;processedItems=0;failedItems=0;totalBatchDurationMs=0;lastBatchDurationMs=0;lastProcessedAt=null;lastFailedAt=null;lastError=null;createQueueObserver(){return{onEnqueue:()=>{this.enqueueCount+=1},onBatchEnd:(N)=>{if(this.totalBatches+=1,this.processedItems+=N.processed,this.failedItems+=N.failed,this.totalBatchDurationMs+=N.durationMs,this.lastBatchDurationMs=N.durationMs,N.processed>0)this.lastProcessedAt=N.finishedAt},onItemFailed:(N)=>{this.lastFailedAt=N.failedAt,this.lastError=N.error}}}snapshot(N){return{startedAt:new Date(this.startedAtMs).toISOString(),uptimeMs:Date.now()-this.startedAtMs,enqueueCount:this.enqueueCount,batches:{total:this.totalBatches,processedItems:this.processedItems,failedItems:this.failedItems,avgDurationMs:this.totalBatches>0?Math.round(this.totalBatchDurationMs/this.totalBatches):0},queue:{...N,lastBatchDurationMs:this.lastBatchDurationMs,lastProcessedAt:this.lastProcessedAt,lastFailedAt:this.lastFailedAt,lastError:this.lastError}}}}function kE(N){return{start:()=>N.start(),stop:()=>{N.setOnEnqueue(null),N.stop()},setInProcess:()=>{N.setMode("in-process"),N.start()},setEnqueueOnly:(E)=>{N.setMode("enqueue-only"),N.setOnEnqueue(E)}}}function S0(N,E){if(E.type&&N.type!==E.type)return!1;if(E.importanceMin!==void 0&&N.importance<E.importanceMin)return!1;if(E.importanceMax!==void 0&&N.importance>E.importanceMax)return!1;if(E.createdAfter&&N.createdAt<E.createdAfter)return!1;if(E.createdBefore&&N.createdAt>E.createdBefore)return!1;if(E.concepts&&E.concepts.length>0){if(!E.concepts.some((M)=>N.concepts.some((A)=>A.toLowerCase().includes(M.toLowerCase()))))return!1}if(E.files&&E.files.length>0){let O=[...N.filesRead,...N.filesModified];if(!E.files.some((A)=>O.some(($)=>$.toLowerCase().includes(A.toLowerCase()))))return!1}return!0}async function wE(N,E,O,M,A){if(!N.trim())return E;let $=EM(N),_=new Set;for(let f of $){let J=O.findByName(f);for(let Q of J){let W=O.traverseRelations(Q.id,1);for(let X of W){let Z=O.getObservationsForEntity(X);for(let D of Z)_.add(D)}}}if(_.size===0)return E;let S=new Set(E.map((f)=>f.observation.id)),V=[];for(let f of _){if(S.has(f))continue;let J=M.getById(f);if(!J)continue;if(J.supersededBy)continue;V.push({observation:J,rank:0,snippet:J.title,source:"project",rankingSource:"graph",explain:{strategy:"hybrid",matchedBy:["graph"]}})}return[...E,...V].slice(0,A)}function EM(N){let E=N.split(/\s+/).filter((M)=>M.length>=2),O=[];for(let M of E)O.push(M);for(let M=0;M<E.length-1;M++)O.push(`${E[M]} ${E[M+1]}`);return O}var qE=60;async function PE(N,E,O,M){let A=M.limit??10,$=OM(E,N,M,A);if(!O)return $;let _=await t(O,N);if(!_)return $;let S=$.map((f)=>f.observation.id),V=MM(E,_,M.projectPath,M,A,M.hasVectorExtension??!1,S);if(V.length===0)return $;return SM($,V,A)}function OM(N,E,O,M){try{return N.search({query:E,type:O.type,limit:M,projectPath:O.projectPath,importanceMin:O.importanceMin,importanceMax:O.importanceMax,createdAfter:O.createdAfter,createdBefore:O.createdBefore,concepts:O.concepts,files:O.files})}catch{return[]}}function MM(N,E,O,M,A,$,_){if($)return AM(N,E,M,A,_);return $M(N,E,O,M,A)}function AM(N,E,O,M,A){try{let $;if(A.length>0){if($=N.searchVecSubset(E,A,M*3),$.length===0)$=N.getVecEmbeddingMatches(E,M*3)}else $=N.getVecEmbeddingMatches(E,M*3);if($.length===0)return[];let _=[];for(let{observationId:S,distance:V}of $){if(_.length>=M)break;let f=N.getById(S);if(!f)continue;if(!S0(f,O))continue;_.push({observation:f,rank:V-1,snippet:f.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:V}})}return _}catch{return[]}}function $M(N,E,O,M,A){let $=N.getWithEmbeddings(O,A*10);if($.length===0)return[];let _=$.map((V)=>({id:V.id,similarity:$0(E,V.embedding)})).filter(({similarity:V})=>V>=0.3).sort((V,f)=>f.similarity-V.similarity),S=[];for(let{id:V,similarity:f}of _){if(S.length>=A)break;let J=N.getById(V);if(!J)continue;if(!S0(J,M))continue;S.push({observation:J,rank:-f,snippet:J.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorSimilarity:f}})}return S}function SM(N,E,O){let M=new Map;for(let A=0;A<N.length;A++){let $=N[A],_=1/(qE+A+1);M.set($.observation.id,{score:_,result:{...$,rankingSource:"fts",explain:{strategy:"hybrid",matchedBy:["fts"],ftsRank:$.rank}}})}for(let A=0;A<E.length;A++){let $=E[A],_=1/(qE+A+1),S=M.get($.observation.id);if(S)S.score+=_,S.result={...S.result,explain:{strategy:"hybrid",matchedBy:["fts","vector"],ftsRank:S.result.explain?.ftsRank??S.result.rank,vectorDistance:$.explain?.vectorDistance,vectorSimilarity:$.explain?.vectorSimilarity}};else M.set($.observation.id,{score:_,result:{...$,explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:$.explain?.vectorDistance,vectorSimilarity:$.explain?.vectorSimilarity}}})}return[...M.values()].sort((A,$)=>$.score-A.score).slice(0,O).map(({score:A,result:$})=>({...$,explain:{...$.explain??{strategy:"hybrid",matchedBy:[]},strategy:"hybrid",matchedBy:$.explain?.matchedBy??[],rrfScore:A,ftsRank:$.explain?.ftsRank,vectorDistance:$.explain?.vectorDistance,vectorSimilarity:$.explain?.vectorSimilarity}}))}class s1{observations;embeddingModel;hasVectorExtension;reranker;userObservationRepo;entityRepo;constructor(N,E,O,M=null,A=null,$=null){this.observations=N;this.embeddingModel=E;this.hasVectorExtension=O;this.reranker=M;this.userObservationRepo=A;this.entityRepo=$}async search(N,E){let O=E.strategy??"hybrid",M=E.limit??10,A;switch(O){case"filter-only":A=this.filterOnlySearch(N,E,M);break;case"semantic":A=await this.semanticSearch(N,E,M);break;case"hybrid":A=await this.hybridSearchStrategy(N,E,M);break}for(let $ of A)$.source="project";if(this.entityRepo&&N.trim())A=await wE(N,A,this.entityRepo,this.observations,M);if(this.userObservationRepo){let $=this.searchUserMemory(N,E,M);A=this.mergeResults(A,$,M)}if(this.reranker&&A.length>1)return this.reranker.rerank(N,A,M);return A}filterOnlySearch(N,E,O){if(E.concept)return this.observations.searchByConcept(E.concept,O,E.projectPath).map((A)=>({observation:A,rank:0,snippet:A.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["concept-filter"]}}));if(E.file)return this.observations.searchByFile(E.file,O,E.projectPath).map((A)=>({observation:A,rank:0,snippet:A.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["file-filter"]}}));return this.observations.search({query:N,type:E.type,limit:O,projectPath:E.projectPath,importanceMin:E.importanceMin,importanceMax:E.importanceMax,createdAfter:E.createdAfter,createdBefore:E.createdBefore,concepts:E.concepts,files:E.files})}async semanticSearch(N,E,O){if(!this.embeddingModel)return this.filterOnlySearch(N,E,O);let M=await t(this.embeddingModel,N);if(!M)return this.filterOnlySearch(N,E,O);if(this.hasVectorExtension)return this.nativeVectorSearch(M,E,O);return this.jsFallbackVectorSearch(M,E,O)}async hybridSearchStrategy(N,E,O){return PE(N,this.observations,this.embeddingModel,{type:E.type,limit:O,projectPath:E.projectPath,hasVectorExtension:this.hasVectorExtension,importanceMin:E.importanceMin,importanceMax:E.importanceMax,createdAfter:E.createdAfter,createdBefore:E.createdBefore,concepts:E.concepts,files:E.files})}nativeVectorSearch(N,E,O){try{let M=this.observations.getVecEmbeddingMatches(N,O*3);if(M.length===0)return[];let A=[];for(let{observationId:$,distance:_}of M){if(A.length>=O)break;let S=this.observations.getById($);if(!S)continue;if(!S0(S,E))continue;A.push({observation:S,rank:_-1,snippet:S.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorDistance:_}})}return A}catch{return[]}}jsFallbackVectorSearch(N,E,O){let M=this.observations.getWithEmbeddings(E.projectPath,O*10);if(M.length===0)return[];let A=M.map((_)=>({id:_.id,similarity:$0(N,_.embedding)})).filter(({similarity:_})=>_>=0.3).sort((_,S)=>S.similarity-_.similarity),$=[];for(let{id:_,similarity:S}of A){if($.length>=O)break;let V=this.observations.getById(_);if(!V)continue;if(!S0(V,E))continue;$.push({observation:V,rank:-S,snippet:V.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorSimilarity:S}})}return $}searchUserMemory(N,E,O){if(!this.userObservationRepo)return[];try{return this.userObservationRepo.search({query:N,limit:O}).map(({observation:A,rank:$})=>({observation:_M(A),rank:$,snippet:A.title,source:"user",rankingSource:"user-memory",explain:{strategy:"filter-only",matchedBy:["user-memory"]}}))}catch{return[]}}mergeResults(N,E,O){let M=new Set(N.map((_)=>_.observation.id)),A=new Set(N.map((_)=>`${_.observation.title}::${_.observation.narrative}`)),$=E.filter((_)=>{if(M.has(_.observation.id))return!1;let S=`${_.observation.title}::${_.observation.narrative}`;if(A.has(S))return!1;return A.add(S),!0});return[...N,...$].slice(0,O)}}function _M(N){return{id:N.id,sessionId:"",type:N.type,title:N.title,subtitle:N.subtitle,facts:N.facts,narrative:N.narrative,concepts:N.concepts,filesRead:N.filesRead,filesModified:N.filesModified,rawToolOutput:"",toolName:N.toolName,createdAt:N.createdAt,tokenCount:N.tokenCount,discoveryTokens:0,importance:N.importance}}import{generateText as VM}from"ai";class xE{languageModel;maxCandidates;provider;modelName;rateLimitingEnabled;_generate=VM;constructor(N,E){this.languageModel=N,this.maxCandidates=E.rerankingMaxCandidates,this.provider=E.provider??"",this.modelName=E.model??"",this.rateLimitingEnabled=E.rateLimitingEnabled??!0}async rerank(N,E,O){if(E.length<=1)return E;let M=E.slice(0,this.maxCandidates),A=E.slice(this.maxCandidates),$=iN(N,M.map((S)=>({title:S.observation.title,narrative:S.observation.narrative}))),_=2;for(let S=0;S<=_;S++)try{if(this.provider==="google")await u(this.modelName,this.rateLimitingEnabled);let{text:V}=await this._generate({model:this.languageModel,maxOutputTokens:512,prompt:$}),f=hN(V);if(!f)return E.slice(0,O);let J=this.applyReranking(M,f,O);for(let Q of A){if(J.length>=O)break;J.push(Q)}return J}catch(V){if(fM(V)&&S<_){await JM(2**S*1000);continue}return E.slice(0,O)}return E.slice(0,O)}applyReranking(N,E,O){let M=[],A=new Set;for(let $ of E)if($>=0&&$<N.length&&!A.has($)){if(A.add($),M.push(N[$]),M.length>=O)break}if(M.length<O){for(let $=0;$<N.length&&M.length<O;$++)if(!A.has($))M.push(N[$])}return M}}class vE{async rerank(N,E,O){if(E.length<=1)return E.slice(0,O);let M=o1(N),A=E.map(($)=>({result:$,score:this.scoreCandidate($,M)}));return A.sort(($,_)=>_.score-$.score),A.slice(0,O).map(($)=>$.result)}scoreCandidate(N,E){let O=N.observation,M=o1(O.title),A=o1(O.narrative),$=new Set(O.concepts.map((L)=>L.toLowerCase())),_=0,S=0,V=0;for(let L of E){if(M.has(L))_++;if(A.has(L))S++;if($.has(L))V++}let f=E.size||1,J=_/f*0.4,Q=S/f*0.3,W=V/f*0.15,Z=(Date.now()-new Date(O.createdAt).getTime())/86400000,D=Z<1?0.1:Z<7?0.05:0,K=O.importance/5*0.05;return J+Q+W+D+K}}function uE(N,E){if(!N.rerankingEnabled)return null;if(E)return new xE(E,N);return new vE}function o1(N){return new Set(N.toLowerCase().split(/[\s\-_./\\,;:!?()[\]{}'"]+/).filter((E)=>E.length>1))}function fM(N){if(typeof N!=="object"||N===null)return!1;let E=N,O=E.status;if(O===429||O===500||O===503)return!0;let M=E.error;if(typeof M==="object"&&M!==null&&M.type==="overloaded_error")return!0;return!1}function JM(N){return new Promise((E)=>setTimeout(E,N))}function mE(N){return N}function gE(N){return N}function hE(N){return N}function cE(N){if(!N)return null;return N}import{spawnSync as lE}from"child_process";import{dirname as QM,resolve as bE}from"path";function WM(N){try{let E=lE("git",["rev-parse","--git-common-dir"],{cwd:N,encoding:"utf-8",timeout:5000});if(E.status!==0||!E.stdout)return null;let O=E.stdout.trim();if(O===".git")return null;let M=lE("git",["rev-parse","--git-dir"],{cwd:N,encoding:"utf-8",timeout:5000});if(M.status!==0||!M.stdout)return null;let A=M.stdout.trim(),$=bE(N,O),_=bE(N,A);if($===_)return null;let S=QM($);if(S===$||S==="/")return null;return S}catch{return null}}function pE(N){return WM(N)??N}function UM(){try{let E=import.meta.url;if(E&&!E.includes("[eval]")){let O=DM(BM(E));return O.endsWith("dist")||O.endsWith("dist/")||O.endsWith("dist\\")?O:a(O,"..","dist")}}catch{}let N=[a(process.env.HOME||"",".config","opencode","node_modules","open-mem","dist"),a(process.cwd(),"node_modules","open-mem","dist")];for(let E of N)if(XM(a(E,"daemon.js")))return E;return a(process.cwd(),"node_modules","open-mem","dist")}async function ZM(N){let E=UM(),O=pE(N.directory),M=X0(O),A=HN(M);for(let g of A)console.warn(`[open-mem] ${g}`);await FN(M),p0.enableExtensionSupport();let $=n0(M.dbPath);RE($,{hasVectorExtension:$.hasVectorExtension,embeddingDimension:M.embeddingDimension});let _=new n1($),S=new b1($),V=new r1($),f=new p1($),J=new m1($),Q=new c1($),W=null,X=null;if(M.userMemoryEnabled)try{W=new i1(M.userMemoryDbPath),X=new d1(W.database)}catch(g){console.warn(`[open-mem] Failed to initialize user-level memory: ${g}`)}let Z=new B0(M),D=new C1(M),K=M.provider!=="bedrock",L=M.compressionEnabled&&(!K||M.apiKey)?tN({provider:M.provider,model:M.model,apiKey:M.apiKey}):null,z=new a1,G=M.conflictResolutionEnabled&&(!K||M.apiKey)?new L1({provider:M.provider,apiKey:M.apiKey,model:M.model,rateLimitingEnabled:M.rateLimitingEnabled}):null,F=M.entityExtractionEnabled&&(!K||M.apiKey)?new z1({provider:M.provider,apiKey:M.apiKey,model:M.model,rateLimitingEnabled:M.rateLimitingEnabled}):null,s=new h1($),m=new t1(M,Z,D,f,S,_,V,L,G,F,s,z.createQueueObserver()),T=kE(m);T.start();let I=()=>{let g=m.getStats(),w=z.snapshot({mode:m.getMode(),running:m.isRunning,processing:g.processing,pending:g.pending});return{status:w.queue.lastError?"degraded":"ok",timestamp:new Date().toISOString(),uptimeMs:w.uptimeMs,queue:w.queue,batches:w.batches,enqueueCount:w.enqueueCount}},d0=uE(M,M.rerankingEnabled&&(!K||M.apiKey)?v({provider:M.provider,model:M.model,apiKey:M.apiKey},x(M)):null),k=new s1(S,L,$.hasVectorExtension,d0,X,s),R0=new P1({observations:mE(S),sessions:gE(_),summaries:hE(V),searchOrchestrator:k,projectPath:O,config:M,userObservationRepo:cE(X),runtimeSnapshotProvider:I,configAuditStore:J,maintenanceHistoryStore:Q}),e1=uN(R0),c=null,o=null;if(M.daemonEnabled)if(DE(M.dbPath),c=new v1({dbPath:M.dbPath,projectPath:O,daemonScript:a(E,"daemon.js")}),c.start())T.setEnqueueOnly(()=>c?.signal("PROCESS_NOW")),console.log("[open-mem] Background daemon started \u2014 processing delegated"),o=setInterval(()=>{if(c&&!c.isRunning()){if(console.warn("[open-mem] Daemon died, falling back to in-process processing"),T.setInProcess(),o)clearInterval(o),o=null}},30000);else console.warn("[open-mem] Daemon failed to start \u2014 using in-process processing"),c=null;let t0=null,a0=null,Y0=null;if(M.dashboardEnabled){a0=YE(),Y0=new K1(a0);let g=PN({config:M,projectPath:O,embeddingModel:L,memoryEngine:R0,runtimeStatusProvider:I,sseHandler:vN(Y0),dashboardDir:a(E,"dashboard")}),w=M.dashboardPort,s0=w,NN=!1;for(let _0=0;_0<10;_0++){s0=w+_0;try{t0=Bun.serve({port:s0,hostname:"127.0.0.1",idleTimeout:0,fetch:g.fetch}),NN=!0;break}catch{}}if(NN)console.log(`[open-mem] Dashboard available at http://127.0.0.1:${s0}`);else console.warn(`[open-mem] Could not start dashboard \u2014 ports ${w}-${w+9} all busy`);let rE=a0,iE=S.create.bind(S);S.create=(..._0)=>{let EN=iE(..._0);return rE.emit("observation:created",EN),EN}}let nE=()=>{if(o)clearInterval(o);if(c)c.stop();if(T.stop(),t0)t0.stop();if(Y0)Y0.destroy();if(W)W.close();$.close()};return process.on("beforeExit",nE),{"tool.execute.after":TE(M,m,_,O),"chat.message":GE(S,_,O,M.sensitivePatterns),event:IE(m,_,O,M,S,f),"experimental.chat.system.transform":FE(M,S,_,V,O,X),"experimental.session.compacting":HE(M,S,_,V,O,X),tool:{...e1}}}export{ZM as default};
688
+ `;await JM(E,A.endsWith(`
689
+ `)?A+M:`${A}
690
+ ${M}`,"utf-8")}function XM(N){let{config:E,queue:A,sessions:M,projectPath:O,tool:$,sessionId:V,callId:_,toolOutput:S}=N;if(E.ignoredTools.includes($))return!1;if(!S||S.length<E.minOutputLength)return!1;let J=t0(S,E.sensitivePatterns);return J=d0(J,"[PRIVATE]"),M.getOrCreate(V,O),A.enqueue(V,$,J,_),!0}function g2(N,E,A,M){return async(O,$)=>{try{let{tool:V,sessionID:_,callID:S}=O,{output:J}=$;XM({config:N,queue:E,sessions:A,projectPath:M,tool:V,sessionId:_,callId:S,toolOutput:J})}catch(V){console.error("[open-mem] Tool capture error:",V)}}}class EN{config;compressor;summarizer;pendingRepo;observationRepo;sessionRepo;summaryRepo;embeddingModel;conflictEvaluator;entityExtractor;entityRepo;observer;processing=!1;timer=null;mode="in-process";onEnqueue=null;constructor(N,E,A,M,O,$,V,_=null,S=null,J=null,Q=null,f=null){this.config=N;this.compressor=E;this.summarizer=A;this.pendingRepo=M;this.observationRepo=O;this.sessionRepo=$;this.summaryRepo=V;this.embeddingModel=_;this.conflictEvaluator=S;this.entityExtractor=J;this.entityRepo=Q;this.observer=f}setMode(N){if(this.mode=N,N==="enqueue-only")this.stop()}getMode(){return this.mode}setOnEnqueue(N){this.onEnqueue=N}enqueue(N,E,A,M){if(this.pendingRepo.create({sessionId:N,toolName:E,toolOutput:A,callId:M}),this.observer?.onEnqueue?.({sessionId:N,toolName:E,createdAt:new Date().toISOString()}),this.mode==="enqueue-only")this.onEnqueue?.()}async processBatch(){if(this.mode==="enqueue-only")return 0;if(this.processing)return 0;this.processing=!0;let N=0,E=0,A=Date.now();try{this.pendingRepo.resetStale(5);let M=this.pendingRepo.getPending(this.config.batchSize);if(this.observer?.onBatchStart?.({pending:M.length,mode:this.mode,startedAt:new Date(A).toISOString()}),M.length===0)return 0;for(let O of M)try{this.pendingRepo.markProcessing(O.id);let V=await this.compressor.compress(O.toolName,O.toolOutput)??this.compressor.createFallbackObservation(O.toolName,O.toolOutput),_=!1,S=null;if(this.embeddingModel)try{let Q=i1({title:V.title,narrative:V.narrative,concepts:V.concepts}),f=await a(this.embeddingModel,Q);if(f){let W=this.config.conflictResolutionEnabled&&this.conflictEvaluator,X=this.config.conflictSimilarityBandLow??0.7,D=this.config.conflictSimilarityBandHigh??0.92;if(W){let U=this.observationRepo.findSimilar(f,V.type,X,5),K=U.find((z)=>z.similarity>D);if(K)console.log(`[open-mem] Dedup: skipping duplicate of ${K.id} (similarity: ${K.similarity.toFixed(3)})`),_=!0;else{let z=U.filter((G)=>G.similarity>=X&&G.similarity<=D);if(z.length>0)try{let G=z.map((H)=>{let R=this.observationRepo.getById(H.id);return R?{id:R.id,title:R.title,narrative:R.narrative,concepts:R.concepts,type:R.type}:null}).filter((H)=>H!==null);if(G.length>0&&this.conflictEvaluator){let H=await this.conflictEvaluator.evaluate({title:V.title,narrative:V.narrative,concepts:V.concepts,type:V.type},G);if(H&&H.outcome==="duplicate")console.log(`[open-mem] Conflict eval: duplicate (${H.reason})`),_=!0;else if(H&&H.outcome==="update"&&H.supersedesId)console.log(`[open-mem] Conflict eval: update supersedes ${H.supersedesId} (${H.reason})`),S=H.supersedesId}}catch{}}}else{let U=this.observationRepo.findSimilar(f,V.type,0.92,1);if(U.length>0)console.log(`[open-mem] Dedup: skipping duplicate of ${U[0].id} (similarity: ${U[0].similarity.toFixed(3)})`),_=!0}}}catch{}if(_){this.pendingRepo.markCompleted(O.id);continue}let J=this.observationRepo.create({sessionId:O.sessionId,type:V.type,title:V.title,subtitle:V.subtitle,facts:V.facts,narrative:V.narrative,concepts:V.concepts,filesRead:V.filesRead,filesModified:V.filesModified,rawToolOutput:O.toolOutput,toolName:O.toolName,tokenCount:y(`${V.title} ${V.narrative} ${V.facts.join(" ")}`),discoveryTokens:V.discoveryTokens??y(O.toolOutput),importance:V.importance??3});if(this.embeddingModel)try{let Q=i1({title:J.title,narrative:J.narrative,concepts:J.concepts}),f=await a(this.embeddingModel,Q);if(f)this.observationRepo.setEmbedding(J.id,f)}catch{}if(S)try{this.observationRepo.supersede(S,J.id),console.log(`[open-mem] Superseded observation ${S} with ${J.id}`)}catch(Q){console.error(`[open-mem] Failed to supersede ${S}:`,Q)}if(this.config.entityExtractionEnabled&&this.entityExtractor&&this.entityRepo)try{let Q=await this.entityExtractor.extract({title:J.title,narrative:J.narrative,concepts:J.concepts,facts:J.facts,filesRead:J.filesRead,filesModified:J.filesModified,type:J.type});if(Q){let f=new Map;for(let W of Q.entities){let X=this.entityRepo.upsertEntity(W.name,W.entityType);f.set(W.name,X.id),this.entityRepo.linkObservation(X.id,J.id)}for(let W of Q.relations){let X=f.get(W.sourceName),D=f.get(W.targetName);if(X&&D)this.entityRepo.createRelation(X,D,W.relationship,J.id)}}}catch{}this.sessionRepo.incrementObservationCount(O.sessionId),this.pendingRepo.markCompleted(O.id),N++}catch($){this.pendingRepo.markFailed(O.id,String($)),E++,this.observer?.onItemFailed?.({pendingId:O.id,error:String($),failedAt:new Date().toISOString()})}return N}finally{this.observer?.onBatchEnd?.({processed:N,failed:E,durationMs:Date.now()-A,finishedAt:new Date().toISOString()}),this.processing=!1}}async summarizeSession(N){let E=this.observationRepo.getBySession(N);if(!this.summarizer.shouldSummarize(E.length))return;if(this.summaryRepo.getBySessionId(N))return;let M=await this.summarizer.summarize(N,E);if(!M)return;let O=this.summaryRepo.create({sessionId:N,summary:M.summary,keyDecisions:M.keyDecisions,filesModified:M.filesModified,concepts:M.concepts,tokenCount:y(M.summary)});this.sessionRepo.setSummary(N,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 AN{startedAtMs=Date.now();enqueueCount=0;totalBatches=0;processedItems=0;failedItems=0;totalBatchDurationMs=0;lastBatchDurationMs=0;lastProcessedAt=null;lastFailedAt=null;lastError=null;createQueueObserver(){return{onEnqueue:()=>{this.enqueueCount+=1},onBatchEnd:(N)=>{if(this.totalBatches+=1,this.processedItems+=N.processed,this.failedItems+=N.failed,this.totalBatchDurationMs+=N.durationMs,this.lastBatchDurationMs=N.durationMs,N.processed>0)this.lastProcessedAt=N.finishedAt},onItemFailed:(N)=>{this.lastFailedAt=N.failedAt,this.lastError=N.error}}}snapshot(N){return{startedAt:new Date(this.startedAtMs).toISOString(),uptimeMs:Date.now()-this.startedAtMs,enqueueCount:this.enqueueCount,batches:{total:this.totalBatches,processedItems:this.processedItems,failedItems:this.failedItems,avgDurationMs:this.totalBatches>0?Math.round(this.totalBatchDurationMs/this.totalBatches):0},queue:{...N,lastBatchDurationMs:this.lastBatchDurationMs,lastProcessedAt:this.lastProcessedAt,lastFailedAt:this.lastFailedAt,lastError:this.lastError}}}}function h2(N){return{start:()=>N.start(),stop:()=>{N.setOnEnqueue(null),N.stop()},setInProcess:()=>{N.setMode("in-process"),N.start()},setEnqueueOnly:(E)=>{N.setMode("enqueue-only"),N.setOnEnqueue(E)}}}function V0(N,E){if(E.type&&N.type!==E.type)return!1;if(E.importanceMin!==void 0&&N.importance<E.importanceMin)return!1;if(E.importanceMax!==void 0&&N.importance>E.importanceMax)return!1;if(E.createdAfter&&N.createdAt<E.createdAfter)return!1;if(E.createdBefore&&N.createdAt>E.createdBefore)return!1;if(E.concepts&&E.concepts.length>0){if(!E.concepts.some((M)=>N.concepts.some((O)=>O.toLowerCase().includes(M.toLowerCase()))))return!1}if(E.files&&E.files.length>0){let A=[...N.filesRead,...N.filesModified];if(!E.files.some((O)=>A.some(($)=>$.toLowerCase().includes(O.toLowerCase()))))return!1}return!0}async function c2(N,E,A,M,O){if(!N.trim())return E;let $=UM(N),V=new Set;for(let J of $){let Q=A.findByName(J);for(let f of Q){let W=A.traverseRelations(f.id,1);for(let X of W){let D=A.getObservationsForEntity(X);for(let U of D)V.add(U)}}}if(V.size===0)return E;let _=new Set(E.map((J)=>J.observation.id)),S=[];for(let J of V){if(_.has(J))continue;let Q=M.getById(J);if(!Q)continue;if(Q.supersededBy)continue;S.push({observation:Q,rank:0,snippet:Q.title,source:"project",rankingSource:"graph",explain:{strategy:"hybrid",matchedBy:["graph"]}})}return[...E,...S].slice(0,O)}function UM(N){let E=N.split(/\s+/).filter((M)=>M.length>=2),A=[];for(let M of E)A.push(M);for(let M=0;M<E.length-1;M++)A.push(`${E[M]} ${E[M+1]}`);return A}var l2=60;async function b2(N,E,A,M){let O=M.limit??10,$=ZM(E,N,M,O);if(!A)return $;let V=await a(A,N);if(!V)return $;let _=$.map((J)=>J.observation.id),S=KM(E,V,M.projectPath,M,O,M.hasVectorExtension??!1,_);if(S.length===0)return $;return YM($,S,O)}function ZM(N,E,A,M){try{return N.search({query:E,type:A.type,limit:M,projectPath:A.projectPath,importanceMin:A.importanceMin,importanceMax:A.importanceMax,createdAfter:A.createdAfter,createdBefore:A.createdBefore,concepts:A.concepts,files:A.files})}catch{return[]}}function KM(N,E,A,M,O,$,V){if($)return BM(N,E,M,O,V);return DM(N,E,A,M,O)}function BM(N,E,A,M,O){try{let $;if(O.length>0){if($=N.searchVecSubset(E,O,M*3),$.length===0)$=N.getVecEmbeddingMatches(E,M*3)}else $=N.getVecEmbeddingMatches(E,M*3);if($.length===0)return[];let V=[];for(let{observationId:_,distance:S}of $){if(V.length>=M)break;let J=N.getById(_);if(!J)continue;if(!V0(J,A))continue;V.push({observation:J,rank:S-1,snippet:J.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:S}})}return V}catch{return[]}}function DM(N,E,A,M,O){let $=N.getWithEmbeddings(A,O*10);if($.length===0)return[];let V=$.map((S)=>({id:S.id,similarity:_0(E,S.embedding)})).filter(({similarity:S})=>S>=0.3).sort((S,J)=>J.similarity-S.similarity),_=[];for(let{id:S,similarity:J}of V){if(_.length>=O)break;let Q=N.getById(S);if(!Q)continue;if(!V0(Q,M))continue;_.push({observation:Q,rank:-J,snippet:Q.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorSimilarity:J}})}return _}function YM(N,E,A){let M=new Map;for(let O=0;O<N.length;O++){let $=N[O],V=1/(l2+O+1);M.set($.observation.id,{score:V,result:{...$,rankingSource:"fts",explain:{strategy:"hybrid",matchedBy:["fts"],ftsRank:$.rank}}})}for(let O=0;O<E.length;O++){let $=E[O],V=1/(l2+O+1),_=M.get($.observation.id);if(_)_.score+=V,_.result={..._.result,explain:{strategy:"hybrid",matchedBy:["fts","vector"],ftsRank:_.result.explain?.ftsRank??_.result.rank,vectorDistance:$.explain?.vectorDistance,vectorSimilarity:$.explain?.vectorSimilarity}};else M.set($.observation.id,{score:V,result:{...$,explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:$.explain?.vectorDistance,vectorSimilarity:$.explain?.vectorSimilarity}}})}return[...M.values()].sort((O,$)=>$.score-O.score).slice(0,A).map(({score:O,result:$})=>({...$,explain:{...$.explain??{strategy:"hybrid",matchedBy:[]},strategy:"hybrid",matchedBy:$.explain?.matchedBy??[],rrfScore:O,ftsRank:$.explain?.ftsRank,vectorDistance:$.explain?.vectorDistance,vectorSimilarity:$.explain?.vectorSimilarity}}))}class MN{observations;embeddingModel;hasVectorExtension;reranker;userObservationRepo;entityRepo;constructor(N,E,A,M=null,O=null,$=null){this.observations=N;this.embeddingModel=E;this.hasVectorExtension=A;this.reranker=M;this.userObservationRepo=O;this.entityRepo=$}async search(N,E){let A=E.strategy??"hybrid",M=E.limit??10,O;switch(A){case"filter-only":O=this.filterOnlySearch(N,E,M);break;case"semantic":O=await this.semanticSearch(N,E,M);break;case"hybrid":O=await this.hybridSearchStrategy(N,E,M);break}for(let $ of O)$.source="project";if(this.entityRepo&&N.trim())O=await c2(N,O,this.entityRepo,this.observations,M);if(this.userObservationRepo){let $=this.searchUserMemory(N,E,M);O=this.mergeResults(O,$,M)}if(this.reranker&&O.length>1)return this.reranker.rerank(N,O,M);return O}filterOnlySearch(N,E,A){if(E.concept)return this.observations.searchByConcept(E.concept,A,E.projectPath).map((O)=>({observation:O,rank:0,snippet:O.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["concept-filter"]}}));if(E.file)return this.observations.searchByFile(E.file,A,E.projectPath).map((O)=>({observation:O,rank:0,snippet:O.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["file-filter"]}}));return this.observations.search({query:N,type:E.type,limit:A,projectPath:E.projectPath,importanceMin:E.importanceMin,importanceMax:E.importanceMax,createdAfter:E.createdAfter,createdBefore:E.createdBefore,concepts:E.concepts,files:E.files})}async semanticSearch(N,E,A){if(!this.embeddingModel)return this.filterOnlySearch(N,E,A);let M=await a(this.embeddingModel,N);if(!M)return this.filterOnlySearch(N,E,A);if(this.hasVectorExtension)return this.nativeVectorSearch(M,E,A);return this.jsFallbackVectorSearch(M,E,A)}async hybridSearchStrategy(N,E,A){return b2(N,this.observations,this.embeddingModel,{type:E.type,limit:A,projectPath:E.projectPath,hasVectorExtension:this.hasVectorExtension,importanceMin:E.importanceMin,importanceMax:E.importanceMax,createdAfter:E.createdAfter,createdBefore:E.createdBefore,concepts:E.concepts,files:E.files})}nativeVectorSearch(N,E,A){try{let M=this.observations.getVecEmbeddingMatches(N,A*3);if(M.length===0)return[];let O=[];for(let{observationId:$,distance:V}of M){if(O.length>=A)break;let _=this.observations.getById($);if(!_)continue;if(!V0(_,E))continue;O.push({observation:_,rank:V-1,snippet:_.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorDistance:V}})}return O}catch{return[]}}jsFallbackVectorSearch(N,E,A){let M=this.observations.getWithEmbeddings(E.projectPath,A*10);if(M.length===0)return[];let O=M.map((V)=>({id:V.id,similarity:_0(N,V.embedding)})).filter(({similarity:V})=>V>=0.3).sort((V,_)=>_.similarity-V.similarity),$=[];for(let{id:V,similarity:_}of O){if($.length>=A)break;let S=this.observations.getById(V);if(!S)continue;if(!V0(S,E))continue;$.push({observation:S,rank:-_,snippet:S.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorSimilarity:_}})}return $}searchUserMemory(N,E,A){if(!this.userObservationRepo)return[];try{return this.userObservationRepo.search({query:N,limit:A}).map(({observation:O,rank:$})=>({observation:RM(O),rank:$,snippet:O.title,source:"user",rankingSource:"user-memory",explain:{strategy:"filter-only",matchedBy:["user-memory"]}}))}catch{return[]}}mergeResults(N,E,A){let M=new Set(N.map((V)=>V.observation.id)),O=new Set(N.map((V)=>`${V.observation.title}::${V.observation.narrative}`)),$=E.filter((V)=>{if(M.has(V.observation.id))return!1;let _=`${V.observation.title}::${V.observation.narrative}`;if(O.has(_))return!1;return O.add(_),!0});return[...N,...$].slice(0,A)}}function RM(N){return{id:N.id,sessionId:"",type:N.type,title:N.title,subtitle:N.subtitle,facts:N.facts,narrative:N.narrative,concepts:N.concepts,filesRead:N.filesRead,filesModified:N.filesModified,rawToolOutput:"",toolName:N.toolName,createdAt:N.createdAt,tokenCount:N.tokenCount,discoveryTokens:0,importance:N.importance}}import{generateText as zM}from"ai";class p2{languageModel;maxCandidates;provider;modelName;rateLimitingEnabled;_generate=zM;constructor(N,E){this.languageModel=N,this.maxCandidates=E.rerankingMaxCandidates,this.provider=E.provider??"",this.modelName=E.model??"",this.rateLimitingEnabled=E.rateLimitingEnabled??!0}async rerank(N,E,A){if(E.length<=1)return E;let M=E.slice(0,this.maxCandidates),O=E.slice(this.maxCandidates),$=E2(N,M.map((_)=>({title:_.observation.title,narrative:_.observation.narrative}))),V=2;for(let _=0;_<=V;_++)try{if(this.provider==="google")await g(this.modelName,this.rateLimitingEnabled);let{text:S}=await this._generate({model:this.languageModel,maxOutputTokens:512,prompt:$}),J=dN(S);if(!J)return E.slice(0,A);let Q=this.applyReranking(M,J,A);for(let f of O){if(Q.length>=A)break;Q.push(f)}return Q}catch(S){if(LM(S)&&_<V){await GM(2**_*1000);continue}return E.slice(0,A)}return E.slice(0,A)}applyReranking(N,E,A){let M=[],O=new Set;for(let $ of E)if($>=0&&$<N.length&&!O.has($)){if(O.add($),M.push(N[$]),M.length>=A)break}if(M.length<A){for(let $=0;$<N.length&&M.length<A;$++)if(!O.has($))M.push(N[$])}return M}}class n2{async rerank(N,E,A){if(E.length<=1)return E.slice(0,A);let M=ON(N),O=E.map(($)=>({result:$,score:this.scoreCandidate($,M)}));return O.sort(($,V)=>V.score-$.score),O.slice(0,A).map(($)=>$.result)}scoreCandidate(N,E){let A=N.observation,M=ON(A.title),O=ON(A.narrative),$=new Set(A.concepts.map((z)=>z.toLowerCase())),V=0,_=0,S=0;for(let z of E){if(M.has(z))V++;if(O.has(z))_++;if($.has(z))S++}let J=E.size||1,Q=V/J*0.4,f=_/J*0.3,W=S/J*0.15,D=(Date.now()-new Date(A.createdAt).getTime())/86400000,U=D<1?0.1:D<7?0.05:0,K=A.importance/5*0.05;return Q+f+W+U+K}}function r2(N,E){if(!N.rerankingEnabled)return null;if(E)return new p2(E,N);return new n2}function ON(N){return new Set(N.toLowerCase().split(/[\s\-_./\\,;:!?()[\]{}'"]+/).filter((E)=>E.length>1))}function LM(N){if(typeof N!=="object"||N===null)return!1;let E=N,A=E.status;if(A===429||A===500||A===503)return!0;let M=E.error;if(typeof M==="object"&&M!==null&&M.type==="overloaded_error")return!0;return!1}function GM(N){return new Promise((E)=>setTimeout(E,N))}function i2(N){return N}function d2(N){return N}function t2(N){return N}function a2(N){if(!N)return null;return N}import{spawnSync as s2}from"child_process";import{dirname as HM,resolve as o2}from"path";function CM(N){try{let E=s2("git",["rev-parse","--git-common-dir"],{cwd:N,encoding:"utf-8",timeout:5000});if(E.status!==0||!E.stdout)return null;let A=E.stdout.trim();if(A===".git")return null;let M=s2("git",["rev-parse","--git-dir"],{cwd:N,encoding:"utf-8",timeout:5000});if(M.status!==0||!M.stdout)return null;let O=M.stdout.trim(),$=o2(N,A),V=o2(N,O);if($===V)return null;let _=HM($);if(_===$||_==="/")return null;return _}catch{return null}}function e2(N){return CM(N)??N}function IM(){try{let E=import.meta.url;if(E&&!E.includes("[eval]")){let A=jM(yM(E));return A.endsWith("dist")||A.endsWith("dist/")||A.endsWith("dist\\")?A:s(A,"..","dist")}}catch{}let N=[s(process.env.HOME||"",".config","opencode","node_modules","open-mem","dist"),s(process.cwd(),"node_modules","open-mem","dist")];for(let E of N)if(FM(s(E,"daemon.js")))return E;return s(process.cwd(),"node_modules","open-mem","dist")}async function TM(N){let E=IM(),A=e2(N.directory),M=U0(A),O=qN(M);for(let h of O)console.warn(`[open-mem] ${h}`);await PN(M),r0.enableExtensionSupport();let $=i0(M.dbPath);j2($,{hasVectorExtension:$.hasVectorExtension,embeddingDimension:M.embeddingDimension});let V=new a1($),_=new d1($),S=new s1($),J=new t1($),Q=new b1($),f=new r1($),W=null,X=null;if(M.userMemoryEnabled)try{W=new o1(M.userMemoryDbPath),X=new e1(W.database)}catch(h){console.warn(`[open-mem] Failed to initialize user-level memory: ${h}`)}let D=new K0(M),U=new y1(M),K=M.provider!=="bedrock",z=M.compressionEnabled&&(!K||M.apiKey)?M2({provider:M.provider,model:M.model,apiKey:M.apiKey}):null,G=new AN,H=M.conflictResolutionEnabled&&(!K||M.apiKey)?new F1({provider:M.provider,apiKey:M.apiKey,model:M.model,rateLimitingEnabled:M.rateLimitingEnabled}):null,R=M.entityExtractionEnabled&&(!K||M.apiKey)?new j1({provider:M.provider,apiKey:M.apiKey,model:M.model,rateLimitingEnabled:M.rateLimitingEnabled}):null,k=new n1($),T=new EN(M,D,U,J,_,V,S,z,H,R,k,G.createQueueObserver()),w=h2(T);w.start();let I=()=>{let h=T.getStats(),P=G.snapshot({mode:T.getMode(),running:T.isRunning,processing:h.processing,pending:h.pending});return{status:P.queue.lastError?"degraded":"ok",timestamp:new Date().toISOString(),uptimeMs:P.uptimeMs,queue:P.queue,batches:P.batches,enqueueCount:P.enqueueCount}},a0=r2(M,M.rerankingEnabled&&(!K||M.apiKey)?m({provider:M.provider,model:M.model,apiKey:M.apiKey},u(M)):null),q=new MN(_,z,$.hasVectorExtension,a0,X,k),R0=new g1({observations:i2(_),sessions:d2(V),summaries:t2(S),searchOrchestrator:q,projectPath:A,config:M,userObservationRepo:a2(X),runtimeSnapshotProvider:I,configAuditStore:Q,maintenanceHistoryStore:f}),$N=nN(R0),l=null,o=null;if(M.daemonEnabled)if(L2(M.dbPath),l=new c1({dbPath:M.dbPath,projectPath:A,daemonScript:s(E,"daemon.js")}),l.start())w.setEnqueueOnly(()=>l?.signal("PROCESS_NOW")),console.log("[open-mem] Background daemon started \u2014 processing delegated"),o=setInterval(()=>{if(l&&!l.isRunning()){if(console.warn("[open-mem] Daemon died, falling back to in-process processing"),w.setInProcess(),o)clearInterval(o),o=null}},30000);else console.warn("[open-mem] Daemon failed to start \u2014 using in-process processing"),l=null;let s0=null,o0=null,z0=null;if(M.dashboardEnabled){o0=y2(),z0=new G1(o0);let h=lN({config:M,projectPath:A,embeddingModel:z,memoryEngine:R0,runtimeStatusProvider:I,sseHandler:pN(z0),dashboardDir:s(E,"dashboard")}),P=M.dashboardPort,e0=P,_N=!1;for(let S0=0;S0<10;S0++){e0=P+S0;try{s0=Bun.serve({port:e0,hostname:"127.0.0.1",idleTimeout:0,fetch:h.fetch}),_N=!0;break}catch{}}if(_N)console.log(`[open-mem] Dashboard available at http://127.0.0.1:${e0}`);else console.warn(`[open-mem] Could not start dashboard \u2014 ports ${P}-${P+9} all busy`);let EE=o0,AE=_.create.bind(_);_.create=(...S0)=>{let VN=AE(...S0);return EE.emit("observation:created",VN),VN}}let NE=()=>{if(o)clearInterval(o);if(l)l.stop();if(w.stop(),s0)s0.stop();if(z0)z0.destroy();if(W)W.close();$.close()};return process.on("beforeExit",NE),{"tool.execute.after":g2(M,T,V,A),"chat.message":w2(_,V,A,M.sensitivePatterns),event:m2(T,V,A,M,_,J),"experimental.chat.system.transform":x2(M,_,V,S,A,X),"experimental.session.compacting":P2(M,_,V,S,A,X),tool:{...$N}}}export{TM as default};